@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.mjs
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
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
|
+
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, joinPath, deleteDirectory, writeRenderMap, fileExists, writeFile, readFile } from '@codama/renderers-core';
|
|
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';
|
|
7
|
+
import { getBase64Encoder, getBase58Encoder, getBase16Encoder, getUtf8Encoder } from '@solana/codecs-strings';
|
|
8
|
+
import { dirname, join } from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import nunjucks from 'nunjucks';
|
|
11
|
+
import { spawnSync } from 'child_process';
|
|
12
|
+
|
|
1
13
|
// src/ImportMap.ts
|
|
14
|
+
var RUST_CORE_IMPORTS = /* @__PURE__ */ new Set(["std", "crate", "super", "self", "core", "alloc", "clippy"]);
|
|
2
15
|
var DEFAULT_MODULE_MAP = {
|
|
3
16
|
generated: "crate::generated",
|
|
4
17
|
generatedAccounts: "crate::generated::accounts",
|
|
@@ -58,6 +71,10 @@ var ImportMap = class _ImportMap {
|
|
|
58
71
|
this._aliases.forEach((alias, i) => newImportMap.addAlias(resolveDependency(i), alias));
|
|
59
72
|
return newImportMap;
|
|
60
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
|
+
}
|
|
61
78
|
toString(dependencies) {
|
|
62
79
|
const resolvedMap = this.resolveDependencyMap(dependencies);
|
|
63
80
|
const importStatements = [...resolvedMap.imports].map((i) => {
|
|
@@ -68,54 +85,254 @@ var ImportMap = class _ImportMap {
|
|
|
68
85
|
return importStatements.join("\n");
|
|
69
86
|
}
|
|
70
87
|
};
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
//
|
|
118
|
-
|
|
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
|
+
}
|
|
119
336
|
function getBytesFromBytesValueNode(node) {
|
|
120
337
|
switch (node.encoding) {
|
|
121
338
|
case "utf8":
|
|
@@ -129,26 +346,6 @@ function getBytesFromBytesValueNode(node) {
|
|
|
129
346
|
return getBase64Encoder().encode(node.data);
|
|
130
347
|
}
|
|
131
348
|
}
|
|
132
|
-
|
|
133
|
-
// src/utils/discriminatorConstant.ts
|
|
134
|
-
import {
|
|
135
|
-
camelCase,
|
|
136
|
-
isNode as isNode2,
|
|
137
|
-
isNodeFilter,
|
|
138
|
-
snakeCase,
|
|
139
|
-
VALUE_NODES
|
|
140
|
-
} from "@codama/nodes";
|
|
141
|
-
import { visit as visit2 } from "@codama/visitors-core";
|
|
142
|
-
|
|
143
|
-
// src/renderValueNodeVisitor.ts
|
|
144
|
-
import {
|
|
145
|
-
arrayValueNode,
|
|
146
|
-
bytesValueNode,
|
|
147
|
-
isNode,
|
|
148
|
-
numberValueNode,
|
|
149
|
-
pascalCase
|
|
150
|
-
} from "@codama/nodes";
|
|
151
|
-
import { visit } from "@codama/visitors-core";
|
|
152
349
|
function renderValueNode(value, getImportFrom, useStr = false) {
|
|
153
350
|
return visit(value, renderValueNodeVisitor(getImportFrom, useStr));
|
|
154
351
|
}
|
|
@@ -308,18 +505,18 @@ function getConstantDiscriminatorConstant(discriminatorNode, scope) {
|
|
|
308
505
|
const index = discriminatorNodes.filter(isNodeFilter("constantDiscriminatorNode")).indexOf(discriminatorNode);
|
|
309
506
|
const suffix = index <= 0 ? "" : `_${index + 1}`;
|
|
310
507
|
const name = camelCase(`${prefix}_discriminator${suffix}`);
|
|
311
|
-
const typeManifest =
|
|
508
|
+
const typeManifest = visit(discriminatorNode.constant.type, typeManifestVisitor);
|
|
312
509
|
const value = renderValueNode(discriminatorNode.constant.value, getImportFrom);
|
|
313
510
|
return getConstant(name, typeManifest, value);
|
|
314
511
|
}
|
|
315
512
|
function getFieldDiscriminatorConstant(discriminatorNode, scope) {
|
|
316
513
|
const { fields, prefix, getImportFrom, typeManifestVisitor } = scope;
|
|
317
514
|
const field = fields.find((f) => f.name === discriminatorNode.name);
|
|
318
|
-
if (!field || !field.defaultValue || !
|
|
515
|
+
if (!field || !field.defaultValue || !isNode(field.defaultValue, VALUE_NODES)) {
|
|
319
516
|
return null;
|
|
320
517
|
}
|
|
321
518
|
const name = camelCase(`${prefix}_${discriminatorNode.name}`);
|
|
322
|
-
const typeManifest =
|
|
519
|
+
const typeManifest = visit(field.type, typeManifestVisitor);
|
|
323
520
|
const value = renderValueNode(field.defaultValue, getImportFrom);
|
|
324
521
|
return getConstant(name, typeManifest, value);
|
|
325
522
|
}
|
|
@@ -327,9 +524,6 @@ function getConstant(name, typeManifest, value) {
|
|
|
327
524
|
const type = { imports: typeManifest.imports, render: typeManifest.type };
|
|
328
525
|
return mergeFragments([type, value], ([t, v]) => `pub const ${snakeCase(name).toUpperCase()}: ${t} = ${v};`);
|
|
329
526
|
}
|
|
330
|
-
|
|
331
|
-
// src/utils/linkOverrides.ts
|
|
332
|
-
import { CODAMA_ERROR__UNEXPECTED_NODE_KIND, CodamaError } from "@codama/errors";
|
|
333
527
|
function getImportFromFactory(overrides) {
|
|
334
528
|
const linkOverrides = {
|
|
335
529
|
accounts: overrides.accounts ?? {},
|
|
@@ -370,12 +564,6 @@ function getImportFromFactory(overrides) {
|
|
|
370
564
|
}
|
|
371
565
|
};
|
|
372
566
|
}
|
|
373
|
-
|
|
374
|
-
// src/utils/render.ts
|
|
375
|
-
import { dirname as pathDirname, join } from "path";
|
|
376
|
-
import { fileURLToPath } from "url";
|
|
377
|
-
import { camelCase as camelCase2, kebabCase, pascalCase as pascalCase2, snakeCase as snakeCase2, titleCase } from "@codama/nodes";
|
|
378
|
-
import nunjucks from "nunjucks";
|
|
379
567
|
function rustDocblock(docs) {
|
|
380
568
|
if (docs.length <= 0) return "";
|
|
381
569
|
const lines = docs.map((doc) => `/// ${doc}`);
|
|
@@ -383,12 +571,12 @@ function rustDocblock(docs) {
|
|
|
383
571
|
`;
|
|
384
572
|
}
|
|
385
573
|
var render = (template, context, options) => {
|
|
386
|
-
const dirname =
|
|
387
|
-
const templates =
|
|
574
|
+
const dirname$1 = dirname(fileURLToPath(import.meta.url)) ;
|
|
575
|
+
const templates = join(dirname$1, "templates");
|
|
388
576
|
const env = nunjucks.configure(templates, { autoescape: false, trimBlocks: true, ...options });
|
|
389
|
-
env.addFilter("pascalCase",
|
|
390
|
-
env.addFilter("camelCase",
|
|
391
|
-
env.addFilter("snakeCase",
|
|
577
|
+
env.addFilter("pascalCase", pascalCase);
|
|
578
|
+
env.addFilter("camelCase", camelCase);
|
|
579
|
+
env.addFilter("snakeCase", snakeCase);
|
|
392
580
|
env.addFilter("kebabCase", kebabCase);
|
|
393
581
|
env.addFilter("titleCase", titleCase);
|
|
394
582
|
env.addFilter("rustDocblock", rustDocblock);
|
|
@@ -398,14 +586,6 @@ var render = (template, context, options) => {
|
|
|
398
586
|
});
|
|
399
587
|
return env.render(template, context);
|
|
400
588
|
};
|
|
401
|
-
|
|
402
|
-
// src/utils/traitOptions.ts
|
|
403
|
-
import {
|
|
404
|
-
assertIsNode,
|
|
405
|
-
camelCase as camelCase3,
|
|
406
|
-
isNode as isNode3,
|
|
407
|
-
isScalarEnum
|
|
408
|
-
} from "@codama/nodes";
|
|
409
589
|
var DEFAULT_TRAIT_OPTIONS = {
|
|
410
590
|
baseDefaults: [
|
|
411
591
|
"borsh::BorshSerialize",
|
|
@@ -435,7 +615,7 @@ function getTraitsFromNode(node, userOptions = {}) {
|
|
|
435
615
|
return { imports: new ImportMap(), render: "" };
|
|
436
616
|
}
|
|
437
617
|
const sanitizedOverrides = Object.fromEntries(
|
|
438
|
-
Object.entries(options.overrides).map(([key, value]) => [
|
|
618
|
+
Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value])
|
|
439
619
|
);
|
|
440
620
|
const nodeOverrides = sanitizedOverrides[node.name];
|
|
441
621
|
const allTraits = nodeOverrides === void 0 ? getDefaultTraits(nodeType, options) : nodeOverrides;
|
|
@@ -457,9 +637,9 @@ function getTraitsFromNode(node, userOptions = {}) {
|
|
|
457
637
|
return { imports, render: traitLines.join("") };
|
|
458
638
|
}
|
|
459
639
|
function getNodeType(node) {
|
|
460
|
-
if (
|
|
461
|
-
if (
|
|
462
|
-
if (
|
|
640
|
+
if (isNode(node, ["accountNode", "instructionNode"])) return "struct";
|
|
641
|
+
if (isNode(node.type, "structTypeNode")) return "struct";
|
|
642
|
+
if (isNode(node.type, "enumTypeNode")) {
|
|
463
643
|
return isScalarEnum(node.type) ? "scalarEnum" : "dataEnum";
|
|
464
644
|
}
|
|
465
645
|
return "alias";
|
|
@@ -513,7 +693,7 @@ function getSerdeFieldAttribute(serdeWith, node, userOptions = {}) {
|
|
|
513
693
|
return "";
|
|
514
694
|
}
|
|
515
695
|
const sanitizedOverrides = Object.fromEntries(
|
|
516
|
-
Object.entries(options.overrides).map(([key, value]) => [
|
|
696
|
+
Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value])
|
|
517
697
|
);
|
|
518
698
|
const nodeOverrides = sanitizedOverrides[node.name];
|
|
519
699
|
const allTraits = nodeOverrides === void 0 ? getDefaultTraits(nodeType, options) : nodeOverrides;
|
|
@@ -561,9 +741,9 @@ function getTypeManifestVisitor(options) {
|
|
|
561
741
|
),
|
|
562
742
|
(v) => extendVisitor(v, {
|
|
563
743
|
visitAccount(account, { self }) {
|
|
564
|
-
parentName =
|
|
744
|
+
parentName = pascalCase(account.name);
|
|
565
745
|
parentNode = account;
|
|
566
|
-
const manifest =
|
|
746
|
+
const manifest = visit(account.data, self);
|
|
567
747
|
const traits = getTraitsFromNode2(account);
|
|
568
748
|
manifest.imports.mergeWith(traits.imports);
|
|
569
749
|
parentName = null;
|
|
@@ -574,14 +754,14 @@ function getTypeManifestVisitor(options) {
|
|
|
574
754
|
};
|
|
575
755
|
},
|
|
576
756
|
visitArrayType(arrayType, { self }) {
|
|
577
|
-
const childManifest =
|
|
578
|
-
if (
|
|
757
|
+
const childManifest = visit(arrayType.item, self);
|
|
758
|
+
if (isNode(arrayType.count, "fixedCountNode")) {
|
|
579
759
|
return {
|
|
580
760
|
...childManifest,
|
|
581
761
|
type: `[${childManifest.type}; ${arrayType.count.value}]`
|
|
582
762
|
};
|
|
583
763
|
}
|
|
584
|
-
if (
|
|
764
|
+
if (isNode(arrayType.count, "remainderCountNode")) {
|
|
585
765
|
childManifest.imports.add("kaigan::types::RemainderVec");
|
|
586
766
|
return {
|
|
587
767
|
...childManifest,
|
|
@@ -638,21 +818,21 @@ function getTypeManifestVisitor(options) {
|
|
|
638
818
|
arraySize = prefixedCountNode(parentSize);
|
|
639
819
|
}
|
|
640
820
|
const arrayType = arrayTypeNode(numberTypeNode("u8"), arraySize);
|
|
641
|
-
return
|
|
821
|
+
return visit(arrayType, self);
|
|
642
822
|
},
|
|
643
823
|
visitDefinedType(definedType, { self }) {
|
|
644
|
-
parentName =
|
|
824
|
+
parentName = pascalCase(definedType.name);
|
|
645
825
|
parentNode = definedType;
|
|
646
|
-
const manifest =
|
|
826
|
+
const manifest = visit(definedType.type, self);
|
|
647
827
|
const traits = getTraitsFromNode2(definedType);
|
|
648
828
|
manifest.imports.mergeWith(traits.imports);
|
|
649
829
|
parentName = null;
|
|
650
830
|
parentNode = null;
|
|
651
|
-
const renderedType =
|
|
831
|
+
const renderedType = isNode(definedType.type, ["enumTypeNode", "structTypeNode"]) ? manifest.type : `pub type ${pascalCase(definedType.name)} = ${manifest.type};`;
|
|
652
832
|
return { ...manifest, type: `${traits.render}${renderedType}` };
|
|
653
833
|
},
|
|
654
834
|
visitDefinedTypeLink(node) {
|
|
655
|
-
const pascalCaseDefinedType =
|
|
835
|
+
const pascalCaseDefinedType = pascalCase(node.name);
|
|
656
836
|
const importFrom = getImportFrom(node);
|
|
657
837
|
return {
|
|
658
838
|
imports: new ImportMap().add(`${importFrom}::${pascalCaseDefinedType}`),
|
|
@@ -661,7 +841,7 @@ function getTypeManifestVisitor(options) {
|
|
|
661
841
|
};
|
|
662
842
|
},
|
|
663
843
|
visitEnumEmptyVariantType(enumEmptyVariantType) {
|
|
664
|
-
const name =
|
|
844
|
+
const name = pascalCase(enumEmptyVariantType.name);
|
|
665
845
|
return {
|
|
666
846
|
imports: new ImportMap(),
|
|
667
847
|
nestedStructs: [],
|
|
@@ -669,14 +849,14 @@ function getTypeManifestVisitor(options) {
|
|
|
669
849
|
};
|
|
670
850
|
},
|
|
671
851
|
visitEnumStructVariantType(enumStructVariantType, { self }) {
|
|
672
|
-
const name =
|
|
852
|
+
const name = pascalCase(enumStructVariantType.name);
|
|
673
853
|
const originalParentName = parentName;
|
|
674
854
|
if (!originalParentName) {
|
|
675
855
|
throw new Error("Enum struct variant type must have a parent name.");
|
|
676
856
|
}
|
|
677
857
|
inlineStruct = true;
|
|
678
|
-
parentName =
|
|
679
|
-
const typeManifest =
|
|
858
|
+
parentName = pascalCase(originalParentName) + name;
|
|
859
|
+
const typeManifest = visit(enumStructVariantType.struct, self);
|
|
680
860
|
inlineStruct = false;
|
|
681
861
|
parentName = originalParentName;
|
|
682
862
|
return {
|
|
@@ -685,13 +865,13 @@ function getTypeManifestVisitor(options) {
|
|
|
685
865
|
};
|
|
686
866
|
},
|
|
687
867
|
visitEnumTupleVariantType(enumTupleVariantType, { self }) {
|
|
688
|
-
const name =
|
|
868
|
+
const name = pascalCase(enumTupleVariantType.name);
|
|
689
869
|
const originalParentName = parentName;
|
|
690
870
|
if (!originalParentName) {
|
|
691
871
|
throw new Error("Enum struct variant type must have a parent name.");
|
|
692
872
|
}
|
|
693
|
-
parentName =
|
|
694
|
-
const childManifest =
|
|
873
|
+
parentName = pascalCase(originalParentName) + name;
|
|
874
|
+
const childManifest = visit(enumTupleVariantType.tuple, self);
|
|
695
875
|
parentName = originalParentName;
|
|
696
876
|
let derive = "";
|
|
697
877
|
if (parentNode && childManifest.type === "(Pubkey)") {
|
|
@@ -717,25 +897,25 @@ function getTypeManifestVisitor(options) {
|
|
|
717
897
|
if (!originalParentName) {
|
|
718
898
|
throw new Error("Enum type must have a parent name.");
|
|
719
899
|
}
|
|
720
|
-
const variants = enumType.variants.map((variant) =>
|
|
900
|
+
const variants = enumType.variants.map((variant) => visit(variant, self));
|
|
721
901
|
const variantNames = variants.map((variant) => variant.type).join("\n");
|
|
722
902
|
const mergedManifest = mergeManifests(variants);
|
|
723
903
|
return {
|
|
724
904
|
...mergedManifest,
|
|
725
|
-
type: `pub enum ${
|
|
905
|
+
type: `pub enum ${pascalCase(originalParentName)} {
|
|
726
906
|
${variantNames}
|
|
727
907
|
}`
|
|
728
908
|
};
|
|
729
909
|
},
|
|
730
910
|
visitFixedSizeType(fixedSizeType, { self }) {
|
|
731
911
|
parentSize = fixedSizeType.size;
|
|
732
|
-
const manifest =
|
|
912
|
+
const manifest = visit(fixedSizeType.type, self);
|
|
733
913
|
parentSize = null;
|
|
734
914
|
return manifest;
|
|
735
915
|
},
|
|
736
916
|
visitMapType(mapType, { self }) {
|
|
737
|
-
const key =
|
|
738
|
-
const value =
|
|
917
|
+
const key = visit(mapType.key, self);
|
|
918
|
+
const value = visit(mapType.value, self);
|
|
739
919
|
const mergedManifest = mergeManifests([key, value]);
|
|
740
920
|
mergedManifest.imports.add("std::collections::HashMap");
|
|
741
921
|
return {
|
|
@@ -761,7 +941,7 @@ ${variantNames}
|
|
|
761
941
|
};
|
|
762
942
|
},
|
|
763
943
|
visitOptionType(optionType, { self }) {
|
|
764
|
-
const childManifest =
|
|
944
|
+
const childManifest = visit(optionType.item, self);
|
|
765
945
|
const optionPrefix = resolveNestedTypeNode(optionType.prefix);
|
|
766
946
|
if (optionPrefix.format === "u8" && optionPrefix.endian === "le") {
|
|
767
947
|
return {
|
|
@@ -779,10 +959,10 @@ ${variantNames}
|
|
|
779
959
|
};
|
|
780
960
|
},
|
|
781
961
|
visitRemainderOptionType(node) {
|
|
782
|
-
throw new
|
|
962
|
+
throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });
|
|
783
963
|
},
|
|
784
964
|
visitSetType(setType, { self }) {
|
|
785
|
-
const childManifest =
|
|
965
|
+
const childManifest = visit(setType.item, self);
|
|
786
966
|
childManifest.imports.add("std::collections::HashSet");
|
|
787
967
|
return {
|
|
788
968
|
...childManifest,
|
|
@@ -791,7 +971,7 @@ ${variantNames}
|
|
|
791
971
|
},
|
|
792
972
|
visitSizePrefixType(sizePrefixType, { self }) {
|
|
793
973
|
parentSize = resolveNestedTypeNode(sizePrefixType.prefix);
|
|
794
|
-
const manifest =
|
|
974
|
+
const manifest = visit(sizePrefixType.type, self);
|
|
795
975
|
parentSize = null;
|
|
796
976
|
return manifest;
|
|
797
977
|
},
|
|
@@ -810,7 +990,7 @@ ${variantNames}
|
|
|
810
990
|
type: `[u8; ${parentSize}]`
|
|
811
991
|
};
|
|
812
992
|
}
|
|
813
|
-
if (
|
|
993
|
+
if (isNode(parentSize, "numberTypeNode") && parentSize.endian === "le") {
|
|
814
994
|
switch (parentSize.format) {
|
|
815
995
|
case "u32":
|
|
816
996
|
return {
|
|
@@ -841,14 +1021,14 @@ ${variantNames}
|
|
|
841
1021
|
if (!originalParentName) {
|
|
842
1022
|
throw new Error("Struct field type must have a parent name.");
|
|
843
1023
|
}
|
|
844
|
-
parentName =
|
|
1024
|
+
parentName = pascalCase(originalParentName) + pascalCase(structFieldType.name);
|
|
845
1025
|
nestedStruct = true;
|
|
846
1026
|
inlineStruct = false;
|
|
847
|
-
const fieldManifest =
|
|
1027
|
+
const fieldManifest = visit(structFieldType.type, self);
|
|
848
1028
|
parentName = originalParentName;
|
|
849
1029
|
inlineStruct = originalInlineStruct;
|
|
850
1030
|
nestedStruct = originalNestedStruct;
|
|
851
|
-
const fieldName =
|
|
1031
|
+
const fieldName = snakeCase(structFieldType.name);
|
|
852
1032
|
const docblock = rustDocblock(parseDocs(structFieldType.docs));
|
|
853
1033
|
const resolvedNestedType = resolveNestedTypeNode(structFieldType.type);
|
|
854
1034
|
let derive = "";
|
|
@@ -865,9 +1045,9 @@ ${variantNames}
|
|
|
865
1045
|
parentNode,
|
|
866
1046
|
traitOptions
|
|
867
1047
|
);
|
|
868
|
-
} else if (
|
|
1048
|
+
} else if (isNode(resolvedNestedType, "arrayTypeNode") && isNode(resolvedNestedType.count, "fixedCountNode") && resolvedNestedType.count.value > 32) {
|
|
869
1049
|
derive = getSerdeFieldAttribute("serde_big_array::BigArray", parentNode, traitOptions);
|
|
870
|
-
} else if (
|
|
1050
|
+
} else if (isNode(resolvedNestedType, ["bytesTypeNode", "stringTypeNode"]) && isNode(structFieldType.type, "fixedSizeTypeNode") && structFieldType.type.size > 32) {
|
|
871
1051
|
derive = getSerdeFieldAttribute(
|
|
872
1052
|
"serde_with::As::<serde_with::Bytes>",
|
|
873
1053
|
parentNode,
|
|
@@ -885,7 +1065,7 @@ ${variantNames}
|
|
|
885
1065
|
if (!originalParentName) {
|
|
886
1066
|
throw new Error("Struct type must have a parent name.");
|
|
887
1067
|
}
|
|
888
|
-
const fields = structType.fields.map((field) =>
|
|
1068
|
+
const fields = structType.fields.map((field) => visit(field, self));
|
|
889
1069
|
const fieldTypes = fields.map((field) => field.type).join("\n");
|
|
890
1070
|
const mergedManifest = mergeManifests(fields);
|
|
891
1071
|
if (nestedStruct) {
|
|
@@ -897,11 +1077,11 @@ ${variantNames}
|
|
|
897
1077
|
...mergedManifest,
|
|
898
1078
|
nestedStructs: [
|
|
899
1079
|
...mergedManifest.nestedStructs,
|
|
900
|
-
`${nestedTraits.render}pub struct ${
|
|
1080
|
+
`${nestedTraits.render}pub struct ${pascalCase(originalParentName)} {
|
|
901
1081
|
${fieldTypes}
|
|
902
1082
|
}`
|
|
903
1083
|
],
|
|
904
|
-
type:
|
|
1084
|
+
type: pascalCase(originalParentName)
|
|
905
1085
|
};
|
|
906
1086
|
}
|
|
907
1087
|
if (inlineStruct) {
|
|
@@ -911,13 +1091,13 @@ ${fieldTypes}
|
|
|
911
1091
|
}
|
|
912
1092
|
return {
|
|
913
1093
|
...mergedManifest,
|
|
914
|
-
type: `pub struct ${
|
|
1094
|
+
type: `pub struct ${pascalCase(originalParentName)} {
|
|
915
1095
|
${fieldTypes}
|
|
916
1096
|
}`
|
|
917
1097
|
};
|
|
918
1098
|
},
|
|
919
1099
|
visitTupleType(tupleType, { self }) {
|
|
920
|
-
const items = tupleType.items.map((item) =>
|
|
1100
|
+
const items = tupleType.items.map((item) => visit(item, self));
|
|
921
1101
|
const mergedManifest = mergeManifests(items);
|
|
922
1102
|
return {
|
|
923
1103
|
...mergedManifest,
|
|
@@ -925,7 +1105,7 @@ ${fieldTypes}
|
|
|
925
1105
|
};
|
|
926
1106
|
},
|
|
927
1107
|
visitZeroableOptionType(node) {
|
|
928
|
-
throw new
|
|
1108
|
+
throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });
|
|
929
1109
|
}
|
|
930
1110
|
})
|
|
931
1111
|
);
|
|
@@ -952,14 +1132,14 @@ function getRenderMapVisitor(options = {}) {
|
|
|
952
1132
|
traitOptions: options.traitOptions
|
|
953
1133
|
});
|
|
954
1134
|
const anchorTraits = options.anchorTraits ?? true;
|
|
955
|
-
return
|
|
1135
|
+
return pipe(
|
|
956
1136
|
staticVisitor(() => createRenderMap(), {
|
|
957
1137
|
keys: ["rootNode", "programNode", "instructionNode", "accountNode", "definedTypeNode"]
|
|
958
1138
|
}),
|
|
959
|
-
(v) =>
|
|
1139
|
+
(v) => extendVisitor(v, {
|
|
960
1140
|
visitAccount(node) {
|
|
961
|
-
const typeManifest =
|
|
962
|
-
const fields =
|
|
1141
|
+
const typeManifest = visit(node, typeManifestVisitor);
|
|
1142
|
+
const fields = resolveNestedTypeNode(node.data).fields;
|
|
963
1143
|
const discriminatorConstants = getDiscriminatorConstants({
|
|
964
1144
|
discriminatorNodes: node.discriminators ?? [],
|
|
965
1145
|
fields,
|
|
@@ -971,51 +1151,50 @@ function getRenderMapVisitor(options = {}) {
|
|
|
971
1151
|
const pda = node.pda ? linkables.get([...stack.getPath(), node.pda]) : void 0;
|
|
972
1152
|
const pdaSeeds = pda?.seeds ?? [];
|
|
973
1153
|
const seeds = pdaSeeds.map((seed) => {
|
|
974
|
-
if (
|
|
975
|
-
const seedManifest2 =
|
|
1154
|
+
if (isNode(seed, "variablePdaSeedNode")) {
|
|
1155
|
+
const seedManifest2 = visit(seed.type, typeManifestVisitor);
|
|
976
1156
|
seedsImports.mergeWith(seedManifest2.imports);
|
|
977
|
-
const resolvedType2 =
|
|
1157
|
+
const resolvedType2 = resolveNestedTypeNode(seed.type);
|
|
978
1158
|
return { ...seed, resolvedType: resolvedType2, typeManifest: seedManifest2 };
|
|
979
1159
|
}
|
|
980
|
-
if (
|
|
1160
|
+
if (isNode(seed.value, "programIdValueNode")) {
|
|
981
1161
|
return seed;
|
|
982
1162
|
}
|
|
983
|
-
const seedManifest =
|
|
1163
|
+
const seedManifest = visit(seed.type, typeManifestVisitor);
|
|
984
1164
|
const valueManifest = renderValueNode(seed.value, getImportFrom, true);
|
|
985
1165
|
seedsImports.mergeWith(valueManifest.imports);
|
|
986
|
-
const resolvedType =
|
|
1166
|
+
const resolvedType = resolveNestedTypeNode(seed.type);
|
|
987
1167
|
return { ...seed, resolvedType, typeManifest: seedManifest, valueManifest };
|
|
988
1168
|
});
|
|
989
|
-
const hasVariableSeeds = pdaSeeds.filter(
|
|
990
|
-
const constantSeeds = seeds.filter(
|
|
991
|
-
const
|
|
992
|
-
|
|
993
|
-
imports.mergeWith(seedsImports);
|
|
994
|
-
}
|
|
995
|
-
return createRenderMap(`accounts/${snakeCase4(node.name)}.rs`, {
|
|
1169
|
+
const hasVariableSeeds = pdaSeeds.filter(isNodeFilter("variablePdaSeedNode")).length > 0;
|
|
1170
|
+
const constantSeeds = seeds.filter(isNodeFilter("constantPdaSeedNode")).filter((seed) => !isNode(seed.value, "programIdValueNode"));
|
|
1171
|
+
const imports = typeManifest.imports.mergeWith(...hasVariableSeeds ? [seedsImports] : []).mergeWith(discriminatorConstants.imports).remove(`generatedAccounts::${pascalCase(node.name)}`);
|
|
1172
|
+
return createRenderMap(`accounts/${snakeCase(node.name)}.rs`, {
|
|
996
1173
|
content: render("accountsPage.njk", {
|
|
997
1174
|
account: node,
|
|
998
1175
|
anchorTraits,
|
|
999
1176
|
constantSeeds,
|
|
1000
1177
|
discriminatorConstants: discriminatorConstants.render,
|
|
1001
1178
|
hasVariableSeeds,
|
|
1002
|
-
imports: imports.
|
|
1179
|
+
imports: imports.toString(dependencyMap),
|
|
1003
1180
|
pda,
|
|
1004
1181
|
program,
|
|
1005
1182
|
seeds,
|
|
1006
1183
|
typeManifest
|
|
1007
|
-
})
|
|
1184
|
+
}),
|
|
1185
|
+
imports
|
|
1008
1186
|
});
|
|
1009
1187
|
},
|
|
1010
1188
|
visitDefinedType(node) {
|
|
1011
|
-
const typeManifest =
|
|
1012
|
-
const imports = new ImportMap().mergeWithManifest(typeManifest);
|
|
1013
|
-
return createRenderMap(`types/${
|
|
1189
|
+
const typeManifest = visit(node, typeManifestVisitor);
|
|
1190
|
+
const imports = new ImportMap().mergeWithManifest(typeManifest).remove(`generatedTypes::${pascalCase(node.name)}`);
|
|
1191
|
+
return createRenderMap(`types/${snakeCase(node.name)}.rs`, {
|
|
1014
1192
|
content: render("definedTypesPage.njk", {
|
|
1015
1193
|
definedType: node,
|
|
1016
|
-
imports: imports.
|
|
1194
|
+
imports: imports.toString(dependencyMap),
|
|
1017
1195
|
typeManifest
|
|
1018
|
-
})
|
|
1196
|
+
}),
|
|
1197
|
+
imports
|
|
1019
1198
|
});
|
|
1020
1199
|
},
|
|
1021
1200
|
visitInstruction(node) {
|
|
@@ -1041,12 +1220,12 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1041
1220
|
getImportFrom,
|
|
1042
1221
|
getTraitsFromNode: getTraitsFromNode2,
|
|
1043
1222
|
nestedStruct: true,
|
|
1044
|
-
parentName: `${
|
|
1223
|
+
parentName: `${pascalCase(node.name)}InstructionData`
|
|
1045
1224
|
});
|
|
1046
|
-
const manifest =
|
|
1225
|
+
const manifest = visit(argument.type, argumentVisitor);
|
|
1047
1226
|
imports.mergeWith(manifest.imports);
|
|
1048
|
-
const innerOptionType =
|
|
1049
|
-
const hasDefaultValue = !!argument.defaultValue &&
|
|
1227
|
+
const innerOptionType = isNode(argument.type, "optionTypeNode") ? manifest.type.slice("Option<".length, -1) : null;
|
|
1228
|
+
const hasDefaultValue = !!argument.defaultValue && isNode(argument.defaultValue, VALUE_NODES);
|
|
1050
1229
|
let renderValue = null;
|
|
1051
1230
|
if (hasDefaultValue) {
|
|
1052
1231
|
const { imports: argImports, render: value } = renderValueNode(
|
|
@@ -1072,41 +1251,43 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1072
1251
|
const structVisitor = getTypeManifestVisitor({
|
|
1073
1252
|
getImportFrom,
|
|
1074
1253
|
getTraitsFromNode: getTraitsFromNode2,
|
|
1075
|
-
parentName: `${
|
|
1254
|
+
parentName: `${pascalCase(node.name)}InstructionData`
|
|
1076
1255
|
});
|
|
1077
|
-
const typeManifest =
|
|
1256
|
+
const typeManifest = visit(struct, structVisitor);
|
|
1078
1257
|
const dataTraits = getTraitsFromNode2(node);
|
|
1079
|
-
imports.mergeWith(dataTraits.imports);
|
|
1080
|
-
return createRenderMap(`instructions/${
|
|
1258
|
+
imports.mergeWith(dataTraits.imports).mergeWith(discriminatorConstants.imports).remove(`generatedInstructions::${pascalCase(node.name)}`);
|
|
1259
|
+
return createRenderMap(`instructions/${snakeCase(node.name)}.rs`, {
|
|
1081
1260
|
content: render("instructionsPage.njk", {
|
|
1082
1261
|
dataTraits: dataTraits.render,
|
|
1083
1262
|
discriminatorConstants: discriminatorConstants.render,
|
|
1084
1263
|
hasArgs,
|
|
1085
1264
|
hasOptional,
|
|
1086
|
-
imports: imports.
|
|
1265
|
+
imports: imports.toString(dependencyMap),
|
|
1087
1266
|
instruction: node,
|
|
1088
1267
|
instructionArgs,
|
|
1089
1268
|
program,
|
|
1090
1269
|
typeManifest
|
|
1091
|
-
})
|
|
1270
|
+
}),
|
|
1271
|
+
imports
|
|
1092
1272
|
});
|
|
1093
1273
|
},
|
|
1094
1274
|
visitProgram(node, { self }) {
|
|
1095
1275
|
program = node;
|
|
1096
1276
|
let renders = mergeRenderMaps([
|
|
1097
|
-
...node.accounts.map((account) =>
|
|
1098
|
-
...node.definedTypes.map((type) =>
|
|
1277
|
+
...node.accounts.map((account) => visit(account, self)),
|
|
1278
|
+
...node.definedTypes.map((type) => visit(type, self)),
|
|
1099
1279
|
...getAllInstructionsWithSubs(node, {
|
|
1100
1280
|
leavesOnly: !renderParentInstructions
|
|
1101
|
-
}).map((ix) =>
|
|
1281
|
+
}).map((ix) => visit(ix, self))
|
|
1102
1282
|
]);
|
|
1103
1283
|
if (node.errors.length > 0) {
|
|
1104
|
-
renders = addToRenderMap(renders, `errors/${
|
|
1284
|
+
renders = addToRenderMap(renders, `errors/${snakeCase(node.name)}.rs`, {
|
|
1105
1285
|
content: render("errorsPage.njk", {
|
|
1106
1286
|
errors: node.errors,
|
|
1107
1287
|
imports: new ImportMap().toString(dependencyMap),
|
|
1108
1288
|
program: node
|
|
1109
|
-
})
|
|
1289
|
+
}),
|
|
1290
|
+
imports: new ImportMap()
|
|
1110
1291
|
});
|
|
1111
1292
|
}
|
|
1112
1293
|
program = null;
|
|
@@ -1130,15 +1311,15 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1130
1311
|
};
|
|
1131
1312
|
return mergeRenderMaps([
|
|
1132
1313
|
createRenderMap({
|
|
1133
|
-
["accounts/mod.rs"]: accountsToExport.length > 0 ? { content: render("accountsMod.njk", ctx) } : void 0,
|
|
1134
|
-
["errors/mod.rs"]: programsToExport.length > 0 ? { content: render("errorsMod.njk", ctx) } : void 0,
|
|
1135
|
-
["instructions/mod.rs"]: instructionsToExport.length > 0 ? { content: render("instructionsMod.njk", ctx) } : void 0,
|
|
1136
|
-
["mod.rs"]: { content: render("rootMod.njk", ctx) },
|
|
1137
|
-
["programs.rs"]: programsToExport.length > 0 ? { content: render("programsMod.njk", ctx) } : void 0,
|
|
1138
|
-
["shared.rs"]: accountsToExport.length > 0 ? { content: render("sharedPage.njk", ctx) } : void 0,
|
|
1139
|
-
["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
|
|
1140
1321
|
}),
|
|
1141
|
-
...getAllPrograms(node).map((p) =>
|
|
1322
|
+
...getAllPrograms(node).map((p) => visit(p, self))
|
|
1142
1323
|
]);
|
|
1143
1324
|
}
|
|
1144
1325
|
}),
|
|
@@ -1154,51 +1335,38 @@ function getConflictsForInstructionAccountsAndArgs(instruction) {
|
|
|
1154
1335
|
const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);
|
|
1155
1336
|
return [...new Set(duplicates)];
|
|
1156
1337
|
}
|
|
1157
|
-
|
|
1158
|
-
// src/renderVisitor.ts
|
|
1159
|
-
import { logError, logWarn as logWarn2 } from "@codama/errors";
|
|
1160
|
-
import { deleteDirectory, writeRenderMapVisitor } from "@codama/renderers-core";
|
|
1161
|
-
import { rootNodeVisitor, visit as visit5 } from "@codama/visitors-core";
|
|
1162
|
-
import { spawnSync } from "child_process";
|
|
1163
|
-
function renderVisitor(path, options = {}) {
|
|
1338
|
+
function renderVisitor(crateFolder, options = {}) {
|
|
1164
1339
|
return rootNodeVisitor((root) => {
|
|
1340
|
+
const generatedFolder = joinPath(crateFolder, options.generatedFolder ?? "src/generated");
|
|
1165
1341
|
if (options.deleteFolderBeforeRendering ?? true) {
|
|
1166
|
-
deleteDirectory(
|
|
1342
|
+
deleteDirectory(generatedFolder);
|
|
1167
1343
|
}
|
|
1168
|
-
|
|
1344
|
+
const renderMap = visit(root, getRenderMapVisitor(options));
|
|
1345
|
+
writeRenderMap(renderMap, generatedFolder);
|
|
1346
|
+
syncCargoToml(renderMap, crateFolder, options);
|
|
1169
1347
|
if (options.formatCode) {
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
removeFalsy
|
|
1176
|
-
)
|
|
1177
|
-
);
|
|
1178
|
-
} else {
|
|
1179
|
-
logWarn2("No crate folder specified, skipping formatting.");
|
|
1180
|
-
}
|
|
1348
|
+
const removeFalsy = (arg) => Boolean(arg);
|
|
1349
|
+
runFormatter(
|
|
1350
|
+
"cargo",
|
|
1351
|
+
[options.toolchain, "fmt", "--manifest-path", `${crateFolder}/Cargo.toml`].filter(removeFalsy)
|
|
1352
|
+
);
|
|
1181
1353
|
}
|
|
1182
1354
|
});
|
|
1183
1355
|
}
|
|
1184
1356
|
function runFormatter(cmd, args) {
|
|
1185
1357
|
const { stdout, stderr, error } = spawnSync(cmd, args);
|
|
1186
1358
|
if (error?.message?.includes("ENOENT")) {
|
|
1187
|
-
|
|
1359
|
+
logWarn(`Could not find ${cmd}, skipping formatting.`);
|
|
1188
1360
|
return;
|
|
1189
1361
|
}
|
|
1190
1362
|
if (stdout.length > 0) {
|
|
1191
|
-
|
|
1363
|
+
logWarn(`(cargo-fmt) ${stdout ? stdout?.toString() : error}`);
|
|
1192
1364
|
}
|
|
1193
1365
|
if (stderr.length > 0) {
|
|
1194
1366
|
logError(`(cargo-fmt) ${stderr ? stderr.toString() : error}`);
|
|
1195
1367
|
}
|
|
1196
1368
|
}
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
getRenderMapVisitor,
|
|
1201
|
-
getTypeManifestVisitor,
|
|
1202
|
-
renderVisitor
|
|
1203
|
-
};
|
|
1369
|
+
|
|
1370
|
+
export { ImportMap, RUST_CORE_IMPORTS, renderVisitor as default, getRenderMapVisitor, getTypeManifestVisitor, renderVisitor };
|
|
1371
|
+
//# sourceMappingURL=index.node.mjs.map
|
|
1204
1372
|
//# sourceMappingURL=index.node.mjs.map
|