@algorandfoundation/algokit-client-generator 6.0.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,122 @@
1
+ import { Arc56Contract, ABIType, ABIReferenceType, ABITransactionType, AVMType } from '@algorandfoundation/algokit-utils/abi';
2
+ import { Sanitizer } from '../util/sanitization';
3
+ export type AppClientContext = {
4
+ name: SanitizableString;
5
+ methods: AppClientMethodContext[];
6
+ abiMethods: AbiMethodClientContext[];
7
+ state: {
8
+ keys: {
9
+ global: {
10
+ [name: string]: StorageKeyContext;
11
+ };
12
+ local: {
13
+ [name: string]: StorageKeyContext;
14
+ };
15
+ box: {
16
+ [name: string]: StorageKeyContext;
17
+ };
18
+ };
19
+ /** Mapping of human-readable names to StorageMap objects */
20
+ maps: {
21
+ global: {
22
+ [name: string]: StorageMapContext;
23
+ };
24
+ local: {
25
+ [name: string]: StorageMapContext;
26
+ };
27
+ box: {
28
+ [name: string]: StorageMapContext;
29
+ };
30
+ };
31
+ };
32
+ structs: Record<string, StructContext>;
33
+ createMethods: AppClientMethodContext[];
34
+ updateMethods: AppClientMethodContext[];
35
+ deleteMethods: AppClientMethodContext[];
36
+ optInMethods: AppClientMethodContext[];
37
+ closeOutMethods: AppClientMethodContext[];
38
+ clearStateMethods: AppClientMethodContext[];
39
+ noOpMethods: AppClientMethodContext[];
40
+ bareMethod: BareMethodClientContext;
41
+ templateVariables: Record<string, TemplateVariableContext>;
42
+ };
43
+ export type AppClientMethodContext = AbiMethodClientContext | BareMethodClientContext;
44
+ export declare function isAbiMethod(method: AppClientMethodContext): method is AbiMethodClientContext;
45
+ export type StructContext = {
46
+ type: TypeContext;
47
+ tsObjDef: string;
48
+ tsTupDef: string;
49
+ };
50
+ export type StorageKeyContext = {
51
+ desc?: string;
52
+ keyType: TypeContext;
53
+ valueType: TypeContext;
54
+ key: string;
55
+ };
56
+ /** Describes a mapping of key-value pairs in storage */
57
+ export type StorageMapContext = {
58
+ desc?: string;
59
+ keyType: TypeContext;
60
+ valueType: TypeContext;
61
+ prefix?: string;
62
+ };
63
+ export type TypeContext = {
64
+ type: ABIType | AVMType;
65
+ isAvmBytes?: boolean;
66
+ tsInType: string;
67
+ tsOutType: string;
68
+ };
69
+ export type TemplateVariableContext = {
70
+ type: TypeContext;
71
+ value: string | undefined;
72
+ };
73
+ export type AbiMethodClientContext = {
74
+ isBare: false;
75
+ desc: string | undefined;
76
+ name: SanitizableString;
77
+ baseNameIsUnique: boolean;
78
+ uniqueName: SanitizableString;
79
+ signature: string;
80
+ args: MethodArgClientContext[];
81
+ returns: MethodReturnClientContext;
82
+ createActions: MethodOcas;
83
+ callActions: MethodOcas;
84
+ readonly: boolean;
85
+ };
86
+ export type BareMethodClientContext = {
87
+ isBare: true;
88
+ createActions: MethodOcas;
89
+ callActions: MethodOcas;
90
+ };
91
+ export type MethodOcas = {
92
+ raw: string[];
93
+ any: boolean;
94
+ noOp: boolean;
95
+ optIn: boolean;
96
+ closeOut: boolean;
97
+ clearState: boolean;
98
+ updateApplication: boolean;
99
+ deleteApplication: boolean;
100
+ inputType: {
101
+ isOptional: boolean;
102
+ typeLiteral: string | undefined;
103
+ };
104
+ };
105
+ export type MethodArgClientContext = {
106
+ name: SanitizableString | undefined;
107
+ desc: string | undefined;
108
+ type: ABIType | ABIReferenceType | ABITransactionType;
109
+ tsInType: string;
110
+ defaultValue: unknown;
111
+ };
112
+ export type MethodReturnClientContext = {
113
+ tsOutType: string;
114
+ type: ABIType | undefined;
115
+ desc: string | undefined;
116
+ };
117
+ export type SanitizableString = {
118
+ original: string;
119
+ } & {
120
+ [key in keyof Sanitizer]: ReturnType<Sanitizer[key]>;
121
+ };
122
+ export declare function createAppClientContext(appSpec: Arc56Contract, sanitizer: Sanitizer): AppClientContext;
@@ -1,13 +1,3 @@
1
1
  import { DocumentParts } from '../output/writer';
2
- import { MethodIdentifier } from './helpers/get-call-config-summary';
3
2
  import { GeneratorContext } from './generator-context';
