@haneullabs/codegen 0.1.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 (119) hide show
  1. package/CHANGELOG.md +259 -0
  2. package/README.md +195 -0
  3. package/dist/cjs/bin/bash-complete.d.ts +2 -0
  4. package/dist/cjs/bin/bash-complete.js +51 -0
  5. package/dist/cjs/bin/bash-complete.js.map +7 -0
  6. package/dist/cjs/bin/cli.d.ts +2 -0
  7. package/dist/cjs/bin/cli.js +34 -0
  8. package/dist/cjs/bin/cli.js.map +7 -0
  9. package/dist/cjs/cli/cli.d.ts +1 -0
  10. package/dist/cjs/cli/cli.js +49 -0
  11. package/dist/cjs/cli/cli.js.map +7 -0
  12. package/dist/cjs/cli/commands/generate/command.d.ts +1 -0
  13. package/dist/cjs/cli/commands/generate/command.js +80 -0
  14. package/dist/cjs/cli/commands/generate/command.js.map +7 -0
  15. package/dist/cjs/cli/commands/generate/impl.d.ts +8 -0
  16. package/dist/cjs/cli/commands/generate/impl.js +66 -0
  17. package/dist/cjs/cli/commands/generate/impl.js.map +7 -0
  18. package/dist/cjs/cli/context.d.ts +6 -0
  19. package/dist/cjs/cli/context.js +45 -0
  20. package/dist/cjs/cli/context.js.map +7 -0
  21. package/dist/cjs/config.d.ts +51 -0
  22. package/dist/cjs/config.js +75 -0
  23. package/dist/cjs/config.js.map +7 -0
  24. package/dist/cjs/file-builder.d.ts +13 -0
  25. package/dist/cjs/file-builder.js +83 -0
  26. package/dist/cjs/file-builder.js.map +7 -0
  27. package/dist/cjs/generate-utils.d.ts +1 -0
  28. package/dist/cjs/generate-utils.js +187 -0
  29. package/dist/cjs/generate-utils.js.map +7 -0
  30. package/dist/cjs/index.d.ts +8 -0
  31. package/dist/cjs/index.js +124 -0
  32. package/dist/cjs/index.js.map +7 -0
  33. package/dist/cjs/move-module-builder.d.ts +26 -0
  34. package/dist/cjs/move-module-builder.js +464 -0
  35. package/dist/cjs/move-module-builder.js.map +7 -0
  36. package/dist/cjs/package.json +5 -0
  37. package/dist/cjs/render-types.d.ts +19 -0
  38. package/dist/cjs/render-types.js +313 -0
  39. package/dist/cjs/render-types.js.map +7 -0
  40. package/dist/cjs/summary.d.ts +3 -0
  41. package/dist/cjs/summary.js +218 -0
  42. package/dist/cjs/summary.js.map +7 -0
  43. package/dist/cjs/types/deserialized.d.ts +89 -0
  44. package/dist/cjs/types/deserialized.js +17 -0
  45. package/dist/cjs/types/deserialized.js.map +7 -0
  46. package/dist/cjs/types/summary.d.ts +105 -0
  47. package/dist/cjs/types/summary.js +17 -0
  48. package/dist/cjs/types/summary.js.map +7 -0
  49. package/dist/cjs/utils.d.ts +22 -0
  50. package/dist/cjs/utils.js +164 -0
  51. package/dist/cjs/utils.js.map +7 -0
  52. package/dist/esm/bin/bash-complete.d.ts +2 -0
  53. package/dist/esm/bin/bash-complete.js +31 -0
  54. package/dist/esm/bin/bash-complete.js.map +7 -0
  55. package/dist/esm/bin/cli.d.ts +2 -0
  56. package/dist/esm/bin/cli.js +32 -0
  57. package/dist/esm/bin/cli.js.map +7 -0
  58. package/dist/esm/cli/cli.d.ts +1 -0
  59. package/dist/esm/cli/cli.js +29 -0
  60. package/dist/esm/cli/cli.js.map +7 -0
  61. package/dist/esm/cli/commands/generate/command.d.ts +1 -0
  62. package/dist/esm/cli/commands/generate/command.js +50 -0
  63. package/dist/esm/cli/commands/generate/command.js.map +7 -0
  64. package/dist/esm/cli/commands/generate/impl.d.ts +8 -0
  65. package/dist/esm/cli/commands/generate/impl.js +46 -0
  66. package/dist/esm/cli/commands/generate/impl.js.map +7 -0
  67. package/dist/esm/cli/context.d.ts +6 -0
  68. package/dist/esm/cli/context.js +15 -0
  69. package/dist/esm/cli/context.js.map +7 -0
  70. package/dist/esm/config.d.ts +51 -0
  71. package/dist/esm/config.js +45 -0
  72. package/dist/esm/config.js.map +7 -0
  73. package/dist/esm/file-builder.d.ts +13 -0
  74. package/dist/esm/file-builder.js +63 -0
  75. package/dist/esm/file-builder.js.map +7 -0
  76. package/dist/esm/generate-utils.d.ts +1 -0
  77. package/dist/esm/generate-utils.js +167 -0
  78. package/dist/esm/generate-utils.js.map +7 -0
  79. package/dist/esm/index.d.ts +8 -0
  80. package/dist/esm/index.js +104 -0
  81. package/dist/esm/index.js.map +7 -0
  82. package/dist/esm/move-module-builder.d.ts +26 -0
  83. package/dist/esm/move-module-builder.js +457 -0
  84. package/dist/esm/move-module-builder.js.map +7 -0
  85. package/dist/esm/package.json +5 -0
  86. package/dist/esm/render-types.d.ts +19 -0
  87. package/dist/esm/render-types.js +293 -0
  88. package/dist/esm/render-types.js.map +7 -0
  89. package/dist/esm/summary.d.ts +3 -0
  90. package/dist/esm/summary.js +198 -0
  91. package/dist/esm/summary.js.map +7 -0
  92. package/dist/esm/types/deserialized.d.ts +89 -0
  93. package/dist/esm/types/deserialized.js +1 -0
  94. package/dist/esm/types/deserialized.js.map +7 -0
  95. package/dist/esm/types/summary.d.ts +105 -0
  96. package/dist/esm/types/summary.js +1 -0
  97. package/dist/esm/types/summary.js.map +7 -0
  98. package/dist/esm/utils.d.ts +22 -0
  99. package/dist/esm/utils.js +134 -0
  100. package/dist/esm/utils.js.map +7 -0
  101. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  102. package/dist/tsconfig.tsbuildinfo +1 -0
  103. package/package.json +70 -0
  104. package/src/bin/bash-complete.ts +35 -0
  105. package/src/bin/cli.ts +40 -0
  106. package/src/cli/cli.ts +29 -0
  107. package/src/cli/commands/generate/command.ts +50 -0
  108. package/src/cli/commands/generate/impl.ts +66 -0
  109. package/src/cli/context.ts +21 -0
  110. package/src/config.ts +54 -0
  111. package/src/file-builder.ts +74 -0
  112. package/src/generate-utils.ts +163 -0
  113. package/src/index.ts +131 -0
  114. package/src/move-module-builder.ts +599 -0
  115. package/src/render-types.ts +349 -0
  116. package/src/summary.ts +242 -0
  117. package/src/types/deserialized.ts +107 -0
  118. package/src/types/summary.ts +144 -0
  119. package/src/utils.ts +180 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/cli/commands/generate/command.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { buildCommand } from '@stricli/core';\n\nexport const generateCommand = buildCommand({\n\tloader: async () => (await import('./impl.js')).default,\n\tparameters: {\n\t\tpositional: {\n\t\t\tkind: 'array',\n\t\t\tparameter: {\n\t\t\t\tparse: String,\n\t\t\t\tbrief: 'package name, mvr name, or path to a move package',\n\t\t\t},\n\t\t},\n\t\tflags: {\n\t\t\toutputDir: {\n\t\t\t\tkind: 'parsed',\n\t\t\t\tparse: String,\n\t\t\t\tbrief: 'Output directory',\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t\tnoPrune: {\n\t\t\t\tkind: 'parsed',\n\t\t\t\tparse: Boolean,\n\t\t\t\toptional: true,\n\t\t\t\tbrief: 'generate all types and functions in dependencies',\n\t\t\t},\n\t\t\tnoSummaries: {\n\t\t\t\tkind: 'parsed',\n\t\t\t\tparse: Boolean,\n\t\t\t\toptional: true,\n\t\t\t\tbrief: 'Do not generate summaries for packages',\n\t\t\t},\n\t\t\tnetwork: {\n\t\t\t\tkind: 'enum',\n\t\t\t\tvalues: ['mainnet', 'testnet'],\n\t\t\t\toptional: true,\n\t\t\t\tbrief: 'Network to generate for (default: testnet)',\n\t\t\t},\n\t\t},\n\t\taliases: {\n\t\t\to: 'outputDir',\n\t\t\tn: 'network',\n\t\t},\n\t},\n\tdocs: {\n\t\tbrief: 'Generate BCS and moveCall helpers from you Move code',\n\t},\n});\n"],
5
+ "mappings": "AAGA,SAAS,oBAAoB;AAEtB,MAAM,kBAAkB,aAAa;AAAA,EAC3C,QAAQ,aAAa,MAAM,OAAO,WAAW,GAAG;AAAA,EAChD,YAAY;AAAA,IACX,YAAY;AAAA,MACX,MAAM;AAAA,MACN,WAAW;AAAA,QACV,OAAO;AAAA,QACP,OAAO;AAAA,MACR;AAAA,IACD;AAAA,IACA,OAAO;AAAA,MACN,WAAW;AAAA,QACV,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,UAAU;AAAA,MACX;AAAA,MACA,SAAS;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,MACR;AAAA,MACA,aAAa;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,MACR;AAAA,MACA,SAAS;AAAA,QACR,MAAM;AAAA,QACN,QAAQ,CAAC,WAAW,SAAS;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO;AAAA,MACR;AAAA,IACD;AAAA,IACA,SAAS;AAAA,MACR,GAAG;AAAA,MACH,GAAG;AAAA,IACJ;AAAA,EACD;AAAA,EACA,MAAM;AAAA,IACL,OAAO;AAAA,EACR;AACD,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,8 @@
1
+ import type { LocalContext } from '../../context.js';
2
+ export interface SubdirCommandFlags {
3
+ outputDir?: string;
4
+ noPrune?: boolean;
5
+ noSummaries?: boolean;
6
+ network?: 'mainnet' | 'testnet';
7
+ }
8
+ export default function generate(this: LocalContext, flags: SubdirCommandFlags, ...packages: string[]): Promise<void>;
@@ -0,0 +1,46 @@
1
+ import { generateFromPackageSummary } from "../../../index.js";
2
+ import { loadConfig } from "../../../config.js";
3
+ import { isValidNamedPackage, isValidHaneulObjectId } from "@haneullabs/haneul/utils";
4
+ import { execSync } from "node:child_process";
5
+ import { existsSync } from "node:fs";
6
+ async function generate(flags, ...packages) {
7
+ const config = await loadConfig();
8
+ const normalizedPackages = packages.length > 0 ? packages.map((p) => {
9
+ const trimmed = p.trim();
10
+ if (isValidHaneulObjectId(trimmed) || isValidNamedPackage(trimmed)) {
11
+ return {
12
+ network: flags.network ?? "testnet",
13
+ packageName: isValidHaneulObjectId(trimmed) ? trimmed : trimmed.split("/")[1],
14
+ package: trimmed
15
+ };
16
+ } else {
17
+ return {
18
+ package: "@local-pkg/" + trimmed,
19
+ packageName: trimmed,
20
+ path: trimmed
21
+ };
22
+ }
23
+ }) : config.packages;
24
+ const generateSummaries = flags.noSummaries === void 0 ? config.generateSummaries : !flags.noSummaries;
25
+ for (const pkg of normalizedPackages) {
26
+ if (generateSummaries && pkg.path) {
27
+ if (!existsSync(pkg.path)) {
28
+ throw new Error(`Package path does not exist: ${pkg.path}`);
29
+ }
30
+ execSync("haneul move summary", {
31
+ cwd: pkg.path,
32
+ stdio: "inherit"
33
+ });
34
+ }
35
+ await generateFromPackageSummary({
36
+ package: pkg,
37
+ prune: flags.noPrune === void 0 ? config.prune : !flags.noPrune,
38
+ outputDir: flags.outputDir ?? config.output,
39
+ privateMethods: config.privateMethods
40
+ });
41
+ }
42
+ }
43
+ export {
44
+ generate as default
45
+ };
46
+ //# sourceMappingURL=impl.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/cli/commands/generate/impl.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { LocalContext } from '../../context.js';\nimport { generateFromPackageSummary } from '../../../index.js';\nimport { loadConfig } from '../../../config.js';\nimport { isValidNamedPackage, isValidHaneulObjectId } from '@haneullabs/haneul/utils';\nimport { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\n\nexport interface SubdirCommandFlags {\n\toutputDir?: string;\n\tnoPrune?: boolean;\n\tnoSummaries?: boolean;\n\tnetwork?: 'mainnet' | 'testnet';\n}\n\nexport default async function generate(\n\tthis: LocalContext,\n\tflags: SubdirCommandFlags,\n\t...packages: string[]\n): Promise<void> {\n\tconst config = await loadConfig();\n\n\tconst normalizedPackages =\n\t\tpackages.length > 0\n\t\t\t? packages.map((p) => {\n\t\t\t\t\tconst trimmed = p.trim();\n\t\t\t\t\tif (isValidHaneulObjectId(trimmed) || isValidNamedPackage(trimmed)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnetwork: flags.network ?? 'testnet',\n\t\t\t\t\t\t\tpackageName: isValidHaneulObjectId(trimmed) ? trimmed : trimmed.split('/')[1],\n\t\t\t\t\t\t\tpackage: trimmed,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tpackage: '@local-pkg/' + trimmed,\n\t\t\t\t\t\t\tpackageName: trimmed,\n\t\t\t\t\t\t\tpath: trimmed,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t: config.packages;\n\n\tconst generateSummaries =\n\t\tflags.noSummaries === undefined ? config.generateSummaries : !flags.noSummaries;\n\n\tfor (const pkg of normalizedPackages) {\n\t\tif (generateSummaries && pkg.path) {\n\t\t\tif (!existsSync(pkg.path)) {\n\t\t\t\tthrow new Error(`Package path does not exist: ${pkg.path}`);\n\t\t\t}\n\n\t\t\texecSync('haneul move summary', {\n\t\t\t\tcwd: pkg.path,\n\t\t\t\tstdio: 'inherit',\n\t\t\t});\n\t\t}\n\t\tawait generateFromPackageSummary({\n\t\t\tpackage: pkg,\n\t\t\tprune: flags.noPrune === undefined ? config.prune : !flags.noPrune,\n\t\t\toutputDir: flags.outputDir ?? config.output,\n\t\t\tprivateMethods: config.privateMethods,\n\t\t});\n\t}\n}\n"],
5
+ "mappings": "AAIA,SAAS,kCAAkC;AAC3C,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB,6BAA6B;AAC3D,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAS3B,eAAO,SAEN,UACG,UACa;AAChB,QAAM,SAAS,MAAM,WAAW;AAEhC,QAAM,qBACL,SAAS,SAAS,IACf,SAAS,IAAI,CAAC,MAAM;AACpB,UAAM,UAAU,EAAE,KAAK;AACvB,QAAI,sBAAsB,OAAO,KAAK,oBAAoB,OAAO,GAAG;AACnE,aAAO;AAAA,QACN,SAAS,MAAM,WAAW;AAAA,QAC1B,aAAa,sBAAsB,OAAO,IAAI,UAAU,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,QAC5E,SAAS;AAAA,MACV;AAAA,IACD,OAAO;AACN,aAAO;AAAA,QACN,SAAS,gBAAgB;AAAA,QACzB,aAAa;AAAA,QACb,MAAM;AAAA,MACP;AAAA,IACD;AAAA,EACD,CAAC,IACA,OAAO;AAEX,QAAM,oBACL,MAAM,gBAAgB,SAAY,OAAO,oBAAoB,CAAC,MAAM;AAErE,aAAW,OAAO,oBAAoB;AACrC,QAAI,qBAAqB,IAAI,MAAM;AAClC,UAAI,CAAC,WAAW,IAAI,IAAI,GAAG;AAC1B,cAAM,IAAI,MAAM,gCAAgC,IAAI,IAAI,EAAE;AAAA,MAC3D;AAEA,eAAS,uBAAuB;AAAA,QAC/B,KAAK,IAAI;AAAA,QACT,OAAO;AAAA,MACR,CAAC;AAAA,IACF;AACA,UAAM,2BAA2B;AAAA,MAChC,SAAS;AAAA,MACT,OAAO,MAAM,YAAY,SAAY,OAAO,QAAQ,CAAC,MAAM;AAAA,MAC3D,WAAW,MAAM,aAAa,OAAO;AAAA,MACrC,gBAAgB,OAAO;AAAA,IACxB,CAAC;AAAA,EACF;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,6 @@
1
+ import type { CommandContext } from '@stricli/core';
2
+ import type { StricliAutoCompleteContext } from '@stricli/auto-complete';
3
+ export interface LocalContext extends CommandContext, StricliAutoCompleteContext {
4
+ readonly process: NodeJS.Process;
5
+ }
6
+ export declare function buildContext(process: NodeJS.Process): LocalContext;
@@ -0,0 +1,15 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ function buildContext(process) {
5
+ return {
6
+ process,
7
+ os,
8
+ fs,
9
+ path
10
+ };
11
+ }
12
+ export {
13
+ buildContext
14
+ };
15
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/context.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { CommandContext } from '@stricli/core';\nimport type { StricliAutoCompleteContext } from '@stricli/auto-complete';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport interface LocalContext extends CommandContext, StricliAutoCompleteContext {\n\treadonly process: NodeJS.Process;\n}\n\nexport function buildContext(process: NodeJS.Process): LocalContext {\n\treturn {\n\t\tprocess,\n\t\tos,\n\t\tfs,\n\t\tpath,\n\t};\n}\n"],
5
+ "mappings": "AAKA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AAMV,SAAS,aAAa,SAAuC;AACnE,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,51 @@
1
+ import * as z from 'zod/v4';
2
+ export declare const onChainPackageSchema: z.ZodObject<{
3
+ package: z.ZodString;
4
+ packageName: z.ZodString;
5
+ path: z.ZodOptional<z.ZodNever>;
6
+ network: z.ZodEnum<{
7
+ mainnet: "mainnet";
8
+ testnet: "testnet";
9
+ }>;
10
+ }, z.core.$strip>;
11
+ export declare const localPackageSchema: z.ZodObject<{
12
+ path: z.ZodString;
13
+ package: z.ZodString;
14
+ packageName: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strip>;
16
+ export declare const packageConfigSchema: z.ZodUnion<readonly [z.ZodObject<{
17
+ package: z.ZodString;
18
+ packageName: z.ZodString;
19
+ path: z.ZodOptional<z.ZodNever>;
20
+ network: z.ZodEnum<{
21
+ mainnet: "mainnet";
22
+ testnet: "testnet";
23
+ }>;
24
+ }, z.core.$strip>, z.ZodObject<{
25
+ path: z.ZodString;
26
+ package: z.ZodString;
27
+ packageName: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$strip>]>;
29
+ export declare const configSchema: z.ZodObject<{
30
+ output: z.ZodString;
31
+ prune: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
32
+ generateSummaries: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
33
+ packages: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
34
+ package: z.ZodString;
35
+ packageName: z.ZodString;
36
+ path: z.ZodOptional<z.ZodNever>;
37
+ network: z.ZodEnum<{
38
+ mainnet: "mainnet";
39
+ testnet: "testnet";
40
+ }>;
41
+ }, z.core.$strip>, z.ZodObject<{
42
+ path: z.ZodString;
43
+ package: z.ZodString;
44
+ packageName: z.ZodOptional<z.ZodString>;
45
+ }, z.core.$strip>]>>;
46
+ privateMethods: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"none">, z.ZodLiteral<"entry">, z.ZodLiteral<"all">]>>>;
47
+ }, z.core.$strip>;
48
+ export type PackageConfig = z.infer<typeof packageConfigSchema>;
49
+ export type HaneulCodegenConfig = z.input<typeof configSchema>;
50
+ export type ParsedHaneulCodegenConfig = z.infer<typeof configSchema>;
51
+ export declare function loadConfig(): Promise<ParsedHaneulCodegenConfig>;
@@ -0,0 +1,45 @@
1
+ import { isValidNamedPackage, isValidHaneulObjectId } from "@haneullabs/haneul/utils";
2
+ import { cosmiconfig } from "cosmiconfig";
3
+ import * as z from "zod/v4";
4
+ const onChainPackageSchema = z.object({
5
+ package: z.string().refine((name) => isValidNamedPackage(name) || isValidHaneulObjectId(name), {
6
+ message: "Invalid package name or package ID"
7
+ }),
8
+ packageName: z.string(),
9
+ path: z.never().optional(),
10
+ network: z.enum(["mainnet", "testnet"])
11
+ });
12
+ const localPackageSchema = z.object({
13
+ path: z.string(),
14
+ package: z.string(),
15
+ packageName: z.string().optional()
16
+ });
17
+ const packageConfigSchema = z.union([onChainPackageSchema, localPackageSchema]);
18
+ const configSchema = z.object({
19
+ output: z.string(),
20
+ prune: z.boolean().optional().default(true),
21
+ generateSummaries: z.boolean().optional().default(true),
22
+ packages: z.array(packageConfigSchema),
23
+ privateMethods: z.union([z.literal("none"), z.literal("entry"), z.literal("all")]).optional().default("entry")
24
+ });
25
+ async function loadConfig() {
26
+ const config = await cosmiconfig("haneul-codegen").search();
27
+ if (!config) {
28
+ return {
29
+ output: "./generated",
30
+ packages: [],
31
+ prune: true,
32
+ generateSummaries: true,
33
+ privateMethods: "entry"
34
+ };
35
+ }
36
+ return configSchema.parse(config.config);
37
+ }
38
+ export {
39
+ configSchema,
40
+ loadConfig,
41
+ localPackageSchema,
42
+ onChainPackageSchema,
43
+ packageConfigSchema
44
+ };
45
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/config.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isValidNamedPackage, isValidHaneulObjectId } from '@haneullabs/haneul/utils';\nimport { cosmiconfig } from 'cosmiconfig';\nimport * as z from 'zod/v4';\n\nexport const onChainPackageSchema = z.object({\n\tpackage: z.string().refine((name) => isValidNamedPackage(name) || isValidHaneulObjectId(name), {\n\t\tmessage: 'Invalid package name or package ID',\n\t}),\n\tpackageName: z.string(),\n\tpath: z.never().optional(),\n\tnetwork: z.enum(['mainnet', 'testnet']),\n});\n\nexport const localPackageSchema = z.object({\n\tpath: z.string(),\n\tpackage: z.string(),\n\tpackageName: z.string().optional(),\n});\n\nexport const packageConfigSchema = z.union([onChainPackageSchema, localPackageSchema]);\n\nexport const configSchema = z.object({\n\toutput: z.string(),\n\tprune: z.boolean().optional().default(true),\n\tgenerateSummaries: z.boolean().optional().default(true),\n\tpackages: z.array(packageConfigSchema),\n\tprivateMethods: z\n\t\t.union([z.literal('none'), z.literal('entry'), z.literal('all')])\n\t\t.optional()\n\t\t.default('entry'),\n});\n\nexport type PackageConfig = z.infer<typeof packageConfigSchema>;\nexport type HaneulCodegenConfig = z.input<typeof configSchema>;\nexport type ParsedHaneulCodegenConfig = z.infer<typeof configSchema>;\n\nexport async function loadConfig(): Promise<ParsedHaneulCodegenConfig> {\n\tconst config = await cosmiconfig('haneul-codegen').search();\n\n\tif (!config) {\n\t\treturn {\n\t\t\toutput: './generated',\n\t\t\tpackages: [],\n\t\t\tprune: true,\n\t\t\tgenerateSummaries: true,\n\t\t\tprivateMethods: 'entry',\n\t\t};\n\t}\n\n\treturn configSchema.parse(config.config);\n}\n"],
5
+ "mappings": "AAGA,SAAS,qBAAqB,6BAA6B;AAC3D,SAAS,mBAAmB;AAC5B,YAAY,OAAO;AAEZ,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC5C,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,oBAAoB,IAAI,KAAK,sBAAsB,IAAI,GAAG;AAAA,IAC9F,SAAS;AAAA,EACV,CAAC;AAAA,EACD,aAAa,EAAE,OAAO;AAAA,EACtB,MAAM,EAAE,MAAM,EAAE,SAAS;AAAA,EACzB,SAAS,EAAE,KAAK,CAAC,WAAW,SAAS,CAAC;AACvC,CAAC;AAEM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EAC1C,MAAM,EAAE,OAAO;AAAA,EACf,SAAS,EAAE,OAAO;AAAA,EAClB,aAAa,EAAE,OAAO,EAAE,SAAS;AAClC,CAAC;AAEM,MAAM,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,kBAAkB,CAAC;AAE9E,MAAM,eAAe,EAAE,OAAO;AAAA,EACpC,QAAQ,EAAE,OAAO;AAAA,EACjB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC1C,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EACtD,UAAU,EAAE,MAAM,mBAAmB;AAAA,EACrC,gBAAgB,EACd,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,KAAK,CAAC,CAAC,EAC/D,SAAS,EACT,QAAQ,OAAO;AAClB,CAAC;AAMD,eAAsB,aAAiD;AACtE,QAAM,SAAS,MAAM,YAAY,gBAAgB,EAAE,OAAO;AAE1D,MAAI,CAAC,QAAQ;AACZ,WAAO;AAAA,MACN,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,IACjB;AAAA,EACD;AAEA,SAAO,aAAa,MAAM,OAAO,MAAM;AACxC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,13 @@
1
+ import type ts from 'typescript';
2
+ export declare class FileBuilder {
3
+ statements: ts.Statement[];
4
+ exports: string[];
5
+ imports: Map<string, Set<string>>;
6
+ starImports: Map<string, string>;
7
+ protected reservedNames: Set<string>;
8
+ addImport(module: string, name: string): void;
9
+ addStarImport(module: string, name: string): string;
10
+ getUnusedName(name: string): string;
11
+ getHeader(): Promise<string>;
12
+ toString(modDir: string, filePath: string): Promise<string>;
13
+ }
@@ -0,0 +1,63 @@
1
+ import { parseTS, printNodes } from "./utils.js";
2
+ import { relative, resolve } from "path";
3
+ import { getSafeName } from "./render-types.js";
4
+ class FileBuilder {
5
+ constructor() {
6
+ this.statements = [];
7
+ this.exports = [];
8
+ this.imports = /* @__PURE__ */ new Map();
9
+ this.starImports = /* @__PURE__ */ new Map();
10
+ this.reservedNames = /* @__PURE__ */ new Set();
11
+ }
12
+ addImport(module, name) {
13
+ if (!this.imports.has(module)) {
14
+ this.imports.set(module, /* @__PURE__ */ new Set());
15
+ }
16
+ this.imports.get(module).add(name);
17
+ }
18
+ addStarImport(module, name) {
19
+ const importName = this.getUnusedName(name);
20
+ this.starImports.set(importName, module);
21
+ return importName;
22
+ }
23
+ getUnusedName(name) {
24
+ let deConflictedName = getSafeName(name);
25
+ let i = 1;
26
+ while (this.reservedNames.has(deConflictedName)) {
27
+ deConflictedName = `${name}_${i}`;
28
+ i++;
29
+ }
30
+ return deConflictedName;
31
+ }
32
+ async getHeader() {
33
+ return [
34
+ "/**************************************************************",
35
+ " * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *",
36
+ " **************************************************************/",
37
+ ""
38
+ ].join("\n");
39
+ }
40
+ async toString(modDir, filePath) {
41
+ const importStatements = [...this.imports.entries()].flatMap(
42
+ ([module, names]) => parseTS`import { ${[...names].join(", ")} } from '${modulePath(module)}'`
43
+ );
44
+ const starImportStatements = [...this.starImports.entries()].flatMap(
45
+ ([name, module]) => parseTS`import * as ${name} from '${modulePath(module)}'`
46
+ );
47
+ return `${await this.getHeader()}${printNodes(...importStatements, ...starImportStatements, ...this.statements)}`;
48
+ function modulePath(mod) {
49
+ if (!mod.startsWith("~root/")) {
50
+ return mod;
51
+ }
52
+ const sourcePath = resolve(modDir, filePath);
53
+ const destPath = resolve(modDir, mod.replace("~root/", "./"));
54
+ const sourceDirectory = sourcePath.split("/").slice(0, -1).join("/");
55
+ const relativePath = relative(sourceDirectory, destPath);
56
+ return relativePath.startsWith(".") ? relativePath : `./${relativePath}`;
57
+ }
58
+ }
59
+ }
60
+ export {
61
+ FileBuilder
62
+ };
63
+ //# sourceMappingURL=file-builder.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/file-builder.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type ts from 'typescript';\nimport { parseTS, printNodes } from './utils.js';\nimport { relative, resolve } from 'path';\nimport { getSafeName } from './render-types.js';\n\nexport class FileBuilder {\n\tstatements: ts.Statement[] = [];\n\texports: string[] = [];\n\timports: Map<string, Set<string>> = new Map();\n\tstarImports: Map<string, string> = new Map();\n\tprotected reservedNames: Set<string> = new Set();\n\n\taddImport(module: string, name: string) {\n\t\tif (!this.imports.has(module)) {\n\t\t\tthis.imports.set(module, new Set());\n\t\t}\n\n\t\tthis.imports.get(module)!.add(name);\n\t}\n\n\taddStarImport(module: string, name: string) {\n\t\tconst importName = this.getUnusedName(name);\n\t\tthis.starImports.set(importName, module);\n\t\treturn importName;\n\t}\n\n\tgetUnusedName(name: string) {\n\t\tlet deConflictedName = getSafeName(name);\n\n\t\tlet i = 1;\n\t\twhile (this.reservedNames.has(deConflictedName)) {\n\t\t\tdeConflictedName = `${name}_${i}`;\n\t\t\ti++;\n\t\t}\n\n\t\treturn deConflictedName;\n\t}\n\n\tasync getHeader() {\n\t\treturn [\n\t\t\t'/**************************************************************',\n\t\t\t' * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *',\n\t\t\t' **************************************************************/',\n\t\t\t'',\n\t\t].join('\\n');\n\t}\n\n\tasync toString(modDir: string, filePath: string) {\n\t\tconst importStatements = [...this.imports.entries()].flatMap(\n\t\t\t([module, names]) =>\n\t\t\t\tparseTS`import { ${[...names].join(', ')} } from '${modulePath(module)}'`,\n\t\t);\n\t\tconst starImportStatements = [...this.starImports.entries()].flatMap(\n\t\t\t([name, module]) => parseTS`import * as ${name} from '${modulePath(module)}'`,\n\t\t);\n\n\t\treturn `${await this.getHeader()}${printNodes(...importStatements, ...starImportStatements, ...this.statements)}`;\n\n\t\tfunction modulePath(mod: string) {\n\t\t\tif (!mod.startsWith('~root/')) {\n\t\t\t\treturn mod;\n\t\t\t}\n\n\t\t\tconst sourcePath = resolve(modDir, filePath);\n\t\t\tconst destPath = resolve(modDir, mod.replace('~root/', './'));\n\t\t\tconst sourceDirectory = sourcePath.split('/').slice(0, -1).join('/');\n\t\t\tconst relativePath = relative(sourceDirectory, destPath);\n\t\t\treturn relativePath.startsWith('.') ? relativePath : `./${relativePath}`;\n\t\t}\n\t}\n}\n"],
5
+ "mappings": "AAIA,SAAS,SAAS,kBAAkB;AACpC,SAAS,UAAU,eAAe;AAClC,SAAS,mBAAmB;AAErB,MAAM,YAAY;AAAA,EAAlB;AACN,sBAA6B,CAAC;AAC9B,mBAAoB,CAAC;AACrB,mBAAoC,oBAAI,IAAI;AAC5C,uBAAmC,oBAAI,IAAI;AAC3C,SAAU,gBAA6B,oBAAI,IAAI;AAAA;AAAA,EAE/C,UAAU,QAAgB,MAAc;AACvC,QAAI,CAAC,KAAK,QAAQ,IAAI,MAAM,GAAG;AAC9B,WAAK,QAAQ,IAAI,QAAQ,oBAAI,IAAI,CAAC;AAAA,IACnC;AAEA,SAAK,QAAQ,IAAI,MAAM,EAAG,IAAI,IAAI;AAAA,EACnC;AAAA,EAEA,cAAc,QAAgB,MAAc;AAC3C,UAAM,aAAa,KAAK,cAAc,IAAI;AAC1C,SAAK,YAAY,IAAI,YAAY,MAAM;AACvC,WAAO;AAAA,EACR;AAAA,EAEA,cAAc,MAAc;AAC3B,QAAI,mBAAmB,YAAY,IAAI;AAEvC,QAAI,IAAI;AACR,WAAO,KAAK,cAAc,IAAI,gBAAgB,GAAG;AAChD,yBAAmB,GAAG,IAAI,IAAI,CAAC;AAC/B;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,YAAY;AACjB,WAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,EAAE,KAAK,IAAI;AAAA,EACZ;AAAA,EAEA,MAAM,SAAS,QAAgB,UAAkB;AAChD,UAAM,mBAAmB,CAAC,GAAG,KAAK,QAAQ,QAAQ,CAAC,EAAE;AAAA,MACpD,CAAC,CAAC,QAAQ,KAAK,MACd,mBAAmB,CAAC,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC,YAAY,WAAW,MAAM,CAAC;AAAA,IACxE;AACA,UAAM,uBAAuB,CAAC,GAAG,KAAK,YAAY,QAAQ,CAAC,EAAE;AAAA,MAC5D,CAAC,CAAC,MAAM,MAAM,MAAM,sBAAsB,IAAI,UAAU,WAAW,MAAM,CAAC;AAAA,IAC3E;AAEA,WAAO,GAAG,MAAM,KAAK,UAAU,CAAC,GAAG,WAAW,GAAG,kBAAkB,GAAG,sBAAsB,GAAG,KAAK,UAAU,CAAC;AAE/G,aAAS,WAAW,KAAa;AAChC,UAAI,CAAC,IAAI,WAAW,QAAQ,GAAG;AAC9B,eAAO;AAAA,MACR;AAEA,YAAM,aAAa,QAAQ,QAAQ,QAAQ;AAC3C,YAAM,WAAW,QAAQ,QAAQ,IAAI,QAAQ,UAAU,IAAI,CAAC;AAC5D,YAAM,kBAAkB,WAAW,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AACnE,YAAM,eAAe,SAAS,iBAAiB,QAAQ;AACvD,aAAO,aAAa,WAAW,GAAG,IAAI,eAAe,KAAK,YAAY;AAAA,IACvE;AAAA,EACD;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ export declare const utilsContent = "\nimport { bcs, BcsType, TypeTag, TypeTagSerializer, BcsStruct, BcsEnum, BcsTuple } from '@haneullabs/haneul/bcs';\nimport { normalizeHaneulAddress } from '@haneullabs/haneul/utils';\nimport { TransactionArgument, isArgument } from '@haneullabs/haneul/transactions';\n\nconst MOVE_STDLIB_ADDRESS = normalizeHaneulAddress('0x1');\nconst HANEUL_FRAMEWORK_ADDRESS = normalizeHaneulAddress('0x2');\nconst HANEUL_SYSTEM_ADDRESS = normalizeHaneulAddress('0x3');\n\nexport type RawTransactionArgument<T> = T | TransactionArgument;\n\nexport function getPureBcsSchema(typeTag: string | TypeTag): BcsType<any> | null {\n\tconst parsedTag = typeof typeTag === 'string' ? TypeTagSerializer.parseFromStr(typeTag) : typeTag;\n\n\tif ('u8' in parsedTag) {\n\t\treturn bcs.U8;\n\t} else if ('u16' in parsedTag) {\n\t\treturn bcs.U16;\n\t} else if ('u32' in parsedTag) {\n\t\treturn bcs.U32;\n\t} else if ('u64' in parsedTag) {\n\t\treturn bcs.U64;\n\t} else if ('u128' in parsedTag) {\n\t\treturn bcs.U128;\n\t} else if ('u256' in parsedTag) {\n\t\treturn bcs.U256;\n\t} else if ('address' in parsedTag) {\n\t\treturn bcs.Address;\n\t} else if ('bool' in parsedTag) {\n\t\treturn bcs.Bool;\n\t} else if ('vector' in parsedTag) {\n\t\tconst type = getPureBcsSchema(parsedTag.vector);\n\t\treturn type ? bcs.vector(type) : null;\n\t} else if ('struct' in parsedTag) {\n\t\tconst structTag = parsedTag.struct;\n\t\tconst pkg = normalizeHaneulAddress(parsedTag.struct.address);\n\n\t\tif (pkg === MOVE_STDLIB_ADDRESS) {\n\t\t\tif (\n\t\t\t\t(structTag.module === 'ascii' || structTag.module === 'string') &&\n\t\t\t\tstructTag.name === 'String'\n\t\t\t) {\n\t\t\t\treturn bcs.String;\n\t\t\t}\n\n\t\t\tif (structTag.module === 'option' && structTag.name === 'Option') {\n\t\t\t\tconst type = getPureBcsSchema(structTag.typeParams[0]!);\n\t\t\t\treturn type ? bcs.option(type) : null;\n\t\t\t}\n\t\t}\n\n\t\tif (pkg === HANEUL_FRAMEWORK_ADDRESS && structTag.module === 'Object' && structTag.name === 'ID') {\n\t\t\treturn bcs.Address;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport function normalizeMoveArguments(args: unknown[] | object, argTypes: string[], parameterNames?: string[]) {\n\tconst argLen = Array.isArray(args) ? args.length : Object.keys(args).length;\n\tif (parameterNames && argLen !== parameterNames.length) {\n\t\tthrow new Error(\n\t\t\t`Invalid number of arguments, expected ${parameterNames.length}, got ${argLen}`,\n\t\t);\n\t}\n\n\tconst normalizedArgs: TransactionArgument[] = [];\n\n\tlet index = 0;\n\tfor (const [i, argType] of argTypes.entries()) {\n\t\tif (argType === `${HANEUL_FRAMEWORK_ADDRESS}::deny_list::DenyList`) {\n\t\t\tnormalizedArgs.push((tx) => tx.object.denyList());\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (argType === `${HANEUL_FRAMEWORK_ADDRESS}::random::Random`) {\n\t\t\tnormalizedArgs.push((tx) => tx.object.random());\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (argType === `${HANEUL_FRAMEWORK_ADDRESS}::clock::Clock`) {\n\t\t\tnormalizedArgs.push((tx) => tx.object.clock());\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (argType === `${HANEUL_SYSTEM_ADDRESS}::haneul_system::HaneulSystemState`) {\n\t\t\tnormalizedArgs.push((tx) => tx.object.system());\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet arg\n\t\tif (Array.isArray(args)) {\n\t\t\tif (index >= args.length) {\n\t\t\t\tthrow new Error(`Invalid number of arguments, expected at least ${index + 1}, got ${args.length}`);\n\t\t\t}\n\t\t\targ = args[index];\n\t\t} else {\n\t\t\tif (!parameterNames) {\n\t\t\t\tthrow new Error(`Expected arguments to be passed as an array`);\n\t\t\t}\n\t\t\tconst name = parameterNames[index];\n\t\t\targ = args[name as keyof typeof args];\n\n\t\t\tif (arg === undefined) {\n\t\t\t\tthrow new Error(`Parameter ${name} is required`);\n\t\t\t}\n\t\t}\n\n\t\tindex += 1;\n\n\t\tif (typeof arg === 'function' || isArgument(arg)) {\n\t\t\tnormalizedArgs.push(arg as TransactionArgument);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst type = argTypes[i]!;\n\t\tconst bcsType = getPureBcsSchema(type);\n\n\t\tif (bcsType) {\n\t\t\tconst bytes = bcsType.serialize(arg as never);\n\t\t\tnormalizedArgs.push((tx) => tx.pure(bytes));\n\t\t\tcontinue;\n\t\t} else if (typeof arg === 'string') {\n\t\t\tnormalizedArgs.push((tx) => tx.object(arg));\n\t\t\tcontinue;\n\t\t}\n\n\t\tthrow new Error(`Invalid argument ${stringify(arg)} for type ${type}`);\n\t}\n\n\treturn normalizedArgs;\n}\n\nexport class MoveStruct<\n\tT extends Record<string, BcsType<any>>,\n\tconst Name extends string = string,\n> extends BcsStruct<T, Name> {}\n\nexport class MoveEnum<\n\tT extends Record<string, BcsType<any> | null>,\n\tconst Name extends string,\n> extends BcsEnum<T, Name> {}\n\nexport class MoveTuple<\n\tT extends readonly BcsType<any>[],\n\tconst Name extends string,\n> extends BcsTuple<T, Name> {}\n\nfunction stringify(val: unknown) {\n\tif (typeof val === 'object') {\n\t\treturn JSON.stringify(val, (val: unknown) => val);\n\t}\n\tif (typeof val === 'bigint') {\n\t\treturn val.toString();\n\t}\n\n\treturn val;\n}\n";
@@ -0,0 +1,167 @@
1
+ const utilsContent = (
2
+ /* ts */
3
+ `
4
+ import { bcs, BcsType, TypeTag, TypeTagSerializer, BcsStruct, BcsEnum, BcsTuple } from '@haneullabs/haneul/bcs';
5
+ import { normalizeHaneulAddress } from '@haneullabs/haneul/utils';
6
+ import { TransactionArgument, isArgument } from '@haneullabs/haneul/transactions';
7
+
8
+ const MOVE_STDLIB_ADDRESS = normalizeHaneulAddress('0x1');
9
+ const HANEUL_FRAMEWORK_ADDRESS = normalizeHaneulAddress('0x2');
10
+ const HANEUL_SYSTEM_ADDRESS = normalizeHaneulAddress('0x3');
11
+
12
+ export type RawTransactionArgument<T> = T | TransactionArgument;
13
+
14
+ export function getPureBcsSchema(typeTag: string | TypeTag): BcsType<any> | null {
15
+ const parsedTag = typeof typeTag === 'string' ? TypeTagSerializer.parseFromStr(typeTag) : typeTag;
16
+
17
+ if ('u8' in parsedTag) {
18
+ return bcs.U8;
19
+ } else if ('u16' in parsedTag) {
20
+ return bcs.U16;
21
+ } else if ('u32' in parsedTag) {
22
+ return bcs.U32;
23
+ } else if ('u64' in parsedTag) {
24
+ return bcs.U64;
25
+ } else if ('u128' in parsedTag) {
26
+ return bcs.U128;
27
+ } else if ('u256' in parsedTag) {
28
+ return bcs.U256;
29
+ } else if ('address' in parsedTag) {
30
+ return bcs.Address;
31
+ } else if ('bool' in parsedTag) {
32
+ return bcs.Bool;
33
+ } else if ('vector' in parsedTag) {
34
+ const type = getPureBcsSchema(parsedTag.vector);
35
+ return type ? bcs.vector(type) : null;
36
+ } else if ('struct' in parsedTag) {
37
+ const structTag = parsedTag.struct;
38
+ const pkg = normalizeHaneulAddress(parsedTag.struct.address);
39
+
40
+ if (pkg === MOVE_STDLIB_ADDRESS) {
41
+ if (
42
+ (structTag.module === 'ascii' || structTag.module === 'string') &&
43
+ structTag.name === 'String'
44
+ ) {
45
+ return bcs.String;
46
+ }
47
+
48
+ if (structTag.module === 'option' && structTag.name === 'Option') {
49
+ const type = getPureBcsSchema(structTag.typeParams[0]!);
50
+ return type ? bcs.option(type) : null;
51
+ }
52
+ }
53
+
54
+ if (pkg === HANEUL_FRAMEWORK_ADDRESS && structTag.module === 'Object' && structTag.name === 'ID') {
55
+ return bcs.Address;
56
+ }
57
+ }
58
+
59
+ return null;
60
+ }
61
+
62
+ export function normalizeMoveArguments(args: unknown[] | object, argTypes: string[], parameterNames?: string[]) {
63
+ const argLen = Array.isArray(args) ? args.length : Object.keys(args).length;
64
+ if (parameterNames && argLen !== parameterNames.length) {
65
+ throw new Error(
66
+ \`Invalid number of arguments, expected \${parameterNames.length}, got \${argLen}\`,
67
+ );
68
+ }
69
+
70
+ const normalizedArgs: TransactionArgument[] = [];
71
+
72
+ let index = 0;
73
+ for (const [i, argType] of argTypes.entries()) {
74
+ if (argType === \`\${HANEUL_FRAMEWORK_ADDRESS}::deny_list::DenyList\`) {
75
+ normalizedArgs.push((tx) => tx.object.denyList());
76
+ continue;
77
+ }
78
+
79
+ if (argType === \`\${HANEUL_FRAMEWORK_ADDRESS}::random::Random\`) {
80
+ normalizedArgs.push((tx) => tx.object.random());
81
+ continue;
82
+ }
83
+
84
+ if (argType === \`\${HANEUL_FRAMEWORK_ADDRESS}::clock::Clock\`) {
85
+ normalizedArgs.push((tx) => tx.object.clock());
86
+ continue;
87
+ }
88
+
89
+ if (argType === \`\${HANEUL_SYSTEM_ADDRESS}::haneul_system::HaneulSystemState\`) {
90
+ normalizedArgs.push((tx) => tx.object.system());
91
+ continue;
92
+ }
93
+
94
+ let arg
95
+ if (Array.isArray(args)) {
96
+ if (index >= args.length) {
97
+ throw new Error(\`Invalid number of arguments, expected at least \${index + 1}, got \${args.length}\`);
98
+ }
99
+ arg = args[index];
100
+ } else {
101
+ if (!parameterNames) {
102
+ throw new Error(\`Expected arguments to be passed as an array\`);
103
+ }
104
+ const name = parameterNames[index];
105
+ arg = args[name as keyof typeof args];
106
+
107
+ if (arg === undefined) {
108
+ throw new Error(\`Parameter \${name} is required\`);
109
+ }
110
+ }
111
+
112
+ index += 1;
113
+
114
+ if (typeof arg === 'function' || isArgument(arg)) {
115
+ normalizedArgs.push(arg as TransactionArgument);
116
+ continue;
117
+ }
118
+
119
+ const type = argTypes[i]!;
120
+ const bcsType = getPureBcsSchema(type);
121
+
122
+ if (bcsType) {
123
+ const bytes = bcsType.serialize(arg as never);
124
+ normalizedArgs.push((tx) => tx.pure(bytes));
125
+ continue;
126
+ } else if (typeof arg === 'string') {
127
+ normalizedArgs.push((tx) => tx.object(arg));
128
+ continue;
129
+ }
130
+
131
+ throw new Error(\`Invalid argument \${stringify(arg)} for type \${type}\`);
132
+ }
133
+
134
+ return normalizedArgs;
135
+ }
136
+
137
+ export class MoveStruct<
138
+ T extends Record<string, BcsType<any>>,
139
+ const Name extends string = string,
140
+ > extends BcsStruct<T, Name> {}
141
+
142
+ export class MoveEnum<
143
+ T extends Record<string, BcsType<any> | null>,
144
+ const Name extends string,
145
+ > extends BcsEnum<T, Name> {}
146
+
147
+ export class MoveTuple<
148
+ T extends readonly BcsType<any>[],
149
+ const Name extends string,
150
+ > extends BcsTuple<T, Name> {}
151
+
152
+ function stringify(val: unknown) {
153
+ if (typeof val === 'object') {
154
+ return JSON.stringify(val, (val: unknown) => val);
155
+ }
156
+ if (typeof val === 'bigint') {
157
+ return val.toString();
158
+ }
159
+
160
+ return val;
161
+ }
162
+ `
163
+ );
164
+ export {
165
+ utilsContent
166
+ };
167
+ //# sourceMappingURL=generate-utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/generate-utils.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport const utilsContent = /* ts */ `\nimport { bcs, BcsType, TypeTag, TypeTagSerializer, BcsStruct, BcsEnum, BcsTuple } from '@haneullabs/haneul/bcs';\nimport { normalizeHaneulAddress } from '@haneullabs/haneul/utils';\nimport { TransactionArgument, isArgument } from '@haneullabs/haneul/transactions';\n\nconst MOVE_STDLIB_ADDRESS = normalizeHaneulAddress('0x1');\nconst HANEUL_FRAMEWORK_ADDRESS = normalizeHaneulAddress('0x2');\nconst HANEUL_SYSTEM_ADDRESS = normalizeHaneulAddress('0x3');\n\nexport type RawTransactionArgument<T> = T | TransactionArgument;\n\nexport function getPureBcsSchema(typeTag: string | TypeTag): BcsType<any> | null {\n\tconst parsedTag = typeof typeTag === 'string' ? TypeTagSerializer.parseFromStr(typeTag) : typeTag;\n\n\tif ('u8' in parsedTag) {\n\t\treturn bcs.U8;\n\t} else if ('u16' in parsedTag) {\n\t\treturn bcs.U16;\n\t} else if ('u32' in parsedTag) {\n\t\treturn bcs.U32;\n\t} else if ('u64' in parsedTag) {\n\t\treturn bcs.U64;\n\t} else if ('u128' in parsedTag) {\n\t\treturn bcs.U128;\n\t} else if ('u256' in parsedTag) {\n\t\treturn bcs.U256;\n\t} else if ('address' in parsedTag) {\n\t\treturn bcs.Address;\n\t} else if ('bool' in parsedTag) {\n\t\treturn bcs.Bool;\n\t} else if ('vector' in parsedTag) {\n\t\tconst type = getPureBcsSchema(parsedTag.vector);\n\t\treturn type ? bcs.vector(type) : null;\n\t} else if ('struct' in parsedTag) {\n\t\tconst structTag = parsedTag.struct;\n\t\tconst pkg = normalizeHaneulAddress(parsedTag.struct.address);\n\n\t\tif (pkg === MOVE_STDLIB_ADDRESS) {\n\t\t\tif (\n\t\t\t\t(structTag.module === 'ascii' || structTag.module === 'string') &&\n\t\t\t\tstructTag.name === 'String'\n\t\t\t) {\n\t\t\t\treturn bcs.String;\n\t\t\t}\n\n\t\t\tif (structTag.module === 'option' && structTag.name === 'Option') {\n\t\t\t\tconst type = getPureBcsSchema(structTag.typeParams[0]!);\n\t\t\t\treturn type ? bcs.option(type) : null;\n\t\t\t}\n\t\t}\n\n\t\tif (pkg === HANEUL_FRAMEWORK_ADDRESS && structTag.module === 'Object' && structTag.name === 'ID') {\n\t\t\treturn bcs.Address;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport function normalizeMoveArguments(args: unknown[] | object, argTypes: string[], parameterNames?: string[]) {\n\tconst argLen = Array.isArray(args) ? args.length : Object.keys(args).length;\n\tif (parameterNames && argLen !== parameterNames.length) {\n\t\tthrow new Error(\n\t\t\t\\`Invalid number of arguments, expected \\${parameterNames.length}, got \\${argLen}\\`,\n\t\t);\n\t}\n\n\tconst normalizedArgs: TransactionArgument[] = [];\n\n\tlet index = 0;\n\tfor (const [i, argType] of argTypes.entries()) {\n\t\tif (argType === \\`\\${HANEUL_FRAMEWORK_ADDRESS}::deny_list::DenyList\\`) {\n\t\t\tnormalizedArgs.push((tx) => tx.object.denyList());\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (argType === \\`\\${HANEUL_FRAMEWORK_ADDRESS}::random::Random\\`) {\n\t\t\tnormalizedArgs.push((tx) => tx.object.random());\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (argType === \\`\\${HANEUL_FRAMEWORK_ADDRESS}::clock::Clock\\`) {\n\t\t\tnormalizedArgs.push((tx) => tx.object.clock());\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (argType === \\`\\${HANEUL_SYSTEM_ADDRESS}::haneul_system::HaneulSystemState\\`) {\n\t\t\tnormalizedArgs.push((tx) => tx.object.system());\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet arg\n\t\tif (Array.isArray(args)) {\n\t\t\tif (index >= args.length) {\n\t\t\t\tthrow new Error(\\`Invalid number of arguments, expected at least \\${index + 1}, got \\${args.length}\\`);\n\t\t\t}\n\t\t\targ = args[index];\n\t\t} else {\n\t\t\tif (!parameterNames) {\n\t\t\t\tthrow new Error(\\`Expected arguments to be passed as an array\\`);\n\t\t\t}\n\t\t\tconst name = parameterNames[index];\n\t\t\targ = args[name as keyof typeof args];\n\n\t\t\tif (arg === undefined) {\n\t\t\t\tthrow new Error(\\`Parameter \\${name} is required\\`);\n\t\t\t}\n\t\t}\n\n\t\tindex += 1;\n\n\t\tif (typeof arg === 'function' || isArgument(arg)) {\n\t\t\tnormalizedArgs.push(arg as TransactionArgument);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst type = argTypes[i]!;\n\t\tconst bcsType = getPureBcsSchema(type);\n\n\t\tif (bcsType) {\n\t\t\tconst bytes = bcsType.serialize(arg as never);\n\t\t\tnormalizedArgs.push((tx) => tx.pure(bytes));\n\t\t\tcontinue;\n\t\t} else if (typeof arg === 'string') {\n\t\t\tnormalizedArgs.push((tx) => tx.object(arg));\n\t\t\tcontinue;\n\t\t}\n\n\t\tthrow new Error(\\`Invalid argument \\${stringify(arg)} for type \\${type}\\`);\n\t}\n\n\treturn normalizedArgs;\n}\n\nexport class MoveStruct<\n\tT extends Record<string, BcsType<any>>,\n\tconst Name extends string = string,\n> extends BcsStruct<T, Name> {}\n\nexport class MoveEnum<\n\tT extends Record<string, BcsType<any> | null>,\n\tconst Name extends string,\n> extends BcsEnum<T, Name> {}\n\nexport class MoveTuple<\n\tT extends readonly BcsType<any>[],\n\tconst Name extends string,\n> extends BcsTuple<T, Name> {}\n\nfunction stringify(val: unknown) {\n\tif (typeof val === 'object') {\n\t\treturn JSON.stringify(val, (val: unknown) => val);\n\t}\n\tif (typeof val === 'bigint') {\n\t\treturn val.toString();\n\t}\n\n\treturn val;\n}\n`;\n"],
5
+ "mappings": "AAGO,MAAM;AAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,8 @@
1
+ import type { PackageConfig } from './config.js';
2
+ export { type HaneulCodegenConfig } from './config.js';
3
+ export declare function generateFromPackageSummary({ package: pkg, prune, outputDir, privateMethods, }: {
4
+ package: PackageConfig;
5
+ prune: boolean;
6
+ outputDir: string;
7
+ privateMethods: 'none' | 'entry' | 'all';
8
+ }): Promise<void>;
@@ -0,0 +1,104 @@
1
+ import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
2
+ import { basename, join } from "node:path";
3
+ import { MoveModuleBuilder } from "./move-module-builder.js";
4
+ import { existsSync, statSync } from "node:fs";
5
+ import { utilsContent } from "./generate-utils.js";
6
+ import { parse } from "toml";
7
+ async function generateFromPackageSummary({
8
+ package: pkg,
9
+ prune,
10
+ outputDir,
11
+ privateMethods
12
+ }) {
13
+ if (!pkg.path) {
14
+ throw new Error(`On-chain packages are not supported yet (got ${pkg.package})`);
15
+ }
16
+ const summaryDir = join(pkg.path, "package_summaries");
17
+ if (!existsSync(summaryDir)) {
18
+ throw new Error(`Package summary directory not found: ${summaryDir}`);
19
+ }
20
+ let packageName = pkg.packageName;
21
+ const mvrNameOrAddress = pkg.package;
22
+ if (!pkg.packageName) {
23
+ try {
24
+ const packageToml = await readFile(join(pkg.path, "Move.toml"), "utf-8");
25
+ packageName = parse(packageToml).package.name.toLowerCase();
26
+ } catch {
27
+ const message = `Package name not found in package.toml for ${pkg.path}`;
28
+ if (packageName) {
29
+ console.warn(message);
30
+ } else {
31
+ throw new Error(message);
32
+ }
33
+ }
34
+ }
35
+ if (!existsSync(summaryDir)) {
36
+ throw new Error(`Package summary directory not found: ${summaryDir}`);
37
+ }
38
+ const addressMappings = JSON.parse(
39
+ await readFile(join(summaryDir, "address_mapping.json"), "utf-8")
40
+ );
41
+ const packages = (await readdir(summaryDir)).filter(
42
+ (file) => statSync(join(summaryDir, file)).isDirectory()
43
+ );
44
+ const modules = (await Promise.all(
45
+ packages.map(async (pkg2) => {
46
+ const modules2 = await readdir(join(summaryDir, pkg2));
47
+ return Promise.all(
48
+ modules2.map(async (mod) => ({
49
+ package: pkg2,
50
+ isMainPackage: pkg2 === packageName,
51
+ module: basename(mod, ".json"),
52
+ builder: await MoveModuleBuilder.fromSummaryFile(
53
+ join(summaryDir, pkg2, mod),
54
+ addressMappings,
55
+ pkg2 === packageName ? mvrNameOrAddress : void 0
56
+ )
57
+ }))
58
+ );
59
+ })
60
+ )).flat();
61
+ const moduleBuilders = Object.fromEntries(
62
+ modules.map((mod) => [`${mod.package}::${mod.module}`, mod.builder])
63
+ );
64
+ modules.forEach((mod) => {
65
+ if (mod.isMainPackage || !prune) {
66
+ mod.builder.includeAllTypes(moduleBuilders);
67
+ mod.builder.includeAllFunctions({ privateMethods });
68
+ }
69
+ });
70
+ await generateUtils({ outputDir });
71
+ await Promise.all(
72
+ modules.map(async (mod) => {
73
+ if ((mod.isMainPackage || !prune) && mod.builder.hasTypesOrFunctions()) {
74
+ await mod.builder.renderBCSTypes();
75
+ await mod.builder.renderFunctions();
76
+ } else if (mod.isMainPackage) {
77
+ return;
78
+ } else if (mod.builder.hasBcsTypes()) {
79
+ await mod.builder.renderBCSTypes();
80
+ } else {
81
+ return;
82
+ }
83
+ await mkdir(
84
+ mod.isMainPackage ? join(outputDir, packageName) : join(outputDir, packageName, "deps", mod.package),
85
+ { recursive: true }
86
+ );
87
+ await writeFile(
88
+ mod.isMainPackage ? join(outputDir, packageName, `${mod.module}.ts`) : join(outputDir, packageName, "deps", mod.package, `${mod.module}.ts`),
89
+ await mod.builder.toString(
90
+ "./",
91
+ mod.isMainPackage ? `./${mod.module}.ts` : `./deps/${mod.package}/${mod.module}.ts`
92
+ )
93
+ );
94
+ })
95
+ );
96
+ }
97
+ async function generateUtils({ outputDir }) {
98
+ await mkdir(join(outputDir, "utils"), { recursive: true });
99
+ await writeFile(join(outputDir, "utils", "index.ts"), utilsContent);
100
+ }
101
+ export {
102
+ generateFromPackageSummary
103
+ };
104
+ //# sourceMappingURL=index.js.map