@algorandfoundation/algokit-client-generator 3.1.0-beta.1 → 4.0.0-alpha.2

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 (139) hide show
  1. package/README.md +1 -1
  2. package/cli.d.ts +6 -0
  3. package/{src/cli.js → cli.js} +47 -16
  4. package/cli.js.map +1 -0
  5. package/cli.mjs +86 -0
  6. package/cli.mjs.map +1 -0
  7. package/{src/client → client}/app-client.js +101 -44
  8. package/client/app-client.js.map +1 -0
  9. package/{src/client → client}/app-client.mjs +101 -44
  10. package/client/app-client.mjs.map +1 -0
  11. package/{src/client → client}/app-factory.js +49 -35
  12. package/client/app-factory.js.map +1 -0
  13. package/{src/client → client}/app-factory.mjs +49 -35
  14. package/client/app-factory.mjs.map +1 -0
  15. package/{src/client → client}/app-types.js +98 -102
  16. package/client/app-types.js.map +1 -0
  17. package/{src/client → client}/app-types.mjs +100 -104
  18. package/client/app-types.mjs.map +1 -0
  19. package/{src/client → client}/call-composer-types.js +9 -9
  20. package/client/call-composer-types.js.map +1 -0
  21. package/{src/client → client}/call-composer-types.mjs +9 -9
  22. package/client/call-composer-types.mjs.map +1 -0
  23. package/{src/client → client}/call-composer.js +25 -23
  24. package/client/call-composer.js.map +1 -0
  25. package/{src/client → client}/call-composer.mjs +25 -23
  26. package/client/call-composer.mjs.map +1 -0
  27. package/{src/client → client}/deploy-types.js +9 -9
  28. package/client/deploy-types.js.map +1 -0
  29. package/{src/client → client}/deploy-types.mjs +9 -9
  30. package/client/deploy-types.mjs.map +1 -0
  31. package/{src/client → client}/generate.js +6 -7
  32. package/client/generate.js.map +1 -0
  33. package/{src/client → client}/generate.mjs +6 -7
  34. package/client/generate.mjs.map +1 -0
  35. package/client/generator-context.js.map +1 -0
  36. package/client/generator-context.mjs.map +1 -0
  37. package/client/helpers/get-call-config-summary.js.map +1 -0
  38. package/client/helpers/get-call-config-summary.mjs.map +1 -0
  39. package/{src/client → client}/helpers/get-equivalent-type.js +9 -3
  40. package/client/helpers/get-equivalent-type.js.map +1 -0
  41. package/{src/client → client}/helpers/get-equivalent-type.mjs +9 -3
  42. package/client/helpers/get-equivalent-type.mjs.map +1 -0
  43. package/client/imports.js +28 -0
  44. package/client/imports.js.map +1 -0
  45. package/client/imports.mjs +26 -0
  46. package/client/imports.mjs.map +1 -0
  47. package/{src/client → client}/params-factory.js +12 -12
  48. package/client/params-factory.js.map +1 -0
  49. package/{src/client → client}/params-factory.mjs +12 -12
  50. package/client/params-factory.mjs.map +1 -0
  51. package/client/utility-types.js.map +1 -0
  52. package/client/utility-types.mjs.map +1 -0
  53. package/output/writer.d.ts +5 -5
  54. package/{src/output → output}/writer.js +9 -3
  55. package/output/writer.js.map +1 -0
  56. package/{src/output → output}/writer.mjs +9 -3
  57. package/output/writer.mjs.map +1 -0
  58. package/package.json +9 -5
  59. package/schema/arc56.schema.json.js +751 -0
  60. package/{src/schema → schema}/arc56.schema.json.js.map +1 -1
  61. package/schema/arc56.schema.json.mjs +741 -0
  62. package/{src/schema → schema}/arc56.schema.json.mjs.map +1 -1
  63. package/{src/schema → schema}/load.js +8 -2
  64. package/schema/load.js.map +1 -0
  65. package/{src/schema → schema}/load.mjs +8 -2
  66. package/schema/load.mjs.map +1 -0
  67. package/util/boom.js.map +1 -0
  68. package/util/boom.mjs.map +1 -0
  69. package/util/color-console.js.map +1 -0
  70. package/util/color-console.mjs.map +1 -0
  71. package/{src/util → util}/sanitization.js +13 -8
  72. package/util/sanitization.js.map +1 -0
  73. package/{src/util → util}/sanitization.mjs +13 -8
  74. package/util/sanitization.mjs.map +1 -0
  75. package/src/cli.js.map +0 -1
  76. package/src/cli.mjs +0 -56
  77. package/src/cli.mjs.map +0 -1
  78. package/src/client/app-client.js.map +0 -1
  79. package/src/client/app-client.mjs.map +0 -1
  80. package/src/client/app-factory.js.map +0 -1
  81. package/src/client/app-factory.mjs.map +0 -1
  82. package/src/client/app-types.js.map +0 -1
  83. package/src/client/app-types.mjs.map +0 -1
  84. package/src/client/call-composer-types.js.map +0 -1
  85. package/src/client/call-composer-types.mjs.map +0 -1
  86. package/src/client/call-composer.js.map +0 -1
  87. package/src/client/call-composer.mjs.map +0 -1
  88. package/src/client/deploy-types.js.map +0 -1
  89. package/src/client/deploy-types.mjs.map +0 -1
  90. package/src/client/generate.js.map +0 -1
  91. package/src/client/generate.mjs.map +0 -1
  92. package/src/client/generator-context.js.map +0 -1
  93. package/src/client/generator-context.mjs.map +0 -1
  94. package/src/client/helpers/get-call-config-summary.js.map +0 -1
  95. package/src/client/helpers/get-call-config-summary.mjs.map +0 -1
  96. package/src/client/helpers/get-equivalent-type.js.map +0 -1
  97. package/src/client/helpers/get-equivalent-type.mjs.map +0 -1
  98. package/src/client/imports.js +0 -25
  99. package/src/client/imports.js.map +0 -1
  100. package/src/client/imports.mjs +0 -23
  101. package/src/client/imports.mjs.map +0 -1
  102. package/src/client/params-factory.js.map +0 -1
  103. package/src/client/params-factory.mjs.map +0 -1
  104. package/src/client/utility-types.js.map +0 -1
  105. package/src/client/utility-types.mjs.map +0 -1
  106. package/src/output/writer.js.map +0 -1
  107. package/src/output/writer.mjs.map +0 -1
  108. package/src/schema/arc56.schema.json.js +0 -787
  109. package/src/schema/arc56.schema.json.mjs +0 -780
  110. package/src/schema/load.js.map +0 -1
  111. package/src/schema/load.mjs.map +0 -1
  112. package/src/util/boom.js.map +0 -1
  113. package/src/util/boom.mjs.map +0 -1
  114. package/src/util/color-console.js.map +0 -1
  115. package/src/util/color-console.mjs.map +0 -1
  116. package/src/util/sanitization.js.map +0 -1
  117. package/src/util/sanitization.mjs.map +0 -1
  118. /package/{src/client → client}/generator-context.js +0 -0
  119. /package/{src/client → client}/generator-context.mjs +0 -0
  120. /package/{src/client → client}/helpers/get-call-config-summary.js +0 -0
  121. /package/{src/client → client}/helpers/get-call-config-summary.mjs +0 -0
  122. /package/{src/client → client}/utility-types.js +0 -0
  123. /package/{src/client → client}/utility-types.mjs +0 -0
  124. /package/{src/index.js → index.js} +0 -0
  125. /package/{src/index.js.map → index.js.map} +0 -0
  126. /package/{src/index.mjs → index.mjs} +0 -0
  127. /package/{src/index.mjs.map → index.mjs.map} +0 -0
  128. /package/{src/schema → schema}/application.schema.json.js +0 -0
  129. /package/{src/schema → schema}/application.schema.json.js.map +0 -0
  130. /package/{src/schema → schema}/application.schema.json.mjs +0 -0
  131. /package/{src/schema → schema}/application.schema.json.mjs.map +0 -0
  132. /package/{src/schema → schema}/contract.schema.json.js +0 -0
  133. /package/{src/schema → schema}/contract.schema.json.js.map +0 -0
  134. /package/{src/schema → schema}/contract.schema.json.mjs +0 -0
  135. /package/{src/schema → schema}/contract.schema.json.mjs.map +0 -0
  136. /package/{src/util → util}/boom.js +0 -0
  137. /package/{src/util → util}/boom.mjs +0 -0
  138. /package/{src/util → util}/color-console.js +0 -0
  139. /package/{src/util → util}/color-console.mjs +0 -0
