@haneullabs/codegen 0.1.0 → 0.8.3

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 (147) hide show
  1. package/CHANGELOG.md +138 -33
  2. package/README.md +40 -38
  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 +105 -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 +66 -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/docs/index.md +436 -0
  37. package/docs/llms-index.md +6 -0
  38. package/package.json +29 -28
  39. package/src/bin/bash-complete.ts +18 -7
  40. package/src/bin/cli.ts +3 -9
  41. package/src/cli/commands/generate/command.ts +32 -0
  42. package/src/cli/commands/generate/impl.ts +93 -5
  43. package/src/config.ts +53 -5
  44. package/src/file-builder.ts +15 -1
  45. package/src/generate-utils.ts +88 -18
  46. package/src/index.ts +89 -29
  47. package/src/move-module-builder.ts +181 -76
  48. package/src/render-types.ts +82 -29
  49. package/dist/cjs/bin/bash-complete.d.ts +0 -2
  50. package/dist/cjs/bin/bash-complete.js +0 -51
  51. package/dist/cjs/bin/bash-complete.js.map +0 -7
  52. package/dist/cjs/bin/cli.d.ts +0 -2
  53. package/dist/cjs/bin/cli.js +0 -34
  54. package/dist/cjs/bin/cli.js.map +0 -7
  55. package/dist/cjs/cli/cli.d.ts +0 -1
  56. package/dist/cjs/cli/cli.js +0 -49
  57. package/dist/cjs/cli/cli.js.map +0 -7
  58. package/dist/cjs/cli/commands/generate/command.d.ts +0 -1
  59. package/dist/cjs/cli/commands/generate/command.js +0 -80
  60. package/dist/cjs/cli/commands/generate/command.js.map +0 -7
  61. package/dist/cjs/cli/commands/generate/impl.d.ts +0 -8
  62. package/dist/cjs/cli/commands/generate/impl.js +0 -66
  63. package/dist/cjs/cli/commands/generate/impl.js.map +0 -7
  64. package/dist/cjs/cli/context.d.ts +0 -6
  65. package/dist/cjs/cli/context.js +0 -45
  66. package/dist/cjs/cli/context.js.map +0 -7
  67. package/dist/cjs/config.d.ts +0 -51
  68. package/dist/cjs/config.js +0 -75
  69. package/dist/cjs/config.js.map +0 -7
  70. package/dist/cjs/file-builder.d.ts +0 -13
  71. package/dist/cjs/file-builder.js +0 -83
  72. package/dist/cjs/file-builder.js.map +0 -7
  73. package/dist/cjs/generate-utils.d.ts +0 -1
  74. package/dist/cjs/generate-utils.js +0 -187
  75. package/dist/cjs/generate-utils.js.map +0 -7
  76. package/dist/cjs/index.d.ts +0 -8
  77. package/dist/cjs/index.js +0 -124
  78. package/dist/cjs/index.js.map +0 -7
  79. package/dist/cjs/move-module-builder.d.ts +0 -26
  80. package/dist/cjs/move-module-builder.js +0 -464
  81. package/dist/cjs/move-module-builder.js.map +0 -7
  82. package/dist/cjs/package.json +0 -5
  83. package/dist/cjs/render-types.d.ts +0 -19
  84. package/dist/cjs/render-types.js +0 -313
  85. package/dist/cjs/render-types.js.map +0 -7
  86. package/dist/cjs/summary.d.ts +0 -3
  87. package/dist/cjs/summary.js +0 -218
  88. package/dist/cjs/summary.js.map +0 -7
  89. package/dist/cjs/types/deserialized.d.ts +0 -89
  90. package/dist/cjs/types/deserialized.js +0 -17
  91. package/dist/cjs/types/deserialized.js.map +0 -7
  92. package/dist/cjs/types/summary.d.ts +0 -105
  93. package/dist/cjs/types/summary.js +0 -17
  94. package/dist/cjs/types/summary.js.map +0 -7
  95. package/dist/cjs/utils.d.ts +0 -22
  96. package/dist/cjs/utils.js +0 -164
  97. package/dist/cjs/utils.js.map +0 -7
  98. package/dist/esm/bin/bash-complete.d.ts +0 -2
  99. package/dist/esm/bin/bash-complete.js +0 -31
  100. package/dist/esm/bin/bash-complete.js.map +0 -7
  101. package/dist/esm/bin/cli.d.ts +0 -2
  102. package/dist/esm/bin/cli.js +0 -32
  103. package/dist/esm/bin/cli.js.map +0 -7
  104. package/dist/esm/cli/cli.d.ts +0 -1
  105. package/dist/esm/cli/cli.js +0 -29
  106. package/dist/esm/cli/cli.js.map +0 -7
  107. package/dist/esm/cli/commands/generate/command.d.ts +0 -1
  108. package/dist/esm/cli/commands/generate/command.js +0 -50
  109. package/dist/esm/cli/commands/generate/command.js.map +0 -7
  110. package/dist/esm/cli/commands/generate/impl.d.ts +0 -8
  111. package/dist/esm/cli/commands/generate/impl.js +0 -46
  112. package/dist/esm/cli/commands/generate/impl.js.map +0 -7
  113. package/dist/esm/cli/context.d.ts +0 -6
  114. package/dist/esm/cli/context.js +0 -15
  115. package/dist/esm/cli/context.js.map +0 -7
  116. package/dist/esm/config.d.ts +0 -51
  117. package/dist/esm/config.js +0 -45
  118. package/dist/esm/config.js.map +0 -7
  119. package/dist/esm/file-builder.d.ts +0 -13
  120. package/dist/esm/file-builder.js +0 -63
  121. package/dist/esm/file-builder.js.map +0 -7
  122. package/dist/esm/generate-utils.d.ts +0 -1
  123. package/dist/esm/generate-utils.js.map +0 -7
  124. package/dist/esm/index.d.ts +0 -8
  125. package/dist/esm/index.js +0 -104
  126. package/dist/esm/index.js.map +0 -7
  127. package/dist/esm/move-module-builder.d.ts +0 -26
  128. package/dist/esm/move-module-builder.js +0 -457
  129. package/dist/esm/move-module-builder.js.map +0 -7
  130. package/dist/esm/package.json +0 -5
  131. package/dist/esm/render-types.d.ts +0 -19
  132. package/dist/esm/render-types.js +0 -293
  133. package/dist/esm/render-types.js.map +0 -7
  134. package/dist/esm/summary.d.ts +0 -3
  135. package/dist/esm/summary.js +0 -198
  136. package/dist/esm/summary.js.map +0 -7
  137. package/dist/esm/types/deserialized.d.ts +0 -89
  138. package/dist/esm/types/deserialized.js +0 -1
  139. package/dist/esm/types/deserialized.js.map +0 -7
  140. package/dist/esm/types/summary.d.ts +0 -105
  141. package/dist/esm/types/summary.js +0 -1
  142. package/dist/esm/types/summary.js.map +0 -7
  143. package/dist/esm/utils.d.ts +0 -22
  144. package/dist/esm/utils.js +0 -134
  145. package/dist/esm/utils.js.map +0 -7
  146. package/dist/tsconfig.esm.tsbuildinfo +0 -1
  147. package/dist/tsconfig.tsbuildinfo +0 -1
