@algorandfoundation/algokit-client-generator 4.0.0-beta.1 → 4.0.0-beta.10
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.
- package/cli.d.ts +6 -0
- package/cli.js +47 -16
- package/cli.js.map +1 -1
- package/cli.mjs +47 -17
- package/cli.mjs.map +1 -1
- package/client/app-client.js +115 -49
- package/client/app-client.js.map +1 -1
- package/client/app-client.mjs +115 -49
- package/client/app-client.mjs.map +1 -1
- package/client/app-factory.js +49 -35
- package/client/app-factory.js.map +1 -1
- package/client/app-factory.mjs +49 -35
- package/client/app-factory.mjs.map +1 -1
- package/client/app-types.js +98 -102
- package/client/app-types.js.map +1 -1
- package/client/app-types.mjs +100 -104
- package/client/app-types.mjs.map +1 -1
- package/client/call-composer-types.js +9 -9
- package/client/call-composer-types.js.map +1 -1
- package/client/call-composer-types.mjs +9 -9
- package/client/call-composer-types.mjs.map +1 -1
- package/client/call-composer.js +25 -23
- package/client/call-composer.js.map +1 -1
- package/client/call-composer.mjs +25 -23
- package/client/call-composer.mjs.map +1 -1
- package/client/deploy-types.js +9 -9
- package/client/deploy-types.js.map +1 -1
- package/client/deploy-types.mjs +9 -9
- package/client/deploy-types.mjs.map +1 -1
- package/client/generate.js +6 -7
- package/client/generate.js.map +1 -1
- package/client/generate.mjs +6 -7
- package/client/generate.mjs.map +1 -1
- package/client/helpers/get-equivalent-type.js +9 -3
- package/client/helpers/get-equivalent-type.js.map +1 -1
- package/client/helpers/get-equivalent-type.mjs +9 -3
- package/client/helpers/get-equivalent-type.mjs.map +1 -1
- package/client/imports.js +8 -5
- package/client/imports.js.map +1 -1
- package/client/imports.mjs +8 -5
- package/client/imports.mjs.map +1 -1
- package/client/params-factory.js +12 -12
- package/client/params-factory.js.map +1 -1
- package/client/params-factory.mjs +12 -12
- package/client/params-factory.mjs.map +1 -1
- package/output/writer.d.ts +5 -5
- package/output/writer.js +9 -3
- package/output/writer.js.map +1 -1
- package/output/writer.mjs +9 -3
- package/output/writer.mjs.map +1 -1
- package/package.json +9 -5
- package/schema/arc56.schema.json.js +465 -501
- package/schema/arc56.schema.json.js.map +1 -1
- package/schema/arc56.schema.json.mjs +462 -501
- package/schema/arc56.schema.json.mjs.map +1 -1
- package/schema/load.js +7 -1
- package/schema/load.js.map +1 -1
- package/schema/load.mjs +7 -1
- package/schema/load.mjs.map +1 -1
- package/util/sanitization.js +13 -8
- package/util/sanitization.js.map +1 -1
- package/util/sanitization.mjs +13 -8
- package/util/sanitization.mjs.map +1 -1
package/client/app-types.js
CHANGED
|
@@ -4,11 +4,77 @@ var writer = require('../output/writer.js');
|
|
|
4
4
|
var getEquivalentType = require('./helpers/get-equivalent-type.js');
|
|
5
5
|
var algosdk = require('algosdk');
|
|
6
6
|
|
|
7
|
+
function getMethodMetadata(method, ctx) {
|
|
8
|
+
const { methodSignatureToUniqueName } = ctx;
|
|
9
|
+
const methodSig = new algosdk.ABIMethod(method).getSignature();
|
|
10
|
+
const uniqueName = methodSignatureToUniqueName[methodSig];
|
|
11
|
+
let hasAppCallArgToTheRight = false;
|
|
12
|
+
const argsMeta = new Array();
|
|
13
|
+
for (let i = (method.args ?? []).length - 1; i >= 0; i--) {
|
|
14
|
+
const arg = method.args[i];
|
|
15
|
+
argsMeta.push({
|
|
16
|
+
...arg,
|
|
17
|
+
name: arg.name ?? `arg${i + 1}`,
|
|
18
|
+
isOptional: !!arg.defaultValue || (hasAppCallArgToTheRight && algosdk.abiTypeIsTransaction(arg.type)),
|
|
19
|
+
tsType: getEquivalentType.getEquivalentType(arg.struct ?? arg.type, 'input', ctx),
|
|
20
|
+
});
|
|
21
|
+
if (!hasAppCallArgToTheRight &&
|
|
22
|
+
algosdk.abiTypeIsTransaction(arg.type) &&
|
|
23
|
+
[algosdk.ABITransactionType.appl, algosdk.ABITransactionType.any].includes(arg.type)) {
|
|
24
|
+
hasAppCallArgToTheRight = true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
argsMeta.reverse();
|
|
28
|
+
return { methodSig, uniqueName, argsMeta };
|
|
29
|
+
}
|
|
7
30
|
function* appTypes(ctx) {
|
|
8
|
-
yield* abiTypes(ctx);
|
|
9
31
|
yield* structTypes(ctx);
|
|
10
32
|
yield* templateVariableTypes(ctx);
|
|
11
|
-
const { app,
|
|
33
|
+
const { app, name } = ctx;
|
|
34
|
+
yield* writer.jsDoc(`The argument types for the ${name} contract`);
|
|
35
|
+
yield `export type ${name}Args = {`;
|
|
36
|
+
yield writer.IncIndent;
|
|
37
|
+
yield* writer.jsDoc('The object representation of the arguments for each method');
|
|
38
|
+
yield 'obj: {';
|
|
39
|
+
yield writer.IncIndent;
|
|
40
|
+
for (const method of app.methods) {
|
|
41
|
+
const { methodSig, argsMeta } = getMethodMetadata(method, ctx);
|
|
42
|
+
if (argsMeta.length) {
|
|
43
|
+
yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': {`;
|
|
44
|
+
yield writer.IncIndent;
|
|
45
|
+
for (const arg of argsMeta) {
|
|
46
|
+
if (arg.desc)
|
|
47
|
+
yield* writer.jsDoc(arg.desc);
|
|
48
|
+
yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.isOptional ? '?' : ''}: ${arg.tsType}`;
|
|
49
|
+
}
|
|
50
|
+
yield writer.DecIndentAndCloseBlock;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': Record<string, never>`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
yield writer.DecIndentAndCloseBlock;
|
|
57
|
+
yield* writer.jsDoc('The tuple representation of the arguments for each method');
|
|
58
|
+
yield 'tuple: {';
|
|
59
|
+
yield writer.IncIndent;
|
|
60
|
+
for (const method of app.methods) {
|
|
61
|
+
const { methodSig, argsMeta } = getMethodMetadata(method, ctx);
|
|
62
|
+
yield* writer.inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': [`, argsMeta
|
|
63
|
+
.map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.isOptional ? ' | undefined' : ''}`)
|
|
64
|
+
.join(', '), ']');
|
|
65
|
+
}
|
|
66
|
+
yield writer.DecIndentAndCloseBlock;
|
|
67
|
+
yield writer.DecIndentAndCloseBlock;
|
|
68
|
+
yield writer.NewLine;
|
|
69
|
+
yield* writer.jsDoc('The return type for each method');
|
|
70
|
+
yield `export type ${name}Returns = {`;
|
|
71
|
+
yield writer.IncIndent;
|
|
72
|
+
for (const method of app.methods) {
|
|
73
|
+
const { methodSig } = getMethodMetadata(method, ctx);
|
|
74
|
+
yield* writer.inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': ${getEquivalentType.getEquivalentType(method.returns.struct ?? method.returns.type ?? 'void', 'output', ctx)}`);
|
|
75
|
+
}
|
|
76
|
+
yield writer.DecIndentAndCloseBlock;
|
|
77
|
+
yield writer.NewLine;
|
|
12
78
|
yield* writer.jsDoc(`Defines the types of available calls and state of the ${name} smart contract.`);
|
|
13
79
|
yield `export type ${name}Types = {`;
|
|
14
80
|
yield writer.IncIndent;
|
|
@@ -21,32 +87,14 @@ function* appTypes(ctx) {
|
|
|
21
87
|
}
|
|
22
88
|
yield writer.IncIndent;
|
|
23
89
|
for (const method of app.methods) {
|
|
24
|
-
const methodSig =
|
|
25
|
-
|
|
26
|
-
const uniqueName = methodSignatureToUniqueName[methodSig];
|
|
27
|
-
const uniqueNameSafe = ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName);
|
|
28
|
-
yield `& Record<'${methodSigSafe}'${methodSig !== uniqueName ? ` | '${uniqueNameSafe}'` : ''}, {`;
|
|
29
|
-
yield writer.IncIndent;
|
|
30
|
-
yield `argsObj: {`;
|
|
90
|
+
const { methodSig, uniqueName } = getMethodMetadata(method, ctx);
|
|
91
|
+
yield `& Record<'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}'${methodSig !== uniqueName ? ` | '${ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName)}'` : ''}, {`;
|
|
31
92
|
yield writer.IncIndent;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
name: arg.name ?? `arg${i + 1}`,
|
|
35
|
-
hasDefault: !!arg.defaultValue,
|
|
36
|
-
tsType: getEquivalentType.getEquivalentType(arg.struct ?? arg.type, 'input', ctx),
|
|
37
|
-
}));
|
|
38
|
-
for (const arg of argsMeta) {
|
|
39
|
-
if (arg.desc)
|
|
40
|
-
yield* writer.jsDoc(arg.desc);
|
|
41
|
-
yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.hasDefault ? '?' : ''}: ${arg.tsType}`;
|
|
42
|
-
}
|
|
43
|
-
yield writer.DecIndentAndCloseBlock;
|
|
44
|
-
yield* writer.inline(`argsTuple: [`, argsMeta
|
|
45
|
-
.map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.hasDefault ? ' | undefined' : ''}`)
|
|
46
|
-
.join(', '), ']');
|
|
93
|
+
yield `argsObj: ${name}Args['obj']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`;
|
|
94
|
+
yield `argsTuple: ${name}Args['tuple']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`;
|
|
47
95
|
if (method.returns.desc)
|
|
48
96
|
yield* writer.jsDoc(method.returns.desc);
|
|
49
|
-
yield `returns: ${
|
|
97
|
+
yield `returns: ${name}Returns['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`;
|
|
50
98
|
yield writer.DecIndent;
|
|
51
99
|
yield '}>';
|
|
52
100
|
}
|
|
@@ -71,11 +119,11 @@ function* appTypes(ctx) {
|
|
|
71
119
|
/**
|
|
72
120
|
* Defines an object containing all relevant parameters for a single call to the contract.
|
|
73
121
|
*/
|
|
74
|
-
export type CallParams<
|
|
122
|
+
export type CallParams<TArgs> = Expand<
|
|
75
123
|
Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &
|
|
76
124
|
{
|
|
77
125
|
/** The args for the ABI method call, either as an ordered array or an object */
|
|
78
|
-
args: Expand<
|
|
126
|
+
args: Expand<TArgs>
|
|
79
127
|
}
|
|
80
128
|
>
|
|
81
129
|
/**
|
|
@@ -113,95 +161,43 @@ function* appTypes(ctx) {
|
|
|
113
161
|
}
|
|
114
162
|
yield writer.NewLine;
|
|
115
163
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const pushType = (type) => {
|
|
120
|
-
// If we already have this type, skip
|
|
121
|
-
if (abiTypes.includes(type))
|
|
122
|
-
return;
|
|
123
|
-
// void and string are the same types in TS
|
|
124
|
-
if (['void', 'string'].includes(type))
|
|
125
|
-
return;
|
|
126
|
-
// Skip structs
|
|
127
|
-
if (app.structs[type])
|
|
128
|
-
return;
|
|
129
|
-
// If this is an array type, push the base type
|
|
130
|
-
if (type.match(/\[\d*\]$/)) {
|
|
131
|
-
pushType(type.replace(/\[\d*\]$/, ''));
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
if (type.startsWith('(')) {
|
|
135
|
-
const tupleType = algosdk.ABITupleType.from(type);
|
|
136
|
-
tupleType.childTypes.forEach((t) => {
|
|
137
|
-
pushType(t.toString());
|
|
138
|
-
});
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
abiTypes.push(type);
|
|
142
|
-
};
|
|
143
|
-
Object.values(app.templateVariables ?? {}).forEach((t) => {
|
|
144
|
-
pushType(t.type);
|
|
145
|
-
});
|
|
146
|
-
app.methods.forEach((m) => {
|
|
147
|
-
m.args.forEach((a) => {
|
|
148
|
-
pushType(a.type);
|
|
149
|
-
});
|
|
150
|
-
pushType(m.returns.type);
|
|
151
|
-
});
|
|
152
|
-
['global', 'local', 'box'].forEach((storageType) => {
|
|
153
|
-
Object.values(app.state.keys[storageType]).forEach((k) => {
|
|
154
|
-
pushType(k.keyType);
|
|
155
|
-
pushType(k.valueType);
|
|
156
|
-
});
|
|
157
|
-
Object.values(app.state.maps[storageType]).forEach((m) => {
|
|
158
|
-
pushType(m.keyType);
|
|
159
|
-
pushType(m.valueType);
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
const pushStructFields = (fields) => {
|
|
163
|
-
Object.values(fields).forEach((sf) => {
|
|
164
|
-
if (typeof sf === 'string')
|
|
165
|
-
pushType(sf);
|
|
166
|
-
else
|
|
167
|
-
pushStructFields(sf);
|
|
168
|
-
});
|
|
169
|
-
};
|
|
170
|
-
Object.values(app.structs).forEach((sf) => {
|
|
171
|
-
pushStructFields(sf);
|
|
172
|
-
});
|
|
173
|
-
yield '// Aliases for non-encoded ABI values';
|
|
174
|
-
yield writer.NewLine;
|
|
175
|
-
for (const t of abiTypes) {
|
|
176
|
-
yield `type ${t} = ${getEquivalentType.getEquivalentType(t, 'output', ctx)};`;
|
|
177
|
-
}
|
|
178
|
-
yield writer.NewLine;
|
|
164
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
165
|
+
function getStructAsObject(struct, ctx) {
|
|
166
|
+
return Object.fromEntries(struct.map((s) => [s.name, typeof s.type === 'string' ? getEquivalentType.getEquivalentType(s.type, 'output', ctx) : getStructAsObject(s.type, ctx)]));
|
|
179
167
|
}
|
|
180
|
-
function
|
|
168
|
+
function getStructAsTupleTypes(struct, ctx) {
|
|
169
|
+
return `[${struct.map((s) => (Array.isArray(s.type) ? getStructAsTupleTypes(s.type, ctx) : getEquivalentType.getEquivalentType(s.type, 'output', ctx))).join(', ')}]`;
|
|
170
|
+
}
|
|
171
|
+
function* structTypes(ctx) {
|
|
172
|
+
const { app, sanitizer } = ctx;
|
|
181
173
|
if (Object.keys(app.structs).length === 0)
|
|
182
174
|
return;
|
|
183
175
|
yield '// Type definitions for ARC-56 structs';
|
|
184
176
|
yield writer.NewLine;
|
|
185
177
|
for (const structName of Object.keys(app.structs)) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
178
|
+
// Emit the struct type
|
|
179
|
+
yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${JSON.stringify(getStructAsObject(app.structs[structName], ctx), null, 2).replace(/"/g, '')}`;
|
|
180
|
+
yield writer.NewLine;
|
|
181
|
+
// Emit method that converts ABI tuple to the struct object
|
|
182
|
+
yield* writer.jsDoc(`Converts the ABI tuple representation of a ${structName} to the struct representation`);
|
|
183
|
+
yield* writer.inline(`export function ${sanitizer.makeSafeTypeIdentifier(structName)}FromTuple(`, `abiTuple: ${getStructAsTupleTypes(app.structs[structName], ctx)}`, `) {`);
|
|
184
|
+
yield* writer.indent(`return getABIStructFromABITuple(abiTuple, APP_SPEC.structs${sanitizer.getSafeMemberAccessor(structName)}, APP_SPEC.structs) as ${sanitizer.makeSafeTypeIdentifier(structName)}`);
|
|
185
|
+
yield '}';
|
|
186
|
+
yield writer.NewLine;
|
|
191
187
|
}
|
|
192
|
-
yield writer.NewLine;
|
|
193
188
|
}
|
|
194
|
-
function* templateVariableTypes(
|
|
195
|
-
if (Object.keys(app.templateVariables ?? {}).length === 0) {
|
|
189
|
+
function* templateVariableTypes(ctx) {
|
|
190
|
+
if (Object.keys(ctx.app.templateVariables ?? {}).length === 0) {
|
|
196
191
|
return;
|
|
197
192
|
}
|
|
198
193
|
yield* writer.jsDoc('Deploy-time template variables');
|
|
199
194
|
yield 'export type TemplateVariables = {';
|
|
200
195
|
yield writer.IncIndent;
|
|
201
|
-
for (const name of Object.keys(app.templateVariables ?? {})) {
|
|
202
|
-
yield `${name}: ${app.templateVariables[name].type},`;
|
|
196
|
+
for (const name of Object.keys(ctx.app.templateVariables ?? {})) {
|
|
197
|
+
yield `${name}: ${getEquivalentType.getEquivalentType(ctx.app.templateVariables[name].type, 'output', ctx)},`;
|
|
203
198
|
}
|
|
204
199
|
yield writer.DecIndentAndCloseBlock;
|
|
200
|
+
yield writer.NewLine;
|
|
205
201
|
}
|
|
206
202
|
function* keysAndMaps(app, sanitizer, keys, maps) {
|
|
207
203
|
if (keys && Object.keys(keys).length) {
|
|
@@ -213,7 +209,7 @@ function* keysAndMaps(app, sanitizer, keys, maps) {
|
|
|
213
209
|
yield* writer.jsDoc(prop.desc);
|
|
214
210
|
}
|
|
215
211
|
const keySafe = sanitizer.makeSafePropertyIdentifier(name);
|
|
216
|
-
yield `${keySafe}: ${prop.valueType === '
|
|
212
|
+
yield `${keySafe}: ${prop.valueType === 'AVMBytes' ? 'BinaryState' : getEquivalentType.getEquivalentType(prop.valueType, 'output', { app, sanitizer })}`;
|
|
217
213
|
}
|
|
218
214
|
yield writer.DecIndentAndCloseBlock;
|
|
219
215
|
}
|
package/client/app-types.js.map
CHANGED
|
@@ -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 { 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":";;;;;;AAOe,UAAE,QAAQ,CAAC,GAAqB,EAAA;AAC7C,IAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;AACpB,IAAA,OAAO,WAAW,CAAC,GAAG,CAAC,CAAA;AACvB,IAAA,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAA;IAEjC,MAAM,EAAE,GAAG,EAAE,2BAA2B,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IACtD,OAAOA,YAAK,CAAC,yDAAyD,IAAI,CAAA,gBAAA,CAAkB,CAAC,CAAA;IAC7F,MAAM,CAAA,YAAA,EAAe,IAAI,CAAA,SAAA,CAAW,CAAA;AACpC,IAAA,MAAMC,gBAAS,CAAA;AACf,IAAA,OAAOD,YAAK,CAAC,oEAAoE,CAAC,CAAA;IAClF,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;AAC3B,QAAA,MAAM,aAAa,CAAA;KACpB;SAAM;AACL,QAAA,MAAM,UAAU,CAAA;KACjB;AACD,IAAA,MAAMC,gBAAS,CAAA;AACf,IAAA,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE;QAChC,MAAM,SAAS,GAAG,IAAIC,iBAAS,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,CAAA;QACtD,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA;AACxE,QAAA,MAAM,UAAU,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAA;QACzD,MAAM,cAAc,GAAG,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAA;AAC1E,QAAA,MAAM,aAAa,aAAa,CAAA,CAAA,EAAI,SAAS,KAAK,UAAU,GAAG,CAAA,IAAA,EAAO,cAAc,CAAG,CAAA,CAAA,GAAG,EAAE,KAAK,CAAA;AACjG,QAAA,MAAMD,gBAAS,CAAA;AACf,QAAA,MAAM,YAAY,CAAA;AAClB,QAAA,MAAMA,gBAAS,CAAA;AAEf,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM;AAC5C,YAAA,GAAG,GAAG;YACN,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAM,GAAA,EAAA,CAAC,GAAG,CAAC,CAAE,CAAA;AAC/B,YAAA,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY;AAC9B,YAAA,MAAM,EAAEE,mCAAiB,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC;AAChE,SAAA,CAAC,CAAC,CAAA;AAEH,QAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,GAAG,CAAC,IAAI;gBAAE,OAAOH,YAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACpC,YAAA,MAAM,CAAG,EAAA,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,CAAA,EAAA,EAAK,GAAG,CAAC,MAAM,CAAA,CAAE,CAAA;SACzG;AACD,QAAA,MAAMI,6BAAsB,CAAA;AAC5B,QAAA,OAAOC,aAAM,CACX,CAAA,YAAA,CAAc,EACd,QAAQ;AACL,aAAA,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA,EAAG,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAK,EAAA,EAAA,GAAG,CAAC,MAAM,CAAG,EAAA,GAAG,CAAC,UAAU,GAAG,cAAc,GAAG,EAAE,EAAE,CAAC;AAC3H,aAAA,IAAI,CAAC,IAAI,CAAC,EACb,GAAG,CACJ,CAAA;AACD,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI;YAAE,OAAOL,YAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC1D,MAAM,CAAA,SAAA,EAAYG,mCAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA,CAAE,CAAA;AAE5G,QAAA,MAAMG,gBAAS,CAAA;AACf,QAAA,MAAM,IAAI,CAAA;KACX;AACD,IAAA,MAAMA,gBAAS,CAAA;IAEf,MAAM,QAAQ,GACZ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;SACpE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACxE,MAAM,SAAS,GACb,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;SACtE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC1E,MAAM,MAAM,GACV,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAC1I,IAAA,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;AAErD,IAAA,MAAMF,6BAAsB,CAAA;AAC5B,IAAA,MAAMG,cAAO,CAAA;IAEb,MAAM,CAAA;;;;AAIQ,cAAA,EAAA,IAAI,sBAAsB,IAAI,CAAA;;;;gBAI9B,IAAI,CAAA,gCAAA,EAAmC,IAAI,CAAA,mDAAA,EAAsD,IAAI,CAAA;;;;8CAIvE,IAAI,CAAA;;;;;;;;wCAQV,IAAI,CAAA;;AAEE,4CAAA,EAAA,IAAI,iBAAiB,IAAI,CAAA;;wCAE/B,IAAI,CAAA;;AAEI,8CAAA,EAAA,IAAI,iBAAiB,IAAI,CAAA;GACtE,CAAA;IAED,IAAI,SAAS,EAAE;QACb,MAAM,CAAA;;;;sCAI4B,IAAI,CAAA;KACrC,CAAA;KACF;IAED,IAAI,QAAQ,EAAE;QACZ,MAAM,CAAA;;;;qCAI2B,IAAI,CAAA;KACpC,CAAA;KACF;IAED,IAAI,MAAM,EAAE;QACV,MAAM,CAAA;;;;mCAIyB,IAAI,CAAA;KAClC,CAAA;KACF;AAED,IAAA,MAAMA,cAAO,CAAA;AACf,CAAC;AAED,UAAU,QAAQ,CAAC,GAAqB,EAAA;AACtC,IAAA,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;IACnB,MAAM,QAAQ,GAAa,EAAE,CAAA;AAE7B,IAAA,MAAM,QAAQ,GAAG,CAAC,IAAY,KAAI;;AAEhC,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAM;;QAGnC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAM;;AAG7C,QAAA,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAM;;AAG7B,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;YAC1B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAA;YACtC,OAAM;SACP;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACxB,MAAM,SAAS,GAAGC,oBAAY,CAAC,IAAI,CAAC,IAAI,CAAiB,CAAA;YAEzD,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACjC,gBAAA,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;AACxB,aAAC,CAAC,CAAA;YAEF,OAAM;SACP;AAED,QAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACrB,KAAC,CAAA;AAED,IAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACvD,QAAA,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAClB,KAAC,CAAC,CAAA;IAEF,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;QACxB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACnB,YAAA,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAClB,SAAC,CAAC,CAAA;AAEF,QAAA,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAC1B,KAAC,CAAC,CACD;AAAC,IAAA,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAgC,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AAClF,QAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACvD,YAAA,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AACnB,YAAA,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;AACvB,SAAC,CAAC,CAAA;AAEF,QAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACvD,YAAA,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AACnB,YAAA,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;AACvB,SAAC,CAAC,CAAA;AACJ,KAAC,CAAC,CAAA;AAEF,IAAA,MAAM,gBAAgB,GAAG,CAAC,MAAoB,KAAI;QAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;YACnC,IAAI,OAAO,EAAE,KAAK,QAAQ;gBAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;;gBACnC,gBAAgB,CAAC,EAAE,CAAC,CAAA;AAC3B,SAAC,CAAC,CAAA;AACJ,KAAC,CAAA;AAED,IAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;QACxC,gBAAgB,CAAC,EAAE,CAAC,CAAA;AACtB,KAAC,CAAC,CAAA;AAEF,IAAA,MAAM,uCAAuC,CAAA;AAC7C,IAAA,MAAMD,cAAO,CAAA;AACb,IAAA,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE;AACxB,QAAA,MAAM,CAAQ,KAAA,EAAA,CAAC,CAAM,GAAA,EAAAJ,mCAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;KAC5D;AACD,IAAA,MAAMI,cAAO,CAAA;AACf,CAAC;AAED,UAAU,WAAW,CAAC,EAAE,GAAG,EAAE,SAAS,EAAoB,EAAA;IACxD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;AAEjD,IAAA,MAAM,wCAAwC,CAAA;AAC9C,IAAA,MAAMA,cAAO,CAAA;AAEb,IAAA,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QACjD,MAAM,CAAA,YAAA,EAAe,SAAS,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAM,GAAA,EAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AACpH,aAAA,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AACjB,aAAA,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;AACpB,aAAA,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;AACpB,aAAA,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAA;KAC/B;AAED,IAAA,MAAMA,cAAO,CAAA;AACf,CAAC;AAED,UAAU,qBAAqB,CAAC,EAAE,GAAG,EAAoB,EAAA;AACvD,IAAA,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;QACzD,OAAM;KACP;AAED,IAAA,OAAOP,YAAK,CAAC,gCAAgC,CAAC,CAAA;AAC9C,IAAA,MAAM,mCAAmC,CAAA;AACzC,IAAA,MAAMC,gBAAS,CAAA;AAEf,IAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE;AAC3D,QAAA,MAAM,CAAG,EAAA,IAAI,CAAK,EAAA,EAAA,GAAG,CAAC,iBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA,CAAA,CAAG,CAAA;KACvD;AAED,IAAA,MAAMG,6BAAsB,CAAA;AAC9B,CAAC;AAED,UAAU,WAAW,CACnB,GAAkB,EAClB,SAAoB,EACpB,IAEC,EACD,IAEC,EAAA;IAED,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;AACpC,QAAA,MAAM,SAAS,CAAA;AACf,QAAA,MAAMH,gBAAS,CAAA;QACf,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACpC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;AACvB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,OAAOD,YAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;aACxB;YACD,MAAM,OAAO,GAAG,SAAS,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAA;AAE1D,YAAA,MAAM,CAAG,EAAA,OAAO,CAAK,EAAA,EAAA,IAAI,CAAC,SAAS,KAAK,OAAO,GAAG,aAAa,GAAGG,mCAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;SACpI;AACD,QAAA,MAAMC,6BAAsB,CAAA;KAC7B;IAED,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;AACpC,QAAA,MAAM,SAAS,CAAA;AACf,QAAA,MAAMH,gBAAS,CAAA;QACf,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACpC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;AACvB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,OAAOD,YAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;aACxB;YACD,MAAM,OAAO,GAAG,SAAS,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAA;AAE1D,YAAA,MAAM,CAAG,EAAA,OAAO,CAAS,MAAA,EAAAG,mCAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA,EAAA,EAAKA,mCAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG,CAAA;SAC7J;AACD,QAAA,MAAMC,6BAAsB,CAAA;KAC7B;AACH,CAAC;AAED,UAAU,QAAQ,CAChB,EAAE,GAAG,EAAE,SAAS,EAAoB,EACpC,UAAsE,EAAA;IAEtE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAA;AAElD,IAAA,IAAI,QAAQ,IAAI,SAAS,EAAE;AACzB,QAAA,OAAOJ,YAAK,CAAC,oDAAoD,CAAC,CAAA;AAClE,QAAA,MAAM,UAAU,CAAA;AAChB,QAAA,MAAMC,gBAAS,CAAA;QACf,IAAI,SAAS,EAAE;AACb,YAAA,MAAM,WAAW,CAAA;AACjB,YAAA,MAAMA,gBAAS,CAAA;YACf,OAAO,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAChF,YAAA,MAAMG,6BAAsB,CAAA;SAC7B;QACD,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,UAAU,CAAA;AAChB,YAAA,MAAMH,gBAAS,CAAA;YACf,OAAO,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC9E,YAAA,MAAMG,6BAAsB,CAAA;SAC7B;QACD,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,QAAQ,CAAA;AACd,YAAA,MAAMH,gBAAS,CAAA;YACf,OAAO,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1E,YAAA,MAAMG,6BAAsB,CAAA;SAC7B;AACD,QAAA,MAAMA,6BAAsB,CAAA;KAC7B;AACH;;;;"}
|
|
1
|
+
{"version":3,"file":"app-types.js","sources":["../../src/client/app-types.ts"],"sourcesContent":["import { GeneratorContext } from './generator-context'\nimport { DecIndent, DecIndentAndCloseBlock, DocumentParts, IncIndent, indent, inline, jsDoc, NewLine } from '../output/writer'\nimport { getEquivalentType } from './helpers/get-equivalent-type'\nimport algosdk, { ABIMethod } from 'algosdk'\nimport { Arc56Contract, Method, StorageKey, StorageMap, StructField } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport { Sanitizer } from '../util/sanitization'\nimport { Expand } from '@algorandfoundation/algokit-utils/types/expand'\n\nfunction getMethodMetadata(method: Method, ctx: GeneratorContext) {\n const { methodSignatureToUniqueName } = ctx\n const methodSig = new ABIMethod(method).getSignature()\n const uniqueName = methodSignatureToUniqueName[methodSig]\n\n let hasAppCallArgToTheRight = false\n const argsMeta = new Array<Expand<Omit<(typeof method.args)[0], 'name'> & { name: string; isOptional: boolean; tsType: string }>>()\n\n for (let i = (method.args ?? []).length - 1; i >= 0; i--) {\n const arg = method.args[i]\n\n argsMeta.push({\n ...arg,\n name: arg.name ?? `arg${i + 1}`,\n isOptional: !!arg.defaultValue || (hasAppCallArgToTheRight && algosdk.abiTypeIsTransaction(arg.type)),\n tsType: getEquivalentType(arg.struct ?? arg.type, 'input', ctx),\n })\n\n if (\n !hasAppCallArgToTheRight &&\n algosdk.abiTypeIsTransaction(arg.type) &&\n [algosdk.ABITransactionType.appl, algosdk.ABITransactionType.any].includes(arg.type)\n ) {\n hasAppCallArgToTheRight = true\n }\n }\n argsMeta.reverse()\n\n return { methodSig, uniqueName, argsMeta }\n}\n\nexport function* appTypes(ctx: GeneratorContext): DocumentParts {\n yield* structTypes(ctx)\n yield* templateVariableTypes(ctx)\n\n const { app, name } = ctx\n\n yield* jsDoc(`The argument types for the ${name} contract`)\n yield `export type ${name}Args = {`\n yield IncIndent\n yield* jsDoc('The object representation of the arguments for each method')\n yield 'obj: {'\n yield IncIndent\n for (const method of app.methods) {\n const { methodSig, argsMeta } = getMethodMetadata(method, ctx)\n if (argsMeta.length) {\n yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': {`\n yield IncIndent\n for (const arg of argsMeta) {\n if (arg.desc) yield* jsDoc(arg.desc)\n yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.isOptional ? '?' : ''}: ${arg.tsType}`\n }\n yield DecIndentAndCloseBlock\n } else {\n yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': Record<string, never>`\n }\n }\n yield DecIndentAndCloseBlock\n\n yield* jsDoc('The tuple representation of the arguments for each method')\n yield 'tuple: {'\n yield IncIndent\n for (const method of app.methods) {\n const { methodSig, argsMeta } = getMethodMetadata(method, ctx)\n yield* inline(\n `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': [`,\n argsMeta\n .map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.isOptional ? ' | undefined' : ''}`)\n .join(', '),\n ']',\n )\n }\n yield DecIndentAndCloseBlock\n\n yield DecIndentAndCloseBlock\n yield NewLine\n\n yield* jsDoc('The return type for each method')\n yield `export type ${name}Returns = {`\n yield IncIndent\n for (const method of app.methods) {\n const { methodSig } = getMethodMetadata(method, ctx)\n yield* inline(\n `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': ${getEquivalentType(method.returns.struct ?? method.returns.type ?? 'void', 'output', ctx)}`,\n )\n }\n yield DecIndentAndCloseBlock\n yield NewLine\n\n yield* jsDoc(`Defines the types of available calls and state of the ${name} smart contract.`)\n yield `export type ${name}Types = {`\n yield IncIndent\n yield* jsDoc('Maps method signatures / names to their argument and return types.')\n if (app.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, uniqueName } = getMethodMetadata(method, ctx)\n yield `& Record<'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}'${methodSig !== uniqueName ? ` | '${ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName)}'` : ''}, {`\n yield IncIndent\n yield `argsObj: ${name}Args['obj']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`\n yield `argsTuple: ${name}Args['tuple']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`\n\n if (method.returns.desc) yield* jsDoc(method.returns.desc)\n yield `returns: ${name}Returns['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`\n\n yield DecIndent\n yield '}>'\n }\n yield DecIndent\n\n const hasLocal =\n (app.state.keys.local && Object.keys(app.state.keys.local).length > 0) ||\n (app.state.maps.local && Object.keys(app.state.maps.local).length > 0)\n const hasGlobal =\n (app.state.keys.global && Object.keys(app.state.keys.global).length > 0) ||\n (app.state.maps.global && Object.keys(app.state.maps.global).length > 0)\n const hasBox =\n (app.state.keys.box && Object.keys(app.state.keys.box).length > 0) || (app.state.maps.box && Object.keys(app.state.maps.box).length > 0)\n yield* appState(ctx, { hasBox, hasGlobal, hasLocal })\n\n yield DecIndentAndCloseBlock\n yield NewLine\n\n yield `\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<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n >\n /**\n * Maps a method signature from the ${name} smart contract to the method's arguments in either tuple or struct form\n */\n export type MethodArgs<TSignature extends ${name}Signatures> = ${name}Types['methods'][TSignature]['argsObj' | 'argsTuple']\n /**\n * Maps a method signature from the ${name} smart contract to the method's return type\n */\n export type MethodReturn<TSignature extends ${name}Signatures> = ${name}Types['methods'][TSignature]['returns']\n `\n\n if (hasGlobal) {\n yield `\n /**\n * Defines the shape of the keyed global state of the application.\n */\n export type GlobalKeysState = ${name}Types['state']['global']['keys']\n `\n }\n\n if (hasLocal) {\n yield `\n /**\n * Defines the shape of the keyed local state of the application.\n */\n export type LocalKeysState = ${name}Types['state']['local']['keys']\n `\n }\n\n if (hasBox) {\n yield `\n /**\n * Defines the shape of the keyed box state of the application.\n */\n export type BoxKeysState = ${name}Types['state']['box']['keys']\n `\n }\n\n yield NewLine\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction getStructAsObject(struct: StructField[], ctx: GeneratorContext): Record<string, any> {\n return Object.fromEntries(\n struct.map((s) => [s.name, typeof s.type === 'string' ? getEquivalentType(s.type, 'output', ctx) : getStructAsObject(s.type, ctx)]),\n )\n}\n\nfunction getStructAsTupleTypes(struct: StructField[], ctx: GeneratorContext): string {\n return `[${struct.map((s) => (Array.isArray(s.type) ? getStructAsTupleTypes(s.type, ctx) : getEquivalentType(s.type, 'output', ctx))).join(', ')}]`\n}\n\nfunction* structTypes(ctx: GeneratorContext): DocumentParts {\n const { app, sanitizer } = ctx\n if (Object.keys(app.structs).length === 0) return\n\n yield '// Type definitions for ARC-56 structs'\n yield NewLine\n\n for (const structName of Object.keys(app.structs)) {\n // Emit the struct type\n\n yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${JSON.stringify(getStructAsObject(app.structs[structName], ctx), null, 2).replace(/\"/g, '')}`\n yield NewLine\n\n // Emit method that converts ABI tuple to the struct object\n yield* jsDoc(`Converts the ABI tuple representation of a ${structName} to the struct representation`)\n yield* inline(\n `export function ${sanitizer.makeSafeTypeIdentifier(structName)}FromTuple(`,\n `abiTuple: ${getStructAsTupleTypes(app.structs[structName], ctx)}`,\n `) {`,\n )\n yield* indent(\n `return getABIStructFromABITuple(abiTuple, APP_SPEC.structs${sanitizer.getSafeMemberAccessor(structName)}, APP_SPEC.structs) as ${sanitizer.makeSafeTypeIdentifier(structName)}`,\n )\n yield '}'\n yield NewLine\n }\n}\n\nfunction* templateVariableTypes(ctx: GeneratorContext): DocumentParts {\n if (Object.keys(ctx.app.templateVariables ?? {}).length === 0) {\n return\n }\n\n yield* jsDoc('Deploy-time template variables')\n yield 'export type TemplateVariables = {'\n yield IncIndent\n\n for (const name of Object.keys(ctx.app.templateVariables ?? {})) {\n yield `${name}: ${getEquivalentType(ctx.app.templateVariables![name].type, 'output', ctx)},`\n }\n\n yield DecIndentAndCloseBlock\n yield NewLine\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 === 'AVMBytes' ? '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":["ABIMethod","getEquivalentType","jsDoc","IncIndent","DecIndentAndCloseBlock","inline","NewLine","DecIndent","indent"],"mappings":";;;;;;AAQA,SAAS,iBAAiB,CAAC,MAAc,EAAE,GAAqB,EAAA;AAC9D,IAAA,MAAM,EAAE,2BAA2B,EAAE,GAAG,GAAG,CAAA;IAC3C,MAAM,SAAS,GAAG,IAAIA,iBAAS,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,CAAA;AACtD,IAAA,MAAM,UAAU,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAA;IAEzD,IAAI,uBAAuB,GAAG,KAAK,CAAA;AACnC,IAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAyG,CAAA;IAEnI,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE1B,QAAQ,CAAC,IAAI,CAAC;AACZ,YAAA,GAAG,GAAG;YACN,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAM,GAAA,EAAA,CAAC,GAAG,CAAC,CAAE,CAAA;AAC/B,YAAA,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,KAAK,uBAAuB,IAAI,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrG,YAAA,MAAM,EAAEC,mCAAiB,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC;AAChE,SAAA,CAAC,CAAA;AAEF,QAAA,IACE,CAAC,uBAAuB;AACxB,YAAA,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;YACtC,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EACpF;YACA,uBAAuB,GAAG,IAAI,CAAA;SAC/B;KACF;IACD,QAAQ,CAAC,OAAO,EAAE,CAAA;AAElB,IAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAA;AAC5C,CAAC;AAEc,UAAE,QAAQ,CAAC,GAAqB,EAAA;AAC7C,IAAA,OAAO,WAAW,CAAC,GAAG,CAAC,CAAA;AACvB,IAAA,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAA;AAEjC,IAAA,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IAEzB,OAAOC,YAAK,CAAC,8BAA8B,IAAI,CAAA,SAAA,CAAW,CAAC,CAAA;IAC3D,MAAM,CAAA,YAAA,EAAe,IAAI,CAAA,QAAA,CAAU,CAAA;AACnC,IAAA,MAAMC,gBAAS,CAAA;AACf,IAAA,OAAOD,YAAK,CAAC,4DAA4D,CAAC,CAAA;AAC1E,IAAA,MAAM,QAAQ,CAAA;AACd,IAAA,MAAMC,gBAAS,CAAA;AACf,IAAA,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE;AAChC,QAAA,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAC9D,QAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;YACnB,MAAM,CAAA,CAAA,EAAI,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA,IAAA,CAAM,CAAA;AAClE,YAAA,MAAMA,gBAAS,CAAA;AACf,YAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;gBAC1B,IAAI,GAAG,CAAC,IAAI;oBAAE,OAAOD,YAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACpC,gBAAA,MAAM,CAAG,EAAA,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,CAAA,EAAA,EAAK,GAAG,CAAC,MAAM,CAAA,CAAE,CAAA;aACzG;AACD,YAAA,MAAME,6BAAsB,CAAA;SAC7B;aAAM;YACL,MAAM,CAAA,CAAA,EAAI,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA,wBAAA,CAA0B,CAAA;SACvF;KACF;AACD,IAAA,MAAMA,6BAAsB,CAAA;AAE5B,IAAA,OAAOF,YAAK,CAAC,2DAA2D,CAAC,CAAA;AACzE,IAAA,MAAM,UAAU,CAAA;AAChB,IAAA,MAAMC,gBAAS,CAAA;AACf,IAAA,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE;AAChC,QAAA,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAC9D,QAAA,OAAOE,aAAM,CACX,IAAI,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA,IAAA,CAAM,EAC5D,QAAQ;AACL,aAAA,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA,EAAG,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAK,EAAA,EAAA,GAAG,CAAC,MAAM,CAAG,EAAA,GAAG,CAAC,UAAU,GAAG,cAAc,GAAG,EAAE,EAAE,CAAC;AAC3H,aAAA,IAAI,CAAC,IAAI,CAAC,EACb,GAAG,CACJ,CAAA;KACF;AACD,IAAA,MAAMD,6BAAsB,CAAA;AAE5B,IAAA,MAAMA,6BAAsB,CAAA;AAC5B,IAAA,MAAME,cAAO,CAAA;AAEb,IAAA,OAAOJ,YAAK,CAAC,iCAAiC,CAAC,CAAA;IAC/C,MAAM,CAAA,YAAA,EAAe,IAAI,CAAA,WAAA,CAAa,CAAA;AACtC,IAAA,MAAMC,gBAAS,CAAA;AACf,IAAA,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE;QAChC,MAAM,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACpD,QAAA,OAAOE,aAAM,CACX,CAAA,CAAA,EAAI,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAM,GAAA,EAAAJ,mCAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA,CAAE,CACvJ,CAAA;KACF;AACD,IAAA,MAAMG,6BAAsB,CAAA;AAC5B,IAAA,MAAME,cAAO,CAAA;IAEb,OAAOJ,YAAK,CAAC,yDAAyD,IAAI,CAAA,gBAAA,CAAkB,CAAC,CAAA;IAC7F,MAAM,CAAA,YAAA,EAAe,IAAI,CAAA,SAAA,CAAW,CAAA;AACpC,IAAA,MAAMC,gBAAS,CAAA;AACf,IAAA,OAAOD,YAAK,CAAC,oEAAoE,CAAC,CAAA;IAClF,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;AAC3B,QAAA,MAAM,aAAa,CAAA;KACpB;SAAM;AACL,QAAA,MAAM,UAAU,CAAA;KACjB;AACD,IAAA,MAAMC,gBAAS,CAAA;AACf,IAAA,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE;AAChC,QAAA,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAChE,QAAA,MAAM,CAAa,UAAA,EAAA,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA,CAAA,EAAI,SAAS,KAAK,UAAU,GAAG,CAAA,IAAA,EAAO,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAA,CAAA,CAAG,GAAG,EAAE,KAAK,CAAA;AAC3K,QAAA,MAAMA,gBAAS,CAAA;AACf,QAAA,MAAM,CAAY,SAAA,EAAA,IAAI,CAAgB,aAAA,EAAA,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA,EAAA,CAAI,CAAA;AAC5F,QAAA,MAAM,CAAc,WAAA,EAAA,IAAI,CAAkB,eAAA,EAAA,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA,EAAA,CAAI,CAAA;AAEhG,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI;YAAE,OAAOD,YAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAC1D,QAAA,MAAM,CAAY,SAAA,EAAA,IAAI,CAAY,SAAA,EAAA,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA,EAAA,CAAI,CAAA;AAExF,QAAA,MAAMK,gBAAS,CAAA;AACf,QAAA,MAAM,IAAI,CAAA;KACX;AACD,IAAA,MAAMA,gBAAS,CAAA;IAEf,MAAM,QAAQ,GACZ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;SACpE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACxE,MAAM,SAAS,GACb,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;SACtE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC1E,MAAM,MAAM,GACV,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAC1I,IAAA,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;AAErD,IAAA,MAAMH,6BAAsB,CAAA;AAC5B,IAAA,MAAME,cAAO,CAAA;IAEb,MAAM,CAAA;;;;AAIQ,cAAA,EAAA,IAAI,sBAAsB,IAAI,CAAA;;;;gBAI9B,IAAI,CAAA,gCAAA,EAAmC,IAAI,CAAA,mDAAA,EAAsD,IAAI,CAAA;;;;;;;;;;;;wCAY7E,IAAI,CAAA;;AAEE,4CAAA,EAAA,IAAI,iBAAiB,IAAI,CAAA;;wCAE/B,IAAI,CAAA;;AAEI,8CAAA,EAAA,IAAI,iBAAiB,IAAI,CAAA;GACtE,CAAA;IAED,IAAI,SAAS,EAAE;QACb,MAAM,CAAA;;;;sCAI4B,IAAI,CAAA;KACrC,CAAA;KACF;IAED,IAAI,QAAQ,EAAE;QACZ,MAAM,CAAA;;;;qCAI2B,IAAI,CAAA;KACpC,CAAA;KACF;IAED,IAAI,MAAM,EAAE;QACV,MAAM,CAAA;;;;mCAIyB,IAAI,CAAA;KAClC,CAAA;KACF;AAED,IAAA,MAAMA,cAAO,CAAA;AACf,CAAC;AAED;AACA,SAAS,iBAAiB,CAAC,MAAqB,EAAE,GAAqB,EAAA;IACrE,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,GAAGL,mCAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CACpI,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAqB,EAAE,GAAqB,EAAA;IACzE,OAAO,CAAA,CAAA,EAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,GAAGA,mCAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACrJ,CAAC;AAED,UAAU,WAAW,CAAC,GAAqB,EAAA;AACzC,IAAA,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG,CAAA;IAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;AAEjD,IAAA,MAAM,wCAAwC,CAAA;AAC9C,IAAA,MAAMK,cAAO,CAAA;AAEb,IAAA,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;;AAGjD,QAAA,MAAM,eAAe,SAAS,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAA;AACnK,QAAA,MAAMA,cAAO,CAAA;;QAGb,OAAOJ,YAAK,CAAC,8CAA8C,UAAU,CAAA,6BAAA,CAA+B,CAAC,CAAA;AACrG,QAAA,OAAOG,aAAM,CACX,CAAmB,gBAAA,EAAA,SAAS,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAA,UAAA,CAAY,EAC3E,CAAA,UAAA,EAAa,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE,EAClE,CAAA,GAAA,CAAK,CACN,CAAA;QACD,OAAOG,aAAM,CACX,6DAA6D,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAA0B,uBAAA,EAAA,SAAS,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAA,CAAE,CACjL,CAAA;AACD,QAAA,MAAM,GAAG,CAAA;AACT,QAAA,MAAMF,cAAO,CAAA;KACd;AACH,CAAC;AAED,UAAU,qBAAqB,CAAC,GAAqB,EAAA;AACnD,IAAA,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;QAC7D,OAAM;KACP;AAED,IAAA,OAAOJ,YAAK,CAAC,gCAAgC,CAAC,CAAA;AAC9C,IAAA,MAAM,mCAAmC,CAAA;AACzC,IAAA,MAAMC,gBAAS,CAAA;AAEf,IAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE;QAC/D,MAAM,CAAA,EAAG,IAAI,CAAK,EAAA,EAAAF,mCAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;KAC7F;AAED,IAAA,MAAMG,6BAAsB,CAAA;AAC5B,IAAA,MAAME,cAAO,CAAA;AACf,CAAC;AAED,UAAU,WAAW,CACnB,GAAkB,EAClB,SAAoB,EACpB,IAEC,EACD,IAEC,EAAA;IAED,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;AACpC,QAAA,MAAM,SAAS,CAAA;AACf,QAAA,MAAMH,gBAAS,CAAA;QACf,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACpC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;AACvB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,OAAOD,YAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;aACxB;YACD,MAAM,OAAO,GAAG,SAAS,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAA;AAE1D,YAAA,MAAM,CAAG,EAAA,OAAO,CAAK,EAAA,EAAA,IAAI,CAAC,SAAS,KAAK,UAAU,GAAG,aAAa,GAAGD,mCAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;SACvI;AACD,QAAA,MAAMG,6BAAsB,CAAA;KAC7B;IAED,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;AACpC,QAAA,MAAM,SAAS,CAAA;AACf,QAAA,MAAMD,gBAAS,CAAA;QACf,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACpC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;AACvB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,OAAOD,YAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;aACxB;YACD,MAAM,OAAO,GAAG,SAAS,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAA;AAE1D,YAAA,MAAM,CAAG,EAAA,OAAO,CAAS,MAAA,EAAAD,mCAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA,EAAA,EAAKA,mCAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG,CAAA;SAC7J;AACD,QAAA,MAAMG,6BAAsB,CAAA;KAC7B;AACH,CAAC;AAED,UAAU,QAAQ,CAChB,EAAE,GAAG,EAAE,SAAS,EAAoB,EACpC,UAAsE,EAAA;IAEtE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAA;AAElD,IAAA,IAAI,QAAQ,IAAI,SAAS,EAAE;AACzB,QAAA,OAAOF,YAAK,CAAC,oDAAoD,CAAC,CAAA;AAClE,QAAA,MAAM,UAAU,CAAA;AAChB,QAAA,MAAMC,gBAAS,CAAA;QACf,IAAI,SAAS,EAAE;AACb,YAAA,MAAM,WAAW,CAAA;AACjB,YAAA,MAAMA,gBAAS,CAAA;YACf,OAAO,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAChF,YAAA,MAAMC,6BAAsB,CAAA;SAC7B;QACD,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,UAAU,CAAA;AAChB,YAAA,MAAMD,gBAAS,CAAA;YACf,OAAO,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC9E,YAAA,MAAMC,6BAAsB,CAAA;SAC7B;QACD,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,QAAQ,CAAA;AACd,YAAA,MAAMD,gBAAS,CAAA;YACf,OAAO,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1E,YAAA,MAAMC,6BAAsB,CAAA;SAC7B;AACD,QAAA,MAAMA,6BAAsB,CAAA;KAC7B;AACH;;;;"}
|
package/client/app-types.mjs
CHANGED
|
@@ -1,12 +1,78 @@
|
|
|
1
|
-
import { jsDoc, IncIndent, DecIndentAndCloseBlock, inline, DecIndent,
|
|
1
|
+
import { jsDoc, IncIndent, DecIndentAndCloseBlock, inline, NewLine, DecIndent, indent } from '../output/writer.mjs';
|
|
2
2
|
import { getEquivalentType } from './helpers/get-equivalent-type.mjs';
|
|
3
|
-
import { ABIMethod
|
|
3
|
+
import algosdk, { ABIMethod } from 'algosdk';
|
|
4
4
|
|
|
5
|
+
function getMethodMetadata(method, ctx) {
|
|
6
|
+
const { methodSignatureToUniqueName } = ctx;
|
|
7
|
+
const methodSig = new ABIMethod(method).getSignature();
|
|
8
|
+
const uniqueName = methodSignatureToUniqueName[methodSig];
|
|
9
|
+
let hasAppCallArgToTheRight = false;
|
|
10
|
+
const argsMeta = new Array();
|
|
11
|
+
for (let i = (method.args ?? []).length - 1; i >= 0; i--) {
|
|
12
|
+
const arg = method.args[i];
|
|
13
|
+
argsMeta.push({
|
|
14
|
+
...arg,
|
|
15
|
+
name: arg.name ?? `arg${i + 1}`,
|
|
16
|
+
isOptional: !!arg.defaultValue || (hasAppCallArgToTheRight && algosdk.abiTypeIsTransaction(arg.type)),
|
|
17
|
+
tsType: getEquivalentType(arg.struct ?? arg.type, 'input', ctx),
|
|
18
|
+
});
|
|
19
|
+
if (!hasAppCallArgToTheRight &&
|
|
20
|
+
algosdk.abiTypeIsTransaction(arg.type) &&
|
|
21
|
+
[algosdk.ABITransactionType.appl, algosdk.ABITransactionType.any].includes(arg.type)) {
|
|
22
|
+
hasAppCallArgToTheRight = true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
argsMeta.reverse();
|
|
26
|
+
return { methodSig, uniqueName, argsMeta };
|
|
27
|
+
}
|
|
5
28
|
function* appTypes(ctx) {
|
|
6
|
-
yield* abiTypes(ctx);
|
|
7
29
|
yield* structTypes(ctx);
|
|
8
30
|
yield* templateVariableTypes(ctx);
|
|
9
|
-
const { app,
|
|
31
|
+
const { app, name } = ctx;
|
|
32
|
+
yield* jsDoc(`The argument types for the ${name} contract`);
|
|
33
|
+
yield `export type ${name}Args = {`;
|
|
34
|
+
yield IncIndent;
|
|
35
|
+
yield* jsDoc('The object representation of the arguments for each method');
|
|
36
|
+
yield 'obj: {';
|
|
37
|
+
yield IncIndent;
|
|
38
|
+
for (const method of app.methods) {
|
|
39
|
+
const { methodSig, argsMeta } = getMethodMetadata(method, ctx);
|
|
40
|
+
if (argsMeta.length) {
|
|
41
|
+
yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': {`;
|
|
42
|
+
yield IncIndent;
|
|
43
|
+
for (const arg of argsMeta) {
|
|
44
|
+
if (arg.desc)
|
|
45
|
+
yield* jsDoc(arg.desc);
|
|
46
|
+
yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.isOptional ? '?' : ''}: ${arg.tsType}`;
|
|
47
|
+
}
|
|
48
|
+
yield DecIndentAndCloseBlock;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
yield `'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': Record<string, never>`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
yield DecIndentAndCloseBlock;
|
|
55
|
+
yield* jsDoc('The tuple representation of the arguments for each method');
|
|
56
|
+
yield 'tuple: {';
|
|
57
|
+
yield IncIndent;
|
|
58
|
+
for (const method of app.methods) {
|
|
59
|
+
const { methodSig, argsMeta } = getMethodMetadata(method, ctx);
|
|
60
|
+
yield* inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': [`, argsMeta
|
|
61
|
+
.map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.isOptional ? ' | undefined' : ''}`)
|
|
62
|
+
.join(', '), ']');
|
|
63
|
+
}
|
|
64
|
+
yield DecIndentAndCloseBlock;
|
|
65
|
+
yield DecIndentAndCloseBlock;
|
|
66
|
+
yield NewLine;
|
|
67
|
+
yield* jsDoc('The return type for each method');
|
|
68
|
+
yield `export type ${name}Returns = {`;
|
|
69
|
+
yield IncIndent;
|
|
70
|
+
for (const method of app.methods) {
|
|
71
|
+
const { methodSig } = getMethodMetadata(method, ctx);
|
|
72
|
+
yield* inline(`'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}': ${getEquivalentType(method.returns.struct ?? method.returns.type ?? 'void', 'output', ctx)}`);
|
|
73
|
+
}
|
|
74
|
+
yield DecIndentAndCloseBlock;
|
|
75
|
+
yield NewLine;
|
|
10
76
|
yield* jsDoc(`Defines the types of available calls and state of the ${name} smart contract.`);
|
|
11
77
|
yield `export type ${name}Types = {`;
|
|
12
78
|
yield IncIndent;
|
|
@@ -19,32 +85,14 @@ function* appTypes(ctx) {
|
|
|
19
85
|
}
|
|
20
86
|
yield IncIndent;
|
|
21
87
|
for (const method of app.methods) {
|
|
22
|
-
const methodSig =
|
|
23
|
-
|
|
24
|
-
const uniqueName = methodSignatureToUniqueName[methodSig];
|
|
25
|
-
const uniqueNameSafe = ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName);
|
|
26
|
-
yield `& Record<'${methodSigSafe}'${methodSig !== uniqueName ? ` | '${uniqueNameSafe}'` : ''}, {`;
|
|
27
|
-
yield IncIndent;
|
|
28
|
-
yield `argsObj: {`;
|
|
88
|
+
const { methodSig, uniqueName } = getMethodMetadata(method, ctx);
|
|
89
|
+
yield `& Record<'${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}'${methodSig !== uniqueName ? ` | '${ctx.sanitizer.makeSafeStringTypeLiteral(uniqueName)}'` : ''}, {`;
|
|
29
90
|
yield IncIndent;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
name: arg.name ?? `arg${i + 1}`,
|
|
33
|
-
hasDefault: !!arg.defaultValue,
|
|
34
|
-
tsType: getEquivalentType(arg.struct ?? arg.type, 'input', ctx),
|
|
35
|
-
}));
|
|
36
|
-
for (const arg of argsMeta) {
|
|
37
|
-
if (arg.desc)
|
|
38
|
-
yield* jsDoc(arg.desc);
|
|
39
|
-
yield `${ctx.sanitizer.makeSafePropertyIdentifier(arg.name)}${arg.hasDefault ? '?' : ''}: ${arg.tsType}`;
|
|
40
|
-
}
|
|
41
|
-
yield DecIndentAndCloseBlock;
|
|
42
|
-
yield* inline(`argsTuple: [`, argsMeta
|
|
43
|
-
.map((arg) => `${ctx.sanitizer.makeSafeVariableIdentifier(arg.name)}: ${arg.tsType}${arg.hasDefault ? ' | undefined' : ''}`)
|
|
44
|
-
.join(', '), ']');
|
|
91
|
+
yield `argsObj: ${name}Args['obj']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`;
|
|
92
|
+
yield `argsTuple: ${name}Args['tuple']['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`;
|
|
45
93
|
if (method.returns.desc)
|
|
46
94
|
yield* jsDoc(method.returns.desc);
|
|
47
|
-
yield `returns: ${
|
|
95
|
+
yield `returns: ${name}Returns['${ctx.sanitizer.makeSafeStringTypeLiteral(methodSig)}']`;
|
|
48
96
|
yield DecIndent;
|
|
49
97
|
yield '}>';
|
|
50
98
|
}
|
|
@@ -69,11 +117,11 @@ function* appTypes(ctx) {
|
|
|
69
117
|
/**
|
|
70
118
|
* Defines an object containing all relevant parameters for a single call to the contract.
|
|
71
119
|
*/
|
|
72
|
-
export type CallParams<
|
|
120
|
+
export type CallParams<TArgs> = Expand<
|
|
73
121
|
Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &
|
|
74
122
|
{
|
|
75
123
|
/** The args for the ABI method call, either as an ordered array or an object */
|
|
76
|
-
args: Expand<
|
|
124
|
+
args: Expand<TArgs>
|
|
77
125
|
}
|
|
78
126
|
>
|
|
79
127
|
/**
|
|
@@ -111,95 +159,43 @@ function* appTypes(ctx) {
|
|
|
111
159
|
}
|
|
112
160
|
yield NewLine;
|
|
113
161
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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;
|
|
162
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
163
|
+
function getStructAsObject(struct, ctx) {
|
|
164
|
+
return Object.fromEntries(struct.map((s) => [s.name, typeof s.type === 'string' ? getEquivalentType(s.type, 'output', ctx) : getStructAsObject(s.type, ctx)]));
|
|
177
165
|
}
|
|
178
|
-
function
|
|
166
|
+
function getStructAsTupleTypes(struct, ctx) {
|
|
167
|
+
return `[${struct.map((s) => (Array.isArray(s.type) ? getStructAsTupleTypes(s.type, ctx) : getEquivalentType(s.type, 'output', ctx))).join(', ')}]`;
|
|
168
|
+
}
|
|
169
|
+
function* structTypes(ctx) {
|
|
170
|
+
const { app, sanitizer } = ctx;
|
|
179
171
|
if (Object.keys(app.structs).length === 0)
|
|
180
172
|
return;
|
|
181
173
|
yield '// Type definitions for ARC-56 structs';
|
|
182
174
|
yield NewLine;
|
|
183
175
|
for (const structName of Object.keys(app.structs)) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
176
|
+
// Emit the struct type
|
|
177
|
+
yield `export type ${sanitizer.makeSafeTypeIdentifier(structName)} = ${JSON.stringify(getStructAsObject(app.structs[structName], ctx), null, 2).replace(/"/g, '')}`;
|
|
178
|
+
yield NewLine;
|
|
179
|
+
// Emit method that converts ABI tuple to the struct object
|
|
180
|
+
yield* jsDoc(`Converts the ABI tuple representation of a ${structName} to the struct representation`);
|
|
181
|
+
yield* inline(`export function ${sanitizer.makeSafeTypeIdentifier(structName)}FromTuple(`, `abiTuple: ${getStructAsTupleTypes(app.structs[structName], ctx)}`, `) {`);
|
|
182
|
+
yield* indent(`return getABIStructFromABITuple(abiTuple, APP_SPEC.structs${sanitizer.getSafeMemberAccessor(structName)}, APP_SPEC.structs) as ${sanitizer.makeSafeTypeIdentifier(structName)}`);
|
|
183
|
+
yield '}';
|
|
184
|
+
yield NewLine;
|
|
189
185
|
}
|
|
190
|
-
yield NewLine;
|
|
191
186
|
}
|
|
192
|
-
function* templateVariableTypes(
|
|
193
|
-
if (Object.keys(app.templateVariables ?? {}).length === 0) {
|
|
187
|
+
function* templateVariableTypes(ctx) {
|
|
188
|
+
if (Object.keys(ctx.app.templateVariables ?? {}).length === 0) {
|
|
194
189
|
return;
|
|
195
190
|
}
|
|
196
191
|
yield* jsDoc('Deploy-time template variables');
|
|
197
192
|
yield 'export type TemplateVariables = {';
|
|
198
193
|
yield IncIndent;
|
|
199
|
-
for (const name of Object.keys(app.templateVariables ?? {})) {
|
|
200
|
-
yield `${name}: ${app.templateVariables[name].type},`;
|
|
194
|
+
for (const name of Object.keys(ctx.app.templateVariables ?? {})) {
|
|
195
|
+
yield `${name}: ${getEquivalentType(ctx.app.templateVariables[name].type, 'output', ctx)},`;
|
|
201
196
|
}
|
|
202
197
|
yield DecIndentAndCloseBlock;
|
|
198
|
+
yield NewLine;
|
|
203
199
|
}
|
|
204
200
|
function* keysAndMaps(app, sanitizer, keys, maps) {
|
|
205
201
|
if (keys && Object.keys(keys).length) {
|
|
@@ -211,7 +207,7 @@ function* keysAndMaps(app, sanitizer, keys, maps) {
|
|
|
211
207
|
yield* jsDoc(prop.desc);
|
|
212
208
|
}
|
|
213
209
|
const keySafe = sanitizer.makeSafePropertyIdentifier(name);
|
|
214
|
-
yield `${keySafe}: ${prop.valueType === '
|
|
210
|
+
yield `${keySafe}: ${prop.valueType === 'AVMBytes' ? 'BinaryState' : getEquivalentType(prop.valueType, 'output', { app, sanitizer })}`;
|
|
215
211
|
}
|
|
216
212
|
yield DecIndentAndCloseBlock;
|
|
217
213
|
}
|