@algorandfoundation/algokit-client-generator 3.0.6 → 4.0.0-beta.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 (90) hide show
  1. package/README.md +4 -2
  2. package/cli.js +1 -1
  3. package/cli.js.map +1 -1
  4. package/cli.mjs +1 -1
  5. package/cli.mjs.map +1 -1
  6. package/client/{call-factory.d.ts → app-client.d.ts} +1 -1
  7. package/client/app-client.js +288 -0
  8. package/client/app-client.js.map +1 -0
  9. package/client/app-client.mjs +286 -0
  10. package/client/app-client.mjs.map +1 -0
  11. package/client/{call-client.d.ts → app-factory.d.ts} +1 -1
  12. package/client/app-factory.js +238 -0
  13. package/client/app-factory.js.map +1 -0
  14. package/client/app-factory.mjs +236 -0
  15. package/client/app-factory.mjs.map +1 -0
  16. package/client/app-types.js +196 -98
  17. package/client/app-types.js.map +1 -1
  18. package/client/app-types.mjs +196 -79
  19. package/client/app-types.mjs.map +1 -1
  20. package/client/call-composer-types.js +23 -53
  21. package/client/call-composer-types.js.map +1 -1
  22. package/client/call-composer-types.mjs +23 -34
  23. package/client/call-composer-types.mjs.map +1 -1
  24. package/client/call-composer.js +43 -57
  25. package/client/call-composer.js.map +1 -1
  26. package/client/call-composer.mjs +45 -40
  27. package/client/call-composer.mjs.map +1 -1
  28. package/client/deploy-types.d.ts +8 -4
  29. package/client/deploy-types.js +52 -34
  30. package/client/deploy-types.js.map +1 -1
  31. package/client/deploy-types.mjs +53 -36
  32. package/client/deploy-types.mjs.map +1 -1
  33. package/client/generate.d.ts +2 -2
  34. package/client/generate.js +18 -6
  35. package/client/generate.js.map +1 -1
  36. package/client/generate.mjs +18 -6
  37. package/client/generate.mjs.map +1 -1
  38. package/client/generator-context.d.ts +4 -4
  39. package/client/generator-context.js +5 -24
  40. package/client/generator-context.js.map +1 -1
  41. package/client/generator-context.mjs +5 -5
  42. package/client/generator-context.mjs.map +1 -1
  43. package/client/helpers/get-call-config-summary.d.ts +8 -3
  44. package/client/helpers/get-call-config-summary.js +22 -20
  45. package/client/helpers/get-call-config-summary.js.map +1 -1
  46. package/client/helpers/get-call-config-summary.mjs +22 -20
  47. package/client/helpers/get-call-config-summary.mjs.map +1 -1
  48. package/client/helpers/get-equivalent-type.d.ts +6 -1
  49. package/client/helpers/get-equivalent-type.js +10 -6
  50. package/client/helpers/get-equivalent-type.js.map +1 -1
  51. package/client/helpers/get-equivalent-type.mjs +10 -6
  52. package/client/helpers/get-equivalent-type.mjs.map +1 -1
  53. package/client/imports.js +18 -24
  54. package/client/imports.js.map +1 -1
  55. package/client/imports.mjs +18 -24
  56. package/client/imports.mjs.map +1 -1
  57. package/client/params-factory.d.ts +3 -0
  58. package/client/params-factory.js +126 -0
  59. package/client/params-factory.js.map +1 -0
  60. package/client/params-factory.mjs +124 -0
  61. package/client/params-factory.mjs.map +1 -0
  62. package/client/utility-types.d.ts +0 -7
  63. package/client/utility-types.js +37 -50
  64. package/client/utility-types.js.map +1 -1
  65. package/client/utility-types.mjs +38 -50
  66. package/client/utility-types.mjs.map +1 -1
  67. package/output/writer.js +17 -3
  68. package/output/writer.js.map +1 -1
  69. package/output/writer.mjs +17 -3
  70. package/output/writer.mjs.map +1 -1
  71. package/package.json +4 -3
  72. package/schema/application.schema.json.js +2 -2
  73. package/schema/application.schema.json.mjs +2 -2
  74. package/schema/arc56.schema.json.js +787 -0
  75. package/schema/arc56.schema.json.js.map +1 -0
  76. package/schema/arc56.schema.json.mjs +780 -0
  77. package/schema/arc56.schema.json.mjs.map +1 -0
  78. package/schema/load.d.ts +3 -3
  79. package/schema/load.js +21 -7
  80. package/schema/load.js.map +1 -1
  81. package/schema/load.mjs +22 -8
  82. package/schema/load.mjs.map +1 -1
  83. package/client/call-client.js +0 -341
  84. package/client/call-client.js.map +0 -1
  85. package/client/call-client.mjs +0 -320
  86. package/client/call-client.mjs.map +0 -1
  87. package/client/call-factory.js +0 -142
  88. package/client/call-factory.js.map +0 -1
  89. package/client/call-factory.mjs +0 -121
  90. package/client/call-factory.mjs.map +0 -1
