@algorandfoundation/algokit-client-generator 6.0.2-beta.1 → 7.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/client/app-client-context.d.ts +122 -0
  2. package/client/deploy-types.d.ts +1 -11
  3. package/client/generate.d.ts +1 -1
  4. package/client/generator-context.d.ts +3 -5
  5. package/client/helpers/contains-non-void-method.d.ts +2 -2
  6. package/client/helpers/get-equivalent-type.d.ts +3 -5
  7. package/client/imports.d.ts +1 -2
  8. package/package.json +2 -3
  9. package/schema/load.d.ts +1 -1
  10. package/src/cli.js.map +1 -0
  11. package/src/cli.mjs.map +1 -0
  12. package/src/client/app-client-context.js +211 -0
  13. package/src/client/app-client-context.js.map +1 -0
  14. package/src/client/app-client-context.mjs +208 -0
  15. package/src/client/app-client-context.mjs.map +1 -0
  16. package/{client → src/client}/app-client.js +29 -51
  17. package/src/client/app-client.js.map +1 -0
  18. package/{client → src/client}/app-client.mjs +29 -51
  19. package/src/client/app-client.mjs.map +1 -0
  20. package/{client → src/client}/app-factory.js +23 -27
  21. package/src/client/app-factory.js.map +1 -0
  22. package/{client → src/client}/app-factory.mjs +23 -27
  23. package/src/client/app-factory.mjs.map +1 -0
  24. package/{client → src/client}/app-types.js +31 -60
  25. package/src/client/app-types.js.map +1 -0
  26. package/{client → src/client}/app-types.mjs +32 -61
  27. package/src/client/app-types.mjs.map +1 -0
  28. package/{client → src/client}/call-composer-types.js +31 -34
  29. package/src/client/call-composer-types.js.map +1 -0
  30. package/{client → src/client}/call-composer-types.mjs +31 -34
  31. package/src/client/call-composer-types.mjs.map +1 -0
  32. package/{client → src/client}/call-composer.js +24 -31
  33. package/src/client/call-composer.js.map +1 -0
  34. package/{client → src/client}/call-composer.mjs +24 -31
  35. package/src/client/call-composer.mjs.map +1 -0
  36. package/{client → src/client}/deploy-types.js +28 -53
  37. package/src/client/deploy-types.js.map +1 -0
  38. package/{client → src/client}/deploy-types.mjs +29 -52
  39. package/src/client/deploy-types.mjs.map +1 -0
  40. package/{client → src/client}/generate.js +2 -2
  41. package/src/client/generate.js.map +1 -0
  42. package/{client → src/client}/generate.mjs +2 -2
  43. package/src/client/generate.mjs.map +1 -0
  44. package/src/client/generator-context.js +24 -0
  45. package/src/client/generator-context.js.map +1 -0
  46. package/src/client/generator-context.mjs +21 -0
  47. package/src/client/generator-context.mjs.map +1 -0
  48. package/{client → src/client}/helpers/contains-non-void-method.js +3 -2
  49. package/src/client/helpers/contains-non-void-method.js.map +1 -0
  50. package/{client → src/client}/helpers/contains-non-void-method.mjs +3 -2
  51. package/src/client/helpers/contains-non-void-method.mjs.map +1 -0
  52. package/src/client/helpers/get-equivalent-type.js +80 -0
  53. package/src/client/helpers/get-equivalent-type.js.map +1 -0
  54. package/src/client/helpers/get-equivalent-type.mjs +77 -0
  55. package/src/client/helpers/get-equivalent-type.mjs.map +1 -0
  56. package/src/client/imports.js +18 -0
  57. package/src/client/imports.js.map +1 -0
  58. package/src/client/imports.mjs +16 -0
  59. package/src/client/imports.mjs.map +1 -0
  60. package/src/client/params-factory.js +125 -0
  61. package/src/client/params-factory.js.map +1 -0
  62. package/src/client/params-factory.mjs +123 -0
  63. package/src/client/params-factory.mjs.map +1 -0
  64. package/src/client/utility-types.js.map +1 -0
  65. package/src/client/utility-types.mjs.map +1 -0
  66. package/src/output/writer.js.map +1 -0
  67. package/src/output/writer.mjs.map +1 -0
  68. package/src/schema/load.js.map +1 -0
  69. package/src/schema/load.mjs.map +1 -0
  70. package/src/util/boom.js.map +1 -0
  71. package/src/util/boom.mjs.map +1 -0
  72. package/src/util/color-console.js.map +1 -0
  73. package/src/util/color-console.mjs.map +1 -0
  74. package/src/util/sanitization.js.map +1 -0
  75. package/src/util/sanitization.mjs.map +1 -0
  76. package/cli.js.map +0 -1
  77. package/cli.mjs.map +0 -1
  78. package/client/app-client.js.map +0 -1
  79. package/client/app-client.mjs.map +0 -1
  80. package/client/app-factory.js.map +0 -1
  81. package/client/app-factory.mjs.map +0 -1
  82. package/client/app-types.js.map +0 -1
  83. package/client/app-types.mjs.map +0 -1
  84. package/client/call-composer-types.js.map +0 -1
  85. package/client/call-composer-types.mjs.map +0 -1
  86. package/client/call-composer.js.map +0 -1
  87. package/client/call-composer.mjs.map +0 -1
  88. package/client/deploy-types.js.map +0 -1
  89. package/client/deploy-types.mjs.map +0 -1
  90. package/client/generate.js.map +0 -1
  91. package/client/generate.mjs.map +0 -1
  92. package/client/generator-context.js +0 -30
  93. package/client/generator-context.js.map +0 -1
  94. package/client/generator-context.mjs +0 -27
  95. package/client/generator-context.mjs.map +0 -1
  96. package/client/helpers/contains-non-void-method.js.map +0 -1
  97. package/client/helpers/contains-non-void-method.mjs.map +0 -1
  98. package/client/helpers/get-call-config-summary.d.ts +0 -19
  99. package/client/helpers/get-call-config-summary.js +0 -60
  100. package/client/helpers/get-call-config-summary.js.map +0 -1
  101. package/client/helpers/get-call-config-summary.mjs +0 -57
  102. package/client/helpers/get-call-config-summary.mjs.map +0 -1
  103. package/client/helpers/get-equivalent-type.js +0 -81
  104. package/client/helpers/get-equivalent-type.js.map +0 -1
  105. package/client/helpers/get-equivalent-type.mjs +0 -79
  106. package/client/helpers/get-equivalent-type.mjs.map +0 -1
  107. package/client/imports.js +0 -27
  108. package/client/imports.js.map +0 -1
  109. package/client/imports.mjs +0 -25
  110. package/client/imports.mjs.map +0 -1
  111. package/client/params-factory.js +0 -128
  112. package/client/params-factory.js.map +0 -1
  113. package/client/params-factory.mjs +0 -126
  114. package/client/params-factory.mjs.map +0 -1
  115. package/client/utility-types.js.map +0 -1
  116. package/client/utility-types.mjs.map +0 -1
  117. package/output/writer.js.map +0 -1
  118. package/output/writer.mjs.map +0 -1
  119. package/schema/load.js.map +0 -1
  120. package/schema/load.mjs.map +0 -1
  121. package/util/boom.js.map +0 -1
  122. package/util/boom.mjs.map +0 -1
  123. package/util/color-console.js.map +0 -1
  124. package/util/color-console.mjs.map +0 -1
  125. package/util/sanitization.js.map +0 -1
  126. package/util/sanitization.mjs.map +0 -1
  127. /package/{cli.js → src/cli.js} +0 -0
  128. /package/{cli.mjs → src/cli.mjs} +0 -0
  129. /package/{client → src/client}/utility-types.js +0 -0
  130. /package/{client → src/client}/utility-types.mjs +0 -0
  131. /package/{index.js → src/index.js} +0 -0
  132. /package/{index.js.map → src/index.js.map} +0 -0
  133. /package/{index.mjs → src/index.mjs} +0 -0
  134. /package/{index.mjs.map → src/index.mjs.map} +0 -0
  135. /package/{output → src/output}/writer.js +0 -0
  136. /package/{output → src/output}/writer.mjs +0 -0
  137. /package/{schema → src/schema}/application.schema.json.js +0 -0
  138. /package/{schema → src/schema}/application.schema.json.js.map +0 -0
  139. /package/{schema → src/schema}/application.schema.json.mjs +0 -0
  140. /package/{schema → src/schema}/application.schema.json.mjs.map +0 -0
  141. /package/{schema → src/schema}/arc56.schema.json.js +0 -0
  142. /package/{schema → src/schema}/arc56.schema.json.js.map +0 -0
  143. /package/{schema → src/schema}/arc56.schema.json.mjs +0 -0
  144. /package/{schema → src/schema}/arc56.schema.json.mjs.map +0 -0
  145. /package/{schema → src/schema}/contract.schema.json.js +0 -0
  146. /package/{schema → src/schema}/contract.schema.json.js.map +0 -0
  147. /package/{schema → src/schema}/contract.schema.json.mjs +0 -0
  148. /package/{schema → src/schema}/contract.schema.json.mjs.map +0 -0
  149. /package/{schema → src/schema}/load.js +0 -0
  150. /package/{schema → src/schema}/load.mjs +0 -0
  151. /package/{util → src/util}/boom.js +0 -0
  152. /package/{util → src/util}/boom.mjs +0 -0
  153. /package/{util → src/util}/color-console.js +0 -0
  154. /package/{util → src/util}/color-console.mjs +0 -0
  155. /package/{util → src/util}/sanitization.js +0 -0
  156. /package/{util → src/util}/sanitization.mjs +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-factory.mjs","sources":["../../../src/client/app-factory.ts"],"sourcesContent":["import { DecIndent, DecIndentAndCloseBlock, DocumentParts, IncIndent, indent, jsDoc, NewLine } from '../output/writer'\n\nimport { GeneratorContext } from './generator-context'\n\nimport { AppClientMethodContext, AbiMethodClientContext, isAbiMethod } from './app-client-context'\n\nexport function* appFactory(ctx: GeneratorContext): DocumentParts {\n const { app, name } = ctx\n\n yield* jsDoc(\n `A factory to create and deploy one or more instance of the ${app.name} smart contract and to create one or more app clients to interact with those (or other) app instances`,\n )\n yield `export class ${name}Factory {`\n yield IncIndent\n yield* jsDoc(`The underlying \\`AppFactory\\` for when you want to have more flexibility`)\n yield 'public readonly appFactory: _AppFactory'\n yield NewLine\n\n yield* jsDoc({\n description: `Creates a new instance of \\`${name}Factory\\``,\n params: {\n params: 'The parameters to initialise the app factory with',\n },\n })\n\n yield `\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n\n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n\n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n\n /** A reference to the underlying \\`AlgorandClient\\` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n\n /**\n * Returns a new \\`AppClient\\` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The \\`AppClient\\`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new ${name}Client(this.appFactory.getAppClientById(params))\n }\n\n /**\n * Returns a new \\`AppClient\\` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The \\`AppClient\\`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new ${name}Client(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n `\n\n yield* deployMethod(ctx)\n yield* params(ctx)\n yield* createTransaction(ctx)\n yield* send(ctx)\n yield DecIndentAndCloseBlock\n}\n\nfunction* params(ctx: GeneratorContext): DocumentParts {\n yield* jsDoc(\n `Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.`,\n )\n yield `readonly params = {`\n yield IncIndent\n yield* paramMethods(ctx)\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n\nfunction* createTransaction(ctx: GeneratorContext): DocumentParts {\n yield* jsDoc(`Create transactions for the current app`)\n yield `readonly createTransaction = {`\n yield IncIndent\n yield* createTransactionMethods(ctx)\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n\nfunction* send(ctx: GeneratorContext): DocumentParts {\n yield* jsDoc(`Send calls to the current app`)\n yield `readonly send = {`\n yield IncIndent\n yield* createMethods(ctx)\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n\nfunction* createMethods(generator: GeneratorContext): DocumentParts {\n const { app } = generator\n if (app.createMethods.length) {\n yield* jsDoc(`Gets available create methods`)\n yield `create: {`\n yield IncIndent\n for (const method of generator.app.createMethods) {\n if (!isAbiMethod(method)) {\n yield* bareMethodCallParams({\n generator,\n name: 'bare',\n description: `Creates a new instance of the ${app.name} smart contract using a bare call`,\n verb: 'create',\n type: 'send',\n includeCompilation: true,\n })\n } else {\n yield* abiMethodCallParams({\n generator,\n method,\n description: `Creates a new instance of the ${app.name} smart contract using an ABI method call`,\n verb: 'create',\n type: 'send',\n includeCompilation: true,\n })\n }\n }\n yield DecIndent\n yield '},'\n yield NewLine\n }\n}\n\nfunction* paramMethods(ctx: GeneratorContext): DocumentParts {\n const { app } = ctx\n\n yield* operationMethods(ctx, `Creates a new instance of the ${app.name} smart contract`, app.createMethods, 'create', 'params', true)\n\n yield* operationMethods(\n ctx,\n `Updates an existing instance of the ${app.name} smart contract`,\n app.updateMethods,\n 'deployUpdate',\n 'params',\n true,\n )\n yield* operationMethods(\n ctx,\n `Deletes an existing instance of the ${app.name} smart contract`,\n app.deleteMethods,\n 'deployDelete',\n 'params',\n )\n}\n\nfunction* createTransactionMethods(ctx: GeneratorContext): DocumentParts {\n const { app } = ctx\n\n yield* operationMethods(\n ctx,\n `Creates a new instance of the ${app.name} smart contract`,\n app.createMethods,\n 'create',\n 'createTransaction',\n true,\n )\n}\n\nfunction* bareMethodCallParams({\n generator: { app, name: clientName },\n name,\n description,\n verb,\n type,\n includeCompilation,\n}: {\n generator: GeneratorContext\n name: string\n description: string\n verb: 'create' | 'deployUpdate' | 'deployDelete'\n type: 'params' | 'createTransaction' | 'send'\n includeCompilation?: boolean\n}): DocumentParts {\n const onComplete = verb === 'create' ? app.bareMethod.createActions.inputType : undefined\n yield* jsDoc({\n description: `${description}.`,\n params: {\n params: `The params for the bare (raw) call`,\n },\n returns:\n type === 'params' || type === 'createTransaction'\n ? `The ${type === 'createTransaction' ? 'transaction' : type} for a ${verb} call`\n : `The ${verb} result`,\n })\n yield `${name}: ${type === 'send' ? 'async ' : ''}(params?: Expand<AppClientBareCallParams${\n includeCompilation ? ' &' + ' AppClientCompilationParams' : ''\n }${\n verb === 'create' ? ' & CreateSchema' : ''\n }${type === 'send' ? ' & SendParams' : ''}${onComplete?.typeLiteral ? ` & ${onComplete.typeLiteral}` : ''}>) => {`\n if (type === 'params' || type === 'createTransaction') {\n yield* indent(`return this.appFactory.${type}.bare.${verb}(params)`)\n } else {\n yield* indent(\n `const result = await this.appFactory.send.bare.create(params)`,\n `return { result: result.result, appClient: new ${clientName}Client(result.appClient) }`,\n )\n }\n yield '},'\n}\n\nfunction* abiMethodCallParams({\n generator: { name, sanitizer },\n method,\n description,\n verb,\n type,\n includeCompilation,\n}: {\n generator: GeneratorContext\n method: AbiMethodClientContext\n description: string\n verb: 'create' | 'deployUpdate' | 'deployDelete'\n type: 'params' | 'createTransaction' | 'send'\n includeCompilation?: boolean\n}) {\n const methodSig = method.signature\n const uniqueName = method.uniqueName.original\n const onComplete = verb === 'create' ? method.createActions.inputType : undefined\n yield* jsDoc({\n description: `${description} using the ${methodSig} ABI method.`,\n abiDescription: method?.desc,\n params: {\n params: `The params for the smart contract call`,\n },\n returns: `The ${verb} ${type === 'params' ? 'params' : type === 'createTransaction' ? 'transaction' : 'result'}${method?.returns?.desc ? `: ${method.returns.desc}` : ''}`,\n })\n const methodName = sanitizer.makeSafeMethodIdentifier(uniqueName)\n const methodNameAccessor = sanitizer.getSafeMemberAccessor(methodName)\n const methodSigSafe = sanitizer.makeSafeStringTypeLiteral(methodSig)\n yield `${methodName}: ${type === 'send' ? 'async ' : ''}(params: CallParams<${name}Args['obj']['${methodSigSafe}'] | ${name}Args['tuple']['${methodSigSafe}']>${\n includeCompilation ? ' &' + ' AppClientCompilationParams' : ''\n }${\n verb === 'create' ? ' & CreateSchema' : ''\n }${type === 'send' ? ' & SendParams' : ''}${onComplete?.typeLiteral ? ` & ${onComplete.typeLiteral}` : ''}${onComplete?.isOptional !== false && (method.args.length === 0 || !method.args.some((a) => !a.defaultValue)) ? ` = {args: [${method.args.map((_) => 'undefined').join(', ')}]}` : ''}) => {`\n if (type === 'params' || type === 'createTransaction') {\n yield* indent(\n `return this.appFactory.${type}.${verb}(${name}ParamsFactory.${verb == 'deployDelete' ? 'delete' : verb === 'deployUpdate' ? 'update' : verb}${methodNameAccessor}(params))`,\n )\n } else {\n yield* indent(\n `const result = await this.appFactory.send.create(${name}ParamsFactory.${verb}${methodNameAccessor}(params))`,\n `return { result: { ...result.result, return: result.result.return as unknown as (undefined | ${name}Returns['${methodSigSafe}']) }, appClient: new ${name}Client(result.appClient) }`,\n )\n }\n yield '},'\n}\n\nfunction* operationMethods(\n generator: GeneratorContext,\n description: string,\n methods: AppClientMethodContext[],\n verb: 'create' | 'deployUpdate' | 'deployDelete',\n type: 'params' | 'createTransaction',\n includeCompilation?: boolean,\n): DocumentParts {\n if (methods.length) {\n yield* jsDoc(`Gets available ${verb} methods`)\n yield `${verb}: {`\n yield IncIndent\n for (const method of methods) {\n if (!isAbiMethod(method)) {\n yield* bareMethodCallParams({\n generator,\n name: 'bare',\n description: `${description} using a bare call`,\n verb,\n type,\n includeCompilation,\n })\n } else {\n yield* abiMethodCallParams({\n generator,\n method,\n description,\n verb,\n type,\n includeCompilation,\n })\n }\n }\n yield DecIndent\n yield '},'\n yield NewLine\n }\n}\n\nfunction* deployMethod(ctx: GeneratorContext): DocumentParts {\n const { app, name } = ctx\n yield* jsDoc({\n description: `Idempotently deploys the ${app.name} smart contract.`,\n params: {\n params: 'The arguments for the contract calls and any additional parameters for the call',\n },\n returns: 'The deployment result',\n })\n yield `public async deploy(params: ${name}DeployParams = {}) {`\n yield IncIndent\n\n yield `const result = await this.appFactory.deploy({`\n yield IncIndent\n yield `...params,`\n if (app.createMethods.some((m) => !m.isBare)) {\n yield `createParams: params.createParams?.method ? ${name}ParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (${name}CreateCallParams & { args: Uint8Array[] }) : undefined,`\n }\n if (app.updateMethods.some((m) => !m.isBare)) {\n yield `updateParams: params.updateParams?.method ? ${name}ParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (${name}UpdateCallParams & { args: Uint8Array[] }) : undefined,`\n }\n if (app.deleteMethods.some((m) => !m.isBare)) {\n yield `deleteParams: params.deleteParams?.method ? ${name}ParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (${name}DeleteCallParams & { args: Uint8Array[] }) : undefined,`\n }\n yield DecIndent\n yield `})`\n yield `return { result: result.result, appClient: new ${name}Client(result.appClient) }`\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n"],"names":[],"mappings":";;;AAMM,UAAW,UAAU,CAAC,GAAqB,EAAA;AAC/C,IAAA,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG;IAEzB,OAAO,KAAK,CACV,CAAA,2DAAA,EAA8D,GAAG,CAAC,IAAI,CAAA,qGAAA,CAAuG,CAC9K;IACD,MAAM,CAAA,aAAA,EAAgB,IAAI,CAAA,SAAA,CAAW;AACrC,IAAA,MAAM,SAAS;AACf,IAAA,OAAO,KAAK,CAAC,CAAA,wEAAA,CAA0E,CAAC;AACxF,IAAA,MAAM,yCAAyC;AAC/C,IAAA,MAAM,OAAO;IAEb,OAAO,KAAK,CAAC;QACX,WAAW,EAAE,CAAA,4BAAA,EAA+B,IAAI,CAAA,SAAA,CAAW;AAC3D,QAAA,MAAM,EAAE;AACN,YAAA,MAAM,EAAE,mDAAmD;AAC5D,SAAA;AACF,KAAA,CAAC;IAEF,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAgCW,IAAI,CAAA;;;;;;;;;;;;;;;mBAeJ,IAAI,CAAA;;GAEpB;AAED,IAAA,OAAO,YAAY,CAAC,GAAG,CAAC;AACxB,IAAA,OAAO,MAAM,CAAC,GAAG,CAAC;AAClB,IAAA,OAAO,iBAAiB,CAAC,GAAG,CAAC;AAC7B,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC;AAChB,IAAA,MAAM,sBAAsB;AAC9B;AAEA,UAAU,MAAM,CAAC,GAAqB,EAAA;AACpC,IAAA,OAAO,KAAK,CACV,CAAA,6LAAA,CAA+L,CAChM;AACD,IAAA,MAAM,qBAAqB;AAC3B,IAAA,MAAM,SAAS;AACf,IAAA,OAAO,YAAY,CAAC,GAAG,CAAC;AACxB,IAAA,MAAM,sBAAsB;AAC5B,IAAA,MAAM,OAAO;AACf;AAEA,UAAU,iBAAiB,CAAC,GAAqB,EAAA;AAC/C,IAAA,OAAO,KAAK,CAAC,CAAA,uCAAA,CAAyC,CAAC;AACvD,IAAA,MAAM,gCAAgC;AACtC,IAAA,MAAM,SAAS;AACf,IAAA,OAAO,wBAAwB,CAAC,GAAG,CAAC;AACpC,IAAA,MAAM,sBAAsB;AAC5B,IAAA,MAAM,OAAO;AACf;AAEA,UAAU,IAAI,CAAC,GAAqB,EAAA;AAClC,IAAA,OAAO,KAAK,CAAC,CAAA,6BAAA,CAA+B,CAAC;AAC7C,IAAA,MAAM,mBAAmB;AACzB,IAAA,MAAM,SAAS;AACf,IAAA,OAAO,aAAa,CAAC,GAAG,CAAC;AACzB,IAAA,MAAM,sBAAsB;AAC5B,IAAA,MAAM,OAAO;AACf;AAEA,UAAU,aAAa,CAAC,SAA2B,EAAA;AACjD,IAAA,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS;AACzB,IAAA,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE;AAC5B,QAAA,OAAO,KAAK,CAAC,CAAA,6BAAA,CAA+B,CAAC;AAC7C,QAAA,MAAM,WAAW;AACjB,QAAA,MAAM,SAAS;QACf,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE;AAChD,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;gBACxB,OAAO,oBAAoB,CAAC;oBAC1B,SAAS;AACT,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,WAAW,EAAE,CAAA,8BAAA,EAAiC,GAAG,CAAC,IAAI,CAAA,iCAAA,CAAmC;AACzF,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,kBAAkB,EAAE,IAAI;AACzB,iBAAA,CAAC;YACJ;iBAAO;gBACL,OAAO,mBAAmB,CAAC;oBACzB,SAAS;oBACT,MAAM;AACN,oBAAA,WAAW,EAAE,CAAA,8BAAA,EAAiC,GAAG,CAAC,IAAI,CAAA,wCAAA,CAA0C;AAChG,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,kBAAkB,EAAE,IAAI;AACzB,iBAAA,CAAC;YACJ;QACF;AACA,QAAA,MAAM,SAAS;AACf,QAAA,MAAM,IAAI;AACV,QAAA,MAAM,OAAO;IACf;AACF;AAEA,UAAU,YAAY,CAAC,GAAqB,EAAA;AAC1C,IAAA,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG;IAEnB,OAAO,gBAAgB,CAAC,GAAG,EAAE,CAAA,8BAAA,EAAiC,GAAG,CAAC,IAAI,CAAA,eAAA,CAAiB,EAAE,GAAG,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC;IAErI,OAAO,gBAAgB,CACrB,GAAG,EACH,CAAA,oCAAA,EAAuC,GAAG,CAAC,IAAI,CAAA,eAAA,CAAiB,EAChE,GAAG,CAAC,aAAa,EACjB,cAAc,EACd,QAAQ,EACR,IAAI,CACL;IACD,OAAO,gBAAgB,CACrB,GAAG,EACH,CAAA,oCAAA,EAAuC,GAAG,CAAC,IAAI,iBAAiB,EAChE,GAAG,CAAC,aAAa,EACjB,cAAc,EACd,QAAQ,CACT;AACH;AAEA,UAAU,wBAAwB,CAAC,GAAqB,EAAA;AACtD,IAAA,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG;IAEnB,OAAO,gBAAgB,CACrB,GAAG,EACH,CAAA,8BAAA,EAAiC,GAAG,CAAC,IAAI,CAAA,eAAA,CAAiB,EAC1D,GAAG,CAAC,aAAa,EACjB,QAAQ,EACR,mBAAmB,EACnB,IAAI,CACL;AACH;AAEA,UAAU,oBAAoB,CAAC,EAC7B,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EACpC,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,kBAAkB,GAQnB,EAAA;AACC,IAAA,MAAM,UAAU,GAAG,IAAI,KAAK,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;IACzF,OAAO,KAAK,CAAC;QACX,WAAW,EAAE,CAAA,EAAG,WAAW,CAAA,CAAA,CAAG;AAC9B,QAAA,MAAM,EAAE;AACN,YAAA,MAAM,EAAE,CAAA,kCAAA,CAAoC;AAC7C,SAAA;AACD,QAAA,OAAO,EACL,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK;AAC5B,cAAE,CAAA,IAAA,EAAO,IAAI,KAAK,mBAAmB,GAAG,aAAa,GAAG,IAAI,CAAA,OAAA,EAAU,IAAI,CAAA,KAAA;cACxE,CAAA,IAAA,EAAO,IAAI,CAAA,OAAA,CAAS;AAC3B,KAAA,CAAC;AACF,IAAA,MAAM,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAI,KAAK,MAAM,GAAG,QAAQ,GAAG,EAAE,CAAA,wCAAA,EAC/C,kBAAkB,GAAG,IAAI,GAAG,6BAA6B,GAAG,EAC9D,CAAA,EACE,IAAI,KAAK,QAAQ,GAAG,iBAAiB,GAAG,EAC1C,CAAA,EAAG,IAAI,KAAK,MAAM,GAAG,eAAe,GAAG,EAAE,CAAA,EAAG,UAAU,EAAE,WAAW,GAAG,MAAM,UAAU,CAAC,WAAW,CAAA,CAAE,GAAG,EAAE,SAAS;IAClH,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,mBAAmB,EAAE;QACrD,OAAO,MAAM,CAAC,CAAA,uBAAA,EAA0B,IAAI,CAAA,MAAA,EAAS,IAAI,CAAA,QAAA,CAAU,CAAC;IACtE;SAAO;QACL,OAAO,MAAM,CACX,CAAA,6DAAA,CAA+D,EAC/D,CAAA,+CAAA,EAAkD,UAAU,CAAA,0BAAA,CAA4B,CACzF;IACH;AACA,IAAA,MAAM,IAAI;AACZ;AAEA,UAAU,mBAAmB,CAAC,EAC5B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAC9B,MAAM,EACN,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,kBAAkB,GAQnB,EAAA;AACC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;AAClC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ;AAC7C,IAAA,MAAM,UAAU,GAAG,IAAI,KAAK,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;IACjF,OAAO,KAAK,CAAC;AACX,QAAA,WAAW,EAAE,CAAA,EAAG,WAAW,CAAA,WAAA,EAAc,SAAS,CAAA,YAAA,CAAc;QAChE,cAAc,EAAE,MAAM,EAAE,IAAI;AAC5B,QAAA,MAAM,EAAE;AACN,YAAA,MAAM,EAAE,CAAA,sCAAA,CAAwC;AACjD,SAAA;QACD,OAAO,EAAE,OAAO,IAAI,CAAA,CAAA,EAAI,IAAI,KAAK,QAAQ,GAAG,QAAQ,GAAG,IAAI,KAAK,mBAAmB,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CAAA,CAAE;AAC3K,KAAA,CAAC;IACF,MAAM,UAAU,GAAG,SAAS,CAAC,wBAAwB,CAAC,UAAU,CAAC;IACjE,MAAM,kBAAkB,GAAG,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC;IACtE,MAAM,aAAa,GAAG,SAAS,CAAC,yBAAyB,CAAC,SAAS,CAAC;AACpE,IAAA,MAAM,CAAA,EAAG,UAAU,CAAA,EAAA,EAAK,IAAI,KAAK,MAAM,GAAG,QAAQ,GAAG,EAAE,CAAA,oBAAA,EAAuB,IAAI,CAAA,aAAA,EAAgB,aAAa,CAAA,KAAA,EAAQ,IAAI,CAAA,eAAA,EAAkB,aAAa,CAAA,GAAA,EACxJ,kBAAkB,GAAG,IAAI,GAAG,6BAA6B,GAAG,EAC9D,CAAA,EACE,IAAI,KAAK,QAAQ,GAAG,iBAAiB,GAAG,EAC1C,CAAA,EAAG,IAAI,KAAK,MAAM,GAAG,eAAe,GAAG,EAAE,CAAA,EAAG,UAAU,EAAE,WAAW,GAAG,MAAM,UAAU,CAAC,WAAW,CAAA,CAAE,GAAG,EAAE,CAAA,EAAG,UAAU,EAAE,UAAU,KAAK,KAAK,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAA,WAAA,EAAc,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAA,CAAI,GAAG,EAAE,QAAQ;IACvS,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,mBAAmB,EAAE;AACrD,QAAA,OAAO,MAAM,CACX,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAI,iBAAiB,IAAI,IAAI,cAAc,GAAG,QAAQ,GAAG,IAAI,KAAK,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAA,EAAG,kBAAkB,CAAA,SAAA,CAAW,CAC7K;IACH;SAAO;QACL,OAAO,MAAM,CACX,oDAAoD,IAAI,CAAA,cAAA,EAAiB,IAAI,CAAA,EAAG,kBAAkB,WAAW,EAC7G,CAAA,6FAAA,EAAgG,IAAI,CAAA,SAAA,EAAY,aAAa,yBAAyB,IAAI,CAAA,0BAAA,CAA4B,CACvL;IACH;AACA,IAAA,MAAM,IAAI;AACZ;AAEA,UAAU,gBAAgB,CACxB,SAA2B,EAC3B,WAAmB,EACnB,OAAiC,EACjC,IAAgD,EAChD,IAAoC,EACpC,kBAA4B,EAAA;AAE5B,IAAA,IAAI,OAAO,CAAC,MAAM,EAAE;QAClB,OAAO,KAAK,CAAC,kBAAkB,IAAI,CAAA,QAAA,CAAU,CAAC;QAC9C,MAAM,CAAA,EAAG,IAAI,CAAA,GAAA,CAAK;AAClB,QAAA,MAAM,SAAS;AACf,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;gBACxB,OAAO,oBAAoB,CAAC;oBAC1B,SAAS;AACT,oBAAA,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,CAAA,EAAG,WAAW,CAAA,kBAAA,CAAoB;oBAC/C,IAAI;oBACJ,IAAI;oBACJ,kBAAkB;AACnB,iBAAA,CAAC;YACJ;iBAAO;gBACL,OAAO,mBAAmB,CAAC;oBACzB,SAAS;oBACT,MAAM;oBACN,WAAW;oBACX,IAAI;oBACJ,IAAI;oBACJ,kBAAkB;AACnB,iBAAA,CAAC;YACJ;QACF;AACA,QAAA,MAAM,SAAS;AACf,QAAA,MAAM,IAAI;AACV,QAAA,MAAM,OAAO;IACf;AACF;AAEA,UAAU,YAAY,CAAC,GAAqB,EAAA;AAC1C,IAAA,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG;IACzB,OAAO,KAAK,CAAC;AACX,QAAA,WAAW,EAAE,CAAA,yBAAA,EAA4B,GAAG,CAAC,IAAI,CAAA,gBAAA,CAAkB;AACnE,QAAA,MAAM,EAAE;AACN,YAAA,MAAM,EAAE,iFAAiF;AAC1F,SAAA;AACD,QAAA,OAAO,EAAE,uBAAuB;AACjC,KAAA,CAAC;IACF,MAAM,CAAA,4BAAA,EAA+B,IAAI,CAAA,oBAAA,CAAsB;AAC/D,IAAA,MAAM,SAAS;AAEf,IAAA,MAAM,+CAA+C;AACrD,IAAA,MAAM,SAAS;AACf,IAAA,MAAM,YAAY;AAClB,IAAA,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;AAC5C,QAAA,MAAM,CAAA,4CAAA,EAA+C,IAAI,CAAA,2GAAA,EAA8G,IAAI,yDAAyD;IACtO;AACA,IAAA,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;AAC5C,QAAA,MAAM,CAAA,4CAAA,EAA+C,IAAI,CAAA,2GAAA,EAA8G,IAAI,yDAAyD;IACtO;AACA,IAAA,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;AAC5C,QAAA,MAAM,CAAA,4CAAA,EAA+C,IAAI,CAAA,2GAAA,EAA8G,IAAI,yDAAyD;IACtO;AACA,IAAA,MAAM,SAAS;AACf,IAAA,MAAM,IAAI;IACV,MAAM,CAAA,+CAAA,EAAkD,IAAI,CAAA,0BAAA,CAA4B;AACxF,IAAA,MAAM,sBAAsB;AAC5B,IAAA,MAAM,OAAO;AACf;;;;"}
@@ -1,27 +1,25 @@
1
1
  'use strict';
2
2
 
3
3
  var writer = require('../output/writer.js');
4
- var getEquivalentType = require('./helpers/get-equivalent-type.js');
5
- var algosdk = require('algosdk');
4
+ var abi = require('@algorandfoundation/algokit-utils/abi');
6
5
  var containsNonVoidMethod = require('./helpers/contains-non-void-method.js');
7
6
 
8
- function getMethodMetadata(method, ctx) {
9
- const { methodSignatureToUniqueName } = ctx;
10
- const methodSig = new algosdk.ABIMethod(method).getSignature();
11
- const uniqueName = methodSignatureToUniqueName[methodSig];
7
+ function getMethodMetadata(method) {
8
+ const methodSig = method.signature;
9
+ const uniqueName = method.uniqueName.original;
12
10
  let hasAppCallArgToTheRight = false;
13
11
  const argsMeta = new Array();
14
12
  for (let i = (method.args ?? []).length - 1; i >= 0; i--) {
15
13
  const arg = method.args[i];
16
14
  argsMeta.push({
17
15
  ...arg,
18
- name: arg.name ?? `arg${i + 1}`,
19
- isOptional: !!arg.defaultValue || (hasAppCallArgToTheRight && algosdk.abiTypeIsTransaction(arg.type)),
20
- tsType: getEquivalentType.getEquivalentType(arg.struct ?? arg.type, 'input', ctx),
16
+ name: arg.name?.original ?? `arg${i + 1}`,
17
+ isOptional: !!arg.defaultValue || (hasAppCallArgToTheRight && abi.argTypeIsTransaction(arg.type)),
18
+ tsType: arg.tsInType,
21
19
  });
22
20
  if (!hasAppCallArgToTheRight &&
23
- algosdk.abiTypeIsTransaction(arg.type) &&
24
- [algosdk.ABITransactionType.appl, algosdk.ABITransactionType.any].includes(arg.type)) {
21
+ abi.argTypeIsTransaction(arg.type) &&
22
+ [abi.ABITransactionType.AppCall, abi.ABITransactionType.Txn].includes(arg.type)) {
25
23
  hasAppCallArgToTheRight = true;
26
24
  }
27
25
  }
@@ -38,8 +36,8 @@ function* appTypes(ctx) {
38
36
  yield* writer.jsDoc('The object representation of the arguments for each method');
39
37
  yield 'obj: {';
40
38
  yield writer.IncIndent;
41
- for (const method of app.methods) {
42
- const { methodSig, argsMeta } = getMethodMetadata(method, ctx);
39
+ for (const method of app.abiMethods) {
40
+ const { methodSig, argsMeta } = getMethodMetadata(method);
43
41
  if (argsMeta.length) {
44
42
  yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': {`;
45
43
  yield writer.IncIndent;
@@ -58,8 +56,8 @@ function* appTypes(ctx) {
58
56
  yield* writer.jsDoc('The tuple representation of the arguments for each method');
59
57
  yield 'tuple: {';
60
58
  yield writer.IncIndent;
61
- for (const method of app.methods) {
62
- const { methodSig, argsMeta } = getMethodMetadata(method, ctx);
59
+ for (const method of app.abiMethods) {
60
+ const { methodSig, argsMeta } = getMethodMetadata(method);
63
61
  yield* writer.inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': [`, argsMeta
64
62
  .map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.isOptional ? ' | undefined' : ''}`)
65
63
  .join(', '), ']');
@@ -70,9 +68,9 @@ function* appTypes(ctx) {
70
68
  yield* writer.jsDoc('The return type for each method');
71
69
  yield `export type ${name}Returns = {`;
72
70
  yield writer.IncIndent;
73
- for (const method of app.methods) {
74
- const { methodSig } = getMethodMetadata(method, ctx);
75
- yield* writer.inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': ${getEquivalentType.getEquivalentType(method.returns.struct ?? method.returns.type ?? 'void', 'output', ctx)}`);
71
+ for (const method of app.abiMethods) {
72
+ const { methodSig } = getMethodMetadata(method);
73
+ yield* writer.inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': ${method.returns.tsOutType}`);
76
74
  }
77
75
  yield writer.DecIndentAndCloseBlock;
78
76
  yield writer.NewLine;
@@ -80,16 +78,16 @@ function* appTypes(ctx) {
80
78
  yield `export type ${name}Types = {`;
81
79
  yield writer.IncIndent;
82
80
  yield* writer.jsDoc('Maps method signatures / names to their argument and return types.');
83
- if (app.methods.length == 0) {
81
+ if (app.abiMethods.length == 0) {
84
82
  yield 'methods: {}';
85
83
  }
86
84
  else {
87
85
  yield 'methods:';
88
86
  }
89
87
  yield writer.IncIndent;
90
- for (const method of app.methods) {
91
- const { methodSig, uniqueName } = getMethodMetadata(method, ctx);
92
- yield `& Record<'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}'${methodSig !== uniqueName ? ` | '${ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName)}'` : ''}, {`;
88
+ for (const method of app.abiMethods) {
89
+ const { methodSig } = getMethodMetadata(method);
90
+ yield `& Record<'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}'${method.baseNameIsUnique ? ` | '${method.name.makeSafeStringTypeLiteral}'` : ''}, {`;
93
91
  yield writer.IncIndent;
94
92
  yield `argsObj: ${name}Args['obj']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`;
95
93
  yield `argsTuple: ${name}Args['tuple']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`;
@@ -166,41 +164,15 @@ function* appTypes(ctx) {
166
164
  }
167
165
  yield writer.NewLine;
168
166
  }
169
- /* eslint-disable @typescript-eslint/no-explicit-any */
170
- function getStructAsObject(struct, ctx) {
171
- return Object.fromEntries(struct.map((s) => [s.name, typeof s.type === 'string' ? getEquivalentType.getEquivalentType(s.type, 'output', ctx) : getStructAsObject(s.type, ctx)]));
172
- }
173
- function getStructAsTupleTypes(struct, ctx) {
174
- return `[${struct
175
- .map((s) => {
176
- // Field is an inline nested struct (array of StructField)
177
- if (Array.isArray(s.type)) {
178
- return getStructAsTupleTypes(s.type, ctx);
179
- }
180
- // Field references a named struct defined elsewhere
181
- if (Object.keys(ctx.app.structs).includes(s.type)) {
182
- return getStructAsTupleTypes(ctx.app.structs[s.type], ctx);
183
- }
184
- // Field is a primitive type (string, uint64, etc.)
185
- return getEquivalentType.getEquivalentType(s.type, 'output', ctx);
186
- })
187
- .join(', ')}]`;
188
- }
189
167
  function* structTypes(ctx) {
190
168
  const { app, sanitizer } = ctx;
191
169
  if (Object.keys(app.structs).length === 0)
192
170
  return;
193
171
  yield '// Type definitions for ARC-56 structs';
194
172
  yield writer.NewLine;
195
- for (const structName of Object.keys(app.structs)) {
173
+ for (const [structName, structCtx] of Object.entries(app.structs)) {
196
174
  // Emit the struct type
197
- yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${JSON.stringify(getStructAsObject(app.structs[structName], ctx), null, 2).replace(/"/g, '')}`;
198
- yield writer.NewLine;
199
- // Emit method that converts ABI tuple to the struct object
200
- yield* writer.jsDoc(`Converts the ABI tuple representation of a ${structName} to the struct representation`);
201
- yield* writer.inline(`export function ${sanitizer.makeSafeTypeIdentifier(structName)}FromTuple(`, `abiTuple: ${getStructAsTupleTypes(app.structs[structName], ctx)}`, `) {`);
202
- yield* writer.indent(`return getABIStructFromABITuple(abiTuple, APP_SPEC.structs${sanitizer.getSafeMemberAccessor(structName)}, APP_SPEC.structs) as ${sanitizer.makeSafeTypeIdentifier(structName)}`);
203
- yield '}';
175
+ yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${structCtx.tsObjDef}`;
204
176
  yield writer.NewLine;
205
177
  }
206
178
  }
@@ -211,23 +183,22 @@ function* templateVariableTypes(ctx) {
211
183
  yield* writer.jsDoc('Deploy-time template variables');
212
184
  yield 'export type TemplateVariables = {';
213
185
  yield writer.IncIndent;
214
- for (const name of Object.keys(ctx.app.templateVariables ?? {})) {
215
- yield `${name}: ${getEquivalentType.getEquivalentType(ctx.app.templateVariables[name].type, 'output', ctx)},`;
186
+ for (const [name, def] of Object.entries(ctx.app.templateVariables ?? {})) {
187
+ yield `${name}: ${def.type.tsInType},`;
216
188
  }
217
189
  yield writer.DecIndentAndCloseBlock;
218
190
  yield writer.NewLine;
219
191
  }
220
- function* keysAndMaps(app, sanitizer, keys, maps) {
192
+ function* keysAndMaps(sanitizer, keys, maps) {
221
193
  if (keys && Object.keys(keys).length) {
222
194
  yield 'keys: {';
223
195
  yield writer.IncIndent;
224
- for (const name of Object.keys(keys)) {
225
- const prop = keys[name];
196
+ for (const [name, prop] of Object.entries(keys)) {
226
197
  if (prop.desc) {
227
198
  yield* writer.jsDoc(prop.desc);
228
199
  }
229
200
  const keySafe = sanitizer.makeSafePropertyIdentifier(name);
230
- yield `${keySafe}: ${prop.valueType === 'AVMBytes' ? 'BinaryState' : getEquivalentType.getEquivalentType(prop.valueType, 'output', { app, sanitizer })}`;
201
+ yield `${keySafe}: ${prop.valueType.isAvmBytes ? 'BinaryState' : prop.valueType.tsOutType}`;
231
202
  }
232
203
  yield writer.DecIndentAndCloseBlock;
233
204
  }
@@ -243,7 +214,7 @@ function* keysAndMaps(app, sanitizer, keys, maps) {
243
214
  yield* writer.jsDoc(prop.desc);
244
215
  }
245
216
  const keySafe = sanitizer.makeSafePropertyIdentifier(name);
246
- yield `${keySafe}: Map<${getEquivalentType.getEquivalentType(prop.keyType, 'input', { app, sanitizer })}, ${getEquivalentType.getEquivalentType(prop.valueType, 'output', { app, sanitizer })}>`;
217
+ yield `${keySafe}: Map<${prop.keyType.tsInType}, ${prop.valueType.tsOutType}>`;
247
218
  }
248
219
  yield writer.DecIndentAndCloseBlock;
249
220
  }
@@ -260,19 +231,19 @@ function* appState({ app, sanitizer }, stateFlags) {
260
231
  if (hasGlobal) {
261
232
  yield 'global: {';
262
233
  yield writer.IncIndent;
263
- yield* keysAndMaps(app, sanitizer, app.state.keys.global, app.state.maps.global);
234
+ yield* keysAndMaps(sanitizer, app.state.keys.global, app.state.maps.global);
264
235
  yield writer.DecIndentAndCloseBlock;
265
236
  }
266
237
  if (hasLocal) {
267
238
  yield 'local: {';
268
239
  yield writer.IncIndent;
269
- yield* keysAndMaps(app, sanitizer, app.state.keys.local, app.state.maps.local);
240
+ yield* keysAndMaps(sanitizer, app.state.keys.local, app.state.maps.local);
270
241
  yield writer.DecIndentAndCloseBlock;
271
242
  }
272
243
  if (hasBox) {
273
244
  yield 'box: {';
274
245
  yield writer.IncIndent;
275
- yield* keysAndMaps(app, sanitizer, app.state.keys.box, app.state.maps.box);
246
+ yield* keysAndMaps(sanitizer, app.state.keys.box, app.state.maps.box);
276
247
  yield writer.DecIndentAndCloseBlock;
277
248
  }
278
249
  yield writer.DecIndentAndCloseBlock;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-types.js","sources":["../../../src/client/app-types.ts"],"sourcesContent":["import { GeneratorContext } from './generator-context'\nimport { DecIndent, DecIndentAndCloseBlock, DocumentParts, IncIndent, inline, jsDoc, NewLine } from '../output/writer'\nimport { argTypeIsTransaction, ABITransactionType } from '@algorandfoundation/algokit-utils/abi'\nimport { Sanitizer } from '../util/sanitization'\nimport { Expand } from '@algorandfoundation/algokit-utils/types/expand'\nimport { containsNonVoidMethod } from './helpers/contains-non-void-method'\nimport { AbiMethodClientContext, StorageKeyContext, StorageMapContext } from './app-client-context'\n\nfunction getMethodMetadata(method: AbiMethodClientContext) {\n const methodSig = method.signature\n const uniqueName = method.uniqueName.original\n\n let hasAppCallArgToTheRight = false\n const argsMeta = new Array<Expand<Omit<(typeof method.args)[0], 'name'> & { name: string; isOptional: boolean; tsType: string }>>()\n\n for (let i = (method.args ?? []).length - 1; i >= 0; i--) {\n const arg = method.args[i]\n\n argsMeta.push({\n ...arg,\n name: arg.name?.original ?? `arg${i + 1}`,\n isOptional: !!arg.defaultValue || (hasAppCallArgToTheRight && argTypeIsTransaction(arg.type)),\n tsType: arg.tsInType,\n })\n\n if (\n !hasAppCallArgToTheRight &&\n argTypeIsTransaction(arg.type) &&\n [ABITransactionType.AppCall, ABITransactionType.Txn].includes(arg.type)\n ) {\n hasAppCallArgToTheRight = true\n }\n }\n argsMeta.reverse()\n\n return { methodSig, uniqueName, argsMeta }\n}\n\nexport function* appTypes(ctx: GeneratorContext): DocumentParts {\n yield* structTypes(ctx)\n yield* templateVariableTypes(ctx)\n\n const { app, name } = ctx\n\n yield* jsDoc(`The argument types for the ${name} contract`)\n yield `export type ${name}Args = {`\n yield IncIndent\n yield* jsDoc('The object representation of the arguments for each method')\n yield 'obj: {'\n yield IncIndent\n for (const method of app.abiMethods) {\n const { methodSig, argsMeta } = getMethodMetadata(method)\n if (argsMeta.length) {\n yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': {`\n yield IncIndent\n for (const arg of argsMeta) {\n if (arg.desc) yield* jsDoc(arg.desc)\n yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.isOptional ? '?' : ''}: ${arg.tsType}`\n }\n yield DecIndentAndCloseBlock\n } else {\n yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': Record<string, never>`\n }\n }\n yield DecIndentAndCloseBlock\n\n yield* jsDoc('The tuple representation of the arguments for each method')\n yield 'tuple: {'\n yield IncIndent\n for (const method of app.abiMethods) {\n const { methodSig, argsMeta } = getMethodMetadata(method)\n yield* inline(\n `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': [`,\n argsMeta\n .map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.isOptional ? ' | undefined' : ''}`)\n .join(', '),\n ']',\n )\n }\n yield DecIndentAndCloseBlock\n\n yield DecIndentAndCloseBlock\n yield NewLine\n\n yield* jsDoc('The return type for each method')\n yield `export type ${name}Returns = {`\n yield IncIndent\n for (const method of app.abiMethods) {\n const { methodSig } = getMethodMetadata(method)\n yield* inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': ${method.returns.tsOutType}`)\n }\n yield DecIndentAndCloseBlock\n yield NewLine\n\n yield* jsDoc(`Defines the types of available calls and state of the ${name} smart contract.`)\n yield `export type ${name}Types = {`\n yield IncIndent\n yield* jsDoc('Maps method signatures / names to their argument and return types.')\n if (app.abiMethods.length == 0) {\n yield 'methods: {}'\n } else {\n yield 'methods:'\n }\n yield IncIndent\n for (const method of app.abiMethods) {\n const { methodSig } = getMethodMetadata(method)\n yield `& Record<'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}'${method.baseNameIsUnique ? ` | '${method.name.makeSafeStringTypeLiteral}'` : ''}, {`\n yield IncIndent\n yield `argsObj: ${name}Args['obj']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`\n yield `argsTuple: ${name}Args['tuple']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`\n\n if (method.returns.desc) yield* jsDoc(method.returns.desc)\n yield `returns: ${name}Returns['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`\n\n yield DecIndent\n yield '}>'\n }\n yield DecIndent\n\n const hasLocal =\n (app.state.keys.local && Object.keys(app.state.keys.local).length > 0) ||\n (app.state.maps.local && Object.keys(app.state.maps.local).length > 0)\n const hasGlobal =\n (app.state.keys.global && Object.keys(app.state.keys.global).length > 0) ||\n (app.state.maps.global && Object.keys(app.state.maps.global).length > 0)\n const hasBox =\n (app.state.keys.box && Object.keys(app.state.keys.box).length > 0) || (app.state.maps.box && Object.keys(app.state.maps.box).length > 0)\n yield* appState(ctx, { hasBox, hasGlobal, hasLocal })\n\n yield DecIndentAndCloseBlock\n yield NewLine\n\n yield* inline(`\n /**\n * Defines the possible abi call signatures.\n */\n export type ${name}Signatures = keyof ${name}Types['methods']`)\n\n if (containsNonVoidMethod(app.methods)) {\n yield* inline(`\n /**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\n export type ${name}NonVoidMethodSignatures = keyof ${name}Types['methods'] extends infer T ? T extends keyof ${name}Types['methods'] ? MethodReturn<T> extends void ? never : T : never : never`)\n }\n\n yield `\n /**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\n export type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n >\n /**\n * Maps a method signature from the ${name} smart contract to the method's arguments in either tuple or struct form\n */\n export type MethodArgs<TSignature extends ${name}Signatures> = ${name}Types['methods'][TSignature]['argsObj' | 'argsTuple']\n /**\n * Maps a method signature from the ${name} smart contract to the method's return type\n */\n export type MethodReturn<TSignature extends ${name}Signatures> = ${name}Types['methods'][TSignature]['returns']\n `\n\n if (hasGlobal) {\n yield `\n /**\n * Defines the shape of the keyed global state of the application.\n */\n export type GlobalKeysState = ${name}Types['state']['global']['keys']\n `\n }\n\n if (hasLocal) {\n yield `\n /**\n * Defines the shape of the keyed local state of the application.\n */\n export type LocalKeysState = ${name}Types['state']['local']['keys']\n `\n }\n\n if (hasBox) {\n yield `\n /**\n * Defines the shape of the keyed box state of the application.\n */\n export type BoxKeysState = ${name}Types['state']['box']['keys']\n `\n }\n\n yield NewLine\n}\n\nfunction* structTypes(ctx: GeneratorContext): DocumentParts {\n const { app, sanitizer } = ctx\n if (Object.keys(app.structs).length === 0) return\n\n yield '// Type definitions for ARC-56 structs'\n yield NewLine\n\n for (const [structName, structCtx] of Object.entries(app.structs)) {\n // Emit the struct type\n yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${structCtx.tsObjDef}`\n yield NewLine\n }\n}\n\nfunction* templateVariableTypes(ctx: GeneratorContext): DocumentParts {\n if (Object.keys(ctx.app.templateVariables ?? {}).length === 0) {\n return\n }\n\n yield* jsDoc('Deploy-time template variables')\n yield 'export type TemplateVariables = {'\n yield IncIndent\n\n for (const [name, def] of Object.entries(ctx.app.templateVariables ?? {})) {\n yield `${name}: ${def.type.tsInType},`\n }\n\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n\nfunction* keysAndMaps(\n sanitizer: Sanitizer,\n keys: {\n [name: string]: StorageKeyContext\n },\n maps: {\n [name: string]: StorageMapContext\n },\n): DocumentParts {\n if (keys && Object.keys(keys).length) {\n yield 'keys: {'\n yield IncIndent\n for (const [name, prop] of Object.entries(keys)) {\n if (prop.desc) {\n yield* jsDoc(prop.desc)\n }\n const keySafe = sanitizer.makeSafePropertyIdentifier(name)\n prop.valueType\n yield `${keySafe}: ${prop.valueType.isAvmBytes ? 'BinaryState' : prop.valueType.tsOutType}`\n }\n yield DecIndentAndCloseBlock\n } else {\n yield 'keys: {}'\n }\n\n if (maps && Object.keys(maps).length) {\n yield 'maps: {'\n yield IncIndent\n for (const name of Object.keys(maps)) {\n const prop = maps[name]\n if (prop.desc) {\n yield* jsDoc(prop.desc)\n }\n const keySafe = sanitizer.makeSafePropertyIdentifier(name)\n\n yield `${keySafe}: Map<${prop.keyType.tsInType}, ${prop.valueType.tsOutType}>`\n }\n yield DecIndentAndCloseBlock\n } else {\n yield 'maps: {}'\n }\n}\n\nfunction* appState(\n { app, sanitizer }: GeneratorContext,\n stateFlags: { hasLocal: boolean; hasGlobal: boolean; hasBox: boolean },\n): DocumentParts {\n const { hasBox, hasGlobal, hasLocal } = stateFlags\n\n if (hasLocal || hasGlobal || hasBox) {\n yield* jsDoc('Defines the shape of the state of the application.')\n yield 'state: {'\n yield IncIndent\n if (hasGlobal) {\n yield 'global: {'\n yield IncIndent\n yield* keysAndMaps(sanitizer, app.state.keys.global, app.state.maps.global)\n yield DecIndentAndCloseBlock\n }\n if (hasLocal) {\n yield 'local: {'\n yield IncIndent\n yield* keysAndMaps(sanitizer, app.state.keys.local, app.state.maps.local)\n yield DecIndentAndCloseBlock\n }\n if (hasBox) {\n yield 'box: {'\n yield IncIndent\n yield* keysAndMaps(sanitizer, app.state.keys.box, app.state.maps.box)\n yield DecIndentAndCloseBlock\n }\n yield DecIndentAndCloseBlock\n }\n}\n"],"names":["argTypeIsTransaction","ABITransactionType","jsDoc","IncIndent","DecIndentAndCloseBlock","inline","NewLine","DecIndent","containsNonVoidMethod"],"mappings":"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"}
@@ -1,25 +1,23 @@
1
- import { jsDoc, IncIndent, DecIndentAndCloseBlock, inline, NewLine, DecIndent, indent } from '../output/writer.mjs';
2
- import { getEquivalentType } from './helpers/get-equivalent-type.mjs';
3
- import algosdk, { ABIMethod } from 'algosdk';
1
+ import { jsDoc, IncIndent, DecIndentAndCloseBlock, inline, NewLine, DecIndent } from '../output/writer.mjs';
2
+ import { argTypeIsTransaction, ABITransactionType } from '@algorandfoundation/algokit-utils/abi';
4
3
  import { containsNonVoidMethod } from './helpers/contains-non-void-method.mjs';
5
4
 
6
- function getMethodMetadata(method, ctx) {
7
- const { methodSignatureToUniqueName } = ctx;
8
- const methodSig = new ABIMethod(method).getSignature();
9
- const uniqueName = methodSignatureToUniqueName[methodSig];
5
+ function getMethodMetadata(method) {
6
+ const methodSig = method.signature;
7
+ const uniqueName = method.uniqueName.original;
10
8
  let hasAppCallArgToTheRight = false;
11
9
  const argsMeta = new Array();
12
10
  for (let i = (method.args ?? []).length - 1; i >= 0; i--) {
13
11
  const arg = method.args[i];
14
12
  argsMeta.push({
15
13
  ...arg,
16
- name: arg.name ?? `arg${i + 1}`,
17
- isOptional: !!arg.defaultValue || (hasAppCallArgToTheRight && algosdk.abiTypeIsTransaction(arg.type)),
18
- tsType: getEquivalentType(arg.struct ?? arg.type, 'input', ctx),
14
+ name: arg.name?.original ?? `arg${i + 1}`,
15
+ isOptional: !!arg.defaultValue || (hasAppCallArgToTheRight && argTypeIsTransaction(arg.type)),
16
+ tsType: arg.tsInType,
19
17
  });
20
18
  if (!hasAppCallArgToTheRight &&
21
- algosdk.abiTypeIsTransaction(arg.type) &&
22
- [algosdk.ABITransactionType.appl, algosdk.ABITransactionType.any].includes(arg.type)) {
19
+ argTypeIsTransaction(arg.type) &&
20
+ [ABITransactionType.AppCall, ABITransactionType.Txn].includes(arg.type)) {
23
21
  hasAppCallArgToTheRight = true;
24
22
  }
25
23
  }
@@ -36,8 +34,8 @@ function* appTypes(ctx) {
36
34
  yield* jsDoc('The object representation of the arguments for each method');
37
35
  yield 'obj: {';
38
36
  yield IncIndent;
39
- for (const method of app.methods) {
40
- const { methodSig, argsMeta } = getMethodMetadata(method, ctx);
37
+ for (const method of app.abiMethods) {
38
+ const { methodSig, argsMeta } = getMethodMetadata(method);
41
39
  if (argsMeta.length) {
42
40
  yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': {`;
43
41
  yield IncIndent;
@@ -56,8 +54,8 @@ function* appTypes(ctx) {
56
54
  yield* jsDoc('The tuple representation of the arguments for each method');
57
55
  yield 'tuple: {';
58
56
  yield IncIndent;
59
- for (const method of app.methods) {
60
- const { methodSig, argsMeta } = getMethodMetadata(method, ctx);
57
+ for (const method of app.abiMethods) {
58
+ const { methodSig, argsMeta } = getMethodMetadata(method);
61
59
  yield* inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': [`, argsMeta
62
60
  .map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.isOptional ? ' | undefined' : ''}`)
63
61
  .join(', '), ']');
@@ -68,9 +66,9 @@ function* appTypes(ctx) {
68
66
  yield* jsDoc('The return type for each method');
69
67
  yield `export type ${name}Returns = {`;
70
68
  yield IncIndent;
71
- for (const method of app.methods) {
72
- const { methodSig } = getMethodMetadata(method, ctx);
73
- yield* inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': ${getEquivalentType(method.returns.struct ?? method.returns.type ?? 'void', 'output', ctx)}`);
69
+ for (const method of app.abiMethods) {
70
+ const { methodSig } = getMethodMetadata(method);
71
+ yield* inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': ${method.returns.tsOutType}`);
74
72
  }
75
73
  yield DecIndentAndCloseBlock;
76
74
  yield NewLine;
@@ -78,16 +76,16 @@ function* appTypes(ctx) {
78
76
  yield `export type ${name}Types = {`;
79
77
  yield IncIndent;
80
78
  yield* jsDoc('Maps method signatures / names to their argument and return types.');
81
- if (app.methods.length == 0) {
79
+ if (app.abiMethods.length == 0) {
82
80
  yield 'methods: {}';
83
81
  }
84
82
  else {
85
83
  yield 'methods:';
86
84
  }
87
85
  yield IncIndent;
88
- for (const method of app.methods) {
89
- const { methodSig, uniqueName } = getMethodMetadata(method, ctx);
90
- yield `& Record<'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}'${methodSig !== uniqueName ? ` | '${ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName)}'` : ''}, {`;
86
+ for (const method of app.abiMethods) {
87
+ const { methodSig } = getMethodMetadata(method);
88
+ yield `& Record<'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}'${method.baseNameIsUnique ? ` | '${method.name.makeSafeStringTypeLiteral}'` : ''}, {`;
91
89
  yield IncIndent;
92
90
  yield `argsObj: ${name}Args['obj']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`;
93
91
  yield `argsTuple: ${name}Args['tuple']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`;
@@ -164,41 +162,15 @@ function* appTypes(ctx) {
164
162
  }
165
163
  yield NewLine;
166
164
  }
167
- /* eslint-disable @typescript-eslint/no-explicit-any */
168
- function getStructAsObject(struct, ctx) {
169
- return Object.fromEntries(struct.map((s) => [s.name, typeof s.type === 'string' ? getEquivalentType(s.type, 'output', ctx) : getStructAsObject(s.type, ctx)]));
170
- }
171
- function getStructAsTupleTypes(struct, ctx) {
172
- return `[${struct
173
- .map((s) => {
174
- // Field is an inline nested struct (array of StructField)
175
- if (Array.isArray(s.type)) {
176
- return getStructAsTupleTypes(s.type, ctx);
177
- }
178
- // Field references a named struct defined elsewhere
179
- if (Object.keys(ctx.app.structs).includes(s.type)) {
180
- return getStructAsTupleTypes(ctx.app.structs[s.type], ctx);
181
- }
182
- // Field is a primitive type (string, uint64, etc.)
183
- return getEquivalentType(s.type, 'output', ctx);
184
- })
185
- .join(', ')}]`;
186
- }
187
165
  function* structTypes(ctx) {
188
166
  const { app, sanitizer } = ctx;
189
167
  if (Object.keys(app.structs).length === 0)
190
168
  return;
191
169
  yield '// Type definitions for ARC-56 structs';
192
170
  yield NewLine;
193
- for (const structName of Object.keys(app.structs)) {
171
+ for (const [structName, structCtx] of Object.entries(app.structs)) {
194
172
  // Emit the struct type
195
- yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${JSON.stringify(getStructAsObject(app.structs[structName], ctx), null, 2).replace(/"/g, '')}`;
196
- yield NewLine;
197
- // Emit method that converts ABI tuple to the struct object
198
- yield* jsDoc(`Converts the ABI tuple representation of a ${structName} to the struct representation`);
199
- yield* inline(`export function ${sanitizer.makeSafeTypeIdentifier(structName)}FromTuple(`, `abiTuple: ${getStructAsTupleTypes(app.structs[structName], ctx)}`, `) {`);
200
- yield* indent(`return getABIStructFromABITuple(abiTuple, APP_SPEC.structs${sanitizer.getSafeMemberAccessor(structName)}, APP_SPEC.structs) as ${sanitizer.makeSafeTypeIdentifier(structName)}`);
201
- yield '}';
173
+ yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${structCtx.tsObjDef}`;
202
174
  yield NewLine;
203
175
  }
204
176
  }
@@ -209,23 +181,22 @@ function* templateVariableTypes(ctx) {
209
181
  yield* jsDoc('Deploy-time template variables');
210
182
  yield 'export type TemplateVariables = {';
211
183
  yield IncIndent;
212
- for (const name of Object.keys(ctx.app.templateVariables ?? {})) {
213
- yield `${name}: ${getEquivalentType(ctx.app.templateVariables[name].type, 'output', ctx)},`;
184
+ for (const [name, def] of Object.entries(ctx.app.templateVariables ?? {})) {
185
+ yield `${name}: ${def.type.tsInType},`;
214
186
  }
215
187
  yield DecIndentAndCloseBlock;
216
188
  yield NewLine;
217
189
  }
218
- function* keysAndMaps(app, sanitizer, keys, maps) {
190
+ function* keysAndMaps(sanitizer, keys, maps) {
219
191
  if (keys && Object.keys(keys).length) {
220
192
  yield 'keys: {';
221
193
  yield IncIndent;
222
- for (const name of Object.keys(keys)) {
223
- const prop = keys[name];
194
+ for (const [name, prop] of Object.entries(keys)) {
224
195
  if (prop.desc) {
225
196
  yield* jsDoc(prop.desc);
226
197
  }
227
198
  const keySafe = sanitizer.makeSafePropertyIdentifier(name);
228
- yield `${keySafe}: ${prop.valueType === 'AVMBytes' ? 'BinaryState' : getEquivalentType(prop.valueType, 'output', { app, sanitizer })}`;
199
+ yield `${keySafe}: ${prop.valueType.isAvmBytes ? 'BinaryState' : prop.valueType.tsOutType}`;
229
200
  }
230
201
  yield DecIndentAndCloseBlock;
231
202
  }
@@ -241,7 +212,7 @@ function* keysAndMaps(app, sanitizer, keys, maps) {
241
212
  yield* jsDoc(prop.desc);
242
213
  }
243
214
  const keySafe = sanitizer.makeSafePropertyIdentifier(name);
244
- yield `${keySafe}: Map<${getEquivalentType(prop.keyType, 'input', { app, sanitizer })}, ${getEquivalentType(prop.valueType, 'output', { app, sanitizer })}>`;
215
+ yield `${keySafe}: Map<${prop.keyType.tsInType}, ${prop.valueType.tsOutType}>`;
245
216
  }
246
217
  yield DecIndentAndCloseBlock;
247
218
  }
@@ -258,19 +229,19 @@ function* appState({ app, sanitizer }, stateFlags) {
258
229
  if (hasGlobal) {
259
230
  yield 'global: {';
260
231
  yield IncIndent;
261
- yield* keysAndMaps(app, sanitizer, app.state.keys.global, app.state.maps.global);
232
+ yield* keysAndMaps(sanitizer, app.state.keys.global, app.state.maps.global);
262
233
  yield DecIndentAndCloseBlock;
263
234
  }
264
235
  if (hasLocal) {
265
236
  yield 'local: {';
266
237
  yield IncIndent;
267
- yield* keysAndMaps(app, sanitizer, app.state.keys.local, app.state.maps.local);
238
+ yield* keysAndMaps(sanitizer, app.state.keys.local, app.state.maps.local);
268
239
  yield DecIndentAndCloseBlock;
269
240
  }
270
241
  if (hasBox) {
271
242
  yield 'box: {';
272
243
  yield IncIndent;
273
- yield* keysAndMaps(app, sanitizer, app.state.keys.box, app.state.maps.box);
244
+ yield* keysAndMaps(sanitizer, app.state.keys.box, app.state.maps.box);
274
245
  yield DecIndentAndCloseBlock;
275
246
  }
276
247
  yield DecIndentAndCloseBlock;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-types.mjs","sources":["../../../src/client/app-types.ts"],"sourcesContent":["import { GeneratorContext } from './generator-context'\nimport { DecIndent, DecIndentAndCloseBlock, DocumentParts, IncIndent, inline, jsDoc, NewLine } from '../output/writer'\nimport { argTypeIsTransaction, ABITransactionType } from '@algorandfoundation/algokit-utils/abi'\nimport { Sanitizer } from '../util/sanitization'\nimport { Expand } from '@algorandfoundation/algokit-utils/types/expand'\nimport { containsNonVoidMethod } from './helpers/contains-non-void-method'\nimport { AbiMethodClientContext, StorageKeyContext, StorageMapContext } from './app-client-context'\n\nfunction getMethodMetadata(method: AbiMethodClientContext) {\n const methodSig = method.signature\n const uniqueName = method.uniqueName.original\n\n let hasAppCallArgToTheRight = false\n const argsMeta = new Array<Expand<Omit<(typeof method.args)[0], 'name'> & { name: string; isOptional: boolean; tsType: string }>>()\n\n for (let i = (method.args ?? []).length - 1; i >= 0; i--) {\n const arg = method.args[i]\n\n argsMeta.push({\n ...arg,\n name: arg.name?.original ?? `arg${i + 1}`,\n isOptional: !!arg.defaultValue || (hasAppCallArgToTheRight && argTypeIsTransaction(arg.type)),\n tsType: arg.tsInType,\n })\n\n if (\n !hasAppCallArgToTheRight &&\n argTypeIsTransaction(arg.type) &&\n [ABITransactionType.AppCall, ABITransactionType.Txn].includes(arg.type)\n ) {\n hasAppCallArgToTheRight = true\n }\n }\n argsMeta.reverse()\n\n return { methodSig, uniqueName, argsMeta }\n}\n\nexport function* appTypes(ctx: GeneratorContext): DocumentParts {\n yield* structTypes(ctx)\n yield* templateVariableTypes(ctx)\n\n const { app, name } = ctx\n\n yield* jsDoc(`The argument types for the ${name} contract`)\n yield `export type ${name}Args = {`\n yield IncIndent\n yield* jsDoc('The object representation of the arguments for each method')\n yield 'obj: {'\n yield IncIndent\n for (const method of app.abiMethods) {\n const { methodSig, argsMeta } = getMethodMetadata(method)\n if (argsMeta.length) {\n yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': {`\n yield IncIndent\n for (const arg of argsMeta) {\n if (arg.desc) yield* jsDoc(arg.desc)\n yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.isOptional ? '?' : ''}: ${arg.tsType}`\n }\n yield DecIndentAndCloseBlock\n } else {\n yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': Record<string, never>`\n }\n }\n yield DecIndentAndCloseBlock\n\n yield* jsDoc('The tuple representation of the arguments for each method')\n yield 'tuple: {'\n yield IncIndent\n for (const method of app.abiMethods) {\n const { methodSig, argsMeta } = getMethodMetadata(method)\n yield* inline(\n `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': [`,\n argsMeta\n .map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.isOptional ? ' | undefined' : ''}`)\n .join(', '),\n ']',\n )\n }\n yield DecIndentAndCloseBlock\n\n yield DecIndentAndCloseBlock\n yield NewLine\n\n yield* jsDoc('The return type for each method')\n yield `export type ${name}Returns = {`\n yield IncIndent\n for (const method of app.abiMethods) {\n const { methodSig } = getMethodMetadata(method)\n yield* inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': ${method.returns.tsOutType}`)\n }\n yield DecIndentAndCloseBlock\n yield NewLine\n\n yield* jsDoc(`Defines the types of available calls and state of the ${name} smart contract.`)\n yield `export type ${name}Types = {`\n yield IncIndent\n yield* jsDoc('Maps method signatures / names to their argument and return types.')\n if (app.abiMethods.length == 0) {\n yield 'methods: {}'\n } else {\n yield 'methods:'\n }\n yield IncIndent\n for (const method of app.abiMethods) {\n const { methodSig } = getMethodMetadata(method)\n yield `& Record<'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}'${method.baseNameIsUnique ? ` | '${method.name.makeSafeStringTypeLiteral}'` : ''}, {`\n yield IncIndent\n yield `argsObj: ${name}Args['obj']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`\n yield `argsTuple: ${name}Args['tuple']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`\n\n if (method.returns.desc) yield* jsDoc(method.returns.desc)\n yield `returns: ${name}Returns['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`\n\n yield DecIndent\n yield '}>'\n }\n yield DecIndent\n\n const hasLocal =\n (app.state.keys.local && Object.keys(app.state.keys.local).length > 0) ||\n (app.state.maps.local && Object.keys(app.state.maps.local).length > 0)\n const hasGlobal =\n (app.state.keys.global && Object.keys(app.state.keys.global).length > 0) ||\n (app.state.maps.global && Object.keys(app.state.maps.global).length > 0)\n const hasBox =\n (app.state.keys.box && Object.keys(app.state.keys.box).length > 0) || (app.state.maps.box && Object.keys(app.state.maps.box).length > 0)\n yield* appState(ctx, { hasBox, hasGlobal, hasLocal })\n\n yield DecIndentAndCloseBlock\n yield NewLine\n\n yield* inline(`\n /**\n * Defines the possible abi call signatures.\n */\n export type ${name}Signatures = keyof ${name}Types['methods']`)\n\n if (containsNonVoidMethod(app.methods)) {\n yield* inline(`\n /**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\n export type ${name}NonVoidMethodSignatures = keyof ${name}Types['methods'] extends infer T ? T extends keyof ${name}Types['methods'] ? MethodReturn<T> extends void ? never : T : never : never`)\n }\n\n yield `\n /**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\n export type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n >\n /**\n * Maps a method signature from the ${name} smart contract to the method's arguments in either tuple or struct form\n */\n export type MethodArgs<TSignature extends ${name}Signatures> = ${name}Types['methods'][TSignature]['argsObj' | 'argsTuple']\n /**\n * Maps a method signature from the ${name} smart contract to the method's return type\n */\n export type MethodReturn<TSignature extends ${name}Signatures> = ${name}Types['methods'][TSignature]['returns']\n `\n\n if (hasGlobal) {\n yield `\n /**\n * Defines the shape of the keyed global state of the application.\n */\n export type GlobalKeysState = ${name}Types['state']['global']['keys']\n `\n }\n\n if (hasLocal) {\n yield `\n /**\n * Defines the shape of the keyed local state of the application.\n */\n export type LocalKeysState = ${name}Types['state']['local']['keys']\n `\n }\n\n if (hasBox) {\n yield `\n /**\n * Defines the shape of the keyed box state of the application.\n */\n export type BoxKeysState = ${name}Types['state']['box']['keys']\n `\n }\n\n yield NewLine\n}\n\nfunction* structTypes(ctx: GeneratorContext): DocumentParts {\n const { app, sanitizer } = ctx\n if (Object.keys(app.structs).length === 0) return\n\n yield '// Type definitions for ARC-56 structs'\n yield NewLine\n\n for (const [structName, structCtx] of Object.entries(app.structs)) {\n // Emit the struct type\n yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${structCtx.tsObjDef}`\n yield NewLine\n }\n}\n\nfunction* templateVariableTypes(ctx: GeneratorContext): DocumentParts {\n if (Object.keys(ctx.app.templateVariables ?? {}).length === 0) {\n return\n }\n\n yield* jsDoc('Deploy-time template variables')\n yield 'export type TemplateVariables = {'\n yield IncIndent\n\n for (const [name, def] of Object.entries(ctx.app.templateVariables ?? {})) {\n yield `${name}: ${def.type.tsInType},`\n }\n\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n\nfunction* keysAndMaps(\n sanitizer: Sanitizer,\n keys: {\n [name: string]: StorageKeyContext\n },\n maps: {\n [name: string]: StorageMapContext\n },\n): DocumentParts {\n if (keys && Object.keys(keys).length) {\n yield 'keys: {'\n yield IncIndent\n for (const [name, prop] of Object.entries(keys)) {\n if (prop.desc) {\n yield* jsDoc(prop.desc)\n }\n const keySafe = sanitizer.makeSafePropertyIdentifier(name)\n prop.valueType\n yield `${keySafe}: ${prop.valueType.isAvmBytes ? 'BinaryState' : prop.valueType.tsOutType}`\n }\n yield DecIndentAndCloseBlock\n } else {\n yield 'keys: {}'\n }\n\n if (maps && Object.keys(maps).length) {\n yield 'maps: {'\n yield IncIndent\n for (const name of Object.keys(maps)) {\n const prop = maps[name]\n if (prop.desc) {\n yield* jsDoc(prop.desc)\n }\n const keySafe = sanitizer.makeSafePropertyIdentifier(name)\n\n yield `${keySafe}: Map<${prop.keyType.tsInType}, ${prop.valueType.tsOutType}>`\n }\n yield DecIndentAndCloseBlock\n } else {\n yield 'maps: {}'\n }\n}\n\nfunction* appState(\n { app, sanitizer }: GeneratorContext,\n stateFlags: { hasLocal: boolean; hasGlobal: boolean; hasBox: boolean },\n): DocumentParts {\n const { hasBox, hasGlobal, hasLocal } = stateFlags\n\n if (hasLocal || hasGlobal || hasBox) {\n yield* jsDoc('Defines the shape of the state of the application.')\n yield 'state: {'\n yield IncIndent\n if (hasGlobal) {\n yield 'global: {'\n yield IncIndent\n yield* keysAndMaps(sanitizer, app.state.keys.global, app.state.maps.global)\n yield DecIndentAndCloseBlock\n }\n if (hasLocal) {\n yield 'local: {'\n yield IncIndent\n yield* keysAndMaps(sanitizer, app.state.keys.local, app.state.maps.local)\n yield DecIndentAndCloseBlock\n }\n if (hasBox) {\n yield 'box: {'\n yield IncIndent\n yield* keysAndMaps(sanitizer, app.state.keys.box, app.state.maps.box)\n yield DecIndentAndCloseBlock\n }\n yield DecIndentAndCloseBlock\n }\n}\n"],"names":[],"mappings":"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"}