@codama/renderers-rust 1.2.9 → 2.0.1

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