@codama/renderers-js 1.3.3 → 1.3.5

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.
Files changed (80) hide show
  1. package/dist/index.node.cjs +1543 -965
  2. package/dist/index.node.cjs.map +1 -1
  3. package/dist/index.node.mjs +1459 -878
  4. package/dist/index.node.mjs.map +1 -1
  5. package/dist/templates/fragments/instructionExtraArgs.njk +1 -1
  6. package/dist/templates/fragments/pdaFunction.njk +4 -3
  7. package/dist/templates/fragments/type.njk +3 -3
  8. package/dist/templates/fragments/typeDecoder.njk +1 -1
  9. package/dist/templates/fragments/typeEncoder.njk +1 -1
  10. package/dist/types/ImportMap.d.ts +1 -1
  11. package/dist/types/ImportMap.d.ts.map +1 -1
  12. package/dist/types/TypeManifest.d.ts +5 -5
  13. package/dist/types/TypeManifest.d.ts.map +1 -1
  14. package/dist/types/fragments/accountFetchHelpers.d.ts +1 -1
  15. package/dist/types/fragments/accountFetchHelpers.d.ts.map +1 -1
  16. package/dist/types/fragments/accountPdaHelpers.d.ts +1 -1
  17. package/dist/types/fragments/accountPdaHelpers.d.ts.map +1 -1
  18. package/dist/types/fragments/accountSizeHelpers.d.ts +1 -1
  19. package/dist/types/fragments/accountType.d.ts +1 -1
  20. package/dist/types/fragments/discriminatorCondition.d.ts +1 -1
  21. package/dist/types/fragments/discriminatorCondition.d.ts.map +1 -1
  22. package/dist/types/fragments/discriminatorConstants.d.ts +1 -1
  23. package/dist/types/fragments/discriminatorConstants.d.ts.map +1 -1
  24. package/dist/types/fragments/index.d.ts +0 -1
  25. package/dist/types/fragments/index.d.ts.map +1 -1
  26. package/dist/types/fragments/instructionAccountMeta.d.ts +1 -1
  27. package/dist/types/fragments/instructionAccountMeta.d.ts.map +1 -1
  28. package/dist/types/fragments/instructionAccountTypeParam.d.ts +1 -1
  29. package/dist/types/fragments/instructionAccountTypeParam.d.ts.map +1 -1
  30. package/dist/types/fragments/instructionByteDelta.d.ts +1 -1
  31. package/dist/types/fragments/instructionByteDelta.d.ts.map +1 -1
  32. package/dist/types/fragments/instructionData.d.ts +1 -1
  33. package/dist/types/fragments/instructionExtraArgs.d.ts +1 -1
  34. package/dist/types/fragments/instructionExtraArgs.d.ts.map +1 -1
  35. package/dist/types/fragments/instructionFunction.d.ts +1 -1
  36. package/dist/types/fragments/instructionFunction.d.ts.map +1 -1
  37. package/dist/types/fragments/instructionInputDefault.d.ts +1 -1
  38. package/dist/types/fragments/instructionInputDefault.d.ts.map +1 -1
  39. package/dist/types/fragments/instructionInputResolved.d.ts +1 -1
  40. package/dist/types/fragments/instructionInputResolved.d.ts.map +1 -1
  41. package/dist/types/fragments/instructionInputType.d.ts +1 -1
  42. package/dist/types/fragments/instructionInputType.d.ts.map +1 -1
  43. package/dist/types/fragments/instructionParseFunction.d.ts +1 -1
  44. package/dist/types/fragments/instructionParseFunction.d.ts.map +1 -1
  45. package/dist/types/fragments/instructionRemainingAccounts.d.ts +1 -1
  46. package/dist/types/fragments/instructionRemainingAccounts.d.ts.map +1 -1
  47. package/dist/types/fragments/instructionType.d.ts +1 -1
  48. package/dist/types/fragments/instructionType.d.ts.map +1 -1
  49. package/dist/types/fragments/pdaFunction.d.ts +1 -1
  50. package/dist/types/fragments/pdaFunction.d.ts.map +1 -1
  51. package/dist/types/fragments/program.d.ts +1 -1
  52. package/dist/types/fragments/program.d.ts.map +1 -1
  53. package/dist/types/fragments/programAccounts.d.ts +1 -1
  54. package/dist/types/fragments/programAccounts.d.ts.map +1 -1
  55. package/dist/types/fragments/programErrors.d.ts +1 -1
  56. package/dist/types/fragments/programErrors.d.ts.map +1 -1
  57. package/dist/types/fragments/programInstructions.d.ts +1 -1
  58. package/dist/types/fragments/programInstructions.d.ts.map +1 -1
  59. package/dist/types/fragments/type.d.ts +1 -1
  60. package/dist/types/fragments/type.d.ts.map +1 -1
  61. package/dist/types/fragments/typeCodec.d.ts +1 -1
  62. package/dist/types/fragments/typeCodec.d.ts.map +1 -1
  63. package/dist/types/fragments/typeDecoder.d.ts +1 -1
  64. package/dist/types/fragments/typeDecoder.d.ts.map +1 -1
  65. package/dist/types/fragments/typeDiscriminatedUnionHelpers.d.ts +1 -1
  66. package/dist/types/fragments/typeDiscriminatedUnionHelpers.d.ts.map +1 -1
  67. package/dist/types/fragments/typeEncoder.d.ts +1 -1
  68. package/dist/types/fragments/typeEncoder.d.ts.map +1 -1
  69. package/dist/types/fragments/typeWithCodec.d.ts +1 -1
  70. package/dist/types/getRenderMapVisitor.d.ts +1 -2
  71. package/dist/types/getRenderMapVisitor.d.ts.map +1 -1
  72. package/dist/types/getTypeManifestVisitor.d.ts +9 -3
  73. package/dist/types/getTypeManifestVisitor.d.ts.map +1 -1
  74. package/dist/types/utils/fragment.d.ts +20 -0
  75. package/dist/types/utils/fragment.d.ts.map +1 -0
  76. package/dist/types/utils/index.d.ts +1 -0
  77. package/dist/types/utils/index.d.ts.map +1 -1
  78. package/package.json +7 -7
  79. package/dist/types/fragments/common.d.ts +0 -25
  80. package/dist/types/fragments/common.d.ts.map +0 -1
@@ -36,7 +36,7 @@ __export(index_exports, {
36
36
  getNameApi: () => getNameApi,
37
37
  getRenderMapVisitor: () => getRenderMapVisitor,
38
38
  getTypeManifestVisitor: () => getTypeManifestVisitor,
39
- mergeManifests: () => mergeManifests,
39
+ mergeTypeManifests: () => mergeTypeManifests,
40
40
  renderVisitor: () => renderVisitor,
41
41
  typeManifest: () => typeManifest
42
42
  });
@@ -175,12 +175,6 @@ var ImportMap = class {
175
175
  }
176
176
  };
177
177
 
178
- // src/fragments/accountFetchHelpers.ts
179
- var import_visitors_core2 = require("@codama/visitors-core");
180
-
181
- // src/fragments/common.ts
182
- var import_node_path2 = require("path");
183
-
184
178
  // src/utils/async.ts
185
179
  var import_nodes = require("@codama/nodes");
186
180
  var import_visitors_core = require("@codama/visitors-core");
@@ -303,6 +297,74 @@ var getDefinedTypeNodesToExtract = (nodes, parsedCustomDataOptions) => nodes.fla
303
297
  ];
304
298
  });
305
299
 
300
+ // src/utils/fragment.ts
301
+ var import_renderers_core = require("@codama/renderers-core");
302
+
303
+ // src/utils/render.ts
304
+ var import_node_path = require("path");
305
+ var import_node_url = require("url");
306
+ var import_nodes3 = require("@codama/nodes");
307
+ var import_nunjucks = __toESM(require("nunjucks"));
308
+ function jsDocblock(docs) {
309
+ if (docs.length <= 0) return "";
310
+ if (docs.length === 1) return `/** ${docs[0]} */
311
+ `;
312
+ const lines = docs.map((doc) => ` * ${doc}`);
313
+ return `/**
314
+ ${lines.join("\n")}
315
+ */
316
+ `;
317
+ }
318
+ var render = (template, context, options) => {
319
+ const dirname = false ? pathDirname(fileURLToPath(import_meta.url)) : __dirname;
320
+ const templates = false ? (0, import_node_path.join)(dirname, "..", "..", "public", "templates") : (0, import_node_path.join)(dirname, "templates");
321
+ const env = import_nunjucks.default.configure(templates, { autoescape: false, trimBlocks: true, ...options });
322
+ env.addFilter("pascalCase", import_nodes3.pascalCase);
323
+ env.addFilter("camelCase", import_nodes3.camelCase);
324
+ env.addFilter("snakeCase", import_nodes3.snakeCase);
325
+ env.addFilter("kebabCase", import_nodes3.kebabCase);
326
+ env.addFilter("titleCase", import_nodes3.titleCase);
327
+ env.addFilter("jsDocblock", jsDocblock);
328
+ return env.render(template, context);
329
+ };
330
+
331
+ // src/utils/fragment.ts
332
+ function fragment(content) {
333
+ return Object.freeze({
334
+ content,
335
+ features: /* @__PURE__ */ new Set(),
336
+ imports: new ImportMap()
337
+ });
338
+ }
339
+ function fragmentFromTemplate(fragmentFile, context, options) {
340
+ return fragment(render((0, import_renderers_core.joinPath)("fragments", fragmentFile), context, options));
341
+ }
342
+ function mergeFragments(fragments, mergeContent) {
343
+ return Object.freeze({
344
+ content: mergeContent(fragments.map((fragment2) => fragment2.content)),
345
+ features: new Set(fragments.flatMap((f) => [...f.features])),
346
+ imports: new ImportMap().mergeWith(...fragments.map((f) => f.imports))
347
+ });
348
+ }
349
+ function mergeFragmentImports(fragment2, importMaps) {
350
+ return Object.freeze({
351
+ ...fragment2,
352
+ imports: new ImportMap().mergeWith(fragment2.imports, ...importMaps)
353
+ });
354
+ }
355
+ function addFragmentImports(fragment2, module2, imports) {
356
+ return Object.freeze({
357
+ ...fragment2,
358
+ imports: new ImportMap().mergeWith(fragment2.imports).add(module2, imports)
359
+ });
360
+ }
361
+ function addFragmentFeatures(fragment2, features) {
362
+ return Object.freeze({
363
+ ...fragment2,
364
+ features: /* @__PURE__ */ new Set([...fragment2.features, ...features])
365
+ });
366
+ }
367
+
306
368
  // src/utils/linkOverrides.ts
307
369
  var import_errors = require("@codama/errors");
308
370
  function getImportFromFactory(overrides, customAccountData, customInstructionData) {
@@ -352,135 +414,72 @@ function getImportFromFactory(overrides, customAccountData, customInstructionDat
352
414
  };
353
415
  }
354
416
 
