@algorandfoundation/algokit-client-generator 6.0.0-beta.2 → 6.0.0

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 (44) hide show
  1. package/README.md +54 -4
  2. package/cli.d.ts +3 -3
  3. package/cli.js +12 -4
  4. package/cli.js.map +1 -1
  5. package/cli.mjs +13 -5
  6. package/cli.mjs.map +1 -1
  7. package/client/app-client.js +4 -2
  8. package/client/app-client.js.map +1 -1
  9. package/client/app-client.mjs +4 -2
  10. package/client/app-client.mjs.map +1 -1
  11. package/client/call-composer-types.js +7 -5
  12. package/client/call-composer-types.js.map +1 -1
  13. package/client/call-composer-types.mjs +7 -5
  14. package/client/call-composer-types.mjs.map +1 -1
  15. package/client/call-composer.js +4 -2
  16. package/client/call-composer.js.map +1 -1
  17. package/client/call-composer.mjs +4 -2
  18. package/client/call-composer.mjs.map +1 -1
  19. package/client/generate.d.ts +1 -1
  20. package/client/generate.js +59 -8
  21. package/client/generate.js.map +1 -1
  22. package/client/generate.mjs +59 -8
  23. package/client/generate.mjs.map +1 -1
  24. package/client/generator-context.d.ts +10 -7
  25. package/client/generator-context.js +7 -0
  26. package/client/generator-context.js.map +1 -1
  27. package/client/generator-context.mjs +7 -1
  28. package/client/generator-context.mjs.map +1 -1
  29. package/client/imports.d.ts +2 -1
  30. package/client/imports.js +2 -3
  31. package/client/imports.js.map +1 -1
  32. package/client/imports.mjs +2 -3
  33. package/client/imports.mjs.map +1 -1
  34. package/client/params-factory.js +5 -3
  35. package/client/params-factory.js.map +1 -1
  36. package/client/params-factory.mjs +5 -3
  37. package/client/params-factory.mjs.map +1 -1
  38. package/package.json +1 -7
  39. package/util/sanitization.d.ts +2 -3
  40. package/util/sanitization.js +1 -1
  41. package/util/sanitization.js.map +1 -1
  42. package/util/sanitization.mjs +1 -1
  43. package/util/sanitization.mjs.map +1 -1
  44. package/tests/approval-tests.spec.d.ts +0 -1
package/README.md CHANGED
@@ -22,10 +22,56 @@ If you're migrating your project from an older generated typed client to v4, ple
22
22
 
23
23
  The cli can be used to generate a client via the following command.
24
24
 
25
- ```
25
+ ```bash
26
26
  npx --yes @algorandfoundation/algokit-client-generator generate -a ./application.json -o ./client.generated.ts
27
27
  ```
28
28
 
29
+ #### CLI Options
30
+
31
+ The CLI supports the following options:
32
+
33
+ - `-a, --application <path>` (required): Specifies the path to the ARC-56 or ARC-32 application.json file
34
+ - `-o, --output <path>` (required): Specifies the output file path for the generated TypeScript client
35
+ - `--pn, --preserve-names`: Preserve names from the application.json spec instead of sanitizing them to camelCase
36
+ - `-m, --mode <mode>`: Generate client in specified mode (default: `full`)
37
+ - `full`: Generates a complete client with factory, deployment capabilities and all features
38
+ - `minimal`: Generates a lightweight client without factory or deployment capabilities, resulting in a smaller output
39
+
40
+ #### CLI Examples
41
+
42
+ Generate a full client (default):
43
+
44
+ ```bash
45
+ npx --yes @algorandfoundation/algokit-client-generator generate -a ./application.json -o ./client.ts
46
+ ```
47
+
48
+ Generate a minimal client:
49
+
50
+ ```bash
51
+ npx --yes @algorandfoundation/algokit-client-generator generate -a ./application.json -o ./client.ts -m minimal
52
+ ```
53
+
54
+ #### Generation Modes
55
+
56
+ The generator supports two modes:
57
+
58
+ **Full Mode (default):**
59
+
60
+ - Includes factory class for creating and deploying smart contracts
61
+ - Includes deployment types and methods
62
+ - Includes all deployment-related metadata (source code, bytecode, template variables)
63
+ - Includes client class for interacting with already deployed contracts
64
+ - Best for development, deployment and interaction workflows or where output size is less important
65
+
66
+ **Minimal Mode:**
67
+
68
+ - Excludes factory class and deployment capabilities
69
+ - Excludes deployment-related metadata to reduce output size
70
+ - Only includes client class for interacting with already deployed contracts
71
+ - Best for scenarios that only need to interact with existing contracts
72
+
73
+ #### Programmatic API
74
+
29
75
  Alternatively, a client can be generated from code by invoking the `generate` function paired with either `writeDocumentPartsToString` or `writeDocumentPartsToStream` depending on your needs. We also expose helpers to optionally load and validate an application.json file.
30
76
 
31
77
  ```ts