package/README.md CHANGED
@@ -16,7 +16,7 @@ Note: you need at least version 7 of AlgoKit Utils to work with the latest versi
16
16
 
17
17
  ### Use
18
18
 
19
- The cli can be used to generate a client via the following command.
19
+ The AlgoKit cli can be used to generate a client via the following command.
20
20
 
21
21
  ```
22
22
  npx --yes @algorandfoundation/algokit-client-generator generate -a ./application.json -o ./client.generated.ts
package/cli.d.ts CHANGED
@@ -1 +1,7 @@
1
1
  export declare function cli(workingDirectory: string, args: string[]): void;
2
+ export declare function generateClientCommand({ application, output, preserveNames, workingDirectory, }: {
3
+ application: string;
4
+ output: string;
5
+ preserveNames: boolean;
6
+ workingDirectory: string;
7
+ }): Promise<void>;
@@ -35,23 +35,12 @@ function cli(workingDirectory, args) {
35
35
  .requiredOption('-o --output <path>', 'Specifies the output file path')
36
36
  .option('-pn --preserve-names', 'Preserve names from application.json spec instead of sanitizing them')
37
37
  .action(async ({ application, output, preserveNames }) => {
38
- const fs = await import('fs');
39
- const resolvedAppJsonPath = path__namespace.resolve(workingDirectory, application);
40
- const resolvedOutPath = path__namespace.resolve(workingDirectory, output);
41
- const resolvedOutDir = path__namespace.dirname(resolvedOutPath);
42
- colorConsole.colorConsole.info `Reading application.json file from path ${resolvedAppJsonPath}`;
43
- const spec = await load.loadApplicationJson(resolvedAppJsonPath);
44
- colorConsole.colorConsole.info `Generating TS client for ${spec.name}`;
45
- const parts = generate.generate(spec, { preserveNames: Boolean(preserveNames) });
46
- if (!fs.existsSync(resolvedOutDir)) {
47
- colorConsole.colorConsole.warn `Output directory ${resolvedOutDir} does not exist and will be created.`;
48
- fs.mkdirSync(resolvedOutDir, { recursive: true });
49
- }
50
- colorConsole.colorConsole.info `Writing TS client to ${resolvedOutPath}`;
51
- const file = fs.createWriteStream(resolvedOutPath, {
52
- flags: 'w',
38
+ await generateClientCommand({
39
+ application,
40
+ output,
41
+ preserveNames: Boolean(preserveNames),
42
+ workingDirectory,
53
43
  });
54
- writer.writeDocumentPartsToStream(parts, file);
55
44
  colorConsole.colorConsole.success `Operation completed successfully`;
56
45
  })
57
46
  .configureOutput({
@@ -72,6 +61,48 @@ function cli(workingDirectory, args) {
72
61
  process.exit(-1);
73
62
  }
74
63
  }
64
+ async function generateClientCommand({ application, output, preserveNames, workingDirectory, }) {
65
+ const fs = await import('fs');
66
+ const resolvedAppJsonPath = path__namespace.resolve(workingDirectory, application);
67
+ const resolvedOutPath = path__namespace.resolve(workingDirectory, output);
68
+ const resolvedOutDir = path__namespace.dirname(resolvedOutPath);
69
+ colorConsole.colorConsole.info `Reading application.json file from path ${resolvedAppJsonPath}`;
70
+ const spec = await load.loadApplicationJson(resolvedAppJsonPath);
71
+ colorConsole.colorConsole.info `Generating TS client for ${spec.name}`;
72
+ const parts = generate.generate(spec, { preserveNames });
73
+ if (!fs.existsSync(resolvedOutDir)) {
74
+ colorConsole.colorConsole.warn `Output directory ${resolvedOutDir} does not exist and will be created.`;
75
+ fs.mkdirSync(resolvedOutDir, { recursive: true });
76
+ }
77
+ colorConsole.colorConsole.info `Writing TS client to ${resolvedOutPath}`;
78
+ const file = await createAwaitableWriteStream(resolvedOutPath);
79
+ writer.writeDocumentPartsToStream(parts, file);
80
+ await file.finish();
81
+ }
82
+ async function createAwaitableWriteStream(path) {
83
+ const fs = await import('fs');
84
+ const stream = fs.createWriteStream(path, {
85
+ flags: 'w',
86
+ });
87
+ const finish = new Promise((resolve, reject) => {
88
+ stream.on('error', (err) => {
89
+ reject(err);
90
+ });
91
+ stream.on('finish', () => {
92
+ resolve();
93
+ });
94
+ });
95
+ return {
96
+ write(chunk) {
97
+ stream.write(chunk);
98
+ },
99
+ finish() {
100
+ stream.end();
101
+ return finish;
102
+ },
103
+ };
104
+ }
75
105
 
76
106
  exports.cli = cli;
107
+ exports.generateClientCommand = generateClientCommand;
77
108
  //# sourceMappingURL=cli.js.map
package/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["import { Command } 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'\n\nexport function cli(workingDirectory: string, args: string[]) {\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 .action(\n async ({ application, output, preserveNames }: { application: string; output: string; preserveNames?: boolean }): Promise<void> => {\n await generateClientCommand({\n application,\n output,\n preserveNames: Boolean(preserveNames),\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(args)\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 workingDirectory,\n}: {\n application: string\n output: string\n preserveNames: boolean\n workingDirectory: string\n}) {\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 })\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","colorConsole","path","loadApplicationJson","generate","writeDocumentPartsToStream"],"mappings":"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"}
package/cli.mjs ADDED
@@ -0,0 +1,86 @@
1
+ import { Command } from 'commander';
2
+ import { loadApplicationJson } from './schema/load.mjs';
3
+ import * as path from 'path';
4
+ import { generate } from './client/generate.mjs';
5
+ import { writeDocumentPartsToStream } from './output/writer.mjs';
6
+ import { colorConsole } from './util/color-console.mjs';
7
+
8
+ function cli(workingDirectory, args) {
9
+ const program = new Command();
10
+ program
11
+ .command('generate')
12
+ .description('Generates a TypeScript client for the given application.json file')
13
+ .requiredOption('-a --application <path>', 'Specifies the application.json file')
14
+ .requiredOption('-o --output <path>', 'Specifies the output file path')
15
+ .option('-pn --preserve-names', 'Preserve names from application.json spec instead of sanitizing them')
16
+ .action(async ({ application, output, preserveNames }) => {
17
+ await generateClientCommand({
18
+ application,
19
+ output,
20
+ preserveNames: Boolean(preserveNames),
21
+ workingDirectory,
22
+ });
23
+ colorConsole.success `Operation completed successfully`;
24
+ })
25
+ .configureOutput({
26
+ writeErr(str) {
27
+ colorConsole.error `${str}`;
28
+ },
29
+ });
30
+ try {
31
+ program.parse(args);
32
+ }
33
+ catch (err) {
34
+ if (err instanceof Error) {
35
+ colorConsole.error `Unhandled error: \n\n${err.stack}`;
36
+ }
37
+ else {
38
+ colorConsole.error `Unhandled error: \n\n${err}`;
39
+ }
40
+ process.exit(-1);
41
+ }
42
+ }
43
+ async function generateClientCommand({ application, output, preserveNames, workingDirectory, }) {
44
+ const fs = await import('fs');
45
+ const resolvedAppJsonPath = path.resolve(workingDirectory, application);
46
+ const resolvedOutPath = path.resolve(workingDirectory, output);
47
+ const resolvedOutDir = path.dirname(resolvedOutPath);
48
+ colorConsole.info `Reading application.json file from path ${resolvedAppJsonPath}`;
49
+ const spec = await loadApplicationJson(resolvedAppJsonPath);
50
+ colorConsole.info `Generating TS client for ${spec.name}`;
51
+ const parts = generate(spec, { preserveNames });
52
+ if (!fs.existsSync(resolvedOutDir)) {
53
+ colorConsole.warn `Output directory ${resolvedOutDir} does not exist and will be created.`;
54
+ fs.mkdirSync(resolvedOutDir, { recursive: true });
55
+ }
56
+ colorConsole.info `Writing TS client to ${resolvedOutPath}`;
57
+ const file = await createAwaitableWriteStream(resolvedOutPath);
58
+ writeDocumentPartsToStream(parts, file);
59
+ await file.finish();
60
+ }
61
+ async function createAwaitableWriteStream(path) {
62
+ const fs = await import('fs');
63
+ const stream = fs.createWriteStream(path, {
64
+ flags: 'w',
65
+ });
66
+ const finish = new Promise((resolve, reject) => {
67
+ stream.on('error', (err) => {
68
+ reject(err);
69
+ });
70
+ stream.on('finish', () => {
71
+ resolve();
72
+ });
73
+ });
74
+ return {
75
+ write(chunk) {
76
+ stream.write(chunk);
77
+ },
78
+ finish() {
79
+ stream.end();
80
+ return finish;
81
+ },
82
+ };
83
+ }
84
+
85
+ export { cli, generateClientCommand };
86
+ //# sourceMappingURL=cli.mjs.map
package/cli.mjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.mjs","sources":["../src/cli.ts"],"sourcesContent":["import { Command } 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'\n\nexport function cli(workingDirectory: string, args: string[]) {\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 .action(\n async ({ application, output, preserveNames }: { application: string; output: string; preserveNames?: boolean }): Promise<void> => {\n await generateClientCommand({\n application,\n output,\n preserveNames: Boolean(preserveNames),\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(args)\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 workingDirectory,\n}: {\n application: string\n output: string\n preserveNames: boolean\n workingDirectory: string\n}) {\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 })\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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"}
@@ -27,8 +27,8 @@ function* appClient(ctx) {
27
27
  *
28
28
  * @param params The parameters to initialise the app client with
29
29
  */
30
- constructor(params: Expand<Omit<AppClientParams, 'appSpec'>>)
31
- constructor(appClientOrParams: AppClient | Expand<Omit<AppClientParams, 'appSpec'>>) {
30
+ constructor(params: Omit<AppClientParams, 'appSpec'>)
31
+ constructor(appClientOrParams: AppClient | Omit<AppClientParams, 'appSpec'>) {
32
32
  this.appClient = appClientOrParams instanceof AppClient ? appClientOrParams : new AppClient({
33
33
  ...appClientOrParams,
34
34
  appSpec: APP_SPEC,
@@ -48,7 +48,7 @@ function* appClient(ctx) {
48
48
  * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
49
49
  * @param params The parameters to create the app client
50
50
  */
51
- public static async fromCreatorAndName(params: Expand<Omit<ResolveAppClientByCreatorAndName, 'appSpec'>>): Promise<${name}Client> {
51
+ public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<${name}Client> {
52
52
  return new ${name}Client(await AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))
53
53
  }
54
54
 
@@ -60,62 +60,77 @@ function* appClient(ctx) {
60
60
  * @param params The parameters to create the app client
61
61
  */
62
62
  static async fromNetwork(
63
- params: Expand<Omit<AppClientParams, 'appSpec' | 'appId'>>
63
+ params: Omit<ResolveAppClientByNetwork, 'appSpec'>
64
64
  ): Promise<${name}Client> {
65
65
  return new ${name}Client(await AppClient.fromNetwork({...params, appSpec: APP_SPEC}))
66
66
  }
67
67
 
68
+ /** The ID of the app instance this client is linked to. */
69
+ public get appId() {
70
+ return this.appClient.appId
71
+ }
72
+
73
+ /** The app address of the app instance this client is linked to. */
74
+ public get appAddress() {
75
+ return this.appClient.appAddress
76
+ }
77
+
78
+ /** The name of the app. */
79
+ public get appName() {
80
+ return this.appClient.appName
81
+ }
82
+
83
+ /** The ARC-56 app spec being used */
84
+ public get appSpec() {
85
+ return this.appClient.appSpec
86
+ }
87
+
88
+ /** A reference to the underlying \`AlgorandClient\` this app client is using. */
89
+ public get algorand(): AlgorandClientInterface {
90
+ return this.appClient.algorand
91
+ }
92
+
68
93
  `;
