@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
@@ -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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"}
@@ -0,0 +1,207 @@
1
+ import { normalizeHaneulAddress } from "@haneullabs/haneul/utils";
2
+
3
+ //#region src/render-types.ts
4
+ const MOVE_STDLIB_ADDRESS = normalizeHaneulAddress("0x1");
5
+ const HANEUL_FRAMEWORK_ADDRESS = normalizeHaneulAddress("0x2");
6
+ const HANEUL_SYSTEM_ADDRESS = normalizeHaneulAddress("0x3");
7
+ function getFilteredTypeParameterIndex(originalIndex, typeParameters, includePhantom) {
8
+ if (includePhantom || !typeParameters) return originalIndex;
9
+ let filteredIndex = 0;
10
+ for (let i = 0; i < originalIndex; i++) if (!typeParameters[i]?.phantom) filteredIndex++;
11
+ return filteredIndex;
12
+ }
13
+ function renderTypeSignature(type, options) {
14
+ let bcs = "bcs";
15
+ if (options.bcsImport && usesBcs(type, options)) bcs = options.bcsImport();
16
+ switch (type) {
17
+ case "address": switch (options.format) {
18
+ case "typescriptArg": return "string";
19
+ case "typeTag": return `address`;
20
+ case "bcs": return `${bcs}.Address`;
21
+ default: throw new Error(`Unknown format: ${options.format}`);
22
+ }
23
+ case "bool": switch (options.format) {
24
+ case "typescriptArg": return "boolean";
25
+ case "typeTag": return `bool`;
26
+ case "bcs": return `${bcs}.bool()`;
27
+ default: throw new Error(`Unknown format: ${options.format}`);
28
+ }
29
+ case "u8":
30
+ case "u16":
31
+ case "u32": switch (options.format) {
32
+ case "typescriptArg": return "number";
33
+ case "typeTag": return type.toLowerCase();
34
+ case "bcs": return `${bcs}.${type.toLowerCase()}()`;
35
+ default: throw new Error(`Unknown format: ${options.format}`);
36
+ }
37
+ case "u64":
38
+ case "u128":
39
+ case "u256": switch (options.format) {
40
+ case "typescriptArg": return `number | bigint`;
41
+ case "typeTag": return type.toLowerCase();
42
+ case "bcs": return `${bcs}.${type.toLowerCase()}()`;
43
+ default: throw new Error(`Unknown format: ${options.format}`);
44
+ }
45
+ case "signer": throw new Error("Signer is not supported");
46
+ case "_": throw new Error("Macro placeholder is not supported");
47
+ }
48
+ if ("Datatype" in type) return renderDataType(type.Datatype, options);
49
+ if ("Reference" in type) return renderTypeSignature(type.Reference[1], options);
50
+ if ("vector" in type) switch (options.format) {
51
+ case "typescriptArg": return `${renderTypeSignature(type.vector, options)}[]`;
52
+ case "typeTag": return `vector<${renderTypeSignature(type.vector, options)}>`;
53
+ case "bcs": return `${bcs}.vector(${renderTypeSignature(type.vector, options)})`;
54
+ default: throw new Error(`Unknown format: ${options.format}`);
55
+ }
56
+ if ("TypeParameter" in type) {
57
+ options.onTypeParameter?.(type.TypeParameter);
58
+ const originalIndex = type.TypeParameter;
59
+ const filteredIndex = getFilteredTypeParameterIndex(originalIndex, options.typeParameters, options.includePhantomTypeParameters);
60
+ switch (options.format) {
61
+ case "typescriptArg": return options.typeParameters?.[originalIndex]?.name ?? `T${originalIndex}`;
62
+ case "typeTag": return `\${options.typeArguments[${originalIndex}]}`;
63
+ case "bcs": return `typeParameters[${filteredIndex}]`;
64
+ default: throw new Error(`Unknown format: ${options.format}`);
65
+ }
66
+ }
67
+ if ("NamedTypeParameter" in type) {
68
+ options.onTypeParameter?.(type.NamedTypeParameter);
69
+ const originalIndex = options.typeParameters?.findIndex((p) => p.name === type.NamedTypeParameter) ?? -1;
70
+ if (originalIndex === -1) throw new Error(`Named type parameter ${type.NamedTypeParameter} not found`);
71
+ const filteredIndex = getFilteredTypeParameterIndex(originalIndex, options.typeParameters, options.includePhantomTypeParameters);
72
+ switch (options.format) {
73
+ case "typescriptArg": return type.NamedTypeParameter;
74
+ case "typeTag": return `\${options.typeArguments[${originalIndex}]}`;
75
+ case "bcs": return `typeParameters[${filteredIndex}]`;
76
+ default: throw new Error(`Unknown format: ${options.format}`);
77
+ }
78
+ }
79
+ throw new Error(`Unknown type signature: ${JSON.stringify(type, null, 2)}`);
80
+ }
81
+ function usesBcs(type, options) {
82
+ if (typeof type === "string") return true;
83
+ if ("Reference" in type) return usesBcs(type.Reference[1], options);
84
+ if ("Datatype" in type) return isPureDataType(type.Datatype, options);
85
+ if ("vector" in type) return true;
86
+ return false;
87
+ }
88
+ function isPureDataType(type, options) {
89
+ const address = options.resolveAddress(type.module.address);
90
+ if (address === MOVE_STDLIB_ADDRESS) {
91
+ if ((type.module.name === "ascii" || type.module.name === "string") && type.name === "String") return true;
92
+ if (type.module.name === "option" && type.name === "Option") return true;
93
+ }
94
+ if (address === HANEUL_FRAMEWORK_ADDRESS) {
95
+ if (type.module.name === "object" && (type.name === "ID" || type.name === "UID")) return true;
96
+ }
97
+ return false;
98
+ }
99
+ function renderDataType(type, options) {
100
+ const address = options.resolveAddress(type.module.address);
101
+ if (options.format === "typeTag") {
102
+ if (address === HANEUL_FRAMEWORK_ADDRESS) {
103
+ if (type.module.name === "clock" && type.name === "Clock") return "0x2::clock::Clock";
104
+ if (type.module.name === "random" && type.name === "Random") return "0x2::random::Random";
105
+ if (type.module.name === "deny_list" && type.name === "DenyList") return "0x2::deny_list::DenyList";
106
+ if (type.module.name === "object" && (type.name === "ID" || type.name === "UID")) return "0x2::object::ID";
107
+ }
108
+ if (address === HANEUL_SYSTEM_ADDRESS) {
109
+ if (type.module.name === "haneul_system" && type.name === "HaneulSystemState") return "0x3::haneul_system::HaneulSystemState";
110
+ }
111
+ if (address === MOVE_STDLIB_ADDRESS) {
112
+ if ((type.module.name === "ascii" || type.module.name === "string") && type.name === "String") return "0x1::string::String";
113
+ if (type.module.name === "option" && type.name === "Option") return `0x1::option::Option<${renderTypeSignature(type.type_arguments[0].argument, options)}>`;
114
+ }
115
+ return "null";
116
+ }
117
+ if (address === MOVE_STDLIB_ADDRESS) {
118
+ if ((type.module.name === "ascii" || type.module.name === "string") && type.name === "String") switch (options.format) {
119
+ case "typescriptArg": return "string";
120
+ case "bcs": return `${options.bcsImport?.() ?? "bcs"}.string()`;
121
+ default: throw new Error(`Unknown format: ${options.format}`);
122
+ }
123
+ if (type.module.name === "option" && type.name === "Option") switch (options.format) {
124
+ case "typescriptArg":
125
+ if (isPureDataType(type, options)) return `${renderTypeSignature(type.type_arguments[0].argument, options)} | null`;
126
+ break;
127
+ case "bcs": return `${options.bcsImport?.() ?? "bcs"}.option(${renderTypeSignature(type.type_arguments[0].argument, options)})`;
128
+ default: throw new Error(`Unknown format: ${options.format}`);
129
+ }
130
+ }
131
+ if (address === HANEUL_FRAMEWORK_ADDRESS) {
132
+ if (type.module.name === "object" && (type.name === "ID" || type.name === "UID")) switch (options.format) {
133
+ case "typescriptArg": return "string";
134
+ case "bcs": return `${options.bcsImport?.() ?? "bcs"}.Address`;
135
+ default: throw new Error(`Unknown format: ${options.format}`);
136
+ }
137
+ }
138
+ const isCurrentModule = address === options.resolveAddress(options.summary.id.address) && type.module.name === options.summary.id.name;
139
+ const importName = options.onDependency?.(type.module.address, type.module.name, type.name);
140
+ const typeNameRef = isCurrentModule ? type.name : `${importName ?? getSafeName(type.module.name)}.${getSafeName(type.name)}`;
141
+ const filteredTypeArguments = type.type_arguments.filter((arg) => !arg.phantom);
142
+ switch (options.format) {
143
+ case "typescriptArg": return "string";
144
+ case "bcs":
145
+ if (filteredTypeArguments.length === 0) return typeNameRef;
146
+ return `${typeNameRef}(
147
+ ${filteredTypeArguments.map((type$1) => renderTypeSignature(type$1.argument, options)).join(", ")})`;
148
+ default: throw new Error(`Unknown format: ${options.format}`);
149
+ }
150
+ }
151
+ const JS_RESERVED_NAMES = [
152
+ "new",
153
+ "delete",
154
+ "class",
155
+ "function",
156
+ "import",
157
+ "export",
158
+ "return",
159
+ "this",
160
+ "super",
161
+ "arguments",
162
+ "eval",
163
+ "void",
164
+ "typeof",
165
+ "instanceof",
166
+ "delete",
167
+ "in",
168
+ "from",
169
+ "of",
170
+ "as",
171
+ "async",
172
+ "await",
173
+ "break",
174
+ "case",
175
+ "catch",
176
+ "continue",
177
+ "debugger",
178
+ "default",
179
+ "do",
180
+ "else",
181
+ "finally",
182
+ "for",
183
+ "function",
184
+ "if",
185
+ "import",
186
+ "in",
187
+ "instanceof",
188
+ "new",
189
+ "return",
190
+ "switch",
191
+ "throw",
192
+ "try",
193
+ "typeof",
194
+ "var",
195
+ "void",
196
+ "while",
197
+ "with",
198
+ "yield",
199
+ "package"
200
+ ];
201
+ function getSafeName(name) {
202
+ return JS_RESERVED_NAMES.includes(name) ? `_${name}` : name;
203
+ }
204
+
205
+ //#endregion
206
+ export { HANEUL_FRAMEWORK_ADDRESS, HANEUL_SYSTEM_ADDRESS, getSafeName, renderTypeSignature };
207
+ //# sourceMappingURL=render-types.mjs.map