4
- import { Arc56Contract } from '@algorandfoundation/algokit-utils/types/app-arc56';
5
- export declare function getCreateOnCompleteOptions(method: MethodIdentifier, app: Arc56Contract): {
6
- type: {};
7
- isOptional: boolean | undefined;
8
- };
9
- export declare function getCallOnCompleteOptions(method: MethodIdentifier, app: Arc56Contract): {
10
- type: {};
11
- isOptional: boolean | undefined;
12
- };
13
- export declare function deployTypes({ app, callConfig, sanitizer, methodSignatureToUniqueName }: GeneratorContext): DocumentParts;
3
+ export declare function deployTypes({ app, sanitizer }: GeneratorContext): DocumentParts;
@@ -1,4 +1,4 @@
1
1
  import { DocumentParts } from '../output/writer';
2
2
  import { GeneratorOptions } from './generator-context';
3
- import { Arc56Contract } from '@algorandfoundation/algokit-utils/types/app-arc56';
3
+ import { Arc56Contract } from '@algorandfoundation/algokit-utils/abi';
4
4
  export declare function generate(app: Arc56Contract, options?: Partial<GeneratorOptions>): DocumentParts;
@@ -1,6 +1,6 @@
1
- import { CallConfigSummary } from './helpers/get-call-config-summary';
2
1
  import { Sanitizer } from '../util/sanitization';
3
- import { Arc56Contract } from '@algorandfoundation/algokit-utils/types/app-arc56';
2
+ import { Arc56Contract } from '@algorandfoundation/algokit-utils/abi';
3
+ import { AppClientContext } from './app-client-context';
4
4
  declare const GenerateMode: {
5
5
  readonly FULL: "full";
6
6
  readonly MINIMAL: "minimal";
@@ -8,10 +8,8 @@ declare const GenerateMode: {
8
8
  export type GenerateMode = (typeof GenerateMode)[keyof typeof GenerateMode];
9
9
  export declare const generateModes: ("full" | "minimal")[];
10
10
  export type GeneratorContext = {
11
- app: Arc56Contract;
12
11
  name: string;
13
- callConfig: CallConfigSummary;
14
- methodSignatureToUniqueName: Record<string, string>;
12
+ app: AppClientContext;
15
13
  sanitizer: Sanitizer;
16
14
  mode: GenerateMode;
17
15
  };
@@ -1,2 +1,2 @@
1
- import { Method } from '@algorandfoundation/algokit-utils/types/app-arc56';
2
- export declare const containsNonVoidMethod: (methods: Method[]) => boolean;
1
+ import { AppClientMethodContext } from '../app-client-context';
2
+ export declare const containsNonVoidMethod: (methods: AppClientMethodContext[]) => boolean;
@@ -1,6 +1,4 @@
1
- import { Arc56Contract } from '@algorandfoundation/algokit-utils/types/app-arc56';
1
+ import { ABIReferenceType, ABIType, AVMType, ABITransactionType } from '@algorandfoundation/algokit-utils/abi';
2
2
  import { Sanitizer } from '../../util/sanitization';
3
- export declare function getEquivalentType(abiTypeStr: string, ioType: 'input' | 'output', ctx: {
4
- app: Arc56Contract;
5
- sanitizer: Sanitizer;
6
- }): string;
3
+ export declare function getEquivalentType(algoType: ABIType | ABIReferenceType | ABITransactionType | AVMType | 'void', ioType: 'input' | 'output', sanitizer: Sanitizer): string;
4
+ export declare function abiTypeToTs(abiType: ABIType, ioType: 'input' | 'output', sanitizer: Sanitizer): string;
@@ -1,3 +1,2 @@
1
1
  import { DocumentParts } from '../output/writer';
2
- import { GeneratorContext } from './generator-context';
3
- export declare function imports(ctx: GeneratorContext): DocumentParts;
2
+ export declare function imports(): DocumentParts;
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "**"
7
7
  ],
8
8
  "name": "@algorandfoundation/algokit-client-generator",
9
- "version": "6.0.1",
9
+ "version": "7.0.0-alpha.1",
10
10
  "description": "Generates a TypeScript client for interacting with, and deploying ARC-0032 smart contracts on the Algorand Blockchain.",
11
11
  "module": "index.mjs",
12
12
  "private": false,
@@ -27,8 +27,7 @@
27
27
  "jsonschema": "^1.5.0"
28
28
  },
29
29
  "peerDependencies": {
30
- "@algorandfoundation/algokit-utils": "^9.0.0",
31
- "algosdk": "^3.2.0"
30
+ "@algorandfoundation/algokit-utils": "^10.0.0-alpha.20"
32
31
  },