@@ -45,14 +91,18 @@ const appJsonFromObject = validateApplicationJson(appJson)
45
91
  const fileStream = fs.createWriteStream('./client.ts', {
46
92
  flags: 'w',
47
93
  })
48
- writeDocumentPartsToStream(generate(appJsonFromFile, fileStream))
94
+ writeDocumentPartsToStream(generate(appJsonFromFile), fileStream)
95
+
96
+ // Generate a full client (default)
97
+ const clientAsString = writeDocumentPartsToString(generate(appJsonFromObject))
49
98
 
50
- const clientAsString = writeDocumentPartsToString(appJsonFromObject)
99
+ // Generate a minimal client
100
+ const minimalClientAsString = writeDocumentPartsToString(generate(appJsonFromObject, { mode: 'minimal' }))
51
101
  ```
52
102
 
53
103
  For details on how to use the generated client see the more detailed [usage docs](./docs/usage.md)
54
104
 
55
- ## Examples
105
+ ## Code Examples
56
106
 
57
107
  There are a range of [examples](./examples) that you can look at to see a source smart contract (e.g. `{contract.py}`), the generated client (`client.ts`) and some tests that demonstrate how you can use the client (`client.spec.ts`).
58
108
 
package/cli.d.ts CHANGED
@@ -1,7 +1,7 @@
1
+ import { GeneratorOptions } from './client/generator-context';
1
2
  export declare function cli(workingDirectory: string, args: string[]): void;
2
- export declare function generateClientCommand({ application, output, preserveNames, workingDirectory, }: {
3
+ export declare function generateClientCommand({ application, output, preserveNames, mode, workingDirectory, }: {
3
4
  application: string;
4
5
  output: string;
5
- preserveNames: boolean;
6
6
  workingDirectory: string;
7
- }): Promise<void>;
7
+ } & GeneratorOptions): Promise<void>;
package/cli.js CHANGED
@@ -6,6 +6,7 @@ var path = require('path');
6
6
  var generate = require('./client/generate.js');
7
7
  var writer = require('./output/writer.js');
8
8
  var colorConsole = require('./util/color-console.js');
9
+ var generatorContext = require('./client/generator-context.js');
9
10
 
10
11
  function _interopNamespaceDefault(e) {
11
12
  var n = Object.create(null);
@@ -27,6 +28,8 @@ function _interopNamespaceDefault(e) {
27
28
  var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
28
29
 
29
30
  function cli(workingDirectory, args) {
31
+ // Pre 13 commander allowed `-pn` however the latest version doesn't. Rewrite it to `--pn` for backwards compatibility.
32
+ const processedArgs = args.map((arg) => (arg === '-pn' ? '--pn' : arg));
30
33
  const program = new commander.Command();
31
34
  program
32
35
  .command('generate')
@@ -34,11 +37,16 @@ function cli(workingDirectory, args) {
34
37
  .requiredOption('-a --application <path>', 'Specifies the application.json file')
35
38
  .requiredOption('-o --output <path>', 'Specifies the output file path')
36
39
  .option('--pn --preserve-names', 'Preserve names from application.json spec instead of sanitizing them')
37
- .action(async ({ application, output, preserveNames }) => {
40
+ .addOption(new commander.Option('-m --mode <mode>', "Generate client in specified mode. The 'full' mode includes all features, 'minimal' generates a smaller client without deployment features.")
41
+ .choices(generatorContext.generateModes)
42
+ .default('full'))
43
+ .allowExcessArguments(true) // Maintains backwards compatibility with pre 13 commanded
44
+ .action(async ({ application, output, preserveNames, mode, }) => {
38
45
  await generateClientCommand({
39
46
  application,
40
47
  output,
41
48
  preserveNames: Boolean(preserveNames),
49
+ mode: (mode ?? 'full'),
42
50
  workingDirectory,
43
51
  });
44
52
  colorConsole.colorConsole.success `Operation completed successfully`;
@@ -49,7 +57,7 @@ function cli(workingDirectory, args) {
49
57
  },
50
58
  });
51
59
  try {
52
- program.parse(args);
60
+ program.parse(processedArgs);
53
61
  }
54
62
  catch (err) {
55
63
  if (err instanceof Error) {
@@ -61,7 +69,7 @@ function cli(workingDirectory, args) {
61
69
  process.exit(-1);
62
70
  }
63
71
  }
64
- async function generateClientCommand({ application, output, preserveNames, workingDirectory, }) {
72
+ async function generateClientCommand({ application, output, preserveNames, mode, workingDirectory, }) {
65
73
  const fs = await import('fs');
66
74
  const resolvedAppJsonPath = path__namespace.resolve(workingDirectory, application);
67
75
  const resolvedOutPath = path__namespace.resolve(workingDirectory, output);
@@ -69,7 +77,7 @@ async function generateClientCommand({ application, output, preserveNames, worki
69
77
  colorConsole.colorConsole.info `Reading application.json file from path ${resolvedAppJsonPath}`;
70
78
  const spec = await load.loadApplicationJson(resolvedAppJsonPath);
71
79
  colorConsole.colorConsole.info `Generating TS client for ${spec.name}`;
72
- const parts = generate.generate(spec, { preserveNames });
80
+ const parts = generate.generate(spec, { preserveNames, mode });
73
81
  if (!fs.existsSync(resolvedOutDir)) {
74
82
  colorConsole.colorConsole.warn `Output directory ${resolvedOutDir} does not exist and will be created.`;
75
83
  fs.mkdirSync(resolvedOutDir, { recursive: true });
package/cli.js.map CHANGED
@@ -1 +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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"}
1
+ {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["import { Command, Option } from 'commander'\nimport { loadApplicationJson } from './schema/load'\nimport * as path from 'path'\nimport { generate } from './client/generate'\nimport { writeDocumentPartsToStream } from './output/writer'\nimport { colorConsole } from './util/color-console'\nimport { GenerateMode, generateModes, GeneratorOptions } from './client/generator-context'\n\nexport function cli(workingDirectory: string, args: string[]) {\n // Pre 13 commander allowed `-pn` however the latest version doesn't. Rewrite it to `--pn` for backwards compatibility.\n const processedArgs = args.map((arg) => (arg === '-pn' ? '--pn' : arg))\n const program = new Command()\n program\n .command('generate')\n .description('Generates a TypeScript client for the given application.json file')\n .requiredOption('-a --application <path>', 'Specifies the application.json file')\n .requiredOption('-o --output <path>', 'Specifies the output file path')\n .option('--pn --preserve-names', 'Preserve names from application.json spec instead of sanitizing them')\n .addOption(\n new Option(\n '-m --mode <mode>',\n \"Generate client in specified mode. The 'full' mode includes all features, 'minimal' generates a smaller client without deployment features.\",\n )\n .choices(generateModes)\n .default('full'),\n )\n .allowExcessArguments(true) // Maintains backwards compatibility with pre 13 commanded\n .action(\n async ({\n application,\n output,\n preserveNames,\n mode,\n }: {\n application: string\n output: string\n preserveNames?: boolean\n mode?: GenerateMode\n }): Promise<void> => {\n await generateClientCommand({\n application,\n output,\n preserveNames: Boolean(preserveNames),\n mode: (mode ?? 'full') as GenerateMode,\n workingDirectory,\n })\n colorConsole.success`Operation completed successfully`\n },\n )\n .configureOutput({\n writeErr(str: string) {\n colorConsole.error`${str}`\n },\n })\n try {\n program.parse(processedArgs)\n } catch (err) {\n if (err instanceof Error) {\n colorConsole.error`Unhandled error: \\n\\n${err.stack}`\n } else {\n colorConsole.error`Unhandled error: \\n\\n${err}`\n }\n process.exit(-1)\n }\n}\n\nexport async function generateClientCommand({\n application,\n output,\n preserveNames,\n mode,\n workingDirectory,\n}: {\n application: string\n output: string\n workingDirectory: string\n} & GeneratorOptions): Promise<void> {\n const fs = await import('fs')\n\n const resolvedAppJsonPath = path.resolve(workingDirectory, application)\n const resolvedOutPath = path.resolve(workingDirectory, output)\n const resolvedOutDir = path.dirname(resolvedOutPath)\n colorConsole.info`Reading application.json file from path ${resolvedAppJsonPath}`\n const spec = await loadApplicationJson(resolvedAppJsonPath)\n colorConsole.info`Generating TS client for ${spec.name}`\n const parts = generate(spec, { preserveNames, mode })\n if (!fs.existsSync(resolvedOutDir)) {\n colorConsole.warn`Output directory ${resolvedOutDir} does not exist and will be created.`\n fs.mkdirSync(resolvedOutDir, { recursive: true })\n }\n colorConsole.info`Writing TS client to ${resolvedOutPath}`\n const file = await createAwaitableWriteStream(resolvedOutPath)\n writeDocumentPartsToStream(parts, file)\n await file.finish()\n}\n\nasync function createAwaitableWriteStream(path: string) {\n const fs = await import('fs')\n const stream = fs.createWriteStream(path, {\n flags: 'w',\n })\n const finish = new Promise<void>((resolve, reject) => {\n stream.on('error', (err) => {\n reject(err)\n })\n stream.on('finish', () => {\n resolve()\n })\n })\n return {\n write(chunk: string): void {\n stream.write(chunk)\n },\n finish() {\n stream.end()\n return finish\n },\n }\n}\n"],"names":["Command","Option","generateModes","colorConsole","path","loadApplicationJson","generate","writeDocumentPartsToStream"],"mappings":"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"}
package/cli.mjs CHANGED
@@ -1,11 +1,14 @@
1
- import { Command } from 'commander';
1
+ import { Command, Option } from 'commander';
2
2
  import { loadApplicationJson } from './schema/load.mjs';
3
3
  import * as path from 'path';
4
4
  import { generate } from './client/generate.mjs';
5
5
  import { writeDocumentPartsToStream } from './output/writer.mjs';
6
6
  import { colorConsole } from './util/color-console.mjs';
7
+ import { generateModes } from './client/generator-context.mjs';
7
8
 
8
9
  function cli(workingDirectory, args) {
10
+ // Pre 13 commander allowed `-pn` however the latest version doesn't. Rewrite it to `--pn` for backwards compatibility.
11
+ const processedArgs = args.map((arg) => (arg === '-pn' ? '--pn' : arg));
9
12
  const program = new Command();
10
13
  program
11
14
  .command('generate')
@@ -13,11 +16,16 @@ function cli(workingDirectory, args) {
13
16
  .requiredOption('-a --application <path>', 'Specifies the application.json file')
14
17
  .requiredOption('-o --output <path>', 'Specifies the output file path')
15
18
  .option('--pn --preserve-names', 'Preserve names from application.json spec instead of sanitizing them')
16
- .action(async ({ application, output, preserveNames }) => {
19
+ .addOption(new Option('-m --mode <mode>', "Generate client in specified mode. The 'full' mode includes all features, 'minimal' generates a smaller client without deployment features.")
20
+ .choices(generateModes)
21
+ .default('full'))
22
+ .allowExcessArguments(true) // Maintains backwards compatibility with pre 13 commanded
23
+ .action(async ({ application, output, preserveNames, mode, }) => {
17
24
  await generateClientCommand({
18
25
  application,
19
26
  output,
20
27
  preserveNames: Boolean(preserveNames),
28
+ mode: (mode ?? 'full'),
21
29
  workingDirectory,
22
30
  });
23
31
  colorConsole.success `Operation completed successfully`;
@@ -28,7 +36,7 @@ function cli(workingDirectory, args) {
28
36
  },
29
37
  });
30
38
  try {
31
- program.parse(args);
39
+ program.parse(processedArgs);
32
40
  }
33
41
  catch (err) {
34
42
  if (err instanceof Error) {
@@ -40,7 +48,7 @@ function cli(workingDirectory, args) {
40
48
  process.exit(-1);
41
49
  }
42
50
  }
43
- async function generateClientCommand({ application, output, preserveNames, workingDirectory, }) {
51
+ async function generateClientCommand({ application, output, preserveNames, mode, workingDirectory, }) {
44
52
  const fs = await import('fs');
45
53
  const resolvedAppJsonPath = path.resolve(workingDirectory, application);
46
54
  const resolvedOutPath = path.resolve(workingDirectory, output);
@@ -48,7 +56,7 @@ async function generateClientCommand({ application, output, preserveNames, worki
48
56
  colorConsole.info `Reading application.json file from path ${resolvedAppJsonPath}`;
49
57
  const spec = await loadApplicationJson(resolvedAppJsonPath);
50
58
  colorConsole.info `Generating TS client for ${spec.name}`;
51
- const parts = generate(spec, { preserveNames });
59
+ const parts = generate(spec, { preserveNames, mode });
52
60
  if (!fs.existsSync(resolvedOutDir)) {
53
61
  colorConsole.warn `Output directory ${resolvedOutDir} does not exist and will be created.`;
54
62
  fs.mkdirSync(resolvedOutDir, { recursive: true });
package/cli.mjs.map CHANGED
@@ -1 +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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"}
1
+ {"version":3,"file":"cli.mjs","sources":["../src/cli.ts"],"sourcesContent":["import { Command, Option } from 'commander'\nimport { loadApplicationJson } from './schema/load'\nimport * as path from 'path'\nimport { generate } from './client/generate'\nimport { writeDocumentPartsToStream } from './output/writer'\nimport { colorConsole } from './util/color-console'\nimport { GenerateMode, generateModes, GeneratorOptions } from './client/generator-context'\n\nexport function cli(workingDirectory: string, args: string[]) {\n // Pre 13 commander allowed `-pn` however the latest version doesn't. Rewrite it to `--pn` for backwards compatibility.\n const processedArgs = args.map((arg) => (arg === '-pn' ? '--pn' : arg))\n const program = new Command()\n program\n .command('generate')\n .description('Generates a TypeScript client for the given application.json file')\n .requiredOption('-a --application <path>', 'Specifies the application.json file')\n .requiredOption('-o --output <path>', 'Specifies the output file path')\n .option('--pn --preserve-names', 'Preserve names from application.json spec instead of sanitizing them')\n .addOption(\n new Option(\n '-m --mode <mode>',\n \"Generate client in specified mode. The 'full' mode includes all features, 'minimal' generates a smaller client without deployment features.\",\n )\n .choices(generateModes)\n .default('full'),\n )\n .allowExcessArguments(true) // Maintains backwards compatibility with pre 13 commanded\n .action(\n async ({\n application,\n output,\n preserveNames,\n mode,\n }: {\n application: string\n output: string\n preserveNames?: boolean\n mode?: GenerateMode\n }): Promise<void> => {\n await generateClientCommand({\n application,\n output,\n preserveNames: Boolean(preserveNames),\n mode: (mode ?? 'full') as GenerateMode,\n workingDirectory,\n })\n colorConsole.success`Operation completed successfully`\n },\n )\n .configureOutput({\n writeErr(str: string) {\n colorConsole.error`${str}`\n },\n })\n try {\n program.parse(processedArgs)\n } catch (err) {\n if (err instanceof Error) {\n colorConsole.error`Unhandled error: \\n\\n${err.stack}`\n } else {\n colorConsole.error`Unhandled error: \\n\\n${err}`\n }\n process.exit(-1)\n }\n}\n\nexport async function generateClientCommand({\n application,\n output,\n preserveNames,\n mode,\n workingDirectory,\n}: {\n application: string\n output: string\n workingDirectory: string\n} & GeneratorOptions): Promise<void> {\n const fs = await import('fs')\n\n const resolvedAppJsonPath = path.resolve(workingDirectory, application)\n const resolvedOutPath = path.resolve(workingDirectory, output)\n const resolvedOutDir = path.dirname(resolvedOutPath)\n colorConsole.info`Reading application.json file from path ${resolvedAppJsonPath}`\n const spec = await loadApplicationJson(resolvedAppJsonPath)\n colorConsole.info`Generating TS client for ${spec.name}`\n const parts = generate(spec, { preserveNames, mode })\n if (!fs.existsSync(resolvedOutDir)) {\n colorConsole.warn`Output directory ${resolvedOutDir} does not exist and will be created.`\n fs.mkdirSync(resolvedOutDir, { recursive: true })\n }\n colorConsole.info`Writing TS client to ${resolvedOutPath}`\n const file = await createAwaitableWriteStream(resolvedOutPath)\n writeDocumentPartsToStream(parts, file)\n await file.finish()\n}\n\nasync function createAwaitableWriteStream(path: string) {\n const fs = await import('fs')\n const stream = fs.createWriteStream(path, {\n flags: 'w',\n })\n const finish = new Promise<void>((resolve, reject) => {\n stream.on('error', (err) => {\n reject(err)\n })\n stream.on('finish', () => {\n resolve()\n })\n })\n return {\n write(chunk: string): void {\n stream.write(chunk)\n },\n finish() {\n stream.end()\n return finish\n },\n }\n}\n"],"names":[],"mappings":"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"}
@@ -135,8 +135,10 @@ function* send(ctx) {
135
135
  }
136
136
  function* opMethods(ctx, type) {
137
137
  const { app, callConfig } = ctx;
138
- yield* operationMethods(ctx, `Updates an existing instance of the ${app.name} smart contract`, callConfig.updateMethods, 'update', type, true);
139
- yield* operationMethods(ctx, `Deletes an existing instance of the ${app.name} smart contract`, callConfig.deleteMethods, 'delete', type);
138
+ if (ctx.mode === 'full') {
139
+ yield* operationMethods(ctx, `Updates an existing instance of the ${app.name} smart contract`, callConfig.updateMethods, 'update', type, true);
140
+ yield* operationMethods(ctx, `Deletes an existing instance of the ${app.name} smart contract`, callConfig.deleteMethods, 'delete', type);
141
+ }
140
142
  yield* operationMethods(ctx, `Opts the user into an existing instance of the ${app.name} smart contract`, callConfig.optInMethods, 'optIn', type);
141
143
  yield* operationMethods(ctx, `Makes a close out call to an existing instance of the ${app.name} smart contract`, callConfig.closeOutMethods, 'closeOut', type);
142
144
  }
@@ -1 +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(): AlgorandClient {\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 unknown as ${name}Returns['${methodSigSafe}']`\n : `return {...result, return: result.return as unknown 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 | Address) => {' : ': {'}`\n yield IncIndent\n if (storageType === 'local') {\n yield \"const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey)\"\n yield 'return {'\n yield IncIndent\n }\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' ? '(encodedAddress)' : ''}.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' ? '(encodedAddress)' : ''}.getValue(\"${sanitizer.makeSafeStringTypeLiteral(n)}\"))${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' ? '(encodedAddress)' : ''}.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' ? '(encodedAddress)' : ''}.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 if (storageType === 'local') {\n yield '}'\n yield DecIndent\n }\n yield '},'\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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"}
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(): AlgorandClient {\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 if (ctx.mode === 'full') {\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 }\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 unknown as ${name}Returns['${methodSigSafe}']`\n : `return {...result, return: result.return as unknown 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 | Address) => {' : ': {'}`\n yield IncIndent\n if (storageType === 'local') {\n yield \"const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey)\"\n yield 'return {'\n yield IncIndent\n }\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' ? '(encodedAddress)' : ''}.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' ? '(encodedAddress)' : ''}.getValue(\"${sanitizer.makeSafeStringTypeLiteral(n)}\"))${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' ? '(encodedAddress)' : ''}.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' ? '(encodedAddress)' : ''}.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 if (storageType === 'local') {\n yield '}'\n yield DecIndent\n }\n yield '},'\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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"}
@@ -133,8 +133,10 @@ function* send(ctx) {
133
133
  }
134
134
  function* opMethods(ctx, type) {
135
135
  const { app, callConfig } = ctx;
136
- yield* operationMethods(ctx, `Updates an existing instance of the ${app.name} smart contract`, callConfig.updateMethods, 'update', type, true);
137
- yield* operationMethods(ctx, `Deletes an existing instance of the ${app.name} smart contract`, callConfig.deleteMethods, 'delete', type);
136
+ if (ctx.mode === 'full') {
137
+ yield* operationMethods(ctx, `Updates an existing instance of the ${app.name} smart contract`, callConfig.updateMethods, 'update', type, true);
138
+ yield* operationMethods(ctx, `Deletes an existing instance of the ${app.name} smart contract`, callConfig.deleteMethods, 'delete', type);
139
+ }
138
140
  yield* operationMethods(ctx, `Opts the user into an existing instance of the ${app.name} smart contract`, callConfig.optInMethods, 'optIn', type);
139
141
  yield* operationMethods(ctx, `Makes a close out call to an existing instance of the ${app.name} smart contract`, callConfig.closeOutMethods, 'closeOut', type);
140
142
  }