@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.
- package/CHANGELOG.md +138 -33
- package/README.md +40 -38
- package/dist/bin/bash-complete.d.mts +6 -0
- package/dist/bin/bash-complete.d.mts.map +1 -0
- package/dist/bin/bash-complete.mjs +29 -0
- package/dist/bin/bash-complete.mjs.map +1 -0
- package/dist/bin/cli.d.mts +1 -0
- package/dist/bin/cli.mjs +24 -0
- package/dist/bin/cli.mjs.map +1 -0
- package/dist/cli/cli.mjs +28 -0
- package/dist/cli/cli.mjs.map +1 -0
- package/dist/cli/commands/generate/command.mjs +90 -0
- package/dist/cli/commands/generate/command.mjs.map +1 -0
- package/dist/cli/commands/generate/impl.mjs +72 -0
- package/dist/cli/commands/generate/impl.mjs.map +1 -0
- package/dist/cli/context.mjs +17 -0
- package/dist/cli/context.mjs.map +1 -0
- package/dist/config.d.mts +105 -0
- package/dist/config.d.mts.map +1 -0
- package/dist/config.mjs +70 -0
- package/dist/config.mjs.map +1 -0
- package/dist/file-builder.mjs +66 -0
- package/dist/file-builder.mjs.map +1 -0
- package/dist/{esm/generate-utils.js → generate-utils.mjs} +95 -27
- package/dist/generate-utils.mjs.map +1 -0
- package/dist/index.d.mts +21 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +80 -0
- package/dist/index.mjs.map +1 -0
- package/dist/move-module-builder.mjs +350 -0
- package/dist/move-module-builder.mjs.map +1 -0
- package/dist/render-types.mjs +207 -0
- package/dist/render-types.mjs.map +1 -0
- package/dist/utils.mjs +89 -0
- package/dist/utils.mjs.map +1 -0
- package/docs/index.md +436 -0
- package/docs/llms-index.md +6 -0
- package/package.json +29 -28
- package/src/bin/bash-complete.ts +18 -7
- package/src/bin/cli.ts +3 -9
- package/src/cli/commands/generate/command.ts +32 -0
- package/src/cli/commands/generate/impl.ts +93 -5
- package/src/config.ts +53 -5
- package/src/file-builder.ts +15 -1
- package/src/generate-utils.ts +88 -18
- package/src/index.ts +89 -29
- package/src/move-module-builder.ts +181 -76
- package/src/render-types.ts +82 -29
- package/dist/cjs/bin/bash-complete.d.ts +0 -2
- package/dist/cjs/bin/bash-complete.js +0 -51
- package/dist/cjs/bin/bash-complete.js.map +0 -7
- package/dist/cjs/bin/cli.d.ts +0 -2
- package/dist/cjs/bin/cli.js +0 -34
- package/dist/cjs/bin/cli.js.map +0 -7
- package/dist/cjs/cli/cli.d.ts +0 -1
- package/dist/cjs/cli/cli.js +0 -49
- package/dist/cjs/cli/cli.js.map +0 -7
- package/dist/cjs/cli/commands/generate/command.d.ts +0 -1
- package/dist/cjs/cli/commands/generate/command.js +0 -80
- package/dist/cjs/cli/commands/generate/command.js.map +0 -7
- package/dist/cjs/cli/commands/generate/impl.d.ts +0 -8
- package/dist/cjs/cli/commands/generate/impl.js +0 -66
- package/dist/cjs/cli/commands/generate/impl.js.map +0 -7
- package/dist/cjs/cli/context.d.ts +0 -6
- package/dist/cjs/cli/context.js +0 -45
- package/dist/cjs/cli/context.js.map +0 -7
- package/dist/cjs/config.d.ts +0 -51
- package/dist/cjs/config.js +0 -75
- package/dist/cjs/config.js.map +0 -7
- package/dist/cjs/file-builder.d.ts +0 -13
- package/dist/cjs/file-builder.js +0 -83
- package/dist/cjs/file-builder.js.map +0 -7
- package/dist/cjs/generate-utils.d.ts +0 -1
- package/dist/cjs/generate-utils.js +0 -187
- package/dist/cjs/generate-utils.js.map +0 -7
- package/dist/cjs/index.d.ts +0 -8
- package/dist/cjs/index.js +0 -124
- package/dist/cjs/index.js.map +0 -7
- package/dist/cjs/move-module-builder.d.ts +0 -26
- package/dist/cjs/move-module-builder.js +0 -464
- package/dist/cjs/move-module-builder.js.map +0 -7
- package/dist/cjs/package.json +0 -5
- package/dist/cjs/render-types.d.ts +0 -19
- package/dist/cjs/render-types.js +0 -313
- package/dist/cjs/render-types.js.map +0 -7
- package/dist/cjs/summary.d.ts +0 -3
- package/dist/cjs/summary.js +0 -218
- package/dist/cjs/summary.js.map +0 -7
- package/dist/cjs/types/deserialized.d.ts +0 -89
- package/dist/cjs/types/deserialized.js +0 -17
- package/dist/cjs/types/deserialized.js.map +0 -7
- package/dist/cjs/types/summary.d.ts +0 -105
- package/dist/cjs/types/summary.js +0 -17
- package/dist/cjs/types/summary.js.map +0 -7
- package/dist/cjs/utils.d.ts +0 -22
- package/dist/cjs/utils.js +0 -164
- package/dist/cjs/utils.js.map +0 -7
- package/dist/esm/bin/bash-complete.d.ts +0 -2
- package/dist/esm/bin/bash-complete.js +0 -31
- package/dist/esm/bin/bash-complete.js.map +0 -7
- package/dist/esm/bin/cli.d.ts +0 -2
- package/dist/esm/bin/cli.js +0 -32
- package/dist/esm/bin/cli.js.map +0 -7
- package/dist/esm/cli/cli.d.ts +0 -1
- package/dist/esm/cli/cli.js +0 -29
- package/dist/esm/cli/cli.js.map +0 -7
- package/dist/esm/cli/commands/generate/command.d.ts +0 -1
- package/dist/esm/cli/commands/generate/command.js +0 -50
- package/dist/esm/cli/commands/generate/command.js.map +0 -7
- package/dist/esm/cli/commands/generate/impl.d.ts +0 -8
- package/dist/esm/cli/commands/generate/impl.js +0 -46
- package/dist/esm/cli/commands/generate/impl.js.map +0 -7
- package/dist/esm/cli/context.d.ts +0 -6
- package/dist/esm/cli/context.js +0 -15
- package/dist/esm/cli/context.js.map +0 -7
- package/dist/esm/config.d.ts +0 -51
- package/dist/esm/config.js +0 -45
- package/dist/esm/config.js.map +0 -7
- package/dist/esm/file-builder.d.ts +0 -13
- package/dist/esm/file-builder.js +0 -63
- package/dist/esm/file-builder.js.map +0 -7
- package/dist/esm/generate-utils.d.ts +0 -1
- package/dist/esm/generate-utils.js.map +0 -7
- package/dist/esm/index.d.ts +0 -8
- package/dist/esm/index.js +0 -104
- package/dist/esm/index.js.map +0 -7
- package/dist/esm/move-module-builder.d.ts +0 -26
- package/dist/esm/move-module-builder.js +0 -457
- package/dist/esm/move-module-builder.js.map +0 -7
- package/dist/esm/package.json +0 -5
- package/dist/esm/render-types.d.ts +0 -19
- package/dist/esm/render-types.js +0 -293
- package/dist/esm/render-types.js.map +0 -7
- package/dist/esm/summary.d.ts +0 -3
- package/dist/esm/summary.js +0 -198
- package/dist/esm/summary.js.map +0 -7
- package/dist/esm/types/deserialized.d.ts +0 -89
- package/dist/esm/types/deserialized.js +0 -1
- package/dist/esm/types/deserialized.js.map +0 -7
- package/dist/esm/types/summary.d.ts +0 -105
- package/dist/esm/types/summary.js +0 -1
- package/dist/esm/types/summary.js.map +0 -7
- package/dist/esm/utils.d.ts +0 -22
- package/dist/esm/utils.js +0 -134
- package/dist/esm/utils.js.map +0 -7
- package/dist/tsconfig.esm.tsbuildinfo +0 -1
- 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
|