package/src/index.ts CHANGED
@@ -1,40 +1,65 @@
1
1
  // Copyright (c) Mysten Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';
5
5
  import { basename, join } from 'node:path';
6
6
  import { MoveModuleBuilder } from './move-module-builder.js';
7
7
  import { existsSync, statSync } from 'node:fs';
8
8
  import { utilsContent } from './generate-utils.js';
9
9
  import { parse } from 'toml';
10
- import type { PackageConfig } from './config.js';
10
+ import type {
11
+ FunctionsOption,
12
+ GenerateBase,
13
+ ImportExtension,
14
+ PackageConfig,
15
+ PackageGenerate,
16
+ TypesOption,
17
+ } from './config.js';
11
18
  export { type HaneulCodegenConfig } from './config.js';
12
19
 
13
20
  export async function generateFromPackageSummary({
14
21
  package: pkg,
15
22
  prune,
16
23
  outputDir,
17
- privateMethods,
24
+ globalGenerate,
25
+ importExtension = '.js',
26
+ includePhantomTypeParameters = false,
18
27
  }: {
19
28
  package: PackageConfig;
20
29
  prune: boolean;
21
30
  outputDir: string;
22
- privateMethods: 'none' | 'entry' | 'all';
31
+ globalGenerate?: GenerateBase;
32
+ importExtension?: ImportExtension;
33
+ includePhantomTypeParameters?: boolean;
23
34
  }) {
24
35
  if (!pkg.path) {
25
- throw new Error(`On-chain packages are not supported yet (got ${pkg.package})`);
36
+ throw new Error(`Package path is required (got ${pkg.package})`);
26
37
  }
27
38
 
28
- const summaryDir = join(pkg.path, 'package_summaries');
39
+ // Check for on-chain package summary (directly in path) or local package summary (in package_summaries subdirectory)
40
+ const localSummaryDir = join(pkg.path, 'package_summaries');
41
+ const isOnChainPackage = existsSync(join(pkg.path, 'root_package_metadata.json'));
42
+ const summaryDir = isOnChainPackage ? pkg.path : localSummaryDir;
29
43
 
30
- if (!existsSync(summaryDir)) {
44
+ if (!existsSync(summaryDir) || !existsSync(join(summaryDir, 'address_mapping.json'))) {
31
45
  throw new Error(`Package summary directory not found: ${summaryDir}`);
32
46
  }
33
47
 
34
48
  let packageName = pkg.packageName!;
49
+ let mainPackageAddress: string | undefined;
35
50
  const mvrNameOrAddress = pkg.package;
36
51
 
37
- if (!pkg.packageName) {
52
+ if (isOnChainPackage) {
53
+ // For on-chain packages, get the main package address from root_package_metadata.json
54
+ const metadata = JSON.parse(
55
+ await readFile(join(pkg.path, 'root_package_metadata.json'), 'utf-8'),
56
+ );
57
+ mainPackageAddress = metadata.root_package_id;
58
+ // Use the package name provided or fall back to the full address
59
+ if (!packageName) {
60
+ packageName = mainPackageAddress!;
61
+ }
62
+ } else if (!pkg.packageName) {
38
63
  try {
39
64
  const packageToml = await readFile(join(pkg.path, 'Move.toml'), 'utf-8');
40
65
  packageName = parse(packageToml).package.name.toLowerCase();
@@ -48,10 +73,6 @@ export async function generateFromPackageSummary({
48
73
  }
49
74
  }
50
75
 
51
- if (!existsSync(summaryDir)) {
52
- throw new Error(`Package summary directory not found: ${summaryDir}`);
53
- }
54
-
55
76
  const addressMappings: Record<string, string> = JSON.parse(
56
77
  await readFile(join(summaryDir, 'address_mapping.json'), 'utf-8'),
57
78
  );
@@ -59,21 +80,35 @@ export async function generateFromPackageSummary({
59
80
  const packages = (await readdir(summaryDir)).filter((file) =>
60
81
  statSync(join(summaryDir, file)).isDirectory(),
61
82
  );
83
+
84
+ // For on-chain packages, the main package is identified by the root_package_id
85
+ // For local packages, it's identified by the packageName
86
+ const isMainPackage = (pkgDir: string) => {
87
+ if (isOnChainPackage) {
88
+ return pkgDir === mainPackageAddress;
89
+ }
90
+ return pkgDir === packageName;
91
+ };
92
+
62
93
  const modules = (
63
94
  await Promise.all(
64
- packages.map(async (pkg) => {
65
- const modules = await readdir(join(summaryDir, pkg));
95
+ packages.map(async (pkgDir) => {
96
+ const moduleFiles = await readdir(join(summaryDir, pkgDir));
66
97
  return Promise.all(
67
- modules.map(async (mod) => ({
68
- package: pkg,
69
- isMainPackage: pkg === packageName,
70
- module: basename(mod, '.json'),
71
- builder: await MoveModuleBuilder.fromSummaryFile(
72
- join(summaryDir, pkg, mod),
73
- addressMappings,
74
- pkg === packageName ? mvrNameOrAddress : undefined,
75
- ),
76
- })),
98
+ moduleFiles
99
+ .filter((f) => f.endsWith('.json'))
100
+ .map(async (mod) => ({
101
+ package: pkgDir,
102
+ isMainPackage: isMainPackage(pkgDir),
103
+ module: basename(mod, '.json'),
104
+ builder: await MoveModuleBuilder.fromSummaryFile(
105
+ join(summaryDir, pkgDir, mod),
106
+ addressMappings,
107
+ isMainPackage(pkgDir) ? mvrNameOrAddress : undefined,
108
+ importExtension,
109
+ includePhantomTypeParameters,
110
+ ),
111
+ })),
77
112
  );
78
113
  }),
79
114
  )
@@ -83,15 +118,40 @@ export async function generateFromPackageSummary({
83
118
  modules.map((mod) => [`${mod.package}::${mod.module}`, mod.builder]),
84
119
  );
85
120
 
86
- modules.forEach((mod) => {
87
- if (mod.isMainPackage || !prune) {
88
- mod.builder.includeAllTypes(moduleBuilders);
89
- mod.builder.includeAllFunctions({ privateMethods });
121
+ const packageGenerate: PackageGenerate | undefined = 'generate' in pkg ? pkg.generate : undefined;
122
+ const pkgModules = packageGenerate?.modules;
123
+ const pkgTypes: TypesOption = packageGenerate?.types ?? globalGenerate?.types ?? true;
124
+ const pkgFunctions: FunctionsOption =
125
+ packageGenerate?.functions ?? globalGenerate?.functions ?? true;
126
+
127
+ for (const mod of modules) {
128
+ if (!mod.isMainPackage && prune) {
129
+ continue;
90
130
  }
91
- });
131
+
132
+ const moduleGenerate = !pkgModules
133
+ ? true
134
+ : Array.isArray(pkgModules)
135
+ ? pkgModules.includes(mod.module) || null
136
+ : mod.module in pkgModules
137
+ ? pkgModules[mod.module]
138
+ : null;
139
+
140
+ if (!moduleGenerate) continue;
141
+
142
+ const types = moduleGenerate === true ? pkgTypes : (moduleGenerate.types ?? false);
143
+ const functions = moduleGenerate === true ? pkgFunctions : (moduleGenerate.functions ?? false);
144
+
145
+ mod.builder.includeTypes(moduleBuilders, types);
146
+ mod.builder.includeFunctions(functions);
147
+ }
92
148
 
93
149
  await generateUtils({ outputDir });
94
150
 
151
+ // Clean the package output directory to remove stale files from previous runs
152
+ const packageOutputDir = join(outputDir, packageName);
153
+ await rm(packageOutputDir, { recursive: true, force: true });
154
+
95
155
  await Promise.all(
96
156
  modules.map(async (mod) => {
97
157
  if ((mod.isMainPackage || !prune) && mod.builder.hasTypesOrFunctions()) {