355
- // src/utils/render.ts
356
- var import_node_path = require("path");
357
- var import_node_url = require("url");
358
- var import_nodes3 = require("@codama/nodes");
359
- var import_nunjucks = __toESM(require("nunjucks"));
360
- function jsDocblock(docs) {
361
- if (docs.length <= 0) return "";
362
- if (docs.length === 1) return `/** ${docs[0]} */
363
- `;
364
- const lines = docs.map((doc) => ` * ${doc}`);
365
- return `/**
366
- ${lines.join("\n")}
367
- */
368
- `;
369
- }
370
- var render = (template, context, options) => {
371
- const dirname = false ? pathDirname(fileURLToPath(import_meta.url)) : __dirname;
372
- const templates = false ? (0, import_node_path.join)(dirname, "..", "..", "public", "templates") : (0, import_node_path.join)(dirname, "templates");
373
- const env = import_nunjucks.default.configure(templates, { autoescape: false, trimBlocks: true, ...options });
374
- env.addFilter("pascalCase", import_nodes3.pascalCase);
375
- env.addFilter("camelCase", import_nodes3.camelCase);
376
- env.addFilter("snakeCase", import_nodes3.snakeCase);
377
- env.addFilter("kebabCase", import_nodes3.kebabCase);
378
- env.addFilter("titleCase", import_nodes3.titleCase);
379
- env.addFilter("jsDocblock", jsDocblock);
380
- return env.render(template, context);
381
- };
382
-
383
- // src/fragments/common.ts
384
- function fragment(render2, imports) {
385
- return new Fragment(render2, imports);
386
- }
387
- function fragmentFromTemplate(fragmentFile, context, options) {
388
- return fragment(render((0, import_node_path2.join)("fragments", fragmentFile), context, options));
417
+ // src/TypeManifest.ts
418
+ function typeManifest(input = {}) {
419
+ return Object.freeze({
420
+ decoder: fragment(""),
421
+ encoder: fragment(""),
422
+ isEnum: false,
423
+ looseType: fragment(""),
424
+ strictType: fragment(""),
425
+ value: fragment(""),
426
+ ...input
427
+ });
389
428
  }
390
- function mergeFragments(fragments, mergeRenders) {
391
- return new Fragment(
392
- mergeRenders(fragments.map((f) => f.render)),
393
- new ImportMap().mergeWith(...fragments),
394
- new Set(fragments.flatMap((f) => [...f.features]))
395
- );
429
+ function mergeTypeManifests(manifests, options = {}) {
430
+ const { mergeTypes, mergeCodecs, mergeValues } = options;
431
+ const merge = (fragmentFn, mergeFn) => mergeFn ? mergeFragments(manifests.map(fragmentFn), mergeFn) : fragment("");
432
+ return Object.freeze({
433
+ decoder: merge((m) => m.decoder, mergeCodecs),
434
+ encoder: merge((m) => m.encoder, mergeCodecs),
435
+ isEnum: false,
436
+ looseType: merge((m) => m.looseType, mergeTypes),
437
+ strictType: merge((m) => m.strictType, mergeTypes),
438
+ value: merge((m) => m.value, mergeValues)
439
+ });
396
440
  }
397
- var Fragment = class _Fragment {
398
- render;
399
- imports;
400
- features;
401
- constructor(render2, imports, features) {
402
- this.render = render2;
403
- this.imports = imports ? new ImportMap().mergeWith(imports) : new ImportMap();
404
- this.features = /* @__PURE__ */ new Set([...features ?? []]);
405
- }
406
- setRender(render2) {
407
- this.render = render2;
408
- return this;
409
- }
410
- mapRender(fn) {
411
- this.render = fn(this.render);
412
- return this;
413
- }
414
- addImports(module2, imports) {
415
- this.imports.add(module2, imports);
416
- return this;
417
- }
418
- removeImports(module2, imports) {
419
- this.imports.remove(module2, imports);
420
- return this;
421
- }
422
- mergeImportsWith(...others) {
423
- this.imports.mergeWith(...others);
424
- return this;
425
- }
426
- addImportAlias(module2, name, alias) {
427
- this.imports.addAlias(module2, name, alias);
428
- return this;
429
- }
430
- addFeatures(features) {
431
- const featureArray = typeof features === "string" ? [features] : features;
432
- featureArray.forEach((f) => this.features.add(f));
433
- return this;
434
- }
435
- removeFeatures(features) {
436
- const featureArray = typeof features === "string" ? [features] : features;
437
- featureArray.forEach((f) => this.features.delete(f));
438
- return this;
439
- }
440
- hasFeatures(features) {
441
- const featureArray = typeof features === "string" ? [features] : features;
442
- return featureArray.every((f) => this.features.has(f));
443
- }
444
- mergeFeaturesWith(...others) {
445
- others.forEach((f) => this.addFeatures([...f.features]));
446
- return this;
447
- }
448
- clone() {
449
- return new _Fragment(this.render).mergeImportsWith(this.imports);
450
- }
451
- toString() {
452
- return this.render;
453
- }
454
- };
441
+
442
+ // src/getRenderMapVisitor.ts
443
+ var import_node_path2 = require("path");
444
+ var import_errors2 = require("@codama/errors");
445
+ var import_nodes26 = require("@codama/nodes");
446
+ var import_renderers_core13 = require("@codama/renderers-core");
447
+ var import_visitors_core31 = require("@codama/visitors-core");
455
448
 
456
449
  // src/fragments/accountFetchHelpers.ts
450
+ var import_visitors_core2 = require("@codama/visitors-core");
457
451
  function getAccountFetchHelpersFragment(scope) {
458
452
  const { accountPath, typeManifest: typeManifest2, nameApi, customAccountData } = scope;
459
453
  const accountNode = (0, import_visitors_core2.getLastNodeFromPath)(accountPath);
460
454
  const hasCustomData = customAccountData.has(accountNode.name);
461
- const accountTypeFragment = hasCustomData ? typeManifest2.strictType.clone() : fragment(nameApi.dataType(accountNode.name));
462
- const decoderFunctionFragment = hasCustomData ? typeManifest2.decoder.clone() : fragment(`${nameApi.decoderFunction(accountNode.name)}()`);
463
- return fragmentFromTemplate("accountFetchHelpers.njk", {
464
- accountType: accountTypeFragment.render,
465
- decodeFunction: nameApi.accountDecodeFunction(accountNode.name),
466
- decoderFunction: decoderFunctionFragment.render,
467
- fetchAllFunction: nameApi.accountFetchAllFunction(accountNode.name),
468
- fetchAllMaybeFunction: nameApi.accountFetchAllMaybeFunction(accountNode.name),
469
- fetchFunction: nameApi.accountFetchFunction(accountNode.name),
470
- fetchMaybeFunction: nameApi.accountFetchMaybeFunction(accountNode.name)
471
- }).mergeImportsWith(accountTypeFragment, decoderFunctionFragment).addImports("solanaAddresses", ["type Address"]).addImports("solanaAccounts", [
472
- "type Account",
473
- "assertAccountExists",
474
- "assertAccountsExist",
475
- "decodeAccount",
476
- "type EncodedAccount",
477
- "fetchEncodedAccount",
478
- "fetchEncodedAccounts",
479
- "type FetchAccountConfig",
480
- "type FetchAccountsConfig",
481
- "type MaybeAccount",
482
- "type MaybeEncodedAccount"
483
- ]);
455
+ const accountTypeFragment = hasCustomData ? typeManifest2.strictType : fragment(nameApi.dataType(accountNode.name));
456
+ const decoderFunctionFragment = hasCustomData ? typeManifest2.decoder : fragment(`${nameApi.decoderFunction(accountNode.name)}()`);
457
+ return (0, import_visitors_core2.pipe)(
458
+ fragmentFromTemplate("accountFetchHelpers.njk", {
459
+ accountType: accountTypeFragment.content,
460
+ decodeFunction: nameApi.accountDecodeFunction(accountNode.name),
461
+ decoderFunction: decoderFunctionFragment.content,
462
+ fetchAllFunction: nameApi.accountFetchAllFunction(accountNode.name),
463
+ fetchAllMaybeFunction: nameApi.accountFetchAllMaybeFunction(accountNode.name),
464
+ fetchFunction: nameApi.accountFetchFunction(accountNode.name),
465
+ fetchMaybeFunction: nameApi.accountFetchMaybeFunction(accountNode.name)
466
+ }),
467
+ (f) => mergeFragmentImports(f, [accountTypeFragment.imports, decoderFunctionFragment.imports]),
468
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"]),
469
+ (f) => addFragmentImports(f, "solanaAccounts", [
470
+ "type Account",
471
+ "assertAccountExists",
472
+ "assertAccountsExist",
473
+ "decodeAccount",
474
+ "type EncodedAccount",
475
+ "fetchEncodedAccount",
476
+ "fetchEncodedAccounts",
477
+ "type FetchAccountConfig",
478
+ "type FetchAccountsConfig",
479
+ "type MaybeAccount",
480
+ "type MaybeEncodedAccount"
481
+ ])
482
+ );
484
483
  }
485
484
 
486
485
  // src/fragments/accountPdaHelpers.ts
@@ -494,27 +493,33 @@ function getAccountPdaHelpersFragment(scope) {
494
493
  if (!pdaNode) {
495
494
  return fragment("");
496
495
  }
497
- const accountTypeFragment = customAccountData.has(accountNode.name) ? typeManifest2.strictType.clone() : fragment(nameApi.dataType(accountNode.name));
496
+ const accountTypeFragment = customAccountData.has(accountNode.name) ? typeManifest2.strictType : fragment(nameApi.dataType(accountNode.name));
498
497
  const importFrom = "generatedPdas";
499
498
  const pdaSeedsType = nameApi.pdaSeedsType(pdaNode.name);
500
499
  const findPdaFunction = nameApi.pdaFindFunction(pdaNode.name);
501
500
  const hasVariableSeeds = pdaNode.seeds.filter((0, import_nodes4.isNodeFilter)("variablePdaSeedNode")).length > 0;
502
- return fragmentFromTemplate("accountPdaHelpers.njk", {
503
- accountType: accountTypeFragment.render,
504
- fetchFromSeedsFunction: nameApi.accountFetchFromSeedsFunction(accountNode.name),
505
- fetchFunction: nameApi.accountFetchFunction(accountNode.name),
506
- fetchMaybeFromSeedsFunction: nameApi.accountFetchMaybeFromSeedsFunction(accountNode.name),
507
- fetchMaybeFunction: nameApi.accountFetchMaybeFunction(accountNode.name),
508
- findPdaFunction,
509
- hasVariableSeeds,
510
- pdaSeedsType,
511
- program: programNode
512
- }).mergeImportsWith(accountTypeFragment).addImports(importFrom, hasVariableSeeds ? [pdaSeedsType, findPdaFunction] : [findPdaFunction]).addImports("solanaAddresses", ["type Address"]).addImports("solanaAccounts", [
513
- "type Account",
514
- "assertAccountExists",
515
- "type FetchAccountConfig",
516
- "type MaybeAccount"
517
- ]);
501
+ return (0, import_visitors_core3.pipe)(
502
+ fragmentFromTemplate("accountPdaHelpers.njk", {
503
+ accountType: accountTypeFragment.content,
504
+ fetchFromSeedsFunction: nameApi.accountFetchFromSeedsFunction(accountNode.name),
505
+ fetchFunction: nameApi.accountFetchFunction(accountNode.name),
506
+ fetchMaybeFromSeedsFunction: nameApi.accountFetchMaybeFromSeedsFunction(accountNode.name),
507
+ fetchMaybeFunction: nameApi.accountFetchMaybeFunction(accountNode.name),
508
+ findPdaFunction,
509
+ hasVariableSeeds,
510
+ pdaSeedsType,
511
+ program: programNode
512
+ }),
513
+ (f) => mergeFragmentImports(f, [accountTypeFragment.imports]),
514
+ (f) => addFragmentImports(f, importFrom, hasVariableSeeds ? [pdaSeedsType, findPdaFunction] : [findPdaFunction]),
515
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"]),
516
+ (f) => addFragmentImports(f, "solanaAccounts", [
517
+ "type Account",
518
+ "assertAccountExists",
519
+ "type FetchAccountConfig",
520
+ "type MaybeAccount"
521
+ ])
522
+ );
518
523
  }
519
524
 
520
525
  // src/fragments/accountSizeHelpers.ts
@@ -533,55 +538,68 @@ function getAccountSizeHelpersFragment(scope) {
533
538
 
534
539
  // src/fragments/accountType.ts
535
540
  var import_nodes7 = require("@codama/nodes");
536
- var import_visitors_core5 = require("@codama/visitors-core");
541
+ var import_visitors_core9 = require("@codama/visitors-core");
537
542
 
538
543
  // src/fragments/type.ts
544
+ var import_visitors_core5 = require("@codama/visitors-core");
539
545
  function getTypeFragment(scope) {
540
546
  const { name, manifest, nameApi, docs = [] } = scope;
541
- const typeFragment = fragmentFromTemplate("type.njk", {
542
- docs,
543
- looseName: nameApi.dataArgsType(name),
544
- manifest,
545
- strictName: nameApi.dataType(name)
546
- });
547
- if (!manifest.isEnum) {
548
- typeFragment.mergeImportsWith(manifest.strictType, manifest.looseType);
549
- }
550
- return typeFragment;
547
+ return (0, import_visitors_core5.pipe)(
548
+ fragmentFromTemplate("type.njk", {
549
+ docs,
550
+ looseName: nameApi.dataArgsType(name),
551
+ manifest,
552
+ strictName: nameApi.dataType(name)
553
+ }),
554
+ (f) => !manifest.isEnum ? mergeFragmentImports(f, [manifest.strictType.imports, manifest.looseType.imports]) : f
555
+ );
551
556
  }
552
557
 
558
+ // src/fragments/typeCodec.ts
559
+ var import_visitors_core8 = require("@codama/visitors-core");
560
+
553
561
  // src/fragments/typeDecoder.ts
554
562
  var import_nodes5 = require("@codama/nodes");
563
+ var import_visitors_core6 = require("@codama/visitors-core");
555
564
  function getTypeDecoderFragment(scope) {
556
565
  const { name, node, manifest, nameApi, docs = [] } = scope;
557
566
  const decoderType = typeof scope.size === "number" ? "FixedSizeDecoder" : "Decoder";
558
567
  const useTypeCast = (0, import_nodes5.isNode)(node, "enumTypeNode") && (0, import_nodes5.isDataEnum)(node) && typeof scope.size === "number";
559
- return fragmentFromTemplate("typeDecoder.njk", {
560
- decoderFunction: nameApi.decoderFunction(name),
561
- decoderType,
562
- docs,
563
- looseName: nameApi.dataArgsType(name),
564
- manifest,
565
- strictName: nameApi.dataType(name),
566
- useTypeCast
567
- }).mergeImportsWith(manifest.decoder).addImports("solanaCodecsCore", `type ${decoderType}`);
568
+ return (0, import_visitors_core6.pipe)(
569
+ fragmentFromTemplate("typeDecoder.njk", {
570
+ decoderFunction: nameApi.decoderFunction(name),
571
+ decoderType,
572
+ docs,
573
+ looseName: nameApi.dataArgsType(name),
574
+ manifest,
575
+ strictName: nameApi.dataType(name),
576
+ useTypeCast
577
+ }),
578
+ (f) => mergeFragmentImports(f, [manifest.decoder.imports]),
579
+ (f) => addFragmentImports(f, "solanaCodecsCore", [`type ${decoderType}`])
580
+ );
568
581
  }
569
582
 
570
583
  // src/fragments/typeEncoder.ts
571
584
  var import_nodes6 = require("@codama/nodes");
585
+ var import_visitors_core7 = require("@codama/visitors-core");
572
586
  function getTypeEncoderFragment(scope) {
573
587
  const { name, node, manifest, nameApi, docs = [] } = scope;
574
588
  const encoderType = typeof scope.size === "number" ? "FixedSizeEncoder" : "Encoder";
575
589
  const useTypeCast = (0, import_nodes6.isNode)(node, "enumTypeNode") && (0, import_nodes6.isDataEnum)(node) && typeof scope.size === "number";
576
- return fragmentFromTemplate("typeEncoder.njk", {
577
- docs,
578
- encoderFunction: nameApi.encoderFunction(name),
579
- encoderType,
580
- looseName: nameApi.dataArgsType(name),
581
- manifest,
582
- strictName: nameApi.dataType(name),
583
- useTypeCast
584
- }).mergeImportsWith(manifest.encoder).addImports("solanaCodecsCore", `type ${encoderType}`);
590
+ return (0, import_visitors_core7.pipe)(
591
+ fragmentFromTemplate("typeEncoder.njk", {
592
+ docs,
593
+ encoderFunction: nameApi.encoderFunction(name),
594
+ encoderType,
595
+ looseName: nameApi.dataArgsType(name),
596
+ manifest,
597
+ strictName: nameApi.dataType(name),
598
+ useTypeCast
599
+ }),
600
+ (f) => mergeFragmentImports(f, [manifest.encoder.imports]),
601
+ (f) => addFragmentImports(f, "solanaCodecsCore", [`type ${encoderType}`])
602
+ );
585
603
  }
586
604
 
587
605
  // src/fragments/typeCodec.ts
@@ -592,16 +610,19 @@ function getTypeCodecFragment(scope) {
592
610
  [
593
611
  getTypeEncoderFragment({ ...scope, docs: scope.encoderDocs }),
594
612
  getTypeDecoderFragment({ ...scope, docs: scope.decoderDocs }),
595
- fragmentFromTemplate("typeCodec.njk", {
596
- codecFunction: nameApi.codecFunction(name),
597
- codecType,
598
- decoderFunction: nameApi.decoderFunction(name),
599
- docs: scope.codecDocs,
600
- encoderFunction: nameApi.encoderFunction(name),
601
- looseName: nameApi.dataArgsType(name),
602
- manifest,
603
- strictName: nameApi.dataType(name)
604
- }).addImports("solanaCodecsCore", [`type ${codecType}`, "combineCodec"])
613
+ (0, import_visitors_core8.pipe)(
614
+ fragmentFromTemplate("typeCodec.njk", {
615
+ codecFunction: nameApi.codecFunction(name),
616
+ codecType,
617
+ decoderFunction: nameApi.decoderFunction(name),
618
+ docs: scope.codecDocs,
619
+ encoderFunction: nameApi.encoderFunction(name),
620
+ looseName: nameApi.dataArgsType(name),
621
+ manifest,
622
+ strictName: nameApi.dataType(name)
623
+ }),
624
+ (f) => addFragmentImports(f, "solanaCodecsCore", [`type ${codecType}`, "combineCodec"])
625
+ )
605
626
  ],
606
627
  (renders) => renders.join("\n\n")
607
628
  );
@@ -618,7 +639,7 @@ function getTypeWithCodecFragment(scope) {
618
639
  // src/fragments/accountType.ts
619
640
  function getAccountTypeFragment(scope) {
620
641
  const { accountPath, typeManifest: typeManifest2, nameApi, customAccountData } = scope;
621
- const accountNode = (0, import_visitors_core5.getLastNodeFromPath)(accountPath);
642
+ const accountNode = (0, import_visitors_core9.getLastNodeFromPath)(accountPath);
622
643
  if (customAccountData.has(accountNode.name)) {
623
644
  return fragment("");
624
645
  }
@@ -633,24 +654,28 @@ function getAccountTypeFragment(scope) {
633
654
 
634
655
  // src/fragments/discriminatorCondition.ts
635
656
  var import_nodes8 = require("@codama/nodes");
636
- var import_visitors_core6 = require("@codama/visitors-core");
657
+ var import_renderers_core2 = require("@codama/renderers-core");
658
+ var import_visitors_core10 = require("@codama/visitors-core");
637
659
  var import_codecs_strings2 = require("@solana/codecs-strings");
638
660
  function getDiscriminatorConditionFragment(scope) {
639
- return mergeFragments(
640
- scope.discriminators.flatMap((discriminator) => {
641
- if ((0, import_nodes8.isNode)(discriminator, "sizeDiscriminatorNode")) {
642
- return [getSizeConditionFragment(discriminator, scope)];
643
- }
644
- if ((0, import_nodes8.isNode)(discriminator, "constantDiscriminatorNode")) {
645
- return [getByteConditionFragment(discriminator, scope)];
646
- }
647
- if ((0, import_nodes8.isNode)(discriminator, "fieldDiscriminatorNode")) {
648
- return [getFieldConditionFragment(discriminator, scope)];
649
- }
650
- return [];
651
- }),
652
- (r) => r.join(" && ")
653
- ).mapRender((r) => `if (${r}) { ${scope.ifTrue}; }`);
661
+ return (0, import_visitors_core10.pipe)(
662
+ mergeFragments(
663
+ scope.discriminators.flatMap((discriminator) => {
664
+ if ((0, import_nodes8.isNode)(discriminator, "sizeDiscriminatorNode")) {
665
+ return [getSizeConditionFragment(discriminator, scope)];
666
+ }
667
+ if ((0, import_nodes8.isNode)(discriminator, "constantDiscriminatorNode")) {
668
+ return [getByteConditionFragment(discriminator, scope)];
669
+ }
670
+ if ((0, import_nodes8.isNode)(discriminator, "fieldDiscriminatorNode")) {
671
+ return [getFieldConditionFragment(discriminator, scope)];
672
+ }
673
+ return [];
674
+ }),
675
+ (c) => c.join(" && ")
676
+ ),
677
+ (f) => (0, import_renderers_core2.mapFragmentContent)(f, (c) => `if (${c}) { ${scope.ifTrue}; }`)
678
+ );
654
679
  }
655
680
  function getSizeConditionFragment(discriminator, scope) {
656
681
  const { dataName } = scope;
@@ -658,8 +683,12 @@ function getSizeConditionFragment(discriminator, scope) {
658
683
  }
659
684
  function getByteConditionFragment(discriminator, scope) {
660
685
  const { dataName, typeManifestVisitor } = scope;
661
- const constant = (0, import_visitors_core6.visit)(discriminator.constant, typeManifestVisitor).value;
662
- return constant.mapRender((r) => `containsBytes(${dataName}, ${r}, ${discriminator.offset})`).addImports("solanaCodecsCore", "containsBytes");
686
+ const constant = (0, import_visitors_core10.visit)(discriminator.constant, typeManifestVisitor).value;
687
+ return (0, import_visitors_core10.pipe)(
688
+ constant,
689
+ (f) => (0, import_renderers_core2.mapFragmentContent)(f, (c) => `containsBytes(${dataName}, ${c}, ${discriminator.offset})`),
690
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["containsBytes"])
691
+ );
663
692
  }
664
693
  function getFieldConditionFragment(discriminator, scope) {
665
694
  const field = scope.struct.fields.find((f) => f.name === discriminator.name);
@@ -685,28 +714,43 @@ function getFieldConditionFragment(discriminator, scope) {
685
714
 
686
715
  // src/fragments/instructionAccountMeta.ts
687
716
  var import_nodes9 = require("@codama/nodes");
717
+ var import_visitors_core11 = require("@codama/visitors-core");
688
718
  function getInstructionAccountMetaFragment(instructionAccountNode) {
689
719
  const typeParam = `TAccount${(0, import_nodes9.pascalCase)(instructionAccountNode.name)}`;
690
720
  if (instructionAccountNode.isSigner === true && instructionAccountNode.isWritable) {
691
- return fragment(`WritableSignerAccount<${typeParam}> & AccountSignerMeta<${typeParam}>`).addImports("solanaInstructions", ["type WritableSignerAccount"]).addImports("solanaSigners", ["type AccountSignerMeta"]);
721
+ return (0, import_visitors_core11.pipe)(
722
+ fragment(`WritableSignerAccount<${typeParam}> & AccountSignerMeta<${typeParam}>`),
723
+ (f) => addFragmentImports(f, "solanaInstructions", ["type WritableSignerAccount"]),
724
+ (f) => addFragmentImports(f, "solanaSigners", ["type AccountSignerMeta"])
725
+ );
692
726
  }
693
727
  if (instructionAccountNode.isSigner === true) {
694
- return fragment(`ReadonlySignerAccount<${typeParam}> & AccountSignerMeta<${typeParam}>`).addImports("solanaInstructions", ["type ReadonlySignerAccount"]).addImports("solanaSigners", ["type AccountSignerMeta"]);
728
+ return (0, import_visitors_core11.pipe)(
729
+ fragment(`ReadonlySignerAccount<${typeParam}> & AccountSignerMeta<${typeParam}>`),
730
+ (f) => addFragmentImports(f, "solanaInstructions", ["type ReadonlySignerAccount"]),
731
+ (f) => addFragmentImports(f, "solanaSigners", ["type AccountSignerMeta"])
732
+ );
695
733
  }
696
734
  if (instructionAccountNode.isWritable) {
697
- return fragment(`WritableAccount<${typeParam}>`).addImports("solanaInstructions", "type WritableAccount");
735
+ return (0, import_visitors_core11.pipe)(
736
+ fragment(`WritableAccount<${typeParam}>`),
737
+ (f) => addFragmentImports(f, "solanaInstructions", ["type WritableAccount"])
738
+ );
698
739
  }
699
- return fragment(`ReadonlyAccount<${typeParam}>`).addImports("solanaInstructions", "type ReadonlyAccount");
740
+ return (0, import_visitors_core11.pipe)(
741
+ fragment(`ReadonlyAccount<${typeParam}>`),
742
+ (f) => addFragmentImports(f, "solanaInstructions", ["type ReadonlyAccount"])
743
+ );
700
744
  }
701
745
 
702
746
  // src/fragments/instructionAccountTypeParam.ts
703
747
  var import_nodes10 = require("@codama/nodes");
704
- var import_visitors_core7 = require("@codama/visitors-core");
748
+ var import_visitors_core12 = require("@codama/visitors-core");
705
749
  function getInstructionAccountTypeParamFragment(scope) {
706
750
  const { instructionAccountPath, allowAccountMeta, linkables } = scope;
707
- const instructionAccountNode = (0, import_visitors_core7.getLastNodeFromPath)(instructionAccountPath);
708
- const instructionNode = (0, import_visitors_core7.findInstructionNodeFromPath)(instructionAccountPath);
709
- const programNode = (0, import_visitors_core7.findProgramNodeFromPath)(instructionAccountPath);
751
+ const instructionAccountNode = (0, import_visitors_core12.getLastNodeFromPath)(instructionAccountPath);
752
+ const instructionNode = (0, import_visitors_core12.findInstructionNodeFromPath)(instructionAccountPath);
753
+ const programNode = (0, import_visitors_core12.findProgramNodeFromPath)(instructionAccountPath);
710
754
  const typeParam = `TAccount${(0, import_nodes10.pascalCase)(instructionAccountNode.name)}`;
711
755
  const accountMeta = allowAccountMeta ? " | AccountMeta<string>" : "";
712
756
  const imports = new ImportMap();
@@ -714,10 +758,16 @@ function getInstructionAccountTypeParamFragment(scope) {
714
758
  imports.add("solanaInstructions", "type AccountMeta");
715
759
  }
716
760
  if (instructionNode.optionalAccountStrategy === "omitted" && instructionAccountNode.isOptional) {
717
- return fragment(`${typeParam} extends string${accountMeta} | undefined = undefined`, imports);
761
+ return (0, import_visitors_core12.pipe)(
762
+ fragment(`${typeParam} extends string${accountMeta} | undefined = undefined`),
763
+ (f) => mergeFragmentImports(f, [imports])
764
+ );
718
765
  }
719
766
  const defaultAddress = getDefaultAddress(instructionAccountNode.defaultValue, programNode.publicKey, linkables);
720
- return fragment(`${typeParam} extends string${accountMeta} = ${defaultAddress}`, imports);
767
+ return (0, import_visitors_core12.pipe)(
768
+ fragment(`${typeParam} extends string${accountMeta} = ${defaultAddress}`),
769
+ (f) => mergeFragmentImports(f, [imports])
770
+ );
721
771
  }
722
772
  function getDefaultAddress(defaultValue, programId, linkables) {
723
773
  switch (defaultValue?.kind) {
@@ -735,19 +785,20 @@ function getDefaultAddress(defaultValue, programId, linkables) {
735
785
 
736
786
  // src/fragments/instructionByteDelta.ts
737
787
  var import_nodes11 = require("@codama/nodes");
738
- var import_visitors_core8 = require("@codama/visitors-core");
788
+ var import_renderers_core3 = require("@codama/renderers-core");
789
+ var import_visitors_core13 = require("@codama/visitors-core");
739
790
  function getInstructionByteDeltaFragment(scope) {
740
- const { byteDeltas } = (0, import_visitors_core8.getLastNodeFromPath)(scope.instructionPath);
741
- const fragments = (byteDeltas ?? []).flatMap((r) => getByteDeltaFragment(r, scope));
791
+ const { byteDeltas } = (0, import_visitors_core13.getLastNodeFromPath)(scope.instructionPath);
792
+ const fragments = (byteDeltas ?? []).flatMap((c) => getByteDeltaFragment(c, scope));
742
793
  if (fragments.length === 0) return fragment("");
743
794
  return mergeFragments(
744
795
  fragments,
745
- (r) => `// Bytes created or reallocated by the instruction.
746
- const byteDelta: number = [${r.join(",")}].reduce((a, b) => a + b, 0);`
796
+ (c) => `// Bytes created or reallocated by the instruction.
797
+ const byteDelta: number = [${c.join(",")}].reduce((a, b) => a + b, 0);`
747
798
  );
748
799
  }
749
800
  function getByteDeltaFragment(byteDelta, scope) {
750
- const bytesFragment = (() => {
801
+ let bytesFragment = (() => {
751
802
  if ((0, import_nodes11.isNode)(byteDelta.value, "numberValueNode")) {
752
803
  return getNumberValueNodeFragment(byteDelta);
753
804
  }
@@ -764,10 +815,14 @@ function getByteDeltaFragment(byteDelta, scope) {
764
815
  })();
765
816
  if (bytesFragment === null) return [];
766
817
  if (byteDelta.withHeader) {
767
- bytesFragment.mapRender((r) => `${r} + BASE_ACCOUNT_SIZE`).addImports("solanaAccounts", "BASE_ACCOUNT_SIZE");
818
+ bytesFragment = (0, import_visitors_core13.pipe)(
819
+ bytesFragment,
820
+ (f) => (0, import_renderers_core3.mapFragmentContent)(f, (c) => `${c} + BASE_ACCOUNT_SIZE`),
821
+ (f) => addFragmentImports(f, "solanaAccounts", ["BASE_ACCOUNT_SIZE"])
822
+ );
768
823
  }
769
824
  if (byteDelta.subtract) {
770
- bytesFragment.mapRender((r) => `- (${r})`);
825
+ bytesFragment = (0, import_visitors_core13.pipe)(bytesFragment, (f) => (0, import_renderers_core3.mapFragmentContent)(f, (c) => `- (${c})`));
771
826
  }
772
827
  return [bytesFragment];
773
828
  }
@@ -783,7 +838,8 @@ function getArgumentValueNodeFragment(byteDelta) {
783
838
  function getAccountLinkNodeFragment(byteDelta, scope) {
784
839
  (0, import_nodes11.assertIsNode)(byteDelta.value, "accountLinkNode");
785
840
  const functionName = scope.nameApi.accountGetSizeFunction(byteDelta.value.name);
786
- return fragment(`${functionName}()`).addImports(scope.getImportFrom(byteDelta.value), functionName);
841
+ const module2 = scope.getImportFrom(byteDelta.value);
842
+ return (0, import_visitors_core13.pipe)(fragment(`${functionName}()`), (f) => addFragmentImports(f, module2, [functionName]));
787
843
  }
788
844
  function getResolverValueNodeFragment(byteDelta, scope) {
789
845
  (0, import_nodes11.assertIsNode)(byteDelta.value, "resolverValueNode");
@@ -791,15 +847,20 @@ function getResolverValueNodeFragment(byteDelta, scope) {
791
847
  if (!scope.useAsync && isAsync) return null;
792
848
  const awaitKeyword = scope.useAsync && isAsync ? "await " : "";
793
849
  const functionName = scope.nameApi.resolverFunction(byteDelta.value.name);
794
- return fragment(`${awaitKeyword}${functionName}(resolverScope)`).addImports(scope.getImportFrom(byteDelta.value), functionName).addFeatures(["instruction:resolverScopeVariable"]);
850
+ const module2 = scope.getImportFrom(byteDelta.value);
851
+ return (0, import_visitors_core13.pipe)(
852
+ fragment(`${awaitKeyword}${functionName}(resolverScope)`),
853
+ (f) => addFragmentImports(f, module2, [functionName]),
854
+ (f) => addFragmentFeatures(f, ["instruction:resolverScopeVariable"])
855
+ );
795
856
  }
796
857
 
797
858
  // src/fragments/instructionData.ts
798
859
  var import_nodes12 = require("@codama/nodes");
799
- var import_visitors_core9 = require("@codama/visitors-core");
860
+ var import_visitors_core14 = require("@codama/visitors-core");
800
861
  function getInstructionDataFragment(scope) {
801
862
  const { instructionPath, dataArgsManifest, nameApi, customInstructionData } = scope;
802
- const instructionNode = (0, import_visitors_core9.getLastNodeFromPath)(instructionPath);
863
+ const instructionNode = (0, import_visitors_core14.getLastNodeFromPath)(instructionPath);
803
864
  if (instructionNode.arguments.length === 0 || customInstructionData.has(instructionNode.name)) {
804
865
  return fragment("");
805
866
  }
@@ -815,10 +876,11 @@ function getInstructionDataFragment(scope) {
815
876
 
816
877
  // src/fragments/discriminatorConstants.ts
817
878
  var import_nodes13 = require("@codama/nodes");
818
- var import_visitors_core10 = require("@codama/visitors-core");
879
+ var import_renderers_core4 = require("@codama/renderers-core");
880
+ var import_visitors_core15 = require("@codama/visitors-core");
819
881
  function getDiscriminatorConstantsFragment(scope) {
820
882
  const fragments = scope.discriminatorNodes.map((node) => getDiscriminatorConstantFragment(node, scope)).filter(Boolean);
821
- return mergeFragments(fragments, (r) => r.join("\n\n"));
883
+ return mergeFragments(fragments, (c) => c.join("\n\n"));
822
884
  }
823
885
  function getDiscriminatorConstantFragment(discriminatorNode, scope) {
824
886
  switch (discriminatorNode.kind) {
@@ -835,8 +897,8 @@ function getConstantDiscriminatorConstantFragment(discriminatorNode, scope) {
835
897
  const index = discriminatorNodes.filter((0, import_nodes13.isNodeFilter)("constantDiscriminatorNode")).indexOf(discriminatorNode);
836
898
  const suffix = index <= 0 ? "" : `_${index + 1}`;
837
899
  const name = (0, import_nodes13.camelCase)(`${prefix}_discriminator${suffix}`);
838
- const encoder = (0, import_visitors_core10.visit)(discriminatorNode.constant.type, typeManifestVisitor).encoder;
839
- const value = (0, import_visitors_core10.visit)(discriminatorNode.constant.value, typeManifestVisitor).value;
900
+ const encoder = (0, import_visitors_core15.visit)(discriminatorNode.constant.type, typeManifestVisitor).encoder;
901
+ const value = (0, import_visitors_core15.visit)(discriminatorNode.constant.value, typeManifestVisitor).value;
840
902
  return getConstantFragment({ ...scope, encoder, name, value });
841
903
  }
842
904
  function getFieldDiscriminatorConstantFragment(discriminatorNode, scope) {
@@ -846,8 +908,8 @@ function getFieldDiscriminatorConstantFragment(discriminatorNode, scope) {
846
908
  return null;
847
909
  }
848
910
  const name = (0, import_nodes13.camelCase)(`${prefix}_${discriminatorNode.name}`);
849
- const encoder = (0, import_visitors_core10.visit)(field.type, typeManifestVisitor).encoder;
850
- const value = (0, import_visitors_core10.visit)(field.defaultValue, typeManifestVisitor).value;
911
+ const encoder = (0, import_visitors_core15.visit)(field.type, typeManifestVisitor).encoder;
912
+ const value = (0, import_visitors_core15.visit)(field.defaultValue, typeManifestVisitor).value;
851
913
  return getConstantFragment({ ...scope, encoder, name, value });
852
914
  }
853
915
  function getConstantFragment(scope) {
@@ -856,40 +918,49 @@ function getConstantFragment(scope) {
856
918
  const constantFunction = nameApi.constantFunction(name);
857
919
  return mergeFragments(
858
920
  [
859
- value.mapRender((r) => `export const ${constantName} = ${r};`),
860
- encoder.mapRender((r) => `export function ${constantFunction}() { return ${r}.encode(${constantName}); }`)
921
+ (0, import_renderers_core4.mapFragmentContent)(value, (c) => `export const ${constantName} = ${c};`),
922
+ (0, import_renderers_core4.mapFragmentContent)(
923
+ encoder,
924
+ (c) => `export function ${constantFunction}() { return ${c}.encode(${constantName}); }`
925
+ )
861
926
  ],
862
- (r) => r.join("\n\n")
927
+ (c) => c.join("\n\n")
863
928
  );
864
929
  }
865
930
 
866
931
  // src/fragments/instructionExtraArgs.ts
867
- var import_visitors_core11 = require("@codama/visitors-core");
932
+ var import_visitors_core16 = require("@codama/visitors-core");
868
933
  function getInstructionExtraArgsFragment(scope) {
869
934
  const { instructionPath, extraArgsManifest, nameApi } = scope;
870
- const instructionNode = (0, import_visitors_core11.getLastNodeFromPath)(instructionPath);
935
+ const instructionNode = (0, import_visitors_core16.getLastNodeFromPath)(instructionPath);
871
936
  if ((instructionNode.extraArguments ?? []).length === 0) {
872
937
  return fragment("");
873
938
  }
874
939
  const instructionExtraName = nameApi.instructionExtraType(instructionNode.name);
875
- return fragmentFromTemplate("instructionExtraArgs.njk", {
876
- looseName: nameApi.dataArgsType(instructionExtraName),
877
- manifest: extraArgsManifest,
878
- strictName: nameApi.dataType(instructionExtraName)
879
- }).mergeImportsWith(extraArgsManifest.looseType);
940
+ return (0, import_visitors_core16.pipe)(
941
+ fragmentFromTemplate("instructionExtraArgs.njk", {
942
+ looseName: nameApi.dataArgsType(instructionExtraName),
943
+ manifest: extraArgsManifest,
944
+ strictName: nameApi.dataType(instructionExtraName)
945
+ }),
946
+ (f) => mergeFragmentImports(f, [extraArgsManifest.looseType.imports])
947
+ );
880
948
  }
881
949
 
882
950
  // src/fragments/instructionFunction.ts
883
951
  var import_nodes18 = require("@codama/nodes");
884
- var import_visitors_core16 = require("@codama/visitors-core");
952
+ var import_renderers_core8 = require("@codama/renderers-core");
953
+ var import_visitors_core21 = require("@codama/visitors-core");
885
954
 
886
955
  // src/fragments/instructionInputResolved.ts
887
956
  var import_nodes15 = require("@codama/nodes");
888
- var import_visitors_core13 = require("@codama/visitors-core");
957
+ var import_renderers_core6 = require("@codama/renderers-core");
958
+ var import_visitors_core18 = require("@codama/visitors-core");
889
959
 
890
960
  // src/fragments/instructionInputDefault.ts
891
961
  var import_nodes14 = require("@codama/nodes");
892
- var import_visitors_core12 = require("@codama/visitors-core");
962
+ var import_renderers_core5 = require("@codama/renderers-core");
963
+ var import_visitors_core17 = require("@codama/visitors-core");
893
964
  function getInstructionInputDefaultFragment(scope) {
894
965
  const { input, optionalAccountStrategy, asyncResolvers, useAsync, nameApi, typeManifestVisitor, getImportFrom } = scope;
895
966
  if (!input.defaultValue) {
@@ -919,97 +990,142 @@ accounts.${inputName}.isWritable = ${isWritable ? "true" : "false"}`
919
990
  case "accountValueNode":
920
991
  const name = (0, import_nodes14.camelCase)(defaultValue.name);
921
992
  if (input.kind === "instructionAccountNode" && input.resolvedIsSigner && !input.isSigner) {
922
- return defaultFragment(`expectTransactionSigner(accounts.${name}.value).address`).addImports(
923
- "shared",
924
- "expectTransactionSigner"
993
+ return (0, import_visitors_core17.pipe)(
994
+ defaultFragment(`expectTransactionSigner(accounts.${name}.value).address`),
995
+ (f) => addFragmentImports(f, "shared", ["expectTransactionSigner"])
925
996
  );
926
997
  }
927
998
  if (input.kind === "instructionAccountNode") {
928
- return defaultFragment(`expectSome(accounts.${name}.value)`).addImports("shared", "expectSome");
999
+ return (0, import_visitors_core17.pipe)(
1000
+ defaultFragment(`expectSome(accounts.${name}.value)`),
1001
+ (f) => addFragmentImports(f, "shared", ["expectSome"])
1002
+ );
929
1003
  }
930
- return defaultFragment(`expectAddress(accounts.${name}.value)`).addImports("shared", "expectAddress");
1004
+ return (0, import_visitors_core17.pipe)(
1005
+ defaultFragment(`expectAddress(accounts.${name}.value)`),
1006
+ (f) => addFragmentImports(f, "shared", ["expectAddress"])
1007
+ );
931
1008
  case "pdaValueNode":
932
1009
  if ((0, import_nodes14.isNode)(defaultValue.pda, "pdaNode")) {
933
- const pdaProgram = defaultValue.pda.programId ? fragment(
934
- `'${defaultValue.pda.programId}' as Address<'${defaultValue.pda.programId}'>`
935
- ).addImports("solanaAddresses", "type Address") : fragment("programAddress");
1010
+ const pdaProgram = defaultValue.pda.programId ? (0, import_visitors_core17.pipe)(
1011
+ fragment(`'${defaultValue.pda.programId}' as Address<'${defaultValue.pda.programId}'>`),
1012
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"])
1013
+ ) : fragment("programAddress");
936
1014
  const pdaSeeds2 = defaultValue.pda.seeds.flatMap((seed) => {
937
1015
  if ((0, import_nodes14.isNode)(seed, "constantPdaSeedNode") && (0, import_nodes14.isNode)(seed.value, "programIdValueNode")) {
938
1016
  return [
939
- fragment(`getAddressEncoder().encode(${pdaProgram.render})`).mergeImportsWith(pdaProgram).addImports("solanaAddresses", "getAddressEncoder")
1017
+ (0, import_visitors_core17.pipe)(
1018
+ fragment(`getAddressEncoder().encode(${pdaProgram.content})`),
1019
+ (f) => mergeFragmentImports(f, [pdaProgram.imports]),
1020
+ (f) => addFragmentImports(f, "solanaAddresses", ["getAddressEncoder"])
1021
+ )
940
1022
  ];
941
1023
  }
942
1024
  if ((0, import_nodes14.isNode)(seed, "constantPdaSeedNode") && !(0, import_nodes14.isNode)(seed.value, "programIdValueNode")) {
943
- const typeManifest2 = (0, import_visitors_core12.visit)(seed.type, typeManifestVisitor);
944
- const valueManifest2 = (0, import_visitors_core12.visit)(seed.value, typeManifestVisitor);
1025
+ const typeManifest2 = (0, import_visitors_core17.visit)(seed.type, typeManifestVisitor);
1026
+ const valueManifest2 = (0, import_visitors_core17.visit)(seed.value, typeManifestVisitor);
945
1027
  return [
946
- fragment(
947
- `${typeManifest2.encoder.render}.encode(${valueManifest2.value.render})`
948
- ).mergeImportsWith(typeManifest2.encoder, valueManifest2.value)
1028
+ (0, import_visitors_core17.pipe)(
1029
+ fragment(`${typeManifest2.encoder.content}.encode(${valueManifest2.value.content})`),
1030
+ (f) => mergeFragmentImports(f, [
1031
+ typeManifest2.encoder.imports,
1032
+ valueManifest2.value.imports
1033
+ ])
1034
+ )
949
1035
  ];
950
1036
  }
951
1037
  if ((0, import_nodes14.isNode)(seed, "variablePdaSeedNode")) {
952
- const typeManifest2 = (0, import_visitors_core12.visit)(seed.type, typeManifestVisitor);
1038
+ const typeManifest2 = (0, import_visitors_core17.visit)(seed.type, typeManifestVisitor);
953
1039
  const valueSeed = defaultValue.seeds.find((s) => s.name === seed.name)?.value;
954
1040
  if (!valueSeed) return [];
955
1041
  if ((0, import_nodes14.isNode)(valueSeed, "accountValueNode")) {
956
1042
  return [
957
- fragment(
958
- `${typeManifest2.encoder.render}.encode(expectAddress(accounts.${(0, import_nodes14.camelCase)(valueSeed.name)}.value))`
959
- ).mergeImportsWith(typeManifest2.encoder).addImports("shared", "expectAddress")
1043
+ (0, import_visitors_core17.pipe)(
1044
+ fragment(
1045
+ `${typeManifest2.encoder.content}.encode(expectAddress(accounts.${(0, import_nodes14.camelCase)(valueSeed.name)}.value))`
1046
+ ),
1047
+ (f) => mergeFragmentImports(f, [typeManifest2.encoder.imports]),
1048
+ (f) => addFragmentImports(f, "shared", ["expectAddress"])
1049
+ )
960
1050
  ];
961
1051
  }
962
1052
  if ((0, import_nodes14.isNode)(valueSeed, "argumentValueNode")) {
963
1053
  return [
964
- fragment(
965
- `${typeManifest2.encoder.render}.encode(expectSome(args.${(0, import_nodes14.camelCase)(valueSeed.name)}))`
966
- ).mergeImportsWith(typeManifest2.encoder).addImports("shared", "expectSome")
1054
+ (0, import_visitors_core17.pipe)(
1055
+ fragment(
1056
+ `${typeManifest2.encoder.content}.encode(expectSome(args.${(0, import_nodes14.camelCase)(valueSeed.name)}))`
1057
+ ),
1058
+ (f) => mergeFragmentImports(f, [typeManifest2.encoder.imports]),
1059
+ (f) => addFragmentImports(f, "shared", ["expectSome"])
1060
+ )
967
1061
  ];
968
1062
  }
969
- const valueManifest2 = (0, import_visitors_core12.visit)(valueSeed, typeManifestVisitor);
1063
+ const valueManifest2 = (0, import_visitors_core17.visit)(valueSeed, typeManifestVisitor);
970
1064
  return [
971
- fragment(
972
- `${typeManifest2.encoder.render}.encode(${valueManifest2.value.render})`
973
- ).mergeImportsWith(typeManifest2.encoder, valueManifest2.value)
1065
+ (0, import_visitors_core17.pipe)(
1066
+ fragment(`${typeManifest2.encoder.content}.encode(${valueManifest2.value.content})`),
1067
+ (f) => mergeFragmentImports(f, [
1068
+ typeManifest2.encoder.imports,
1069
+ valueManifest2.value.imports
1070
+ ])
1071
+ )
974
1072
  ];
975
1073
  }
976
1074
  return [];
977
1075
  });
978
- const pdaStatement = mergeFragments([pdaProgram, ...pdaSeeds2], ([p, ...s]) => {
979
- const programAddress2 = p === "programAddress" ? p : `programAddress: ${p}`;
980
- return `await getProgramDerivedAddress({ ${programAddress2}, seeds: [${s.join(", ")}] })`;
981
- }).addImports("solanaAddresses", "getProgramDerivedAddress");
982
- return defaultFragment(pdaStatement.render).mergeImportsWith(pdaStatement);
1076
+ return (0, import_visitors_core17.pipe)(
1077
+ mergeFragments([pdaProgram, ...pdaSeeds2], ([p, ...s]) => {
1078
+ const programAddress2 = p === "programAddress" ? p : `programAddress: ${p}`;
1079
+ return `await getProgramDerivedAddress({ ${programAddress2}, seeds: [${s.join(", ")}] })`;
1080
+ }),
1081
+ (f) => addFragmentImports(f, "solanaAddresses", ["getProgramDerivedAddress"]),
1082
+ (f) => (0, import_renderers_core5.mapFragmentContent)(f, (c) => defaultFragment(c).content)
1083
+ );
983
1084
  }
984
1085
  const pdaFunction = nameApi.pdaFindFunction(defaultValue.pda.name);
985
1086
  const pdaArgs = [];
986
1087
  const pdaSeeds = defaultValue.seeds.map((seed) => {
987
1088
  if ((0, import_nodes14.isNode)(seed.value, "accountValueNode")) {
988
- return fragment(
989
- `${seed.name}: expectAddress(accounts.${(0, import_nodes14.camelCase)(seed.value.name)}.value)`
990
- ).addImports("shared", "expectAddress");
1089
+ return (0, import_visitors_core17.pipe)(
1090
+ fragment(`${seed.name}: expectAddress(accounts.${(0, import_nodes14.camelCase)(seed.value.name)}.value)`),
1091
+ (f) => addFragmentImports(f, "shared", ["expectAddress"])
1092
+ );
991
1093
  }
992
1094
  if ((0, import_nodes14.isNode)(seed.value, "argumentValueNode")) {
993
- return fragment(`${seed.name}: expectSome(args.${(0, import_nodes14.camelCase)(seed.value.name)})`).addImports(
994
- "shared",
995
- "expectSome"
1095
+ return (0, import_visitors_core17.pipe)(
1096
+ fragment(`${seed.name}: expectSome(args.${(0, import_nodes14.camelCase)(seed.value.name)})`),
1097
+ (f) => addFragmentImports(f, "shared", ["expectSome"])
996
1098
  );
997
1099
  }
998
- return (0, import_visitors_core12.visit)(seed.value, typeManifestVisitor).value.mapRender((r) => `${seed.name}: ${r}`);
1100
+ return (0, import_visitors_core17.pipe)(
1101
+ (0, import_visitors_core17.visit)(seed.value, typeManifestVisitor).value,
1102
+ (f) => (0, import_renderers_core5.mapFragmentContent)(f, (c) => `${seed.name}: ${c}`)
1103
+ );
999
1104
  });
1000
- const pdaSeedsFragment = mergeFragments(pdaSeeds, (renders) => renders.join(", ")).mapRender((r) => `{ ${r} }`);
1105
+ const pdaSeedsFragment = (0, import_visitors_core17.pipe)(
1106
+ mergeFragments(pdaSeeds, (renders) => renders.join(", ")),
1107
+ (f) => (0, import_renderers_core5.mapFragmentContent)(f, (c) => `{ ${c} }`)
1108
+ );
1001
1109
  if (pdaSeeds.length > 0) {
1002
- pdaArgs.push(pdaSeedsFragment.render);
1110
+ pdaArgs.push(pdaSeedsFragment.content);
1003
1111
  }
1004
- return defaultFragment(`await ${pdaFunction}(${pdaArgs.join(", ")})`).mergeImportsWith(pdaSeedsFragment).addImports(getImportFrom(defaultValue.pda), pdaFunction);
1112
+ const module2 = getImportFrom(defaultValue.pda);
1113
+ return (0, import_visitors_core17.pipe)(
1114
+ defaultFragment(`await ${pdaFunction}(${pdaArgs.join(", ")})`),
1115
+ (f) => mergeFragmentImports(f, [pdaSeedsFragment.imports]),
1116
+ (f) => addFragmentImports(f, module2, [pdaFunction])
1117
+ );
1005
1118
  case "publicKeyValueNode":
1006
- return defaultFragment(`'${defaultValue.publicKey}' as Address<'${defaultValue.publicKey}'>`).addImports(
1007
- "solanaAddresses",
1008
- "type Address"
1119
+ return (0, import_visitors_core17.pipe)(
1120
+ defaultFragment(`'${defaultValue.publicKey}' as Address<'${defaultValue.publicKey}'>`),
1121
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"])
1009
1122
  );
1010
1123
  case "programLinkNode":
1011
1124
  const programAddress = nameApi.programAddressConstant(defaultValue.name);
1012
- return defaultFragment(programAddress, false).addImports(getImportFrom(defaultValue), programAddress);
1125
+ return (0, import_visitors_core17.pipe)(
1126
+ defaultFragment(programAddress, false),
1127
+ (f) => addFragmentImports(f, getImportFrom(defaultValue), [programAddress])
1128
+ );
1013
1129
  case "programIdValueNode":
1014
1130
  if (optionalAccountStrategy === "programId" && input.kind === "instructionAccountNode" && input.isOptional) {
1015
1131
  return fragment("");
@@ -1019,18 +1135,23 @@ accounts.${inputName}.isWritable = ${isWritable ? "true" : "false"}`
1019
1135
  case "payerValueNode":
1020
1136
  return fragment("");
1021
1137
  case "accountBumpValueNode":
1022
- return defaultFragment(
1023
- `expectProgramDerivedAddress(accounts.${(0, import_nodes14.camelCase)(defaultValue.name)}.value)[1]`
1024
- ).addImports("shared", "expectProgramDerivedAddress");
1138
+ return (0, import_visitors_core17.pipe)(
1139
+ defaultFragment(`expectProgramDerivedAddress(accounts.${(0, import_nodes14.camelCase)(defaultValue.name)}.value)[1]`),
1140
+ (f) => addFragmentImports(f, "shared", ["expectProgramDerivedAddress"])
1141
+ );
1025
1142
  case "argumentValueNode":
1026
- return defaultFragment(`expectSome(args.${(0, import_nodes14.camelCase)(defaultValue.name)})`).addImports(
1027
- "shared",
1028
- "expectSome"
1143
+ return (0, import_visitors_core17.pipe)(
1144
+ defaultFragment(`expectSome(args.${(0, import_nodes14.camelCase)(defaultValue.name)})`),
1145
+ (f) => addFragmentImports(f, "shared", ["expectSome"])
1029
1146
  );
1030
1147
  case "resolverValueNode":
1031
1148
  const resolverFunction = nameApi.resolverFunction(defaultValue.name);
1032
1149
  const resolverAwait = useAsync && asyncResolvers.includes(defaultValue.name) ? "await " : "";
1033
- return defaultFragment(`${resolverAwait}${resolverFunction}(resolverScope)`).addImports(getImportFrom(defaultValue), resolverFunction).addFeatures(["instruction:resolverScopeVariable"]);
1150
+ return (0, import_visitors_core17.pipe)(
1151
+ defaultFragment(`${resolverAwait}${resolverFunction}(resolverScope)`),
1152
+ (f) => addFragmentImports(f, getImportFrom(defaultValue), [resolverFunction]),
1153
+ (f) => addFragmentFeatures(f, ["instruction:resolverScopeVariable"])
1154
+ );
1034
1155
  case "conditionalValueNode":
1035
1156
  const ifTrueRenderer = renderNestedInstructionDefault({
1036
1157
  ...scope,
@@ -1043,49 +1164,56 @@ accounts.${inputName}.isWritable = ${isWritable ? "true" : "false"}`
1043
1164
  if (!ifTrueRenderer && !ifFalseRenderer) {
1044
1165
  return fragment("");
1045
1166
  }
1046
- const conditionalFragment = fragment("");
1167
+ let conditionalFragment = fragment("");
1047
1168
  if (ifTrueRenderer) {
1048
- conditionalFragment.mergeImportsWith(ifTrueRenderer).mergeFeaturesWith(ifTrueRenderer);
1169
+ conditionalFragment = mergeFragments([conditionalFragment, ifTrueRenderer], (c) => c[0]);
1049
1170
  }
1050
1171
  if (ifFalseRenderer) {
1051
- conditionalFragment.mergeImportsWith(ifFalseRenderer).mergeFeaturesWith(ifFalseRenderer);
1172
+ conditionalFragment = mergeFragments([conditionalFragment, ifFalseRenderer], (c) => c[0]);
1052
1173
  }
1053
1174
  const negatedCondition = !ifTrueRenderer;
1054
1175
  let condition = "true";
1055
1176
  if ((0, import_nodes14.isNode)(defaultValue.condition, "resolverValueNode")) {
1056
1177
  const conditionalResolverFunction = nameApi.resolverFunction(defaultValue.condition.name);
1057
- conditionalFragment.addImports(getImportFrom(defaultValue.condition), conditionalResolverFunction).addFeatures(["instruction:resolverScopeVariable"]);
1178
+ const module3 = getImportFrom(defaultValue.condition);
1179
+ conditionalFragment = (0, import_visitors_core17.pipe)(
1180
+ conditionalFragment,
1181
+ (f) => addFragmentImports(f, module3, [conditionalResolverFunction]),
1182
+ (f) => addFragmentFeatures(f, ["instruction:resolverScopeVariable"])
1183
+ );
1058
1184
  const conditionalResolverAwait = useAsync && asyncResolvers.includes(defaultValue.condition.name) ? "await " : "";
1059
1185
  condition = `${conditionalResolverAwait}${conditionalResolverFunction}(resolverScope)`;
1060
1186
  condition = negatedCondition ? `!${condition}` : condition;
1061
1187
  } else {
1062
1188
  const comparedInputName = (0, import_nodes14.isNode)(defaultValue.condition, "accountValueNode") ? `accounts.${(0, import_nodes14.camelCase)(defaultValue.condition.name)}.value` : `args.${(0, import_nodes14.camelCase)(defaultValue.condition.name)}`;
1063
1189
  if (defaultValue.value) {
1064
- const comparedValue = (0, import_visitors_core12.visit)(defaultValue.value, typeManifestVisitor).value;
1065
- conditionalFragment.mergeImportsWith(comparedValue).mergeFeaturesWith(comparedValue);
1190
+ const comparedValue = (0, import_visitors_core17.visit)(defaultValue.value, typeManifestVisitor).value;
1191
+ conditionalFragment = mergeFragments([conditionalFragment, comparedValue], (c) => c[0]);
1066
1192
  const operator = negatedCondition ? "!==" : "===";
1067
- condition = `${comparedInputName} ${operator} ${comparedValue.render}`;
1193
+ condition = `${comparedInputName} ${operator} ${comparedValue.content}`;
1068
1194
  } else {
1069
1195
  condition = negatedCondition ? `!${comparedInputName}` : comparedInputName;
1070
1196
  }
1071
1197
  }
1072
1198
  if (ifTrueRenderer && ifFalseRenderer) {
1073
- return conditionalFragment.setRender(
1199
+ return (0, import_renderers_core5.setFragmentContent)(
1200
+ conditionalFragment,
1074
1201
  `if (${condition}) {
1075
- ${ifTrueRenderer.render}
1202
+ ${ifTrueRenderer.content}
1076
1203
  } else {
1077
- ${ifFalseRenderer.render}
1204
+ ${ifFalseRenderer.content}
1078
1205
  }`
1079
1206
  );
1080
1207
  }
1081
- return conditionalFragment.setRender(
1208
+ return (0, import_renderers_core5.setFragmentContent)(
1209
+ conditionalFragment,
1082
1210
  `if (${condition}) {
1083
- ${ifTrueRenderer ? ifTrueRenderer.render : ifFalseRenderer?.render}
1211
+ ${ifTrueRenderer ? ifTrueRenderer.content : ifFalseRenderer?.content}
1084
1212
  }`
1085
1213
  );
1086
1214
  default:
1087
- const valueManifest = (0, import_visitors_core12.visit)(defaultValue, typeManifestVisitor).value;
1088
- return defaultFragment(valueManifest.render).mergeImportsWith(valueManifest);
1215
+ const valueManifest = (0, import_visitors_core17.visit)(defaultValue, typeManifestVisitor).value;
1216
+ return (0, import_visitors_core17.pipe)(valueManifest, (f) => (0, import_renderers_core5.mapFragmentContent)(f, (c) => defaultFragment(c).content));
1089
1217
  }
1090
1218
  }
1091
1219
  function renderNestedInstructionDefault(scope) {
@@ -1099,21 +1227,22 @@ function renderNestedInstructionDefault(scope) {
1099
1227
 
1100
1228
  // src/fragments/instructionInputResolved.ts
1101
1229
  function getInstructionInputResolvedFragment(scope) {
1102
- const instructionNode = (0, import_visitors_core13.getLastNodeFromPath)(scope.instructionPath);
1230
+ const instructionNode = (0, import_visitors_core18.getLastNodeFromPath)(scope.instructionPath);
1103
1231
  const resolvedInputFragments = scope.resolvedInputs.flatMap((input) => {
1104
1232
  const inputFragment = getInstructionInputDefaultFragment({
1105
1233
  ...scope,
1106
1234
  input,
1107
1235
  optionalAccountStrategy: (0, import_nodes15.parseOptionalAccountStrategy)(instructionNode.optionalAccountStrategy)
1108
1236
  });
1109
- if (!inputFragment.render) return [];
1237
+ if (!inputFragment.content) return [];
1110
1238
  const camelName = (0, import_nodes15.camelCase)(input.name);
1111
1239
  return [
1112
- inputFragment.mapRender(
1113
- (r) => (0, import_nodes15.isNode)(input, "instructionArgumentNode") ? `if (!args.${camelName}) {
1114
- ${r}
1240
+ (0, import_renderers_core6.mapFragmentContent)(
1241
+ inputFragment,
1242
+ (c) => (0, import_nodes15.isNode)(input, "instructionArgumentNode") ? `if (!args.${camelName}) {
1243
+ ${c}
1115
1244
  }` : `if (!accounts.${camelName}.value) {
1116
- ${r}
1245
+ ${c}
1117
1246
  }`
1118
1247
  )
1119
1248
  ];
@@ -1121,42 +1250,44 @@ ${r}
1121
1250
  if (resolvedInputFragments.length === 0) {
1122
1251
  return fragment("");
1123
1252
  }
1124
- return mergeFragments(
1125
- [fragment("// Resolve default values."), ...resolvedInputFragments],
1126
- (renders) => renders.join("\n")
1127
- );
1253
+ return mergeFragments([fragment("// Resolve default values."), ...resolvedInputFragments], (c) => c.join("\n"));
1128
1254
  }
1129
1255
 
1130
1256
  // src/fragments/instructionInputType.ts
1131
1257
  var import_nodes16 = require("@codama/nodes");
1132
- var import_visitors_core14 = require("@codama/visitors-core");
1258
+ var import_renderers_core7 = require("@codama/renderers-core");
1259
+ var import_visitors_core19 = require("@codama/visitors-core");
1133
1260
  function getInstructionInputTypeFragment(scope) {
1134
1261
  const { instructionPath, useAsync, nameApi } = scope;
1135
- const instructionNode = (0, import_visitors_core14.getLastNodeFromPath)(instructionPath);
1262
+ const instructionNode = (0, import_visitors_core19.getLastNodeFromPath)(instructionPath);
1136
1263
  const instructionInputType = useAsync ? nameApi.instructionAsyncInputType(instructionNode.name) : nameApi.instructionSyncInputType(instructionNode.name);
1137
1264
  const accountsFragment = getAccountsFragment(scope);
1138
1265
  const [dataArgumentsFragment, customDataArgumentsFragment] = getDataArgumentsFragments(scope);
1139
1266
  const extraArgumentsFragment = getExtraArgumentsFragment(scope);
1140
1267
  const remainingAccountsFragment = getRemainingAccountsFragment(instructionNode);
1141
- return fragmentFromTemplate("instructionInputType.njk", {
1142
- accountsFragment,
1143
- customDataArgumentsFragment,
1144
- dataArgumentsFragment,
1145
- extraArgumentsFragment,
1146
- instruction: instructionNode,
1147
- instructionInputType,
1148
- remainingAccountsFragment
1149
- }).mergeImportsWith(
1150
- accountsFragment,
1151
- dataArgumentsFragment,
1152
- customDataArgumentsFragment,
1153
- extraArgumentsFragment,
1154
- remainingAccountsFragment
1155
- ).addImports("solanaAddresses", ["type Address"]);
1268
+ return (0, import_visitors_core19.pipe)(
1269
+ fragmentFromTemplate("instructionInputType.njk", {
1270
+ accountsFragment: accountsFragment.content,
1271
+ customDataArgumentsFragment: customDataArgumentsFragment.content,
1272
+ dataArgumentsFragment: dataArgumentsFragment.content,
1273
+ extraArgumentsFragment: extraArgumentsFragment.content,
1274
+ instruction: instructionNode,
1275
+ instructionInputType,
1276
+ remainingAccountsFragment: remainingAccountsFragment.content
1277
+ }),
1278
+ (f) => mergeFragmentImports(f, [
1279
+ accountsFragment.imports,
1280
+ dataArgumentsFragment.imports,
1281
+ customDataArgumentsFragment.imports,
1282
+ extraArgumentsFragment.imports,
1283
+ remainingAccountsFragment.imports
1284
+ ]),
1285
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"])
1286
+ );
1156
1287
  }
1157
1288
  function getAccountsFragment(scope) {
1158
1289
  const { instructionPath, resolvedInputs, useAsync, asyncResolvers } = scope;
1159
- const instructionNode = (0, import_visitors_core14.getLastNodeFromPath)(instructionPath);
1290
+ const instructionNode = (0, import_visitors_core19.getLastNodeFromPath)(instructionPath);
1160
1291
  const fragments = instructionNode.accounts.map((account) => {
1161
1292
  const resolvedAccount = resolvedInputs.find(
1162
1293
  (input) => input.kind === "instructionAccountNode" && input.name === account.name
@@ -1165,38 +1296,55 @@ function getAccountsFragment(scope) {
1165
1296
  const accountDocs = (0, import_nodes16.parseDocs)(account.docs);
1166
1297
  const docblock = accountDocs.length > 0 ? jsDocblock(accountDocs) : "";
1167
1298
  const optionalSign = hasDefaultValue || resolvedAccount.isOptional ? "?" : "";
1168
- return getAccountTypeFragment2(resolvedAccount).mapRender(
1169
- (r) => `${docblock}${(0, import_nodes16.camelCase)(account.name)}${optionalSign}: ${r};`
1299
+ return (0, import_renderers_core7.mapFragmentContent)(
1300
+ getAccountTypeFragment2(resolvedAccount),
1301
+ (c) => `${docblock}${(0, import_nodes16.camelCase)(account.name)}${optionalSign}: ${c};`
1170
1302
  );
1171
1303
  });
1172
- return mergeFragments(fragments, (r) => r.join("\n"));
1304
+ return mergeFragments(fragments, (c) => c.join("\n"));
1173
1305
  }
1174
1306
  function getAccountTypeFragment2(account) {
1175
1307
  const typeParam = `TAccount${(0, import_nodes16.pascalCase)(account.name)}`;
1176
1308
  if (account.isPda && account.isSigner === false) {
1177
- return fragment(`ProgramDerivedAddress<${typeParam}>`).addImports("solanaAddresses", [
1178
- "type ProgramDerivedAddress"
1179
- ]);
1309
+ return (0, import_visitors_core19.pipe)(
1310
+ fragment(`ProgramDerivedAddress<${typeParam}>`),
1311
+ (f) => addFragmentImports(f, "solanaAddresses", ["type ProgramDerivedAddress"])
1312
+ );
1180
1313
  }
1181
1314
  if (account.isPda && account.isSigner === "either") {
1182
- return fragment(`ProgramDerivedAddress<${typeParam}> | TransactionSigner<${typeParam}>`).addImports("solanaAddresses", ["type ProgramDerivedAddress"]).addImports("solanaSigners", ["type TransactionSigner"]);
1315
+ return (0, import_visitors_core19.pipe)(
1316
+ fragment(`ProgramDerivedAddress<${typeParam}> | TransactionSigner<${typeParam}>`),
1317
+ (f) => addFragmentImports(f, "solanaAddresses", ["type ProgramDerivedAddress"]),
1318
+ (f) => addFragmentImports(f, "solanaSigners", ["type TransactionSigner"])
1319
+ );
1183
1320
  }
1184
1321
  if (account.isSigner === "either") {
1185
- return fragment(`Address<${typeParam}> | TransactionSigner<${typeParam}>`).addImports("solanaAddresses", ["type Address"]).addImports("solanaSigners", ["type TransactionSigner"]);
1322
+ return (0, import_visitors_core19.pipe)(
1323
+ fragment(`Address<${typeParam}> | TransactionSigner<${typeParam}>`),
1324
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"]),
1325
+ (f) => addFragmentImports(f, "solanaSigners", ["type TransactionSigner"])
1326
+ );
1186
1327
  }
1187
1328
  if (account.isSigner) {
1188
- return fragment(`TransactionSigner<${typeParam}>`).addImports("solanaSigners", ["type TransactionSigner"]);
1329
+ return (0, import_visitors_core19.pipe)(
1330
+ fragment(`TransactionSigner<${typeParam}>`),
1331
+ (f) => addFragmentImports(f, "solanaSigners", ["type TransactionSigner"])
1332
+ );
1189
1333
  }
1190
- return fragment(`Address<${typeParam}>`).addImports("solanaAddresses", ["type Address"]);
1334
+ return (0, import_visitors_core19.pipe)(fragment(`Address<${typeParam}>`), (f) => addFragmentImports(f, "solanaAddresses", ["type Address"]));
1191
1335
  }
1192
1336
  function getDataArgumentsFragments(scope) {
1193
1337
  const { instructionPath, nameApi } = scope;
1194
- const instructionNode = (0, import_visitors_core14.getLastNodeFromPath)(instructionPath);
1338
+ const instructionNode = (0, import_visitors_core19.getLastNodeFromPath)(instructionPath);
1195
1339
  const customData = scope.customInstructionData.get(instructionNode.name);
1196
1340
  if (customData) {
1197
1341
  return [
1198
1342
  fragment(""),
1199
- fragment(nameApi.dataArgsType(customData.importAs)).mergeImportsWith(scope.dataArgsManifest.looseType).mapRender((r) => `${r} & `)
1343
+ (0, import_visitors_core19.pipe)(
1344
+ fragment(nameApi.dataArgsType(customData.importAs)),
1345
+ (f) => mergeFragmentImports(f, [scope.dataArgsManifest.looseType.imports]),
1346
+ (f) => (0, import_renderers_core7.mapFragmentContent)(f, (c) => `${c} & `)
1347
+ )
1200
1348
  ];
1201
1349
  }
1202
1350
  const instructionDataName = nameApi.instructionDataType(instructionNode.name);
@@ -1205,18 +1353,18 @@ function getDataArgumentsFragments(scope) {
1205
1353
  const argFragment = getArgumentFragment(arg, fragment(dataArgsType), scope.resolvedInputs, scope.renamedArgs);
1206
1354
  return argFragment ? [argFragment] : [];
1207
1355
  });
1208
- return [mergeFragments(fragments, (r) => r.join("\n")), fragment("")];
1356
+ return [mergeFragments(fragments, (c) => c.join("\n")), fragment("")];
1209
1357
  }
1210
1358
  function getExtraArgumentsFragment(scope) {
1211
1359
  const { instructionPath, nameApi } = scope;
1212
- const instructionNode = (0, import_visitors_core14.getLastNodeFromPath)(instructionPath);
1360
+ const instructionNode = (0, import_visitors_core19.getLastNodeFromPath)(instructionPath);
1213
1361
  const instructionExtraName = nameApi.instructionExtraType(instructionNode.name);
1214
1362
  const extraArgsType = nameApi.dataArgsType(instructionExtraName);
1215
1363
  const fragments = (instructionNode.extraArguments ?? []).flatMap((arg) => {
1216
1364
  const argFragment = getArgumentFragment(arg, fragment(extraArgsType), scope.resolvedInputs, scope.renamedArgs);
1217
1365
  return argFragment ? [argFragment] : [];
1218
1366
  });
1219
- return mergeFragments(fragments, (r) => r.join("\n"));
1367
+ return mergeFragments(fragments, (c) => c.join("\n"));
1220
1368
  }
1221
1369
  function getArgumentFragment(arg, argsType, resolvedInputs, renamedArgs) {
1222
1370
  const resolvedArg = resolvedInputs.find(
@@ -1225,7 +1373,10 @@ function getArgumentFragment(arg, argsType, resolvedInputs, renamedArgs) {
1225
1373
  if (arg.defaultValue && arg.defaultValueStrategy === "omitted") return null;
1226
1374
  const renamedName = renamedArgs.get(arg.name) ?? arg.name;
1227
1375
  const optionalSign = arg.defaultValue || resolvedArg?.defaultValue ? "?" : "";
1228
- return argsType.mapRender((r) => `${(0, import_nodes16.camelCase)(renamedName)}${optionalSign}: ${r}["${(0, import_nodes16.camelCase)(arg.name)}"];`);
1376
+ return (0, import_renderers_core7.mapFragmentContent)(
1377
+ argsType,
1378
+ (c) => `${(0, import_nodes16.camelCase)(renamedName)}${optionalSign}: ${c}["${(0, import_nodes16.camelCase)(arg.name)}"];`
1379
+ );
1229
1380
  }
1230
1381
  function getRemainingAccountsFragment(instructionNode) {
1231
1382
  const fragments = (instructionNode.remainingAccounts ?? []).flatMap((remainingAccountsNode) => {
@@ -1236,30 +1387,42 @@ function getRemainingAccountsFragment(instructionNode) {
1236
1387
  if (argumentExists) return [];
1237
1388
  const isSigner = remainingAccountsNode.isSigner ?? false;
1238
1389
  const optionalSign = remainingAccountsNode.isOptional ?? false ? "?" : "";
1239
- const signerFragment = fragment(`TransactionSigner`).addImports("solanaSigners", ["type TransactionSigner"]);
1240
- const addressFragment = fragment(`Address`).addImports("solanaAddresses", ["type Address"]);
1241
- return (() => {
1242
- if (isSigner === "either") {
1243
- return mergeFragments([signerFragment, addressFragment], (r) => r.join(" | "));
1244
- }
1245
- return isSigner ? signerFragment : addressFragment;
1246
- })().mapRender((r) => `${(0, import_nodes16.camelCase)(name)}${optionalSign}: Array<${r}>;`);
1390
+ const signerFragment = (0, import_visitors_core19.pipe)(
1391
+ fragment(`TransactionSigner`),
1392
+ (f) => addFragmentImports(f, "solanaSigners", ["type TransactionSigner"])
1393
+ );
1394
+ const addressFragment = (0, import_visitors_core19.pipe)(
1395
+ fragment(`Address`),
1396
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"])
1397
+ );
1398
+ return (0, import_renderers_core7.mapFragmentContent)(
1399
+ (() => {
1400
+ if (isSigner === "either") {
1401
+ return mergeFragments([signerFragment, addressFragment], (c) => c.join(" | "));
1402
+ }
1403
+ return isSigner ? signerFragment : addressFragment;
1404
+ })(),
1405
+ (c) => `${(0, import_nodes16.camelCase)(name)}${optionalSign}: Array<${c}>;`
1406
+ );
1247
1407
  });
1248
- return mergeFragments(fragments, (r) => r.join("\n"));
1408
+ return mergeFragments(fragments, (c) => c.join("\n"));
1249
1409
  }
1250
1410
 
1251
1411
  // src/fragments/instructionRemainingAccounts.ts
1252
1412
  var import_nodes17 = require("@codama/nodes");
1253
- var import_visitors_core15 = require("@codama/visitors-core");
1413
+ var import_visitors_core20 = require("@codama/visitors-core");
1254
1414
  function getInstructionRemainingAccountsFragment(scope) {
1255
- const { remainingAccounts } = (0, import_visitors_core15.getLastNodeFromPath)(scope.instructionPath);
1256
- const fragments = (remainingAccounts ?? []).flatMap((r) => getRemainingAccountsFragment2(r, scope));
1415
+ const { remainingAccounts } = (0, import_visitors_core20.getLastNodeFromPath)(scope.instructionPath);
1416
+ const fragments = (remainingAccounts ?? []).flatMap((a) => getRemainingAccountsFragment2(a, scope));
1257
1417
  if (fragments.length === 0) return fragment("");
1258
- return mergeFragments(
1259
- fragments,
1260
- (r) => `// Remaining accounts.
1261
- const remainingAccounts: AccountMeta[] = ${r.length === 1 ? r[0] : `[...${r.join(", ...")}]`}`
1262
- ).addImports("solanaInstructions", ["type AccountMeta"]);
1418
+ return (0, import_visitors_core20.pipe)(
1419
+ mergeFragments(
1420
+ fragments,
1421
+ (c) => `// Remaining accounts.
1422
+ const remainingAccounts: AccountMeta[] = ${c.length === 1 ? c[0] : `[...${c.join(", ...")}]`}`
1423
+ ),
1424
+ (f) => addFragmentImports(f, "solanaInstructions", ["type AccountMeta"])
1425
+ );
1263
1426
  }
1264
1427
  function getRemainingAccountsFragment2(remainingAccounts, scope) {
1265
1428
  const remainingAccountsFragment = (() => {
@@ -1275,7 +1438,7 @@ function getRemainingAccountsFragment2(remainingAccounts, scope) {
1275
1438
  return [remainingAccountsFragment];
1276
1439
  }
1277
1440
  function getArgumentValueNodeFragment2(remainingAccounts, scope) {
1278
- const instructionNode = (0, import_visitors_core15.getLastNodeFromPath)(scope.instructionPath);
1441
+ const instructionNode = (0, import_visitors_core20.getLastNodeFromPath)(scope.instructionPath);
1279
1442
  (0, import_nodes17.assertIsNode)(remainingAccounts.value, "argumentValueNode");
1280
1443
  const argumentName = (0, import_nodes17.camelCase)(remainingAccounts.value.name);
1281
1444
  const isOptional = remainingAccounts.isOptional ?? false;
@@ -1288,22 +1451,27 @@ function getArgumentValueNodeFragment2(remainingAccounts, scope) {
1288
1451
  const allArguments = (0, import_nodes17.getAllInstructionArguments)(instructionNode);
1289
1452
  const argumentExists = allArguments.some((arg) => arg.name === remainingAccounts.value.name);
1290
1453
  if (argumentExists || isSigner === false) {
1291
- return fragment(`${argumentArray}.map((address) => ({ address, role: ${role} }))`).addImports(
1292
- "solanaInstructions",
1293
- ["AccountRole"]
1454
+ return (0, import_visitors_core20.pipe)(
1455
+ fragment(`${argumentArray}.map((address) => ({ address, role: ${role} }))`),
1456
+ (f) => addFragmentImports(f, "solanaInstructions", ["AccountRole"])
1294
1457
  );
1295
1458
  }
1296
1459
  if (isSigner === "either") {
1297
- return fragment(
1298
- `${argumentArray}.map((addressOrSigner) => (isTransactionSigner(addressOrSigner)
1460
+ return (0, import_visitors_core20.pipe)(
1461
+ fragment(
1462
+ `${argumentArray}.map((addressOrSigner) => (isTransactionSigner(addressOrSigner)
1299
1463
  ? { address: addressOrSigner.address, role: ${role}, signer: addressOrSigner }
1300
1464
  : { address: addressOrSigner, role: ${role} }
1301
1465
  ))`
1302
- ).addImports("solanaInstructions", ["AccountRole"]).addImports("shared", ["isTransactionSigner"]);
1466
+ ),
1467
+ (f) => addFragmentImports(f, "solanaInstructions", ["AccountRole"]),
1468
+ (f) => addFragmentImports(f, "shared", ["isTransactionSigner"])
1469
+ );
1303
1470
  }
1304
- return fragment(
1305
- `${argumentArray}.map((signer) => ({ address: signer.address, role: ${signerRole}, signer }))`
1306
- ).addImports("solanaInstructions", ["AccountRole"]);
1471
+ return (0, import_visitors_core20.pipe)(
1472
+ fragment(`${argumentArray}.map((signer) => ({ address: signer.address, role: ${signerRole}, signer }))`),
1473
+ (f) => addFragmentImports(f, "solanaInstructions", ["AccountRole"])
1474
+ );
1307
1475
  }
1308
1476
  function getResolverValueNodeFragment2(remainingAccounts, scope) {
1309
1477
  (0, import_nodes17.assertIsNode)(remainingAccounts.value, "resolverValueNode");
@@ -1311,7 +1479,12 @@ function getResolverValueNodeFragment2(remainingAccounts, scope) {
1311
1479
  if (!scope.useAsync && isAsync) return null;
1312
1480
  const awaitKeyword = scope.useAsync && isAsync ? "await " : "";
1313
1481
  const functionName = scope.nameApi.resolverFunction(remainingAccounts.value.name);
1314
- return fragment(`${awaitKeyword}${functionName}(resolverScope)`).addImports(scope.getImportFrom(remainingAccounts.value), functionName).addFeatures(["instruction:resolverScopeVariable"]);
1482
+ const module2 = scope.getImportFrom(remainingAccounts.value);
1483
+ return (0, import_visitors_core20.pipe)(
1484
+ fragment(`${awaitKeyword}${functionName}(resolverScope)`),
1485
+ (f) => addFragmentImports(f, module2, [functionName]),
1486
+ (f) => addFragmentFeatures(f, ["instruction:resolverScopeVariable"])
1487
+ );
1315
1488
  }
1316
1489
 
1317
1490
  // src/fragments/instructionFunction.ts
@@ -1326,8 +1499,8 @@ function getInstructionFunctionFragment(scope) {
1326
1499
  nameApi,
1327
1500
  customInstructionData
1328
1501
  } = scope;
1329
- const instructionNode = (0, import_visitors_core16.getLastNodeFromPath)(instructionPath);
1330
- const programNode = (0, import_visitors_core16.findProgramNodeFromPath)(instructionPath);
1502
+ const instructionNode = (0, import_visitors_core21.getLastNodeFromPath)(instructionPath);
1503
+ const programNode = (0, import_visitors_core21.findProgramNodeFromPath)(instructionPath);
1331
1504
  if (useAsync && !hasAsyncFunction(instructionNode, resolvedInputs, asyncResolvers)) {
1332
1505
  return fragment("");
1333
1506
  }
@@ -1353,13 +1526,11 @@ function getInstructionFunctionFragment(scope) {
1353
1526
  const hasInput = hasAccounts || hasAnyArgs;
1354
1527
  const instructionDataName = nameApi.instructionDataType(instructionNode.name);
1355
1528
  const programAddressConstant = nameApi.programAddressConstant(programNode.name);
1356
- const encoderFunction = customData ? dataArgsManifest.encoder.render : `${nameApi.encoderFunction(instructionDataName)}()`;
1357
- const argsTypeFragment = fragment(
1358
- customData ? dataArgsManifest.looseType.render : nameApi.dataArgsType(instructionDataName)
1529
+ const encoderFunction = customData ? dataArgsManifest.encoder.content : `${nameApi.encoderFunction(instructionDataName)}()`;
1530
+ const argsTypeFragment = (0, import_visitors_core21.pipe)(
1531
+ fragment(customData ? dataArgsManifest.looseType.content : nameApi.dataArgsType(instructionDataName)),
1532
+ customData ? (f) => mergeFragmentImports(f, [dataArgsManifest.looseType.imports, dataArgsManifest.encoder.imports]) : (f) => f
1359
1533
  );
1360
- if (customData) {
1361
- argsTypeFragment.mergeImportsWith(dataArgsManifest.looseType, dataArgsManifest.encoder);
1362
- }
1363
1534
  const functionName = useAsync ? nameApi.instructionAsyncFunction(instructionNode.name) : nameApi.instructionSyncFunction(instructionNode.name);
1364
1535
  const typeParamsFragment = getTypeParams(instructionNode, programAddressConstant);
1365
1536
  const instructionTypeFragment = getInstructionType(scope);
@@ -1371,11 +1542,11 @@ function getInstructionFunctionFragment(scope) {
1371
1542
  const byteDeltaFragment = getInstructionByteDeltaFragment(scope);
1372
1543
  const resolvedFragment = mergeFragments(
1373
1544
  [resolvedInputsFragment, remainingAccountsFragment, byteDeltaFragment],
1374
- (renders) => renders.join("\n\n")
1545
+ (content) => content.join("\n\n")
1375
1546
  );
1376
- const hasRemainingAccounts = remainingAccountsFragment.render !== "";
1377
- const hasByteDeltas = byteDeltaFragment.render !== "";
1378
- const hasResolver = resolvedFragment.hasFeatures("instruction:resolverScopeVariable");
1547
+ const hasRemainingAccounts = remainingAccountsFragment.content !== "";
1548
+ const hasByteDeltas = byteDeltaFragment.content !== "";
1549
+ const hasResolver = resolvedFragment.features.has("instruction:resolverScopeVariable");
1379
1550
  const getReturnType = (instructionType) => {
1380
1551
  let returnType = instructionType;
1381
1552
  if (hasByteDeltas) {
@@ -1383,54 +1554,59 @@ function getInstructionFunctionFragment(scope) {
1383
1554
  }
1384
1555
  return useAsync ? `Promise<${returnType}>` : returnType;
1385
1556
  };
1386
- const functionFragment = fragmentFromTemplate("instructionFunction.njk", {
1387
- argsTypeFragment,
1388
- encoderFunction,
1389
- functionName,
1390
- getReturnType,
1391
- hasAccounts,
1392
- hasAnyArgs,
1393
- hasByteDeltas,
1394
- hasData,
1395
- hasDataArgs,
1396
- hasExtraArgs,
1397
- hasInput,
1398
- hasLegacyOptionalAccounts,
1399
- hasRemainingAccounts,
1400
- hasResolver,
1401
- inputTypeCallFragment,
1402
- inputTypeFragment,
1403
- instruction: instructionNode,
1404
- instructionTypeFragment,
1405
- programAddressConstant,
1406
- renamedArgs: renamedArgsText,
1407
- resolvedFragment,
1408
- typeParamsFragment,
1409
- useAsync
1410
- }).mergeImportsWith(
1411
- typeParamsFragment,
1412
- instructionTypeFragment,
1413
- inputTypeFragment,
1414
- inputTypeCallFragment,
1415
- resolvedFragment,
1416
- argsTypeFragment
1417
- ).addImports("generatedPrograms", [programAddressConstant]).addImports("solanaAddresses", ["type Address"]);
1418
- if (hasAccounts) {
1419
- functionFragment.addImports("solanaInstructions", ["type AccountMeta"]).addImports("shared", ["getAccountMetaFactory", "type ResolvedAccount"]);
1420
- }
1421
- if (hasByteDeltas) {
1422
- functionFragment.addImports("shared", ["type InstructionWithByteDelta"]);
1423
- }
1424
- return functionFragment;
1557
+ return (0, import_visitors_core21.pipe)(
1558
+ fragmentFromTemplate("instructionFunction.njk", {
1559
+ argsTypeFragment: argsTypeFragment.content,
1560
+ encoderFunction,
1561
+ functionName,
1562
+ getReturnType,
1563
+ hasAccounts,
1564
+ hasAnyArgs,
1565
+ hasByteDeltas,
1566
+ hasData,
1567
+ hasDataArgs,
1568
+ hasExtraArgs,
1569
+ hasInput,
1570
+ hasLegacyOptionalAccounts,
1571
+ hasRemainingAccounts,
1572
+ hasResolver,
1573
+ inputTypeCallFragment: inputTypeCallFragment.content,
1574
+ inputTypeFragment: inputTypeFragment.content,
1575
+ instruction: instructionNode,
1576
+ instructionTypeFragment: instructionTypeFragment.content,
1577
+ programAddressConstant,
1578
+ renamedArgs: renamedArgsText,
1579
+ resolvedFragment: resolvedFragment.content,
1580
+ typeParamsFragment: typeParamsFragment.content,
1581
+ useAsync
1582
+ }),
1583
+ (f) => mergeFragmentImports(f, [
1584
+ typeParamsFragment.imports,
1585
+ instructionTypeFragment.imports,
1586
+ inputTypeFragment.imports,
1587
+ inputTypeCallFragment.imports,
1588
+ resolvedFragment.imports,
1589
+ argsTypeFragment.imports
1590
+ ]),
1591
+ (f) => addFragmentImports(f, "generatedPrograms", [programAddressConstant]),
1592
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"]),
1593
+ (f) => hasAccounts ? addFragmentImports(f, "solanaInstructions", ["type AccountMeta"]) : f,
1594
+ (f) => hasAccounts ? addFragmentImports(f, "shared", ["getAccountMetaFactory", "type ResolvedAccount"]) : f,
1595
+ (f) => hasByteDeltas ? addFragmentImports(f, "shared", ["type InstructionWithByteDelta"]) : f
1596
+ );
1425
1597
  }
1426
1598
  function getTypeParams(instructionNode, programAddressConstant) {
1427
1599
  const typeParams = instructionNode.accounts.map((account) => `TAccount${(0, import_nodes18.pascalCase)(account.name)} extends string`);
1428
1600
  typeParams.push(`TProgramAddress extends Address = typeof ${programAddressConstant}`);
1429
- return fragment(typeParams.filter((x) => !!x).join(", ")).mapRender((r) => `<${r}>`).addImports("generatedPrograms", [programAddressConstant]);
1601
+ return (0, import_visitors_core21.pipe)(
1602
+ fragment(typeParams.filter((x) => !!x).join(", ")),
1603
+ (f) => (0, import_renderers_core8.mapFragmentContent)(f, (c) => `<${c}>`),
1604
+ (f) => addFragmentImports(f, "generatedPrograms", [programAddressConstant])
1605
+ );
1430
1606
  }
1431
1607
  function getInstructionType(scope) {
1432
1608
  const { instructionPath, nameApi } = scope;
1433
- const instructionNode = (0, import_visitors_core16.getLastNodeFromPath)(instructionPath);
1609
+ const instructionNode = (0, import_visitors_core21.getLastNodeFromPath)(instructionPath);
1434
1610
  const instructionTypeName = nameApi.instructionType(instructionNode.name);
1435
1611
  const programAddressFragment = fragment("TProgramAddress");
1436
1612
  const accountTypeParamsFragments = instructionNode.accounts.map((account) => {
@@ -1438,20 +1614,24 @@ function getInstructionType(scope) {
1438
1614
  const camelName = (0, import_nodes18.camelCase)(account.name);
1439
1615
  if (account.isSigner === "either") {
1440
1616
  const signerRole = account.isWritable ? "WritableSignerAccount" : "ReadonlySignerAccount";
1441
- return fragment(
1442
- `typeof input["${camelName}"] extends TransactionSigner<${typeParam}> ? ${signerRole}<${typeParam}> & AccountSignerMeta<${typeParam}> : ${typeParam}`
1443
- ).addImports("solanaInstructions", [`type ${signerRole}`]).addImports("solanaSigners", ["type AccountSignerMeta"]);
1617
+ return (0, import_visitors_core21.pipe)(
1618
+ fragment(
1619
+ `typeof input["${camelName}"] extends TransactionSigner<${typeParam}> ? ${signerRole}<${typeParam}> & AccountSignerMeta<${typeParam}> : ${typeParam}`
1620
+ ),
1621
+ (f) => addFragmentImports(f, "solanaInstructions", [`type ${signerRole}`]),
1622
+ (f) => addFragmentImports(f, "solanaSigners", ["type AccountSignerMeta"])
1623
+ );
1444
1624
  }
1445
1625
  return fragment(typeParam);
1446
1626
  });
1447
- return mergeFragments(
1448
- [programAddressFragment, ...accountTypeParamsFragments],
1449
- (renders) => renders.join(", ")
1450
- ).mapRender((r) => `${instructionTypeName}<${r}>`);
1627
+ return (0, import_visitors_core21.pipe)(
1628
+ mergeFragments([programAddressFragment, ...accountTypeParamsFragments], (c) => c.join(", ")),
1629
+ (f) => (0, import_renderers_core8.mapFragmentContent)(f, (c) => `${instructionTypeName}<${c}>`)
1630
+ );
1451
1631
  }
1452
1632
  function getInputTypeCall(scope) {
1453
1633
  const { instructionPath, useAsync, nameApi } = scope;
1454
- const instructionNode = (0, import_visitors_core16.getLastNodeFromPath)(instructionPath);
1634
+ const instructionNode = (0, import_visitors_core21.getLastNodeFromPath)(instructionPath);
1455
1635
  const inputTypeName = useAsync ? nameApi.instructionAsyncInputType(instructionNode.name) : nameApi.instructionSyncInputType(instructionNode.name);
1456
1636
  if (instructionNode.accounts.length === 0) return fragment(inputTypeName);
1457
1637
  const accountTypeParams = instructionNode.accounts.map((account) => `TAccount${(0, import_nodes18.pascalCase)(account.name)}`).join(", ");
@@ -1459,11 +1639,11 @@ function getInputTypeCall(scope) {
1459
1639
  }
1460
1640
 
1461
1641
  // src/fragments/instructionParseFunction.ts
1462
- var import_visitors_core17 = require("@codama/visitors-core");
1642
+ var import_visitors_core22 = require("@codama/visitors-core");
1463
1643
  function getInstructionParseFunctionFragment(scope) {
1464
1644
  const { instructionPath, dataArgsManifest, nameApi, customInstructionData } = scope;
1465
- const instructionNode = (0, import_visitors_core17.getLastNodeFromPath)(instructionPath);
1466
- const programNode = (0, import_visitors_core17.findProgramNodeFromPath)(instructionPath);
1645
+ const instructionNode = (0, import_visitors_core22.getLastNodeFromPath)(instructionPath);
1646
+ const programNode = (0, import_visitors_core22.findProgramNodeFromPath)(instructionPath);
1467
1647
  const customData = customInstructionData.get(instructionNode.name);
1468
1648
  const hasAccounts = instructionNode.accounts.length > 0;
1469
1649
  const hasOptionalAccounts = instructionNode.accounts.some((account) => account.isOptional);
@@ -1471,34 +1651,44 @@ function getInstructionParseFunctionFragment(scope) {
1471
1651
  const hasData = !!customData || instructionNode.arguments.length > 0;
1472
1652
  const instructionDataName = nameApi.instructionDataType(instructionNode.name);
1473
1653
  const programAddressConstant = nameApi.programAddressConstant(programNode.name);
1474
- const dataTypeFragment = fragment(
1475
- customData ? dataArgsManifest.strictType.render : nameApi.dataType(instructionDataName)
1654
+ const dataTypeFragment = customData ? (0, import_visitors_core22.pipe)(
1655
+ fragment(dataArgsManifest.strictType.content),
1656
+ (f) => mergeFragmentImports(f, [dataArgsManifest.strictType.imports, dataArgsManifest.decoder.imports])
1657
+ ) : fragment(nameApi.dataType(instructionDataName));
1658
+ const decoderFunction = customData ? dataArgsManifest.decoder.content : `${nameApi.decoderFunction(instructionDataName)}()`;
1659
+ return (0, import_visitors_core22.pipe)(
1660
+ fragmentFromTemplate("instructionParseFunction.njk", {
1661
+ dataTypeFragment: dataTypeFragment.content,
1662
+ decoderFunction,
1663
+ hasAccounts,
1664
+ hasData,
1665
+ hasOptionalAccounts,
1666
+ instruction: instructionNode,
1667
+ instructionParseFunction: nameApi.instructionParseFunction(instructionNode.name),
1668
+ instructionParsedType: nameApi.instructionParsedType(instructionNode.name),
1669
+ minimumNumberOfAccounts,
1670
+ programAddressConstant
1671
+ }),
1672
+ (f) => mergeFragmentImports(f, [dataTypeFragment.imports]),
1673
+ (f) => addFragmentImports(f, "generatedPrograms", [programAddressConstant]),
1674
+ (f) => addFragmentImports(f, "solanaInstructions", ["type Instruction"]),
1675
+ hasAccounts ? (f) => addFragmentImports(f, "solanaInstructions", ["type InstructionWithAccounts", "type AccountMeta"]) : (f) => f,
1676
+ hasData ? (f) => addFragmentImports(
1677
+ addFragmentImports(f, "solanaInstructions", ["type InstructionWithData"]),
1678
+ "solanaCodecsCore",
1679
+ ["type ReadonlyUint8Array"]
1680
+ ) : (f) => f
1476
1681
  );
1477
- const decoderFunction = customData ? dataArgsManifest.decoder.render : `${nameApi.decoderFunction(instructionDataName)}()`;
1478
- if (customData) {
1479
- dataTypeFragment.mergeImportsWith(dataArgsManifest.strictType, dataArgsManifest.decoder);
1480
- }
1481
- return fragmentFromTemplate("instructionParseFunction.njk", {
1482
- dataTypeFragment,
1483
- decoderFunction,
1484
- hasAccounts,
1485
- hasData,
1486
- hasOptionalAccounts,
1487
- instruction: instructionNode,
1488
- instructionParseFunction: nameApi.instructionParseFunction(instructionNode.name),
1489
- instructionParsedType: nameApi.instructionParsedType(instructionNode.name),
1490
- minimumNumberOfAccounts,
1491
- programAddressConstant
1492
- }).mergeImportsWith(dataTypeFragment).addImports("generatedPrograms", [programAddressConstant]).addImports("solanaInstructions", ["type Instruction"]).addImports("solanaInstructions", hasAccounts ? ["type InstructionWithAccounts", "type AccountMeta"] : []).addImports("solanaInstructions", hasData ? ["type InstructionWithData"] : []).addImports("solanaCodecsCore", hasData ? ["type ReadonlyUint8Array"] : []);
1493
1682
  }
1494
1683
 
1495
1684
  // src/fragments/instructionType.ts
1496
1685
  var import_nodes19 = require("@codama/nodes");
1497
- var import_visitors_core18 = require("@codama/visitors-core");
1686
+ var import_renderers_core9 = require("@codama/renderers-core");
1687
+ var import_visitors_core23 = require("@codama/visitors-core");
1498
1688
  function getInstructionTypeFragment(scope) {
1499
1689
  const { instructionPath, nameApi, customInstructionData } = scope;
1500
- const instructionNode = (0, import_visitors_core18.getLastNodeFromPath)(instructionPath);
1501
- const programNode = (0, import_visitors_core18.findProgramNodeFromPath)(instructionPath);
1690
+ const instructionNode = (0, import_visitors_core23.getLastNodeFromPath)(instructionPath);
1691
+ const programNode = (0, import_visitors_core23.findProgramNodeFromPath)(instructionPath);
1502
1692
  const hasAccounts = instructionNode.accounts.length > 0;
1503
1693
  const customData = customInstructionData.get(instructionNode.name);
1504
1694
  const hasData = !!customData || instructionNode.arguments.length > 0;
@@ -1518,45 +1708,50 @@ function getInstructionTypeFragment(scope) {
1518
1708
  const usesLegacyOptionalAccounts = instructionNode.optionalAccountStrategy === "omitted";
1519
1709
  const accountMetasFragment = mergeFragments(
1520
1710
  instructionNode.accounts.map(
1521
- (account) => getInstructionAccountMetaFragment(account).mapRender((r) => {
1711
+ (account) => (0, import_renderers_core9.mapFragmentContent)(getInstructionAccountMetaFragment(account), (c) => {
1522
1712
  const typeParam = `TAccount${(0, import_nodes19.pascalCase)(account.name)}`;
1523
1713
  const isLegacyOptional = account.isOptional && usesLegacyOptionalAccounts;
1524
- const type = `${typeParam} extends string ? ${r} : ${typeParam}`;
1714
+ const type = `${typeParam} extends string ? ${c} : ${typeParam}`;
1525
1715
  if (!isLegacyOptional) return type;
1526
1716
  return `...(${typeParam} extends undefined ? [] : [${type}])`;
1527
1717
  })
1528
1718
  ),
1529
- (renders) => renders.join(", ")
1719
+ (c) => c.join(", ")
1720
+ );
1721
+ const fragment2 = (0, import_visitors_core23.pipe)(
1722
+ fragmentFromTemplate("instructionType.njk", {
1723
+ accountMetas: accountMetasFragment.content,
1724
+ accountTypeParams: accountTypeParamsFragment.content,
1725
+ dataType,
1726
+ hasAccounts,
1727
+ hasData,
1728
+ instruction: instructionNode,
1729
+ instructionType: nameApi.instructionType(instructionNode.name),
1730
+ programAddressConstant
1731
+ }),
1732
+ (f) => mergeFragmentImports(f, [accountTypeParamsFragment.imports, accountMetasFragment.imports]),
1733
+ (f) => addFragmentImports(f, "generatedPrograms", [programAddressConstant]),
1734
+ (f) => addFragmentImports(f, "solanaInstructions", [
1735
+ "type AccountMeta",
1736
+ "type Instruction",
1737
+ "type InstructionWithAccounts",
1738
+ ...hasData ? ["type InstructionWithData"] : []
1739
+ ])
1530
1740
  );
1531
- const fragment2 = fragmentFromTemplate("instructionType.njk", {
1532
- accountMetas: accountMetasFragment.render,
1533
- accountTypeParams: accountTypeParamsFragment.render,
1534
- dataType,
1535
- hasAccounts,
1536
- hasData,
1537
- instruction: instructionNode,
1538
- instructionType: nameApi.instructionType(instructionNode.name),
1539
- programAddressConstant
1540
- }).mergeImportsWith(accountTypeParamsFragment, accountMetasFragment).addImports("generatedPrograms", [programAddressConstant]).addImports("solanaCodecsCore", hasData ? ["type ReadonlyUint8Array"] : []).addImports("solanaInstructions", [
1541
- "type AccountMeta",
1542
- "type Instruction",
1543
- "type InstructionWithAccounts",
1544
- ...hasData ? ["type InstructionWithData"] : []
1545
- ]);
1546
1741
  return fragment2;
1547
1742
  }
1548
1743
 
1549
1744
  // src/fragments/pdaFunction.ts
1550
1745
  var import_nodes20 = require("@codama/nodes");
1551
- var import_visitors_core19 = require("@codama/visitors-core");
1746
+ var import_visitors_core24 = require("@codama/visitors-core");
1552
1747
  function getPdaFunctionFragment(scope) {
1553
1748
  const { pdaPath, typeManifestVisitor, nameApi } = scope;
1554
- const pdaNode = (0, import_visitors_core19.getLastNodeFromPath)(pdaPath);
1555
- const programNode = (0, import_visitors_core19.findProgramNodeFromPath)(pdaPath);
1749
+ const pdaNode = (0, import_visitors_core24.getLastNodeFromPath)(pdaPath);
1750
+ const programNode = (0, import_visitors_core24.findProgramNodeFromPath)(pdaPath);
1556
1751
  const imports = new ImportMap();
1557
1752
  const seeds = pdaNode.seeds.map((seed) => {
1558
1753
  if ((0, import_nodes20.isNode)(seed, "variablePdaSeedNode")) {
1559
- const seedManifest2 = (0, import_visitors_core19.visit)(seed.type, typeManifestVisitor);
1754
+ const seedManifest2 = (0, import_visitors_core24.visit)(seed.type, typeManifestVisitor);
1560
1755
  imports.mergeWith(seedManifest2.looseType, seedManifest2.encoder);
1561
1756
  return { ...seed, typeManifest: seedManifest2 };
1562
1757
  }
@@ -1564,38 +1759,53 @@ function getPdaFunctionFragment(scope) {
1564
1759
  imports.add("solanaAddresses", "getAddressEncoder");
1565
1760
  return seed;
1566
1761
  }
1567
- const seedManifest = (0, import_visitors_core19.visit)(seed.type, typeManifestVisitor);
1762
+ const seedManifest = (0, import_visitors_core24.visit)(seed.type, typeManifestVisitor);
1568
1763
  imports.mergeWith(seedManifest.encoder);
1569
- const valueManifest = (0, import_visitors_core19.visit)(seed.value, typeManifestVisitor).value;
1764
+ const valueManifest = (0, import_visitors_core24.visit)(seed.value, typeManifestVisitor).value;
1570
1765
  imports.mergeWith(valueManifest.imports);
1571
1766
  return { ...seed, typeManifest: seedManifest, valueManifest };
1572
1767
  });
1573
1768
  const hasVariableSeeds = pdaNode.seeds.filter((0, import_nodes20.isNodeFilter)("variablePdaSeedNode")).length > 0;
1574
- return fragmentFromTemplate("pdaFunction.njk", {
1575
- findPdaFunction: nameApi.pdaFindFunction(pdaNode.name),
1576
- hasVariableSeeds,
1577
- pdaSeedsType: nameApi.pdaSeedsType(pdaNode.name),
1578
- programAddress: pdaNode.programId ?? programNode.publicKey,
1579
- seeds
1580
- }).mergeImportsWith(imports).addImports("solanaAddresses", ["type Address", "getProgramDerivedAddress", "type ProgramDerivedAddress"]);
1769
+ return (0, import_visitors_core24.pipe)(
1770
+ fragmentFromTemplate("pdaFunction.njk", {
1771
+ findPdaFunction: nameApi.pdaFindFunction(pdaNode.name),
1772
+ hasVariableSeeds,
1773
+ pdaDocs: pdaNode.docs,
1774
+ pdaSeedsType: nameApi.pdaSeedsType(pdaNode.name),
1775
+ programAddress: pdaNode.programId ?? programNode.publicKey,
1776
+ seeds
1777
+ }),
1778
+ (f) => mergeFragmentImports(f, [imports]),
1779
+ (f) => addFragmentImports(f, "solanaAddresses", [
1780
+ "type Address",
1781
+ "getProgramDerivedAddress",
1782
+ "type ProgramDerivedAddress"
1783
+ ])
1784
+ );
1581
1785
  }
1582
1786
 
1583
1787
  // src/fragments/program.ts
1788
+ var import_visitors_core25 = require("@codama/visitors-core");
1584
1789
  function getProgramFragment(scope) {
1585
1790
  const { programNode, nameApi } = scope;
1586
- return fragmentFromTemplate("program.njk", {
1587
- program: programNode,
1588
- programAddressConstant: nameApi.programAddressConstant(programNode.name)
1589
- }).addImports("solanaAddresses", ["type Address"]);
1791
+ return (0, import_visitors_core25.pipe)(
1792
+ fragmentFromTemplate("program.njk", {
1793
+ program: programNode,
1794
+ programAddressConstant: nameApi.programAddressConstant(programNode.name)
1795
+ }),
1796
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"])
1797
+ );
1590
1798
  }
1591
1799
 
1592
1800
  // src/fragments/programAccounts.ts
1593
1801
  var import_nodes21 = require("@codama/nodes");
1802
+ var import_renderers_core10 = require("@codama/renderers-core");
1803
+ var import_visitors_core26 = require("@codama/visitors-core");
1594
1804
  function getProgramAccountsFragment(scope) {
1595
1805
  if (scope.programNode.accounts.length === 0) return fragment("");
1596
1806
  return mergeFragments(
1597
1807
  [getProgramAccountsEnumFragment(scope), getProgramAccountsIdentifierFunctionFragment(scope)],
1598
- (r) => `${r.join("\n\n")}
1808
+ (c) => `${c.join("\n\n")}
1599
1809
  `
1600
1810
  );
1601
1811
  }
@@ -1616,46 +1826,59 @@ function getProgramAccountsIdentifierFunctionFragment(scope) {
1616
1826
  if (!hasAccountDiscriminators) return fragment("");
1617
1827
  const programAccountsEnum = nameApi.programAccountsEnum(programNode.name);
1618
1828
  const programAccountsIdentifierFunction = nameApi.programAccountsIdentifierFunction(programNode.name);
1619
- const discriminatorsFragment = mergeFragments(
1620
- accountsWithDiscriminators.map((account) => {
1621
- const variant = nameApi.programAccountsEnumVariant(account.name);
1622
- return getDiscriminatorConditionFragment({
1623
- ...scope,
1624
- dataName: "data",
1625
- discriminators: account.discriminators ?? [],
1626
- ifTrue: `return ${programAccountsEnum}.${variant};`,
1627
- struct: (0, import_nodes21.resolveNestedTypeNode)(account.data)
1628
- });
1629
- }),
1630
- (r) => r.join("\n")
1631
- );
1632
- return discriminatorsFragment.mapRender(
1633
- (discriminators) => `export function ${programAccountsIdentifierFunction}(account: { data: ReadonlyUint8Array } | ReadonlyUint8Array): ${programAccountsEnum} {
1829
+ return (0, import_visitors_core26.pipe)(
1830
+ mergeFragments(
1831
+ accountsWithDiscriminators.map((account) => {
1832
+ const variant = nameApi.programAccountsEnumVariant(account.name);
1833
+ return getDiscriminatorConditionFragment({
1834
+ ...scope,
1835
+ dataName: "data",
1836
+ discriminators: account.discriminators ?? [],
1837
+ ifTrue: `return ${programAccountsEnum}.${variant};`,
1838
+ struct: (0, import_nodes21.resolveNestedTypeNode)(account.data)
1839
+ });
1840
+ }),
1841
+ (c) => c.join("\n")
1842
+ ),
1843
+ (f) => (0, import_renderers_core10.mapFragmentContent)(
1844
+ f,
1845
+ (discriminators) => `export function ${programAccountsIdentifierFunction}(account: { data: ReadonlyUint8Array } | ReadonlyUint8Array): ${programAccountsEnum} {
1634
1846
  const data = 'data' in account ? account.data : account;
1635
1847
  ${discriminators}
1636
1848
  throw new Error("The provided account could not be identified as a ${programNode.name} account.")
1637
1849
  }`
1638
- ).addImports("solanaCodecsCore", "type ReadonlyUint8Array");
1850
+ ),
1851
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["type ReadonlyUint8Array"])
1852
+ );
1639
1853
  }
1640
1854
 
1641
1855
  // src/fragments/programErrors.ts
1856
+ var import_visitors_core27 = require("@codama/visitors-core");
1642
1857
  function getProgramErrorsFragment(scope) {
1643
1858
  const { programNode, nameApi } = scope;
1644
1859
  const programAddressConstant = nameApi.programAddressConstant(programNode.name);
1645
- return fragmentFromTemplate("programErrors.njk", {
1646
- errors: programNode.errors,
1647
- escapeProgramErrorMessage: (message) => message.replace(/`/g, "\\`"),
1648
- getProgramErrorConstant: (name) => nameApi.programErrorConstantPrefix(programNode.name) + nameApi.programErrorConstant(name),
1649
- programAddressConstant,
1650
- programErrorMessagesMap: nameApi.programErrorMessagesMap(programNode.name),
1651
- programErrorUnion: nameApi.programErrorUnion(programNode.name),
1652
- programGetErrorMessageFunction: nameApi.programGetErrorMessageFunction(programNode.name),
1653
- programIsErrorFunction: nameApi.programIsErrorFunction(programNode.name)
1654
- }).addImports("generatedPrograms", [programAddressConstant]).addImports("solanaPrograms", ["isProgramError"]).addImports("solanaErrors", ["type SolanaError", "type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM"]).addImports("solanaAddresses", ["type Address"]);
1860
+ return (0, import_visitors_core27.pipe)(
1861
+ fragmentFromTemplate("programErrors.njk", {
1862
+ errors: programNode.errors,
1863
+ escapeProgramErrorMessage: (message) => message.replace(/`/g, "\\`"),
1864
+ getProgramErrorConstant: (name) => nameApi.programErrorConstantPrefix(programNode.name) + nameApi.programErrorConstant(name),
1865
+ programAddressConstant,
1866
+ programErrorMessagesMap: nameApi.programErrorMessagesMap(programNode.name),
1867
+ programErrorUnion: nameApi.programErrorUnion(programNode.name),
1868
+ programGetErrorMessageFunction: nameApi.programGetErrorMessageFunction(programNode.name),
1869
+ programIsErrorFunction: nameApi.programIsErrorFunction(programNode.name)
1870
+ }),
1871
+ (f) => addFragmentImports(f, "generatedPrograms", [programAddressConstant]),
1872
+ (f) => addFragmentImports(f, "solanaPrograms", ["isProgramError"]),
1873
+ (f) => addFragmentImports(f, "solanaErrors", ["type SolanaError", "type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM"]),
1874
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"])
1875
+ );
1655
1876
  }
1656
1877
 
1657
1878
  // src/fragments/programInstructions.ts
1658
1879
  var import_nodes22 = require("@codama/nodes");
1880
+ var import_renderers_core11 = require("@codama/renderers-core");
1881
+ var import_visitors_core28 = require("@codama/visitors-core");
1659
1882
  function getProgramInstructionsFragment(scope) {
1660
1883
  if (scope.programNode.instructions.length === 0) return fragment("");
1661
1884
  const allInstructions = (0, import_nodes22.getAllInstructionsWithSubs)(scope.programNode, {
@@ -1669,7 +1892,7 @@ function getProgramInstructionsFragment(scope) {
1669
1892
  getProgramInstructionsIdentifierFunctionFragment(scopeWithInstructions),
1670
1893
  getProgramInstructionsParsedUnionTypeFragment(scopeWithInstructions)
1671
1894
  ],
1672
- (r) => `${r.join("\n\n")}
1895
+ (c) => `${c.join("\n\n")}
1673
1896
  `
1674
1897
  );
1675
1898
  }
@@ -1703,15 +1926,20 @@ function getProgramInstructionsIdentifierFunctionFragment(scope) {
1703
1926
  struct: (0, import_nodes22.structTypeNodeFromInstructionArgumentNodes)(instruction.arguments)
1704
1927
  });
1705
1928
  }),
1706
- (r) => r.join("\n")
1929
+ (c) => c.join("\n")
1707
1930
  );
1708
- return discriminatorsFragment.mapRender(
1709
- (discriminators) => `export function ${programInstructionsIdentifierFunction}(instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array): ${programInstructionsEnum} {
1931
+ return (0, import_visitors_core28.pipe)(
1932
+ discriminatorsFragment,
1933
+ (f) => (0, import_renderers_core11.mapFragmentContent)(
1934
+ f,
1935
+ (discriminators) => `export function ${programInstructionsIdentifierFunction}(instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array): ${programInstructionsEnum} {
1710
1936
  const data = 'data' in instruction ? instruction.data : instruction;
1711
1937
  ${discriminators}
1712
1938
  throw new Error("The provided instruction could not be identified as a ${programNode.name} instruction.")
1713
1939
  }`
1714
- ).addImports("solanaCodecsCore", "type ReadonlyUint8Array");
1940
+ ),
1941
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["type ReadonlyUint8Array"])
1942
+ );
1715
1943
  }
1716
1944
  function getProgramInstructionsParsedUnionTypeFragment(scope) {
1717
1945
  const { programNode, allInstructions, nameApi } = scope;
@@ -1721,128 +1949,107 @@ function getProgramInstructionsParsedUnionTypeFragment(scope) {
1721
1949
  const typeVariants = allInstructions.map((instruction) => {
1722
1950
  const instructionEnumVariant = nameApi.programInstructionsEnumVariant(instruction.name);
1723
1951
  const parsedInstructionType = nameApi.instructionParsedType(instruction.name);
1724
- return fragment(
1725
- `| { instructionType: ${programInstructionsEnum}.${instructionEnumVariant} } & ${parsedInstructionType}<TProgram>`
1726
- ).addImports("generatedInstructions", `type ${parsedInstructionType}`);
1952
+ return (0, import_visitors_core28.pipe)(
1953
+ fragment(
1954
+ `| { instructionType: ${programInstructionsEnum}.${instructionEnumVariant} } & ${parsedInstructionType}<TProgram>`
1955
+ ),
1956
+ (f) => addFragmentImports(f, "generatedInstructions", [`type ${parsedInstructionType}`])
1957
+ );
1727
1958
  });
1728
1959
  return mergeFragments(
1729
1960
  [
1730
1961
  fragment(`export type ${programInstructionsType}<TProgram extends string = '${programAddress}'> =`),
1731
1962
  ...typeVariants
1732
1963
  ],
1733
- (r) => r.join("\n")
1964
+ (c) => c.join("\n")
1734
1965
  );
1735
1966
  }
1736
1967
 
1737
1968
  // src/fragments/typeDiscriminatedUnionHelpers.ts
1738
1969
  var import_nodes23 = require("@codama/nodes");
1970
+ var import_visitors_core29 = require("@codama/visitors-core");
1739
1971
  function getTypeDiscriminatedUnionHelpersFragment(scope) {
1740
1972
  const { name, typeNode, nameApi } = scope;
1741
1973
  const isDiscriminatedUnion = (0, import_nodes23.isNode)(typeNode, "enumTypeNode") && (0, import_nodes23.isDataEnum)(typeNode);
1742
1974
  if (!isDiscriminatedUnion) {
1743
1975
  return fragment("");
1744
1976
  }
1745
- return fragmentFromTemplate("typeDiscriminatedUnionHelpers.njk", {
1746
- discriminatedUnionDiscriminator: nameApi.discriminatedUnionDiscriminator(name),
1747
- discriminatedUnionFunction: nameApi.discriminatedUnionFunction(name),
1748
- getVariant: (variant) => nameApi.discriminatedUnionVariant(variant),
1749
- isDiscriminatedUnionFunction: nameApi.isDiscriminatedUnionFunction(name),
1750
- looseName: nameApi.dataArgsType(name),
1751
- strictName: nameApi.dataType(name),
1752
- typeNode
1753
- }).addImports("solanaCodecsDataStructures", [
1754
- "type GetDiscriminatedUnionVariantContent",
1755
- "type GetDiscriminatedUnionVariant"
1756
- ]);
1757
- }
1758
-
1759
- // src/TypeManifest.ts
1760
- function typeManifest() {
1761
- return {
1762
- decoder: fragment(""),
1763
- encoder: fragment(""),
1764
- isEnum: false,
1765
- looseType: fragment(""),
1766
- strictType: fragment(""),
1767
- value: fragment("")
1768
- };
1769
- }
1770
- function mergeManifests(manifests, options = {}) {
1771
- const { mergeTypes, mergeCodecs, mergeValues } = options;
1772
- const merge = (fragmentFn, mergeFn) => mergeFn ? mergeFragments(manifests.map(fragmentFn), mergeFn) : fragment("");
1773
- return {
1774
- decoder: merge((m) => m.decoder, mergeCodecs),
1775
- encoder: merge((m) => m.encoder, mergeCodecs),
1776
- isEnum: false,
1777
- looseType: merge((m) => m.looseType, mergeTypes),
1778
- strictType: merge((m) => m.strictType, mergeTypes),
1779
- value: merge((m) => m.value, mergeValues)
1780
- };
1977
+ return (0, import_visitors_core29.pipe)(
1978
+ fragmentFromTemplate("typeDiscriminatedUnionHelpers.njk", {
1979
+ discriminatedUnionDiscriminator: nameApi.discriminatedUnionDiscriminator(name),
1980
+ discriminatedUnionFunction: nameApi.discriminatedUnionFunction(name),
1981
+ getVariant: (variant) => nameApi.discriminatedUnionVariant(variant),
1982
+ isDiscriminatedUnionFunction: nameApi.isDiscriminatedUnionFunction(name),
1983
+ looseName: nameApi.dataArgsType(name),
1984
+ strictName: nameApi.dataType(name),
1985
+ typeNode
1986
+ }),
1987
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", [
1988
+ "type GetDiscriminatedUnionVariantContent",
1989
+ "type GetDiscriminatedUnionVariant"
1990
+ ])
1991
+ );
1781
1992
  }
1782
1993
 
1783
- // src/getRenderMapVisitor.ts
1784
- var import_node_path3 = require("path");
1785
- var import_errors2 = require("@codama/errors");
1786
- var import_nodes26 = require("@codama/nodes");
1787
- var import_renderers_core = require("@codama/renderers-core");
1788
- var import_visitors_core21 = require("@codama/visitors-core");
1789
-
1790
1994
  // src/getTypeManifestVisitor.ts
1791
1995
  var import_nodes24 = require("@codama/nodes");
1792
- var import_visitors_core20 = require("@codama/visitors-core");
1996
+ var import_renderers_core12 = require("@codama/renderers-core");
1997
+ var import_visitors_core30 = require("@codama/visitors-core");
1793
1998
  function getTypeManifestVisitor(input) {
1794
1999
  const { nameApi, linkables, nonScalarEnums, customAccountData, customInstructionData, getImportFrom } = input;
1795
- const stack = input.stack ?? new import_visitors_core20.NodeStack();
2000
+ const stack = input.stack ?? new import_visitors_core30.NodeStack();
1796
2001
  let parentName = null;
1797
- return (0, import_visitors_core20.pipe)(
1798
- (0, import_visitors_core20.staticVisitor)(
1799
- () => ({
1800
- decoder: fragment(""),
1801
- encoder: fragment(""),
1802
- isEnum: false,
1803
- looseType: fragment(""),
1804
- strictType: fragment(""),
1805
- value: fragment("")
1806
- }),
1807
- {
1808
- keys: [
1809
- ...import_nodes24.REGISTERED_TYPE_NODE_KINDS,
1810
- ...import_nodes24.REGISTERED_VALUE_NODE_KINDS,
1811
- "definedTypeLinkNode",
1812
- "definedTypeNode",
1813
- "accountNode",
1814
- "instructionNode"
1815
- ]
1816
- }
1817
- ),
1818
- (visitor) => (0, import_visitors_core20.extendVisitor)(visitor, {
2002
+ return (0, import_visitors_core30.pipe)(
2003
+ (0, import_visitors_core30.staticVisitor)(() => typeManifest(), {
2004
+ keys: [
2005
+ ...import_nodes24.REGISTERED_TYPE_NODE_KINDS,
2006
+ ...import_nodes24.REGISTERED_VALUE_NODE_KINDS,
2007
+ "definedTypeLinkNode",
2008
+ "definedTypeNode",
2009
+ "accountNode",
2010
+ "instructionNode"
2011
+ ]
2012
+ }),
2013
+ (visitor) => (0, import_visitors_core30.extendVisitor)(visitor, {
1819
2014
  visitAccount(account, { self }) {
1820
2015
  parentName = {
1821
2016
  loose: nameApi.dataArgsType(account.name),
1822
2017
  strict: nameApi.dataType(account.name)
1823
2018
  };
1824
2019
  const link = customAccountData.get(account.name)?.linkNode;
1825
- const manifest = link ? (0, import_visitors_core20.visit)(link, self) : (0, import_visitors_core20.visit)(account.data, self);
2020
+ const manifest = link ? (0, import_visitors_core30.visit)(link, self) : (0, import_visitors_core30.visit)(account.data, self);
1826
2021
  parentName = null;
1827
2022
  return manifest;
1828
2023
  },
1829
2024
  visitAmountType(amountType, { self }) {
1830
- return (0, import_visitors_core20.visit)(amountType.number, self);
2025
+ return (0, import_visitors_core30.visit)(amountType.number, self);
1831
2026
  },
1832
2027
  visitArrayType(arrayType, { self }) {
1833
- const childManifest = (0, import_visitors_core20.visit)(arrayType.item, self);
1834
- childManifest.looseType.mapRender((r) => `Array<${r}>`);
1835
- childManifest.strictType.mapRender((r) => `Array<${r}>`);
2028
+ const childManifest = (0, import_visitors_core30.visit)(arrayType.item, self);
1836
2029
  const sizeManifest = getArrayLikeSizeOption(arrayType.count, self);
1837
- const encoderOptions = sizeManifest.encoder.render ? `, { ${sizeManifest.encoder.render} }` : "";
1838
- const decoderOptions = sizeManifest.decoder.render ? `, { ${sizeManifest.decoder.render} }` : "";
1839
- childManifest.encoder.mapRender((r) => `getArrayEncoder(${r + encoderOptions})`).mergeImportsWith(sizeManifest.encoder).addImports("solanaCodecsDataStructures", "getArrayEncoder");
1840
- childManifest.decoder.mapRender((r) => `getArrayDecoder(${r + decoderOptions})`).mergeImportsWith(sizeManifest.decoder).addImports("solanaCodecsDataStructures", "getArrayDecoder");
1841
- return childManifest;
2030
+ const encoderOptions = sizeManifest.encoder.content ? `, { ${sizeManifest.encoder.content} }` : "";
2031
+ const decoderOptions = sizeManifest.decoder.content ? `, { ${sizeManifest.decoder.content} }` : "";
2032
+ return typeManifest({
2033
+ ...childManifest,
2034
+ decoder: (0, import_visitors_core30.pipe)(
2035
+ childManifest.decoder,
2036
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getArrayDecoder(${c + decoderOptions})`),
2037
+ (f) => mergeFragmentImports(f, [sizeManifest.decoder.imports]),
2038
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getArrayDecoder"])
2039
+ ),
2040
+ encoder: (0, import_visitors_core30.pipe)(
2041
+ childManifest.encoder,
2042
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getArrayEncoder(${c + encoderOptions})`),
2043
+ (f) => mergeFragmentImports(f, [sizeManifest.encoder.imports]),
2044
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getArrayEncoder"])
2045
+ ),
2046
+ looseType: (0, import_renderers_core12.mapFragmentContent)(childManifest.looseType, (c) => `Array<${c}>`),
2047
+ strictType: (0, import_renderers_core12.mapFragmentContent)(childManifest.strictType, (c) => `Array<${c}>`)
2048
+ });
1842
2049
  },
1843
2050
  visitArrayValue(node, { self }) {
1844
- return mergeManifests(
1845
- node.items.map((v) => (0, import_visitors_core20.visit)(v, self)),
2051
+ return mergeTypeManifests(
2052
+ node.items.map((v) => (0, import_visitors_core30.visit)(v, self)),
1846
2053
  { mergeValues: (renders) => `[${renders.join(", ")}]` }
1847
2054
  );
1848
2055
  },
@@ -1853,75 +2060,74 @@ function getTypeManifestVisitor(input) {
1853
2060
  let sizeDecoder = "";
1854
2061
  const resolvedSize = (0, import_nodes24.resolveNestedTypeNode)(booleanType.size);
1855
2062
  if (resolvedSize.format !== "u8" || resolvedSize.endian !== "le") {
1856
- const size = (0, import_visitors_core20.visit)(booleanType.size, self);
2063
+ const size = (0, import_visitors_core30.visit)(booleanType.size, self);
1857
2064
  encoderImports.mergeWith(size.encoder);
1858
2065
  decoderImports.mergeWith(size.decoder);
1859
- sizeEncoder = `{ size: ${size.encoder.render} }`;
1860
- sizeDecoder = `{ size: ${size.decoder.render} }`;
2066
+ sizeEncoder = `{ size: ${size.encoder.content} }`;
2067
+ sizeDecoder = `{ size: ${size.decoder.content} }`;
1861
2068
  }
1862
- return {
1863
- decoder: fragment(`getBooleanDecoder(${sizeDecoder})`, decoderImports),
1864
- encoder: fragment(`getBooleanEncoder(${sizeEncoder})`, encoderImports),
1865
- isEnum: false,
2069
+ return typeManifest({
2070
+ decoder: (0, import_visitors_core30.pipe)(
2071
+ fragment(`getBooleanDecoder(${sizeDecoder})`),
2072
+ (f) => mergeFragmentImports(f, [decoderImports])
2073
+ ),
2074
+ encoder: (0, import_visitors_core30.pipe)(
2075
+ fragment(`getBooleanEncoder(${sizeEncoder})`),
2076
+ (f) => mergeFragmentImports(f, [encoderImports])
2077
+ ),
1866
2078
  looseType: fragment("boolean"),
1867
- strictType: fragment("boolean"),
1868
- value: fragment("")
1869
- };
2079
+ strictType: fragment("boolean")
2080
+ });
1870
2081
  },
1871
2082
  visitBooleanValue(node) {
1872
- const manifest = typeManifest();
1873
- manifest.value.setRender(JSON.stringify(node.boolean));
1874
- return manifest;
2083
+ return typeManifest({
2084
+ value: fragment(JSON.stringify(node.boolean))
2085
+ });
1875
2086
  },
1876
2087
  visitBytesType() {
1877
- return {
1878
- decoder: fragment(`getBytesDecoder()`).addImports(
1879
- "solanaCodecsDataStructures",
1880
- "getBytesDecoder"
1881
- ),
1882
- encoder: fragment(`getBytesEncoder()`).addImports(
1883
- "solanaCodecsDataStructures",
1884
- "getBytesEncoder"
1885
- ),
1886
- isEnum: false,
1887
- looseType: fragment("ReadonlyUint8Array").addImports(
1888
- "solanaCodecsCore",
1889
- "type ReadonlyUint8Array"
2088
+ const readonlyUint8Array = (0, import_visitors_core30.pipe)(
2089
+ fragment("ReadonlyUint8Array"),
2090
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["type ReadonlyUint8Array"])
2091
+ );
2092
+ return typeManifest({
2093
+ decoder: (0, import_visitors_core30.pipe)(
2094
+ fragment(`getBytesDecoder()`),
2095
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getBytesDecoder"])
1890
2096
  ),
1891
- strictType: fragment("ReadonlyUint8Array").addImports(
1892
- "solanaCodecsCore",
1893
- "type ReadonlyUint8Array"
2097
+ encoder: (0, import_visitors_core30.pipe)(
2098
+ fragment(`getBytesEncoder()`),
2099
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getBytesEncoder"])
1894
2100
  ),
1895
- value: fragment("")
1896
- };
2101
+ looseType: readonlyUint8Array,
2102
+ strictType: readonlyUint8Array
2103
+ });
1897
2104
  },
1898
2105
  visitBytesValue(node) {
1899
- const manifest = typeManifest();
1900
2106
  const bytes = getBytesFromBytesValueNode(node);
1901
- manifest.value.setRender(`new Uint8Array([${Array.from(bytes).join(", ")}])`);
1902
- return manifest;
2107
+ return typeManifest({
2108
+ value: fragment(`new Uint8Array([${Array.from(bytes).join(", ")}])`)
2109
+ });
1903
2110
  },
1904
2111
  visitConstantValue(node, { self }) {
1905
2112
  if ((0, import_nodes24.isNode)(node.type, "bytesTypeNode") && (0, import_nodes24.isNode)(node.value, "bytesValueNode")) {
1906
- return (0, import_visitors_core20.visit)(node.value, self);
2113
+ return (0, import_visitors_core30.visit)(node.value, self);
1907
2114
  }
1908
- return {
1909
- ...typeManifest(),
2115
+ return typeManifest({
1910
2116
  value: mergeFragments(
1911
- [(0, import_visitors_core20.visit)(node.type, self).encoder, (0, import_visitors_core20.visit)(node.value, self).value],
2117
+ [(0, import_visitors_core30.visit)(node.type, self).encoder, (0, import_visitors_core30.visit)(node.value, self).value],
1912
2118
  ([encoderFunction, value]) => `${encoderFunction}.encode(${value})`
1913
2119
  )
1914
- };
2120
+ });
1915
2121
  },
1916
2122
  visitDateTimeType(dateTimeType, { self }) {
1917
- return (0, import_visitors_core20.visit)(dateTimeType.number, self);
2123
+ return (0, import_visitors_core30.visit)(dateTimeType.number, self);
1918
2124
  },
1919
2125
  visitDefinedType(definedType, { self }) {
1920
2126
  parentName = {
1921
2127
  loose: nameApi.dataArgsType(definedType.name),
1922
2128
  strict: nameApi.dataType(definedType.name)
1923
2129
  };
1924
- const manifest = (0, import_visitors_core20.visit)(definedType.type, self);
2130
+ const manifest = (0, import_visitors_core30.visit)(definedType.type, self);
1925
2131
  parentName = null;
1926
2132
  return manifest;
1927
2133
  },
@@ -1931,33 +2137,41 @@ function getTypeManifestVisitor(input) {
1931
2137
  const encoderFunction = nameApi.encoderFunction(node.name);
1932
2138
  const decoderFunction = nameApi.decoderFunction(node.name);
1933
2139
  const importFrom = getImportFrom(node);
1934
- return {
1935
- decoder: fragment(`${decoderFunction}()`).addImports(importFrom, decoderFunction),
1936
- encoder: fragment(`${encoderFunction}()`).addImports(importFrom, encoderFunction),
1937
- isEnum: false,
1938
- looseType: fragment(looseName).addImports(importFrom, `type ${looseName}`),
1939
- strictType: fragment(strictName).addImports(importFrom, `type ${strictName}`),
1940
- value: fragment("")
1941
- };
2140
+ return typeManifest({
2141
+ decoder: (0, import_visitors_core30.pipe)(
2142
+ fragment(`${decoderFunction}()`),
2143
+ (f) => addFragmentImports(f, importFrom, [decoderFunction])
2144
+ ),
2145
+ encoder: (0, import_visitors_core30.pipe)(
2146
+ fragment(`${encoderFunction}()`),
2147
+ (f) => addFragmentImports(f, importFrom, [encoderFunction])
2148
+ ),
2149
+ looseType: (0, import_visitors_core30.pipe)(
2150
+ fragment(looseName),
2151
+ (f) => addFragmentImports(f, importFrom, [`type ${looseName}`])
2152
+ ),
2153
+ strictType: (0, import_visitors_core30.pipe)(
2154
+ fragment(strictName),
2155
+ (f) => addFragmentImports(f, importFrom, [`type ${strictName}`])
2156
+ )
2157
+ });
1942
2158
  },
1943
2159
  visitEnumEmptyVariantType(enumEmptyVariantType) {
1944
2160
  const discriminator = nameApi.discriminatedUnionDiscriminator((0, import_nodes24.camelCase)(parentName?.strict ?? ""));
1945
2161
  const name = nameApi.discriminatedUnionVariant(enumEmptyVariantType.name);
1946
2162
  const kindAttribute = `${discriminator}: "${name}"`;
1947
- return {
1948
- decoder: fragment(`['${name}', getUnitDecoder()]`).addImports(
1949
- "solanaCodecsDataStructures",
1950
- "getUnitDecoder"
2163
+ return typeManifest({
2164
+ decoder: (0, import_visitors_core30.pipe)(
2165
+ fragment(`['${name}', getUnitDecoder()]`),
2166
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getUnitDecoder"])
1951
2167
  ),
1952
- encoder: fragment(`['${name}', getUnitEncoder()]`).addImports(
1953
- "solanaCodecsDataStructures",
1954
- "getUnitEncoder"
2168
+ encoder: (0, import_visitors_core30.pipe)(
2169
+ fragment(`['${name}', getUnitEncoder()]`),
2170
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getUnitEncoder"])
1955
2171
  ),
1956
- isEnum: false,
1957
2172
  looseType: fragment(`{ ${kindAttribute} }`),
1958
- strictType: fragment(`{ ${kindAttribute} }`),
1959
- value: fragment("")
1960
- };
2173
+ strictType: fragment(`{ ${kindAttribute} }`)
2174
+ });
1961
2175
  },
1962
2176
  visitEnumStructVariantType(enumStructVariantType, { self }) {
1963
2177
  const currentParentName = parentName;
@@ -1967,13 +2181,21 @@ function getTypeManifestVisitor(input) {
1967
2181
  const name = nameApi.discriminatedUnionVariant(enumStructVariantType.name);
1968
2182
  const kindAttribute = `${discriminator}: "${name}"`;
1969
2183
  parentName = null;
1970
- const structManifest = (0, import_visitors_core20.visit)(enumStructVariantType.struct, self);
2184
+ const structManifest = (0, import_visitors_core30.visit)(enumStructVariantType.struct, self);
1971
2185
  parentName = currentParentName;
1972
- structManifest.strictType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1973
- structManifest.looseType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1974
- structManifest.encoder.mapRender((r) => `['${name}', ${r}]`);
1975
- structManifest.decoder.mapRender((r) => `['${name}', ${r}]`);
1976
- return structManifest;
2186
+ return typeManifest({
2187
+ ...structManifest,
2188
+ decoder: (0, import_visitors_core30.pipe)(structManifest.decoder, (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `['${name}', ${c}]`)),
2189
+ encoder: (0, import_visitors_core30.pipe)(structManifest.encoder, (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `['${name}', ${c}]`)),
2190
+ looseType: (0, import_visitors_core30.pipe)(
2191
+ structManifest.looseType,
2192
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `{ ${kindAttribute},${c.slice(1, -1)}}`)
2193
+ ),
2194
+ strictType: (0, import_visitors_core30.pipe)(
2195
+ structManifest.strictType,
2196
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `{ ${kindAttribute},${c.slice(1, -1)}}`)
2197
+ )
2198
+ });
1977
2199
  },
1978
2200
  visitEnumTupleVariantType(enumTupleVariantType, { self }) {
1979
2201
  const currentParentName = parentName;
@@ -1989,13 +2211,21 @@ function getTypeManifestVisitor(input) {
1989
2211
  })
1990
2212
  ]);
1991
2213
  parentName = null;
1992
- const structManifest = (0, import_visitors_core20.visit)(struct, self);
2214
+ const structManifest = (0, import_visitors_core30.visit)(struct, self);
1993
2215
  parentName = currentParentName;
1994
- structManifest.strictType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1995
- structManifest.looseType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1996
- structManifest.encoder.mapRender((r) => `['${name}', ${r}]`);
1997
- structManifest.decoder.mapRender((r) => `['${name}', ${r}]`);
1998
- return structManifest;
2216
+ return typeManifest({
2217
+ ...structManifest,
2218
+ decoder: (0, import_visitors_core30.pipe)(structManifest.decoder, (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `['${name}', ${c}]`)),
2219
+ encoder: (0, import_visitors_core30.pipe)(structManifest.encoder, (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `['${name}', ${c}]`)),
2220
+ looseType: (0, import_visitors_core30.pipe)(
2221
+ structManifest.looseType,
2222
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `{ ${kindAttribute},${c.slice(1, -1)}}`)
2223
+ ),
2224
+ strictType: (0, import_visitors_core30.pipe)(
2225
+ structManifest.strictType,
2226
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `{ ${kindAttribute},${c.slice(1, -1)}}`)
2227
+ )
2228
+ });
1999
2229
  },
2000
2230
  visitEnumType(enumType, { self }) {
2001
2231
  const currentParentName = parentName;
@@ -2005,11 +2235,11 @@ function getTypeManifestVisitor(input) {
2005
2235
  const decoderOptions = [];
2006
2236
  const enumSize = (0, import_nodes24.resolveNestedTypeNode)(enumType.size);
2007
2237
  if (enumSize.format !== "u8" || enumSize.endian !== "le") {
2008
- const sizeManifest = (0, import_visitors_core20.visit)(enumType.size, self);
2238
+ const sizeManifest = (0, import_visitors_core30.visit)(enumType.size, self);
2009
2239
  encoderImports.mergeWith(sizeManifest.encoder);
2010
2240
  decoderImports.mergeWith(sizeManifest.decoder);
2011
- encoderOptions.push(`size: ${sizeManifest.encoder.render}`);
2012
- decoderOptions.push(`size: ${sizeManifest.decoder.render}`);
2241
+ encoderOptions.push(`size: ${sizeManifest.encoder.content}`);
2242
+ decoderOptions.push(`size: ${sizeManifest.decoder.content}`);
2013
2243
  }
2014
2244
  const discriminator = nameApi.discriminatedUnionDiscriminator(
2015
2245
  (0, import_nodes24.camelCase)(currentParentName?.strict ?? "")
@@ -2027,31 +2257,50 @@ function getTypeManifestVisitor(input) {
2027
2257
  );
2028
2258
  }
2029
2259
  const variantNames = enumType.variants.map(({ name }) => nameApi.enumVariant(name));
2030
- return {
2031
- decoder: fragment(
2032
- `getEnumDecoder(${currentParentName.strict + decoderOptionsAsString})`,
2033
- decoderImports.add("solanaCodecsDataStructures", "getEnumDecoder")
2260
+ return typeManifest({
2261
+ decoder: (0, import_visitors_core30.pipe)(
2262
+ fragment(`getEnumDecoder(${currentParentName.strict + decoderOptionsAsString})`),
2263
+ (f) => mergeFragmentImports(f, [decoderImports]),
2264
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getEnumDecoder"])
2034
2265
  ),
2035
- encoder: fragment(
2036
- `getEnumEncoder(${currentParentName.strict + encoderOptionsAsString})`,
2037
- encoderImports.add("solanaCodecsDataStructures", "getEnumEncoder")
2266
+ encoder: (0, import_visitors_core30.pipe)(
2267
+ fragment(`getEnumEncoder(${currentParentName.strict + encoderOptionsAsString})`),
2268
+ (f) => mergeFragmentImports(f, [encoderImports]),
2269
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getEnumEncoder"])
2038
2270
  ),
2039
2271
  isEnum: true,
2040
2272
  looseType: fragment(`{ ${variantNames.join(", ")} }`),
2041
- strictType: fragment(`{ ${variantNames.join(", ")} }`),
2042
- value: fragment("")
2043
- };
2273
+ strictType: fragment(`{ ${variantNames.join(", ")} }`)
2274
+ });
2044
2275
  }
2045
- const mergedManifest = mergeManifests(
2046
- enumType.variants.map((variant) => (0, import_visitors_core20.visit)(variant, self)),
2276
+ const mergedManifest = mergeTypeManifests(
2277
+ enumType.variants.map((variant) => (0, import_visitors_core30.visit)(variant, self)),
2047
2278
  {
2048
2279
  mergeCodecs: (renders) => renders.join(", "),
2049
2280
  mergeTypes: (renders) => renders.join(" | ")
2050
2281
  }
2051
2282
  );
2052
- mergedManifest.encoder.mapRender((r) => `getDiscriminatedUnionEncoder([${r}]${encoderOptionsAsString})`).mergeImportsWith(encoderImports).addImports("solanaCodecsDataStructures", ["getDiscriminatedUnionEncoder"]);
2053
- mergedManifest.decoder.mapRender((r) => `getDiscriminatedUnionDecoder([${r}]${decoderOptionsAsString})`).mergeImportsWith(decoderImports).addImports("solanaCodecsDataStructures", ["getDiscriminatedUnionDecoder"]);
2054
- return mergedManifest;
2283
+ return typeManifest({
2284
+ ...mergedManifest,
2285
+ decoder: (0, import_visitors_core30.pipe)(
2286
+ mergedManifest.decoder,
2287
+ (f) => (0, import_renderers_core12.mapFragmentContent)(
2288
+ f,
2289
+ (c) => `getDiscriminatedUnionDecoder([${c}]${decoderOptionsAsString})`
2290
+ ),
2291
+ (f) => mergeFragmentImports(f, [decoderImports]),
2292
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getDiscriminatedUnionDecoder"])
2293
+ ),
2294
+ encoder: (0, import_visitors_core30.pipe)(
2295
+ mergedManifest.encoder,
2296
+ (f) => (0, import_renderers_core12.mapFragmentContent)(
2297
+ f,
2298
+ (c) => `getDiscriminatedUnionEncoder([${c}]${encoderOptionsAsString})`
2299
+ ),
2300
+ (f) => mergeFragmentImports(f, [encoderImports]),
2301
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getDiscriminatedUnionEncoder"])
2302
+ )
2303
+ });
2055
2304
  },
2056
2305
  visitEnumValue(node, { self }) {
2057
2306
  const manifest = typeManifest();
@@ -2062,40 +2311,108 @@ function getTypeManifestVisitor(input) {
2062
2311
  const isScalar = enumNode && (0, import_nodes24.isNode)(enumNode, "enumTypeNode") ? (0, import_nodes24.isScalarEnum)(enumNode) : !nonScalarEnums.includes(node.enum.name);
2063
2312
  if (!node.value && isScalar) {
2064
2313
  const variantName2 = nameApi.enumVariant(node.variant);
2065
- manifest.value.setRender(`${enumName}.${variantName2}`).addImports(importFrom, enumName);
2066
- return manifest;
2314
+ return typeManifest({
2315
+ ...manifest,
2316
+ value: (0, import_visitors_core30.pipe)(
2317
+ manifest.value,
2318
+ (f) => (0, import_renderers_core12.setFragmentContent)(f, `${enumName}.${variantName2}`),
2319
+ (f) => addFragmentImports(f, importFrom, [enumName])
2320
+ )
2321
+ });
2067
2322
  }
2068
2323
  const variantName = nameApi.discriminatedUnionVariant(node.variant);
2069
2324
  if (!node.value) {
2070
- manifest.value.setRender(`${enumFunction}('${variantName}')`).addImports(importFrom, enumFunction);
2071
- return manifest;
2325
+ return typeManifest({
2326
+ ...manifest,
2327
+ value: (0, import_visitors_core30.pipe)(
2328
+ manifest.value,
2329
+ (f) => (0, import_renderers_core12.setFragmentContent)(f, `${enumFunction}('${variantName}')`),
2330
+ (f) => addFragmentImports(f, importFrom, [enumFunction])
2331
+ )
2332
+ });
2072
2333
  }
2073
- manifest.value = (0, import_visitors_core20.visit)(node.value, self).value.mapRender((r) => `${enumFunction}('${variantName}', ${r})`).addImports(importFrom, enumFunction);
2074
- return manifest;
2334
+ return typeManifest({
2335
+ ...manifest,
2336
+ value: (0, import_visitors_core30.pipe)(
2337
+ (0, import_visitors_core30.visit)(node.value, self).value,
2338
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `${enumFunction}('${variantName}', ${c})`),
2339
+ (f) => addFragmentImports(f, importFrom, [enumFunction])
2340
+ )
2341
+ });
2075
2342
  },
2076
2343
  visitFixedSizeType(node, { self }) {
2077
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2078
- manifest.encoder.mapRender((r) => `fixEncoderSize(${r}, ${node.size})`).addImports("solanaCodecsCore", "fixEncoderSize");
2079
- manifest.decoder.mapRender((r) => `fixDecoderSize(${r}, ${node.size})`).addImports("solanaCodecsCore", "fixDecoderSize");
2080
- return manifest;
2344
+ const manifest = (0, import_visitors_core30.visit)(node.type, self);
2345
+ return typeManifest({
2346
+ ...manifest,
2347
+ decoder: (0, import_visitors_core30.pipe)(
2348
+ manifest.decoder,
2349
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `fixDecoderSize(${c}, ${node.size})`),
2350
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["fixDecoderSize"])
2351
+ ),
2352
+ encoder: (0, import_visitors_core30.pipe)(
2353
+ manifest.encoder,
2354
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `fixEncoderSize(${c}, ${node.size})`),
2355
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["fixEncoderSize"])
2356
+ )
2357
+ });
2081
2358
  },
2082
2359
  visitHiddenPrefixType(node, { self }) {
2083
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2084
- const prefixes = node.prefix.map((c) => (0, import_visitors_core20.visit)(c, self).value);
2085
- const prefixEncoders = fragment(prefixes.map((c) => `getConstantEncoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantEncoder").mergeImportsWith(...prefixes);
2086
- const prefixDecoders = fragment(prefixes.map((c) => `getConstantDecoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantDecoder").mergeImportsWith(...prefixes);
2087
- manifest.encoder.mapRender((r) => `getHiddenPrefixEncoder(${r}, [${prefixEncoders.render}])`).mergeImportsWith(prefixEncoders).addImports("solanaCodecsDataStructures", "getHiddenPrefixEncoder");
2088
- manifest.decoder.mapRender((r) => `getHiddenPrefixDecoder(${r}, [${prefixDecoders.render}])`).mergeImportsWith(prefixDecoders).addImports("solanaCodecsDataStructures", "getHiddenPrefixDecoder");
2089
- return manifest;
2360
+ const manifest = (0, import_visitors_core30.visit)(node.type, self);
2361
+ const prefixes = node.prefix.map((c) => (0, import_visitors_core30.visit)(c, self).value);
2362
+ const prefixEncoders = (0, import_visitors_core30.pipe)(
2363
+ mergeFragments(prefixes, (contents) => contents.map((c) => `getConstantEncoder(${c})`).join(", ")),
2364
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["getConstantEncoder"])
2365
+ );
2366
+ const prefixDecoders = (0, import_visitors_core30.pipe)(
2367
+ mergeFragments(prefixes, (contents) => contents.map((c) => `getConstantDecoder(${c})`).join(", ")),
2368
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["getConstantDecoder"])
2369
+ );
2370
+ return typeManifest({
2371
+ ...manifest,
2372
+ decoder: (0, import_visitors_core30.pipe)(
2373
+ mergeFragments(
2374
+ [manifest.decoder, prefixDecoders],
2375
+ ([child, prefixes2]) => `getHiddenPrefixDecoder(${child}, [${prefixes2}])`
2376
+ ),
2377
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getHiddenPrefixDecoder"])
2378
+ ),
2379
+ encoder: (0, import_visitors_core30.pipe)(
2380
+ mergeFragments(
2381
+ [manifest.encoder, prefixEncoders],
2382
+ ([child, prefixes2]) => `getHiddenPrefixEncoder(${child}, [${prefixes2}])`
2383
+ ),
2384
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getHiddenPrefixEncoder"])
2385
+ )
2386
+ });
2090
2387
  },
2091
2388
  visitHiddenSuffixType(node, { self }) {
2092
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2093
- const suffixes = node.suffix.map((c) => (0, import_visitors_core20.visit)(c, self).value);
2094
- const suffixEncoders = fragment(suffixes.map((c) => `getConstantEncoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantEncoder").mergeImportsWith(...suffixes);
2095
- const suffixDecoders = fragment(suffixes.map((c) => `getConstantDecoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantDecoder").mergeImportsWith(...suffixes);
2096
- manifest.encoder.mapRender((r) => `getHiddenSuffixEncoder(${r}, [${suffixEncoders.render}])`).mergeImportsWith(suffixEncoders).addImports("solanaCodecsDataStructures", "getHiddenSuffixEncoder");
2097
- manifest.decoder.mapRender((r) => `getHiddenSuffixDecoder(${r}, [${suffixDecoders.render}])`).mergeImportsWith(suffixDecoders).addImports("solanaCodecsDataStructures", "getHiddenSuffixDecoder");
2098
- return manifest;
2389
+ const manifest = (0, import_visitors_core30.visit)(node.type, self);
2390
+ const suffixes = node.suffix.map((c) => (0, import_visitors_core30.visit)(c, self).value);
2391
+ const suffixEncoders = (0, import_visitors_core30.pipe)(
2392
+ mergeFragments(suffixes, (contents) => contents.map((c) => `getConstantEncoder(${c})`).join(", ")),
2393
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["getConstantEncoder"])
2394
+ );
2395
+ const suffixDecoders = (0, import_visitors_core30.pipe)(
2396
+ mergeFragments(suffixes, (contents) => contents.map((c) => `getConstantDecoder(${c})`).join(", ")),
2397
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["getConstantDecoder"])
2398
+ );
2399
+ return typeManifest({
2400
+ ...manifest,
2401
+ decoder: (0, import_visitors_core30.pipe)(
2402
+ mergeFragments(
2403
+ [manifest.decoder, suffixDecoders],
2404
+ ([child, suffixes2]) => `getHiddenSuffixDecoder(${child}, [${suffixes2}])`
2405
+ ),
2406
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getHiddenSuffixDecoder"])
2407
+ ),
2408
+ encoder: (0, import_visitors_core30.pipe)(
2409
+ mergeFragments(
2410
+ [manifest.encoder, suffixEncoders],
2411
+ ([child, suffixes2]) => `getHiddenSuffixEncoder(${child}, [${suffixes2}])`
2412
+ ),
2413
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getHiddenSuffixEncoder"])
2414
+ )
2415
+ });
2099
2416
  },
2100
2417
  visitInstruction(instruction, { self }) {
2101
2418
  const instructionDataName = nameApi.instructionDataType(instruction.name);
@@ -2105,39 +2422,49 @@ function getTypeManifestVisitor(input) {
2105
2422
  };
2106
2423
  const link = customInstructionData.get(instruction.name)?.linkNode;
2107
2424
  const struct = (0, import_nodes24.structTypeNodeFromInstructionArgumentNodes)(instruction.arguments);
2108
- const manifest = link ? (0, import_visitors_core20.visit)(link, self) : (0, import_visitors_core20.visit)(struct, self);
2425
+ const manifest = link ? (0, import_visitors_core30.visit)(link, self) : (0, import_visitors_core30.visit)(struct, self);
2109
2426
  parentName = null;
2110
2427
  return manifest;
2111
2428
  },
2112
2429
  visitMapEntryValue(node, { self }) {
2113
- return mergeManifests([(0, import_visitors_core20.visit)(node.key, self), (0, import_visitors_core20.visit)(node.value, self)], {
2430
+ return mergeTypeManifests([(0, import_visitors_core30.visit)(node.key, self), (0, import_visitors_core30.visit)(node.value, self)], {
2114
2431
  mergeValues: (renders) => `[${renders.join(", ")}]`
2115
2432
  });
2116
2433
  },
2117
2434
  visitMapType(mapType, { self }) {
2118
- const key = (0, import_visitors_core20.visit)(mapType.key, self);
2119
- const value = (0, import_visitors_core20.visit)(mapType.value, self);
2120
- const mergedManifest = mergeManifests([key, value], {
2435
+ const key = (0, import_visitors_core30.visit)(mapType.key, self);
2436
+ const value = (0, import_visitors_core30.visit)(mapType.value, self);
2437
+ const mergedManifest = mergeTypeManifests([key, value], {
2121
2438
  mergeCodecs: ([k, v]) => `${k}, ${v}`,
2122
2439
  mergeTypes: ([k, v]) => `Map<${k}, ${v}>`
2123
2440
  });
2124
2441
  const sizeManifest = getArrayLikeSizeOption(mapType.count, self);
2125
- const encoderOptions = sizeManifest.encoder.render ? `, { ${sizeManifest.encoder.render} }` : "";
2126
- const decoderOptions = sizeManifest.decoder.render ? `, { ${sizeManifest.decoder.render} }` : "";
2127
- mergedManifest.encoder.mapRender((r) => `getMapEncoder(${r}${encoderOptions})`).addImports("solanaCodecsDataStructures", "getMapEncoder");
2128
- mergedManifest.decoder.mapRender((r) => `getMapDecoder(${r}${decoderOptions})`).addImports("solanaCodecsDataStructures", "getMapDecoder");
2129
- return mergedManifest;
2442
+ const encoderOptions = sizeManifest.encoder.content ? `, { ${sizeManifest.encoder.content} }` : "";
2443
+ const decoderOptions = sizeManifest.decoder.content ? `, { ${sizeManifest.decoder.content} }` : "";
2444
+ return typeManifest({
2445
+ ...mergedManifest,
2446
+ decoder: (0, import_visitors_core30.pipe)(
2447
+ mergedManifest.decoder,
2448
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getMapDecoder(${c}${decoderOptions})`),
2449
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getMapDecoder"])
2450
+ ),
2451
+ encoder: (0, import_visitors_core30.pipe)(
2452
+ mergedManifest.encoder,
2453
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getMapEncoder(${c}${encoderOptions})`),
2454
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getMapEncoder"])
2455
+ )
2456
+ });
2130
2457
  },
2131
2458
  visitMapValue(node, { self }) {
2132
- const entryFragments = node.entries.map((entry) => (0, import_visitors_core20.visit)(entry, self));
2133
- return mergeManifests(entryFragments, {
2459
+ const entryFragments = node.entries.map((entry) => (0, import_visitors_core30.visit)(entry, self));
2460
+ return mergeTypeManifests(entryFragments, {
2134
2461
  mergeValues: (renders) => `new Map([${renders.join(", ")}])`
2135
2462
  });
2136
2463
  },
2137
2464
  visitNoneValue() {
2138
- const manifest = typeManifest();
2139
- manifest.value.setRender("none()").addImports("solanaOptions", "none");
2140
- return manifest;
2465
+ return typeManifest({
2466
+ value: (0, import_visitors_core30.pipe)(fragment("none()"), (f) => addFragmentImports(f, "solanaOptions", ["none"]))
2467
+ });
2141
2468
  },
2142
2469
  visitNumberType(numberType) {
2143
2470
  const encoderFunction = nameApi.encoderFunction(numberType.format);
@@ -2151,33 +2478,37 @@ function getTypeManifestVisitor(input) {
2151
2478
  decoderImports.add("solanaCodecsNumbers", "Endian");
2152
2479
  endianness = "{ endian: Endian.Big }";
2153
2480
  }
2154
- return {
2155
- decoder: fragment(`${decoderFunction}(${endianness})`, decoderImports),
2156
- encoder: fragment(`${encoderFunction}(${endianness})`, encoderImports),
2157
- isEnum: false,
2481
+ return typeManifest({
2482
+ decoder: (0, import_visitors_core30.pipe)(
2483
+ fragment(`${decoderFunction}(${endianness})`),
2484
+ (f) => mergeFragmentImports(f, [decoderImports])
2485
+ ),
2486
+ encoder: (0, import_visitors_core30.pipe)(
2487
+ fragment(`${encoderFunction}(${endianness})`),
2488
+ (f) => mergeFragmentImports(f, [encoderImports])
2489
+ ),
2158
2490
  looseType: fragment(isBigNumber ? "number | bigint" : "number"),
2159
- strictType: fragment(isBigNumber ? "bigint" : "number"),
2160
- value: fragment("")
2161
- };
2491
+ strictType: fragment(isBigNumber ? "bigint" : "number")
2492
+ });
2162
2493
  },
2163
2494
  visitNumberValue(node) {
2164
- const manifest = typeManifest();
2165
- manifest.value.setRender(JSON.stringify(node.number));
2166
- return manifest;
2495
+ return typeManifest({
2496
+ value: fragment(JSON.stringify(node.number))
2497
+ });
2167
2498
  },
2168
2499
  visitOptionType(optionType, { self }) {
2169
- const childManifest = (0, import_visitors_core20.visit)(optionType.item, self);
2170
- childManifest.strictType.mapRender((r) => `Option<${r}>`).addImports("solanaOptions", "type Option");
2171
- childManifest.looseType.mapRender((r) => `OptionOrNullable<${r}>`).addImports("solanaOptions", "type OptionOrNullable");
2500
+ const childManifest = (0, import_visitors_core30.visit)(optionType.item, self);
2172
2501
  const encoderOptions = [];
2173
2502
  const decoderOptions = [];
2503
+ const encoderImports = new ImportMap();
2504
+ const decoderImports = new ImportMap();
2174
2505
  const optionPrefix = (0, import_nodes24.resolveNestedTypeNode)(optionType.prefix);
2175
2506
  if (optionPrefix.format !== "u8" || optionPrefix.endian !== "le") {
2176
- const prefixManifest = (0, import_visitors_core20.visit)(optionType.prefix, self);
2177
- childManifest.encoder.mergeImportsWith(prefixManifest.encoder);
2178
- childManifest.decoder.mergeImportsWith(prefixManifest.decoder);
2179
- encoderOptions.push(`prefix: ${prefixManifest.encoder.render}`);
2180
- decoderOptions.push(`prefix: ${prefixManifest.decoder.render}`);
2507
+ const prefixManifest = (0, import_visitors_core30.visit)(optionType.prefix, self);
2508
+ encoderImports.mergeWith(prefixManifest.encoder);
2509
+ decoderImports.mergeWith(prefixManifest.decoder);
2510
+ encoderOptions.push(`prefix: ${prefixManifest.encoder.content}`);
2511
+ decoderOptions.push(`prefix: ${prefixManifest.decoder.content}`);
2181
2512
  }
2182
2513
  if (optionType.fixed) {
2183
2514
  encoderOptions.push(`noneValue: "zeroes"`);
@@ -2185,16 +2516,48 @@ function getTypeManifestVisitor(input) {
2185
2516
  }
2186
2517
  const encoderOptionsAsString = encoderOptions.length > 0 ? `, { ${encoderOptions.join(", ")} }` : "";
2187
2518
  const decoderOptionsAsString = decoderOptions.length > 0 ? `, { ${decoderOptions.join(", ")} }` : "";
2188
- childManifest.encoder.mapRender((r) => `getOptionEncoder(${r + encoderOptionsAsString})`).addImports("solanaOptions", "getOptionEncoder");
2189
- childManifest.decoder.mapRender((r) => `getOptionDecoder(${r + decoderOptionsAsString})`).addImports("solanaOptions", "getOptionDecoder");
2190
- return childManifest;
2519
+ return typeManifest({
2520
+ ...childManifest,
2521
+ decoder: (0, import_visitors_core30.pipe)(
2522
+ childManifest.decoder,
2523
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getOptionDecoder(${c + decoderOptionsAsString})`),
2524
+ (f) => addFragmentImports(f, "solanaOptions", ["getOptionDecoder"]),
2525
+ (f) => mergeFragmentImports(f, [decoderImports])
2526
+ ),
2527
+ encoder: (0, import_visitors_core30.pipe)(
2528
+ childManifest.encoder,
2529
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getOptionEncoder(${c + encoderOptionsAsString})`),
2530
+ (f) => addFragmentImports(f, "solanaOptions", ["getOptionEncoder"]),
2531
+ (f) => mergeFragmentImports(f, [encoderImports])
2532
+ ),
2533
+ looseType: (0, import_visitors_core30.pipe)(
2534
+ childManifest.looseType,
2535
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `OptionOrNullable<${c}>`),
2536
+ (f) => addFragmentImports(f, "solanaOptions", ["type OptionOrNullable"])
2537
+ ),
2538
+ strictType: (0, import_visitors_core30.pipe)(
2539
+ childManifest.strictType,
2540
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `Option<${c}>`),
2541
+ (f) => addFragmentImports(f, "solanaOptions", ["type Option"])
2542
+ )
2543
+ });
2191
2544
  },
2192
2545
  visitPostOffsetType(node, { self }) {
2193
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2546
+ const manifest = (0, import_visitors_core30.visit)(node.type, self);
2194
2547
  if (node.strategy === "padded") {
2195
- manifest.encoder.mapRender((r) => `padRightEncoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padRightEncoder");
2196
- manifest.decoder.mapRender((r) => `padRightDecoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padRightDecoder");
2197
- return manifest;
2548
+ return typeManifest({
2549
+ ...manifest,
2550
+ decoder: (0, import_visitors_core30.pipe)(
2551
+ manifest.decoder,
2552
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `padRightDecoder(${c}, ${node.offset})`),
2553
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["padRightDecoder"])
2554
+ ),
2555
+ encoder: (0, import_visitors_core30.pipe)(
2556
+ manifest.encoder,
2557
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `padRightEncoder(${c}, ${node.offset})`),
2558
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["padRightEncoder"])
2559
+ )
2560
+ });
2198
2561
  }
2199
2562
  const fn = (() => {
2200
2563
  switch (node.strategy) {
@@ -2207,16 +2570,36 @@ function getTypeManifestVisitor(input) {
2207
2570
  return node.offset < 0 ? `({ postOffset }) => postOffset ${node.offset}` : `({ postOffset }) => postOffset + ${node.offset}`;
2208
2571
  }
2209
2572
  })();
2210
- manifest.encoder.mapRender((r) => `offsetEncoder(${r}, { postOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetEncoder");
2211
- manifest.decoder.mapRender((r) => `offsetDecoder(${r}, { postOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetDecoder");
2212
- return manifest;
2573
+ return typeManifest({
2574
+ ...manifest,
2575
+ decoder: (0, import_visitors_core30.pipe)(
2576
+ manifest.decoder,
2577
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `offsetDecoder(${c}, { postOffset: ${fn} })`),
2578
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["offsetDecoder"])
2579
+ ),
2580
+ encoder: (0, import_visitors_core30.pipe)(
2581
+ manifest.encoder,
2582
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `offsetEncoder(${c}, { postOffset: ${fn} })`),
2583
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["offsetEncoder"])
2584
+ )
2585
+ });
2213
2586
  },
2214
2587
  visitPreOffsetType(node, { self }) {
2215
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2588
+ const manifest = (0, import_visitors_core30.visit)(node.type, self);
2216
2589
  if (node.strategy === "padded") {
2217
- manifest.encoder.mapRender((r) => `padLeftEncoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padLeftEncoder");
2218
- manifest.decoder.mapRender((r) => `padLeftDecoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padLeftDecoder");
2219
- return manifest;
2590
+ return typeManifest({
2591
+ ...manifest,
2592
+ decoder: (0, import_visitors_core30.pipe)(
2593
+ manifest.decoder,
2594
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `padLeftDecoder(${c}, ${node.offset})`),
2595
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["padLeftDecoder"])
2596
+ ),
2597
+ encoder: (0, import_visitors_core30.pipe)(
2598
+ manifest.encoder,
2599
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `padLeftEncoder(${c}, ${node.offset})`),
2600
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["padLeftEncoder"])
2601
+ )
2602
+ });
2220
2603
  }
2221
2604
  const fn = (() => {
2222
2605
  switch (node.strategy) {
@@ -2227,85 +2610,177 @@ function getTypeManifestVisitor(input) {
2227
2610
  return node.offset < 0 ? `({ preOffset }) => preOffset ${node.offset}` : `({ preOffset }) => preOffset + ${node.offset}`;
2228
2611
  }
2229
2612
  })();
2230
- manifest.encoder.mapRender((r) => `offsetEncoder(${r}, { preOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetEncoder");
2231
- manifest.decoder.mapRender((r) => `offsetDecoder(${r}, { preOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetDecoder");
2232
- return manifest;
2613
+ return typeManifest({
2614
+ ...manifest,
2615
+ decoder: (0, import_visitors_core30.pipe)(
2616
+ manifest.decoder,
2617
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `offsetDecoder(${c}, { preOffset: ${fn} })`),
2618
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["offsetDecoder"])
2619
+ ),
2620
+ encoder: (0, import_visitors_core30.pipe)(
2621
+ manifest.encoder,
2622
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `offsetEncoder(${c}, { preOffset: ${fn} })`),
2623
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["offsetEncoder"])
2624
+ )
2625
+ });
2233
2626
  },
2234
2627
  visitPublicKeyType() {
2235
- const imports = new ImportMap().add("solanaAddresses", "type Address");
2236
- return {
2237
- decoder: fragment("getAddressDecoder()").addImports("solanaAddresses", "getAddressDecoder"),
2238
- encoder: fragment("getAddressEncoder()").addImports("solanaAddresses", "getAddressEncoder"),
2239
- isEnum: false,
2240
- looseType: fragment("Address", imports),
2241
- strictType: fragment("Address", imports),
2242
- value: fragment("")
2243
- };
2628
+ const addressFragment = (0, import_visitors_core30.pipe)(
2629
+ fragment("Address"),
2630
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"])
2631
+ );
2632
+ return typeManifest({
2633
+ decoder: (0, import_visitors_core30.pipe)(
2634
+ fragment("getAddressDecoder()"),
2635
+ (f) => addFragmentImports(f, "solanaAddresses", ["getAddressDecoder"])
2636
+ ),
2637
+ encoder: (0, import_visitors_core30.pipe)(
2638
+ fragment("getAddressEncoder()"),
2639
+ (f) => addFragmentImports(f, "solanaAddresses", ["getAddressEncoder"])
2640
+ ),
2641
+ looseType: addressFragment,
2642
+ strictType: addressFragment
2643
+ });
2244
2644
  },
2245
2645
  visitPublicKeyValue(node) {
2246
- const manifest = typeManifest();
2247
- manifest.value.setRender(`address("${node.publicKey}")`).addImports("solanaAddresses", "address");
2248
- return manifest;
2646
+ return typeManifest({
2647
+ value: (0, import_visitors_core30.pipe)(
2648
+ fragment(`address("${node.publicKey}")`),
2649
+ (f) => addFragmentImports(f, "solanaAddresses", ["address"])
2650
+ )
2651
+ });
2249
2652
  },
2250
2653
  visitRemainderOptionType(node, { self }) {
2251
- const childManifest = (0, import_visitors_core20.visit)(node.item, self);
2252
- childManifest.strictType.mapRender((r) => `Option<${r}>`).addImports("solanaOptions", "type Option");
2253
- childManifest.looseType.mapRender((r) => `OptionOrNullable<${r}>`).addImports("solanaOptions", "type OptionOrNullable");
2654
+ const childManifest = (0, import_visitors_core30.visit)(node.item, self);
2254
2655
  const encoderOptions = ["prefix: null"];
2255
2656
  const decoderOptions = ["prefix: null"];
2256
2657
  const encoderOptionsAsString = encoderOptions.length > 0 ? `, { ${encoderOptions.join(", ")} }` : "";
2257
2658
  const decoderOptionsAsString = decoderOptions.length > 0 ? `, { ${decoderOptions.join(", ")} }` : "";
2258
- childManifest.encoder.mapRender((r) => `getOptionEncoder(${r + encoderOptionsAsString})`).addImports("solanaOptions", "getOptionEncoder");
2259
- childManifest.decoder.mapRender((r) => `getOptionDecoder(${r + decoderOptionsAsString})`).addImports("solanaOptions", "getOptionDecoder");
2260
- return childManifest;
2659
+ return typeManifest({
2660
+ ...childManifest,
2661
+ decoder: (0, import_visitors_core30.pipe)(
2662
+ childManifest.decoder,
2663
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getOptionDecoder(${c + decoderOptionsAsString})`),
2664
+ (f) => addFragmentImports(f, "solanaOptions", ["getOptionDecoder"])
2665
+ ),
2666
+ encoder: (0, import_visitors_core30.pipe)(
2667
+ childManifest.encoder,
2668
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getOptionEncoder(${c + encoderOptionsAsString})`),
2669
+ (f) => addFragmentImports(f, "solanaOptions", ["getOptionEncoder"])
2670
+ ),
2671
+ looseType: (0, import_visitors_core30.pipe)(
2672
+ childManifest.looseType,
2673
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `OptionOrNullable<${c}>`),
2674
+ (f) => addFragmentImports(f, "solanaOptions", ["type OptionOrNullable"])
2675
+ ),
2676
+ strictType: (0, import_visitors_core30.pipe)(
2677
+ childManifest.strictType,
2678
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `Option<${c}>`),
2679
+ (f) => addFragmentImports(f, "solanaOptions", ["type Option"])
2680
+ )
2681
+ });
2261
2682
  },
2262
2683
  visitSentinelType(node, { self }) {
2263
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2264
- const sentinel = (0, import_visitors_core20.visit)(node.sentinel, self).value;
2265
- manifest.encoder.mapRender((r) => `addEncoderSentinel(${r}, ${sentinel.render})`).mergeImportsWith(sentinel).addImports("solanaCodecsCore", "addEncoderSentinel");
2266
- manifest.decoder.mapRender((r) => `addDecoderSentinel(${r}, ${sentinel.render})`).mergeImportsWith(sentinel).addImports("solanaCodecsCore", "addDecoderSentinel");
2267
- return manifest;
2684
+ const manifest = (0, import_visitors_core30.visit)(node.type, self);
2685
+ const sentinel = (0, import_visitors_core30.visit)(node.sentinel, self).value;
2686
+ return typeManifest({
2687
+ ...manifest,
2688
+ decoder: (0, import_visitors_core30.pipe)(
2689
+ mergeFragments(
2690
+ [manifest.decoder, sentinel],
2691
+ ([child, sentinel2]) => `addDecoderSentinel(${child}, ${sentinel2})`
2692
+ ),
2693
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["addDecoderSentinel"])
2694
+ ),
2695
+ encoder: (0, import_visitors_core30.pipe)(
2696
+ mergeFragments(
2697
+ [manifest.encoder, sentinel],
2698
+ ([child, sentinel2]) => `addEncoderSentinel(${child}, ${sentinel2})`
2699
+ ),
2700
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["addEncoderSentinel"])
2701
+ )
2702
+ });
2268
2703
  },
2269
2704
  visitSetType(setType, { self }) {
2270
- const childManifest = (0, import_visitors_core20.visit)(setType.item, self);
2271
- childManifest.strictType.mapRender((r) => `Set<${r}>`);
2272
- childManifest.looseType.mapRender((r) => `Set<${r}>`);
2705
+ const childManifest = (0, import_visitors_core30.visit)(setType.item, self);
2273
2706
  const sizeManifest = getArrayLikeSizeOption(setType.count, self);
2274
- const encoderOptions = sizeManifest.encoder.render ? `, { ${sizeManifest.encoder.render} }` : "";
2275
- const decoderOptions = sizeManifest.decoder.render ? `, { ${sizeManifest.decoder.render} }` : "";
2276
- childManifest.encoder.mergeImportsWith(sizeManifest.encoder).mapRender((r) => `getSetEncoder(${r + encoderOptions})`).addImports("solanaCodecsDataStructures", "getSetEncoder");
2277
- childManifest.decoder.mergeImportsWith(sizeManifest.decoder).mapRender((r) => `getSetDecoder(${r + decoderOptions})`).addImports("solanaCodecsDataStructures", "getSetDecoder");
2278
- return childManifest;
2707
+ const encoderOptions = sizeManifest.encoder.content ? `, { ${sizeManifest.encoder.content} }` : "";
2708
+ const decoderOptions = sizeManifest.decoder.content ? `, { ${sizeManifest.decoder.content} }` : "";
2709
+ return typeManifest({
2710
+ ...childManifest,
2711
+ decoder: (0, import_visitors_core30.pipe)(
2712
+ childManifest.decoder,
2713
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getSetDecoder(${c + decoderOptions})`),
2714
+ (f) => mergeFragmentImports(f, [sizeManifest.decoder.imports]),
2715
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getSetDecoder"])
2716
+ ),
2717
+ encoder: (0, import_visitors_core30.pipe)(
2718
+ childManifest.encoder,
2719
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getSetEncoder(${c + encoderOptions})`),
2720
+ (f) => mergeFragmentImports(f, [sizeManifest.encoder.imports]),
2721
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getSetEncoder"])
2722
+ ),
2723
+ looseType: (0, import_visitors_core30.pipe)(childManifest.looseType, (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `Set<${c}>`)),
2724
+ strictType: (0, import_visitors_core30.pipe)(childManifest.strictType, (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `Set<${c}>`))
2725
+ });
2279
2726
  },
2280
2727
  visitSetValue(node, { self }) {
2281
- return mergeManifests(
2282
- node.items.map((v) => (0, import_visitors_core20.visit)(v, self)),
2728
+ return mergeTypeManifests(
2729
+ node.items.map((v) => (0, import_visitors_core30.visit)(v, self)),
2283
2730
  { mergeValues: (renders) => `new Set([${renders.join(", ")}])` }
2284
2731
  );
2285
2732
  },
2286
2733
  visitSizePrefixType(node, { self }) {
2287
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2288
- const prefix = (0, import_visitors_core20.visit)(node.prefix, self);
2289
- manifest.encoder.mapRender((r) => `addEncoderSizePrefix(${r}, ${prefix.encoder.render})`).mergeImportsWith(prefix.encoder).addImports("solanaCodecsCore", "addEncoderSizePrefix");
2290
- manifest.decoder.mapRender((r) => `addDecoderSizePrefix(${r}, ${prefix.decoder.render})`).mergeImportsWith(prefix.decoder).addImports("solanaCodecsCore", "addDecoderSizePrefix");
2291
- return manifest;
2734
+ const manifest = (0, import_visitors_core30.visit)(node.type, self);
2735
+ const prefix = (0, import_visitors_core30.visit)(node.prefix, self);
2736
+ return typeManifest({
2737
+ ...manifest,
2738
+ decoder: (0, import_visitors_core30.pipe)(
2739
+ mergeFragments(
2740
+ [manifest.decoder, prefix.decoder],
2741
+ ([decoder, prefix2]) => `addDecoderSizePrefix(${decoder}, ${prefix2})`
2742
+ ),
2743
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["addDecoderSizePrefix"])
2744
+ ),
2745
+ encoder: (0, import_visitors_core30.pipe)(
2746
+ mergeFragments(
2747
+ [manifest.encoder, prefix.encoder],
2748
+ ([encoder, prefix2]) => `addEncoderSizePrefix(${encoder}, ${prefix2})`
2749
+ ),
2750
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["addEncoderSizePrefix"])
2751
+ )
2752
+ });
2292
2753
  },
2293
2754
  visitSolAmountType({ number }, { self }) {
2294
- const numberManifest = (0, import_visitors_core20.visit)(number, self);
2295
- const lamportsType = "Lamports";
2296
- const lamportsImport = new ImportMap().add("solanaRpcTypes", "type Lamports");
2297
- return {
2755
+ const numberManifest = (0, import_visitors_core30.visit)(number, self);
2756
+ const lamportFragment = (0, import_visitors_core30.pipe)(
2757
+ fragment("Lamports"),
2758
+ (f) => addFragmentImports(f, "solanaRpcTypes", ["type Lamports"])
2759
+ );
2760
+ return typeManifest({
2298
2761
  ...numberManifest,
2299
- decoder: numberManifest.decoder.mapRender((r) => `getLamportsDecoder(${r})`).addImports("solanaRpcTypes", "getLamportsDecoder"),
2300
- encoder: numberManifest.encoder.mapRender((r) => `getLamportsEncoder(${r})`).addImports("solanaRpcTypes", "getLamportsEncoder"),
2301
- looseType: fragment(lamportsType, lamportsImport),
2302
- strictType: fragment(lamportsType, lamportsImport)
2303
- };
2762
+ decoder: (0, import_visitors_core30.pipe)(
2763
+ numberManifest.decoder,
2764
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getLamportsDecoder(${c})`),
2765
+ (f) => addFragmentImports(f, "solanaRpcTypes", ["getLamportsDecoder"])
2766
+ ),
2767
+ encoder: (0, import_visitors_core30.pipe)(
2768
+ numberManifest.encoder,
2769
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getLamportsEncoder(${c})`),
2770
+ (f) => addFragmentImports(f, "solanaRpcTypes", ["getLamportsEncoder"])
2771
+ ),
2772
+ looseType: lamportFragment,
2773
+ strictType: lamportFragment
2774
+ });
2304
2775
  },
2305
2776
  visitSomeValue(node, { self }) {
2306
- const manifest = typeManifest();
2307
- manifest.value = (0, import_visitors_core20.visit)(node.value, self).value.mapRender((r) => `some(${r})`).addImports("solanaOptions", "some");
2308
- return manifest;
2777
+ return typeManifest({
2778
+ value: (0, import_visitors_core30.pipe)(
2779
+ (0, import_visitors_core30.visit)(node.value, self).value,
2780
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `some(${c})`),
2781
+ (f) => addFragmentImports(f, "solanaOptions", ["some"])
2782
+ )
2783
+ });
2309
2784
  },
2310
2785
  visitStringType(stringType) {
2311
2786
  const [encoder, decoder] = (() => {
@@ -2322,66 +2797,109 @@ function getTypeManifestVisitor(input) {
2322
2797
  throw new Error(`Unsupported string encoding: ${stringType.encoding}`);
2323
2798
  }
2324
2799
  })();
2325
- return {
2326
- decoder: fragment(`${decoder}()`).addImports("solanaCodecsStrings", decoder),
2327
- encoder: fragment(`${encoder}()`).addImports("solanaCodecsStrings", encoder),
2328
- isEnum: false,
2800
+ return typeManifest({
2801
+ decoder: (0, import_visitors_core30.pipe)(
2802
+ fragment(`${decoder}()`),
2803
+ (f) => addFragmentImports(f, "solanaCodecsStrings", [decoder])
2804
+ ),
2805
+ encoder: (0, import_visitors_core30.pipe)(
2806
+ fragment(`${encoder}()`),
2807
+ (f) => addFragmentImports(f, "solanaCodecsStrings", [encoder])
2808
+ ),
2329
2809
  looseType: fragment("string"),
2330
- strictType: fragment("string"),
2331
- value: fragment("")
2332
- };
2810
+ strictType: fragment("string")
2811
+ });
2333
2812
  },
2334
2813
  visitStringValue(node) {
2335
- const manifest = typeManifest();
2336
- manifest.value.setRender(JSON.stringify(node.string));
2337
- return manifest;
2814
+ return typeManifest({
2815
+ value: fragment(JSON.stringify(node.string))
2816
+ });
2338
2817
  },
2339
2818
  visitStructFieldType(structFieldType, { self }) {
2340
2819
  const name = (0, import_nodes24.camelCase)(structFieldType.name);
2341
- const childManifest = (0, import_visitors_core20.visit)(structFieldType.type, self);
2820
+ const originalChildManifest = (0, import_visitors_core30.visit)(structFieldType.type, self);
2342
2821
  const structFieldDocs = (0, import_nodes24.parseDocs)(structFieldType.docs);
2343
2822
  const docblock = structFieldDocs.length > 0 ? `
2344
2823
  ${jsDocblock(structFieldDocs)}` : "";
2345
- const originalLooseType = childManifest.looseType.render;
2346
- childManifest.strictType.mapRender((r) => `${docblock}${name}: ${r}; `);
2347
- childManifest.looseType.mapRender((r) => `${docblock}${name}: ${r}; `);
2348
- childManifest.encoder.mapRender((r) => `['${name}', ${r}]`);
2349
- childManifest.decoder.mapRender((r) => `['${name}', ${r}]`);
2824
+ const originalLooseType = originalChildManifest.looseType.content;
2825
+ const childManifest = typeManifest({
2826
+ ...originalChildManifest,
2827
+ decoder: (0, import_visitors_core30.pipe)(
2828
+ originalChildManifest.decoder,
2829
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `['${name}', ${c}]`)
2830
+ ),
2831
+ encoder: (0, import_visitors_core30.pipe)(
2832
+ originalChildManifest.encoder,
2833
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `['${name}', ${c}]`)
2834
+ ),
2835
+ looseType: (0, import_visitors_core30.pipe)(
2836
+ originalChildManifest.looseType,
2837
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `${docblock}${name}: ${c}; `)
2838
+ ),
2839
+ strictType: (0, import_visitors_core30.pipe)(
2840
+ originalChildManifest.strictType,
2841
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `${docblock}${name}: ${c}; `)
2842
+ )
2843
+ });
2350
2844
  if (!structFieldType.defaultValue) {
2351
2845
  return childManifest;
2352
2846
  }
2353
2847
  if (structFieldType.defaultValueStrategy !== "omitted") {
2354
- childManifest.looseType.setRender(`${docblock}${name}?: ${originalLooseType}; `);
2355
- return childManifest;
2848
+ return typeManifest({
2849
+ ...childManifest,
2850
+ looseType: (0, import_visitors_core30.pipe)(
2851
+ childManifest.looseType,
2852
+ (f) => (0, import_renderers_core12.setFragmentContent)(f, `${docblock}${name}?: ${originalLooseType}; `)
2853
+ )
2854
+ });
2356
2855
  }
2357
- childManifest.looseType = fragment("");
2358
- return childManifest;
2856
+ return typeManifest({
2857
+ ...childManifest,
2858
+ looseType: fragment("")
2859
+ });
2359
2860
  },
2360
2861
  visitStructFieldValue(node, { self }) {
2361
- const manifest = typeManifest();
2362
- manifest.value = (0, import_visitors_core20.visit)(node.value, self).value.mapRender((r) => `${node.name}: ${r}`);
2363
- return manifest;
2862
+ return typeManifest({
2863
+ value: (0, import_visitors_core30.pipe)(
2864
+ (0, import_visitors_core30.visit)(node.value, self).value,
2865
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `${node.name}: ${c}`)
2866
+ )
2867
+ });
2364
2868
  },
2365
2869
  visitStructType(structType, { self }) {
2366
2870
  const optionalFields = structType.fields.filter((f) => !!f.defaultValue);
2367
- const mergedManifest = mergeManifests(
2368
- structType.fields.map((field) => (0, import_visitors_core20.visit)(field, self)),
2369
- {
2370
- mergeCodecs: (renders) => `([${renders.join(", ")}])`,
2371
- mergeTypes: (renders) => `{ ${renders.join("")} }`
2372
- }
2871
+ const mergedManifest = (0, import_visitors_core30.pipe)(
2872
+ mergeTypeManifests(
2873
+ structType.fields.map((field) => (0, import_visitors_core30.visit)(field, self)),
2874
+ {
2875
+ mergeCodecs: (renders) => `([${renders.join(", ")}])`,
2876
+ mergeTypes: (renders) => `{ ${renders.join("")} }`
2877
+ }
2878
+ ),
2879
+ (manifest) => typeManifest({
2880
+ ...manifest,
2881
+ decoder: (0, import_visitors_core30.pipe)(
2882
+ manifest.decoder,
2883
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getStructDecoder${c}`),
2884
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getStructDecoder"])
2885
+ ),
2886
+ encoder: (0, import_visitors_core30.pipe)(
2887
+ manifest.encoder,
2888
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getStructEncoder${c}`),
2889
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getStructEncoder"])
2890
+ )
2891
+ })
2373
2892
  );
2374
- mergedManifest.encoder.mapRender((r) => `getStructEncoder${r}`).addImports("solanaCodecsDataStructures", "getStructEncoder");
2375
- mergedManifest.decoder.mapRender((r) => `getStructDecoder${r}`).addImports("solanaCodecsDataStructures", "getStructDecoder");
2376
2893
  if (optionalFields.length === 0) {
2377
2894
  return mergedManifest;
2378
2895
  }
2379
2896
  const parentPath = stack.getPath();
2380
- const instructionNode = (0, import_visitors_core20.findLastNodeFromPath)(parentPath, "instructionNode");
2381
- const accountNode = (0, import_visitors_core20.findLastNodeFromPath)(parentPath, "accountNode");
2897
+ const instructionNode = (0, import_visitors_core30.findLastNodeFromPath)(parentPath, "instructionNode");
2898
+ const accountNode = (0, import_visitors_core30.findLastNodeFromPath)(parentPath, "accountNode");
2382
2899
  const discriminatorPrefix = instructionNode ? instructionNode.name : accountNode?.name;
2383
2900
  const discriminators = (instructionNode ? instructionNode.discriminators : accountNode?.discriminators) ?? [];
2384
2901
  const fieldDiscriminators = discriminators.filter((0, import_nodes24.isNodeFilter)("fieldDiscriminatorNode"));
2902
+ const encoderImports = new ImportMap();
2385
2903
  const defaultValues = optionalFields.map((f) => {
2386
2904
  const key = (0, import_nodes24.camelCase)(f.name);
2387
2905
  if (fieldDiscriminators.some((d) => d.name === f.name)) {
@@ -2389,59 +2907,101 @@ ${jsDocblock(structFieldDocs)}` : "";
2389
2907
  return f.defaultValueStrategy === "omitted" ? `${key}: ${constantName}` : `${key}: value.${key} ?? ${constantName}`;
2390
2908
  }
2391
2909
  const defaultValue = f.defaultValue;
2392
- const { render: renderedValue, imports } = (0, import_visitors_core20.visit)(defaultValue, self).value;
2393
- mergedManifest.encoder.mergeImportsWith(imports);
2910
+ const { content: renderedValue, imports } = (0, import_visitors_core30.visit)(defaultValue, self).value;
2911
+ encoderImports.mergeWith(imports);
2394
2912
  return f.defaultValueStrategy === "omitted" ? `${key}: ${renderedValue}` : `${key}: value.${key} ?? ${renderedValue}`;
2395
2913
  }).join(", ");
2396
- mergedManifest.encoder.mapRender((r) => `transformEncoder(${r}, (value) => ({ ...value, ${defaultValues} }))`).addImports("solanaCodecsCore", "transformEncoder");
2397
- return mergedManifest;
2914
+ return typeManifest({
2915
+ ...mergedManifest,
2916
+ encoder: (0, import_visitors_core30.pipe)(
2917
+ mergedManifest.encoder,
2918
+ (f) => (0, import_renderers_core12.mapFragmentContent)(
2919
+ f,
2920
+ (c) => `transformEncoder(${c}, (value) => ({ ...value, ${defaultValues} }))`
2921
+ ),
2922
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["transformEncoder"]),
2923
+ (f) => mergeFragmentImports(f, [encoderImports])
2924
+ )
2925
+ });
2398
2926
  },
2399
2927
  visitStructValue(node, { self }) {
2400
- return mergeManifests(
2401
- node.fields.map((field) => (0, import_visitors_core20.visit)(field, self)),
2928
+ return mergeTypeManifests(
2929
+ node.fields.map((field) => (0, import_visitors_core30.visit)(field, self)),
2402
2930
  { mergeValues: (renders) => `{ ${renders.join(", ")} }` }
2403
2931
  );
2404
2932
  },
2405
2933
  visitTupleType(tupleType, { self }) {
2406
- const items = tupleType.items.map((item) => (0, import_visitors_core20.visit)(item, self));
2407
- const mergedManifest = mergeManifests(items, {
2934
+ const items = tupleType.items.map((item) => (0, import_visitors_core30.visit)(item, self));
2935
+ const mergedManifest = mergeTypeManifests(items, {
2408
2936
  mergeCodecs: (codecs) => `[${codecs.join(", ")}]`,
2409
2937
  mergeTypes: (types) => `readonly [${types.join(", ")}]`
2410
2938
  });
2411
- mergedManifest.encoder.mapRender((render2) => `getTupleEncoder(${render2})`).addImports("solanaCodecsDataStructures", "getTupleEncoder");
2412
- mergedManifest.decoder.mapRender((render2) => `getTupleDecoder(${render2})`).addImports("solanaCodecsDataStructures", "getTupleDecoder");
2413
- return mergedManifest;
2939
+ return typeManifest({
2940
+ ...mergedManifest,
2941
+ decoder: (0, import_visitors_core30.pipe)(
2942
+ mergedManifest.decoder,
2943
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getTupleDecoder(${c})`),
2944
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getTupleDecoder"])
2945
+ ),
2946
+ encoder: (0, import_visitors_core30.pipe)(
2947
+ mergedManifest.encoder,
2948
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getTupleEncoder(${c})`),
2949
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getTupleEncoder"])
2950
+ )
2951
+ });
2414
2952
  },
2415
2953
  visitTupleValue(node, { self }) {
2416
- return mergeManifests(
2417
- node.items.map((v) => (0, import_visitors_core20.visit)(v, self)),
2954
+ return mergeTypeManifests(
2955
+ node.items.map((v) => (0, import_visitors_core30.visit)(v, self)),
2418
2956
  { mergeValues: (renders) => `[${renders.join(", ")}]` }
2419
2957
  );
2420
2958
  },
2421
2959
  visitZeroableOptionType(node, { self }) {
2422
- const childManifest = (0, import_visitors_core20.visit)(node.item, self);
2423
- childManifest.strictType.mapRender((r) => `Option<${r}>`).addImports("solanaOptions", "type Option");
2424
- childManifest.looseType.mapRender((r) => `OptionOrNullable<${r}>`).addImports("solanaOptions", "type OptionOrNullable");
2960
+ const childManifest = (0, import_visitors_core30.visit)(node.item, self);
2425
2961
  const encoderOptions = ["prefix: null"];
2426
2962
  const decoderOptions = ["prefix: null"];
2963
+ const encoderImports = new ImportMap();
2964
+ const decoderImports = new ImportMap();
2427
2965
  if (node.zeroValue) {
2428
- const zeroValueManifest = (0, import_visitors_core20.visit)(node.zeroValue, self);
2429
- childManifest.encoder.mergeImportsWith(zeroValueManifest.value);
2430
- childManifest.decoder.mergeImportsWith(zeroValueManifest.value);
2431
- encoderOptions.push(`noneValue: ${zeroValueManifest.value.render}`);
2432
- decoderOptions.push(`noneValue: ${zeroValueManifest.value.render}`);
2966
+ const zeroValueManifest = (0, import_visitors_core30.visit)(node.zeroValue, self);
2967
+ encoderImports.mergeWith(zeroValueManifest.value);
2968
+ decoderImports.mergeWith(zeroValueManifest.value);
2969
+ encoderOptions.push(`noneValue: ${zeroValueManifest.value.content}`);
2970
+ decoderOptions.push(`noneValue: ${zeroValueManifest.value.content}`);
2433
2971
  } else {
2434
2972
  encoderOptions.push(`noneValue: "zeroes"`);
2435
2973
  decoderOptions.push(`noneValue: "zeroes"`);
2436
2974
  }
2437
2975
  const encoderOptionsAsString = encoderOptions.length > 0 ? `, { ${encoderOptions.join(", ")} }` : "";
2438
2976
  const decoderOptionsAsString = decoderOptions.length > 0 ? `, { ${decoderOptions.join(", ")} }` : "";
2439
- childManifest.encoder.mapRender((r) => `getOptionEncoder(${r + encoderOptionsAsString})`).addImports("solanaOptions", "getOptionEncoder");
2440
- childManifest.decoder.mapRender((r) => `getOptionDecoder(${r + decoderOptionsAsString})`).addImports("solanaOptions", "getOptionDecoder");
2441
- return childManifest;
2977
+ return typeManifest({
2978
+ ...childManifest,
2979
+ decoder: (0, import_visitors_core30.pipe)(
2980
+ childManifest.decoder,
2981
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getOptionDecoder(${c + decoderOptionsAsString})`),
2982
+ (f) => addFragmentImports(f, "solanaOptions", ["getOptionDecoder"]),
2983
+ (f) => mergeFragmentImports(f, [decoderImports])
2984
+ ),
2985
+ encoder: (0, import_visitors_core30.pipe)(
2986
+ childManifest.encoder,
2987
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `getOptionEncoder(${c + encoderOptionsAsString})`),
2988
+ (f) => addFragmentImports(f, "solanaOptions", ["getOptionEncoder"]),
2989
+ (f) => mergeFragmentImports(f, [encoderImports])
2990
+ ),
2991
+ looseType: (0, import_visitors_core30.pipe)(
2992
+ childManifest.looseType,
2993
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `OptionOrNullable<${c}>`),
2994
+ (f) => addFragmentImports(f, "solanaOptions", ["type OptionOrNullable"])
2995
+ ),
2996
+ strictType: (0, import_visitors_core30.pipe)(
2997
+ childManifest.strictType,
2998
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `Option<${c}>`),
2999
+ (f) => addFragmentImports(f, "solanaOptions", ["type Option"])
3000
+ )
3001
+ });
2442
3002
  }
2443
3003
  }),
2444
- (visitor) => (0, import_visitors_core20.recordNodeStackVisitor)(visitor, stack)
3004
+ (visitor) => (0, import_visitors_core30.recordNodeStackVisitor)(visitor, stack)
2445
3005
  );
2446
3006
  }
2447
3007
  function getArrayLikeSizeOption(count, visitor) {
@@ -2461,10 +3021,11 @@ function getArrayLikeSizeOption(count, visitor) {
2461
3021
  if (prefix.format === "u32" && prefix.endian === "le") {
2462
3022
  return { decoder: fragment(""), encoder: fragment("") };
2463
3023
  }
2464
- const prefixManifest = (0, import_visitors_core20.visit)(count.prefix, visitor);
2465
- prefixManifest.encoder.mapRender((r) => `size: ${r}`);
2466
- prefixManifest.decoder.mapRender((r) => `size: ${r}`);
2467
- return prefixManifest;
3024
+ const prefixManifest = (0, import_visitors_core30.visit)(count.prefix, visitor);
3025
+ return {
3026
+ decoder: (0, import_visitors_core30.pipe)(prefixManifest.decoder, (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `size: ${c}`)),
3027
+ encoder: (0, import_visitors_core30.pipe)(prefixManifest.encoder, (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `size: ${c}`))
3028
+ };
2468
3029
  }
2469
3030
 
2470
3031
  // src/nameTransformers.ts
@@ -2533,8 +3094,8 @@ var DEFAULT_NAME_TRANSFORMERS = {
2533
3094
 
2534
3095
  // src/getRenderMapVisitor.ts
2535
3096
  function getRenderMapVisitor(options = {}) {
2536
- const linkables = new import_visitors_core21.LinkableDictionary();
2537
- const stack = new import_visitors_core21.NodeStack();
3097
+ const linkables = new import_visitors_core31.LinkableDictionary();
3098
+ const stack = new import_visitors_core31.NodeStack();
2538
3099
  const nameTransformers = {
2539
3100
  ...DEFAULT_NAME_TRANSFORMERS,
2540
3101
  ...options.nameTransformers
@@ -2558,8 +3119,8 @@ function getRenderMapVisitor(options = {}) {
2558
3119
  nonScalarEnums,
2559
3120
  stack
2560
3121
  });
2561
- const resolvedInstructionInputVisitor = (0, import_visitors_core21.getResolvedInstructionInputsVisitor)();
2562
- const byteSizeVisitor = (0, import_visitors_core21.getByteSizeVisitor)(linkables, { stack });
3122
+ const resolvedInstructionInputVisitor = (0, import_visitors_core31.getResolvedInstructionInputsVisitor)();
3123
+ const byteSizeVisitor = (0, import_visitors_core31.getByteSizeVisitor)(linkables, { stack });
2563
3124
  const globalScope = {
2564
3125
  asyncResolvers,
2565
3126
  customAccountData,
@@ -2572,23 +3133,23 @@ function getRenderMapVisitor(options = {}) {
2572
3133
  typeManifestVisitor
2573
3134
  };
2574
3135
  const render2 = (template, context, renderOptions) => {
2575
- return render((0, import_node_path3.join)("pages", template), context, renderOptions);
3136
+ return render((0, import_node_path2.join)("pages", template), context, renderOptions);
2576
3137
  };
2577
- return (0, import_visitors_core21.pipe)(
2578
- (0, import_visitors_core21.staticVisitor)(() => new import_renderers_core.RenderMap(), {
3138
+ return (0, import_visitors_core31.pipe)(
3139
+ (0, import_visitors_core31.staticVisitor)(() => (0, import_renderers_core13.renderMap)(), {
2579
3140
  keys: ["rootNode", "programNode", "pdaNode", "accountNode", "definedTypeNode", "instructionNode"]
2580
3141
  }),
2581
- (v) => (0, import_visitors_core21.extendVisitor)(v, {
3142
+ (v) => (0, import_visitors_core31.extendVisitor)(v, {
2582
3143
  visitAccount(node) {
2583
3144
  const accountPath = stack.getPath("accountNode");
2584
- if (!(0, import_visitors_core21.findProgramNodeFromPath)(accountPath)) {
3145
+ if (!(0, import_visitors_core31.findProgramNodeFromPath)(accountPath)) {
2585
3146
  throw new Error("Account must be visited inside a program.");
2586
3147
  }
2587
3148
  const scope = {
2588
3149
  ...globalScope,
2589
3150
  accountPath,
2590
- size: (0, import_visitors_core21.visit)(node, byteSizeVisitor),
2591
- typeManifest: (0, import_visitors_core21.visit)(node, typeManifestVisitor)
3151
+ size: (0, import_visitors_core31.visit)(node, byteSizeVisitor),
3152
+ typeManifest: (0, import_visitors_core31.visit)(node, typeManifestVisitor)
2592
3153
  };
2593
3154
  const fields = (0, import_nodes26.resolveNestedTypeNode)(node.data).fields;
2594
3155
  const accountDiscriminatorConstantsFragment = getDiscriminatorConstantsFragment({
@@ -2608,14 +3169,15 @@ function getRenderMapVisitor(options = {}) {
2608
3169
  accountSizeHelpersFragment,
2609
3170
  accountPdaHelpersFragment
2610
3171
  );
2611
- return new import_renderers_core.RenderMap().add(
3172
+ return (0, import_renderers_core13.addToRenderMap)(
3173
+ (0, import_renderers_core13.renderMap)(),
2612
3174
  `accounts/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2613
3175
  render2("accountsPage.njk", {
2614
- accountDiscriminatorConstantsFragment,
2615
- accountFetchHelpersFragment,
2616
- accountPdaHelpersFragment,
2617
- accountSizeHelpersFragment,
2618
- accountTypeFragment,
3176
+ accountDiscriminatorConstantsFragment: accountDiscriminatorConstantsFragment.content,
3177
+ accountFetchHelpersFragment: accountFetchHelpersFragment.content,
3178
+ accountPdaHelpersFragment: accountPdaHelpersFragment.content,
3179
+ accountSizeHelpersFragment: accountSizeHelpersFragment.content,
3180
+ accountTypeFragment: accountTypeFragment.content,
2619
3181
  imports: imports.toString(dependencyMap, useGranularImports)
2620
3182
  })
2621
3183
  );
@@ -2626,10 +3188,10 @@ function getRenderMapVisitor(options = {}) {
2626
3188
  codecDocs: [],
2627
3189
  decoderDocs: [],
2628
3190
  encoderDocs: [],
2629
- manifest: (0, import_visitors_core21.visit)(node, typeManifestVisitor),
3191
+ manifest: (0, import_visitors_core31.visit)(node, typeManifestVisitor),
2630
3192
  name: node.name,
2631
3193
  node: node.type,
2632
- size: (0, import_visitors_core21.visit)(node, byteSizeVisitor),
3194
+ size: (0, import_visitors_core31.visit)(node, byteSizeVisitor),
2633
3195
  typeDocs: node.docs,
2634
3196
  typeNode: node.type
2635
3197
  };
@@ -2642,28 +3204,26 @@ function getRenderMapVisitor(options = {}) {
2642
3204
  nameApi.decoderFunction(node.name),
2643
3205
  nameApi.codecFunction(node.name)
2644
3206
  ]);
2645
- return new import_renderers_core.RenderMap().add(
3207
+ return (0, import_renderers_core13.addToRenderMap)(
3208
+ (0, import_renderers_core13.renderMap)(),
2646
3209
  `types/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2647
3210
  render2("definedTypesPage.njk", {
2648
- imports: imports.toString({
2649
- ...dependencyMap,
2650
- generatedTypes: "."
2651
- }),
2652
- typeDiscriminatedUnionHelpersFragment,
2653
- typeWithCodecFragment
3211
+ imports: imports.toString({ ...dependencyMap, generatedTypes: "." }),
3212
+ typeDiscriminatedUnionHelpersFragment: typeDiscriminatedUnionHelpersFragment.content,
3213
+ typeWithCodecFragment: typeWithCodecFragment.content
2654
3214
  })
2655
3215
  );
2656
3216
  },
2657
3217
  visitInstruction(node) {
2658
3218
  const instructionPath = stack.getPath("instructionNode");
2659
- if (!(0, import_visitors_core21.findProgramNodeFromPath)(instructionPath)) {
3219
+ if (!(0, import_visitors_core31.findProgramNodeFromPath)(instructionPath)) {
2660
3220
  throw new Error("Instruction must be visited inside a program.");
2661
3221
  }
2662
3222
  const instructionExtraName = nameApi.instructionExtraType(node.name);
2663
3223
  const scope = {
2664
3224
  ...globalScope,
2665
- dataArgsManifest: (0, import_visitors_core21.visit)(node, typeManifestVisitor),
2666
- extraArgsManifest: (0, import_visitors_core21.visit)(
3225
+ dataArgsManifest: (0, import_visitors_core31.visit)(node, typeManifestVisitor),
3226
+ extraArgsManifest: (0, import_visitors_core31.visit)(
2667
3227
  (0, import_nodes26.definedTypeNode)({
2668
3228
  name: instructionExtraName,
2669
3229
  type: (0, import_nodes26.structTypeNodeFromInstructionArgumentNodes)(node.extraArguments ?? [])
@@ -2672,8 +3232,8 @@ function getRenderMapVisitor(options = {}) {
2672
3232
  ),
2673
3233
  instructionPath,
2674
3234
  renamedArgs: getRenamedArgsMap(node),
2675
- resolvedInputs: (0, import_visitors_core21.visit)(node, resolvedInstructionInputVisitor),
2676
- size: (0, import_visitors_core21.visit)(node, byteSizeVisitor)
3235
+ resolvedInputs: (0, import_visitors_core31.visit)(node, resolvedInstructionInputVisitor),
3236
+ size: (0, import_visitors_core31.visit)(node, byteSizeVisitor)
2677
3237
  };
2678
3238
  const instructionDiscriminatorConstantsFragment = getDiscriminatorConstantsFragment({
2679
3239
  ...scope,
@@ -2702,34 +3262,36 @@ function getRenderMapVisitor(options = {}) {
2702
3262
  instructionFunctionSyncFragment,
2703
3263
  instructionParseFunctionFragment
2704
3264
  );
2705
- return new import_renderers_core.RenderMap().add(
3265
+ return (0, import_renderers_core13.addToRenderMap)(
3266
+ (0, import_renderers_core13.renderMap)(),
2706
3267
  `instructions/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2707
3268
  render2("instructionsPage.njk", {
2708
3269
  imports: imports.toString(dependencyMap, useGranularImports),
2709
3270
  instruction: node,
2710
- instructionDataFragment,
2711
- instructionDiscriminatorConstantsFragment,
2712
- instructionExtraArgsFragment,
2713
- instructionFunctionAsyncFragment,
2714
- instructionFunctionSyncFragment,
2715
- instructionParseFunctionFragment,
2716
- instructionTypeFragment
3271
+ instructionDataFragment: instructionDataFragment.content,
3272
+ instructionDiscriminatorConstantsFragment: instructionDiscriminatorConstantsFragment.content,
3273
+ instructionExtraArgsFragment: instructionExtraArgsFragment.content,
3274
+ instructionFunctionAsyncFragment: instructionFunctionAsyncFragment.content,
3275
+ instructionFunctionSyncFragment: instructionFunctionSyncFragment.content,
3276
+ instructionParseFunctionFragment: instructionParseFunctionFragment.content,
3277
+ instructionTypeFragment: instructionTypeFragment.content
2717
3278
  })
2718
3279
  );
2719
3280
  },
2720
3281
  visitPda(node) {
2721
3282
  const pdaPath = stack.getPath("pdaNode");
2722
- if (!(0, import_visitors_core21.findProgramNodeFromPath)(pdaPath)) {
2723
- throw new Error("Account must be visited inside a program.");
3283
+ if (!(0, import_visitors_core31.findProgramNodeFromPath)(pdaPath)) {
3284
+ throw new Error("PDA must be visited inside a program.");
2724
3285
  }
2725
3286
  const scope = { ...globalScope, pdaPath };
2726
3287
  const pdaFunctionFragment = getPdaFunctionFragment(scope);
2727
3288
  const imports = new ImportMap().mergeWith(pdaFunctionFragment);
2728
- return new import_renderers_core.RenderMap().add(
3289
+ return (0, import_renderers_core13.addToRenderMap)(
3290
+ (0, import_renderers_core13.renderMap)(),
2729
3291
  `pdas/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2730
3292
  render2("pdasPage.njk", {
2731
3293
  imports: imports.toString(dependencyMap, useGranularImports),
2732
- pdaFunctionFragment
3294
+ pdaFunctionFragment: pdaFunctionFragment.content
2733
3295
  })
2734
3296
  );
2735
3297
  },
@@ -2739,35 +3301,42 @@ function getRenderMapVisitor(options = {}) {
2739
3301
  ...getDefinedTypeNodesToExtract(node.instructions, customInstructionData)
2740
3302
  ];
2741
3303
  const scope = { ...globalScope, programNode: node };
2742
- const renderMap = new import_renderers_core.RenderMap().mergeWith(...node.pdas.map((p) => (0, import_visitors_core21.visit)(p, self))).mergeWith(...node.accounts.map((a) => (0, import_visitors_core21.visit)(a, self))).mergeWith(...node.definedTypes.map((t) => (0, import_visitors_core21.visit)(t, self))).mergeWith(...customDataDefinedType.map((t) => (0, import_visitors_core21.visit)(t, self)));
3304
+ let renders = (0, import_renderers_core13.mergeRenderMaps)([
3305
+ ...node.pdas.map((p) => (0, import_visitors_core31.visit)(p, self)),
3306
+ ...node.accounts.map((a) => (0, import_visitors_core31.visit)(a, self)),
3307
+ ...node.definedTypes.map((t) => (0, import_visitors_core31.visit)(t, self)),
3308
+ ...customDataDefinedType.map((t) => (0, import_visitors_core31.visit)(t, self))
3309
+ ]);
2743
3310
  if (node.errors.length > 0) {
2744
3311
  const programErrorsFragment = getProgramErrorsFragment(scope);
2745
- renderMap.add(
3312
+ renders = (0, import_renderers_core13.addToRenderMap)(
3313
+ renders,
2746
3314
  `errors/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2747
3315
  render2("errorsPage.njk", {
2748
3316
  imports: new ImportMap().mergeWith(programErrorsFragment).toString(dependencyMap, useGranularImports),
2749
- programErrorsFragment
3317
+ programErrorsFragment: programErrorsFragment.content
2750
3318
  })
2751
3319
  );
2752
3320
  }
2753
3321
  const programFragment = getProgramFragment(scope);
2754
3322
  const programAccountsFragment = getProgramAccountsFragment(scope);
2755
3323
  const programInstructionsFragment = getProgramInstructionsFragment(scope);
2756
- renderMap.add(
3324
+ renders = (0, import_renderers_core13.addToRenderMap)(
3325
+ renders,
2757
3326
  `programs/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2758
3327
  render2("programsPage.njk", {
2759
3328
  imports: new ImportMap().mergeWith(programFragment, programAccountsFragment, programInstructionsFragment).toString(dependencyMap, useGranularImports),
2760
- programAccountsFragment,
2761
- programFragment,
2762
- programInstructionsFragment
3329
+ programAccountsFragment: programAccountsFragment.content,
3330
+ programFragment: programFragment.content,
3331
+ programInstructionsFragment: programInstructionsFragment.content
2763
3332
  })
2764
3333
  );
2765
- renderMap.mergeWith(
3334
+ return (0, import_renderers_core13.mergeRenderMaps)([
3335
+ renders,
2766
3336
  ...(0, import_nodes26.getAllInstructionsWithSubs)(node, {
2767
3337
  leavesOnly: !renderParentInstructions
2768
- }).map((ix) => (0, import_visitors_core21.visit)(ix, self))
2769
- );
2770
- return renderMap;
3338
+ }).map((ix) => (0, import_visitors_core31.visit)(ix, self))
3339
+ ]);
2771
3340
  },
2772
3341
  visitRoot(node, { self }) {
2773
3342
  const isNotInternal = (n) => !internalNodes.includes(n.name);
@@ -2790,9 +3359,10 @@ function getRenderMapVisitor(options = {}) {
2790
3359
  programsWithErrorsToExport,
2791
3360
  root: node
2792
3361
  };
2793
- const map = new import_renderers_core.RenderMap();
3362
+ let renders = (0, import_renderers_core13.renderMap)();
2794
3363
  if (hasAnythingToExport) {
2795
- map.add(
3364
+ renders = (0, import_renderers_core13.addToRenderMap)(
3365
+ renders,
2796
3366
  "shared/index.ts",
2797
3367
  render2("sharedPage.njk", {
2798
3368
  ...ctx,
@@ -2813,28 +3383,36 @@ function getRenderMapVisitor(options = {}) {
2813
3383
  );
2814
3384
  }
2815
3385
  if (programsToExport.length > 0) {
2816
- map.add("programs/index.ts", render2("programsIndex.njk", ctx));
3386
+ renders = (0, import_renderers_core13.addToRenderMap)(renders, "programs/index.ts", render2("programsIndex.njk", ctx));
2817
3387
  }
2818
3388
  if (programsWithErrorsToExport.length > 0) {
2819
- map.add("errors/index.ts", render2("errorsIndex.njk", ctx));
3389
+ renders = (0, import_renderers_core13.addToRenderMap)(renders, "errors/index.ts", render2("errorsIndex.njk", ctx));
2820
3390
  }
2821
3391
  if (accountsToExport.length > 0) {
2822
- map.add("accounts/index.ts", render2("accountsIndex.njk", ctx));
3392
+ renders = (0, import_renderers_core13.addToRenderMap)(renders, "accounts/index.ts", render2("accountsIndex.njk", ctx));
2823
3393
  }
2824
3394
  if (pdasToExport.length > 0) {
2825
- map.add("pdas/index.ts", render2("pdasIndex.njk", ctx));
3395
+ renders = (0, import_renderers_core13.addToRenderMap)(renders, "pdas/index.ts", render2("pdasIndex.njk", ctx));
2826
3396
  }
2827
3397
  if (instructionsToExport.length > 0) {
2828
- map.add("instructions/index.ts", render2("instructionsIndex.njk", ctx));
3398
+ renders = (0, import_renderers_core13.addToRenderMap)(
3399
+ renders,
3400
+ "instructions/index.ts",
3401
+ render2("instructionsIndex.njk", ctx)
3402
+ );
2829
3403
  }
2830
3404
  if (definedTypesToExport.length > 0) {
2831
- map.add("types/index.ts", render2("definedTypesIndex.njk", ctx));
3405
+ renders = (0, import_renderers_core13.addToRenderMap)(renders, "types/index.ts", render2("definedTypesIndex.njk", ctx));
2832
3406
  }
2833
- return map.add("index.ts", render2("rootIndex.njk", ctx)).mergeWith(...(0, import_nodes26.getAllPrograms)(node).map((p) => (0, import_visitors_core21.visit)(p, self)));
3407
+ return (0, import_visitors_core31.pipe)(
3408
+ renders,
3409
+ (r) => (0, import_renderers_core13.addToRenderMap)(r, "index.ts", render2("rootIndex.njk", ctx)),
3410
+ (r) => (0, import_renderers_core13.mergeRenderMaps)([r, ...(0, import_nodes26.getAllPrograms)(node).map((p) => (0, import_visitors_core31.visit)(p, self))])
3411
+ );
2834
3412
  }
2835
3413
  }),
2836
- (v) => (0, import_visitors_core21.recordNodeStackVisitor)(v, stack),
2837
- (v) => (0, import_visitors_core21.recordLinkablesOnFirstVisitVisitor)(v, linkables)
3414
+ (v) => (0, import_visitors_core31.recordNodeStackVisitor)(v, stack),
3415
+ (v) => (0, import_visitors_core31.recordLinkablesOnFirstVisitVisitor)(v, linkables)
2838
3416
  );
2839
3417
  }
2840
3418
  function getRenamedArgsMap(instruction) {
@@ -2856,8 +3434,8 @@ function getRenamedArgsMap(instruction) {
2856
3434
  }
2857
3435
 
2858
3436
  // src/renderVisitor.ts
2859
- var import_renderers_core2 = require("@codama/renderers-core");
2860
- var import_visitors_core22 = require("@codama/visitors-core");
3437
+ var import_renderers_core14 = require("@codama/renderers-core");
3438
+ var import_visitors_core32 = require("@codama/visitors-core");
2861
3439
  var estreePlugin = __toESM(require("prettier/plugins/estree"));
2862
3440
  var typeScriptPlugin = __toESM(require("prettier/plugins/typescript"));
2863
3441
  var import_standalone = require("prettier/standalone");
@@ -2873,16 +3451,16 @@ var DEFAULT_PRETTIER_OPTIONS = {
2873
3451
  useTabs: false
2874
3452
  };
2875
3453
  function renderVisitor(path, options = {}) {
2876
- return (0, import_visitors_core22.rootNodeVisitor)(async (root) => {
3454
+ return (0, import_visitors_core32.rootNodeVisitor)(async (root) => {
2877
3455
  if (options.deleteFolderBeforeRendering ?? true) {
2878
- (0, import_renderers_core2.deleteDirectory)(path);
3456
+ (0, import_renderers_core14.deleteDirectory)(path);
2879
3457
  }
2880
- const renderMap = (0, import_visitors_core22.visit)(root, getRenderMapVisitor(options));
3458
+ let renderMap2 = (0, import_visitors_core32.visit)(root, getRenderMapVisitor(options));
2881
3459
  if (options.formatCode ?? true) {
2882
3460
  const prettierOptions = { ...DEFAULT_PRETTIER_OPTIONS, ...options.prettierOptions };
2883
- await renderMap.mapContentAsync((code) => (0, import_standalone.format)(code, prettierOptions));
3461
+ renderMap2 = await (0, import_renderers_core14.mapRenderMapContentAsync)(renderMap2, (code) => (0, import_standalone.format)(code, prettierOptions));
2884
3462
  }
2885
- renderMap.write(path);
3463
+ (0, import_renderers_core14.writeRenderMap)(renderMap2, path);
2886
3464
  });
2887
3465
  }
2888
3466
  // Annotate the CommonJS export names for ESM import in node:
@@ -2892,7 +3470,7 @@ function renderVisitor(path, options = {}) {
2892
3470
  getNameApi,
2893
3471
  getRenderMapVisitor,
2894
3472
  getTypeManifestVisitor,
2895
- mergeManifests,
3473
+ mergeTypeManifests,
2896
3474
  renderVisitor,
2897
3475
  typeManifest
2898
3476
  });