@haneullabs/codegen 0.1.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/CHANGELOG.md +128 -33
  2. package/README.md +35 -33
  3. package/dist/bin/bash-complete.d.mts +6 -0
  4. package/dist/bin/bash-complete.d.mts.map +1 -0
  5. package/dist/bin/bash-complete.mjs +29 -0
  6. package/dist/bin/bash-complete.mjs.map +1 -0
  7. package/dist/bin/cli.d.mts +1 -0
  8. package/dist/bin/cli.mjs +24 -0
  9. package/dist/bin/cli.mjs.map +1 -0
  10. package/dist/cli/cli.mjs +28 -0
  11. package/dist/cli/cli.mjs.map +1 -0
  12. package/dist/cli/commands/generate/command.mjs +90 -0
  13. package/dist/cli/commands/generate/command.mjs.map +1 -0
  14. package/dist/cli/commands/generate/impl.mjs +72 -0
  15. package/dist/cli/commands/generate/impl.mjs.map +1 -0
  16. package/dist/cli/context.mjs +17 -0
  17. package/dist/cli/context.mjs.map +1 -0
  18. package/dist/config.d.mts +106 -0
  19. package/dist/config.d.mts.map +1 -0
  20. package/dist/config.mjs +70 -0
  21. package/dist/config.mjs.map +1 -0
  22. package/dist/file-builder.mjs +65 -0
  23. package/dist/file-builder.mjs.map +1 -0
  24. package/dist/{esm/generate-utils.js → generate-utils.mjs} +95 -27
  25. package/dist/generate-utils.mjs.map +1 -0
  26. package/dist/index.d.mts +21 -0
  27. package/dist/index.d.mts.map +1 -0
  28. package/dist/index.mjs +80 -0
  29. package/dist/index.mjs.map +1 -0
  30. package/dist/move-module-builder.mjs +350 -0
  31. package/dist/move-module-builder.mjs.map +1 -0
  32. package/dist/render-types.mjs +207 -0
  33. package/dist/render-types.mjs.map +1 -0
  34. package/dist/utils.mjs +89 -0
  35. package/dist/utils.mjs.map +1 -0
  36. package/package.json +27 -28
  37. package/src/bin/bash-complete.ts +18 -7
  38. package/src/bin/cli.ts +3 -9
  39. package/src/cli/commands/generate/command.ts +32 -0
  40. package/src/cli/commands/generate/impl.ts +93 -5
  41. package/src/config.ts +55 -7
  42. package/src/file-builder.ts +14 -1
  43. package/src/generate-utils.ts +88 -18
  44. package/src/index.ts +89 -29
  45. package/src/move-module-builder.ts +181 -76
  46. package/src/render-types.ts +82 -29
  47. package/dist/cjs/bin/bash-complete.d.ts +0 -2
  48. package/dist/cjs/bin/bash-complete.js +0 -51
  49. package/dist/cjs/bin/bash-complete.js.map +0 -7
  50. package/dist/cjs/bin/cli.d.ts +0 -2
  51. package/dist/cjs/bin/cli.js +0 -34
  52. package/dist/cjs/bin/cli.js.map +0 -7
  53. package/dist/cjs/cli/cli.d.ts +0 -1
  54. package/dist/cjs/cli/cli.js +0 -49
  55. package/dist/cjs/cli/cli.js.map +0 -7
  56. package/dist/cjs/cli/commands/generate/command.d.ts +0 -1
  57. package/dist/cjs/cli/commands/generate/command.js +0 -80
  58. package/dist/cjs/cli/commands/generate/command.js.map +0 -7
  59. package/dist/cjs/cli/commands/generate/impl.d.ts +0 -8
  60. package/dist/cjs/cli/commands/generate/impl.js +0 -66
  61. package/dist/cjs/cli/commands/generate/impl.js.map +0 -7
  62. package/dist/cjs/cli/context.d.ts +0 -6
  63. package/dist/cjs/cli/context.js +0 -45
  64. package/dist/cjs/cli/context.js.map +0 -7
  65. package/dist/cjs/config.d.ts +0 -51
  66. package/dist/cjs/config.js +0 -75
  67. package/dist/cjs/config.js.map +0 -7
  68. package/dist/cjs/file-builder.d.ts +0 -13
  69. package/dist/cjs/file-builder.js +0 -83
  70. package/dist/cjs/file-builder.js.map +0 -7
  71. package/dist/cjs/generate-utils.d.ts +0 -1
  72. package/dist/cjs/generate-utils.js +0 -187
  73. package/dist/cjs/generate-utils.js.map +0 -7
  74. package/dist/cjs/index.d.ts +0 -8
  75. package/dist/cjs/index.js +0 -124
  76. package/dist/cjs/index.js.map +0 -7
  77. package/dist/cjs/move-module-builder.d.ts +0 -26
  78. package/dist/cjs/move-module-builder.js +0 -464
  79. package/dist/cjs/move-module-builder.js.map +0 -7
  80. package/dist/cjs/package.json +0 -5
  81. package/dist/cjs/render-types.d.ts +0 -19
  82. package/dist/cjs/render-types.js +0 -313
  83. package/dist/cjs/render-types.js.map +0 -7
  84. package/dist/cjs/summary.d.ts +0 -3
  85. package/dist/cjs/summary.js +0 -218
  86. package/dist/cjs/summary.js.map +0 -7
  87. package/dist/cjs/types/deserialized.d.ts +0 -89
  88. package/dist/cjs/types/deserialized.js +0 -17
  89. package/dist/cjs/types/deserialized.js.map +0 -7
  90. package/dist/cjs/types/summary.d.ts +0 -105
  91. package/dist/cjs/types/summary.js +0 -17
  92. package/dist/cjs/types/summary.js.map +0 -7
  93. package/dist/cjs/utils.d.ts +0 -22
  94. package/dist/cjs/utils.js +0 -164
  95. package/dist/cjs/utils.js.map +0 -7
  96. package/dist/esm/bin/bash-complete.d.ts +0 -2
  97. package/dist/esm/bin/bash-complete.js +0 -31
  98. package/dist/esm/bin/bash-complete.js.map +0 -7
  99. package/dist/esm/bin/cli.d.ts +0 -2
  100. package/dist/esm/bin/cli.js +0 -32
  101. package/dist/esm/bin/cli.js.map +0 -7
  102. package/dist/esm/cli/cli.d.ts +0 -1
  103. package/dist/esm/cli/cli.js +0 -29
  104. package/dist/esm/cli/cli.js.map +0 -7
  105. package/dist/esm/cli/commands/generate/command.d.ts +0 -1
  106. package/dist/esm/cli/commands/generate/command.js +0 -50
  107. package/dist/esm/cli/commands/generate/command.js.map +0 -7
  108. package/dist/esm/cli/commands/generate/impl.d.ts +0 -8
  109. package/dist/esm/cli/commands/generate/impl.js +0 -46
  110. package/dist/esm/cli/commands/generate/impl.js.map +0 -7
  111. package/dist/esm/cli/context.d.ts +0 -6
  112. package/dist/esm/cli/context.js +0 -15
  113. package/dist/esm/cli/context.js.map +0 -7
  114. package/dist/esm/config.d.ts +0 -51
  115. package/dist/esm/config.js +0 -45
  116. package/dist/esm/config.js.map +0 -7
  117. package/dist/esm/file-builder.d.ts +0 -13
  118. package/dist/esm/file-builder.js +0 -63
  119. package/dist/esm/file-builder.js.map +0 -7
  120. package/dist/esm/generate-utils.d.ts +0 -1
  121. package/dist/esm/generate-utils.js.map +0 -7
  122. package/dist/esm/index.d.ts +0 -8
  123. package/dist/esm/index.js +0 -104
  124. package/dist/esm/index.js.map +0 -7
  125. package/dist/esm/move-module-builder.d.ts +0 -26
  126. package/dist/esm/move-module-builder.js +0 -457
  127. package/dist/esm/move-module-builder.js.map +0 -7
  128. package/dist/esm/package.json +0 -5
  129. package/dist/esm/render-types.d.ts +0 -19
  130. package/dist/esm/render-types.js +0 -293
  131. package/dist/esm/render-types.js.map +0 -7
  132. package/dist/esm/summary.d.ts +0 -3
  133. package/dist/esm/summary.js +0 -198
  134. package/dist/esm/summary.js.map +0 -7
  135. package/dist/esm/types/deserialized.d.ts +0 -89
  136. package/dist/esm/types/deserialized.js +0 -1
  137. package/dist/esm/types/deserialized.js.map +0 -7
  138. package/dist/esm/types/summary.d.ts +0 -105
  139. package/dist/esm/types/summary.js +0 -1
  140. package/dist/esm/types/summary.js.map +0 -7
  141. package/dist/esm/utils.d.ts +0 -22
  142. package/dist/esm/utils.js +0 -134
  143. package/dist/esm/utils.js.map +0 -7
  144. package/dist/tsconfig.esm.tsbuildinfo +0 -1
  145. package/dist/tsconfig.tsbuildinfo +0 -1
