@codama/renderers-rust 1.2.8 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -13
- package/dist/index.node.cjs +460 -268
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +380 -212
- package/dist/index.node.mjs.map +1 -1
- package/dist/types/ImportMap.d.ts +4 -1
- package/dist/types/ImportMap.d.ts.map +1 -1
- package/dist/types/getRenderMapVisitor.d.ts +3 -4
- package/dist/types/getRenderMapVisitor.d.ts.map +1 -1
- package/dist/types/renderVisitor.d.ts +3 -2
- package/dist/types/renderVisitor.d.ts.map +1 -1
- package/dist/types/utils/cargoToml.d.ts +51 -0
- package/dist/types/utils/cargoToml.d.ts.map +1 -0
- package/dist/types/utils/fragment.d.ts +6 -0
- package/dist/types/utils/fragment.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/types/utils/index.d.ts.map +1 -1
- package/package.json +12 -9
package/dist/index.node.cjs
CHANGED
|
@@ -1,44 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var errors = require('@codama/errors');
|
|
6
|
+
var nodes = require('@codama/nodes');
|
|
7
|
+
var renderersCore = require('@codama/renderers-core');
|
|
8
|
+
var visitorsCore = require('@codama/visitors-core');
|
|
9
|
+
var toml = require('@iarna/toml');
|
|
10
|
+
var semver = require('semver');
|
|
11
|
+
var codecsStrings = require('@solana/codecs-strings');
|
|
12
|
+
var path = require('path');
|
|
13
|
+
require('url');
|
|
14
|
+
var nunjucks = require('nunjucks');
|
|
15
|
+
var child_process = require('child_process');
|
|
16
|
+
|
|
17
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
29
18
|
|
|
30
|
-
|
|
31
|
-
var index_exports = {};
|
|
32
|
-
__export(index_exports, {
|
|
33
|
-
ImportMap: () => ImportMap,
|
|
34
|
-
default: () => renderVisitor,
|
|
35
|
-
getRenderMapVisitor: () => getRenderMapVisitor,
|
|
36
|
-
getTypeManifestVisitor: () => getTypeManifestVisitor,
|
|
37
|
-
renderVisitor: () => renderVisitor
|
|
38
|
-
});
|
|
39
|
-
module.exports = __toCommonJS(index_exports);
|
|
19
|
+
var nunjucks__default = /*#__PURE__*/_interopDefault(nunjucks);
|
|
40
20
|
|
|
41
21
|
// src/ImportMap.ts
|
|
22
|
+
var RUST_CORE_IMPORTS = /* @__PURE__ */ new Set(["std", "crate", "super", "self", "core", "alloc", "clippy"]);
|
|
42
23
|
var DEFAULT_MODULE_MAP = {
|
|
43
24
|
generated: "crate::generated",
|
|
44
25
|
generatedAccounts: "crate::generated::accounts",
|
|
@@ -98,6 +79,10 @@ var ImportMap = class _ImportMap {
|
|
|
98
79
|
this._aliases.forEach((alias, i) => newImportMap.addAlias(resolveDependency(i), alias));
|
|
99
80
|
return newImportMap;
|
|
100
81
|
}
|
|
82
|
+
getExternalDependencies(dependencyMap) {
|
|
83
|
+
const resolvedMap = this.resolveDependencyMap(dependencyMap);
|
|
84
|
+
return new Set([...resolvedMap._imports].map((i) => i.split("::")[0]).filter((i) => !RUST_CORE_IMPORTS.has(i)));
|
|
85
|
+
}
|
|
101
86
|
toString(dependencies) {
|
|
102
87
|
const resolvedMap = this.resolveDependencyMap(dependencies);
|
|
103
88
|
const importStatements = [...resolvedMap.imports].map((i) => {
|
|
@@ -108,48 +93,274 @@ var ImportMap = class _ImportMap {
|
|
|
108
93
|
return importStatements.join("\n");
|
|
109
94
|
}
|
|
110
95
|
};
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
96
|
+
var DEFAULT_DEPENDENCY_VERSIONS = {
|
|
97
|
+
"anchor-lang": { optional: true, version: "~0.31" },
|
|
98
|
+
borsh: "^0.10",
|
|
99
|
+
kaigan: { features: ["serde"], version: "^0.3" },
|
|
100
|
+
"num-derive": "^0.4",
|
|
101
|
+
"num-traits": "^0.2",
|
|
102
|
+
serde: { features: ["derive"], optional: true, version: "^1.0" },
|
|
103
|
+
"serde-big-array": "^0.5",
|
|
104
|
+
serde_with: { optional: true, version: "^3.0" },
|
|
105
|
+
"solana-account": "~2.2",
|
|
106
|
+
"solana-account-info": "~2.3",
|
|
107
|
+
"solana-client": { optional: true, version: "^2.2" },
|
|
108
|
+
"solana-cpi": "~2.2",
|
|
109
|
+
"solana-decode-error": "~2.3",
|
|
110
|
+
"solana-instruction": "~2.3",
|
|
111
|
+
"solana-program-error": "~2.2",
|
|
112
|
+
"solana-pubkey": { features: ["curve25519", "borsh"], version: "~2.3" },
|
|
113
|
+
"solana-sdk": { optional: true, version: "^2.3" },
|
|
114
|
+
thiserror: "^1.0"
|
|
115
|
+
};
|
|
116
|
+
function syncCargoToml(renderMap, crateFolder, options) {
|
|
117
|
+
const shouldSyncCargoToml = options.syncCargoToml ?? false;
|
|
118
|
+
const cargoTomlPath = renderersCore.joinPath(crateFolder, "Cargo.toml");
|
|
119
|
+
const usedDependencies = getUsedDependencyVersions(
|
|
120
|
+
renderMap,
|
|
121
|
+
options.dependencyMap ?? {},
|
|
122
|
+
options.dependencyVersions ?? {}
|
|
123
|
+
);
|
|
124
|
+
if (!shouldSyncCargoToml) {
|
|
125
|
+
if (renderersCore.fileExists(cargoTomlPath)) {
|
|
126
|
+
checkExistingCargoToml(readCargoToml(cargoTomlPath), usedDependencies);
|
|
127
|
+
}
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (renderersCore.fileExists(cargoTomlPath)) {
|
|
131
|
+
const cargoToml = updateExistingCargoToml(readCargoToml(cargoTomlPath), usedDependencies);
|
|
132
|
+
renderersCore.writeFile(cargoTomlPath, toml.stringify(cargoToml) + "\n");
|
|
133
|
+
} else {
|
|
134
|
+
const cargoToml = createNewCargoToml(usedDependencies);
|
|
135
|
+
renderersCore.writeFile(cargoTomlPath, toml.stringify(cargoToml) + "\n");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function createNewCargoToml(usedDependencies) {
|
|
139
|
+
return updateExistingCargoToml(
|
|
140
|
+
{
|
|
141
|
+
name: "rust-client",
|
|
142
|
+
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
143
|
+
description: "",
|
|
144
|
+
version: "1.0.0",
|
|
145
|
+
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
146
|
+
repository: { workspace: true },
|
|
147
|
+
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
148
|
+
edition: { workspace: true },
|
|
149
|
+
license: { workspace: true },
|
|
150
|
+
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
151
|
+
features: {
|
|
152
|
+
anchor: ["dep:anchor-lang"],
|
|
153
|
+
"anchor-idl-build": ["anchor", "anchor-lang?/idl-build"],
|
|
154
|
+
fetch: ["dep:solana-client", "dep:solana-sdk"],
|
|
155
|
+
serde: ["dep:serde", "dep:serde_with"]
|
|
156
|
+
},
|
|
157
|
+
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
158
|
+
dependencies: {}
|
|
159
|
+
},
|
|
160
|
+
usedDependencies
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
function updateExistingCargoToml(cargoToml, usedDependencies) {
|
|
164
|
+
const foundUsedDependencies = /* @__PURE__ */ new Set();
|
|
165
|
+
const updatedCargoToml = updateCargoDependencies(cargoToml, (dependencyGroup) => {
|
|
166
|
+
return Object.fromEntries(
|
|
167
|
+
Object.entries(dependencyGroup).map(([dependencyKey, dependency]) => {
|
|
168
|
+
const foundUsedDependency = findCargoDependencyByImportName(
|
|
169
|
+
usedDependencies,
|
|
170
|
+
getCargoDependencyImportName(dependencyKey)
|
|
171
|
+
);
|
|
172
|
+
if (!foundUsedDependency) {
|
|
173
|
+
return [dependencyKey, dependency];
|
|
174
|
+
}
|
|
175
|
+
const [usedDependencyKey, usedDependency] = foundUsedDependency;
|
|
176
|
+
foundUsedDependencies.add(usedDependencyKey);
|
|
177
|
+
const usedDependencyCrateName = getCargoDependencyCrateName(usedDependencyKey, usedDependency);
|
|
178
|
+
if (!shouldUpdateDependency(usedDependencyCrateName, dependency, usedDependency)) {
|
|
179
|
+
return [dependencyKey, dependency];
|
|
180
|
+
}
|
|
181
|
+
const newVersion = getCargoDependencyVersion(usedDependency);
|
|
182
|
+
return [
|
|
183
|
+
dependencyKey,
|
|
184
|
+
typeof dependency === "string" ? newVersion : { ...dependency, version: newVersion }
|
|
185
|
+
];
|
|
186
|
+
})
|
|
187
|
+
);
|
|
188
|
+
});
|
|
189
|
+
const usedDependenciesToAdd = Object.entries(usedDependencies).filter(
|
|
190
|
+
([usedDependencyKey]) => !foundUsedDependencies.has(usedDependencyKey)
|
|
191
|
+
);
|
|
192
|
+
for (const [usedDependencyKey, usedDependency] of usedDependenciesToAdd) {
|
|
193
|
+
updatedCargoToml.dependencies = updatedCargoToml.dependencies ?? {};
|
|
194
|
+
updatedCargoToml.dependencies[usedDependencyKey] = usedDependency;
|
|
195
|
+
}
|
|
196
|
+
return updatedCargoToml;
|
|
197
|
+
}
|
|
198
|
+
function checkExistingCargoToml(cargoToml, usedDependencies) {
|
|
199
|
+
const missingDependencies = [];
|
|
200
|
+
const dependenciesToUpdate = [];
|
|
201
|
+
const existingDependencies = {
|
|
202
|
+
...cargoToml["build-dependencies"],
|
|
203
|
+
...cargoToml["dev-dependencies"],
|
|
204
|
+
...cargoToml.dependencies,
|
|
205
|
+
...cargoToml.workspace?.dependencies,
|
|
206
|
+
...Object.values(cargoToml.target ?? {}).reduce((acc, target) => {
|
|
207
|
+
return {
|
|
208
|
+
...acc,
|
|
209
|
+
...target["build-dependencies"],
|
|
210
|
+
...target["dev-dependencies"],
|
|
211
|
+
...target.dependencies
|
|
212
|
+
};
|
|
213
|
+
}, {})
|
|
214
|
+
};
|
|
215
|
+
for (const [usedDependencyKey, usedDependency] of Object.entries(usedDependencies)) {
|
|
216
|
+
const foundExistingDependency = findCargoDependencyByImportName(
|
|
217
|
+
existingDependencies,
|
|
218
|
+
getCargoDependencyImportName(usedDependencyKey)
|
|
219
|
+
);
|
|
220
|
+
if (!foundExistingDependency) {
|
|
221
|
+
missingDependencies.push(usedDependencyKey);
|
|
222
|
+
} else if (shouldUpdateDependency(foundExistingDependency[0], foundExistingDependency[1], usedDependency)) {
|
|
223
|
+
dependenciesToUpdate.push(usedDependencyKey);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (missingDependencies.length === 0 && dependenciesToUpdate.length === 0) return;
|
|
227
|
+
const missingList = missingDependencies.map((d) => `- ${d} missing: ${getCargoDependencyVersion(usedDependencies[d])}
|
|
228
|
+
`).join("");
|
|
229
|
+
const outdatedList = dependenciesToUpdate.map(
|
|
230
|
+
(d) => `- ${d} outdated: ${getCargoDependencyVersion(existingDependencies[d])} -> ${getCargoDependencyVersion(usedDependencies[d])}
|
|
231
|
+
`
|
|
232
|
+
).join("");
|
|
233
|
+
errors.logWarn(
|
|
234
|
+
`The following dependencies in your \`Cargo.toml\` are out-of-date or missing:
|
|
235
|
+
${missingList}${outdatedList}`
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
function getUsedDependencyVersions(renderMap, dependencyMap, dependencyVersions) {
|
|
239
|
+
const usedImportNames = getUsedImportNames(renderMap, dependencyMap);
|
|
240
|
+
const dependencyVersionsWithDefaults = {
|
|
241
|
+
...DEFAULT_DEPENDENCY_VERSIONS,
|
|
242
|
+
...dependencyVersions
|
|
243
|
+
};
|
|
244
|
+
const [usedDependencyVersion, missingDependencies] = [...usedImportNames].reduce(
|
|
245
|
+
([acc, missingDependencies2], usedImportName) => {
|
|
246
|
+
const usedDependency = findCargoDependencyByImportName(dependencyVersionsWithDefaults, usedImportName);
|
|
247
|
+
if (usedDependency) {
|
|
248
|
+
acc[usedDependency[0]] = usedDependency[1];
|
|
249
|
+
} else {
|
|
250
|
+
missingDependencies2.add(usedImportName);
|
|
251
|
+
}
|
|
252
|
+
return [acc, missingDependencies2];
|
|
253
|
+
},
|
|
254
|
+
[{}, /* @__PURE__ */ new Set()]
|
|
255
|
+
);
|
|
256
|
+
if (missingDependencies.size > 0) {
|
|
257
|
+
throw new errors.CodamaError(errors.CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS, {
|
|
258
|
+
dependencies: [...missingDependencies],
|
|
259
|
+
message: "Please add these dependencies to the `dependencyVersions` option."
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
return usedDependencyVersion;
|
|
263
|
+
}
|
|
264
|
+
function getUsedImportNames(renderMap, dependencyMap) {
|
|
265
|
+
const fragments = [...renderMap.values()];
|
|
266
|
+
const fromImportMap = new ImportMap().mergeWith(...fragments.map(({ imports }) => imports)).getExternalDependencies(dependencyMap);
|
|
267
|
+
const PATH_REGEX = /\b(?:::)?([a-z_][a-z0-9_]*)(?:::[a-zA-Z0-9_]+)+/g;
|
|
268
|
+
const fromContent = fragments.flatMap(({ content }) => {
|
|
269
|
+
return [...content.matchAll(PATH_REGEX)].map((match) => match[1]).filter((crateName) => !RUST_CORE_IMPORTS.has(crateName));
|
|
270
|
+
});
|
|
271
|
+
return /* @__PURE__ */ new Set([...fromImportMap, ...fromContent]);
|
|
272
|
+
}
|
|
273
|
+
function shouldUpdateDependency(dependency, currentDependency, requiredDependency) {
|
|
274
|
+
const currentRange = getCargoDependencyVersion(currentDependency);
|
|
275
|
+
const requiredRange = getCargoDependencyVersion(requiredDependency);
|
|
276
|
+
return !!currentRange && !!requiredRange && shouldUpdateRange(dependency, currentRange, requiredRange);
|
|
277
|
+
}
|
|
278
|
+
function shouldUpdateRange(dependency, currentRange, requiredRange) {
|
|
279
|
+
currentRange = cargoToNpmSemver(currentRange);
|
|
280
|
+
requiredRange = cargoToNpmSemver(requiredRange);
|
|
281
|
+
try {
|
|
282
|
+
if (semver.subset(currentRange, requiredRange)) {
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
const minRequiredVersion = semver.minVersion(requiredRange);
|
|
286
|
+
const minCurrentVersion = semver.minVersion(currentRange);
|
|
287
|
+
if (!minCurrentVersion || !minRequiredVersion) {
|
|
288
|
+
throw new Error("Could not determine minimum versions.");
|
|
289
|
+
}
|
|
290
|
+
if (semver.lt(minCurrentVersion, minRequiredVersion)) {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
return false;
|
|
294
|
+
} catch (error) {
|
|
295
|
+
console.warn(
|
|
296
|
+
`Could not parse the following ranges for dependency "${dependency}": [${currentRange}] and/or [${requiredRange}]. Caused by: ${error.message}`
|
|
297
|
+
);
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
function updateCargoDependencies(cargoToml, updateFn) {
|
|
302
|
+
const updatedCargoToml = JSON.parse(JSON.stringify(cargoToml));
|
|
303
|
+
const standardSections = ["dependencies", "dev-dependencies", "build-dependencies"];
|
|
304
|
+
for (const section of standardSections) {
|
|
305
|
+
if (updatedCargoToml[section]) {
|
|
306
|
+
updatedCargoToml[section] = updateFn(updatedCargoToml[section]);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (updatedCargoToml.target) {
|
|
310
|
+
for (const targetKey of Object.keys(updatedCargoToml.target)) {
|
|
311
|
+
for (const section of standardSections) {
|
|
312
|
+
if (updatedCargoToml.target[targetKey][section]) {
|
|
313
|
+
updatedCargoToml.target[targetKey][section] = updateFn(updatedCargoToml.target[targetKey][section]);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (updatedCargoToml.workspace?.dependencies) {
|
|
319
|
+
updatedCargoToml.workspace.dependencies = updateFn(updatedCargoToml.workspace.dependencies);
|
|
320
|
+
}
|
|
321
|
+
return updatedCargoToml;
|
|
322
|
+
}
|
|
323
|
+
function cargoToNpmSemver(cargoVersion) {
|
|
324
|
+
const version = cargoVersion.trim();
|
|
325
|
+
return /^\d+(\.\d+)?(\.\d+)?/.test(version) ? `^${version}` : version;
|
|
326
|
+
}
|
|
327
|
+
function getCargoDependencyVersion(dependency) {
|
|
328
|
+
return typeof dependency === "string" ? dependency : dependency.version;
|
|
329
|
+
}
|
|
330
|
+
function getCargoDependencyCrateName(key, dependency) {
|
|
331
|
+
return typeof dependency !== "string" && dependency.package ? dependency.package : key;
|
|
332
|
+
}
|
|
333
|
+
function getCargoDependencyImportName(key) {
|
|
334
|
+
return key.replace(/-/g, "_");
|
|
335
|
+
}
|
|
336
|
+
function findCargoDependencyByImportName(dependencies, importName) {
|
|
337
|
+
return Object.entries(dependencies).find(([key]) => {
|
|
338
|
+
return getCargoDependencyImportName(key) === importName;
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
function readCargoToml(path) {
|
|
342
|
+
return toml.parse(renderersCore.readFile(path));
|
|
343
|
+
}
|
|
125
344
|
function getBytesFromBytesValueNode(node) {
|
|
126
345
|
switch (node.encoding) {
|
|
127
346
|
case "utf8":
|
|
128
|
-
return
|
|
347
|
+
return codecsStrings.getUtf8Encoder().encode(node.data);
|
|
129
348
|
case "base16":
|
|
130
|
-
return
|
|
349
|
+
return codecsStrings.getBase16Encoder().encode(node.data);
|
|
131
350
|
case "base58":
|
|
132
|
-
return
|
|
351
|
+
return codecsStrings.getBase58Encoder().encode(node.data);
|
|
133
352
|
case "base64":
|
|
134
353
|
default:
|
|
135
|
-
return
|
|
354
|
+
return codecsStrings.getBase64Encoder().encode(node.data);
|
|
136
355
|
}
|
|
137
356
|
}
|
|
138
|
-
|
|
139
|
-
// src/utils/discriminatorConstant.ts
|
|
140
|
-
var import_nodes2 = require("@codama/nodes");
|
|
141
|
-
var import_visitors_core2 = require("@codama/visitors-core");
|
|
142
|
-
|
|
143
|
-
// src/renderValueNodeVisitor.ts
|
|
144
|
-
var import_nodes = require("@codama/nodes");
|
|
145
|
-
var import_visitors_core = require("@codama/visitors-core");
|
|
146
357
|
function renderValueNode(value, getImportFrom, useStr = false) {
|
|
147
|
-
return
|
|
358
|
+
return visitorsCore.visit(value, renderValueNodeVisitor(getImportFrom, useStr));
|
|
148
359
|
}
|
|
149
360
|
function renderValueNodeVisitor(getImportFrom, useStr = false) {
|
|
150
361
|
return {
|
|
151
362
|
visitArrayValue(node) {
|
|
152
|
-
const list = node.items.map((v) =>
|
|
363
|
+
const list = node.items.map((v) => visitorsCore.visit(v, this));
|
|
153
364
|
return {
|
|
154
365
|
imports: new ImportMap().mergeWith(...list.map((c) => c.imports)),
|
|
155
366
|
render: `[${list.map((c) => c.render).join(", ")}]`
|
|
@@ -163,18 +374,18 @@ function renderValueNodeVisitor(getImportFrom, useStr = false) {
|
|
|
163
374
|
},
|
|
164
375
|
visitBytesValue(node) {
|
|
165
376
|
const bytes = getBytesFromBytesValueNode(node);
|
|
166
|
-
const numbers = Array.from(bytes).map(
|
|
167
|
-
return
|
|
377
|
+
const numbers = Array.from(bytes).map(nodes.numberValueNode);
|
|
378
|
+
return visitorsCore.visit(nodes.arrayValueNode(numbers), this);
|
|
168
379
|
},
|
|
169
380
|
visitConstantValue(node) {
|
|
170
|
-
if (
|
|
171
|
-
return
|
|
381
|
+
if (nodes.isNode(node.value, "bytesValueNode")) {
|
|
382
|
+
return visitorsCore.visit(node.value, this);
|
|
172
383
|
}
|
|
173
|
-
if (
|
|
174
|
-
return
|
|
384
|
+
if (nodes.isNode(node.type, "stringTypeNode") && nodes.isNode(node.value, "stringValueNode")) {
|
|
385
|
+
return visitorsCore.visit(nodes.bytesValueNode(node.type.encoding, node.value.string), this);
|
|
175
386
|
}
|
|
176
|
-
if (
|
|
177
|
-
const numberManifest =
|
|
387
|
+
if (nodes.isNode(node.type, "numberTypeNode") && nodes.isNode(node.value, "numberValueNode")) {
|
|
388
|
+
const numberManifest = visitorsCore.visit(node.value, this);
|
|
178
389
|
const { format, endian } = node.type;
|
|
179
390
|
const byteFunction = endian === "le" ? "to_le_bytes" : "to_be_bytes";
|
|
180
391
|
numberManifest.render = `${numberManifest.render}${format}.${byteFunction}()`;
|
|
@@ -184,14 +395,14 @@ function renderValueNodeVisitor(getImportFrom, useStr = false) {
|
|
|
184
395
|
},
|
|
185
396
|
visitEnumValue(node) {
|
|
186
397
|
const imports = new ImportMap();
|
|
187
|
-
const enumName =
|
|
188
|
-
const variantName =
|
|
398
|
+
const enumName = nodes.pascalCase(node.enum.name);
|
|
399
|
+
const variantName = nodes.pascalCase(node.variant);
|
|
189
400
|
const importFrom = getImportFrom(node.enum);
|
|
190
401
|
imports.add(`${importFrom}::${enumName}`);
|
|
191
402
|
if (!node.value) {
|
|
192
403
|
return { imports, render: `${enumName}::${variantName}` };
|
|
193
404
|
}
|
|
194
|
-
const enumValue =
|
|
405
|
+
const enumValue = visitorsCore.visit(node.value, this);
|
|
195
406
|
const fields = enumValue.render;
|
|
196
407
|
return {
|
|
197
408
|
imports: imports.mergeWith(enumValue.imports),
|
|
@@ -199,15 +410,15 @@ function renderValueNodeVisitor(getImportFrom, useStr = false) {
|
|
|
199
410
|
};
|
|
200
411
|
},
|
|
201
412
|
visitMapEntryValue(node) {
|
|
202
|
-
const mapKey =
|
|
203
|
-
const mapValue =
|
|
413
|
+
const mapKey = visitorsCore.visit(node.key, this);
|
|
414
|
+
const mapValue = visitorsCore.visit(node.value, this);
|
|
204
415
|
return {
|
|
205
416
|
imports: mapKey.imports.mergeWith(mapValue.imports),
|
|
206
417
|
render: `[${mapKey.render}, ${mapValue.render}]`
|
|
207
418
|
};
|
|
208
419
|
},
|
|
209
420
|
visitMapValue(node) {
|
|
210
|
-
const map = node.entries.map((entry) =>
|
|
421
|
+
const map = node.entries.map((entry) => visitorsCore.visit(entry, this));
|
|
211
422
|
const imports = new ImportMap().add("std::collection::HashMap");
|
|
212
423
|
return {
|
|
213
424
|
imports: imports.mergeWith(...map.map((c) => c.imports)),
|
|
@@ -233,7 +444,7 @@ function renderValueNodeVisitor(getImportFrom, useStr = false) {
|
|
|
233
444
|
};
|
|
234
445
|
},
|
|
235
446
|
visitSetValue(node) {
|
|
236
|
-
const set = node.items.map((v) =>
|
|
447
|
+
const set = node.items.map((v) => visitorsCore.visit(v, this));
|
|
237
448
|
const imports = new ImportMap().add("std::collection::HashSet");
|
|
238
449
|
return {
|
|
239
450
|
imports: imports.mergeWith(...set.map((c) => c.imports)),
|
|
@@ -241,7 +452,7 @@ function renderValueNodeVisitor(getImportFrom, useStr = false) {
|
|
|
241
452
|
};
|
|
242
453
|
},
|
|
243
454
|
visitSomeValue(node) {
|
|
244
|
-
const child =
|
|
455
|
+
const child = visitorsCore.visit(node.value, this);
|
|
245
456
|
return {
|
|
246
457
|
...child,
|
|
247
458
|
render: `Some(${child.render})`
|
|
@@ -254,21 +465,21 @@ function renderValueNodeVisitor(getImportFrom, useStr = false) {
|
|
|
254
465
|
};
|
|
255
466
|
},
|
|
256
467
|
visitStructFieldValue(node) {
|
|
257
|
-
const structValue =
|
|
468
|
+
const structValue = visitorsCore.visit(node.value, this);
|
|
258
469
|
return {
|
|
259
470
|
imports: structValue.imports,
|
|
260
471
|
render: `${node.name}: ${structValue.render}`
|
|
261
472
|
};
|
|
262
473
|
},
|
|
263
474
|
visitStructValue(node) {
|
|
264
|
-
const struct = node.fields.map((field) =>
|
|
475
|
+
const struct = node.fields.map((field) => visitorsCore.visit(field, this));
|
|
265
476
|
return {
|
|
266
477
|
imports: new ImportMap().mergeWith(...struct.map((c) => c.imports)),
|
|
267
478
|
render: `{ ${struct.map((c) => c.render).join(", ")} }`
|
|
268
479
|
};
|
|
269
480
|
},
|
|
270
481
|
visitTupleValue(node) {
|
|
271
|
-
const tuple = node.items.map((v) =>
|
|
482
|
+
const tuple = node.items.map((v) => visitorsCore.visit(v, this));
|
|
272
483
|
return {
|
|
273
484
|
imports: new ImportMap().mergeWith(...tuple.map((c) => c.imports)),
|
|
274
485
|
render: `(${tuple.map((c) => c.render).join(", ")})`
|
|
@@ -299,31 +510,28 @@ function getDiscriminatorConstant(discriminatorNode, scope) {
|
|
|
299
510
|
}
|
|
300
511
|
function getConstantDiscriminatorConstant(discriminatorNode, scope) {
|
|
301
512
|
const { discriminatorNodes, getImportFrom, prefix, typeManifestVisitor } = scope;
|
|
302
|
-
const index = discriminatorNodes.filter(
|
|
513
|
+
const index = discriminatorNodes.filter(nodes.isNodeFilter("constantDiscriminatorNode")).indexOf(discriminatorNode);
|
|
303
514
|
const suffix = index <= 0 ? "" : `_${index + 1}`;
|
|
304
|
-
const name =
|
|
305
|
-
const typeManifest =
|
|
515
|
+
const name = nodes.camelCase(`${prefix}_discriminator${suffix}`);
|
|
516
|
+
const typeManifest = visitorsCore.visit(discriminatorNode.constant.type, typeManifestVisitor);
|
|
306
517
|
const value = renderValueNode(discriminatorNode.constant.value, getImportFrom);
|
|
307
518
|
return getConstant(name, typeManifest, value);
|
|
308
519
|
}
|
|
309
520
|
function getFieldDiscriminatorConstant(discriminatorNode, scope) {
|
|
310
521
|
const { fields, prefix, getImportFrom, typeManifestVisitor } = scope;
|
|
311
522
|
const field = fields.find((f) => f.name === discriminatorNode.name);
|
|
312
|
-
if (!field || !field.defaultValue || !
|
|
523
|
+
if (!field || !field.defaultValue || !nodes.isNode(field.defaultValue, nodes.VALUE_NODES)) {
|
|
313
524
|
return null;
|
|
314
525
|
}
|
|
315
|
-
const name =
|
|
316
|
-
const typeManifest =
|
|
526
|
+
const name = nodes.camelCase(`${prefix}_${discriminatorNode.name}`);
|
|
527
|
+
const typeManifest = visitorsCore.visit(field.type, typeManifestVisitor);
|
|
317
528
|
const value = renderValueNode(field.defaultValue, getImportFrom);
|
|
318
529
|
return getConstant(name, typeManifest, value);
|
|
319
530
|
}
|
|
320
531
|
function getConstant(name, typeManifest, value) {
|
|
321
532
|
const type = { imports: typeManifest.imports, render: typeManifest.type };
|
|
322
|
-
return mergeFragments([type, value], ([t, v]) => `pub const ${
|
|
533
|
+
return mergeFragments([type, value], ([t, v]) => `pub const ${nodes.snakeCase(name).toUpperCase()}: ${t} = ${v};`);
|
|
323
534
|
}
|
|
324
|
-
|
|
325
|
-
// src/utils/linkOverrides.ts
|
|
326
|
-
var import_errors = require("@codama/errors");
|
|
327
535
|
function getImportFromFactory(overrides) {
|
|
328
536
|
const linkOverrides = {
|
|
329
537
|
accounts: overrides.accounts ?? {},
|
|
@@ -349,7 +557,7 @@ function getImportFromFactory(overrides) {
|
|
|
349
557
|
case "resolverValueNode":
|
|
350
558
|
return linkOverrides.resolvers[node.name] ?? "hooked";
|
|
351
559
|
default:
|
|
352
|
-
throw new
|
|
560
|
+
throw new errors.CodamaError(errors.CODAMA_ERROR__UNEXPECTED_NODE_KIND, {
|
|
353
561
|
expectedKinds: [
|
|
354
562
|
"AccountLinkNode",
|
|
355
563
|
"DefinedTypeLinkNode",
|
|
@@ -364,12 +572,6 @@ function getImportFromFactory(overrides) {
|
|
|
364
572
|
}
|
|
365
573
|
};
|
|
366
574
|
}
|
|
367
|
-
|
|
368
|
-
// src/utils/render.ts
|
|
369
|
-
var import_node_path = require("path");
|
|
370
|
-
var import_node_url = require("url");
|
|
371
|
-
var import_nodes3 = require("@codama/nodes");
|
|
372
|
-
var import_nunjucks = __toESM(require("nunjucks"));
|
|
373
575
|
function rustDocblock(docs) {
|
|
374
576
|
if (docs.length <= 0) return "";
|
|
375
577
|
const lines = docs.map((doc) => `/// ${doc}`);
|
|
@@ -377,14 +579,14 @@ function rustDocblock(docs) {
|
|
|
377
579
|
`;
|
|
378
580
|
}
|
|
379
581
|
var render = (template, context, options) => {
|
|
380
|
-
const dirname =
|
|
381
|
-
const templates =
|
|
382
|
-
const env =
|
|
383
|
-
env.addFilter("pascalCase",
|
|
384
|
-
env.addFilter("camelCase",
|
|
385
|
-
env.addFilter("snakeCase",
|
|
386
|
-
env.addFilter("kebabCase",
|
|
387
|
-
env.addFilter("titleCase",
|
|
582
|
+
const dirname = __dirname;
|
|
583
|
+
const templates = path.join(dirname, "templates");
|
|
584
|
+
const env = nunjucks__default.default.configure(templates, { autoescape: false, trimBlocks: true, ...options });
|
|
585
|
+
env.addFilter("pascalCase", nodes.pascalCase);
|
|
586
|
+
env.addFilter("camelCase", nodes.camelCase);
|
|
587
|
+
env.addFilter("snakeCase", nodes.snakeCase);
|
|
588
|
+
env.addFilter("kebabCase", nodes.kebabCase);
|
|
589
|
+
env.addFilter("titleCase", nodes.titleCase);
|
|
388
590
|
env.addFilter("rustDocblock", rustDocblock);
|
|
389
591
|
env.addFilter("hasTrait", (traits, ...traitNames) => {
|
|
390
592
|
if (typeof traits !== "string") return false;
|
|
@@ -392,9 +594,6 @@ var render = (template, context, options) => {
|
|
|
392
594
|
});
|
|
393
595
|
return env.render(template, context);
|
|
394
596
|
};
|
|
395
|
-
|
|
396
|
-
// src/utils/traitOptions.ts
|
|
397
|
-
var import_nodes4 = require("@codama/nodes");
|
|
398
597
|
var DEFAULT_TRAIT_OPTIONS = {
|
|
399
598
|
baseDefaults: [
|
|
400
599
|
"borsh::BorshSerialize",
|
|
@@ -417,14 +616,14 @@ function getTraitsFromNodeFactory(options = {}) {
|
|
|
417
616
|
return (node) => getTraitsFromNode(node, options);
|
|
418
617
|
}
|
|
419
618
|
function getTraitsFromNode(node, userOptions = {}) {
|
|
420
|
-
|
|
619
|
+
nodes.assertIsNode(node, ["accountNode", "definedTypeNode", "instructionNode"]);
|
|
421
620
|
const options = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };
|
|
422
621
|
const nodeType = getNodeType(node);
|
|
423
622
|
if (nodeType === "alias") {
|
|
424
623
|
return { imports: new ImportMap(), render: "" };
|
|
425
624
|
}
|
|
426
625
|
const sanitizedOverrides = Object.fromEntries(
|
|
427
|
-
Object.entries(options.overrides).map(([key, value]) => [
|
|
626
|
+
Object.entries(options.overrides).map(([key, value]) => [nodes.camelCase(key), value])
|
|
428
627
|
);
|
|
429
628
|
const nodeOverrides = sanitizedOverrides[node.name];
|
|
430
629
|
const allTraits = nodeOverrides === void 0 ? getDefaultTraits(nodeType, options) : nodeOverrides;
|
|
@@ -446,10 +645,10 @@ function getTraitsFromNode(node, userOptions = {}) {
|
|
|
446
645
|
return { imports, render: traitLines.join("") };
|
|
447
646
|
}
|
|
448
647
|
function getNodeType(node) {
|
|
449
|
-
if (
|
|
450
|
-
if (
|
|
451
|
-
if (
|
|
452
|
-
return
|
|
648
|
+
if (nodes.isNode(node, ["accountNode", "instructionNode"])) return "struct";
|
|
649
|
+
if (nodes.isNode(node.type, "structTypeNode")) return "struct";
|
|
650
|
+
if (nodes.isNode(node.type, "enumTypeNode")) {
|
|
651
|
+
return nodes.isScalarEnum(node.type) ? "scalarEnum" : "dataEnum";
|
|
453
652
|
}
|
|
454
653
|
return "alias";
|
|
455
654
|
}
|
|
@@ -495,14 +694,14 @@ function extractFullyQualifiedNames(traits, imports) {
|
|
|
495
694
|
});
|
|
496
695
|
}
|
|
497
696
|
function getSerdeFieldAttribute(serdeWith, node, userOptions = {}) {
|
|
498
|
-
|
|
697
|
+
nodes.assertIsNode(node, ["accountNode", "definedTypeNode", "instructionNode"]);
|
|
499
698
|
const options = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };
|
|
500
699
|
const nodeType = getNodeType(node);
|
|
501
700
|
if (nodeType === "alias") {
|
|
502
701
|
return "";
|
|
503
702
|
}
|
|
504
703
|
const sanitizedOverrides = Object.fromEntries(
|
|
505
|
-
Object.entries(options.overrides).map(([key, value]) => [
|
|
704
|
+
Object.entries(options.overrides).map(([key, value]) => [nodes.camelCase(key), value])
|
|
506
705
|
);
|
|
507
706
|
const nodeOverrides = sanitizedOverrides[node.name];
|
|
508
707
|
const allTraits = nodeOverrides === void 0 ? getDefaultTraits(nodeType, options) : nodeOverrides;
|
|
@@ -539,20 +738,20 @@ function getTypeManifestVisitor(options) {
|
|
|
539
738
|
let inlineStruct = false;
|
|
540
739
|
let parentSize = null;
|
|
541
740
|
let parentNode = null;
|
|
542
|
-
return
|
|
543
|
-
|
|
741
|
+
return visitorsCore.pipe(
|
|
742
|
+
visitorsCore.mergeVisitor(
|
|
544
743
|
() => ({ imports: new ImportMap(), nestedStructs: [], type: "" }),
|
|
545
744
|
(_, values) => ({
|
|
546
745
|
...mergeManifests(values),
|
|
547
746
|
type: values.map((v) => v.type).join("\n")
|
|
548
747
|
}),
|
|
549
|
-
{ keys: [...
|
|
748
|
+
{ keys: [...nodes.REGISTERED_TYPE_NODE_KINDS, "definedTypeLinkNode", "definedTypeNode", "accountNode"] }
|
|
550
749
|
),
|
|
551
|
-
(v) =>
|
|
750
|
+
(v) => visitorsCore.extendVisitor(v, {
|
|
552
751
|
visitAccount(account, { self }) {
|
|
553
|
-
parentName =
|
|
752
|
+
parentName = nodes.pascalCase(account.name);
|
|
554
753
|
parentNode = account;
|
|
555
|
-
const manifest =
|
|
754
|
+
const manifest = visitorsCore.visit(account.data, self);
|
|
556
755
|
const traits = getTraitsFromNode2(account);
|
|
557
756
|
manifest.imports.mergeWith(traits.imports);
|
|
558
757
|
parentName = null;
|
|
@@ -563,21 +762,21 @@ function getTypeManifestVisitor(options) {
|
|
|
563
762
|
};
|
|
564
763
|
},
|
|
565
764
|
visitArrayType(arrayType, { self }) {
|
|
566
|
-
const childManifest =
|
|
567
|
-
if (
|
|
765
|
+
const childManifest = visitorsCore.visit(arrayType.item, self);
|
|
766
|
+
if (nodes.isNode(arrayType.count, "fixedCountNode")) {
|
|
568
767
|
return {
|
|
569
768
|
...childManifest,
|
|
570
769
|
type: `[${childManifest.type}; ${arrayType.count.value}]`
|
|
571
770
|
};
|
|
572
771
|
}
|
|
573
|
-
if (
|
|
772
|
+
if (nodes.isNode(arrayType.count, "remainderCountNode")) {
|
|
574
773
|
childManifest.imports.add("kaigan::types::RemainderVec");
|
|
575
774
|
return {
|
|
576
775
|
...childManifest,
|
|
577
776
|
type: `RemainderVec<${childManifest.type}>`
|
|
578
777
|
};
|
|
579
778
|
}
|
|
580
|
-
const prefix =
|
|
779
|
+
const prefix = nodes.resolveNestedTypeNode(arrayType.count.prefix);
|
|
581
780
|
if (prefix.endian === "le") {
|
|
582
781
|
switch (prefix.format) {
|
|
583
782
|
case "u32":
|
|
@@ -609,7 +808,7 @@ function getTypeManifestVisitor(options) {
|
|
|
609
808
|
throw new Error("Array size not supported by Borsh");
|
|
610
809
|
},
|
|
611
810
|
visitBooleanType(booleanType) {
|
|
612
|
-
const resolvedSize =
|
|
811
|
+
const resolvedSize = nodes.resolveNestedTypeNode(booleanType.size);
|
|
613
812
|
if (resolvedSize.format === "u8" && resolvedSize.endian === "le") {
|
|
614
813
|
return {
|
|
615
814
|
imports: new ImportMap(),
|
|
@@ -620,28 +819,28 @@ function getTypeManifestVisitor(options) {
|
|
|
620
819
|
throw new Error("Bool size not supported by Borsh");
|
|
621
820
|
},
|
|
622
821
|
visitBytesType(_bytesType, { self }) {
|
|
623
|
-
let arraySize =
|
|
822
|
+
let arraySize = nodes.remainderCountNode();
|
|
624
823
|
if (typeof parentSize === "number") {
|
|
625
|
-
arraySize =
|
|
824
|
+
arraySize = nodes.fixedCountNode(parentSize);
|
|
626
825
|
} else if (parentSize && typeof parentSize === "object") {
|
|
627
|
-
arraySize =
|
|
826
|
+
arraySize = nodes.prefixedCountNode(parentSize);
|
|
628
827
|
}
|
|
629
|
-
const arrayType =
|
|
630
|
-
return
|
|
828
|
+
const arrayType = nodes.arrayTypeNode(nodes.numberTypeNode("u8"), arraySize);
|
|
829
|
+
return visitorsCore.visit(arrayType, self);
|
|
631
830
|
},
|
|
632
831
|
visitDefinedType(definedType, { self }) {
|
|
633
|
-
parentName =
|
|
832
|
+
parentName = nodes.pascalCase(definedType.name);
|
|
634
833
|
parentNode = definedType;
|
|
635
|
-
const manifest =
|
|
834
|
+
const manifest = visitorsCore.visit(definedType.type, self);
|
|
636
835
|
const traits = getTraitsFromNode2(definedType);
|
|
637
836
|
manifest.imports.mergeWith(traits.imports);
|
|
638
837
|
parentName = null;
|
|
639
838
|
parentNode = null;
|
|
640
|
-
const renderedType =
|
|
839
|
+
const renderedType = nodes.isNode(definedType.type, ["enumTypeNode", "structTypeNode"]) ? manifest.type : `pub type ${nodes.pascalCase(definedType.name)} = ${manifest.type};`;
|
|
641
840
|
return { ...manifest, type: `${traits.render}${renderedType}` };
|
|
642
841
|
},
|
|
643
842
|
visitDefinedTypeLink(node) {
|
|
644
|
-
const pascalCaseDefinedType =
|
|
843
|
+
const pascalCaseDefinedType = nodes.pascalCase(node.name);
|
|
645
844
|
const importFrom = getImportFrom(node);
|
|
646
845
|
return {
|
|
647
846
|
imports: new ImportMap().add(`${importFrom}::${pascalCaseDefinedType}`),
|
|
@@ -650,7 +849,7 @@ function getTypeManifestVisitor(options) {
|
|
|
650
849
|
};
|
|
651
850
|
},
|
|
652
851
|
visitEnumEmptyVariantType(enumEmptyVariantType) {
|
|
653
|
-
const name =
|
|
852
|
+
const name = nodes.pascalCase(enumEmptyVariantType.name);
|
|
654
853
|
return {
|
|
655
854
|
imports: new ImportMap(),
|
|
656
855
|
nestedStructs: [],
|
|
@@ -658,14 +857,14 @@ function getTypeManifestVisitor(options) {
|
|
|
658
857
|
};
|
|
659
858
|
},
|
|
660
859
|
visitEnumStructVariantType(enumStructVariantType, { self }) {
|
|
661
|
-
const name =
|
|
860
|
+
const name = nodes.pascalCase(enumStructVariantType.name);
|
|
662
861
|
const originalParentName = parentName;
|
|
663
862
|
if (!originalParentName) {
|
|
664
863
|
throw new Error("Enum struct variant type must have a parent name.");
|
|
665
864
|
}
|
|
666
865
|
inlineStruct = true;
|
|
667
|
-
parentName =
|
|
668
|
-
const typeManifest =
|
|
866
|
+
parentName = nodes.pascalCase(originalParentName) + name;
|
|
867
|
+
const typeManifest = visitorsCore.visit(enumStructVariantType.struct, self);
|
|
669
868
|
inlineStruct = false;
|
|
670
869
|
parentName = originalParentName;
|
|
671
870
|
return {
|
|
@@ -674,13 +873,13 @@ function getTypeManifestVisitor(options) {
|
|
|
674
873
|
};
|
|
675
874
|
},
|
|
676
875
|
visitEnumTupleVariantType(enumTupleVariantType, { self }) {
|
|
677
|
-
const name =
|
|
876
|
+
const name = nodes.pascalCase(enumTupleVariantType.name);
|
|
678
877
|
const originalParentName = parentName;
|
|
679
878
|
if (!originalParentName) {
|
|
680
879
|
throw new Error("Enum struct variant type must have a parent name.");
|
|
681
880
|
}
|
|
682
|
-
parentName =
|
|
683
|
-
const childManifest =
|
|
881
|
+
parentName = nodes.pascalCase(originalParentName) + name;
|
|
882
|
+
const childManifest = visitorsCore.visit(enumTupleVariantType.tuple, self);
|
|
684
883
|
parentName = originalParentName;
|
|
685
884
|
let derive = "";
|
|
686
885
|
if (parentNode && childManifest.type === "(Pubkey)") {
|
|
@@ -706,25 +905,25 @@ function getTypeManifestVisitor(options) {
|
|
|
706
905
|
if (!originalParentName) {
|
|
707
906
|
throw new Error("Enum type must have a parent name.");
|
|
708
907
|
}
|
|
709
|
-
const variants = enumType.variants.map((variant) =>
|
|
908
|
+
const variants = enumType.variants.map((variant) => visitorsCore.visit(variant, self));
|
|
710
909
|
const variantNames = variants.map((variant) => variant.type).join("\n");
|
|
711
910
|
const mergedManifest = mergeManifests(variants);
|
|
712
911
|
return {
|
|
713
912
|
...mergedManifest,
|
|
714
|
-
type: `pub enum ${
|
|
913
|
+
type: `pub enum ${nodes.pascalCase(originalParentName)} {
|
|
715
914
|
${variantNames}
|
|
716
915
|
}`
|
|
717
916
|
};
|
|
718
917
|
},
|
|
719
918
|
visitFixedSizeType(fixedSizeType, { self }) {
|
|
720
919
|
parentSize = fixedSizeType.size;
|
|
721
|
-
const manifest =
|
|
920
|
+
const manifest = visitorsCore.visit(fixedSizeType.type, self);
|
|
722
921
|
parentSize = null;
|
|
723
922
|
return manifest;
|
|
724
923
|
},
|
|
725
924
|
visitMapType(mapType, { self }) {
|
|
726
|
-
const key =
|
|
727
|
-
const value =
|
|
925
|
+
const key = visitorsCore.visit(mapType.key, self);
|
|
926
|
+
const value = visitorsCore.visit(mapType.value, self);
|
|
728
927
|
const mergedManifest = mergeManifests([key, value]);
|
|
729
928
|
mergedManifest.imports.add("std::collections::HashMap");
|
|
730
929
|
return {
|
|
@@ -750,8 +949,8 @@ ${variantNames}
|
|
|
750
949
|
};
|
|
751
950
|
},
|
|
752
951
|
visitOptionType(optionType, { self }) {
|
|
753
|
-
const childManifest =
|
|
754
|
-
const optionPrefix =
|
|
952
|
+
const childManifest = visitorsCore.visit(optionType.item, self);
|
|
953
|
+
const optionPrefix = nodes.resolveNestedTypeNode(optionType.prefix);
|
|
755
954
|
if (optionPrefix.format === "u8" && optionPrefix.endian === "le") {
|
|
756
955
|
return {
|
|
757
956
|
...childManifest,
|
|
@@ -768,10 +967,10 @@ ${variantNames}
|
|
|
768
967
|
};
|
|
769
968
|
},
|
|
770
969
|
visitRemainderOptionType(node) {
|
|
771
|
-
throw new
|
|
970
|
+
throw new errors.CodamaError(errors.CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });
|
|
772
971
|
},
|
|
773
972
|
visitSetType(setType, { self }) {
|
|
774
|
-
const childManifest =
|
|
973
|
+
const childManifest = visitorsCore.visit(setType.item, self);
|
|
775
974
|
childManifest.imports.add("std::collections::HashSet");
|
|
776
975
|
return {
|
|
777
976
|
...childManifest,
|
|
@@ -779,8 +978,8 @@ ${variantNames}
|
|
|
779
978
|
};
|
|
780
979
|
},
|
|
781
980
|
visitSizePrefixType(sizePrefixType, { self }) {
|
|
782
|
-
parentSize =
|
|
783
|
-
const manifest =
|
|
981
|
+
parentSize = nodes.resolveNestedTypeNode(sizePrefixType.prefix);
|
|
982
|
+
const manifest = visitorsCore.visit(sizePrefixType.type, self);
|
|
784
983
|
parentSize = null;
|
|
785
984
|
return manifest;
|
|
786
985
|
},
|
|
@@ -799,7 +998,7 @@ ${variantNames}
|
|
|
799
998
|
type: `[u8; ${parentSize}]`
|
|
800
999
|
};
|
|
801
1000
|
}
|
|
802
|
-
if (
|
|
1001
|
+
if (nodes.isNode(parentSize, "numberTypeNode") && parentSize.endian === "le") {
|
|
803
1002
|
switch (parentSize.format) {
|
|
804
1003
|
case "u32":
|
|
805
1004
|
return {
|
|
@@ -830,16 +1029,16 @@ ${variantNames}
|
|
|
830
1029
|
if (!originalParentName) {
|
|
831
1030
|
throw new Error("Struct field type must have a parent name.");
|
|
832
1031
|
}
|
|
833
|
-
parentName =
|
|
1032
|
+
parentName = nodes.pascalCase(originalParentName) + nodes.pascalCase(structFieldType.name);
|
|
834
1033
|
nestedStruct = true;
|
|
835
1034
|
inlineStruct = false;
|
|
836
|
-
const fieldManifest =
|
|
1035
|
+
const fieldManifest = visitorsCore.visit(structFieldType.type, self);
|
|
837
1036
|
parentName = originalParentName;
|
|
838
1037
|
inlineStruct = originalInlineStruct;
|
|
839
1038
|
nestedStruct = originalNestedStruct;
|
|
840
|
-
const fieldName =
|
|
841
|
-
const docblock = rustDocblock(
|
|
842
|
-
const resolvedNestedType =
|
|
1039
|
+
const fieldName = nodes.snakeCase(structFieldType.name);
|
|
1040
|
+
const docblock = rustDocblock(nodes.parseDocs(structFieldType.docs));
|
|
1041
|
+
const resolvedNestedType = nodes.resolveNestedTypeNode(structFieldType.type);
|
|
843
1042
|
let derive = "";
|
|
844
1043
|
if (parentNode) {
|
|
845
1044
|
if (fieldManifest.type === "Pubkey") {
|
|
@@ -854,9 +1053,9 @@ ${variantNames}
|
|
|
854
1053
|
parentNode,
|
|
855
1054
|
traitOptions
|
|
856
1055
|
);
|
|
857
|
-
} else if (
|
|
1056
|
+
} else if (nodes.isNode(resolvedNestedType, "arrayTypeNode") && nodes.isNode(resolvedNestedType.count, "fixedCountNode") && resolvedNestedType.count.value > 32) {
|
|
858
1057
|
derive = getSerdeFieldAttribute("serde_big_array::BigArray", parentNode, traitOptions);
|
|
859
|
-
} else if (
|
|
1058
|
+
} else if (nodes.isNode(resolvedNestedType, ["bytesTypeNode", "stringTypeNode"]) && nodes.isNode(structFieldType.type, "fixedSizeTypeNode") && structFieldType.type.size > 32) {
|
|
860
1059
|
derive = getSerdeFieldAttribute(
|
|
861
1060
|
"serde_with::As::<serde_with::Bytes>",
|
|
862
1061
|
parentNode,
|
|
@@ -874,23 +1073,23 @@ ${variantNames}
|
|
|
874
1073
|
if (!originalParentName) {
|
|
875
1074
|
throw new Error("Struct type must have a parent name.");
|
|
876
1075
|
}
|
|
877
|
-
const fields = structType.fields.map((field) =>
|
|
1076
|
+
const fields = structType.fields.map((field) => visitorsCore.visit(field, self));
|
|
878
1077
|
const fieldTypes = fields.map((field) => field.type).join("\n");
|
|
879
1078
|
const mergedManifest = mergeManifests(fields);
|
|
880
1079
|
if (nestedStruct) {
|
|
881
1080
|
const nestedTraits = getTraitsFromNode2(
|
|
882
|
-
|
|
1081
|
+
nodes.definedTypeNode({ name: originalParentName, type: structType })
|
|
883
1082
|
);
|
|
884
1083
|
mergedManifest.imports.mergeWith(nestedTraits.imports);
|
|
885
1084
|
return {
|
|
886
1085
|
...mergedManifest,
|
|
887
1086
|
nestedStructs: [
|
|
888
1087
|
...mergedManifest.nestedStructs,
|
|
889
|
-
`${nestedTraits.render}pub struct ${
|
|
1088
|
+
`${nestedTraits.render}pub struct ${nodes.pascalCase(originalParentName)} {
|
|
890
1089
|
${fieldTypes}
|
|
891
1090
|
}`
|
|
892
1091
|
],
|
|
893
|
-
type:
|
|
1092
|
+
type: nodes.pascalCase(originalParentName)
|
|
894
1093
|
};
|
|
895
1094
|
}
|
|
896
1095
|
if (inlineStruct) {
|
|
@@ -900,13 +1099,13 @@ ${fieldTypes}
|
|
|
900
1099
|
}
|
|
901
1100
|
return {
|
|
902
1101
|
...mergedManifest,
|
|
903
|
-
type: `pub struct ${
|
|
1102
|
+
type: `pub struct ${nodes.pascalCase(originalParentName)} {
|
|
904
1103
|
${fieldTypes}
|
|
905
1104
|
}`
|
|
906
1105
|
};
|
|
907
1106
|
},
|
|
908
1107
|
visitTupleType(tupleType, { self }) {
|
|
909
|
-
const items = tupleType.items.map((item) =>
|
|
1108
|
+
const items = tupleType.items.map((item) => visitorsCore.visit(item, self));
|
|
910
1109
|
const mergedManifest = mergeManifests(items);
|
|
911
1110
|
return {
|
|
912
1111
|
...mergedManifest,
|
|
@@ -914,7 +1113,7 @@ ${fieldTypes}
|
|
|
914
1113
|
};
|
|
915
1114
|
},
|
|
916
1115
|
visitZeroableOptionType(node) {
|
|
917
|
-
throw new
|
|
1116
|
+
throw new errors.CodamaError(errors.CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });
|
|
918
1117
|
}
|
|
919
1118
|
})
|
|
920
1119
|
);
|
|
@@ -928,8 +1127,8 @@ function mergeManifests(manifests) {
|
|
|
928
1127
|
|
|
929
1128
|
// src/getRenderMapVisitor.ts
|
|
930
1129
|
function getRenderMapVisitor(options = {}) {
|
|
931
|
-
const linkables = new
|
|
932
|
-
const stack = new
|
|
1130
|
+
const linkables = new visitorsCore.LinkableDictionary();
|
|
1131
|
+
const stack = new visitorsCore.NodeStack();
|
|
933
1132
|
let program = null;
|
|
934
1133
|
const renderParentInstructions = options.renderParentInstructions ?? false;
|
|
935
1134
|
const dependencyMap = options.dependencyMap ?? {};
|
|
@@ -941,14 +1140,14 @@ function getRenderMapVisitor(options = {}) {
|
|
|
941
1140
|
traitOptions: options.traitOptions
|
|
942
1141
|
});
|
|
943
1142
|
const anchorTraits = options.anchorTraits ?? true;
|
|
944
|
-
return
|
|
945
|
-
|
|
1143
|
+
return visitorsCore.pipe(
|
|
1144
|
+
visitorsCore.staticVisitor(() => renderersCore.createRenderMap(), {
|
|
946
1145
|
keys: ["rootNode", "programNode", "instructionNode", "accountNode", "definedTypeNode"]
|
|
947
1146
|
}),
|
|
948
|
-
(v) =>
|
|
1147
|
+
(v) => visitorsCore.extendVisitor(v, {
|
|
949
1148
|
visitAccount(node) {
|
|
950
|
-
const typeManifest =
|
|
951
|
-
const fields =
|
|
1149
|
+
const typeManifest = visitorsCore.visit(node, typeManifestVisitor);
|
|
1150
|
+
const fields = nodes.resolveNestedTypeNode(node.data).fields;
|
|
952
1151
|
const discriminatorConstants = getDiscriminatorConstants({
|
|
953
1152
|
discriminatorNodes: node.discriminators ?? [],
|
|
954
1153
|
fields,
|
|
@@ -960,58 +1159,57 @@ function getRenderMapVisitor(options = {}) {
|
|
|
960
1159
|
const pda = node.pda ? linkables.get([...stack.getPath(), node.pda]) : void 0;
|
|
961
1160
|
const pdaSeeds = pda?.seeds ?? [];
|
|
962
1161
|
const seeds = pdaSeeds.map((seed) => {
|
|
963
|
-
if (
|
|
964
|
-
const seedManifest2 =
|
|
1162
|
+
if (nodes.isNode(seed, "variablePdaSeedNode")) {
|
|
1163
|
+
const seedManifest2 = visitorsCore.visit(seed.type, typeManifestVisitor);
|
|
965
1164
|
seedsImports.mergeWith(seedManifest2.imports);
|
|
966
|
-
const resolvedType2 =
|
|
1165
|
+
const resolvedType2 = nodes.resolveNestedTypeNode(seed.type);
|
|
967
1166
|
return { ...seed, resolvedType: resolvedType2, typeManifest: seedManifest2 };
|
|
968
1167
|
}
|
|
969
|
-
if (
|
|
1168
|
+
if (nodes.isNode(seed.value, "programIdValueNode")) {
|
|
970
1169
|
return seed;
|
|
971
1170
|
}
|
|
972
|
-
const seedManifest =
|
|
1171
|
+
const seedManifest = visitorsCore.visit(seed.type, typeManifestVisitor);
|
|
973
1172
|
const valueManifest = renderValueNode(seed.value, getImportFrom, true);
|
|
974
1173
|
seedsImports.mergeWith(valueManifest.imports);
|
|
975
|
-
const resolvedType =
|
|
1174
|
+
const resolvedType = nodes.resolveNestedTypeNode(seed.type);
|
|
976
1175
|
return { ...seed, resolvedType, typeManifest: seedManifest, valueManifest };
|
|
977
1176
|
});
|
|
978
|
-
const hasVariableSeeds = pdaSeeds.filter(
|
|
979
|
-
const constantSeeds = seeds.filter(
|
|
980
|
-
const
|
|
981
|
-
|
|
982
|
-
imports.mergeWith(seedsImports);
|
|
983
|
-
}
|
|
984
|
-
return (0, import_renderers_core.createRenderMap)(`accounts/${(0, import_nodes6.snakeCase)(node.name)}.rs`, {
|
|
1177
|
+
const hasVariableSeeds = pdaSeeds.filter(nodes.isNodeFilter("variablePdaSeedNode")).length > 0;
|
|
1178
|
+
const constantSeeds = seeds.filter(nodes.isNodeFilter("constantPdaSeedNode")).filter((seed) => !nodes.isNode(seed.value, "programIdValueNode"));
|
|
1179
|
+
const imports = typeManifest.imports.mergeWith(...hasVariableSeeds ? [seedsImports] : []).mergeWith(discriminatorConstants.imports).remove(`generatedAccounts::${nodes.pascalCase(node.name)}`);
|
|
1180
|
+
return renderersCore.createRenderMap(`accounts/${nodes.snakeCase(node.name)}.rs`, {
|
|
985
1181
|
content: render("accountsPage.njk", {
|
|
986
1182
|
account: node,
|
|
987
1183
|
anchorTraits,
|
|
988
1184
|
constantSeeds,
|
|
989
1185
|
discriminatorConstants: discriminatorConstants.render,
|
|
990
1186
|
hasVariableSeeds,
|
|
991
|
-
imports: imports.
|
|
1187
|
+
imports: imports.toString(dependencyMap),
|
|
992
1188
|
pda,
|
|
993
1189
|
program,
|
|
994
1190
|
seeds,
|
|
995
1191
|
typeManifest
|
|
996
|
-
})
|
|
1192
|
+
}),
|
|
1193
|
+
imports
|
|
997
1194
|
});
|
|
998
1195
|
},
|
|
999
1196
|
visitDefinedType(node) {
|
|
1000
|
-
const typeManifest =
|
|
1001
|
-
const imports = new ImportMap().mergeWithManifest(typeManifest);
|
|
1002
|
-
return
|
|
1197
|
+
const typeManifest = visitorsCore.visit(node, typeManifestVisitor);
|
|
1198
|
+
const imports = new ImportMap().mergeWithManifest(typeManifest).remove(`generatedTypes::${nodes.pascalCase(node.name)}`);
|
|
1199
|
+
return renderersCore.createRenderMap(`types/${nodes.snakeCase(node.name)}.rs`, {
|
|
1003
1200
|
content: render("definedTypesPage.njk", {
|
|
1004
1201
|
definedType: node,
|
|
1005
|
-
imports: imports.
|
|
1202
|
+
imports: imports.toString(dependencyMap),
|
|
1006
1203
|
typeManifest
|
|
1007
|
-
})
|
|
1204
|
+
}),
|
|
1205
|
+
imports
|
|
1008
1206
|
});
|
|
1009
1207
|
},
|
|
1010
1208
|
visitInstruction(node) {
|
|
1011
1209
|
const imports = new ImportMap();
|
|
1012
1210
|
const accountsAndArgsConflicts = getConflictsForInstructionAccountsAndArgs(node);
|
|
1013
1211
|
if (accountsAndArgsConflicts.length > 0) {
|
|
1014
|
-
|
|
1212
|
+
errors.logWarn(
|
|
1015
1213
|
`[Rust] Accounts and args of instruction [${node.name}] have the following conflicting attributes [${accountsAndArgsConflicts.join(", ")}]. Thus, the conflicting arguments will be suffixed with "_arg". You may want to rename the conflicting attributes.`
|
|
1016
1214
|
);
|
|
1017
1215
|
}
|
|
@@ -1030,12 +1228,12 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1030
1228
|
getImportFrom,
|
|
1031
1229
|
getTraitsFromNode: getTraitsFromNode2,
|
|
1032
1230
|
nestedStruct: true,
|
|
1033
|
-
parentName: `${
|
|
1231
|
+
parentName: `${nodes.pascalCase(node.name)}InstructionData`
|
|
1034
1232
|
});
|
|
1035
|
-
const manifest =
|
|
1233
|
+
const manifest = visitorsCore.visit(argument.type, argumentVisitor);
|
|
1036
1234
|
imports.mergeWith(manifest.imports);
|
|
1037
|
-
const innerOptionType =
|
|
1038
|
-
const hasDefaultValue = !!argument.defaultValue &&
|
|
1235
|
+
const innerOptionType = nodes.isNode(argument.type, "optionTypeNode") ? manifest.type.slice("Option<".length, -1) : null;
|
|
1236
|
+
const hasDefaultValue = !!argument.defaultValue && nodes.isNode(argument.defaultValue, nodes.VALUE_NODES);
|
|
1039
1237
|
let renderValue = null;
|
|
1040
1238
|
if (hasDefaultValue) {
|
|
1041
1239
|
const { imports: argImports, render: value } = renderValueNode(
|
|
@@ -1057,57 +1255,59 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1057
1255
|
value: renderValue
|
|
1058
1256
|
});
|
|
1059
1257
|
});
|
|
1060
|
-
const struct =
|
|
1258
|
+
const struct = nodes.structTypeNodeFromInstructionArgumentNodes(node.arguments);
|
|
1061
1259
|
const structVisitor = getTypeManifestVisitor({
|
|
1062
1260
|
getImportFrom,
|
|
1063
1261
|
getTraitsFromNode: getTraitsFromNode2,
|
|
1064
|
-
parentName: `${
|
|
1262
|
+
parentName: `${nodes.pascalCase(node.name)}InstructionData`
|
|
1065
1263
|
});
|
|
1066
|
-
const typeManifest =
|
|
1264
|
+
const typeManifest = visitorsCore.visit(struct, structVisitor);
|
|
1067
1265
|
const dataTraits = getTraitsFromNode2(node);
|
|
1068
|
-
imports.mergeWith(dataTraits.imports);
|
|
1069
|
-
return
|
|
1266
|
+
imports.mergeWith(dataTraits.imports).mergeWith(discriminatorConstants.imports).remove(`generatedInstructions::${nodes.pascalCase(node.name)}`);
|
|
1267
|
+
return renderersCore.createRenderMap(`instructions/${nodes.snakeCase(node.name)}.rs`, {
|
|
1070
1268
|
content: render("instructionsPage.njk", {
|
|
1071
1269
|
dataTraits: dataTraits.render,
|
|
1072
1270
|
discriminatorConstants: discriminatorConstants.render,
|
|
1073
1271
|
hasArgs,
|
|
1074
1272
|
hasOptional,
|
|
1075
|
-
imports: imports.
|
|
1273
|
+
imports: imports.toString(dependencyMap),
|
|
1076
1274
|
instruction: node,
|
|
1077
1275
|
instructionArgs,
|
|
1078
1276
|
program,
|
|
1079
1277
|
typeManifest
|
|
1080
|
-
})
|
|
1278
|
+
}),
|
|
1279
|
+
imports
|
|
1081
1280
|
});
|
|
1082
1281
|
},
|
|
1083
1282
|
visitProgram(node, { self }) {
|
|
1084
1283
|
program = node;
|
|
1085
|
-
let renders =
|
|
1086
|
-
...node.accounts.map((account) =>
|
|
1087
|
-
...node.definedTypes.map((type) =>
|
|
1088
|
-
...
|
|
1284
|
+
let renders = renderersCore.mergeRenderMaps([
|
|
1285
|
+
...node.accounts.map((account) => visitorsCore.visit(account, self)),
|
|
1286
|
+
...node.definedTypes.map((type) => visitorsCore.visit(type, self)),
|
|
1287
|
+
...nodes.getAllInstructionsWithSubs(node, {
|
|
1089
1288
|
leavesOnly: !renderParentInstructions
|
|
1090
|
-
}).map((ix) =>
|
|
1289
|
+
}).map((ix) => visitorsCore.visit(ix, self))
|
|
1091
1290
|
]);
|
|
1092
1291
|
if (node.errors.length > 0) {
|
|
1093
|
-
renders =
|
|
1292
|
+
renders = renderersCore.addToRenderMap(renders, `errors/${nodes.snakeCase(node.name)}.rs`, {
|
|
1094
1293
|
content: render("errorsPage.njk", {
|
|
1095
1294
|
errors: node.errors,
|
|
1096
1295
|
imports: new ImportMap().toString(dependencyMap),
|
|
1097
1296
|
program: node
|
|
1098
|
-
})
|
|
1297
|
+
}),
|
|
1298
|
+
imports: new ImportMap()
|
|
1099
1299
|
});
|
|
1100
1300
|
}
|
|
1101
1301
|
program = null;
|
|
1102
1302
|
return renders;
|
|
1103
1303
|
},
|
|
1104
1304
|
visitRoot(node, { self }) {
|
|
1105
|
-
const programsToExport =
|
|
1106
|
-
const accountsToExport =
|
|
1107
|
-
const instructionsToExport =
|
|
1305
|
+
const programsToExport = nodes.getAllPrograms(node);
|
|
1306
|
+
const accountsToExport = nodes.getAllAccounts(node);
|
|
1307
|
+
const instructionsToExport = nodes.getAllInstructionsWithSubs(node, {
|
|
1108
1308
|
leavesOnly: !renderParentInstructions
|
|
1109
1309
|
});
|
|
1110
|
-
const definedTypesToExport =
|
|
1310
|
+
const definedTypesToExport = nodes.getAllDefinedTypes(node);
|
|
1111
1311
|
const hasAnythingToExport = programsToExport.length > 0 || accountsToExport.length > 0 || instructionsToExport.length > 0 || definedTypesToExport.length > 0;
|
|
1112
1312
|
const ctx = {
|
|
1113
1313
|
accountsToExport,
|
|
@@ -1117,22 +1317,22 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1117
1317
|
programsToExport,
|
|
1118
1318
|
root: node
|
|
1119
1319
|
};
|
|
1120
|
-
return
|
|
1121
|
-
|
|
1122
|
-
["accounts/mod.rs"]: accountsToExport.length > 0 ? { content: render("accountsMod.njk", ctx) } : void 0,
|
|
1123
|
-
["errors/mod.rs"]: programsToExport.length > 0 ? { content: render("errorsMod.njk", ctx) } : void 0,
|
|
1124
|
-
["instructions/mod.rs"]: instructionsToExport.length > 0 ? { content: render("instructionsMod.njk", ctx) } : void 0,
|
|
1125
|
-
["mod.rs"]: { content: render("rootMod.njk", ctx) },
|
|
1126
|
-
["programs.rs"]: programsToExport.length > 0 ? { content: render("programsMod.njk", ctx) } : void 0,
|
|
1127
|
-
["shared.rs"]: accountsToExport.length > 0 ? { content: render("sharedPage.njk", ctx) } : void 0,
|
|
1128
|
-
["types/mod.rs"]: definedTypesToExport.length > 0 ? { content: render("definedTypesMod.njk", ctx) } : void 0
|
|
1320
|
+
return renderersCore.mergeRenderMaps([
|
|
1321
|
+
renderersCore.createRenderMap({
|
|
1322
|
+
["accounts/mod.rs"]: accountsToExport.length > 0 ? { content: render("accountsMod.njk", ctx), imports: new ImportMap() } : void 0,
|
|
1323
|
+
["errors/mod.rs"]: programsToExport.length > 0 ? { content: render("errorsMod.njk", ctx), imports: new ImportMap() } : void 0,
|
|
1324
|
+
["instructions/mod.rs"]: instructionsToExport.length > 0 ? { content: render("instructionsMod.njk", ctx), imports: new ImportMap() } : void 0,
|
|
1325
|
+
["mod.rs"]: { content: render("rootMod.njk", ctx), imports: new ImportMap() },
|
|
1326
|
+
["programs.rs"]: programsToExport.length > 0 ? { content: render("programsMod.njk", ctx), imports: new ImportMap() } : void 0,
|
|
1327
|
+
["shared.rs"]: accountsToExport.length > 0 ? { content: render("sharedPage.njk", ctx), imports: new ImportMap() } : void 0,
|
|
1328
|
+
["types/mod.rs"]: definedTypesToExport.length > 0 ? { content: render("definedTypesMod.njk", ctx), imports: new ImportMap() } : void 0
|
|
1129
1329
|
}),
|
|
1130
|
-
...
|
|
1330
|
+
...nodes.getAllPrograms(node).map((p) => visitorsCore.visit(p, self))
|
|
1131
1331
|
]);
|
|
1132
1332
|
}
|
|
1133
1333
|
}),
|
|
1134
|
-
(v) =>
|
|
1135
|
-
(v) =>
|
|
1334
|
+
(v) => visitorsCore.recordNodeStackVisitor(v, stack),
|
|
1335
|
+
(v) => visitorsCore.recordLinkablesOnFirstVisitVisitor(v, linkables)
|
|
1136
1336
|
);
|
|
1137
1337
|
}
|
|
1138
1338
|
function getConflictsForInstructionAccountsAndArgs(instruction) {
|
|
@@ -1143,51 +1343,43 @@ function getConflictsForInstructionAccountsAndArgs(instruction) {
|
|
|
1143
1343
|
const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);
|
|
1144
1344
|
return [...new Set(duplicates)];
|
|
1145
1345
|
}
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
var import_renderers_core2 = require("@codama/renderers-core");
|
|
1150
|
-
var import_visitors_core5 = require("@codama/visitors-core");
|
|
1151
|
-
var import_child_process = require("child_process");
|
|
1152
|
-
function renderVisitor(path, options = {}) {
|
|
1153
|
-
return (0, import_visitors_core5.rootNodeVisitor)((root) => {
|
|
1346
|
+
function renderVisitor(crateFolder, options = {}) {
|
|
1347
|
+
return visitorsCore.rootNodeVisitor((root) => {
|
|
1348
|
+
const generatedFolder = renderersCore.joinPath(crateFolder, options.generatedFolder ?? "src/generated");
|
|
1154
1349
|
if (options.deleteFolderBeforeRendering ?? true) {
|
|
1155
|
-
|
|
1350
|
+
renderersCore.deleteDirectory(generatedFolder);
|
|
1156
1351
|
}
|
|
1157
|
-
|
|
1352
|
+
const renderMap = visitorsCore.visit(root, getRenderMapVisitor(options));
|
|
1353
|
+
renderersCore.writeRenderMap(renderMap, generatedFolder);
|
|
1354
|
+
syncCargoToml(renderMap, crateFolder, options);
|
|
1158
1355
|
if (options.formatCode) {
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
removeFalsy
|
|
1165
|
-
)
|
|
1166
|
-
);
|
|
1167
|
-
} else {
|
|
1168
|
-
(0, import_errors4.logWarn)("No crate folder specified, skipping formatting.");
|
|
1169
|
-
}
|
|
1356
|
+
const removeFalsy = (arg) => Boolean(arg);
|
|
1357
|
+
runFormatter(
|
|
1358
|
+
"cargo",
|
|
1359
|
+
[options.toolchain, "fmt", "--manifest-path", `${crateFolder}/Cargo.toml`].filter(removeFalsy)
|
|
1360
|
+
);
|
|
1170
1361
|
}
|
|
1171
1362
|
});
|
|
1172
1363
|
}
|
|
1173
1364
|
function runFormatter(cmd, args) {
|
|
1174
|
-
const { stdout, stderr, error } =
|
|
1365
|
+
const { stdout, stderr, error } = child_process.spawnSync(cmd, args);
|
|
1175
1366
|
if (error?.message?.includes("ENOENT")) {
|
|
1176
|
-
|
|
1367
|
+
errors.logWarn(`Could not find ${cmd}, skipping formatting.`);
|
|
1177
1368
|
return;
|
|
1178
1369
|
}
|
|
1179
1370
|
if (stdout.length > 0) {
|
|
1180
|
-
|
|
1371
|
+
errors.logWarn(`(cargo-fmt) ${stdout ? stdout?.toString() : error}`);
|
|
1181
1372
|
}
|
|
1182
1373
|
if (stderr.length > 0) {
|
|
1183
|
-
|
|
1374
|
+
errors.logError(`(cargo-fmt) ${stderr ? stderr.toString() : error}`);
|
|
1184
1375
|
}
|
|
1185
1376
|
}
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1377
|
+
|
|
1378
|
+
exports.ImportMap = ImportMap;
|
|
1379
|
+
exports.RUST_CORE_IMPORTS = RUST_CORE_IMPORTS;
|
|
1380
|
+
exports.default = renderVisitor;
|
|
1381
|
+
exports.getRenderMapVisitor = getRenderMapVisitor;
|
|
1382
|
+
exports.getTypeManifestVisitor = getTypeManifestVisitor;
|
|
1383
|
+
exports.renderVisitor = renderVisitor;
|
|
1384
|
+
//# sourceMappingURL=index.node.cjs.map
|
|
1193
1385
|
//# sourceMappingURL=index.node.cjs.map
|