33
32
  "publishConfig": {
34
33
  "access": "public"
package/schema/load.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { Arc56Contract } from '@algorandfoundation/algokit-utils/types/app-arc56';
1
+ import { Arc56Contract } from '@algorandfoundation/algokit-utils/abi';
2
2
  export declare function loadApplicationJson(appJsonPath: string): Promise<Arc56Contract>;
3
3
  export declare function validateApplicationJson(json: unknown, appJsonPath: string): Arc56Contract;
package/src/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sources":["../../src/cli.ts"],"sourcesContent":["import { Command, Option } from 'commander'\nimport { loadApplicationJson } from './schema/load'\nimport * as path from 'path'\nimport { generate } from './client/generate'\nimport { writeDocumentPartsToStream } from './output/writer'\nimport { colorConsole } from './util/color-console'\nimport { GenerateMode, generateModes, GeneratorOptions } from './client/generator-context'\n\nexport function cli(workingDirectory: string, args: string[]) {\n // Pre 13 commander allowed `-pn` however the latest version doesn't. Rewrite it to `--pn` for backwards compatibility.\n const processedArgs = args.map((arg) => (arg === '-pn' ? '--pn' : arg))\n const program = new Command()\n program\n .command('generate')\n .description('Generates a TypeScript client for the given application.json file')\n .requiredOption('-a --application <path>', 'Specifies the application.json file')\n .requiredOption('-o --output <path>', 'Specifies the output file path')\n .option('--pn --preserve-names', 'Preserve names from application.json spec instead of sanitizing them')\n .addOption(\n new Option(\n '-m --mode <mode>',\n \"Generate client in specified mode. The 'full' mode includes all features, 'minimal' generates a smaller client without deployment features.\",\n )\n .choices(generateModes)\n .default('full'),\n )\n .allowExcessArguments(true) // Maintains backwards compatibility with pre 13 commanded\n .action(\n async ({\n application,\n output,\n preserveNames,\n mode,\n }: {\n application: string\n output: string\n preserveNames?: boolean\n mode?: GenerateMode\n }): Promise<void> => {\n await generateClientCommand({\n application,\n output,\n preserveNames: Boolean(preserveNames),\n mode: (mode ?? 'full') as GenerateMode,\n workingDirectory,\n })\n colorConsole.success`Operation completed successfully`\n },\n )\n .configureOutput({\n writeErr(str: string) {\n colorConsole.error`${str}`\n },\n })\n try {\n program.parse(processedArgs)\n } catch (err) {\n if (err instanceof Error) {\n colorConsole.error`Unhandled error: \\n\\n${err.stack}`\n } else {\n colorConsole.error`Unhandled error: \\n\\n${err}`\n }\n process.exit(-1)\n }\n}\n\nexport async function generateClientCommand({\n application,\n output,\n preserveNames,\n mode,\n workingDirectory,\n}: {\n application: string\n output: string\n workingDirectory: string\n} & GeneratorOptions): Promise<void> {\n const fs = await import('fs')\n\n const resolvedAppJsonPath = path.resolve(workingDirectory, application)\n const resolvedOutPath = path.resolve(workingDirectory, output)\n const resolvedOutDir = path.dirname(resolvedOutPath)\n colorConsole.info`Reading application.json file from path ${resolvedAppJsonPath}`\n const spec = await loadApplicationJson(resolvedAppJsonPath)\n colorConsole.info`Generating TS client for ${spec.name}`\n const parts = generate(spec, { preserveNames, mode })\n if (!fs.existsSync(resolvedOutDir)) {\n colorConsole.warn`Output directory ${resolvedOutDir} does not exist and will be created.`\n fs.mkdirSync(resolvedOutDir, { recursive: true })\n }\n colorConsole.info`Writing TS client to ${resolvedOutPath}`\n const file = await createAwaitableWriteStream(resolvedOutPath)\n writeDocumentPartsToStream(parts, file)\n await file.finish()\n}\n\nasync function createAwaitableWriteStream(path: string) {\n const fs = await import('fs')\n const stream = fs.createWriteStream(path, {\n flags: 'w',\n })\n const finish = new Promise<void>((resolve, reject) => {\n stream.on('error', (err) => {\n reject(err)\n })\n stream.on('finish', () => {\n resolve()\n })\n })\n return {\n write(chunk: string): void {\n stream.write(chunk)\n },\n finish() {\n stream.end()\n return finish\n },\n }\n}\n"],"names":["Command","Option","generateModes","colorConsole","path","loadApplicationJson","generate","writeDocumentPartsToStream"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.mjs","sources":["../../src/cli.ts"],"sourcesContent":["import { Command, Option } from 'commander'\nimport { loadApplicationJson } from './schema/load'\nimport * as path from 'path'\nimport { generate } from './client/generate'\nimport { writeDocumentPartsToStream } from './output/writer'\nimport { colorConsole } from './util/color-console'\nimport { GenerateMode, generateModes, GeneratorOptions } from './client/generator-context'\n\nexport function cli(workingDirectory: string, args: string[]) {\n // Pre 13 commander allowed `-pn` however the latest version doesn't. Rewrite it to `--pn` for backwards compatibility.\n const processedArgs = args.map((arg) => (arg === '-pn' ? '--pn' : arg))\n const program = new Command()\n program\n .command('generate')\n .description('Generates a TypeScript client for the given application.json file')\n .requiredOption('-a --application <path>', 'Specifies the application.json file')\n .requiredOption('-o --output <path>', 'Specifies the output file path')\n .option('--pn --preserve-names', 'Preserve names from application.json spec instead of sanitizing them')\n .addOption(\n new Option(\n '-m --mode <mode>',\n \"Generate client in specified mode. The 'full' mode includes all features, 'minimal' generates a smaller client without deployment features.\",\n )\n .choices(generateModes)\n .default('full'),\n )\n .allowExcessArguments(true) // Maintains backwards compatibility with pre 13 commanded\n .action(\n async ({\n application,\n output,\n preserveNames,\n mode,\n }: {\n application: string\n output: string\n preserveNames?: boolean\n mode?: GenerateMode\n }): Promise<void> => {\n await generateClientCommand({\n application,\n output,\n preserveNames: Boolean(preserveNames),\n mode: (mode ?? 'full') as GenerateMode,\n workingDirectory,\n })\n colorConsole.success`Operation completed successfully`\n },\n )\n .configureOutput({\n writeErr(str: string) {\n colorConsole.error`${str}`\n },\n })\n try {\n program.parse(processedArgs)\n } catch (err) {\n if (err instanceof Error) {\n colorConsole.error`Unhandled error: \\n\\n${err.stack}`\n } else {\n colorConsole.error`Unhandled error: \\n\\n${err}`\n }\n process.exit(-1)\n }\n}\n\nexport async function generateClientCommand({\n application,\n output,\n preserveNames,\n mode,\n workingDirectory,\n}: {\n application: string\n output: string\n workingDirectory: string\n} & GeneratorOptions): Promise<void> {\n const fs = await import('fs')\n\n const resolvedAppJsonPath = path.resolve(workingDirectory, application)\n const resolvedOutPath = path.resolve(workingDirectory, output)\n const resolvedOutDir = path.dirname(resolvedOutPath)\n colorConsole.info`Reading application.json file from path ${resolvedAppJsonPath}`\n const spec = await loadApplicationJson(resolvedAppJsonPath)\n colorConsole.info`Generating TS client for ${spec.name}`\n const parts = generate(spec, { preserveNames, mode })\n if (!fs.existsSync(resolvedOutDir)) {\n colorConsole.warn`Output directory ${resolvedOutDir} does not exist and will be created.`\n fs.mkdirSync(resolvedOutDir, { recursive: true })\n }\n colorConsole.info`Writing TS client to ${resolvedOutPath}`\n const file = await createAwaitableWriteStream(resolvedOutPath)\n writeDocumentPartsToStream(parts, file)\n await file.finish()\n}\n\nasync function createAwaitableWriteStream(path: string) {\n const fs = await import('fs')\n const stream = fs.createWriteStream(path, {\n flags: 'w',\n })\n const finish = new Promise<void>((resolve, reject) => {\n stream.on('error', (err) => {\n reject(err)\n })\n stream.on('finish', () => {\n resolve()\n })\n })\n return {\n write(chunk: string): void {\n stream.write(chunk)\n },\n finish() {\n stream.end()\n return finish\n },\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ 'use strict';
2
+
3
+ var abi = require('@algorandfoundation/algokit-utils/abi');
4
+ var getEquivalentType = require('./helpers/get-equivalent-type.js');
5
+ var tinyInvariant = require('../../node_modules/tiny-invariant/dist/esm/tiny-invariant.js');
6
+
7
+ function isAbiMethod(method) {
8
+ return !method.isBare;
9
+ }
10
+ function createAppClientContext(appSpec, sanitizer) {
11
+ const methods = [];
12
+ for (const m of appSpec.methods) {
13
+ const abiMethod = abi.arc56MethodToABIMethod(m, appSpec);
14
+ const baseNameIsUnique = appSpec.methods.filter((o) => o.name === m.name).length === 1;
15
+ methods.push({
16
+ isBare: false,
17
+ name: createSanitizableString(m.name, sanitizer),
18
+ desc: m.desc,
19
+ baseNameIsUnique,
20
+ uniqueName: createSanitizableString(baseNameIsUnique ? m.name : abiMethod.getSignature(), sanitizer),
21
+ args: abiMethod.args.map((a) => {
22
+ return {
23
+ name: a.name ? createSanitizableString(a.name, sanitizer) : undefined,
24
+ desc: a.description,
25
+ type: a.type,
26
+ tsInType: getEquivalentType.getEquivalentType(a.type, 'input', sanitizer),
27
+ defaultValue: Boolean(a.defaultValue),
28
+ };
29
+ }),
30
+ callActions: buildOcas(m.actions.call),
31
+ createActions: buildOcas(m.actions.create),
32
+ readonly: Boolean(m.readonly),
33
+ signature: abiMethod.getSignature(),
34
+ returns: {
35
+ tsOutType: getEquivalentType.getEquivalentType(abiMethod.returns.type, 'output', sanitizer),
36
+ type: abiMethod.returns.type === 'void' ? undefined : abiMethod.returns.type,
37
+ desc: abiMethod.returns.description,
38
+ },
39
+ });
40
+ }
41
+ const bareMethod = {
42
+ isBare: true,
43
+ createActions: buildOcas(appSpec.bareActions.create),
44
+ callActions: buildOcas(appSpec.bareActions.call),
45
+ };
46
+ if (bareMethod.createActions.any || bareMethod.callActions.any) {
47
+ methods.push(bareMethod);
48
+ }
49
+ return {
50
+ name: createSanitizableString(appSpec.name, sanitizer),
51
+ methods,
52
+ bareMethod,
53
+ createMethods: methods.filter((m) => m.createActions.any),
54
+ updateMethods: methods.filter((m) => m.callActions.updateApplication),
55
+ deleteMethods: methods.filter((m) => m.callActions.deleteApplication),
56
+ noOpMethods: methods.filter((m) => m.callActions.noOp),
57
+ optInMethods: methods.filter((m) => m.callActions.optIn),
58
+ closeOutMethods: methods.filter((m) => m.callActions.closeOut),
59
+ clearStateMethods: methods.filter((m) => m.callActions.clearState),
60
+ abiMethods: methods.filter(isAbiMethod),
61
+ state: {
62
+ maps: {
63
+ global: buildStorageMap(appSpec.state.maps.global, appSpec, sanitizer),
64
+ local: buildStorageMap(appSpec.state.maps.local, appSpec, sanitizer),
65
+ box: buildStorageMap(appSpec.state.maps.box, appSpec, sanitizer),
66
+ },
67
+ keys: {
68
+ global: buildStorageKey(appSpec.state.keys.global, appSpec, sanitizer),
69
+ local: buildStorageKey(appSpec.state.keys.local, appSpec, sanitizer),
70
+ box: buildStorageKey(appSpec.state.keys.box, appSpec, sanitizer),
71
+ },
72
+ },
73
+ structs: mapRecord(appSpec.structs, (def, name) => buildStructCtx(name, appSpec, sanitizer)),
74
+ templateVariables: mapRecord(appSpec.templateVariables ?? {}, (v) => ({
75
+ value: v.value,
76
+ type: buildTypeContext(v.type, appSpec, sanitizer),
77
+ })),
78
+ };
79
+ }
80
+ function buildStructCtx(name, appSpec, sanitizer) {
81
+ const typeCtx = buildTypeContext(name, appSpec, sanitizer);
82
+ const abiType = typeCtx.type;
83
+ tinyInvariant.default(abiType instanceof abi.ABIStructType);
84
+ return {
85
+ type: typeCtx,
86
+ tsObjDef: buildStructObjDef(abiType.structFields, appSpec, sanitizer, 1),
87
+ tsTupDef: `[${Array.from(buildStructTupleDef(abiType.structFields, appSpec, sanitizer)).join(', ')}]`,
88
+ };
89
+ }
90
+ function buildStructObjDef(fields, appSpec, sanitizer, indent) {
91
+ const indentStr = ' '.repeat(indent);
92
+ const closingIndent = ' '.repeat(indent - 1);
93
+ const lines = [];
94
+ for (const field of fields) {
95
+ const typeDef = Array.isArray(field.type)
96
+ ? buildStructObjDef(field.type, appSpec, sanitizer, indent + 1)
97
+ : getEquivalentType.abiTypeToTs(field.type, 'output', sanitizer);
98
+ lines.push(`${indentStr}${sanitizer.makeSafePropertyIdentifier(field.name)}: ${typeDef}`);
99
+ }
100
+ return `{\n${lines.join(',\n')}\n${closingIndent}}`;
101
+ }
102
+ function* buildStructTupleDef(fields, appSpec, sanitizer) {
103
+ for (const field of fields) {
104
+ let typeDef;
105
+ if (Array.isArray(field.type)) {
106
+ typeDef = `[${Array.from(buildStructTupleDef(field.type, appSpec, sanitizer)).join(', ')}]`;
107
+ }
108
+ else {
109
+ typeDef = getEquivalentType.abiTypeToTs(field.type, 'output', sanitizer);
110
+ }
111
+ yield `${typeDef}`;
112
+ }
113
+ }
114
+ function buildStorageMap(maps, appSpec, sanitizer) {
115
+ return mapRecord(maps, (v) => ({
116
+ desc: v.desc,
117
+ valueType: buildTypeContext(v.valueType, appSpec, sanitizer),
118
+ keyType: buildTypeContext(v.keyType, appSpec, sanitizer),
119
+ prefix: v.prefix,
120
+ }));
121
+ }
122
+ function buildStorageKey(keys, appSpec, sanitizer) {
123
+ return mapRecord(keys, (v) => ({
124
+ desc: v.desc,
125
+ valueType: buildTypeContext(v.valueType, appSpec, sanitizer),
126
+ keyType: buildTypeContext(v.valueType, appSpec, sanitizer),
127
+ key: v.key,
128
+ }));
129
+ }
130
+ function mapRecord(input, mapper) {
131
+ return Object.fromEntries(Object.entries(input).map(([k, v]) => [k, mapper(v, k)]));
132
+ }
133
+ function createSanitizableString(name, sanitizer) {
134
+ return new Proxy({}, {
135
+ get(target, property) {
136
+ if (property === 'toString')
137
+ return () => name;
138
+ if (property === 'original')
139
+ return name;
140
+ if (property in sanitizer) {
141
+ return sanitizer[property](name);
142
+ }
143
+ },
144
+ });
145
+ }
146
+ function buildOcas(actions) {
147
+ const isOptional = actions.includes('NoOp') || actions.length === 1;
148
+ const typeLiteral = actions.length
149
+ ? `{ onComplete${isOptional ? '?' : ''}: ${actions.map((oc) => `OnApplicationComplete.${oc}`).join(' | ')} }`
150
+ : undefined;
151
+ return {
152
+ raw: actions,
153
+ any: Boolean(actions.length),
154
+ noOp: actions.includes('NoOp'),
155
+ optIn: actions.includes('OptIn'),
156
+ closeOut: actions.includes('CloseOut'),
157
+ clearState: actions.includes('ClearState'),
158
+ updateApplication: actions.includes('UpdateApplication'),
159
+ deleteApplication: actions.includes('DeleteApplication'),
160
+ inputType: {
161
+ isOptional,
162
+ typeLiteral,
163
+ },
164
+ };
165
+ }
166
+ function buildTypeContext(typeName, appSpec, sanitizer) {
167
+ switch (typeName) {
168
+ case 'AVMBytes':
169
+ return {
170
+ isAvmBytes: true,
171
+ type: typeName,
172
+ tsInType: 'Uint8Array | string',
173
+ tsOutType: 'Uint8Array',
174
+ };
175
+ case 'AVMString':
176
+ return {
177
+ type: typeName,
178
+ tsInType: 'string',
179
+ tsOutType: 'string',
180
+ };
181
+ case 'AVMUint64':
182
+ return {
183
+ type: typeName,
184
+ tsInType: 'bigint',
185
+ tsOutType: 'bigint',
186
+ };
187
+ }
188
+ if (typeName in appSpec.structs) {
189
+ return {
190
+ type: abi.ABIStructType.fromStruct(typeName, appSpec.structs),
191
+ tsInType: sanitizer.makeSafeTypeIdentifier(typeName),
192
+ tsOutType: sanitizer.makeSafeTypeIdentifier(typeName),
193
+ };
194
+ }
195
+ // Otherwise parse as ABI type
196
+ try {
197
+ const abiType = abi.ABIType.from(typeName);
198
+ return {
199
+ type: abiType,
200
+ tsInType: getEquivalentType.abiTypeToTs(abiType, 'input', sanitizer),
201
+ tsOutType: getEquivalentType.abiTypeToTs(abiType, 'output', sanitizer),
202
+ };
203
+ }
204
+ catch (error) {
205
+ throw new Error(`Failed to parse storage type '${typeName}': ${error}`);
206
+ }
207
+ }
208
+
209
+ exports.createAppClientContext = createAppClientContext;
210
+ exports.isAbiMethod = isAbiMethod;
211
+ //# sourceMappingURL=app-client-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-client-context.js","sources":["../../../src/client/app-client-context.ts"],"sourcesContent":["import {\n arc56MethodToABIMethod,\n Arc56Contract,\n ABIType,\n ABIReferenceType,\n ABITransactionType,\n AVMType,\n ABIStructField,\n ABIStructType,\n StorageKey,\n StorageMap,\n} from '@algorandfoundation/algokit-utils/abi'\nimport { Sanitizer } from '../util/sanitization'\nimport { abiTypeToTs, getEquivalentType } from './helpers/get-equivalent-type'\nimport invariant from 'tiny-invariant'\n\nexport type AppClientContext = {\n name: SanitizableString\n\n methods: AppClientMethodContext[]\n abiMethods: AbiMethodClientContext[]\n\n state: {\n keys: {\n global: {\n [name: string]: StorageKeyContext\n }\n local: {\n [name: string]: StorageKeyContext\n }\n box: {\n [name: string]: StorageKeyContext\n }\n }\n /** Mapping of human-readable names to StorageMap objects */\n maps: {\n global: {\n [name: string]: StorageMapContext\n }\n local: {\n [name: string]: StorageMapContext\n }\n box: {\n [name: string]: StorageMapContext\n }\n }\n }\n\n structs: Record<string, StructContext>\n\n createMethods: AppClientMethodContext[]\n updateMethods: AppClientMethodContext[]\n deleteMethods: AppClientMethodContext[]\n optInMethods: AppClientMethodContext[]\n closeOutMethods: AppClientMethodContext[]\n clearStateMethods: AppClientMethodContext[]\n noOpMethods: AppClientMethodContext[]\n\n bareMethod: BareMethodClientContext\n\n templateVariables: Record<string, TemplateVariableContext>\n}\n\nexport type AppClientMethodContext = AbiMethodClientContext | BareMethodClientContext\n\nexport function isAbiMethod(method: AppClientMethodContext): method is AbiMethodClientContext {\n return !method.isBare\n}\n\nexport type StructContext = {\n type: TypeContext\n tsObjDef: string\n tsTupDef: string\n}\n\nexport type StorageKeyContext = {\n desc?: string\n keyType: TypeContext\n valueType: TypeContext\n key: string\n}\n/** Describes a mapping of key-value pairs in storage */\nexport type StorageMapContext = {\n desc?: string\n keyType: TypeContext\n valueType: TypeContext\n prefix?: string\n}\n\nexport type TypeContext = {\n type: ABIType | AVMType\n isAvmBytes?: boolean\n tsInType: string\n tsOutType: string\n}\n\nexport type TemplateVariableContext = {\n type: TypeContext\n value: string | undefined\n}\n\nexport type AbiMethodClientContext = {\n isBare: false\n desc: string | undefined\n name: SanitizableString\n baseNameIsUnique: boolean\n uniqueName: SanitizableString\n signature: string\n args: MethodArgClientContext[]\n returns: MethodReturnClientContext\n createActions: MethodOcas\n callActions: MethodOcas\n readonly: boolean\n}\nexport type BareMethodClientContext = {\n isBare: true\n //desc: string | undefined\n createActions: MethodOcas\n callActions: MethodOcas\n //readonly: boolean\n}\n\nexport type MethodOcas = {\n raw: string[]\n any: boolean\n noOp: boolean\n optIn: boolean\n closeOut: boolean\n clearState: boolean\n updateApplication: boolean\n deleteApplication: boolean\n\n inputType: {\n isOptional: boolean\n typeLiteral: string | undefined\n }\n}\n\nexport type MethodArgClientContext = {\n name: SanitizableString | undefined\n desc: string | undefined\n type: ABIType | ABIReferenceType | ABITransactionType\n tsInType: string\n defaultValue: unknown\n}\n\nexport type MethodReturnClientContext = {\n tsOutType: string\n type: ABIType | undefined\n desc: string | undefined\n}\n\nexport type SanitizableString = {\n original: string\n} & {\n [key in keyof Sanitizer]: ReturnType<Sanitizer[key]>\n}\n\nexport function createAppClientContext(appSpec: Arc56Contract, sanitizer: Sanitizer): AppClientContext {\n const methods: AppClientMethodContext[] = []\n\n for (const m of appSpec.methods) {\n const abiMethod = arc56MethodToABIMethod(m, appSpec)\n const baseNameIsUnique = appSpec.methods.filter((o) => o.name === m.name).length === 1\n methods.push({\n isBare: false,\n name: createSanitizableString(m.name, sanitizer),\n desc: m.desc,\n baseNameIsUnique,\n uniqueName: createSanitizableString(baseNameIsUnique ? m.name : abiMethod.getSignature(), sanitizer),\n args: abiMethod.args.map((a): MethodArgClientContext => {\n return {\n name: a.name ? createSanitizableString(a.name, sanitizer) : undefined,\n desc: a.description,\n type: a.type,\n tsInType: getEquivalentType(a.type, 'input', sanitizer),\n defaultValue: Boolean(a.defaultValue),\n }\n }),\n callActions: buildOcas(m.actions.call),\n createActions: buildOcas(m.actions.create),\n readonly: Boolean(m.readonly),\n signature: abiMethod.getSignature(),\n returns: {\n tsOutType: getEquivalentType(abiMethod.returns.type, 'output', sanitizer),\n type: abiMethod.returns.type === 'void' ? undefined : abiMethod.returns.type,\n desc: abiMethod.returns.description,\n },\n })\n }\n\n const bareMethod: BareMethodClientContext = {\n isBare: true,\n createActions: buildOcas(appSpec.bareActions.create),\n callActions: buildOcas(appSpec.bareActions.call),\n }\n if (bareMethod.createActions.any || bareMethod.callActions.any) {\n methods.push(bareMethod)\n }\n\n return {\n name: createSanitizableString(appSpec.name, sanitizer),\n methods,\n bareMethod,\n createMethods: methods.filter((m) => m.createActions.any),\n updateMethods: methods.filter((m) => m.callActions.updateApplication),\n deleteMethods: methods.filter((m) => m.callActions.deleteApplication),\n noOpMethods: methods.filter((m) => m.callActions.noOp),\n optInMethods: methods.filter((m) => m.callActions.optIn),\n closeOutMethods: methods.filter((m) => m.callActions.closeOut),\n clearStateMethods: methods.filter((m) => m.callActions.clearState),\n abiMethods: methods.filter(isAbiMethod),\n\n state: {\n maps: {\n global: buildStorageMap(appSpec.state.maps.global, appSpec, sanitizer),\n local: buildStorageMap(appSpec.state.maps.local, appSpec, sanitizer),\n box: buildStorageMap(appSpec.state.maps.box, appSpec, sanitizer),\n },\n keys: {\n global: buildStorageKey(appSpec.state.keys.global, appSpec, sanitizer),\n local: buildStorageKey(appSpec.state.keys.local, appSpec, sanitizer),\n box: buildStorageKey(appSpec.state.keys.box, appSpec, sanitizer),\n },\n },\n\n structs: mapRecord(appSpec.structs, (def, name) => buildStructCtx(name, appSpec, sanitizer)),\n\n templateVariables: mapRecord(appSpec.templateVariables ?? {}, (v) => ({\n value: v.value,\n type: buildTypeContext(v.type, appSpec, sanitizer),\n })),\n }\n}\n\nfunction buildStructCtx(name: string, appSpec: Arc56Contract, sanitizer: Sanitizer): StructContext {\n const typeCtx = buildTypeContext(name, appSpec, sanitizer)\n\n const abiType = typeCtx.type\n invariant(abiType instanceof ABIStructType)\n\n return {\n type: typeCtx,\n tsObjDef: buildStructObjDef(abiType.structFields, appSpec, sanitizer, 1),\n tsTupDef: `[${Array.from(buildStructTupleDef(abiType.structFields, appSpec, sanitizer)).join(', ')}]`,\n }\n}\n\nfunction buildStructObjDef(fields: ABIStructField[], appSpec: Arc56Contract, sanitizer: Sanitizer, indent: number): string {\n const indentStr = ' '.repeat(indent)\n const closingIndent = ' '.repeat(indent - 1)\n const lines: string[] = []\n\n for (const field of fields) {\n const typeDef = Array.isArray(field.type)\n ? buildStructObjDef(field.type, appSpec, sanitizer, indent + 1)\n : abiTypeToTs(field.type, 'output', sanitizer)\n lines.push(`${indentStr}${sanitizer.makeSafePropertyIdentifier(field.name)}: ${typeDef}`)\n }\n\n return `{\\n${lines.join(',\\n')}\\n${closingIndent}}`\n}\nfunction* buildStructTupleDef(fields: ABIStructField[], appSpec: Arc56Contract, sanitizer: Sanitizer) {\n for (const field of fields) {\n let typeDef: string\n if (Array.isArray(field.type)) {\n typeDef = `[${Array.from(buildStructTupleDef(field.type, appSpec, sanitizer)).join(', ')}]`\n } else {\n typeDef = abiTypeToTs(field.type, 'output', sanitizer)\n }\n yield `${typeDef}`\n }\n}\n\nfunction buildStorageMap(\n maps: Record<string, StorageMap>,\n appSpec: Arc56Contract,\n sanitizer: Sanitizer,\n): Record<string, StorageMapContext> {\n return mapRecord(maps, (v) => ({\n desc: v.desc,\n valueType: buildTypeContext(v.valueType, appSpec, sanitizer),\n keyType: buildTypeContext(v.keyType, appSpec, sanitizer),\n prefix: v.prefix,\n }))\n}\nfunction buildStorageKey(\n keys: Record<string, StorageKey>,\n appSpec: Arc56Contract,\n sanitizer: Sanitizer,\n): Record<string, StorageKeyContext> {\n return mapRecord(keys, (v) => ({\n desc: v.desc,\n valueType: buildTypeContext(v.valueType, appSpec, sanitizer),\n keyType: buildTypeContext(v.valueType, appSpec, sanitizer),\n key: v.key,\n }))\n}\n\nfunction mapRecord<TIn, TOut>(input: Record<string, TIn>, mapper: (value: TIn, key: string) => TOut): Record<string, TOut> {\n return Object.fromEntries(Object.entries(input).map(([k, v]) => [k, mapper(v, k)]))\n}\n\nfunction createSanitizableString(name: string, sanitizer: Sanitizer): SanitizableString {\n return new Proxy<SanitizableString>({} as SanitizableString, {\n get(target, property) {\n if (property === 'toString') return () => name\n if (property === 'original') return name\n if (property in sanitizer) {\n return sanitizer[property as keyof Sanitizer](name)\n }\n },\n })\n}\n\nfunction buildOcas(actions: string[]): MethodOcas {\n const isOptional = actions.includes('NoOp') || actions.length === 1\n const typeLiteral = actions.length\n ? `{ onComplete${isOptional ? '?' : ''}: ${actions.map((oc) => `OnApplicationComplete.${oc}`).join(' | ')} }`\n : undefined\n\n return {\n raw: actions,\n any: Boolean(actions.length),\n noOp: actions.includes('NoOp'),\n optIn: actions.includes('OptIn'),\n closeOut: actions.includes('CloseOut'),\n clearState: actions.includes('ClearState'),\n updateApplication: actions.includes('UpdateApplication'),\n deleteApplication: actions.includes('DeleteApplication'),\n\n inputType: {\n isOptional,\n typeLiteral,\n },\n }\n}\n\nfunction buildTypeContext(typeName: string, appSpec: Arc56Contract, sanitizer: Sanitizer): TypeContext {\n switch (typeName) {\n case 'AVMBytes':\n return {\n isAvmBytes: true,\n type: typeName,\n tsInType: 'Uint8Array | string',\n tsOutType: 'Uint8Array',\n }\n case 'AVMString':\n return {\n type: typeName,\n tsInType: 'string',\n tsOutType: 'string',\n }\n case 'AVMUint64':\n return {\n type: typeName,\n tsInType: 'bigint',\n tsOutType: 'bigint',\n }\n }\n if (typeName in appSpec.structs) {\n return {\n type: ABIStructType.fromStruct(typeName, appSpec.structs),\n tsInType: sanitizer.makeSafeTypeIdentifier(typeName),\n tsOutType: sanitizer.makeSafeTypeIdentifier(typeName),\n }\n }\n // Otherwise parse as ABI type\n try {\n const abiType = ABIType.from(typeName)\n return {\n type: abiType,\n tsInType: abiTypeToTs(abiType, 'input', sanitizer),\n tsOutType: abiTypeToTs(abiType, 'output', sanitizer),\n }\n } catch (error) {\n throw new Error(`Failed to parse storage type '${typeName}': ${error}`)\n }\n}\n"],"names":["arc56MethodToABIMethod","getEquivalentType","invariant","ABIStructType","abiTypeToTs","ABIType"],"mappings":"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"}