@codama/renderers-rust 1.2.9 → 2.0.1
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 +288 -34
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +290 -37
- package/dist/index.node.mjs.map +1 -1
- package/dist/templates/accountsPage.njk +3 -3
- 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.mjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { CodamaError, CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, logWarn, logError, CODAMA_ERROR__UNEXPECTED_NODE_KIND } from '@codama/errors';
|
|
1
|
+
import { CodamaError, CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, logWarn, logError, CODAMA_ERROR__UNEXPECTED_NODE_KIND, CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS } from '@codama/errors';
|
|
2
2
|
import { REGISTERED_TYPE_NODE_KINDS, definedTypeNode, pascalCase, snakeCase, parseDocs, resolveNestedTypeNode, isNode, remainderCountNode, fixedCountNode, prefixedCountNode, arrayTypeNode, numberTypeNode, getAllPrograms, getAllAccounts, getAllInstructionsWithSubs, getAllDefinedTypes, VALUE_NODES, structTypeNodeFromInstructionArgumentNodes, isNodeFilter, camelCase, kebabCase, titleCase, assertIsNode, bytesValueNode, numberValueNode, arrayValueNode, isScalarEnum } from '@codama/nodes';
|
|
3
|
-
import { createRenderMap, mergeRenderMaps, addToRenderMap, deleteDirectory,
|
|
3
|
+
import { createRenderMap, mergeRenderMaps, addToRenderMap, joinPath, deleteDirectory, writeRenderMap, fileExists, writeFile, readFile } from '@codama/renderers-core';
|
|
4
4
|
import { pipe, mergeVisitor, extendVisitor, visit, LinkableDictionary, NodeStack, staticVisitor, recordNodeStackVisitor, recordLinkablesOnFirstVisitVisitor, rootNodeVisitor } from '@codama/visitors-core';
|
|
5
|
+
import { stringify, parse } from '@iarna/toml';
|
|
6
|
+
import { subset, minVersion, lt } from 'semver';
|
|
5
7
|
import { getBase64Encoder, getBase58Encoder, getBase16Encoder, getUtf8Encoder } from '@solana/codecs-strings';
|
|
6
8
|
import { dirname, join } from 'path';
|
|
7
9
|
import { fileURLToPath } from 'url';
|
|
@@ -9,6 +11,7 @@ import nunjucks from 'nunjucks';
|
|
|
9
11
|
import { spawnSync } from 'child_process';
|
|
10
12
|
|
|
11
13
|
// src/ImportMap.ts
|
|
14
|
+
var RUST_CORE_IMPORTS = /* @__PURE__ */ new Set(["std", "crate", "super", "self", "core", "alloc", "clippy"]);
|
|
12
15
|
var DEFAULT_MODULE_MAP = {
|
|
13
16
|
generated: "crate::generated",
|
|
14
17
|
generatedAccounts: "crate::generated::accounts",
|
|
@@ -68,6 +71,10 @@ var ImportMap = class _ImportMap {
|
|
|
68
71
|
this._aliases.forEach((alias, i) => newImportMap.addAlias(resolveDependency(i), alias));
|
|
69
72
|
return newImportMap;
|
|
70
73
|
}
|
|
74
|
+
getExternalDependencies(dependencyMap) {
|
|
75
|
+
const resolvedMap = this.resolveDependencyMap(dependencyMap);
|
|
76
|
+
return new Set([...resolvedMap._imports].map((i) => i.split("::")[0]).filter((i) => !RUST_CORE_IMPORTS.has(i)));
|
|
77
|
+
}
|
|
71
78
|
toString(dependencies) {
|
|
72
79
|
const resolvedMap = this.resolveDependencyMap(dependencies);
|
|
73
80
|
const importStatements = [...resolvedMap.imports].map((i) => {
|
|
@@ -78,6 +85,254 @@ var ImportMap = class _ImportMap {
|
|
|
78
85
|
return importStatements.join("\n");
|
|
79
86
|
}
|
|
80
87
|
};
|
|
88
|
+
var DEFAULT_DEPENDENCY_VERSIONS = {
|
|
89
|
+
"anchor-lang": { optional: true, version: "~0.31" },
|
|
90
|
+
borsh: "^0.10",
|
|
91
|
+
kaigan: { features: ["serde"], version: "^0.3" },
|
|
92
|
+
"num-derive": "^0.4",
|
|
93
|
+
"num-traits": "^0.2",
|
|
94
|
+
serde: { features: ["derive"], optional: true, version: "^1.0" },
|
|
95
|
+
"serde-big-array": "^0.5",
|
|
96
|
+
serde_with: { optional: true, version: "^3.0" },
|
|
97
|
+
"solana-account": "~2.2",
|
|
98
|
+
"solana-account-info": "~2.3",
|
|
99
|
+
"solana-client": { optional: true, version: "^2.2" },
|
|
100
|
+
"solana-cpi": "~2.2",
|
|
101
|
+
"solana-decode-error": "~2.3",
|
|
102
|
+
"solana-instruction": "~2.3",
|
|
103
|
+
"solana-program-error": "~2.2",
|
|
104
|
+
"solana-pubkey": { features: ["curve25519", "borsh"], version: "~2.3" },
|
|
105
|
+
"solana-sdk": { optional: true, version: "^2.3" },
|
|
106
|
+
thiserror: "^1.0"
|
|
107
|
+
};
|
|
108
|
+
function syncCargoToml(renderMap, crateFolder, options) {
|
|
109
|
+
const shouldSyncCargoToml = options.syncCargoToml ?? false;
|
|
110
|
+
const cargoTomlPath = joinPath(crateFolder, "Cargo.toml");
|
|
111
|
+
const usedDependencies = getUsedDependencyVersions(
|
|
112
|
+
renderMap,
|
|
113
|
+
options.dependencyMap ?? {},
|
|
114
|
+
options.dependencyVersions ?? {}
|
|
115
|
+
);
|
|
116
|
+
if (!shouldSyncCargoToml) {
|
|
117
|
+
if (fileExists(cargoTomlPath)) {
|
|
118
|
+
checkExistingCargoToml(readCargoToml(cargoTomlPath), usedDependencies);
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (fileExists(cargoTomlPath)) {
|
|
123
|
+
const cargoToml = updateExistingCargoToml(readCargoToml(cargoTomlPath), usedDependencies);
|
|
124
|
+
writeFile(cargoTomlPath, stringify(cargoToml) + "\n");
|
|
125
|
+
} else {
|
|
126
|
+
const cargoToml = createNewCargoToml(usedDependencies);
|
|
127
|
+
writeFile(cargoTomlPath, stringify(cargoToml) + "\n");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function createNewCargoToml(usedDependencies) {
|
|
131
|
+
return updateExistingCargoToml(
|
|
132
|
+
{
|
|
133
|
+
name: "rust-client",
|
|
134
|
+
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
135
|
+
description: "",
|
|
136
|
+
version: "1.0.0",
|
|
137
|
+
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
138
|
+
repository: { workspace: true },
|
|
139
|
+
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
140
|
+
edition: { workspace: true },
|
|
141
|
+
license: { workspace: true },
|
|
142
|
+
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
143
|
+
features: {
|
|
144
|
+
anchor: ["dep:anchor-lang"],
|
|
145
|
+
"anchor-idl-build": ["anchor", "anchor-lang?/idl-build"],
|
|
146
|
+
fetch: ["dep:solana-client", "dep:solana-sdk"],
|
|
147
|
+
serde: ["dep:serde", "dep:serde_with"]
|
|
148
|
+
},
|
|
149
|
+
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
150
|
+
dependencies: {}
|
|
151
|
+
},
|
|
152
|
+
usedDependencies
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
function updateExistingCargoToml(cargoToml, usedDependencies) {
|
|
156
|
+
const foundUsedDependencies = /* @__PURE__ */ new Set();
|
|
157
|
+
const updatedCargoToml = updateCargoDependencies(cargoToml, (dependencyGroup) => {
|
|
158
|
+
return Object.fromEntries(
|
|
159
|
+
Object.entries(dependencyGroup).map(([dependencyKey, dependency]) => {
|
|
160
|
+
const foundUsedDependency = findCargoDependencyByImportName(
|
|
161
|
+
usedDependencies,
|
|
162
|
+
getCargoDependencyImportName(dependencyKey)
|
|
163
|
+
);
|
|
164
|
+
if (!foundUsedDependency) {
|
|
165
|
+
return [dependencyKey, dependency];
|
|
166
|
+
}
|
|
167
|
+
const [usedDependencyKey, usedDependency] = foundUsedDependency;
|
|
168
|
+
foundUsedDependencies.add(usedDependencyKey);
|
|
169
|
+
const usedDependencyCrateName = getCargoDependencyCrateName(usedDependencyKey, usedDependency);
|
|
170
|
+
if (!shouldUpdateDependency(usedDependencyCrateName, dependency, usedDependency)) {
|
|
171
|
+
return [dependencyKey, dependency];
|
|
172
|
+
}
|
|
173
|
+
const newVersion = getCargoDependencyVersion(usedDependency);
|
|
174
|
+
return [
|
|
175
|
+
dependencyKey,
|
|
176
|
+
typeof dependency === "string" ? newVersion : { ...dependency, version: newVersion }
|
|
177
|
+
];
|
|
178
|
+
})
|
|
179
|
+
);
|
|
180
|
+
});
|
|
181
|
+
const usedDependenciesToAdd = Object.entries(usedDependencies).filter(
|
|
182
|
+
([usedDependencyKey]) => !foundUsedDependencies.has(usedDependencyKey)
|
|
183
|
+
);
|
|
184
|
+
for (const [usedDependencyKey, usedDependency] of usedDependenciesToAdd) {
|
|
185
|
+
updatedCargoToml.dependencies = updatedCargoToml.dependencies ?? {};
|
|
186
|
+
updatedCargoToml.dependencies[usedDependencyKey] = usedDependency;
|
|
187
|
+
}
|
|
188
|
+
return updatedCargoToml;
|
|
189
|
+
}
|
|
190
|
+
function checkExistingCargoToml(cargoToml, usedDependencies) {
|
|
191
|
+
const missingDependencies = [];
|
|
192
|
+
const dependenciesToUpdate = [];
|
|
193
|
+
const existingDependencies = {
|
|
194
|
+
...cargoToml["build-dependencies"],
|
|
195
|
+
...cargoToml["dev-dependencies"],
|
|
196
|
+
...cargoToml.dependencies,
|
|
197
|
+
...cargoToml.workspace?.dependencies,
|
|
198
|
+
...Object.values(cargoToml.target ?? {}).reduce((acc, target) => {
|
|
199
|
+
return {
|
|
200
|
+
...acc,
|
|
201
|
+
...target["build-dependencies"],
|
|
202
|
+
...target["dev-dependencies"],
|
|
203
|
+
...target.dependencies
|
|
204
|
+
};
|
|
205
|
+
}, {})
|
|
206
|
+
};
|
|
207
|
+
for (const [usedDependencyKey, usedDependency] of Object.entries(usedDependencies)) {
|
|
208
|
+
const foundExistingDependency = findCargoDependencyByImportName(
|
|
209
|
+
existingDependencies,
|
|
210
|
+
getCargoDependencyImportName(usedDependencyKey)
|
|
211
|
+
);
|
|
212
|
+
if (!foundExistingDependency) {
|
|
213
|
+
missingDependencies.push(usedDependencyKey);
|
|
214
|
+
} else if (shouldUpdateDependency(foundExistingDependency[0], foundExistingDependency[1], usedDependency)) {
|
|
215
|
+
dependenciesToUpdate.push(usedDependencyKey);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (missingDependencies.length === 0 && dependenciesToUpdate.length === 0) return;
|
|
219
|
+
const missingList = missingDependencies.map((d) => `- ${d} missing: ${getCargoDependencyVersion(usedDependencies[d])}
|
|
220
|
+
`).join("");
|
|
221
|
+
const outdatedList = dependenciesToUpdate.map(
|
|
222
|
+
(d) => `- ${d} outdated: ${getCargoDependencyVersion(existingDependencies[d])} -> ${getCargoDependencyVersion(usedDependencies[d])}
|
|
223
|
+
`
|
|
224
|
+
).join("");
|
|
225
|
+
logWarn(
|
|
226
|
+
`The following dependencies in your \`Cargo.toml\` are out-of-date or missing:
|
|
227
|
+
${missingList}${outdatedList}`
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
function getUsedDependencyVersions(renderMap, dependencyMap, dependencyVersions) {
|
|
231
|
+
const usedImportNames = getUsedImportNames(renderMap, dependencyMap);
|
|
232
|
+
const dependencyVersionsWithDefaults = {
|
|
233
|
+
...DEFAULT_DEPENDENCY_VERSIONS,
|
|
234
|
+
...dependencyVersions
|
|
235
|
+
};
|
|
236
|
+
const [usedDependencyVersion, missingDependencies] = [...usedImportNames].reduce(
|
|
237
|
+
([acc, missingDependencies2], usedImportName) => {
|
|
238
|
+
const usedDependency = findCargoDependencyByImportName(dependencyVersionsWithDefaults, usedImportName);
|
|
239
|
+
if (usedDependency) {
|
|
240
|
+
acc[usedDependency[0]] = usedDependency[1];
|
|
241
|
+
} else {
|
|
242
|
+
missingDependencies2.add(usedImportName);
|
|
243
|
+
}
|
|
244
|
+
return [acc, missingDependencies2];
|
|
245
|
+
},
|
|
246
|
+
[{}, /* @__PURE__ */ new Set()]
|
|
247
|
+
);
|
|
248
|
+
if (missingDependencies.size > 0) {
|
|
249
|
+
throw new CodamaError(CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS, {
|
|
250
|
+
dependencies: [...missingDependencies],
|
|
251
|
+
message: "Please add these dependencies to the `dependencyVersions` option."
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
return usedDependencyVersion;
|
|
255
|
+
}
|
|
256
|
+
function getUsedImportNames(renderMap, dependencyMap) {
|
|
257
|
+
const fragments = [...renderMap.values()];
|
|
258
|
+
const fromImportMap = new ImportMap().mergeWith(...fragments.map(({ imports }) => imports)).getExternalDependencies(dependencyMap);
|
|
259
|
+
const PATH_REGEX = /\b(?:::)?([a-z_][a-z0-9_]*)(?:::[a-zA-Z0-9_]+)+/g;
|
|
260
|
+
const fromContent = fragments.flatMap(({ content }) => {
|
|
261
|
+
return [...content.matchAll(PATH_REGEX)].map((match) => match[1]).filter((crateName) => !RUST_CORE_IMPORTS.has(crateName));
|
|
262
|
+
});
|
|
263
|
+
return /* @__PURE__ */ new Set([...fromImportMap, ...fromContent]);
|
|
264
|
+
}
|
|
265
|
+
function shouldUpdateDependency(dependency, currentDependency, requiredDependency) {
|
|
266
|
+
const currentRange = getCargoDependencyVersion(currentDependency);
|
|
267
|
+
const requiredRange = getCargoDependencyVersion(requiredDependency);
|
|
268
|
+
return !!currentRange && !!requiredRange && shouldUpdateRange(dependency, currentRange, requiredRange);
|
|
269
|
+
}
|
|
270
|
+
function shouldUpdateRange(dependency, currentRange, requiredRange) {
|
|
271
|
+
currentRange = cargoToNpmSemver(currentRange);
|
|
272
|
+
requiredRange = cargoToNpmSemver(requiredRange);
|
|
273
|
+
try {
|
|
274
|
+
if (subset(currentRange, requiredRange)) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
const minRequiredVersion = minVersion(requiredRange);
|
|
278
|
+
const minCurrentVersion = minVersion(currentRange);
|
|
279
|
+
if (!minCurrentVersion || !minRequiredVersion) {
|
|
280
|
+
throw new Error("Could not determine minimum versions.");
|
|
281
|
+
}
|
|
282
|
+
if (lt(minCurrentVersion, minRequiredVersion)) {
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
return false;
|
|
286
|
+
} catch (error) {
|
|
287
|
+
console.warn(
|
|
288
|
+
`Could not parse the following ranges for dependency "${dependency}": [${currentRange}] and/or [${requiredRange}]. Caused by: ${error.message}`
|
|
289
|
+
);
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function updateCargoDependencies(cargoToml, updateFn) {
|
|
294
|
+
const updatedCargoToml = JSON.parse(JSON.stringify(cargoToml));
|
|
295
|
+
const standardSections = ["dependencies", "dev-dependencies", "build-dependencies"];
|
|
296
|
+
for (const section of standardSections) {
|
|
297
|
+
if (updatedCargoToml[section]) {
|
|
298
|
+
updatedCargoToml[section] = updateFn(updatedCargoToml[section]);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (updatedCargoToml.target) {
|
|
302
|
+
for (const targetKey of Object.keys(updatedCargoToml.target)) {
|
|
303
|
+
for (const section of standardSections) {
|
|
304
|
+
if (updatedCargoToml.target[targetKey][section]) {
|
|
305
|
+
updatedCargoToml.target[targetKey][section] = updateFn(updatedCargoToml.target[targetKey][section]);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (updatedCargoToml.workspace?.dependencies) {
|
|
311
|
+
updatedCargoToml.workspace.dependencies = updateFn(updatedCargoToml.workspace.dependencies);
|
|
312
|
+
}
|
|
313
|
+
return updatedCargoToml;
|
|
314
|
+
}
|
|
315
|
+
function cargoToNpmSemver(cargoVersion) {
|
|
316
|
+
const version = cargoVersion.trim();
|
|
317
|
+
return /^\d+(\.\d+)?(\.\d+)?/.test(version) ? `^${version}` : version;
|
|
318
|
+
}
|
|
319
|
+
function getCargoDependencyVersion(dependency) {
|
|
320
|
+
return typeof dependency === "string" ? dependency : dependency.version;
|
|
321
|
+
}
|
|
322
|
+
function getCargoDependencyCrateName(key, dependency) {
|
|
323
|
+
return typeof dependency !== "string" && dependency.package ? dependency.package : key;
|
|
324
|
+
}
|
|
325
|
+
function getCargoDependencyImportName(key) {
|
|
326
|
+
return key.replace(/-/g, "_");
|
|
327
|
+
}
|
|
328
|
+
function findCargoDependencyByImportName(dependencies, importName) {
|
|
329
|
+
return Object.entries(dependencies).find(([key]) => {
|
|
330
|
+
return getCargoDependencyImportName(key) === importName;
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
function readCargoToml(path) {
|
|
334
|
+
return parse(readFile(path));
|
|
335
|
+
}
|
|
81
336
|
function getBytesFromBytesValueNode(node) {
|
|
82
337
|
switch (node.encoding) {
|
|
83
338
|
case "utf8":
|
|
@@ -913,10 +1168,7 @@ function getRenderMapVisitor(options = {}) {
|
|
|
913
1168
|
});
|
|
914
1169
|
const hasVariableSeeds = pdaSeeds.filter(isNodeFilter("variablePdaSeedNode")).length > 0;
|
|
915
1170
|
const constantSeeds = seeds.filter(isNodeFilter("constantPdaSeedNode")).filter((seed) => !isNode(seed.value, "programIdValueNode"));
|
|
916
|
-
const
|
|
917
|
-
if (hasVariableSeeds) {
|
|
918
|
-
imports.mergeWith(seedsImports);
|
|
919
|
-
}
|
|
1171
|
+
const imports = typeManifest.imports.mergeWith(...hasVariableSeeds ? [seedsImports] : []).mergeWith(discriminatorConstants.imports).remove(`generatedAccounts::${pascalCase(node.name)}`);
|
|
920
1172
|
return createRenderMap(`accounts/${snakeCase(node.name)}.rs`, {
|
|
921
1173
|
content: render("accountsPage.njk", {
|
|
922
1174
|
account: node,
|
|
@@ -924,23 +1176,25 @@ function getRenderMapVisitor(options = {}) {
|
|
|
924
1176
|
constantSeeds,
|
|
925
1177
|
discriminatorConstants: discriminatorConstants.render,
|
|
926
1178
|
hasVariableSeeds,
|
|
927
|
-
imports: imports.
|
|
1179
|
+
imports: imports.toString(dependencyMap),
|
|
928
1180
|
pda,
|
|
929
1181
|
program,
|
|
930
1182
|
seeds,
|
|
931
1183
|
typeManifest
|
|
932
|
-
})
|
|
1184
|
+
}),
|
|
1185
|
+
imports
|
|
933
1186
|
});
|
|
934
1187
|
},
|
|
935
1188
|
visitDefinedType(node) {
|
|
936
1189
|
const typeManifest = visit(node, typeManifestVisitor);
|
|
937
|
-
const imports = new ImportMap().mergeWithManifest(typeManifest);
|
|
1190
|
+
const imports = new ImportMap().mergeWithManifest(typeManifest).remove(`generatedTypes::${pascalCase(node.name)}`);
|
|
938
1191
|
return createRenderMap(`types/${snakeCase(node.name)}.rs`, {
|
|
939
1192
|
content: render("definedTypesPage.njk", {
|
|
940
1193
|
definedType: node,
|
|
941
|
-
imports: imports.
|
|
1194
|
+
imports: imports.toString(dependencyMap),
|
|
942
1195
|
typeManifest
|
|
943
|
-
})
|
|
1196
|
+
}),
|
|
1197
|
+
imports
|
|
944
1198
|
});
|
|
945
1199
|
},
|
|
946
1200
|
visitInstruction(node) {
|
|
@@ -1001,19 +1255,20 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1001
1255
|
});
|
|
1002
1256
|
const typeManifest = visit(struct, structVisitor);
|
|
1003
1257
|
const dataTraits = getTraitsFromNode2(node);
|
|
1004
|
-
imports.mergeWith(dataTraits.imports);
|
|
1258
|
+
imports.mergeWith(dataTraits.imports).mergeWith(discriminatorConstants.imports).remove(`generatedInstructions::${pascalCase(node.name)}`);
|
|
1005
1259
|
return createRenderMap(`instructions/${snakeCase(node.name)}.rs`, {
|
|
1006
1260
|
content: render("instructionsPage.njk", {
|
|
1007
1261
|
dataTraits: dataTraits.render,
|
|
1008
1262
|
discriminatorConstants: discriminatorConstants.render,
|
|
1009
1263
|
hasArgs,
|
|
1010
1264
|
hasOptional,
|
|
1011
|
-
imports: imports.
|
|
1265
|
+
imports: imports.toString(dependencyMap),
|
|
1012
1266
|
instruction: node,
|
|
1013
1267
|
instructionArgs,
|
|
1014
1268
|
program,
|
|
1015
1269
|
typeManifest
|
|
1016
|
-
})
|
|
1270
|
+
}),
|
|
1271
|
+
imports
|
|
1017
1272
|
});
|
|
1018
1273
|
},
|
|
1019
1274
|
visitProgram(node, { self }) {
|
|
@@ -1031,7 +1286,8 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1031
1286
|
errors: node.errors,
|
|
1032
1287
|
imports: new ImportMap().toString(dependencyMap),
|
|
1033
1288
|
program: node
|
|
1034
|
-
})
|
|
1289
|
+
}),
|
|
1290
|
+
imports: new ImportMap()
|
|
1035
1291
|
});
|
|
1036
1292
|
}
|
|
1037
1293
|
program = null;
|
|
@@ -1055,13 +1311,13 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1055
1311
|
};
|
|
1056
1312
|
return mergeRenderMaps([
|
|
1057
1313
|
createRenderMap({
|
|
1058
|
-
["accounts/mod.rs"]: accountsToExport.length > 0 ? { content: render("accountsMod.njk", ctx) } : void 0,
|
|
1059
|
-
["errors/mod.rs"]: programsToExport.length > 0 ? { content: render("errorsMod.njk", ctx) } : void 0,
|
|
1060
|
-
["instructions/mod.rs"]: instructionsToExport.length > 0 ? { content: render("instructionsMod.njk", ctx) } : void 0,
|
|
1061
|
-
["mod.rs"]: { content: render("rootMod.njk", ctx) },
|
|
1062
|
-
["programs.rs"]: programsToExport.length > 0 ? { content: render("programsMod.njk", ctx) } : void 0,
|
|
1063
|
-
["shared.rs"]: accountsToExport.length > 0 ? { content: render("sharedPage.njk", ctx) } : void 0,
|
|
1064
|
-
["types/mod.rs"]: definedTypesToExport.length > 0 ? { content: render("definedTypesMod.njk", ctx) } : void 0
|
|
1314
|
+
["accounts/mod.rs"]: accountsToExport.length > 0 ? { content: render("accountsMod.njk", ctx), imports: new ImportMap() } : void 0,
|
|
1315
|
+
["errors/mod.rs"]: programsToExport.length > 0 ? { content: render("errorsMod.njk", ctx), imports: new ImportMap() } : void 0,
|
|
1316
|
+
["instructions/mod.rs"]: instructionsToExport.length > 0 ? { content: render("instructionsMod.njk", ctx), imports: new ImportMap() } : void 0,
|
|
1317
|
+
["mod.rs"]: { content: render("rootMod.njk", ctx), imports: new ImportMap() },
|
|
1318
|
+
["programs.rs"]: programsToExport.length > 0 ? { content: render("programsMod.njk", ctx), imports: new ImportMap() } : void 0,
|
|
1319
|
+
["shared.rs"]: accountsToExport.length > 0 ? { content: render("sharedPage.njk", ctx), imports: new ImportMap() } : void 0,
|
|
1320
|
+
["types/mod.rs"]: definedTypesToExport.length > 0 ? { content: render("definedTypesMod.njk", ctx), imports: new ImportMap() } : void 0
|
|
1065
1321
|
}),
|
|
1066
1322
|
...getAllPrograms(node).map((p) => visit(p, self))
|
|
1067
1323
|
]);
|
|
@@ -1079,24 +1335,21 @@ function getConflictsForInstructionAccountsAndArgs(instruction) {
|
|
|
1079
1335
|
const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);
|
|
1080
1336
|
return [...new Set(duplicates)];
|
|
1081
1337
|
}
|
|
1082
|
-
function renderVisitor(
|
|
1338
|
+
function renderVisitor(crateFolder, options = {}) {
|
|
1083
1339
|
return rootNodeVisitor((root) => {
|
|
1340
|
+
const generatedFolder = joinPath(crateFolder, options.generatedFolder ?? "src/generated");
|
|
1084
1341
|
if (options.deleteFolderBeforeRendering ?? true) {
|
|
1085
|
-
deleteDirectory(
|
|
1342
|
+
deleteDirectory(generatedFolder);
|
|
1086
1343
|
}
|
|
1087
|
-
visit(root,
|
|
1344
|
+
const renderMap = visit(root, getRenderMapVisitor(options));
|
|
1345
|
+
writeRenderMap(renderMap, generatedFolder);
|
|
1346
|
+
syncCargoToml(renderMap, crateFolder, options);
|
|
1088
1347
|
if (options.formatCode) {
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
removeFalsy
|
|
1095
|
-
)
|
|
1096
|
-
);
|
|
1097
|
-
} else {
|
|
1098
|
-
logWarn("No crate folder specified, skipping formatting.");
|
|
1099
|
-
}
|
|
1348
|
+
const removeFalsy = (arg) => Boolean(arg);
|
|
1349
|
+
runFormatter(
|
|
1350
|
+
"cargo",
|
|
1351
|
+
[options.toolchain, "fmt", "--manifest-path", `${crateFolder}/Cargo.toml`].filter(removeFalsy)
|
|
1352
|
+
);
|
|
1100
1353
|
}
|
|
1101
1354
|
});
|
|
1102
1355
|
}
|
|
@@ -1114,6 +1367,6 @@ function runFormatter(cmd, args) {
|
|
|
1114
1367
|
}
|
|
1115
1368
|
}
|
|
1116
1369
|
|
|
1117
|
-
export { ImportMap, renderVisitor as default, getRenderMapVisitor, getTypeManifestVisitor, renderVisitor };
|
|
1370
|
+
export { ImportMap, RUST_CORE_IMPORTS, renderVisitor as default, getRenderMapVisitor, getTypeManifestVisitor, renderVisitor };
|
|
1118
1371
|
//# sourceMappingURL=index.node.mjs.map
|
|
1119
1372
|
//# sourceMappingURL=index.node.mjs.map
|