Skip to content

Commit 3ca6d2f

Browse files
committed
feat: support non-abstract contracts codegen
1 parent 78fd158 commit 3ca6d2f

File tree

9 files changed

+319
-143
lines changed

9 files changed

+319
-143
lines changed

.changeset/hip-ads-brake.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@abstract-money/cli": patch
3+
"@abstract-money/react": patch
4+
---
5+
6+
Support non-abstract apps codegen, and minor optimizations.

packages/cli/src/plugins/react.ts

Lines changed: 90 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export function react(options: ReactOptions = {}): ReactResult {
5858
const cosmwasmCodegenDirPath = join(out, 'cosmwasm-codegen')
5959

6060
// Guard speicfic contracts to not have the abstract app generated
61-
const guardedContracts = contracts.filter(({ namespace }) =>
61+
const contractsWithoutAbstractApp = contracts.filter(({ namespace }) =>
6262
disableAppstractAppFor.includes(namespace),
6363
)
6464

@@ -68,19 +68,19 @@ export function react(options: ReactOptions = {}): ReactResult {
6868
.filter(
6969
({ namespace }) =>
7070
!disableAppstractAppFor.includes(namespace) &&
71-
guardedContracts.every(
71+
contractsWithoutAbstractApp.every(
7272
(guardedContract) => guardedContract.namespace !== namespace,
7373
),
7474
)
7575
.map(({ name, path }) => ({ name, dir: path })),
7676
outPath: cosmwasmCodegenDirPath,
7777
})
7878

79-
if (guardedContracts.length !== 0)
79+
if (contractsWithoutAbstractApp.length !== 0)
8080
await codegen({
8181
options: { ...codegenOptions, abstractApp: { enabled: false } },
8282
contracts: [
83-
...guardedContracts,
83+
...contractsWithoutAbstractApp,
8484
...contracts.filter(({ namespace }) =>
8585
disableAppstractAppFor.includes(namespace),
8686
),
@@ -91,45 +91,14 @@ export function react(options: ReactOptions = {}): ReactResult {
9191
const imports: string[] = []
9292
const content: string[] = []
9393

94-
content.push(dedent`
95-
function useAbstractModuleQueryClient(
96-
args: Omit<Parameters<typeof useAbstractModuleQueryClient_>[0], 'client'>,
97-
options?: Parameters<typeof useAbstractModuleQueryClient_>[1],
98-
) {
99-
const { data: client } = useCosmWasmClient({chainName: args.chainName})
100-
return useAbstractModuleQueryClient_(
101-
{
102-
client,
103-
...args,
104-
},
105-
options,
106-
)
107-
}
108-
109-
function useAbstractModuleClient(
110-
args: Omit<
111-
Parameters<typeof useAbstractModuleClient_>[0],
112-
'client' | 'sender'
113-
>,
114-
options?: Parameters<typeof useAbstractModuleClient_>[1],
115-
) {
116-
const { data: client } = useSigningCosmWasmClient({chainName: args.chainName})
117-
const { data: sender } = useSenderAddress({chainName: args.chainName})
118-
return useAbstractModuleClient_(
119-
{
120-
client,
121-
sender,
122-
...args,
123-
},
124-
options,
125-
)
126-
}
127-
`)
128-
12994
for (const contract of contracts) {
13095
{
13196
const contractNamePascalCase = pascalCase(contract.name)
13297

98+
const hasAbstractApp = contractsWithoutAbstractApp.every(
99+
(contractWithoutAbstractApp) =>
100+
contractWithoutAbstractApp !== contract,
101+
)
133102
{
134103
// NOTE: The `@abstract-money/codegen` points to the old name of the core
135104
// package `@abstract-money/abstract.js`, and has to be changed to the
@@ -238,17 +207,22 @@ export function react(options: ReactOptions = {}): ReactResult {
238207
}
239208

240209
imports.push(
241-
`import { ${contractNamePascalCase}AppQueryClient, ${contractNamePascalCase}AppClient } from './${relative(
210+
`import { ${contractNamePascalCase}${
211+
hasAbstractApp ? 'App' : ''
212+
}QueryClient, ${contractNamePascalCase}${
213+
hasAbstractApp ? 'App' : ''
214+
}Client } from './${relative(
242215
out,
243216
join(cosmwasmCodegenDirPath, `${contractNamePascalCase}.client`),
244217
)}'`,
245218
)
246219

247-
content.push(
248-
`const ${constantCase(contract.name)}_MODULE_ID = '${
249-
contract.namespace
250-
}:${contract.name}'`,
251-
)
220+
if (hasAbstractApp)
221+
content.push(
222+
`const ${constantCase(contract.name)}_MODULE_ID = '${
223+
contract.namespace
224+
}:${contract.name}'`,
225+
)
252226

253227
{
254228
const queryHooks = new Map<Hook, string>([])
@@ -259,26 +233,42 @@ export function react(options: ReactOptions = {}): ReactResult {
259233
const hookNameWithoutModuleAndQuery = hookName
260234
.replace(pascalCase(contract.name), '')
261235
.replace('Query', '') as Hook
236+
const queryClientCamelCase = hasAbstractApp
237+
? `${contractNameCamelCase}AppQueryClient`
238+
: `${contractNameCamelCase}QueryClient`
239+
const queryClientPascalCase = hasAbstractApp
240+
? `${contractNamePascalCase}AppQueryClient`
241+
: `${contractNamePascalCase}QueryClient`
262242
queryHooks.set(
263243
hookNameWithoutModuleAndQuery,
264244
dedent`
265245
({ options, ${
266246
hasArgs ? 'args, ' : ''
267247
} ...rest }: Omit<Parameters<typeof ${hookName}<${contractNamePascalCase}Types.${queryHookNameToResponseTypeMap.get(
268248
hookName,
269-
)}>>[0], 'client'> & { accountId?: AccountId; chainName: string | undefined }) => {
249+
)}>>[0], 'client'> & { ${
250+
hasAbstractApp
251+
? 'accountId?: AccountId;'
252+
: 'contractAddress: string | undefined;'
253+
} chainName: string | undefined }) => {
270254
const {
271-
data: ${contractNameCamelCase}AppQueryClient,
272-
isLoading: is${contractNamePascalCase}AppQueryClientLoading,
273-
isError: is${contractNamePascalCase}AppQueryClientError,
274-
error: ${contractNameCamelCase}AppQueryClientError,
275-
} = useAbstractModuleQueryClient(
255+
data: ${queryClientCamelCase},
256+
isLoading: is${queryClientPascalCase}Loading,
257+
isError: is${queryClientPascalCase}Error,
258+
error: ${queryClientCamelCase}Error,
259+
} = use${hasAbstractApp ? 'Abstract' : ''}ModuleQueryClient(
276260
{
277-
moduleId: ${constantCase(contract.name)}_MODULE_ID,
261+
${
262+
hasAbstractApp
263+
? `moduleId: ${constantCase(
264+
contract.name,
265+
)}_MODULE_ID,`
266+
: ''
267+
}
278268
...rest,
279-
Module: ${contractNamePascalCase}AppQueryClient,
269+
Module: ${queryClientPascalCase},
280270
},
281-
{ enabled: options?.enabled },
271+
${hasAbstractApp ? '{ enabled: options?.enabled }' : ''}
282272
)
283273
284274
const {
@@ -287,18 +277,18 @@ export function react(options: ReactOptions = {}): ReactResult {
287277
isError: is${hookNamePascalCaseWithoutUse}Error,
288278
error: ${hookNameCamelCaseWithoutUse}Error,
289279
} = use${hookNamePascalCaseWithoutUse}({
290-
client: ${contractNameCamelCase}AppQueryClient,
280+
client: ${queryClientCamelCase},
291281
options,
292282
${hasArgs ? 'args, ' : ''}
293283
})
294284
295-
if (is${contractNamePascalCase}AppQueryClientError)
285+
if (is${queryClientPascalCase}Error)
296286
return {
297287
data: undefined,
298288
isLoading: false,
299289
isError: true,
300290
isSuccess: false,
301-
error: ${contractNameCamelCase}AppQueryClientError,
291+
error: ${queryClientCamelCase}Error,
302292
} as const
303293
if (is${hookNamePascalCaseWithoutUse}Error)
304294
return {
@@ -308,7 +298,7 @@ export function react(options: ReactOptions = {}): ReactResult {
308298
isSuccess: false,
309299
error: ${hookNameCamelCaseWithoutUse}Error,
310300
} as const
311-
if (is${contractNamePascalCase}AppQueryClientLoading || is${hookNamePascalCaseWithoutUse}Loading)
301+
if (is${queryClientPascalCase}Loading || is${hookNamePascalCaseWithoutUse}Loading)
312302
return {
313303
data: undefined,
314304
isLoading: true,
@@ -332,11 +322,24 @@ export function react(options: ReactOptions = {}): ReactResult {
332322
const hookNameWithoutModuleAndMutation = hookName
333323
.replace(pascalCase(contract.name), '')
334324
.replace('Mutation', '') as Hook
325+
326+
const clientCamelCase = hasAbstractApp
327+
? `${contractNameCamelCase}AppClient`
328+
: `${contractNameCamelCase}Client`
329+
const clientPascalCase = hasAbstractApp
330+
? `${contractNamePascalCase}AppClient`
331+
: `${contractNamePascalCase}Client`
335332
mutationHooks.set(
336333
hookNameWithoutModuleAndMutation,
337334
dedent`
338335
(
339-
{ chainName, accountId }: { chainName: string | undefined; accountId?: AccountId },
336+
{ chainName, ${
337+
hasAbstractApp ? 'accountId' : 'contractAddress'
338+
} }: { chainName: string | undefined; ${
339+
hasAbstractApp
340+
? 'accountId?: AccountId'
341+
: 'contractAddress: string | undefined'
342+
} },
340343
options?: Omit<
341344
UseMutationOptions<
342345
ExecuteResult,
@@ -347,17 +350,23 @@ export function react(options: ReactOptions = {}): ReactResult {
347350
>,
348351
) => {
349352
const {
350-
data: ${contractNameCamelCase}AbstractModuleClient,
353+
data: ${clientCamelCase},
351354
// TODO: figure out what to do with those
352-
// isLoading: is${contractNamePascalCase}AbstractModuleClientLoading,
353-
// isError: is${contractNamePascalCase}AbstractModuleClientError,
354-
// error: ${contractNameCamelCase}AbstractModuleClientError,
355-
} = useAbstractModuleClient(
355+
// isLoading: is${clientPascalCase}Loading,
356+
// isError: is${clientPascalCase}Error,
357+
// error: ${clientCamelCase}Error,
358+
} = use${hasAbstractApp ? 'Abstract' : ''}ModuleClient(
356359
{
360+
${
361+
hasAbstractApp
362+
? `
357363
moduleId: ${constantCase(contract.name)}_MODULE_ID,
358364
accountId,
365+
`
366+
: 'contractAddress,'
367+
}
359368
chainName,
360-
Module: ${contractNamePascalCase}AppClient,
369+
Module: ${clientPascalCase},
361370
}
362371
)
363372
@@ -368,23 +377,23 @@ export function react(options: ReactOptions = {}): ReactResult {
368377
} = ${hookName}(options)
369378
370379
const mutate = useMemo(() => {
371-
if (!${contractNameCamelCase}AbstractModuleClient) return undefined
380+
if (!${clientCamelCase}) return undefined
372381
373382
return (
374383
variables: Omit<Parameters<typeof mutate_>[0], 'client'>,
375384
options?: Parameters<typeof mutate_>[1],
376-
) => mutate_({ client: ${contractNameCamelCase}AbstractModuleClient, ...variables }, options)
377-
}, [mutate_, ${contractNameCamelCase}AbstractModuleClient])
385+
) => mutate_({ client: ${clientCamelCase}, ...variables }, options)
386+
}, [mutate_, ${clientCamelCase}])
378387
379388
const mutateAsync = useMemo(() => {
380-
if (!${contractNameCamelCase}AbstractModuleClient) return undefined
389+
if (!${clientCamelCase}) return undefined
381390
382391
return (
383392
variables: Omit<Parameters<typeof mutateAsync_>[0], 'client'>,
384393
options?: Parameters<typeof mutateAsync_>[1],
385394
) =>
386-
mutateAsync_({ client: ${contractNameCamelCase}AbstractModuleClient, ...variables }, options)
387-
}, [mutateAsync_, ${contractNameCamelCase}AbstractModuleClient])
395+
mutateAsync_({ client: ${clientCamelCase}, ...variables }, options)
396+
}, [mutateAsync_, ${clientCamelCase}])
388397
389398
return { mutate, mutateAsync, ...rest } as const
390399
}
@@ -421,18 +430,20 @@ export function react(options: ReactOptions = {}): ReactResult {
421430
import { useMemo } from 'react'
422431
423432
import {
424-
useAbstractModuleClient as useAbstractModuleClient_,
425-
useAbstractModuleQueryClient as useAbstractModuleQueryClient_,
433+
useAbstractModuleClient,
434+
useAbstractModuleQueryClient,
435+
${
436+
contractsWithoutAbstractApp.length !== 0
437+
? `
438+
useModuleClient,
439+
useModuleQueryClient,
440+
`
441+
: ''
442+
}
426443
} from '@abstract-money/react/utils'
427444
428445
import { AccountId } from '@abstract-money/core'
429446
430-
import {
431-
useCosmWasmClient,
432-
useSigningCosmWasmClient,
433-
useSenderAddress
434-
} from '@abstract-money/react/hooks'
435-
436447
${imports.join('\n\n')}
437448
`,
438449
// (actionsImportValues.length

packages/react/src/utils/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ export { useAbstractClient } from './use-abstract-client'
22
export { useAbstractQueryClient } from './use-abstract-query-client'
33
export { useAbstractModuleClient } from './use-abstract-module-client'
44
export { useAbstractModuleQueryClient } from './use-abstract-module-query-client'
5+
export { useModuleClient } from './use-module-client'
6+
export { useModuleQueryClient } from './use-module-query-client'

0 commit comments

Comments
 (0)