@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.
@@ -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
- // src/getRenderMapVisitor.ts
73
- import { logWarn } from "@codama/errors";
74
- import {
75
- getAllAccounts,
76
- getAllDefinedTypes,
77
- getAllInstructionsWithSubs,
78
- getAllPrograms,
79
- isNode as isNode5,
80
- isNodeFilter as isNodeFilter2,
81
- pascalCase as pascalCase4,
82
- resolveNestedTypeNode as resolveNestedTypeNode2,
83
- snakeCase as snakeCase4,
84
- structTypeNodeFromInstructionArgumentNodes,
85
- VALUE_NODES as VALUE_NODES2
86
- } from "@codama/nodes";
87
- import { addToRenderMap, createRenderMap, mergeRenderMaps } from "@codama/renderers-core";
88
- import {
89
- extendVisitor as extendVisitor2,
90
- LinkableDictionary,
91
- NodeStack,
92
- pipe as pipe2,
93
- recordLinkablesOnFirstVisitVisitor,
94
- recordNodeStackVisitor,
95
- staticVisitor,
96
- visit as visit4
97
- } from "@codama/visitors-core";
98
-
99
- // src/getTypeManifestVisitor.ts
100
- import { CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, CodamaError as CodamaError2 } from "@codama/errors";
101
- import {
102
- arrayTypeNode,
103
- definedTypeNode,
104
- fixedCountNode,
105
- isNode as isNode4,
106
- numberTypeNode,
107
- parseDocs,
108
- pascalCase as pascalCase3,
109
- prefixedCountNode,
110
- REGISTERED_TYPE_NODE_KINDS,
111
- remainderCountNode,
112
- resolveNestedTypeNode,
113
- snakeCase as snakeCase3
114
- } from "@codama/nodes";
115
- import { extendVisitor, mergeVisitor, pipe, visit as visit3 } from "@codama/visitors-core";
116
-
117
- // src/utils/codecs.ts
118
- import { getBase16Encoder, getBase58Encoder, getBase64Encoder, getUtf8Encoder } from "@solana/codecs-strings";
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 = visit2(discriminatorNode.constant.type, typeManifestVisitor);
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 || !isNode2(field.defaultValue, VALUE_NODES)) {
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 = visit2(field.type, typeManifestVisitor);
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 = true ? pathDirname(fileURLToPath(import.meta.url)) : __dirname;
387
- const templates = false ? join(dirname, "..", "..", "public", "templates") : join(dirname, "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", pascalCase2);
390
- env.addFilter("camelCase", camelCase2);
391
- env.addFilter("snakeCase", snakeCase2);
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]) => [camelCase3(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 (isNode3(node, ["accountNode", "instructionNode"])) return "struct";
461
- if (isNode3(node.type, "structTypeNode")) return "struct";
462
- if (isNode3(node.type, "enumTypeNode")) {
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]) => [camelCase3(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 = pascalCase3(account.name);
744
+ parentName = pascalCase(account.name);
565
745
  parentNode = account;
566
- const manifest = visit3(account.data, self);
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 = visit3(arrayType.item, self);
578
- if (isNode4(arrayType.count, "fixedCountNode")) {
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 (isNode4(arrayType.count, "remainderCountNode")) {
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 visit3(arrayType, self);
821
+ return visit(arrayType, self);
642
822
  },
643
823
  visitDefinedType(definedType, { self }) {
644
- parentName = pascalCase3(definedType.name);
824
+ parentName = pascalCase(definedType.name);
645
825
  parentNode = definedType;
646
- const manifest = visit3(definedType.type, self);
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 = isNode4(definedType.type, ["enumTypeNode", "structTypeNode"]) ? manifest.type : `pub type ${pascalCase3(definedType.name)} = ${manifest.type};`;
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 = pascalCase3(node.name);
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 = pascalCase3(enumEmptyVariantType.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 = pascalCase3(enumStructVariantType.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 = pascalCase3(originalParentName) + name;
679
- const typeManifest = visit3(enumStructVariantType.struct, self);
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 = pascalCase3(enumTupleVariantType.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 = pascalCase3(originalParentName) + name;
694
- const childManifest = visit3(enumTupleVariantType.tuple, self);
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) => visit3(variant, self));
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 ${pascalCase3(originalParentName)} {
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 = visit3(fixedSizeType.type, self);
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 = visit3(mapType.key, self);
738
- const value = visit3(mapType.value, self);
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 = visit3(optionType.item, self);
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 CodamaError2(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });
962
+ throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });
783
963
  },
784
964
  visitSetType(setType, { self }) {
785
- const childManifest = visit3(setType.item, self);
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 = visit3(sizePrefixType.type, self);
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 (isNode4(parentSize, "numberTypeNode") && parentSize.endian === "le") {
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 = pascalCase3(originalParentName) + pascalCase3(structFieldType.name);
1024
+ parentName = pascalCase(originalParentName) + pascalCase(structFieldType.name);
845
1025
  nestedStruct = true;
846
1026
  inlineStruct = false;
847
- const fieldManifest = visit3(structFieldType.type, self);
1027
+ const fieldManifest = visit(structFieldType.type, self);
848
1028
  parentName = originalParentName;
849
1029
  inlineStruct = originalInlineStruct;
850
1030
  nestedStruct = originalNestedStruct;
851
- const fieldName = snakeCase3(structFieldType.name);
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 (isNode4(resolvedNestedType, "arrayTypeNode") && isNode4(resolvedNestedType.count, "fixedCountNode") && resolvedNestedType.count.value > 32) {
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 (isNode4(resolvedNestedType, ["bytesTypeNode", "stringTypeNode"]) && isNode4(structFieldType.type, "fixedSizeTypeNode") && structFieldType.type.size > 32) {
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) => visit3(field, self));
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 ${pascalCase3(originalParentName)} {
1080
+ `${nestedTraits.render}pub struct ${pascalCase(originalParentName)} {
901
1081
  ${fieldTypes}
902
1082
  }`
903
1083
  ],
904
- type: pascalCase3(originalParentName)
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 ${pascalCase3(originalParentName)} {
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) => visit3(item, self));
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 CodamaError2(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });
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 pipe2(
1135
+ return pipe(
956
1136
  staticVisitor(() => createRenderMap(), {
957
1137
  keys: ["rootNode", "programNode", "instructionNode", "accountNode", "definedTypeNode"]
958
1138
  }),
959
- (v) => extendVisitor2(v, {
1139
+ (v) => extendVisitor(v, {
960
1140
  visitAccount(node) {
961
- const typeManifest = visit4(node, typeManifestVisitor);
962
- const fields = resolveNestedTypeNode2(node.data).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 (isNode5(seed, "variablePdaSeedNode")) {
975
- const seedManifest2 = visit4(seed.type, typeManifestVisitor);
1154
+ if (isNode(seed, "variablePdaSeedNode")) {
1155
+ const seedManifest2 = visit(seed.type, typeManifestVisitor);
976
1156
  seedsImports.mergeWith(seedManifest2.imports);
977
- const resolvedType2 = resolveNestedTypeNode2(seed.type);
1157
+ const resolvedType2 = resolveNestedTypeNode(seed.type);
978
1158
  return { ...seed, resolvedType: resolvedType2, typeManifest: seedManifest2 };
979
1159
  }
980
- if (isNode5(seed.value, "programIdValueNode")) {
1160
+ if (isNode(seed.value, "programIdValueNode")) {
981
1161
  return seed;
982
1162
  }
983
- const seedManifest = visit4(seed.type, typeManifestVisitor);
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 = resolveNestedTypeNode2(seed.type);
1166
+ const resolvedType = resolveNestedTypeNode(seed.type);
987
1167
  return { ...seed, resolvedType, typeManifest: seedManifest, valueManifest };
988
1168
  });
989
- const hasVariableSeeds = pdaSeeds.filter(isNodeFilter2("variablePdaSeedNode")).length > 0;
990
- const constantSeeds = seeds.filter(isNodeFilter2("constantPdaSeedNode")).filter((seed) => !isNode5(seed.value, "programIdValueNode"));
991
- const { imports } = typeManifest;
992
- if (hasVariableSeeds) {
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.mergeWith(discriminatorConstants.imports).remove(`generatedAccounts::${pascalCase4(node.name)}`).toString(dependencyMap),
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 = visit4(node, typeManifestVisitor);
1012
- const imports = new ImportMap().mergeWithManifest(typeManifest);
1013
- return createRenderMap(`types/${snakeCase4(node.name)}.rs`, {
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.remove(`generatedTypes::${pascalCase4(node.name)}`).toString(dependencyMap),
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: `${pascalCase4(node.name)}InstructionData`
1223
+ parentName: `${pascalCase(node.name)}InstructionData`
1045
1224
  });
1046
- const manifest = visit4(argument.type, argumentVisitor);
1225
+ const manifest = visit(argument.type, argumentVisitor);
1047
1226
  imports.mergeWith(manifest.imports);
1048
- const innerOptionType = isNode5(argument.type, "optionTypeNode") ? manifest.type.slice("Option<".length, -1) : null;
1049
- const hasDefaultValue = !!argument.defaultValue && isNode5(argument.defaultValue, VALUE_NODES2);
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: `${pascalCase4(node.name)}InstructionData`
1254
+ parentName: `${pascalCase(node.name)}InstructionData`
1076
1255
  });
1077
- const typeManifest = visit4(struct, structVisitor);
1256
+ const typeManifest = visit(struct, structVisitor);
1078
1257
  const dataTraits = getTraitsFromNode2(node);
1079
- imports.mergeWith(dataTraits.imports);
1080
- return createRenderMap(`instructions/${snakeCase4(node.name)}.rs`, {
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.mergeWith(discriminatorConstants.imports).remove(`generatedInstructions::${pascalCase4(node.name)}`).toString(dependencyMap),
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) => visit4(account, self)),
1098
- ...node.definedTypes.map((type) => visit4(type, self)),
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) => visit4(ix, self))
1281
+ }).map((ix) => visit(ix, self))
1102
1282
  ]);
1103
1283
  if (node.errors.length > 0) {
1104
- renders = addToRenderMap(renders, `errors/${snakeCase4(node.name)}.rs`, {
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) => visit4(p, self))
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(path);
1342
+ deleteDirectory(generatedFolder);
1167
1343
  }
1168
- visit5(root, writeRenderMapVisitor(getRenderMapVisitor(options), path));
1344
+ const renderMap = visit(root, getRenderMapVisitor(options));
1345
+ writeRenderMap(renderMap, generatedFolder);
1346
+ syncCargoToml(renderMap, crateFolder, options);
1169
1347
  if (options.formatCode) {
1170
- if (options.crateFolder) {
1171
- const removeFalsy = (arg) => Boolean(arg);
1172
- runFormatter(
1173
- "cargo",
1174
- [options.toolchain, "fmt", "--manifest-path", `${options.crateFolder}/Cargo.toml`].filter(
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
- logWarn2(`Could not find ${cmd}, skipping formatting.`);
1359
+ logWarn(`Could not find ${cmd}, skipping formatting.`);
1188
1360
  return;
1189
1361
  }
1190
1362
  if (stdout.length > 0) {
1191
- logWarn2(`(cargo-fmt) ${stdout ? stdout?.toString() : error}`);
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
- export {
1198
- ImportMap,
1199
- renderVisitor as default,
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