@@ -1 +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 * as algokit from '@algorandfoundation/algokit-utils'\nimport { getEquivalentType } from './helpers/get-equivalent-type'\n\nexport function* appTypes(ctx: GeneratorContext): DocumentParts {\n const { app, methodSignatureToUniqueName, name } = ctx\n yield* jsDoc(`Defines the types of available calls and state of the ${name} smart contract.`)\n yield `export type ${name} = {`\n yield IncIndent\n yield* jsDoc('Maps method signatures / names to their argument and return types.')\n if (app.contract.methods.length == 0) {\n yield 'methods: {}'\n } else {\n yield 'methods:'\n }\n yield IncIndent\n for (const method of app.contract.methods) {\n const methodSig = algokit.getABIMethodSignature(method)\n const methodSigSafe = ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)\n const uniqueName = methodSignatureToUniqueName[methodSig]\n const uniqueNameSafe = ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName)\n yield `& Record<'${methodSigSafe}'${methodSig !== uniqueName ? ` | '${uniqueNameSafe}'` : ''}, {`\n yield IncIndent\n yield `argsObj: {`\n yield IncIndent\n\n const argsMeta = method.args.map((arg) => ({\n ...arg,\n hasDefault: app.hints?.[methodSig]?.default_arguments?.[arg.name],\n tsType: getEquivalentType(arg.type, 'input'),\n }))\n\n for (const arg of argsMeta) {\n if (arg.desc) yield* jsDoc(arg.desc)\n yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.hasDefault ? '?' : ''}: ${arg.tsType}`\n }\n yield DecIndentAndCloseBlock\n yield* inline(\n `argsTuple: [`,\n argsMeta\n .map(\n (arg) =>\n `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${getEquivalentType(arg.type, 'input')}${arg.hasDefault ? ' | undefined' : ''}`,\n )\n .join(', '),\n ']',\n )\n const outputStruct = ctx.app.hints?.[methodSig]?.structs?.output\n if (method.returns.desc) yield* jsDoc(method.returns.desc)\n if (outputStruct) {\n yield `returns: ${ctx.sanitizer.makeSafeTypeIdentifier(outputStruct.name)}`\n } else {\n yield `returns: ${getEquivalentType(method.returns.type ?? 'void', 'output')}`\n }\n\n yield DecIndent\n yield '}>'\n }\n yield DecIndent\n yield* appState(ctx)\n yield DecIndentAndCloseBlock\n\n yield* jsDoc('Defines the possible abi call signatures')\n yield `export type ${name}Sig = keyof ${name}['methods']`\n yield* jsDoc(\n 'Defines an object containing all relevant parameters for a single call to the contract. Where TSignature is undefined, a' +\n ' bare call is made',\n )\n yield `export type TypedCallParams<TSignature extends ${name}Sig | undefined> = {`\n yield IncIndent\n yield 'method: TSignature'\n yield 'methodArgs: TSignature extends undefined ? undefined : Array<ABIAppCallArg | undefined>'\n yield DecIndent\n yield '} & AppClientCallCoreParams & CoreAppCallArgs'\n yield* jsDoc('Defines the arguments required for a bare call')\n yield `export type BareCallArgs = Omit<RawAppCallArgs, keyof CoreAppCallArgs>`\n\n yield* structs(ctx)\n yield* jsDoc(`Maps a method signature from the ${name} smart contract to the method's arguments in either tuple of struct form`)\n yield `export type MethodArgs<TSignature extends ${name}Sig> = ${name}['methods'][TSignature]['argsObj' | 'argsTuple']`\n yield* jsDoc(`Maps a method signature from the ${name} smart contract to the method's return type`)\n yield `export type MethodReturn<TSignature extends ${name}Sig> = ${name}['methods'][TSignature]['returns']`\n yield NewLine\n}\n\nfunction* structs({ app, sanitizer }: GeneratorContext): DocumentParts {\n if (app.hints === undefined) return\n const definedStructs = new Set()\n\n for (const methodHint of Object.values(app.hints)) {\n if (methodHint.structs === undefined) continue\n for (const struct of Object.values(methodHint.structs)) {\n if (definedStructs.has(struct.name)) continue\n definedStructs.add(struct.name)\n\n yield* jsDoc(`Represents a ${struct.name} result as a struct`)\n yield `export type ${sanitizer.makeSafeTypeIdentifier(struct.name)} = {`\n yield IncIndent\n for (const [key, type] of struct.elements) {\n yield `${sanitizer.makeSafePropertyIdentifier(key)}: ${getEquivalentType(type, 'output')}`\n }\n yield DecIndentAndCloseBlock\n yield* jsDoc(`Converts the tuple representation of a ${struct.name} to the struct representation`)\n yield* inline(\n `export function ${sanitizer.makeSafeTypeIdentifier(struct.name)}(`,\n `[${struct.elements.map(([key]) => sanitizer.makeSafeVariableIdentifier(key)).join(', ')}]: `,\n `[${struct.elements.map(([_, type]) => getEquivalentType(type, 'output')).join(', ')}] ) {`,\n )\n yield IncIndent\n yield `return {`\n yield IncIndent\n for (const [key] of struct.elements) {\n const prop = sanitizer.makeSafePropertyIdentifier(key)\n const param = sanitizer.makeSafeVariableIdentifier(key)\n yield `${prop}${prop !== param ? `: ${param}` : ''},`\n }\n yield DecIndentAndCloseBlock\n yield DecIndentAndCloseBlock\n }\n }\n}\n\nfunction* appState({ app, sanitizer }: GeneratorContext): DocumentParts {\n const hasLocal = app.schema.local?.declared && Object.keys(app.schema.local.declared).length\n const hasGlobal = app.schema.global?.declared && Object.keys(app.schema.global.declared).length\n if (hasLocal || hasGlobal) {\n yield* jsDoc('Defines the shape of the global and local state of the application.')\n yield 'state: {'\n yield IncIndent\n if (hasGlobal) {\n yield 'global: {'\n yield IncIndent\n for (const prop of Object.values(app.schema.global!.declared!)) {\n if (prop.descr) {\n yield* jsDoc(prop.descr)\n }\n const keySafe = sanitizer.makeSafePropertyIdentifier(prop.key)\n\n yield `${keySafe}?: ${prop.type === 'uint64' ? 'IntegerState' : 'BinaryState'}`\n }\n yield DecIndentAndCloseBlock\n }\n if (hasLocal) {\n yield 'local: {'\n yield IncIndent\n for (const prop of Object.values(app.schema.local!.declared!)) {\n if (prop.descr) {\n yield* jsDoc(prop.descr)\n }\n const keySafe = sanitizer.makeSafePropertyIdentifier(prop.key)\n\n yield `${keySafe}?: ${prop.type === 'uint64' ? 'IntegerState' : 'BinaryState'}`\n }\n yield DecIndentAndCloseBlock\n }\n\n yield DecIndentAndCloseBlock\n }\n}\n"],"names":["jsDoc","IncIndent","algokit","getEquivalentType","DecIndentAndCloseBlock","inline","DecIndent","NewLine"],"mappings":"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"}
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 { getEquivalentType } from './helpers/get-equivalent-type'\nimport { ABIMethod, ABITupleType } from 'algosdk'\nimport { Arc56Contract, StorageKey, StorageMap, StructFields } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport { Sanitizer } from '../util/sanitization'\n\nexport function* appTypes(ctx: GeneratorContext): DocumentParts {\n yield* abiTypes(ctx)\n yield* structTypes(ctx)\n yield* templateVariableTypes(ctx)\n\n const { app, methodSignatureToUniqueName, name } = ctx\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.methods.length == 0) {\n yield 'methods: {}'\n } else {\n yield 'methods:'\n }\n yield IncIndent\n for (const method of app.methods) {\n const methodSig = new ABIMethod(method).getSignature()\n const methodSigSafe = ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)\n const uniqueName = methodSignatureToUniqueName[methodSig]\n const uniqueNameSafe = ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName)\n yield `& Record<'${methodSigSafe}'${methodSig !== uniqueName ? ` | '${uniqueNameSafe}'` : ''}, {`\n yield IncIndent\n yield `argsObj: {`\n yield IncIndent\n\n const argsMeta = method.args.map((arg, i) => ({\n ...arg,\n name: arg.name ?? `arg${i + 1}`,\n hasDefault: !!arg.defaultValue,\n tsType: getEquivalentType(arg.struct ?? arg.type, 'input', ctx),\n }))\n\n for (const arg of argsMeta) {\n if (arg.desc) yield* jsDoc(arg.desc)\n yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.hasDefault ? '?' : ''}: ${arg.tsType}`\n }\n yield DecIndentAndCloseBlock\n yield* inline(\n `argsTuple: [`,\n argsMeta\n .map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.hasDefault ? ' | undefined' : ''}`)\n .join(', '),\n ']',\n )\n if (method.returns.desc) yield* jsDoc(method.returns.desc)\n yield `returns: ${getEquivalentType(method.returns.struct ?? method.returns.type ?? 'void', 'output', ctx)}`\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 `\n /**\n * Defines the possible abi call signatures.\n */\n export type ${name}Signatures = keyof ${name}Types['methods']\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 * Defines an object containing all relevant parameters for a single call to the contract.\n */\n export type CallParams<TSignature extends ${name}Signatures> = 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<MethodArgs<TSignature>>\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* abiTypes(ctx: GeneratorContext): DocumentParts {\n const { app } = ctx\n const abiTypes: string[] = []\n\n const pushType = (type: string) => {\n // If we already have this type, skip\n if (abiTypes.includes(type)) return\n\n // void and string are the same types in TS\n if (['void', 'string'].includes(type)) return\n\n // Skip structs\n if (app.structs[type]) return\n\n // If this is an array type, push the base type\n if (type.match(/\\[\\d*\\]$/)) {\n pushType(type.replace(/\\[\\d*\\]$/, ''))\n return\n }\n\n if (type.startsWith('(')) {\n const tupleType = ABITupleType.from(type) as ABITupleType\n\n tupleType.childTypes.forEach((t) => {\n pushType(t.toString())\n })\n\n return\n }\n\n abiTypes.push(type)\n }\n\n Object.values(app.templateVariables ?? {}).forEach((t) => {\n pushType(t.type)\n })\n\n app.methods.forEach((m) => {\n m.args.forEach((a) => {\n pushType(a.type)\n })\n\n pushType(m.returns.type)\n })\n ;(['global', 'local', 'box'] as ['global', 'local', 'box']).forEach((storageType) => {\n Object.values(app.state.keys[storageType]).forEach((k) => {\n pushType(k.keyType)\n pushType(k.valueType)\n })\n\n Object.values(app.state.maps[storageType]).forEach((m) => {\n pushType(m.keyType)\n pushType(m.valueType)\n })\n })\n\n const pushStructFields = (fields: StructFields) => {\n Object.values(fields).forEach((sf) => {\n if (typeof sf === 'string') pushType(sf)\n else pushStructFields(sf)\n })\n }\n\n Object.values(app.structs).forEach((sf) => {\n pushStructFields(sf)\n })\n\n yield '// Aliases for non-encoded ABI values'\n yield NewLine\n for (const t of abiTypes) {\n yield `type ${t} = ${getEquivalentType(t, 'output', ctx)};`\n }\n yield NewLine\n}\n\nfunction* structTypes({ app, sanitizer }: GeneratorContext): DocumentParts {\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 of Object.keys(app.structs)) {\n yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${JSON.stringify(app.structs[structName], null, 2)\n .replace(/\"/g, '')\n .replaceAll('(', '[')\n .replaceAll(')', ']')\n .replace(/\\[\\d+\\]/g, '[]')}`\n }\n\n yield NewLine\n}\n\nfunction* templateVariableTypes({ app }: GeneratorContext): DocumentParts {\n if (Object.keys(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 of Object.keys(app.templateVariables ?? {})) {\n yield `${name}: ${app.templateVariables![name].type},`\n }\n\n yield DecIndentAndCloseBlock\n}\n\nfunction* keysAndMaps(\n app: Arc56Contract,\n sanitizer: Sanitizer,\n keys: {\n [name: string]: StorageKey\n },\n maps: {\n [name: string]: StorageMap\n },\n): DocumentParts {\n if (keys && Object.keys(keys).length) {\n yield 'keys: {'\n yield IncIndent\n for (const name of Object.keys(keys)) {\n const prop = keys[name]\n if (prop.desc) {\n yield* jsDoc(prop.desc)\n }\n const keySafe = sanitizer.makeSafePropertyIdentifier(name)\n\n yield `${keySafe}: ${prop.valueType === 'bytes' ? 'BinaryState' : getEquivalentType(prop.valueType, 'output', { app, sanitizer })}`\n }\n yield DecIndentAndCloseBlock\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<${getEquivalentType(prop.keyType, 'input', { app, sanitizer })}, ${getEquivalentType(prop.valueType, 'output', { app, sanitizer })}>`\n }\n yield DecIndentAndCloseBlock\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) {\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(app, 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(app, 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(app, sanitizer, app.state.keys.box, app.state.maps.box)\n yield DecIndentAndCloseBlock\n }\n yield DecIndentAndCloseBlock\n }\n}\n"],"names":["jsDoc","IncIndent","ABIMethod","getEquivalentType","DecIndentAndCloseBlock","inline","DecIndent","NewLine","ABITupleType"],"mappings":"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"}
@@ -1,22 +1,25 @@
1
1
  import { jsDoc, IncIndent, DecIndentAndCloseBlock, inline, DecIndent, NewLine } from '../output/writer.mjs';
2
- import * as algokit from '@algorandfoundation/algokit-utils';
3
2
  import { getEquivalentType } from './helpers/get-equivalent-type.mjs';
3
+ import { ABIMethod, ABITupleType } from 'algosdk';
4
4
 
5
5
  function* appTypes(ctx) {
6
+ yield* abiTypes(ctx);
7
+ yield* structTypes(ctx);
8
+ yield* templateVariableTypes(ctx);
6
9
  const { app, methodSignatureToUniqueName, name } = ctx;
7
10
  yield* jsDoc(`Defines the types of available calls and state of the ${name} smart contract.`);
8
- yield `export type ${name} = {`;
11
+ yield `export type ${name}Types = {`;
9
12
  yield IncIndent;
10
13
  yield* jsDoc('Maps method signatures / names to their argument and return types.');
11
- if (app.contract.methods.length == 0) {
14
+ if (app.methods.length == 0) {
12
15
  yield 'methods: {}';
13
16
  }
14
17
  else {
15
18
  yield 'methods:';
16
19
  }
17
20
  yield IncIndent;
18
- for (const method of app.contract.methods) {
19
- const methodSig = algokit.getABIMethodSignature(method);
21
+ for (const method of app.methods) {
22
+ const methodSig = new ABIMethod(method).getSignature();
20
23
  const methodSigSafe = ctx.sanitizer.makeSafeStringTypeLiteral(methodSig);
21
24
  const uniqueName = methodSignatureToUniqueName[methodSig];
22
25
  const uniqueNameSafe = ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName);
@@ -24,10 +27,11 @@ function* appTypes(ctx) {
24
27
  yield IncIndent;
25
28
  yield `argsObj: {`;
26
29
  yield IncIndent;
27
- const argsMeta = method.args.map((arg) => ({
30
+ const argsMeta = method.args.map((arg, i) => ({
28
31
  ...arg,
29
- hasDefault: app.hints?.[methodSig]?.default_arguments?.[arg.name],
30
- tsType: getEquivalentType(arg.type, 'input'),
32
+ name: arg.name ?? `arg${i + 1}`,
33
+ hasDefault: !!arg.defaultValue,
34
+ tsType: getEquivalentType(arg.struct ?? arg.type, 'input', ctx),
31
35
  }));
32
36
  for (const arg of argsMeta) {
33
37
  if (arg.desc)
@@ -36,104 +40,217 @@ function* appTypes(ctx) {
36
40
  }
37
41
  yield DecIndentAndCloseBlock;
38
42
  yield* inline(`argsTuple: [`, argsMeta
39
- .map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${getEquivalentType(arg.type, 'input')}${arg.hasDefault ? ' | undefined' : ''}`)
43
+ .map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.hasDefault ? ' | undefined' : ''}`)
40
44
  .join(', '), ']');
41
- const outputStruct = ctx.app.hints?.[methodSig]?.structs?.output;
42
45
  if (method.returns.desc)
43
46
  yield* jsDoc(method.returns.desc);
44
- if (outputStruct) {
45
- yield `returns: ${ctx.sanitizer.makeSafeTypeIdentifier(outputStruct.name)}`;
46
- }
47
- else {
48
- yield `returns: ${getEquivalentType(method.returns.type ?? 'void', 'output')}`;
49
- }
47
+ yield `returns: ${getEquivalentType(method.returns.struct ?? method.returns.type ?? 'void', 'output', ctx)}`;
50
48
  yield DecIndent;
51
49
  yield '}>';
52
50
  }
53
51
  yield DecIndent;
54
- yield* appState(ctx);
52
+ const hasLocal = (app.state.keys.local && Object.keys(app.state.keys.local).length > 0) ||
53
+ (app.state.maps.local && Object.keys(app.state.maps.local).length > 0);
54
+ const hasGlobal = (app.state.keys.global && Object.keys(app.state.keys.global).length > 0) ||
55
+ (app.state.maps.global && Object.keys(app.state.maps.global).length > 0);
56
+ const hasBox = (app.state.keys.box && Object.keys(app.state.keys.box).length > 0) || (app.state.maps.box && Object.keys(app.state.maps.box).length > 0);
57
+ yield* appState(ctx, { hasBox, hasGlobal, hasLocal });
55
58
  yield DecIndentAndCloseBlock;
56
- yield* jsDoc('Defines the possible abi call signatures');
57
- yield `export type ${name}Sig = keyof ${name}['methods']`;
58
- yield* jsDoc('Defines an object containing all relevant parameters for a single call to the contract. Where TSignature is undefined, a' +
59
- ' bare call is made');
60
- yield `export type TypedCallParams<TSignature extends ${name}Sig | undefined> = {`;
61
- yield IncIndent;
62
- yield 'method: TSignature';
63
- yield 'methodArgs: TSignature extends undefined ? undefined : Array<ABIAppCallArg | undefined>';
64
- yield DecIndent;
65
- yield '} & AppClientCallCoreParams & CoreAppCallArgs';
66
- yield* jsDoc('Defines the arguments required for a bare call');
67
- yield `export type BareCallArgs = Omit<RawAppCallArgs, keyof CoreAppCallArgs>`;
68
- yield* structs(ctx);
69
- yield* jsDoc(`Maps a method signature from the ${name} smart contract to the method's arguments in either tuple of struct form`);
70
- yield `export type MethodArgs<TSignature extends ${name}Sig> = ${name}['methods'][TSignature]['argsObj' | 'argsTuple']`;
71
- yield* jsDoc(`Maps a method signature from the ${name} smart contract to the method's return type`);
72
- yield `export type MethodReturn<TSignature extends ${name}Sig> = ${name}['methods'][TSignature]['returns']`;
59
+ yield NewLine;
60
+ yield `
61
+ /**
62
+ * Defines the possible abi call signatures.
63
+ */
64
+ export type ${name}Signatures = keyof ${name}Types['methods']
65
+ /**
66
+ * Defines the possible abi call signatures for methods that return a non-void value.
67
+ */
68
+ 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
69
+ /**
70
+ * Defines an object containing all relevant parameters for a single call to the contract.
71
+ */
72
+ export type CallParams<TSignature extends ${name}Signatures> = Expand<
73
+ Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &
74
+ {
75
+ /** The args for the ABI method call, either as an ordered array or an object */
76
+ args: Expand<MethodArgs<TSignature>>
77
+ }
78
+ >
79
+ /**
80
+ * Maps a method signature from the ${name} smart contract to the method's arguments in either tuple or struct form
81
+ */
82
+ export type MethodArgs<TSignature extends ${name}Signatures> = ${name}Types['methods'][TSignature]['argsObj' | 'argsTuple']
83
+ /**
84
+ * Maps a method signature from the ${name} smart contract to the method's return type
85
+ */
86
+ export type MethodReturn<TSignature extends ${name}Signatures> = ${name}Types['methods'][TSignature]['returns']
87
+ `;
88
+ if (hasGlobal) {
89
+ yield `
90
+ /**
91
+ * Defines the shape of the keyed global state of the application.
92
+ */
93
+ export type GlobalKeysState = ${name}Types['state']['global']['keys']
94
+ `;
95
+ }
96
+ if (hasLocal) {
97
+ yield `
98
+ /**
99
+ * Defines the shape of the keyed local state of the application.
100
+ */
101
+ export type LocalKeysState = ${name}Types['state']['local']['keys']
102
+ `;
103
+ }
104
+ if (hasBox) {
105
+ yield `
106
+ /**
107
+ * Defines the shape of the keyed box state of the application.
108
+ */
109
+ export type BoxKeysState = ${name}Types['state']['box']['keys']
110
+ `;
111
+ }
73
112
  yield NewLine;
74
113
  }
75
- function* structs({ app, sanitizer }) {
76
- if (app.hints === undefined)
114
+ function* abiTypes(ctx) {
115
+ const { app } = ctx;
116
+ const abiTypes = [];
117
+ const pushType = (type) => {
118
+ // If we already have this type, skip
119
+ if (abiTypes.includes(type))
120
+ return;
121
+ // void and string are the same types in TS
122
+ if (['void', 'string'].includes(type))
123
+ return;
124
+ // Skip structs
125
+ if (app.structs[type])
126
+ return;
127
+ // If this is an array type, push the base type
128
+ if (type.match(/\[\d*\]$/)) {
129
+ pushType(type.replace(/\[\d*\]$/, ''));
130
+ return;
131
+ }
132
+ if (type.startsWith('(')) {
133
+ const tupleType = ABITupleType.from(type);
134
+ tupleType.childTypes.forEach((t) => {
135
+ pushType(t.toString());
136
+ });
137
+ return;
138
+ }
139
+ abiTypes.push(type);
140
+ };
141
+ Object.values(app.templateVariables ?? {}).forEach((t) => {
142
+ pushType(t.type);
143
+ });
144
+ app.methods.forEach((m) => {
145
+ m.args.forEach((a) => {
146
+ pushType(a.type);
147
+ });
148
+ pushType(m.returns.type);
149
+ });
150
+ ['global', 'local', 'box'].forEach((storageType) => {
151
+ Object.values(app.state.keys[storageType]).forEach((k) => {
152
+ pushType(k.keyType);
153
+ pushType(k.valueType);
154
+ });
155
+ Object.values(app.state.maps[storageType]).forEach((m) => {
156
+ pushType(m.keyType);
157
+ pushType(m.valueType);
158
+ });
159
+ });
160
+ const pushStructFields = (fields) => {
161
+ Object.values(fields).forEach((sf) => {
162
+ if (typeof sf === 'string')
163
+ pushType(sf);
164
+ else
165
+ pushStructFields(sf);
166
+ });
167
+ };
168
+ Object.values(app.structs).forEach((sf) => {
169
+ pushStructFields(sf);
170
+ });
171
+ yield '// Aliases for non-encoded ABI values';
172
+ yield NewLine;
173
+ for (const t of abiTypes) {
174
+ yield `type ${t} = ${getEquivalentType(t, 'output', ctx)};`;
175
+ }
176
+ yield NewLine;
177
+ }
178
+ function* structTypes({ app, sanitizer }) {
179
+ if (Object.keys(app.structs).length === 0)
77
180
  return;
78
- const definedStructs = new Set();
79
- for (const methodHint of Object.values(app.hints)) {
80
- if (methodHint.structs === undefined)
81
- continue;
82
- for (const struct of Object.values(methodHint.structs)) {
83
- if (definedStructs.has(struct.name))
84
- continue;
85
- definedStructs.add(struct.name);
86
- yield* jsDoc(`Represents a ${struct.name} result as a struct`);
87
- yield `export type ${sanitizer.makeSafeTypeIdentifier(struct.name)} = {`;
88
- yield IncIndent;
89
- for (const [key, type] of struct.elements) {
90
- yield `${sanitizer.makeSafePropertyIdentifier(key)}: ${getEquivalentType(type, 'output')}`;
181
+ yield '// Type definitions for ARC-56 structs';
182
+ yield NewLine;
183
+ for (const structName of Object.keys(app.structs)) {
184
+ yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${JSON.stringify(app.structs[structName], null, 2)
185
+ .replace(/"/g, '')
186
+ .replaceAll('(', '[')
187
+ .replaceAll(')', ']')
188
+ .replace(/\[\d+\]/g, '[]')}`;
189
+ }
190
+ yield NewLine;
191
+ }
192
+ function* templateVariableTypes({ app }) {
193
+ if (Object.keys(app.templateVariables ?? {}).length === 0) {
194
+ return;
195
+ }
196
+ yield* jsDoc('Deploy-time template variables');
197
+ yield 'export type TemplateVariables = {';
198
+ yield IncIndent;
199
+ for (const name of Object.keys(app.templateVariables ?? {})) {
200
+ yield `${name}: ${app.templateVariables[name].type},`;
201
+ }
202
+ yield DecIndentAndCloseBlock;
203
+ }
204
+ function* keysAndMaps(app, sanitizer, keys, maps) {
205
+ if (keys && Object.keys(keys).length) {
206
+ yield 'keys: {';
207
+ yield IncIndent;
208
+ for (const name of Object.keys(keys)) {
209
+ const prop = keys[name];
210
+ if (prop.desc) {
211
+ yield* jsDoc(prop.desc);
91
212
  }
92
- yield DecIndentAndCloseBlock;
93
- yield* jsDoc(`Converts the tuple representation of a ${struct.name} to the struct representation`);
94
- yield* inline(`export function ${sanitizer.makeSafeTypeIdentifier(struct.name)}(`, `[${struct.elements.map(([key]) => sanitizer.makeSafeVariableIdentifier(key)).join(', ')}]: `, `[${struct.elements.map(([_, type]) => getEquivalentType(type, 'output')).join(', ')}] ) {`);
95
- yield IncIndent;
96
- yield `return {`;
97
- yield IncIndent;
98
- for (const [key] of struct.elements) {
99
- const prop = sanitizer.makeSafePropertyIdentifier(key);
100
- const param = sanitizer.makeSafeVariableIdentifier(key);
101
- yield `${prop}${prop !== param ? `: ${param}` : ''},`;
213
+ const keySafe = sanitizer.makeSafePropertyIdentifier(name);
214
+ yield `${keySafe}: ${prop.valueType === 'bytes' ? 'BinaryState' : getEquivalentType(prop.valueType, 'output', { app, sanitizer })}`;
215
+ }
216
+ yield DecIndentAndCloseBlock;
217
+ }
218
+ if (maps && Object.keys(maps).length) {
219
+ yield 'maps: {';
220
+ yield IncIndent;
221
+ for (const name of Object.keys(maps)) {
222
+ const prop = maps[name];
223
+ if (prop.desc) {
224
+ yield* jsDoc(prop.desc);
102
225
  }
103
- yield DecIndentAndCloseBlock;
104
- yield DecIndentAndCloseBlock;
226
+ const keySafe = sanitizer.makeSafePropertyIdentifier(name);
227
+ yield `${keySafe}: Map<${getEquivalentType(prop.keyType, 'input', { app, sanitizer })}, ${getEquivalentType(prop.valueType, 'output', { app, sanitizer })}>`;
105
228
  }
229
+ yield DecIndentAndCloseBlock;
106
230
  }
107
231
  }
108
- function* appState({ app, sanitizer }) {
109
- const hasLocal = app.schema.local?.declared && Object.keys(app.schema.local.declared).length;
110
- const hasGlobal = app.schema.global?.declared && Object.keys(app.schema.global.declared).length;
232
+ function* appState({ app, sanitizer }, stateFlags) {
233
+ const { hasBox, hasGlobal, hasLocal } = stateFlags;
111
234
  if (hasLocal || hasGlobal) {
112
- yield* jsDoc('Defines the shape of the global and local state of the application.');
235
+ yield* jsDoc('Defines the shape of the state of the application.');
113
236
  yield 'state: {';
114
237
  yield IncIndent;
115
238
  if (hasGlobal) {
116
239
  yield 'global: {';
117
240
  yield IncIndent;
118
- for (const prop of Object.values(app.schema.global.declared)) {
119
- if (prop.descr) {
120
- yield* jsDoc(prop.descr);
121
- }
122
- const keySafe = sanitizer.makeSafePropertyIdentifier(prop.key);
123
- yield `${keySafe}?: ${prop.type === 'uint64' ? 'IntegerState' : 'BinaryState'}`;
124
- }
241
+ yield* keysAndMaps(app, sanitizer, app.state.keys.global, app.state.maps.global);
125
242
  yield DecIndentAndCloseBlock;
126
243
  }
127
244
  if (hasLocal) {
128
245
  yield 'local: {';
129
246
  yield IncIndent;
130
- for (const prop of Object.values(app.schema.local.declared)) {
131
- if (prop.descr) {
132
- yield* jsDoc(prop.descr);
133
- }
134
- const keySafe = sanitizer.makeSafePropertyIdentifier(prop.key);
135
- yield `${keySafe}?: ${prop.type === 'uint64' ? 'IntegerState' : 'BinaryState'}`;
136
- }
247
+ yield* keysAndMaps(app, sanitizer, app.state.keys.local, app.state.maps.local);
248
+ yield DecIndentAndCloseBlock;
249
+ }
250
+ if (hasBox) {
251
+ yield 'box: {';
252
+ yield IncIndent;
253
+ yield* keysAndMaps(app, sanitizer, app.state.keys.box, app.state.maps.box);
137
254
  yield DecIndentAndCloseBlock;
138
255
  }
139
256
  yield DecIndentAndCloseBlock;
@@ -1 +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 * as algokit from '@algorandfoundation/algokit-utils'\nimport { getEquivalentType } from './helpers/get-equivalent-type'\n\nexport function* appTypes(ctx: GeneratorContext): DocumentParts {\n const { app, methodSignatureToUniqueName, name } = ctx\n yield* jsDoc(`Defines the types of available calls and state of the ${name} smart contract.`)\n yield `export type ${name} = {`\n yield IncIndent\n yield* jsDoc('Maps method signatures / names to their argument and return types.')\n if (app.contract.methods.length == 0) {\n yield 'methods: {}'\n } else {\n yield 'methods:'\n }\n yield IncIndent\n for (const method of app.contract.methods) {\n const methodSig = algokit.getABIMethodSignature(method)\n const methodSigSafe = ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)\n const uniqueName = methodSignatureToUniqueName[methodSig]\n const uniqueNameSafe = ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName)\n yield `& Record<'${methodSigSafe}'${methodSig !== uniqueName ? ` | '${uniqueNameSafe}'` : ''}, {`\n yield IncIndent\n yield `argsObj: {`\n yield IncIndent\n\n const argsMeta = method.args.map((arg) => ({\n ...arg,\n hasDefault: app.hints?.[methodSig]?.default_arguments?.[arg.name],\n tsType: getEquivalentType(arg.type, 'input'),\n }))\n\n for (const arg of argsMeta) {\n if (arg.desc) yield* jsDoc(arg.desc)\n yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.hasDefault ? '?' : ''}: ${arg.tsType}`\n }\n yield DecIndentAndCloseBlock\n yield* inline(\n `argsTuple: [`,\n argsMeta\n .map(\n (arg) =>\n `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${getEquivalentType(arg.type, 'input')}${arg.hasDefault ? ' | undefined' : ''}`,\n )\n .join(', '),\n ']',\n )\n const outputStruct = ctx.app.hints?.[methodSig]?.structs?.output\n if (method.returns.desc) yield* jsDoc(method.returns.desc)\n if (outputStruct) {\n yield `returns: ${ctx.sanitizer.makeSafeTypeIdentifier(outputStruct.name)}`\n } else {\n yield `returns: ${getEquivalentType(method.returns.type ?? 'void', 'output')}`\n }\n\n yield DecIndent\n yield '}>'\n }\n yield DecIndent\n yield* appState(ctx)\n yield DecIndentAndCloseBlock\n\n yield* jsDoc('Defines the possible abi call signatures')\n yield `export type ${name}Sig = keyof ${name}['methods']`\n yield* jsDoc(\n 'Defines an object containing all relevant parameters for a single call to the contract. Where TSignature is undefined, a' +\n ' bare call is made',\n )\n yield `export type TypedCallParams<TSignature extends ${name}Sig | undefined> = {`\n yield IncIndent\n yield 'method: TSignature'\n yield 'methodArgs: TSignature extends undefined ? undefined : Array<ABIAppCallArg | undefined>'\n yield DecIndent\n yield '} & AppClientCallCoreParams & CoreAppCallArgs'\n yield* jsDoc('Defines the arguments required for a bare call')\n yield `export type BareCallArgs = Omit<RawAppCallArgs, keyof CoreAppCallArgs>`\n\n yield* structs(ctx)\n yield* jsDoc(`Maps a method signature from the ${name} smart contract to the method's arguments in either tuple of struct form`)\n yield `export type MethodArgs<TSignature extends ${name}Sig> = ${name}['methods'][TSignature]['argsObj' | 'argsTuple']`\n yield* jsDoc(`Maps a method signature from the ${name} smart contract to the method's return type`)\n yield `export type MethodReturn<TSignature extends ${name}Sig> = ${name}['methods'][TSignature]['returns']`\n yield NewLine\n}\n\nfunction* structs({ app, sanitizer }: GeneratorContext): DocumentParts {\n if (app.hints === undefined) return\n const definedStructs = new Set()\n\n for (const methodHint of Object.values(app.hints)) {\n if (methodHint.structs === undefined) continue\n for (const struct of Object.values(methodHint.structs)) {\n if (definedStructs.has(struct.name)) continue\n definedStructs.add(struct.name)\n\n yield* jsDoc(`Represents a ${struct.name} result as a struct`)\n yield `export type ${sanitizer.makeSafeTypeIdentifier(struct.name)} = {`\n yield IncIndent\n for (const [key, type] of struct.elements) {\n yield `${sanitizer.makeSafePropertyIdentifier(key)}: ${getEquivalentType(type, 'output')}`\n }\n yield DecIndentAndCloseBlock\n yield* jsDoc(`Converts the tuple representation of a ${struct.name} to the struct representation`)\n yield* inline(\n `export function ${sanitizer.makeSafeTypeIdentifier(struct.name)}(`,\n `[${struct.elements.map(([key]) => sanitizer.makeSafeVariableIdentifier(key)).join(', ')}]: `,\n `[${struct.elements.map(([_, type]) => getEquivalentType(type, 'output')).join(', ')}] ) {`,\n )\n yield IncIndent\n yield `return {`\n yield IncIndent\n for (const [key] of struct.elements) {\n const prop = sanitizer.makeSafePropertyIdentifier(key)\n const param = sanitizer.makeSafeVariableIdentifier(key)\n yield `${prop}${prop !== param ? `: ${param}` : ''},`\n }\n yield DecIndentAndCloseBlock\n yield DecIndentAndCloseBlock\n }\n }\n}\n\nfunction* appState({ app, sanitizer }: GeneratorContext): DocumentParts {\n const hasLocal = app.schema.local?.declared && Object.keys(app.schema.local.declared).length\n const hasGlobal = app.schema.global?.declared && Object.keys(app.schema.global.declared).length\n if (hasLocal || hasGlobal) {\n yield* jsDoc('Defines the shape of the global and local state of the application.')\n yield 'state: {'\n yield IncIndent\n if (hasGlobal) {\n yield 'global: {'\n yield IncIndent\n for (const prop of Object.values(app.schema.global!.declared!)) {\n if (prop.descr) {\n yield* jsDoc(prop.descr)\n }\n const keySafe = sanitizer.makeSafePropertyIdentifier(prop.key)\n\n yield `${keySafe}?: ${prop.type === 'uint64' ? 'IntegerState' : 'BinaryState'}`\n }\n yield DecIndentAndCloseBlock\n }\n if (hasLocal) {\n yield 'local: {'\n yield IncIndent\n for (const prop of Object.values(app.schema.local!.declared!)) {\n if (prop.descr) {\n yield* jsDoc(prop.descr)\n }\n const keySafe = sanitizer.makeSafePropertyIdentifier(prop.key)\n\n yield `${keySafe}?: ${prop.type === 'uint64' ? 'IntegerState' : 'BinaryState'}`\n }\n yield DecIndentAndCloseBlock\n }\n\n yield DecIndentAndCloseBlock\n }\n}\n"],"names":[],"mappings":"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"}
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 { getEquivalentType } from './helpers/get-equivalent-type'\nimport { ABIMethod, ABITupleType } from 'algosdk'\nimport { Arc56Contract, StorageKey, StorageMap, StructFields } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport { Sanitizer } from '../util/sanitization'\n\nexport function* appTypes(ctx: GeneratorContext): DocumentParts {\n yield* abiTypes(ctx)\n yield* structTypes(ctx)\n yield* templateVariableTypes(ctx)\n\n const { app, methodSignatureToUniqueName, name } = ctx\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.methods.length == 0) {\n yield 'methods: {}'\n } else {\n yield 'methods:'\n }\n yield IncIndent\n for (const method of app.methods) {\n const methodSig = new ABIMethod(method).getSignature()\n const methodSigSafe = ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)\n const uniqueName = methodSignatureToUniqueName[methodSig]\n const uniqueNameSafe = ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName)\n yield `& Record<'${methodSigSafe}'${methodSig !== uniqueName ? ` | '${uniqueNameSafe}'` : ''}, {`\n yield IncIndent\n yield `argsObj: {`\n yield IncIndent\n\n const argsMeta = method.args.map((arg, i) => ({\n ...arg,\n name: arg.name ?? `arg${i + 1}`,\n hasDefault: !!arg.defaultValue,\n tsType: getEquivalentType(arg.struct ?? arg.type, 'input', ctx),\n }))\n\n for (const arg of argsMeta) {\n if (arg.desc) yield* jsDoc(arg.desc)\n yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.hasDefault ? '?' : ''}: ${arg.tsType}`\n }\n yield DecIndentAndCloseBlock\n yield* inline(\n `argsTuple: [`,\n argsMeta\n .map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.hasDefault ? ' | undefined' : ''}`)\n .join(', '),\n ']',\n )\n if (method.returns.desc) yield* jsDoc(method.returns.desc)\n yield `returns: ${getEquivalentType(method.returns.struct ?? method.returns.type ?? 'void', 'output', ctx)}`\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 `\n /**\n * Defines the possible abi call signatures.\n */\n export type ${name}Signatures = keyof ${name}Types['methods']\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 * Defines an object containing all relevant parameters for a single call to the contract.\n */\n export type CallParams<TSignature extends ${name}Signatures> = 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<MethodArgs<TSignature>>\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* abiTypes(ctx: GeneratorContext): DocumentParts {\n const { app } = ctx\n const abiTypes: string[] = []\n\n const pushType = (type: string) => {\n // If we already have this type, skip\n if (abiTypes.includes(type)) return\n\n // void and string are the same types in TS\n if (['void', 'string'].includes(type)) return\n\n // Skip structs\n if (app.structs[type]) return\n\n // If this is an array type, push the base type\n if (type.match(/\\[\\d*\\]$/)) {\n pushType(type.replace(/\\[\\d*\\]$/, ''))\n return\n }\n\n if (type.startsWith('(')) {\n const tupleType = ABITupleType.from(type) as ABITupleType\n\n tupleType.childTypes.forEach((t) => {\n pushType(t.toString())\n })\n\n return\n }\n\n abiTypes.push(type)\n }\n\n Object.values(app.templateVariables ?? {}).forEach((t) => {\n pushType(t.type)\n })\n\n app.methods.forEach((m) => {\n m.args.forEach((a) => {\n pushType(a.type)\n })\n\n pushType(m.returns.type)\n })\n ;(['global', 'local', 'box'] as ['global', 'local', 'box']).forEach((storageType) => {\n Object.values(app.state.keys[storageType]).forEach((k) => {\n pushType(k.keyType)\n pushType(k.valueType)\n })\n\n Object.values(app.state.maps[storageType]).forEach((m) => {\n pushType(m.keyType)\n pushType(m.valueType)\n })\n })\n\n const pushStructFields = (fields: StructFields) => {\n Object.values(fields).forEach((sf) => {\n if (typeof sf === 'string') pushType(sf)\n else pushStructFields(sf)\n })\n }\n\n Object.values(app.structs).forEach((sf) => {\n pushStructFields(sf)\n })\n\n yield '// Aliases for non-encoded ABI values'\n yield NewLine\n for (const t of abiTypes) {\n yield `type ${t} = ${getEquivalentType(t, 'output', ctx)};`\n }\n yield NewLine\n}\n\nfunction* structTypes({ app, sanitizer }: GeneratorContext): DocumentParts {\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 of Object.keys(app.structs)) {\n yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${JSON.stringify(app.structs[structName], null, 2)\n .replace(/\"/g, '')\n .replaceAll('(', '[')\n .replaceAll(')', ']')\n .replace(/\\[\\d+\\]/g, '[]')}`\n }\n\n yield NewLine\n}\n\nfunction* templateVariableTypes({ app }: GeneratorContext): DocumentParts {\n if (Object.keys(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 of Object.keys(app.templateVariables ?? {})) {\n yield `${name}: ${app.templateVariables![name].type},`\n }\n\n yield DecIndentAndCloseBlock\n}\n\nfunction* keysAndMaps(\n app: Arc56Contract,\n sanitizer: Sanitizer,\n keys: {\n [name: string]: StorageKey\n },\n maps: {\n [name: string]: StorageMap\n },\n): DocumentParts {\n if (keys && Object.keys(keys).length) {\n yield 'keys: {'\n yield IncIndent\n for (const name of Object.keys(keys)) {\n const prop = keys[name]\n if (prop.desc) {\n yield* jsDoc(prop.desc)\n }\n const keySafe = sanitizer.makeSafePropertyIdentifier(name)\n\n yield `${keySafe}: ${prop.valueType === 'bytes' ? 'BinaryState' : getEquivalentType(prop.valueType, 'output', { app, sanitizer })}`\n }\n yield DecIndentAndCloseBlock\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<${getEquivalentType(prop.keyType, 'input', { app, sanitizer })}, ${getEquivalentType(prop.valueType, 'output', { app, sanitizer })}>`\n }\n yield DecIndentAndCloseBlock\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) {\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(app, 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(app, 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(app, 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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"}