package/dist/index.mjs ADDED
@@ -0,0 +1,80 @@
1
+ import { MoveModuleBuilder } from "./move-module-builder.mjs";
2
+ import { utilsContent } from "./generate-utils.mjs";
3
+ import { mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
4
+ import { basename, join } from "node:path";
5
+ import { existsSync, statSync } from "node:fs";
6
+ import { parse } from "toml";
7
+
8
+ //#region src/index.ts
9
+ async function generateFromPackageSummary({ package: pkg, prune, outputDir, globalGenerate, importExtension = ".js", includePhantomTypeParameters = false }) {
10
+ if (!pkg.path) throw new Error(`Package path is required (got ${pkg.package})`);
11
+ const localSummaryDir = join(pkg.path, "package_summaries");
12
+ const isOnChainPackage = existsSync(join(pkg.path, "root_package_metadata.json"));
13
+ const summaryDir = isOnChainPackage ? pkg.path : localSummaryDir;
14
+ if (!existsSync(summaryDir) || !existsSync(join(summaryDir, "address_mapping.json"))) throw new Error(`Package summary directory not found: ${summaryDir}`);
15
+ let packageName = pkg.packageName;
16
+ let mainPackageAddress;
17
+ const mvrNameOrAddress = pkg.package;
18
+ if (isOnChainPackage) {
19
+ mainPackageAddress = JSON.parse(await readFile(join(pkg.path, "root_package_metadata.json"), "utf-8")).root_package_id;
20
+ if (!packageName) packageName = mainPackageAddress;
21
+ } else if (!pkg.packageName) try {
22
+ packageName = parse(await readFile(join(pkg.path, "Move.toml"), "utf-8")).package.name.toLowerCase();
23
+ } catch {
24
+ const message = `Package name not found in package.toml for ${pkg.path}`;
25
+ if (packageName) console.warn(message);
26
+ else throw new Error(message);
27
+ }
28
+ const addressMappings = JSON.parse(await readFile(join(summaryDir, "address_mapping.json"), "utf-8"));
29
+ const packages = (await readdir(summaryDir)).filter((file) => statSync(join(summaryDir, file)).isDirectory());
30
+ const isMainPackage = (pkgDir) => {
31
+ if (isOnChainPackage) return pkgDir === mainPackageAddress;
32
+ return pkgDir === packageName;
33
+ };
34
+ const modules = (await Promise.all(packages.map(async (pkgDir) => {
35
+ const moduleFiles = await readdir(join(summaryDir, pkgDir));
36
+ return Promise.all(moduleFiles.filter((f) => f.endsWith(".json")).map(async (mod) => ({
37
+ package: pkgDir,
38
+ isMainPackage: isMainPackage(pkgDir),
39
+ module: basename(mod, ".json"),
40
+ builder: await MoveModuleBuilder.fromSummaryFile(join(summaryDir, pkgDir, mod), addressMappings, isMainPackage(pkgDir) ? mvrNameOrAddress : void 0, importExtension, includePhantomTypeParameters)
41
+ })));
42
+ }))).flat();
43
+ const moduleBuilders = Object.fromEntries(modules.map((mod) => [`${mod.package}::${mod.module}`, mod.builder]));
44
+ const packageGenerate = "generate" in pkg ? pkg.generate : void 0;
45
+ const pkgModules = packageGenerate?.modules;
46
+ const pkgTypes = packageGenerate?.types ?? globalGenerate?.types ?? true;
47
+ const pkgFunctions = packageGenerate?.functions ?? globalGenerate?.functions ?? true;
48
+ for (const mod of modules) {
49
+ if (!mod.isMainPackage && prune) continue;
50
+ const moduleGenerate = !pkgModules ? true : Array.isArray(pkgModules) ? pkgModules.includes(mod.module) || null : mod.module in pkgModules ? pkgModules[mod.module] : null;
51
+ if (!moduleGenerate) continue;
52
+ const types = moduleGenerate === true ? pkgTypes : moduleGenerate.types ?? false;
53
+ const functions = moduleGenerate === true ? pkgFunctions : moduleGenerate.functions ?? false;
54
+ mod.builder.includeTypes(moduleBuilders, types);
55
+ mod.builder.includeFunctions(functions);
56
+ }
57
+ await generateUtils({ outputDir });
58
+ await rm(join(outputDir, packageName), {
59
+ recursive: true,
60
+ force: true
61
+ });
62
+ await Promise.all(modules.map(async (mod) => {
63
+ if ((mod.isMainPackage || !prune) && mod.builder.hasTypesOrFunctions()) {
64
+ await mod.builder.renderBCSTypes();
65
+ await mod.builder.renderFunctions();
66
+ } else if (mod.isMainPackage) return;
67
+ else if (mod.builder.hasBcsTypes()) await mod.builder.renderBCSTypes();
68
+ else return;
69
+ await mkdir(mod.isMainPackage ? join(outputDir, packageName) : join(outputDir, packageName, "deps", mod.package), { recursive: true });
70
+ await writeFile(mod.isMainPackage ? join(outputDir, packageName, `${mod.module}.ts`) : join(outputDir, packageName, "deps", mod.package, `${mod.module}.ts`), await mod.builder.toString("./", mod.isMainPackage ? `./${mod.module}.ts` : `./deps/${mod.package}/${mod.module}.ts`));
71
+ }));
72
+ }
73
+ async function generateUtils({ outputDir }) {
74
+ await mkdir(join(outputDir, "utils"), { recursive: true });
75
+ await writeFile(join(outputDir, "utils", "index.ts"), utilsContent);
76
+ }
77
+
78
+ //#endregion
79
+ export { generateFromPackageSummary };
80
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { basename, join } from 'node:path';\nimport { MoveModuleBuilder } from './move-module-builder.js';\nimport { existsSync, statSync } from 'node:fs';\nimport { utilsContent } from './generate-utils.js';\nimport { parse } from 'toml';\nimport type {\n\tFunctionsOption,\n\tGenerateBase,\n\tImportExtension,\n\tPackageConfig,\n\tPackageGenerate,\n\tTypesOption,\n} from './config.js';\nexport { type HaneulCodegenConfig } from './config.js';\n\nexport async function generateFromPackageSummary({\n\tpackage: pkg,\n\tprune,\n\toutputDir,\n\tglobalGenerate,\n\timportExtension = '.js',\n\tincludePhantomTypeParameters = false,\n}: {\n\tpackage: PackageConfig;\n\tprune: boolean;\n\toutputDir: string;\n\tglobalGenerate?: GenerateBase;\n\timportExtension?: ImportExtension;\n\tincludePhantomTypeParameters?: boolean;\n}) {\n\tif (!pkg.path) {\n\t\tthrow new Error(`Package path is required (got ${pkg.package})`);\n\t}\n\n\t// Check for on-chain package summary (directly in path) or local package summary (in package_summaries subdirectory)\n\tconst localSummaryDir = join(pkg.path, 'package_summaries');\n\tconst isOnChainPackage = existsSync(join(pkg.path, 'root_package_metadata.json'));\n\tconst summaryDir = isOnChainPackage ? pkg.path : localSummaryDir;\n\n\tif (!existsSync(summaryDir) || !existsSync(join(summaryDir, 'address_mapping.json'))) {\n\t\tthrow new Error(`Package summary directory not found: ${summaryDir}`);\n\t}\n\n\tlet packageName = pkg.packageName!;\n\tlet mainPackageAddress: string | undefined;\n\tconst mvrNameOrAddress = pkg.package;\n\n\tif (isOnChainPackage) {\n\t\t// For on-chain packages, get the main package address from root_package_metadata.json\n\t\tconst metadata = JSON.parse(\n\t\t\tawait readFile(join(pkg.path, 'root_package_metadata.json'), 'utf-8'),\n\t\t);\n\t\tmainPackageAddress = metadata.root_package_id;\n\t\t// Use the package name provided or fall back to the full address\n\t\tif (!packageName) {\n\t\t\tpackageName = mainPackageAddress!;\n\t\t}\n\t} else if (!pkg.packageName) {\n\t\ttry {\n\t\t\tconst packageToml = await readFile(join(pkg.path, 'Move.toml'), 'utf-8');\n\t\t\tpackageName = parse(packageToml).package.name.toLowerCase();\n\t\t} catch {\n\t\t\tconst message = `Package name not found in package.toml for ${pkg.path}`;\n\t\t\tif (packageName) {\n\t\t\t\tconsole.warn(message);\n\t\t\t} else {\n\t\t\t\tthrow new Error(message);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst addressMappings: Record<string, string> = JSON.parse(\n\t\tawait readFile(join(summaryDir, 'address_mapping.json'), 'utf-8'),\n\t);\n\n\tconst packages = (await readdir(summaryDir)).filter((file) =>\n\t\tstatSync(join(summaryDir, file)).isDirectory(),\n\t);\n\n\t// For on-chain packages, the main package is identified by the root_package_id\n\t// For local packages, it's identified by the packageName\n\tconst isMainPackage = (pkgDir: string) => {\n\t\tif (isOnChainPackage) {\n\t\t\treturn pkgDir === mainPackageAddress;\n\t\t}\n\t\treturn pkgDir === packageName;\n\t};\n\n\tconst modules = (\n\t\tawait Promise.all(\n\t\t\tpackages.map(async (pkgDir) => {\n\t\t\t\tconst moduleFiles = await readdir(join(summaryDir, pkgDir));\n\t\t\t\treturn Promise.all(\n\t\t\t\t\tmoduleFiles\n\t\t\t\t\t\t.filter((f) => f.endsWith('.json'))\n\t\t\t\t\t\t.map(async (mod) => ({\n\t\t\t\t\t\t\tpackage: pkgDir,\n\t\t\t\t\t\t\tisMainPackage: isMainPackage(pkgDir),\n\t\t\t\t\t\t\tmodule: basename(mod, '.json'),\n\t\t\t\t\t\t\tbuilder: await MoveModuleBuilder.fromSummaryFile(\n\t\t\t\t\t\t\t\tjoin(summaryDir, pkgDir, mod),\n\t\t\t\t\t\t\t\taddressMappings,\n\t\t\t\t\t\t\t\tisMainPackage(pkgDir) ? mvrNameOrAddress : undefined,\n\t\t\t\t\t\t\t\timportExtension,\n\t\t\t\t\t\t\t\tincludePhantomTypeParameters,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t}),\n\t\t)\n\t).flat();\n\n\tconst moduleBuilders = Object.fromEntries(\n\t\tmodules.map((mod) => [`${mod.package}::${mod.module}`, mod.builder]),\n\t);\n\n\tconst packageGenerate: PackageGenerate | undefined = 'generate' in pkg ? pkg.generate : undefined;\n\tconst pkgModules = packageGenerate?.modules;\n\tconst pkgTypes: TypesOption = packageGenerate?.types ?? globalGenerate?.types ?? true;\n\tconst pkgFunctions: FunctionsOption =\n\t\tpackageGenerate?.functions ?? globalGenerate?.functions ?? true;\n\n\tfor (const mod of modules) {\n\t\tif (!mod.isMainPackage && prune) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst moduleGenerate = !pkgModules\n\t\t\t? true\n\t\t\t: Array.isArray(pkgModules)\n\t\t\t\t? pkgModules.includes(mod.module) || null\n\t\t\t\t: mod.module in pkgModules\n\t\t\t\t\t? pkgModules[mod.module]\n\t\t\t\t\t: null;\n\n\t\tif (!moduleGenerate) continue;\n\n\t\tconst types = moduleGenerate === true ? pkgTypes : (moduleGenerate.types ?? false);\n\t\tconst functions = moduleGenerate === true ? pkgFunctions : (moduleGenerate.functions ?? false);\n\n\t\tmod.builder.includeTypes(moduleBuilders, types);\n\t\tmod.builder.includeFunctions(functions);\n\t}\n\n\tawait generateUtils({ outputDir });\n\n\t// Clean the package output directory to remove stale files from previous runs\n\tconst packageOutputDir = join(outputDir, packageName);\n\tawait rm(packageOutputDir, { recursive: true, force: true });\n\n\tawait Promise.all(\n\t\tmodules.map(async (mod) => {\n\t\t\tif ((mod.isMainPackage || !prune) && mod.builder.hasTypesOrFunctions()) {\n\t\t\t\tawait mod.builder.renderBCSTypes();\n\t\t\t\tawait mod.builder.renderFunctions();\n\t\t\t} else if (mod.isMainPackage) {\n\t\t\t\treturn;\n\t\t\t} else if (mod.builder.hasBcsTypes()) {\n\t\t\t\tawait mod.builder.renderBCSTypes();\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait mkdir(\n\t\t\t\tmod.isMainPackage\n\t\t\t\t\t? join(outputDir, packageName)\n\t\t\t\t\t: join(outputDir, packageName, 'deps', mod.package),\n\t\t\t\t{ recursive: true },\n\t\t\t);\n\n\t\t\tawait writeFile(\n\t\t\t\tmod.isMainPackage\n\t\t\t\t\t? join(outputDir, packageName, `${mod.module}.ts`)\n\t\t\t\t\t: join(outputDir, packageName, 'deps', mod.package, `${mod.module}.ts`),\n\t\t\t\tawait mod.builder.toString(\n\t\t\t\t\t'./',\n\t\t\t\t\tmod.isMainPackage ? `./${mod.module}.ts` : `./deps/${mod.package}/${mod.module}.ts`,\n\t\t\t\t),\n\t\t\t);\n\t\t}),\n\t);\n}\n\nasync function generateUtils({ outputDir }: { outputDir: string }) {\n\tawait mkdir(join(outputDir, 'utils'), { recursive: true });\n\tawait writeFile(join(outputDir, 'utils', 'index.ts'), utilsContent);\n}\n"],"mappings":";;;;;;;;AAmBA,eAAsB,2BAA2B,EAChD,SAAS,KACT,OACA,WACA,gBACA,kBAAkB,OAClB,+BAA+B,SAQ7B;AACF,KAAI,CAAC,IAAI,KACR,OAAM,IAAI,MAAM,iCAAiC,IAAI,QAAQ,GAAG;CAIjE,MAAM,kBAAkB,KAAK,IAAI,MAAM,oBAAoB;CAC3D,MAAM,mBAAmB,WAAW,KAAK,IAAI,MAAM,6BAA6B,CAAC;CACjF,MAAM,aAAa,mBAAmB,IAAI,OAAO;AAEjD,KAAI,CAAC,WAAW,WAAW,IAAI,CAAC,WAAW,KAAK,YAAY,uBAAuB,CAAC,CACnF,OAAM,IAAI,MAAM,wCAAwC,aAAa;CAGtE,IAAI,cAAc,IAAI;CACtB,IAAI;CACJ,MAAM,mBAAmB,IAAI;AAE7B,KAAI,kBAAkB;AAKrB,uBAHiB,KAAK,MACrB,MAAM,SAAS,KAAK,IAAI,MAAM,6BAA6B,EAAE,QAAQ,CACrE,CAC6B;AAE9B,MAAI,CAAC,YACJ,eAAc;YAEL,CAAC,IAAI,YACf,KAAI;AAEH,gBAAc,MADM,MAAM,SAAS,KAAK,IAAI,MAAM,YAAY,EAAE,QAAQ,CACxC,CAAC,QAAQ,KAAK,aAAa;SACpD;EACP,MAAM,UAAU,8CAA8C,IAAI;AAClE,MAAI,YACH,SAAQ,KAAK,QAAQ;MAErB,OAAM,IAAI,MAAM,QAAQ;;CAK3B,MAAM,kBAA0C,KAAK,MACpD,MAAM,SAAS,KAAK,YAAY,uBAAuB,EAAE,QAAQ,CACjE;CAED,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,QAAQ,SACpD,SAAS,KAAK,YAAY,KAAK,CAAC,CAAC,aAAa,CAC9C;CAID,MAAM,iBAAiB,WAAmB;AACzC,MAAI,iBACH,QAAO,WAAW;AAEnB,SAAO,WAAW;;CAGnB,MAAM,WACL,MAAM,QAAQ,IACb,SAAS,IAAI,OAAO,WAAW;EAC9B,MAAM,cAAc,MAAM,QAAQ,KAAK,YAAY,OAAO,CAAC;AAC3D,SAAO,QAAQ,IACd,YACE,QAAQ,MAAM,EAAE,SAAS,QAAQ,CAAC,CAClC,IAAI,OAAO,SAAS;GACpB,SAAS;GACT,eAAe,cAAc,OAAO;GACpC,QAAQ,SAAS,KAAK,QAAQ;GAC9B,SAAS,MAAM,kBAAkB,gBAChC,KAAK,YAAY,QAAQ,IAAI,EAC7B,iBACA,cAAc,OAAO,GAAG,mBAAmB,QAC3C,iBACA,6BACA;GACD,EAAE,CACJ;GACA,CACF,EACA,MAAM;CAER,MAAM,iBAAiB,OAAO,YAC7B,QAAQ,KAAK,QAAQ,CAAC,GAAG,IAAI,QAAQ,IAAI,IAAI,UAAU,IAAI,QAAQ,CAAC,CACpE;CAED,MAAM,kBAA+C,cAAc,MAAM,IAAI,WAAW;CACxF,MAAM,aAAa,iBAAiB;CACpC,MAAM,WAAwB,iBAAiB,SAAS,gBAAgB,SAAS;CACjF,MAAM,eACL,iBAAiB,aAAa,gBAAgB,aAAa;AAE5D,MAAK,MAAM,OAAO,SAAS;AAC1B,MAAI,CAAC,IAAI,iBAAiB,MACzB;EAGD,MAAM,iBAAiB,CAAC,aACrB,OACA,MAAM,QAAQ,WAAW,GACxB,WAAW,SAAS,IAAI,OAAO,IAAI,OACnC,IAAI,UAAU,aACb,WAAW,IAAI,UACf;AAEL,MAAI,CAAC,eAAgB;EAErB,MAAM,QAAQ,mBAAmB,OAAO,WAAY,eAAe,SAAS;EAC5E,MAAM,YAAY,mBAAmB,OAAO,eAAgB,eAAe,aAAa;AAExF,MAAI,QAAQ,aAAa,gBAAgB,MAAM;AAC/C,MAAI,QAAQ,iBAAiB,UAAU;;AAGxC,OAAM,cAAc,EAAE,WAAW,CAAC;AAIlC,OAAM,GADmB,KAAK,WAAW,YAAY,EAC1B;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;AAE5D,OAAM,QAAQ,IACb,QAAQ,IAAI,OAAO,QAAQ;AAC1B,OAAK,IAAI,iBAAiB,CAAC,UAAU,IAAI,QAAQ,qBAAqB,EAAE;AACvE,SAAM,IAAI,QAAQ,gBAAgB;AAClC,SAAM,IAAI,QAAQ,iBAAiB;aACzB,IAAI,cACd;WACU,IAAI,QAAQ,aAAa,CACnC,OAAM,IAAI,QAAQ,gBAAgB;MAElC;AAGD,QAAM,MACL,IAAI,gBACD,KAAK,WAAW,YAAY,GAC5B,KAAK,WAAW,aAAa,QAAQ,IAAI,QAAQ,EACpD,EAAE,WAAW,MAAM,CACnB;AAED,QAAM,UACL,IAAI,gBACD,KAAK,WAAW,aAAa,GAAG,IAAI,OAAO,KAAK,GAChD,KAAK,WAAW,aAAa,QAAQ,IAAI,SAAS,GAAG,IAAI,OAAO,KAAK,EACxE,MAAM,IAAI,QAAQ,SACjB,MACA,IAAI,gBAAgB,KAAK,IAAI,OAAO,OAAO,UAAU,IAAI,QAAQ,GAAG,IAAI,OAAO,KAC/E,CACD;GACA,CACF;;AAGF,eAAe,cAAc,EAAE,aAAoC;AAClE,OAAM,MAAM,KAAK,WAAW,QAAQ,EAAE,EAAE,WAAW,MAAM,CAAC;AAC1D,OAAM,UAAU,KAAK,WAAW,SAAS,WAAW,EAAE,aAAa"}
@@ -0,0 +1,350 @@
1
+ import { HANEUL_FRAMEWORK_ADDRESS, HANEUL_SYSTEM_ADDRESS, getSafeName, renderTypeSignature } from "./render-types.mjs";
2
+ import { camelCase, capitalize, formatComment, isWellKnownObjectParameter, mapToObject, parseTS, withComment } from "./utils.mjs";
3
+ import { FileBuilder } from "./file-builder.mjs";
4
+ import { readFile } from "node:fs/promises";
5
+ import { join } from "node:path";
6
+
7
+ //#region src/move-module-builder.ts
8
+ const IMPORT_MAP = {
9
+ Transaction: {
10
+ module: "@haneullabs/haneul/transactions",
11
+ isType: true
12
+ },
13
+ BcsType: {
14
+ module: "@haneullabs/haneul/bcs",
15
+ isType: true
16
+ },
17
+ bcs: {
18
+ module: "@haneullabs/haneul/bcs",
19
+ isType: false
20
+ },
21
+ MoveStruct: {
22
+ module: "~root/../utils/index",
23
+ isType: false
24
+ },
25
+ MoveTuple: {
26
+ module: "~root/../utils/index",
27
+ isType: false
28
+ },
29
+ MoveEnum: {
30
+ module: "~root/../utils/index",
31
+ isType: false
32
+ },
33
+ normalizeMoveArguments: {
34
+ module: "~root/../utils/index",
35
+ isType: false
36
+ },
37
+ RawTransactionArgument: {
38
+ module: "~root/../utils/index",
39
+ isType: true
40
+ }
41
+ };
42
+ var MoveModuleBuilder = class MoveModuleBuilder extends FileBuilder {
43
+ #depsDir = "./deps";
44
+ #addressMappings;
45
+ #includedTypes = /* @__PURE__ */ new Set();
46
+ #includedFunctions = /* @__PURE__ */ new Set();
47
+ #orderedTypes = [];
48
+ #mvrNameOrAddress;
49
+ #importNames = {};
50
+ #importExtension;
51
+ #includePhantomTypeParameters;
52
+ constructor({ mvrNameOrAddress, summary, addressMappings = {}, importExtension = ".js", includePhantomTypeParameters = false }) {
53
+ super();
54
+ this.summary = summary;
55
+ this.#addressMappings = addressMappings;
56
+ this.#mvrNameOrAddress = mvrNameOrAddress;
57
+ this.#importExtension = importExtension;
58
+ this.#includePhantomTypeParameters = includePhantomTypeParameters;
59
+ }
60
+ static async fromSummaryFile(file, addressMappings, mvrNameOrAddress, importExtension, includePhantomTypeParameters) {
61
+ return new MoveModuleBuilder({
62
+ summary: JSON.parse(await readFile(file, "utf-8")),
63
+ addressMappings,
64
+ mvrNameOrAddress,
65
+ importExtension,
66
+ includePhantomTypeParameters
67
+ });
68
+ }
69
+ #resolveAddress(address) {
70
+ return this.#addressMappings[address] ?? address;
71
+ }
72
+ #getModuleTypeName() {
73
+ const resolvedAddress = this.#resolveAddress(this.summary.id.address);
74
+ if (resolvedAddress === HANEUL_FRAMEWORK_ADDRESS) return "0x2";
75
+ else if (resolvedAddress === HANEUL_SYSTEM_ADDRESS) return "0x3";
76
+ else return this.#mvrNameOrAddress ?? this.summary.id.address;
77
+ }
78
+ #getImportName(name) {
79
+ if (!this.#importNames[name]) {
80
+ const config = IMPORT_MAP[name];
81
+ const importSpec = config.isType ? `type ${name}` : name;
82
+ const module = config.module.startsWith("~root") ? `${config.module}${this.#importExtension}` : config.module;
83
+ this.#importNames[name] = this.addImport(module, importSpec);
84
+ }
85
+ return this.#importNames[name];
86
+ }
87
+ async getHeader() {
88
+ if (!this.summary.doc) return super.getHeader();
89
+ return `${await super.getHeader()}\n\n/*${await formatComment(this.summary.doc)}*/\n\n`;
90
+ }
91
+ includeFunctions(option) {
92
+ if (option === false) return;
93
+ const filterByVisibility = !Array.isArray(option);
94
+ const names = Array.isArray(option) ? option : Object.keys(this.summary.functions);
95
+ const privateFunctions = typeof option === "object" && filterByVisibility ? option.private ?? "entry" : "entry";
96
+ for (const name of names) {
97
+ const func = this.summary.functions[name];
98
+ if (!func) throw new Error(`Function ${name} not found in ${this.summary.id.address}::${this.summary.id.name}`);
99
+ if (func.macro_) continue;
100
+ if (filterByVisibility && func.visibility !== "Public") {
101
+ if (privateFunctions === false) continue;
102
+ if (privateFunctions === "entry" && !func.entry) continue;
103
+ }
104
+ const safeName = getSafeName(camelCase(name));
105
+ this.reservedNames.add(safeName);
106
+ this.#includedFunctions.add(name);
107
+ }
108
+ }
109
+ includeType(name, moduleBuilders) {
110
+ if (this.#includedTypes.has(name)) return;
111
+ this.#includedTypes.add(name);
112
+ this.reservedNames.add(name);
113
+ const struct = this.summary.structs[name];
114
+ const enum_ = this.summary.enums[name];
115
+ if (!struct && !enum_) throw new Error(`Type ${name} not found in ${this.summary.id.address}::${this.summary.id.name}`);
116
+ if (struct) Object.values(struct.fields.fields).forEach((field) => {
117
+ renderTypeSignature(field.type_, {
118
+ format: "bcs",
119
+ summary: this.summary,
120
+ typeParameters: struct.type_parameters,
121
+ includePhantomTypeParameters: false,
122
+ resolveAddress: (address) => this.#resolveAddress(address),
123
+ onDependency: (address, mod, name$1) => {
124
+ const builder = moduleBuilders[`${address}::${mod}`];
125
+ if (!builder) throw new Error(`Module builder not found for ${address}::${mod}`);
126
+ builder.includeType(name$1, moduleBuilders);
127
+ }
128
+ });
129
+ });
130
+ if (enum_) Object.values(enum_.variants).forEach((variant) => {
131
+ Object.values(variant.fields.fields).forEach((field) => {
132
+ renderTypeSignature(field.type_, {
133
+ format: "bcs",
134
+ summary: this.summary,
135
+ typeParameters: enum_.type_parameters,
136
+ includePhantomTypeParameters: false,
137
+ resolveAddress: (address) => this.#resolveAddress(address),
138
+ onDependency: (address, mod, name$1) => {
139
+ const builder = moduleBuilders[`${address}::${mod}`];
140
+ if (!builder) throw new Error(`Module builder not found for ${address}::${mod}`);
141
+ builder.includeType(name$1, moduleBuilders);
142
+ }
143
+ });
144
+ });
145
+ });
146
+ this.#orderedTypes.push(name);
147
+ }
148
+ includeTypes(moduleBuilders, option) {
149
+ if (option === false) return;
150
+ const names = Array.isArray(option) ? option : [...Object.keys(this.summary.structs), ...Object.keys(this.summary.enums)];
151
+ for (const name of names) this.includeType(name, moduleBuilders);
152
+ }
153
+ async renderBCSTypes() {
154
+ if (this.hasBcsTypes()) this.statements.push(...parseTS`
155
+ const $moduleName = '${this.#getModuleTypeName()}::${this.summary.id.name}';
156
+ `);
157
+ for (const name of this.#orderedTypes) if (this.summary.structs[name]) await this.renderStruct(name);
158
+ else if (this.summary.enums[name]) await this.renderEnum(name);
159
+ }
160
+ hasBcsTypes() {
161
+ return this.#includedTypes.size > 0;
162
+ }
163
+ hasFunctions() {
164
+ return this.#includedFunctions.size > 0;
165
+ }
166
+ hasTypesOrFunctions() {
167
+ return this.hasBcsTypes() || this.hasFunctions();
168
+ }
169
+ async #renderFieldsAsStruct(name, { fields }, typeParameters = [], includePhantomTypeParameters = false) {
170
+ return parseTS`new ${this.#getImportName("MoveStruct")}({ name: \`${name}\`, fields: ${await mapToObject({
171
+ items: Object.entries(fields),
172
+ getComment: ([_name, field]) => field.doc,
173
+ mapper: ([name$1, field]) => [name$1, renderTypeSignature(field.type_, {
174
+ format: "bcs",
175
+ bcsImport: () => this.#getImportName("bcs"),
176
+ summary: this.summary,
177
+ typeParameters,
178
+ includePhantomTypeParameters,
179
+ resolveAddress: (address) => this.#resolveAddress(address),
180
+ onDependency: (address, mod) => {
181
+ if (address !== this.summary.id.address || mod !== this.summary.id.name) return this.addStarImport(address === this.summary.id.address ? `./${mod}${this.#importExtension}` : join(`~root`, this.#depsDir, `${address}/${mod}${this.#importExtension}`), mod);
182
+ }
183
+ })]
184
+ })} })`;
185
+ }
186
+ async #renderFieldsAsTuple(name, { fields }, typeParameters = [], includePhantomTypeParameters = false) {
187
+ return parseTS`new ${this.#getImportName("MoveTuple")}({ name: \`${name}\`, fields: [${Object.values(fields).map((field) => renderTypeSignature(field.type_, {
188
+ format: "bcs",
189
+ summary: this.summary,
190
+ typeParameters,
191
+ includePhantomTypeParameters,
192
+ bcsImport: () => this.#getImportName("bcs"),
193
+ resolveAddress: (address) => this.#resolveAddress(address),
194
+ onDependency: (address, mod) => {
195
+ if (address !== this.summary.id.address || mod !== this.summary.id.name) return this.addStarImport(address === this.summary.id.address ? `./${mod}${this.#importExtension}` : join(`~root`, this.#depsDir, `${address}/${mod}${this.#importExtension}`), mod);
196
+ }
197
+ })).join(", ")}] })`;
198
+ }
199
+ async renderStruct(name) {
200
+ if (!this.#includedTypes.has(name)) return;
201
+ const struct = this.summary.structs[name];
202
+ if (!struct) throw new Error(`Struct ${name} not found in ${this.summary.id.address}::${this.summary.id.name}`);
203
+ this.exports.push(name);
204
+ const includePhantom = this.#includePhantomTypeParameters;
205
+ const params = struct.type_parameters.map((param, i) => ({
206
+ param,
207
+ originalIndex: i
208
+ })).filter(({ param }) => includePhantom || !param.phantom);
209
+ const structName = `\${$moduleName}::${name}`;
210
+ if (params.length === 0) {
211
+ const phantomPlaceholders = struct.type_parameters.some((p) => p.phantom) ? `<${struct.type_parameters.map((p, i) => `phantom ${p.name ?? `T${i}`}`).join(", ")}>` : "";
212
+ this.statements.push(...parseTS`export const ${name} = ${struct.fields.positional_fields ? await this.#renderFieldsAsTuple(`${structName}${phantomPlaceholders}`, struct.fields, struct.type_parameters, includePhantom) : await this.#renderFieldsAsStruct(`${structName}${phantomPlaceholders}`, struct.fields, struct.type_parameters, includePhantom)}`);
213
+ } else {
214
+ const bcsTypeName = this.#getImportName("BcsType");
215
+ const typeParams = `...typeParameters: [${params.map(({ param, originalIndex }) => param.name ?? `T${originalIndex}`).join(", ")}]`;
216
+ const typeGenerics = `${params.map(({ param, originalIndex }) => `${param.name ?? `T${originalIndex}`} extends ${bcsTypeName}<any>`).join(", ")}`;
217
+ let filteredIndex = 0;
218
+ const nameGenerics = struct.type_parameters.map((param, i) => {
219
+ if (!includePhantom && param.phantom) return `phantom ${param.name ?? `T${i}`}`;
220
+ const idx = filteredIndex++;
221
+ return `\${typeParameters[${idx}].name as ${param.name ?? `T${idx}`}['name']}`;
222
+ }).join(", ");
223
+ this.statements.push(...await withComment(struct, parseTS`export function ${name}<${typeGenerics}>(${typeParams}) {
224
+ return ${struct.fields.positional_fields ? await this.#renderFieldsAsTuple(`${structName}<${nameGenerics}>`, struct.fields, struct.type_parameters, includePhantom) : await this.#renderFieldsAsStruct(`${structName}<${nameGenerics}>`, struct.fields, struct.type_parameters, includePhantom)}
225
+ }`));
226
+ }
227
+ }
228
+ async renderEnum(name) {
229
+ if (!this.#includedTypes.has(name)) return;
230
+ const enumDef = this.summary.enums[name];
231
+ if (!enumDef) throw new Error(`Enum ${name} not found in ${this.summary.id.address}::${this.summary.id.name}`);
232
+ const includePhantom = this.#includePhantomTypeParameters;
233
+ const moveEnumName = this.#getImportName("MoveEnum");
234
+ this.exports.push(name);
235
+ const enumName = `\${$moduleName}::${name}`;
236
+ const variantsObject = await mapToObject({
237
+ items: Object.entries(enumDef.variants),
238
+ getComment: ([_name, variant]) => variant.doc,
239
+ mapper: async ([variantName, variant]) => [variantName, Object.keys(variant.fields.fields).length === 0 ? "null" : isPositional(variant.fields) ? Object.keys(variant.fields.fields).length === 1 ? renderTypeSignature(Object.values(variant.fields.fields)[0].type_, {
240
+ format: "bcs",
241
+ summary: this.summary,
242
+ typeParameters: enumDef.type_parameters,
243
+ includePhantomTypeParameters: includePhantom,
244
+ bcsImport: () => this.#getImportName("bcs"),
245
+ resolveAddress: (address) => this.#resolveAddress(address),
246
+ onDependency: (address, mod) => {
247
+ if (address !== this.summary.id.address || mod !== this.summary.id.name) return this.addStarImport(address === this.summary.id.address ? `./${mod}${this.#importExtension}` : `~root/deps/${address}/${mod}${this.#importExtension}`, mod);
248
+ }
249
+ }) : await this.#renderFieldsAsTuple(`${name}.${variantName}`, variant.fields, enumDef.type_parameters, includePhantom) : await this.#renderFieldsAsStruct(`${name}.${variantName}`, variant.fields, enumDef.type_parameters, includePhantom)]
250
+ });
251
+ const params = enumDef.type_parameters.map((param, i) => ({
252
+ param,
253
+ originalIndex: i
254
+ })).filter(({ param }) => includePhantom || !param.phantom);
255
+ if (params.length === 0) {
256
+ const phantomPlaceholders = enumDef.type_parameters.some((p) => p.phantom) ? `<${enumDef.type_parameters.map((p, i) => `phantom ${p.name ?? `T${i}`}`).join(", ")}>` : "";
257
+ this.statements.push(...await withComment(enumDef, parseTS`export const ${name} = new ${moveEnumName}({ name: \`${enumName}${phantomPlaceholders}\`, fields: ${variantsObject} })`));
258
+ } else {
259
+ const bcsTypeName = this.#getImportName("BcsType");
260
+ const typeParams = `...typeParameters: [${params.map(({ param, originalIndex }) => param.name ?? `T${originalIndex}`).join(", ")}]`;
261
+ const typeGenerics = `${params.map(({ param, originalIndex }) => `${param.name ?? `T${originalIndex}`} extends ${bcsTypeName}<any>`).join(", ")}`;
262
+ let filteredIndex = 0;
263
+ const nameGenerics = enumDef.type_parameters.map((param, i) => {
264
+ if (!includePhantom && param.phantom) return `phantom ${param.name ?? `T${i}`}`;
265
+ const idx = filteredIndex++;
266
+ return `\${typeParameters[${idx}].name as ${param.name ?? `T${idx}`}['name']}`;
267
+ }).join(", ");
268
+ this.statements.push(...await withComment(enumDef, parseTS`
269
+ export function ${name}<${typeGenerics}>(${typeParams}) {
270
+ return new ${moveEnumName}({ name: \`${enumName}<${nameGenerics}>\`, fields: ${variantsObject} })
271
+ }`));
272
+ }
273
+ }
274
+ async renderFunctions() {
275
+ const names = [];
276
+ if (!this.hasFunctions()) return;
277
+ const transactionTypeName = this.#getImportName("Transaction");
278
+ for (const [name, func] of Object.entries(this.summary.functions)) {
279
+ if (func.macro_ || !this.#includedFunctions.has(name)) continue;
280
+ const parameters = func.parameters.filter((param) => !this.isContextReference(param.type_));
281
+ const hasAllParameterNames = parameters.length > 0 && parameters.every((param, i) => param.name && parameters.findIndex((p) => p.name === param.name) === i);
282
+ const fnName = getSafeName(camelCase(name));
283
+ const requiredParameters = parameters.filter((param) => !isWellKnownObjectParameter(param.type_, (address) => this.#resolveAddress(address)));
284
+ const normalizeName = parameters.length > 0 ? this.#getImportName("normalizeMoveArguments") : null;
285
+ names.push(fnName);
286
+ const usedTypeParameters = /* @__PURE__ */ new Set();
287
+ const rawTxArgName = requiredParameters.length > 0 ? this.#getImportName("RawTransactionArgument") : null;
288
+ const argumentsTypes = requiredParameters.map((param) => renderTypeSignature(param.type_, {
289
+ format: "typescriptArg",
290
+ summary: this.summary,
291
+ typeParameters: func.type_parameters,
292
+ includePhantomTypeParameters: false,
293
+ resolveAddress: (address) => this.#resolveAddress(address),
294
+ onTypeParameter: (typeParameter) => usedTypeParameters.add(typeParameter)
295
+ })).map((type, i) => requiredParameters[i].name ? `${camelCase(requiredParameters[i].name)}: ${rawTxArgName}<${type}>` : `${rawTxArgName}<${type}>`).join(",\n");
296
+ const bcsTypeName = usedTypeParameters.size > 0 ? this.#getImportName("BcsType") : null;
297
+ const filteredTypeParameters = func.type_parameters.map((param, i) => ({
298
+ param,
299
+ originalIndex: i
300
+ })).filter(({ param, originalIndex }) => usedTypeParameters.has(originalIndex) || param.name && usedTypeParameters.has(param.name));
301
+ const genericTypes = filteredTypeParameters.length > 0 ? `<${filteredTypeParameters.map(({ param, originalIndex }) => `${param.name ?? `T${originalIndex}`} extends ${bcsTypeName}<any>`).join(", ")}>` : "";
302
+ const genericTypeArgs = filteredTypeParameters.length > 0 ? `<${filteredTypeParameters.map(({ param, originalIndex }) => `${param.name ?? `T${originalIndex}`}`).join(", ")}>` : "";
303
+ const argumentsInterface = this.getUnusedName(`${capitalize(fnName.replace(/^_/, ""))}Arguments`);
304
+ if (hasAllParameterNames) this.statements.push(...parseTS`export interface ${argumentsInterface}${genericTypes} {
305
+ ${argumentsTypes}
306
+ }`);
307
+ const optionsInterface = this.getUnusedName(`${capitalize(fnName.replace(/^_/, ""))}Options`);
308
+ const requiresOptions = argumentsTypes.length > 0 || func.type_parameters.length > 0;
309
+ this.statements.push(...parseTS`export interface ${optionsInterface}${genericTypes} {
310
+ package${this.#mvrNameOrAddress ? "?: string" : ": string"}
311
+ ${argumentsTypes.length > 0 ? "arguments: " : "arguments?: "}${hasAllParameterNames ? `${argumentsInterface}${genericTypeArgs} | [${argumentsTypes}]` : `[${argumentsTypes}]`},
312
+ ${func.type_parameters.length ? `typeArguments: [${func.type_parameters.map(() => "string").join(", ")}]` : ""}
313
+ }`);
314
+ this.statements.push(...await withComment(func, parseTS`export function ${fnName}${genericTypes}(options: ${optionsInterface}${genericTypeArgs}${requiresOptions ? "" : " = {}"}) {
315
+ const packageAddress = options.package${this.#mvrNameOrAddress ? ` ?? '${this.#mvrNameOrAddress}'` : ""};
316
+ ${parameters.length > 0 ? `const argumentsTypes = [
317
+ ${parameters.map((param) => renderTypeSignature(param.type_, {
318
+ format: "typeTag",
319
+ summary: this.summary,
320
+ typeParameters: func.type_parameters,
321
+ includePhantomTypeParameters: false,
322
+ resolveAddress: (address) => this.#resolveAddress(address)
323
+ })).map((tag) => tag === "null" ? "null" : tag.includes("{") ? `\`${tag}\`` : `'${tag}'`).join(",\n")}
324
+ ] satisfies (string | null)[]\n` : ""}${hasAllParameterNames ? `const parameterNames = ${JSON.stringify(requiredParameters.map((param) => camelCase(param.name)))}\n` : ""}
325
+ return (tx: ${transactionTypeName}) => tx.moveCall({
326
+ package: packageAddress,
327
+ module: '${this.summary.id.name}',
328
+ function: '${name}',
329
+ ${parameters.length > 0 ? `arguments: ${normalizeName}(options.arguments${argumentsTypes.length > 0 ? "" : " ?? []"} , argumentsTypes${hasAllParameterNames ? `, parameterNames` : ""}),` : ""}
330
+ ${func.type_parameters.length ? "typeArguments: options.typeArguments" : ""}
331
+ })
332
+ }`));
333
+ }
334
+ }
335
+ isContextReference(type) {
336
+ if (typeof type === "string") return false;
337
+ if ("Reference" in type) return this.isContextReference(type.Reference[1]);
338
+ if ("Datatype" in type) return this.#resolveAddress(type.Datatype.module.address) === HANEUL_FRAMEWORK_ADDRESS && type.Datatype.module.name === "tx_context" && type.Datatype.name === "TxContext";
339
+ return false;
340
+ }
341
+ };
342
+ function isPositional(fields) {
343
+ if (fields.positional_fields === true) return true;
344
+ if (Object.keys(fields.fields).every((field, i) => field === `pos${i}`)) return true;
345
+ return false;
346
+ }
347
+
348
+ //#endregion
349
+ export { MoveModuleBuilder };
350
+ //# sourceMappingURL=move-module-builder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move-module-builder.mjs","names":["#addressMappings","#mvrNameOrAddress","#importExtension","#includePhantomTypeParameters","#resolveAddress","#importNames","#includedFunctions","#includedTypes","name","#orderedTypes","#getModuleTypeName","#renderFieldsAsStruct","#getImportName","#depsDir","#renderFieldsAsTuple"],"sources":["../src/move-module-builder.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { FileBuilder } from './file-builder.js';\nimport { readFile } from 'node:fs/promises';\nimport {\n\tgetSafeName,\n\trenderTypeSignature,\n\tHANEUL_FRAMEWORK_ADDRESS,\n\tHANEUL_SYSTEM_ADDRESS,\n} from './render-types.js';\nimport {\n\tcamelCase,\n\tcapitalize,\n\tformatComment,\n\tisWellKnownObjectParameter,\n\tmapToObject,\n\tparseTS,\n\twithComment,\n} from './utils.js';\nimport type { Fields, ModuleSummary, Type, TypeParameter } from './types/summary.js';\nimport type { FunctionsOption, ImportExtension, TypesOption } from './config.js';\nimport { join } from 'node:path';\n\nconst IMPORT_MAP = {\n\tTransaction: { module: '@haneullabs/haneul/transactions', isType: true },\n\tBcsType: { module: '@haneullabs/haneul/bcs', isType: true },\n\tbcs: { module: '@haneullabs/haneul/bcs', isType: false },\n\tMoveStruct: { module: '~root/../utils/index', isType: false },\n\tMoveTuple: { module: '~root/../utils/index', isType: false },\n\tMoveEnum: { module: '~root/../utils/index', isType: false },\n\tnormalizeMoveArguments: { module: '~root/../utils/index', isType: false },\n\tRawTransactionArgument: { module: '~root/../utils/index', isType: true },\n} as const;\n\ntype ImportName = keyof typeof IMPORT_MAP;\n\nexport class MoveModuleBuilder extends FileBuilder {\n\tsummary: ModuleSummary;\n\t#depsDir = './deps';\n\t#addressMappings: Record<string, string>;\n\t#includedTypes: Set<string> = new Set();\n\t#includedFunctions: Set<string> = new Set();\n\t#orderedTypes: string[] = [];\n\t#mvrNameOrAddress?: string;\n\t#importNames: Partial<Record<ImportName, string>> = {};\n\t#importExtension: ImportExtension;\n\t#includePhantomTypeParameters: boolean;\n\n\tconstructor({\n\t\tmvrNameOrAddress,\n\t\tsummary,\n\t\taddressMappings = {},\n\t\timportExtension = '.js',\n\t\tincludePhantomTypeParameters = false,\n\t}: {\n\t\tsummary: ModuleSummary;\n\t\taddressMappings?: Record<string, string>;\n\t\tmvrNameOrAddress?: string;\n\t\timportExtension?: ImportExtension;\n\t\tincludePhantomTypeParameters?: boolean;\n\t}) {\n\t\tsuper();\n\t\tthis.summary = summary;\n\t\tthis.#addressMappings = addressMappings;\n\t\tthis.#mvrNameOrAddress = mvrNameOrAddress;\n\t\tthis.#importExtension = importExtension;\n\t\tthis.#includePhantomTypeParameters = includePhantomTypeParameters;\n\t}\n\n\tstatic async fromSummaryFile(\n\t\tfile: string,\n\t\taddressMappings: Record<string, string>,\n\t\tmvrNameOrAddress?: string,\n\t\timportExtension?: ImportExtension,\n\t\tincludePhantomTypeParameters?: boolean,\n\t) {\n\t\tconst summary = JSON.parse(await readFile(file, 'utf-8'));\n\n\t\treturn new MoveModuleBuilder({\n\t\t\tsummary,\n\t\t\taddressMappings,\n\t\t\tmvrNameOrAddress,\n\t\t\timportExtension,\n\t\t\tincludePhantomTypeParameters,\n\t\t});\n\t}\n\n\t#resolveAddress(address: string) {\n\t\treturn this.#addressMappings[address] ?? address;\n\t}\n\n\t#getModuleTypeName() {\n\t\tconst resolvedAddress = this.#resolveAddress(this.summary.id.address);\n\t\tif (resolvedAddress === HANEUL_FRAMEWORK_ADDRESS) {\n\t\t\treturn '0x2';\n\t\t} else if (resolvedAddress === HANEUL_SYSTEM_ADDRESS) {\n\t\t\treturn '0x3';\n\t\t} else {\n\t\t\treturn this.#mvrNameOrAddress ?? this.summary.id.address;\n\t\t}\n\t}\n\n\t#getImportName(name: ImportName): string {\n\t\tif (!this.#importNames[name]) {\n\t\t\tconst config = IMPORT_MAP[name];\n\t\t\tconst importSpec = config.isType ? `type ${name}` : name;\n\t\t\t// Add extension for relative imports (utils)\n\t\t\tconst module = config.module.startsWith('~root')\n\t\t\t\t? `${config.module}${this.#importExtension}`\n\t\t\t\t: config.module;\n\t\t\tthis.#importNames[name] = this.addImport(module, importSpec);\n\t\t}\n\t\treturn this.#importNames[name]!;\n\t}\n\n\toverride async getHeader() {\n\t\tif (!this.summary.doc) {\n\t\t\treturn super.getHeader();\n\t\t}\n\n\t\treturn `${await super.getHeader()}\\n\\n/*${await formatComment(this.summary.doc)}*/\\n\\n`;\n\t}\n\n\tincludeFunctions(option?: FunctionsOption) {\n\t\tif (option === false) return;\n\n\t\tconst filterByVisibility = !Array.isArray(option);\n\t\tconst names = Array.isArray(option) ? option : Object.keys(this.summary.functions);\n\t\tconst privateFunctions =\n\t\t\ttypeof option === 'object' && filterByVisibility ? (option.private ?? 'entry') : 'entry';\n\n\t\tfor (const name of names) {\n\t\t\tconst func = this.summary.functions[name];\n\t\t\tif (!func) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Function ${name} not found in ${this.summary.id.address}::${this.summary.id.name}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (func.macro_) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (filterByVisibility && func.visibility !== 'Public') {\n\t\t\t\tif (privateFunctions === false) continue;\n\t\t\t\tif (privateFunctions === 'entry' && !func.entry) continue;\n\t\t\t}\n\n\t\t\tconst safeName = getSafeName(camelCase(name));\n\n\t\t\tthis.reservedNames.add(safeName);\n\t\t\tthis.#includedFunctions.add(name);\n\t\t}\n\t}\n\n\tincludeType(name: string, moduleBuilders: Record<string, MoveModuleBuilder>) {\n\t\tif (this.#includedTypes.has(name)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#includedTypes.add(name);\n\t\tthis.reservedNames.add(name);\n\n\t\tconst struct = this.summary.structs[name];\n\t\tconst enum_ = this.summary.enums[name];\n\n\t\tif (!struct && !enum_) {\n\t\t\tthrow new Error(\n\t\t\t\t`Type ${name} not found in ${this.summary.id.address}::${this.summary.id.name}`,\n\t\t\t);\n\t\t}\n\n\t\tif (struct) {\n\t\t\tObject.values(struct.fields.fields).forEach((field) => {\n\t\t\t\trenderTypeSignature(field.type_, {\n\t\t\t\t\tformat: 'bcs',\n\t\t\t\t\tsummary: this.summary,\n\t\t\t\t\ttypeParameters: struct.type_parameters,\n\t\t\t\t\tincludePhantomTypeParameters: false,\n\t\t\t\t\tresolveAddress: (address) => this.#resolveAddress(address),\n\t\t\t\t\tonDependency: (address, mod, name) => {\n\t\t\t\t\t\tconst builder = moduleBuilders[`${address}::${mod}`];\n\n\t\t\t\t\t\tif (!builder) {\n\t\t\t\t\t\t\tthrow new Error(`Module builder not found for ${address}::${mod}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbuilder.includeType(name, moduleBuilders);\n\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tif (enum_) {\n\t\t\tObject.values(enum_.variants).forEach((variant) => {\n\t\t\t\tObject.values(variant.fields.fields).forEach((field) => {\n\t\t\t\t\trenderTypeSignature(field.type_, {\n\t\t\t\t\t\tformat: 'bcs',\n\t\t\t\t\t\tsummary: this.summary,\n\t\t\t\t\t\ttypeParameters: enum_.type_parameters,\n\t\t\t\t\t\tincludePhantomTypeParameters: false,\n\t\t\t\t\t\tresolveAddress: (address) => this.#resolveAddress(address),\n\t\t\t\t\t\tonDependency: (address, mod, name) => {\n\t\t\t\t\t\t\tconst builder = moduleBuilders[`${address}::${mod}`];\n\n\t\t\t\t\t\t\tif (!builder) {\n\t\t\t\t\t\t\t\tthrow new Error(`Module builder not found for ${address}::${mod}`);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbuilder.includeType(name, moduleBuilders);\n\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// Add after all dependencies are included to avoid declaration order issues\n\t\tthis.#orderedTypes.push(name);\n\t}\n\n\tincludeTypes(moduleBuilders: Record<string, MoveModuleBuilder>, option?: TypesOption) {\n\t\tif (option === false) return;\n\n\t\tconst names = Array.isArray(option)\n\t\t\t? option\n\t\t\t: [...Object.keys(this.summary.structs), ...Object.keys(this.summary.enums)];\n\n\t\tfor (const name of names) {\n\t\t\tthis.includeType(name, moduleBuilders);\n\t\t}\n\t}\n\n\tasync renderBCSTypes() {\n\t\tif (this.hasBcsTypes()) {\n\t\t\tthis.statements.push(\n\t\t\t\t...parseTS /* ts */ `\n\t\t\t\tconst $moduleName = '${this.#getModuleTypeName()}::${this.summary.id.name}';\n\t\t\t\t`,\n\t\t\t);\n\t\t}\n\t\tfor (const name of this.#orderedTypes) {\n\t\t\tif (this.summary.structs[name]) {\n\t\t\t\tawait this.renderStruct(name);\n\t\t\t} else if (this.summary.enums[name]) {\n\t\t\t\tawait this.renderEnum(name);\n\t\t\t}\n\t\t}\n\t}\n\n\thasBcsTypes() {\n\t\treturn this.#includedTypes.size > 0;\n\t}\n\n\thasFunctions() {\n\t\treturn this.#includedFunctions.size > 0;\n\t}\n\n\thasTypesOrFunctions() {\n\t\treturn this.hasBcsTypes() || this.hasFunctions();\n\t}\n\n\tasync #renderFieldsAsStruct(\n\t\tname: string,\n\t\t{ fields }: Fields,\n\t\ttypeParameters: TypeParameter[] = [],\n\t\tincludePhantomTypeParameters = false,\n\t) {\n\t\tconst moveStructName = this.#getImportName('MoveStruct');\n\t\tconst fieldObject = await mapToObject({\n\t\t\titems: Object.entries(fields),\n\t\t\tgetComment: ([_name, field]) => field.doc,\n\t\t\tmapper: ([name, field]) => [\n\t\t\t\tname,\n\t\t\t\trenderTypeSignature(field.type_, {\n\t\t\t\t\tformat: 'bcs',\n\t\t\t\t\tbcsImport: () => this.#getImportName('bcs'),\n\t\t\t\t\tsummary: this.summary,\n\t\t\t\t\ttypeParameters,\n\t\t\t\t\tincludePhantomTypeParameters,\n\t\t\t\t\tresolveAddress: (address) => this.#resolveAddress(address),\n\t\t\t\t\tonDependency: (address, mod) => {\n\t\t\t\t\t\tif (address !== this.summary.id.address || mod !== this.summary.id.name) {\n\t\t\t\t\t\t\treturn this.addStarImport(\n\t\t\t\t\t\t\t\taddress === this.summary.id.address\n\t\t\t\t\t\t\t\t\t? `./${mod}${this.#importExtension}`\n\t\t\t\t\t\t\t\t\t: join(`~root`, this.#depsDir, `${address}/${mod}${this.#importExtension}`),\n\t\t\t\t\t\t\t\tmod,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t});\n\n\t\treturn parseTS /* ts */ `new ${moveStructName}({ name: \\`${name}\\`, fields: ${fieldObject} })`;\n\t}\n\n\tasync #renderFieldsAsTuple(\n\t\tname: string,\n\t\t{ fields }: Fields,\n\t\ttypeParameters: TypeParameter[] = [],\n\t\tincludePhantomTypeParameters = false,\n\t) {\n\t\tconst moveTupleName = this.#getImportName('MoveTuple');\n\t\tconst values = Object.values(fields).map((field) =>\n\t\t\trenderTypeSignature(field.type_, {\n\t\t\t\tformat: 'bcs',\n\t\t\t\tsummary: this.summary,\n\t\t\t\ttypeParameters,\n\t\t\t\tincludePhantomTypeParameters,\n\t\t\t\tbcsImport: () => this.#getImportName('bcs'),\n\t\t\t\tresolveAddress: (address) => this.#resolveAddress(address),\n\t\t\t\tonDependency: (address, mod) => {\n\t\t\t\t\tif (address !== this.summary.id.address || mod !== this.summary.id.name) {\n\t\t\t\t\t\treturn this.addStarImport(\n\t\t\t\t\t\t\taddress === this.summary.id.address\n\t\t\t\t\t\t\t\t? `./${mod}${this.#importExtension}`\n\t\t\t\t\t\t\t\t: join(`~root`, this.#depsDir, `${address}/${mod}${this.#importExtension}`),\n\t\t\t\t\t\t\tmod,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn undefined;\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\treturn parseTS /* ts */ `new ${moveTupleName}({ name: \\`${name}\\`, fields: [${values.join(', ')}] })`;\n\t}\n\n\tasync renderStruct(name: string) {\n\t\tif (!this.#includedTypes.has(name)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst struct = this.summary.structs[name];\n\n\t\tif (!struct) {\n\t\t\tthrow new Error(\n\t\t\t\t`Struct ${name} not found in ${this.summary.id.address}::${this.summary.id.name}`,\n\t\t\t);\n\t\t}\n\n\t\tthis.exports.push(name);\n\n\t\tconst includePhantom = this.#includePhantomTypeParameters;\n\t\tconst params = struct.type_parameters\n\t\t\t.map((param, i) => ({ param, originalIndex: i }))\n\t\t\t.filter(({ param }) => includePhantom || !param.phantom);\n\t\tconst structName = `\\${$moduleName}::${name}`;\n\n\t\tif (params.length === 0) {\n\t\t\tconst hasPhantoms = struct.type_parameters.some((p) => p.phantom);\n\t\t\tconst phantomPlaceholders = hasPhantoms\n\t\t\t\t? `<${struct.type_parameters.map((p, i) => `phantom ${p.name ?? `T${i}`}`).join(', ')}>`\n\t\t\t\t: '';\n\t\t\tthis.statements.push(\n\t\t\t\t...parseTS /* ts */ `export const ${name} = ${\n\t\t\t\t\tstruct.fields.positional_fields\n\t\t\t\t\t\t? await this.#renderFieldsAsTuple(\n\t\t\t\t\t\t\t\t`${structName}${phantomPlaceholders}`,\n\t\t\t\t\t\t\t\tstruct.fields,\n\t\t\t\t\t\t\t\tstruct.type_parameters,\n\t\t\t\t\t\t\t\tincludePhantom,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: await this.#renderFieldsAsStruct(\n\t\t\t\t\t\t\t\t`${structName}${phantomPlaceholders}`,\n\t\t\t\t\t\t\t\tstruct.fields,\n\t\t\t\t\t\t\t\tstruct.type_parameters,\n\t\t\t\t\t\t\t\tincludePhantom,\n\t\t\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst bcsTypeName = this.#getImportName('BcsType');\n\n\t\t\tconst typeParams = `...typeParameters: [${params.map(({ param, originalIndex }) => param.name ?? `T${originalIndex}`).join(', ')}]`;\n\t\t\tconst typeGenerics = `${params.map(({ param, originalIndex }) => `${param.name ?? `T${originalIndex}`} extends ${bcsTypeName}<any>`).join(', ')}`;\n\n\t\t\tlet filteredIndex = 0;\n\t\t\tconst nameGenerics = struct.type_parameters\n\t\t\t\t.map((param, i) => {\n\t\t\t\t\tif (!includePhantom && param.phantom) {\n\t\t\t\t\t\treturn `phantom ${param.name ?? `T${i}`}`;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = filteredIndex++;\n\t\t\t\t\tconst paramName = param.name ?? `T${idx}`;\n\t\t\t\t\treturn `\\${typeParameters[${idx}].name as ${paramName}['name']}`;\n\t\t\t\t})\n\t\t\t\t.join(', ');\n\n\t\t\tthis.statements.push(\n\t\t\t\t...(await withComment(\n\t\t\t\t\tstruct,\n\t\t\t\t\tparseTS /* ts */ `export function ${name}<${typeGenerics}>(${typeParams}) {\n\t\t\t\t\t\treturn ${\n\t\t\t\t\t\t\tstruct.fields.positional_fields\n\t\t\t\t\t\t\t\t? await this.#renderFieldsAsTuple(\n\t\t\t\t\t\t\t\t\t\t`${structName}<${nameGenerics}>`,\n\t\t\t\t\t\t\t\t\t\tstruct.fields,\n\t\t\t\t\t\t\t\t\t\tstruct.type_parameters,\n\t\t\t\t\t\t\t\t\t\tincludePhantom,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: await this.#renderFieldsAsStruct(\n\t\t\t\t\t\t\t\t\t\t`${structName}<${nameGenerics}>`,\n\t\t\t\t\t\t\t\t\t\tstruct.fields,\n\t\t\t\t\t\t\t\t\t\tstruct.type_parameters,\n\t\t\t\t\t\t\t\t\t\tincludePhantom,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}`,\n\t\t\t\t)),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync renderEnum(name: string) {\n\t\tif (!this.#includedTypes.has(name)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst enumDef = this.summary.enums[name];\n\n\t\tif (!enumDef) {\n\t\t\tthrow new Error(\n\t\t\t\t`Enum ${name} not found in ${this.summary.id.address}::${this.summary.id.name}`,\n\t\t\t);\n\t\t}\n\n\t\tconst includePhantom = this.#includePhantomTypeParameters;\n\t\tconst moveEnumName = this.#getImportName('MoveEnum');\n\t\tthis.exports.push(name);\n\n\t\tconst enumName = `\\${$moduleName}::${name}`;\n\n\t\tconst variantsObject = await mapToObject({\n\t\t\titems: Object.entries(enumDef.variants),\n\t\t\tgetComment: ([_name, variant]) => variant.doc,\n\t\t\tmapper: async ([variantName, variant]) => [\n\t\t\t\tvariantName,\n\t\t\t\tObject.keys(variant.fields.fields).length === 0\n\t\t\t\t\t? 'null'\n\t\t\t\t\t: isPositional(variant.fields)\n\t\t\t\t\t\t? Object.keys(variant.fields.fields).length === 1\n\t\t\t\t\t\t\t? renderTypeSignature(Object.values(variant.fields.fields)[0].type_, {\n\t\t\t\t\t\t\t\t\tformat: 'bcs',\n\t\t\t\t\t\t\t\t\tsummary: this.summary,\n\t\t\t\t\t\t\t\t\ttypeParameters: enumDef.type_parameters,\n\t\t\t\t\t\t\t\t\tincludePhantomTypeParameters: includePhantom,\n\t\t\t\t\t\t\t\t\tbcsImport: () => this.#getImportName('bcs'),\n\t\t\t\t\t\t\t\t\tresolveAddress: (address) => this.#resolveAddress(address),\n\t\t\t\t\t\t\t\t\tonDependency: (address, mod) => {\n\t\t\t\t\t\t\t\t\t\tif (address !== this.summary.id.address || mod !== this.summary.id.name) {\n\t\t\t\t\t\t\t\t\t\t\treturn this.addStarImport(\n\t\t\t\t\t\t\t\t\t\t\t\taddress === this.summary.id.address\n\t\t\t\t\t\t\t\t\t\t\t\t\t? `./${mod}${this.#importExtension}`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: `~root/deps/${address}/${mod}${this.#importExtension}`,\n\t\t\t\t\t\t\t\t\t\t\t\tmod,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: await this.#renderFieldsAsTuple(\n\t\t\t\t\t\t\t\t\t`${name}.${variantName}`,\n\t\t\t\t\t\t\t\t\tvariant.fields,\n\t\t\t\t\t\t\t\t\tenumDef.type_parameters,\n\t\t\t\t\t\t\t\t\tincludePhantom,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: await this.#renderFieldsAsStruct(\n\t\t\t\t\t\t\t\t`${name}.${variantName}`,\n\t\t\t\t\t\t\t\tvariant.fields,\n\t\t\t\t\t\t\t\tenumDef.type_parameters,\n\t\t\t\t\t\t\t\tincludePhantom,\n\t\t\t\t\t\t\t),\n\t\t\t],\n\t\t});\n\n\t\tconst params = enumDef.type_parameters\n\t\t\t.map((param, i) => ({ param, originalIndex: i }))\n\t\t\t.filter(({ param }) => includePhantom || !param.phantom);\n\n\t\tif (params.length === 0) {\n\t\t\tconst hasPhantoms = enumDef.type_parameters.some((p) => p.phantom);\n\t\t\tconst phantomPlaceholders = hasPhantoms\n\t\t\t\t? `<${enumDef.type_parameters.map((p, i) => `phantom ${p.name ?? `T${i}`}`).join(', ')}>`\n\t\t\t\t: '';\n\t\t\tthis.statements.push(\n\t\t\t\t...(await withComment(\n\t\t\t\t\tenumDef,\n\t\t\t\t\tparseTS /* ts */ `export const ${name} = new ${moveEnumName}({ name: \\`${enumName}${phantomPlaceholders}\\`, fields: ${variantsObject} })`,\n\t\t\t\t)),\n\t\t\t);\n\t\t} else {\n\t\t\tconst bcsTypeName = this.#getImportName('BcsType');\n\n\t\t\tconst typeParams = `...typeParameters: [${params.map(({ param, originalIndex }) => param.name ?? `T${originalIndex}`).join(', ')}]`;\n\t\t\tconst typeGenerics = `${params.map(({ param, originalIndex }) => `${param.name ?? `T${originalIndex}`} extends ${bcsTypeName}<any>`).join(', ')}`;\n\n\t\t\tlet filteredIndex = 0;\n\t\t\tconst nameGenerics = enumDef.type_parameters\n\t\t\t\t.map((param, i) => {\n\t\t\t\t\tif (!includePhantom && param.phantom) {\n\t\t\t\t\t\treturn `phantom ${param.name ?? `T${i}`}`;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = filteredIndex++;\n\t\t\t\t\tconst paramName = param.name ?? `T${idx}`;\n\t\t\t\t\treturn `\\${typeParameters[${idx}].name as ${paramName}['name']}`;\n\t\t\t\t})\n\t\t\t\t.join(', ');\n\n\t\t\tthis.statements.push(\n\t\t\t\t...(await withComment(\n\t\t\t\t\tenumDef,\n\t\t\t\t\tparseTS /* ts */ `\n\t\t\t\t\texport function ${name}<${typeGenerics}>(${typeParams}) {\n\t\t\t\t\t\treturn new ${moveEnumName}({ name: \\`${enumName}<${nameGenerics}>\\`, fields: ${variantsObject} })\n\t\t\t\t\t}`,\n\t\t\t\t)),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync renderFunctions() {\n\t\tconst names = [];\n\n\t\tif (!this.hasFunctions()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst transactionTypeName = this.#getImportName('Transaction');\n\n\t\tfor (const [name, func] of Object.entries(this.summary.functions)) {\n\t\t\tif (func.macro_ || !this.#includedFunctions.has(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst parameters = func.parameters.filter((param) => !this.isContextReference(param.type_));\n\t\t\tconst hasAllParameterNames =\n\t\t\t\tparameters.length > 0 &&\n\t\t\t\tparameters.every(\n\t\t\t\t\t(param, i) => param.name && parameters.findIndex((p) => p.name === param.name) === i,\n\t\t\t\t);\n\t\t\tconst fnName = getSafeName(camelCase(name));\n\t\t\tconst requiredParameters = parameters.filter(\n\t\t\t\t(param) =>\n\t\t\t\t\t!isWellKnownObjectParameter(param.type_, (address) => this.#resolveAddress(address)),\n\t\t\t);\n\n\t\t\tconst normalizeName =\n\t\t\t\tparameters.length > 0 ? this.#getImportName('normalizeMoveArguments') : null;\n\n\t\t\tnames.push(fnName);\n\n\t\t\tconst usedTypeParameters = new Set<number | string>();\n\n\t\t\tconst rawTxArgName =\n\t\t\t\trequiredParameters.length > 0 ? this.#getImportName('RawTransactionArgument') : null;\n\n\t\t\tconst argumentsTypes = requiredParameters\n\t\t\t\t.map((param) =>\n\t\t\t\t\trenderTypeSignature(param.type_, {\n\t\t\t\t\t\tformat: 'typescriptArg',\n\t\t\t\t\t\tsummary: this.summary,\n\t\t\t\t\t\ttypeParameters: func.type_parameters,\n\t\t\t\t\t\tincludePhantomTypeParameters: false,\n\t\t\t\t\t\tresolveAddress: (address) => this.#resolveAddress(address),\n\t\t\t\t\t\tonTypeParameter: (typeParameter) => usedTypeParameters.add(typeParameter),\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.map((type, i) =>\n\t\t\t\t\trequiredParameters[i].name\n\t\t\t\t\t\t? `${camelCase(requiredParameters[i].name)}: ${rawTxArgName}<${type}>`\n\t\t\t\t\t\t: `${rawTxArgName}<${type}>`,\n\t\t\t\t)\n\t\t\t\t.join(',\\n');\n\n\t\t\tconst bcsTypeName = usedTypeParameters.size > 0 ? this.#getImportName('BcsType') : null;\n\n\t\t\tconst filteredTypeParameters = func.type_parameters\n\t\t\t\t.map((param, i) => ({ param, originalIndex: i }))\n\t\t\t\t.filter(\n\t\t\t\t\t({ param, originalIndex }) =>\n\t\t\t\t\t\tusedTypeParameters.has(originalIndex) ||\n\t\t\t\t\t\t(param.name && usedTypeParameters.has(param.name)),\n\t\t\t\t);\n\n\t\t\tconst genericTypes =\n\t\t\t\tfilteredTypeParameters.length > 0\n\t\t\t\t\t? `<${filteredTypeParameters.map(({ param, originalIndex }) => `${param.name ?? `T${originalIndex}`} extends ${bcsTypeName}<any>`).join(', ')}>`\n\t\t\t\t\t: '';\n\t\t\tconst genericTypeArgs =\n\t\t\t\tfilteredTypeParameters.length > 0\n\t\t\t\t\t? `<${filteredTypeParameters.map(({ param, originalIndex }) => `${param.name ?? `T${originalIndex}`}`).join(', ')}>`\n\t\t\t\t\t: '';\n\n\t\t\tconst argumentsInterface = this.getUnusedName(\n\t\t\t\t`${capitalize(fnName.replace(/^_/, ''))}Arguments`,\n\t\t\t);\n\t\t\tif (hasAllParameterNames) {\n\t\t\t\tthis.statements.push(\n\t\t\t\t\t...parseTS /* ts */ `export interface ${argumentsInterface}${genericTypes} {\n\t\t\t\t\t\t${argumentsTypes}\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst optionsInterface = this.getUnusedName(`${capitalize(fnName.replace(/^_/, ''))}Options`);\n\t\t\tconst requiresOptions = argumentsTypes.length > 0 || func.type_parameters.length > 0;\n\n\t\t\tthis.statements.push(\n\t\t\t\t...parseTS /* ts */ `export interface ${optionsInterface}${genericTypes} {\n\t\t\t\t\tpackage${this.#mvrNameOrAddress ? '?: string' : ': string'}\n\t\t\t\t\t${argumentsTypes.length > 0 ? 'arguments: ' : 'arguments?: '}${\n\t\t\t\t\t\thasAllParameterNames\n\t\t\t\t\t\t\t? `${argumentsInterface}${genericTypeArgs} | [${argumentsTypes}]`\n\t\t\t\t\t\t\t: `[${argumentsTypes}]`\n\t\t\t\t\t},\n\t\t\t\t\t${\n\t\t\t\t\t\tfunc.type_parameters.length\n\t\t\t\t\t\t\t? `typeArguments: [${func.type_parameters.map(() => 'string').join(', ')}]`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t}`,\n\t\t\t);\n\n\t\t\tthis.statements.push(\n\t\t\t\t...(await withComment(\n\t\t\t\t\tfunc,\n\t\t\t\t\tparseTS /* ts */ `export function ${fnName}${genericTypes}(options: ${optionsInterface}${genericTypeArgs}${requiresOptions ? '' : ' = {}'}) {\n\t\t\t\t\tconst packageAddress = options.package${this.#mvrNameOrAddress ? ` ?? '${this.#mvrNameOrAddress}'` : ''};\n\t\t\t\t\t${\n\t\t\t\t\t\tparameters.length > 0\n\t\t\t\t\t\t\t? `const argumentsTypes = [\n\t\t\t\t\t\t${parameters\n\t\t\t\t\t\t\t.map((param) =>\n\t\t\t\t\t\t\t\trenderTypeSignature(param.type_, {\n\t\t\t\t\t\t\t\t\tformat: 'typeTag',\n\t\t\t\t\t\t\t\t\tsummary: this.summary,\n\t\t\t\t\t\t\t\t\ttypeParameters: func.type_parameters,\n\t\t\t\t\t\t\t\t\tincludePhantomTypeParameters: false,\n\t\t\t\t\t\t\t\t\tresolveAddress: (address) => this.#resolveAddress(address),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((tag) =>\n\t\t\t\t\t\t\t\ttag === 'null' ? 'null' : tag.includes('{') ? `\\`${tag}\\`` : `'${tag}'`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join(',\\n')}\n\t\t\t\t\t] satisfies (string | null)[]\\n`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}${hasAllParameterNames ? `const parameterNames = ${JSON.stringify(requiredParameters.map((param) => camelCase(param.name!)))}\\n` : ''}\n\t\t\t\t\treturn (tx: ${transactionTypeName}) => tx.moveCall({\n\t\t\t\t\t\tpackage: packageAddress,\n\t\t\t\t\t\tmodule: '${this.summary.id.name}',\n\t\t\t\t\t\tfunction: '${name}',\n\t\t\t\t\t\t${parameters.length > 0 ? `arguments: ${normalizeName}(options.arguments${argumentsTypes.length > 0 ? '' : ' ?? []'} , argumentsTypes${hasAllParameterNames ? `, parameterNames` : ''}),` : ''}\n\t\t\t\t\t\t${func.type_parameters.length ? 'typeArguments: options.typeArguments' : ''}\n\t\t\t\t\t})\n\t\t\t\t}`,\n\t\t\t\t)),\n\t\t\t);\n\t\t}\n\t}\n\n\tisContextReference(type: Type): boolean {\n\t\tif (typeof type === 'string') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ('Reference' in type) {\n\t\t\treturn this.isContextReference(type.Reference[1]);\n\t\t}\n\n\t\tif ('Datatype' in type) {\n\t\t\treturn (\n\t\t\t\tthis.#resolveAddress(type.Datatype.module.address) === HANEUL_FRAMEWORK_ADDRESS &&\n\t\t\t\ttype.Datatype.module.name === 'tx_context' &&\n\t\t\t\ttype.Datatype.name === 'TxContext'\n\t\t\t);\n\t\t}\n\n\t\treturn false;\n\t}\n}\n\nfunction isPositional(fields: Fields) {\n\tif (fields.positional_fields === true) {\n\t\treturn true;\n\t}\n\n\tif (Object.keys(fields.fields).every((field, i) => field === `pos${i}`)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n"],"mappings":"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"}