69
94
  yield* params(ctx);
70
- yield* transactions(ctx);
95
+ yield* createTransaction(ctx);
71
96
  yield* send(ctx);
97
+ yield* cloneMethod(ctx);
98
+ yield* readonlyMethods(ctx);
72
99
  yield* getStateMethods(ctx);
73
100
  yield* callComposer.composeMethod(ctx);
74
101
  yield writer.DecIndentAndCloseBlock;
75
102
  }
76
103
  function* params(ctx) {
77
- yield* writer.jsDoc(`Get parameters to define transactions to the current app`);
78
- yield `readonly params = (($this) => {`;
79
- yield writer.IncIndent;
80
- yield `return {`;
104
+ yield* writer.jsDoc(`Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.`);
105
+ yield `readonly params = {`;
81
106
  yield writer.IncIndent;
82
107
  yield* opMethods(ctx, 'params');
83
108
  yield* clearState(ctx, 'params');
84
109
  yield* call(ctx, 'params');
85
110
  yield* noopMethods(ctx, 'params');
86
111
  yield writer.DecIndentAndCloseBlock;
87
- yield writer.DecIndent;
88
- yield `})(this)`;
89
112
  yield writer.NewLine;
90
113
  }
91
- function* transactions(ctx) {
92
- yield* writer.jsDoc(`Get parameters to define transactions to the current app`);
93
- yield `readonly transactions = (($this) => {`;
94
- yield writer.IncIndent;
95
- yield `return {`;
114
+ function* createTransaction(ctx) {
115
+ yield* writer.jsDoc(`Create transactions for the current app`);
116
+ yield `readonly createTransaction = {`;
96
117
  yield writer.IncIndent;
97
- yield* opMethods(ctx, 'transactions');
98
- yield* clearState(ctx, 'transactions');
99
- yield* call(ctx, 'transactions');
100
- yield* noopMethods(ctx, 'transactions');
118
+ yield* opMethods(ctx, 'createTransaction');
119
+ yield* clearState(ctx, 'createTransaction');
120
+ yield* call(ctx, 'createTransaction');
121
+ yield* noopMethods(ctx, 'createTransaction');
101
122
  yield writer.DecIndentAndCloseBlock;
102
- yield writer.DecIndent;
103
- yield `})(this)`;
104
123
  yield writer.NewLine;
105
124
  }
106
125
  function* send(ctx) {
107
126
  yield* writer.jsDoc(`Send calls to the current app`);
108
- yield `readonly send = (($this) => {`;
109
- yield writer.IncIndent;
110
- yield `return {`;
127
+ yield `readonly send = {`;
111
128
  yield writer.IncIndent;
112
129
  yield* opMethods(ctx, 'send');
113
130
  yield* clearState(ctx, 'send');
114
131
  yield* call(ctx, 'send');
115
132
  yield* noopMethods(ctx, 'send');
116
133
  yield writer.DecIndentAndCloseBlock;
117
- yield writer.DecIndent;
118
- yield `})(this)`;
119
134
  yield writer.NewLine;
120
135
  }
121
136
  function* opMethods(ctx, type) {
@@ -130,44 +145,55 @@ function* bareMethodCall({ generator: { app }, name, description, verb, type, in
130
145
  yield* writer.jsDoc({
131
146
  description: `${description}.`,
132
147
  params: {
133
- params: `The params for the bare (non-ABI) call`,
148
+ params: `The params for the bare (raw) call`,
134
149
  },
135
150
  returns: `The ${verb} result`,
136
151
  });
137
- yield `${name}(params?: Expand<AppClientBareCallParams${includeCompilation ? ' & AppClientCompilationParams' : ''}${verb === 'create' ? ' & CreateSchema' : ''}${type === 'send' ? ' & ExecuteParams' : ''}${onComplete?.type ? ` & ${onComplete.type}` : ''}>) {`;
138
- yield* writer.indent(`return $this.appClient.${type}.bare.${verb}(params)`);
152
+ yield `${name}: (params?: Expand<AppClientBareCallParams${includeCompilation ? ' & AppClientCompilationParams' : ''}${verb === 'create' ? ' & CreateSchema' : ''}${type === 'send' ? ' & SendParams' : ''}${onComplete?.type ? ` & ${onComplete.type}` : ''}>) => {`;
153
+ yield* writer.indent(`return this.appClient.${type}.bare.${verb}(params)`);
139
154
  yield '},';
140
155
  }
141
- function* abiMethodCall({ generator: { app, methodSignatureToUniqueName, name, sanitizer }, method, description, verb, type, includeCompilation, }) {
156
+ function* abiMethodCall({ generator: { app, methodSignatureToUniqueName, name, sanitizer }, method, description, verb, type, includeCompilation, readonly, }) {
142
157
  const methodSig = new algosdk.ABIMethod(method).getSignature();
143
158
  const uniqueName = methodSignatureToUniqueName[methodSig];
144
- const onComplete = verb === 'create' ? deployTypes.getCreateOnCompleteOptions(methodSig, app) : verb === 'call' ? deployTypes.getCallOnCompleteOptions(methodSig, app) : undefined;
159
+ const onComplete = verb === 'create'
160
+ ? deployTypes.getCreateOnCompleteOptions(methodSig, app)
161
+ : verb === 'call' && !readonly
162
+ ? deployTypes.getCallOnCompleteOptions(methodSig, app)
163
+ : undefined;
145
164
  yield* writer.jsDoc({
146
- description: `${description} using the ${methodSig} ABI method.`,
165
+ description: verb === 'call' && method.readonly
166
+ ? [
167
+ `${description} using the \`${methodSig}\` ABI method.`,
168
+ '',
169
+ 'This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.',
170
+ ]
171
+ : `${description} using the \`${methodSig}\` ABI method.`,
147
172
  abiDescription: method?.desc,
148
173
  params: {
149
174
  params: `The params for the smart contract call`,
150
175
  },
151
- returns: `The ${verb} ${type === 'params' ? 'params' : type === 'transactions' ? 'transaction' : 'result'}${method?.returns?.desc ? `: ${method.returns.desc}` : ''}`,
176
+ returns: `The ${verb} ${type === 'params' ? 'params' : type === 'createTransaction' ? 'transaction' : 'result'}${method?.returns?.desc ? `: ${method.returns.desc}` : ''}`,
152
177
  });
153
178
  const methodName = sanitizer.makeSafeMethodIdentifier(uniqueName);
154
179
  const methodNameAccessor = sanitizer.getSafeMemberAccessor(methodName);
155
180
  const methodSigSafe = sanitizer.makeSafeStringTypeLiteral(methodSig);
156
- yield `${type === 'send' ? 'async ' : ''}${methodName}(params: Expand<CallParams<'${methodSigSafe}'>${includeCompilation ? ' & AppClientCompilationParams' : ''}${verb === 'create' ? ' & CreateSchema' : ''}${type === 'send' ? ' & ExecuteParams' : ''}${onComplete?.type ? ` & ${onComplete.type}` : ''}>${onComplete?.isOptional !== false && (method.args.length === 0 || !method.args.some((a) => !a.defaultValue)) ? ` = {args: [${method.args.map((_) => 'undefined').join(', ')}]}` : ''}) {`;
181
+ yield `${!readonly ? `${methodName}: ` : ''}${type === 'send' ? 'async ' : ''}${readonly ? `${methodName}` : ''}(params: CallParams<${name}Args['obj']['${methodSigSafe}'] | ${name}Args['tuple']['${methodSigSafe}']>${includeCompilation ? ' &' + ' AppClientCompilationParams' : ''}${verb === 'create' ? ' & CreateSchema' : ''}${type === 'send' && !readonly ? ' & SendParams' : ''}${onComplete?.type && !readonly ? ` & ${onComplete.type}` : ''}${onComplete?.isOptional !== false && (method.args.length === 0 || !method.args.some((a) => !a.defaultValue)) ? ` = {args: [${method.args.map((_) => 'undefined').join(', ')}]}` : ''})${!readonly ? ' =>' : ''} {`;
157
182
  if (type === 'send') {
158
- yield* writer.indent(`const result = await $this.appClient.${type}.${verb}(${name}ParamsFactory${verb !== 'call' ? `.${verb}` : ''}${methodNameAccessor}(params))`, `return {...result, return: result.return as undefined | MethodReturn<'${methodSigSafe}'>}`);
183
+ yield* writer.indent(`const result = await this.appClient.${type}.${verb}(${name}ParamsFactory${verb !== 'call' ? `.${verb}` : ''}${methodNameAccessor}(params))`, readonly
184
+ ? `return result.return as ${name}Returns['${methodSigSafe}']`
185
+ : `return {...result, return: result.return as undefined | ${name}Returns['${methodSigSafe}']}`);
159
186
  }
160
187
  else {
161
- yield* writer.indent(`return $this.appClient.${type}.${verb}(${name}ParamsFactory${verb !== 'call' ? `.${verb}` : ''}${methodNameAccessor}(params))`);
188
+ yield* writer.indent(`return this.appClient.${type}.${verb}(${name}ParamsFactory${verb !== 'call' ? `.${verb}` : ''}${methodNameAccessor}(params))`);
162
189
  }
163
- yield '},';
190
+ yield `}${!readonly ? ',' : ''}`;
191
+ yield writer.NewLine;
164
192
  }
165
193
  function* operationMethods(generator, description, methods, verb, type, includeCompilation) {
166
194
  if (methods.length) {
167
195
  yield* writer.jsDoc(`Gets available ${verb} methods`);
168
- yield `get ${verb}() {`;
169
- yield writer.IncIndent;
170
- yield `return {`;
196
+ yield `${verb}: {`;
171
197
  yield writer.IncIndent;
172
198
  for (const methodSig of methods) {
173
199
  if (methodSig === getCallConfigSummary.BARE_CALL) {
@@ -192,7 +218,6 @@ function* operationMethods(generator, description, methods, verb, type, includeC
192
218
  });
193
219
  }
194
220
  }
195
- yield writer.DecIndentAndCloseBlock;
196
221
  yield writer.DecIndent;
197
222
  yield '},';
198
223
  yield writer.NewLine;
@@ -220,6 +245,24 @@ function* call(generator, type) {
220
245
  yield writer.NewLine;
221
246
  }
222
247
  }
248
+ function* readonlyMethods(generator) {
249
+ const { app, callConfig } = generator;
250
+ for (const method of app.methods) {
251
+ const methodSignature = new algosdk.ABIMethod(method).getSignature();
252
+ // Skip non readonly methods
253
+ if (!callConfig.callMethods.includes(methodSignature) || !method.readonly)
254
+ continue;
255
+ yield* abiMethodCall({
256
+ generator,
257
+ description: `Makes a readonly (simulated) call to the ${generator.app.name} smart contract`,
258
+ method,
259
+ verb: 'call',
260
+ type: 'send',
261
+ includeCompilation: false,
262
+ readonly: true,
263
+ });
264
+ }
265
+ }
223
266
  function* noopMethods(generator, type) {
224
267
  const { app, callConfig } = generator;
225
268
  for (const method of app.methods) {
@@ -255,14 +298,14 @@ function* getStateMethods({ app, sanitizer }) {
255
298
  yield* writer.jsDoc(`Get all current keyed values from ${storageType} state`);
256
299
  yield `getAll: async (): Promise<Partial<Expand<${storageType[0].toUpperCase()}${storageType.substring(1)}KeysState>>> => {`;
257
300
  yield* writer.indent(`const result = await this.appClient.state.${storageType}${storageType === 'local' ? '(address)' : ''}.getAll()`, `return {`, ...Object.keys(app.state.keys[storageType]).map((n) => {
258
- return ` ${sanitizer.makeSafePropertyIdentifier(n)}: ${app.state.keys[storageType][n].valueType === 'bytes' ? `new BinaryStateValue(result${sanitizer.getSafeMemberAccessor(n)})` : `result${sanitizer.getSafeMemberAccessor(n)}`},`;
301
+ return ` ${sanitizer.makeSafePropertyIdentifier(n)}: ${app.state.keys[storageType][n].valueType === 'AVMBytes' ? `new BinaryStateValue(result${sanitizer.getSafeMemberAccessor(n)})` : `result${sanitizer.getSafeMemberAccessor(n)}`},`;
259
302
  }), `}`);
260
303
  yield `},`;
261
304
  for (const n of Object.keys(app.state.keys[storageType])) {
262
305
  const name = sanitizer.makeSafePropertyIdentifier(n);
263
306
  const k = app.state.keys[storageType][n];
264
307
  yield* writer.jsDoc(`Get the current value of the ${n} key in ${storageType} state`);
265
- yield `${name}: async (): Promise<${k.valueType === 'bytes' ? 'BinaryState' : `${getEquivalentType.getEquivalentType(k.valueType, 'output', { app, sanitizer })} | undefined`}> => { return ${k.valueType === 'bytes' ? 'new BinaryStateValue(' : ''}(await this.appClient.state.${storageType}${storageType === 'local' ? '(address)' : ''}.getValue("${name}"))${k.valueType === 'bytes' ? ' as Uint8Array | undefined)' : ` as ${getEquivalentType.getEquivalentType(k.valueType, 'output', { app, sanitizer })} | undefined`} },`;
308
+ yield `${name}: async (): Promise<${k.valueType === 'AVMBytes' ? 'BinaryState' : `${getEquivalentType.getEquivalentType(k.valueType, 'output', { app, sanitizer })} | undefined`}> => { return ${k.valueType === 'AVMBytes' ? 'new BinaryStateValue(' : ''}(await this.appClient.state.${storageType}${storageType === 'local' ? '(address)' : ''}.getValue("${name}"))${k.valueType === 'AVMBytes' ? ' as Uint8Array | undefined)' : ` as ${getEquivalentType.getEquivalentType(k.valueType, 'output', { app, sanitizer })} | undefined`} },`;
266
309
  }
267
310
  for (const n of Object.keys(app.state.maps[storageType])) {
268
311
  const name = sanitizer.makeSafePropertyIdentifier(app.state.keys[storageType][n] ? `${n}Map` : n);
@@ -283,6 +326,20 @@ function* getStateMethods({ app, sanitizer }) {
283
326
  yield writer.DecIndentAndCloseBlock;
284
327
  yield writer.NewLine;
285
328
  }
329
+ function* cloneMethod({ name }) {
330
+ yield* writer.jsDoc({
331
+ description: 'Clone this app client with different params',
332
+ params: {
333
+ params: 'The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.',
334
+ },
335
+ returns: 'A new app client with the altered params',
336
+ });
337
+ yield `public clone(params: CloneAppClientParams) {`;
338
+ yield writer.IncIndent;
339
+ yield `return new ${name}Client(this.appClient.clone(params))`;
340
+ yield writer.DecIndentAndCloseBlock;
341
+ yield writer.NewLine;
342
+ }
286
343
 
287
344
  exports.appClient = appClient;
288
345
  //# sourceMappingURL=app-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-client.js","sources":["../../src/client/app-client.ts"],"sourcesContent":["import { DecIndent, DecIndentAndCloseBlock, DocumentParts, IncIndent, indent, jsDoc, NewLine } from '../output/writer'\nimport { BARE_CALL, MethodList } from './helpers/get-call-config-summary'\nimport { GeneratorContext } from './generator-context'\nimport { getCallOnCompleteOptions, getCreateOnCompleteOptions } from './deploy-types'\nimport { composeMethod } from './call-composer'\nimport { ABIMethod } from 'algosdk'\nimport { Method } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport { getEquivalentType } from './helpers/get-equivalent-type'\n\nexport function* appClient(ctx: GeneratorContext): DocumentParts {\n const { app, name } = ctx\n\n yield* jsDoc(`A client to make calls to the ${app.name} smart contract`)\n yield `export class ${name}Client {`\n yield IncIndent\n yield* jsDoc(`The underlying \\`AppClient\\` for when you want to have more flexibility`)\n yield 'public readonly appClient: AppClient'\n yield NewLine\n\n yield `\n /**\n * Creates a new instance of \\`${name}Client\\`\n *\n * @param appClient An \\`AppClient\\` instance which has been created with the ${name} app spec\n */\n constructor(appClient: AppClient)\n /**\n * Creates a new instance of \\`${name}Client\\`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof AppClient ? appClientOrParams : new AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Checks for decode errors on the given return value and maps the return value to the return type for the given method\n * @returns The typed return value or undefined if there was no value\n */\n decodeReturnValue<TSignature extends ${name}NonVoidMethodSignatures>(method: TSignature, returnValue: ABIReturn | undefined) {\n return returnValue !== undefined ? getArc56ReturnValue<MethodReturn<TSignature>>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined\n }\n\n /**\n * Returns a new \\`${name}Client\\` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<${name}Client> {\n return new ${name}Client(await AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n\n /**\n * Returns an \\`${name}Client\\` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<${name}Client> {\n return new ${name}Client(await AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n\n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n\n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n\n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n\n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n\n /** A reference to the underlying \\`AlgorandClient\\` this app client is using. */\n public get algorand(): AlgorandClientInterface {\n return this.appClient.algorand\n }\n\n `\n\n yield* params(ctx)\n yield* createTransaction(ctx)\n yield* send(ctx)\n yield* cloneMethod(ctx)\n yield* readonlyMethods(ctx)\n yield* getStateMethods(ctx)\n yield* composeMethod(ctx)\n yield DecIndentAndCloseBlock\n}\n\nfunction* params(ctx: GeneratorContext): DocumentParts {\n yield* jsDoc(\n `Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.`,\n )\n yield `readonly params = {`\n yield IncIndent\n yield* opMethods(ctx, 'params')\n yield* clearState(ctx, 'params')\n yield* call(ctx, 'params')\n yield* noopMethods(ctx, 'params')\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n\nfunction* createTransaction(ctx: GeneratorContext): DocumentParts {\n yield* jsDoc(`Create transactions for the current app`)\n yield `readonly createTransaction = {`\n yield IncIndent\n yield* opMethods(ctx, 'createTransaction')\n yield* clearState(ctx, 'createTransaction')\n yield* call(ctx, 'createTransaction')\n yield* noopMethods(ctx, 'createTransaction')\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n\nfunction* send(ctx: GeneratorContext): DocumentParts {\n yield* jsDoc(`Send calls to the current app`)\n yield `readonly send = {`\n yield IncIndent\n yield* opMethods(ctx, 'send')\n yield* clearState(ctx, 'send')\n yield* call(ctx, 'send')\n yield* noopMethods(ctx, 'send')\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n\nfunction* opMethods(ctx: GeneratorContext, type: 'params' | 'createTransaction' | 'send'): DocumentParts {\n const { app, callConfig } = ctx\n\n yield* operationMethods(\n ctx,\n `Updates an existing instance of the ${app.name} smart contract`,\n callConfig.updateMethods,\n 'update',\n type,\n true,\n )\n yield* operationMethods(ctx, `Deletes an existing instance of the ${app.name} smart contract`, callConfig.deleteMethods, 'delete', type)\n yield* operationMethods(\n ctx,\n `Opts the user into an existing instance of the ${app.name} smart contract`,\n callConfig.optInMethods,\n 'optIn',\n type,\n )\n yield* operationMethods(\n ctx,\n `Makes a close out call to an existing instance of the ${app.name} smart contract`,\n callConfig.closeOutMethods,\n 'closeOut',\n type,\n )\n}\n\nfunction* bareMethodCall({\n generator: { app },\n name,\n description,\n verb,\n type,\n includeCompilation,\n}: {\n generator: GeneratorContext\n name: string\n description: string\n verb: 'create' | 'update' | 'optIn' | 'closeOut' | 'delete' | 'clearState' | 'call'\n type: 'params' | 'createTransaction' | 'send'\n includeCompilation?: boolean\n}): DocumentParts {\n const onComplete =\n verb === 'create' ? getCreateOnCompleteOptions(BARE_CALL, app) : verb === 'call' ? getCallOnCompleteOptions(BARE_CALL, app) : undefined\n yield* jsDoc({\n description: `${description}.`,\n params: {\n params: `The params for the bare (raw) call`,\n },\n returns: `The ${verb} result`,\n })\n yield `${name}: (params?: Expand<AppClientBareCallParams${includeCompilation ? ' & AppClientCompilationParams' : ''}${\n verb === 'create' ? ' & CreateSchema' : ''\n }${type === 'send' ? ' & SendParams' : ''}${onComplete?.type ? ` & ${onComplete.type}` : ''}>) => {`\n yield* indent(`return this.appClient.${type}.bare.${verb}(params)`)\n yield '},'\n}\n\nfunction* abiMethodCall({\n generator: { app, methodSignatureToUniqueName, name, sanitizer },\n method,\n description,\n verb,\n type,\n includeCompilation,\n readonly,\n}: {\n generator: GeneratorContext\n method: Method\n description: string\n verb: 'create' | 'update' | 'optIn' | 'closeOut' | 'delete' | 'call'\n type: 'params' | 'createTransaction' | 'send'\n includeCompilation?: boolean\n readonly?: boolean\n}) {\n const methodSig = new ABIMethod(method).getSignature()\n const uniqueName = methodSignatureToUniqueName[methodSig]\n const onComplete =\n verb === 'create'\n ? getCreateOnCompleteOptions(methodSig, app)\n : verb === 'call' && !readonly\n ? getCallOnCompleteOptions(methodSig, app)\n : undefined\n yield* jsDoc({\n description:\n verb === 'call' && method.readonly\n ? [\n `${description} using the \\`${methodSig}\\` ABI method.`,\n '',\n 'This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.',\n ]\n : `${description} using the \\`${methodSig}\\` ABI method.`,\n abiDescription: method?.desc,\n params: {\n params: `The params for the smart contract call`,\n },\n returns: `The ${verb} ${type === 'params' ? 'params' : type === 'createTransaction' ? 'transaction' : 'result'}${method?.returns?.desc ? `: ${method.returns.desc}` : ''}`,\n })\n const methodName = sanitizer.makeSafeMethodIdentifier(uniqueName)\n const methodNameAccessor = sanitizer.getSafeMemberAccessor(methodName)\n const methodSigSafe = sanitizer.makeSafeStringTypeLiteral(methodSig)\n yield `${!readonly ? `${methodName}: ` : ''}${type === 'send' ? 'async ' : ''}${readonly ? `${methodName}` : ''}(params: CallParams<${name}Args['obj']['${methodSigSafe}'] | ${name}Args['tuple']['${methodSigSafe}']>${\n includeCompilation ? ' &' + ' AppClientCompilationParams' : ''\n }${\n verb === 'create' ? ' & CreateSchema' : ''\n }${type === 'send' && !readonly ? ' & SendParams' : ''}${onComplete?.type && !readonly ? ` & ${onComplete.type}` : ''}${onComplete?.isOptional !== false && (method.args.length === 0 || !method.args.some((a) => !a.defaultValue)) ? ` = {args: [${method.args.map((_) => 'undefined').join(', ')}]}` : ''})${!readonly ? ' =>' : ''} {`\n if (type === 'send') {\n yield* indent(\n `const result = await this.appClient.${type}.${verb}(${name}ParamsFactory${verb !== 'call' ? `.${verb}` : ''}${methodNameAccessor}(params))`,\n readonly\n ? `return result.return as ${name}Returns['${methodSigSafe}']`\n : `return {...result, return: result.return as undefined | ${name}Returns['${methodSigSafe}']}`,\n )\n } else {\n yield* indent(\n `return this.appClient.${type}.${verb}(${name}ParamsFactory${verb !== 'call' ? `.${verb}` : ''}${methodNameAccessor}(params))`,\n )\n }\n yield `}${!readonly ? ',' : ''}`\n yield NewLine\n}\n\nfunction* operationMethods(\n generator: GeneratorContext,\n description: string,\n methods: MethodList,\n verb: 'create' | 'update' | 'optIn' | 'closeOut' | 'delete',\n type: 'params' | 'createTransaction' | 'send',\n includeCompilation?: boolean,\n): DocumentParts {\n if (methods.length) {\n yield* jsDoc(`Gets available ${verb} methods`)\n yield `${verb}: {`\n yield IncIndent\n for (const methodSig of methods) {\n if (methodSig === BARE_CALL) {\n yield* bareMethodCall({\n generator,\n name: 'bare',\n description: `${description} using a bare call`,\n verb,\n type,\n includeCompilation,\n })\n } else {\n const method = generator.app.methods.find((m) => new ABIMethod(m).getSignature() === methodSig)!\n yield* abiMethodCall({\n generator,\n method,\n description,\n verb,\n type,\n includeCompilation,\n })\n }\n }\n yield DecIndent\n yield '},'\n yield NewLine\n }\n}\n\nfunction* clearState(generator: GeneratorContext, type: 'params' | 'createTransaction' | 'send'): DocumentParts {\n yield* bareMethodCall({\n generator,\n name: 'clearState',\n description: `Makes a clear_state call to an existing instance of the ${generator.app.name} smart contract`,\n verb: 'clearState',\n type,\n })\n yield NewLine\n}\n\nfunction* call(generator: GeneratorContext, type: 'params' | 'createTransaction' | 'send'): DocumentParts {\n if (generator.callConfig.callMethods.includes(BARE_CALL)) {\n yield* bareMethodCall({\n generator,\n name: 'bare',\n description: `Makes a call to the ${generator.app.name} smart contract using a bare call`,\n verb: 'call',\n type,\n })\n yield NewLine\n }\n}\n\nfunction* readonlyMethods(generator: GeneratorContext): DocumentParts {\n const { app, callConfig } = generator\n for (const method of app.methods) {\n const methodSignature = new ABIMethod(method).getSignature()\n // Skip non readonly methods\n if (!callConfig.callMethods.includes(methodSignature) || !method.readonly) continue\n\n yield* abiMethodCall({\n generator,\n description: `Makes a readonly (simulated) call to the ${generator.app.name} smart contract`,\n method,\n verb: 'call',\n type: 'send',\n includeCompilation: false,\n readonly: true,\n })\n }\n}\n\nfunction* noopMethods(generator: GeneratorContext, type: 'params' | 'createTransaction' | 'send'): DocumentParts {\n const { app, callConfig } = generator\n for (const method of app.methods) {\n const methodSignature = new ABIMethod(method).getSignature()\n // Skip methods which don't support a no_op call config\n if (!callConfig.callMethods.includes(methodSignature)) continue\n\n yield* abiMethodCall({\n generator,\n description: `Makes a call to the ${generator.app.name} smart contract`,\n method,\n verb: 'call',\n type,\n includeCompilation: false,\n })\n }\n}\n\nfunction* getStateMethods({ app, sanitizer }: GeneratorContext): DocumentParts {\n if (Object.keys(app.state).length === 0) return\n\n yield* jsDoc(`Methods to access state for the current ${app.name} app`)\n yield 'state = {'\n yield IncIndent\n\n const storageTypes = ['global', 'local', 'box'] as const\n\n for (const storageType of storageTypes) {\n const hasKeys = Object.keys(app.state.keys[storageType]).length > 0\n const hasMaps = Object.keys(app.state.maps[storageType]).length > 0\n if (!hasKeys && !hasMaps) continue\n\n yield* jsDoc(`Methods to access ${storageType} state for the current ${app.name} app`)\n yield `${storageType}${storageType === 'local' ? ': (address: string) => ({' : ': {'}`\n yield IncIndent\n\n yield* jsDoc(`Get all current keyed values from ${storageType} state`)\n yield `getAll: async (): Promise<Partial<Expand<${storageType[0].toUpperCase()}${storageType.substring(1)}KeysState>>> => {`\n yield* indent(\n `const result = await this.appClient.state.${storageType}${storageType === 'local' ? '(address)' : ''}.getAll()`,\n `return {`,\n ...Object.keys(app.state.keys[storageType]).map((n) => {\n return ` ${sanitizer.makeSafePropertyIdentifier(n)}: ${app.state.keys[storageType][n].valueType === 'AVMBytes' ? `new BinaryStateValue(result${sanitizer.getSafeMemberAccessor(n)})` : `result${sanitizer.getSafeMemberAccessor(n)}`},`\n }),\n `}`,\n )\n yield `},`\n\n for (const n of Object.keys(app.state.keys[storageType])) {\n const name = sanitizer.makeSafePropertyIdentifier(n)\n const k = app.state.keys[storageType][n]\n yield* jsDoc(`Get the current value of the ${n} key in ${storageType} state`)\n yield `${name}: async (): Promise<${k.valueType === 'AVMBytes' ? 'BinaryState' : `${getEquivalentType(k.valueType, 'output', { app, sanitizer })} | undefined`}> => { return ${k.valueType === 'AVMBytes' ? 'new BinaryStateValue(' : ''}(await this.appClient.state.${storageType}${storageType === 'local' ? '(address)' : ''}.getValue(\"${name}\"))${k.valueType === 'AVMBytes' ? ' as Uint8Array | undefined)' : ` as ${getEquivalentType(k.valueType, 'output', { app, sanitizer })} | undefined`} },`\n }\n\n for (const n of Object.keys(app.state.maps[storageType])) {\n const name = sanitizer.makeSafePropertyIdentifier(app.state.keys[storageType][n] ? `${n}Map` : n)\n const m = app.state.maps[storageType][n]\n yield* jsDoc(`Get values from the ${n} map in ${storageType} state`)\n yield `${name}: {`\n yield IncIndent\n\n yield* jsDoc(`Get all current values of the ${n} map in ${storageType} state`)\n yield `getMap: async (): Promise<Map<${getEquivalentType(m.keyType, 'output', { app, sanitizer })}, ${getEquivalentType(m.valueType, 'output', { app, sanitizer })}>> => { return (await this.appClient.state.${storageType}${storageType === 'local' ? '(address)' : ''}.getMap(\"${sanitizer.makeSafeStringTypeLiteral(n)}\")) as Map<${getEquivalentType(m.keyType, 'output', { app, sanitizer })}, ${getEquivalentType(m.valueType, 'output', { app, sanitizer })}> },`\n\n yield* jsDoc(`Get a current value of the ${n} map by key from ${storageType} state`)\n yield `value: async (key: ${getEquivalentType(m.keyType, 'input', { app, sanitizer })}): Promise<${getEquivalentType(m.valueType, 'output', { app, sanitizer })} | undefined> => { return await this.appClient.state.${storageType}${storageType === 'local' ? '(address)' : ''}.getMapValue(\"${sanitizer.makeSafeStringTypeLiteral(n)}\", key) as ${getEquivalentType(m.valueType, 'output', { app, sanitizer })} | undefined },`\n\n yield DecIndent\n yield `},`\n }\n\n yield DecIndent\n yield `}${storageType === 'local' ? ')' : ''},`\n }\n\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n\nfunction* cloneMethod({ name }: GeneratorContext): DocumentParts {\n yield* jsDoc({\n description: 'Clone this app client with different params',\n params: {\n params:\n 'The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.',\n },\n returns: 'A new app client with the altered params',\n })\n yield `public clone(params: CloneAppClientParams) {`\n yield IncIndent\n yield `return new ${name}Client(this.appClient.clone(params))`\n yield DecIndentAndCloseBlock\n yield NewLine\n}\n"],"names":["jsDoc","IncIndent","NewLine","composeMethod","DecIndentAndCloseBlock","getCreateOnCompleteOptions","BARE_CALL","getCallOnCompleteOptions","indent","ABIMethod","DecIndent","getEquivalentType"],"mappings":"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"}