@codama/renderers-js 1.3.4 → 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 -966
  2. package/dist/index.node.cjs.map +1 -1
  3. package/dist/index.node.mjs +1459 -879
  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 +3 -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,39 +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
- pdaDocs: pdaNode.docs,
1578
- pdaSeedsType: nameApi.pdaSeedsType(pdaNode.name),
1579
- programAddress: pdaNode.programId ?? programNode.publicKey,
1580
- seeds
1581
- }).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
+ );
1582
1785
  }
1583
1786
 
1584
1787
  // src/fragments/program.ts
1788
+ var import_visitors_core25 = require("@codama/visitors-core");
1585
1789
  function getProgramFragment(scope) {
1586
1790
  const { programNode, nameApi } = scope;
1587
- return fragmentFromTemplate("program.njk", {
1588
- program: programNode,
1589
- programAddressConstant: nameApi.programAddressConstant(programNode.name)
1590
- }).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
+ );
1591
1798
  }
1592
1799
 
1593
1800
  // src/fragments/programAccounts.ts
1594
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");
1595
1804
  function getProgramAccountsFragment(scope) {
1596
1805
  if (scope.programNode.accounts.length === 0) return fragment("");
1597
1806
  return mergeFragments(
1598
1807
  [getProgramAccountsEnumFragment(scope), getProgramAccountsIdentifierFunctionFragment(scope)],
1599
- (r) => `${r.join("\n\n")}
1808
+ (c) => `${c.join("\n\n")}
1600
1809
  `
1601
1810
  );
1602
1811
  }
@@ -1617,46 +1826,59 @@ function getProgramAccountsIdentifierFunctionFragment(scope) {
1617
1826
  if (!hasAccountDiscriminators) return fragment("");
1618
1827
  const programAccountsEnum = nameApi.programAccountsEnum(programNode.name);
1619
1828
  const programAccountsIdentifierFunction = nameApi.programAccountsIdentifierFunction(programNode.name);
1620
- const discriminatorsFragment = mergeFragments(
1621
- accountsWithDiscriminators.map((account) => {
1622
- const variant = nameApi.programAccountsEnumVariant(account.name);
1623
- return getDiscriminatorConditionFragment({
1624
- ...scope,
1625
- dataName: "data",
1626
- discriminators: account.discriminators ?? [],
1627
- ifTrue: `return ${programAccountsEnum}.${variant};`,
1628
- struct: (0, import_nodes21.resolveNestedTypeNode)(account.data)
1629
- });
1630
- }),
1631
- (r) => r.join("\n")
1632
- );
1633
- return discriminatorsFragment.mapRender(
1634
- (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} {
1635
1846
  const data = 'data' in account ? account.data : account;
1636
1847
  ${discriminators}
1637
1848
  throw new Error("The provided account could not be identified as a ${programNode.name} account.")
1638
1849
  }`
1639
- ).addImports("solanaCodecsCore", "type ReadonlyUint8Array");
1850
+ ),
1851
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["type ReadonlyUint8Array"])
1852
+ );
1640
1853
  }
1641
1854
 
1642
1855
  // src/fragments/programErrors.ts
1856
+ var import_visitors_core27 = require("@codama/visitors-core");
1643
1857
  function getProgramErrorsFragment(scope) {
1644
1858
  const { programNode, nameApi } = scope;
1645
1859
  const programAddressConstant = nameApi.programAddressConstant(programNode.name);
1646
- return fragmentFromTemplate("programErrors.njk", {
1647
- errors: programNode.errors,
1648
- escapeProgramErrorMessage: (message) => message.replace(/`/g, "\\`"),
1649
- getProgramErrorConstant: (name) => nameApi.programErrorConstantPrefix(programNode.name) + nameApi.programErrorConstant(name),
1650
- programAddressConstant,
1651
- programErrorMessagesMap: nameApi.programErrorMessagesMap(programNode.name),
1652
- programErrorUnion: nameApi.programErrorUnion(programNode.name),
1653
- programGetErrorMessageFunction: nameApi.programGetErrorMessageFunction(programNode.name),
1654
- programIsErrorFunction: nameApi.programIsErrorFunction(programNode.name)
1655
- }).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
+ );
1656
1876
  }
1657
1877
 
1658
1878
  // src/fragments/programInstructions.ts
1659
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");
1660
1882
  function getProgramInstructionsFragment(scope) {
1661
1883
  if (scope.programNode.instructions.length === 0) return fragment("");
1662
1884
  const allInstructions = (0, import_nodes22.getAllInstructionsWithSubs)(scope.programNode, {
@@ -1670,7 +1892,7 @@ function getProgramInstructionsFragment(scope) {
1670
1892
  getProgramInstructionsIdentifierFunctionFragment(scopeWithInstructions),
1671
1893
  getProgramInstructionsParsedUnionTypeFragment(scopeWithInstructions)
1672
1894
  ],
1673
- (r) => `${r.join("\n\n")}
1895
+ (c) => `${c.join("\n\n")}
1674
1896
  `
1675
1897
  );
1676
1898
  }
@@ -1704,15 +1926,20 @@ function getProgramInstructionsIdentifierFunctionFragment(scope) {
1704
1926
  struct: (0, import_nodes22.structTypeNodeFromInstructionArgumentNodes)(instruction.arguments)
1705
1927
  });
1706
1928
  }),
1707
- (r) => r.join("\n")
1929
+ (c) => c.join("\n")
1708
1930
  );
1709
- return discriminatorsFragment.mapRender(
1710
- (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} {
1711
1936
  const data = 'data' in instruction ? instruction.data : instruction;
1712
1937
  ${discriminators}
1713
1938
  throw new Error("The provided instruction could not be identified as a ${programNode.name} instruction.")
1714
1939
  }`
1715
- ).addImports("solanaCodecsCore", "type ReadonlyUint8Array");
1940
+ ),
1941
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["type ReadonlyUint8Array"])
1942
+ );
1716
1943
  }
1717
1944
  function getProgramInstructionsParsedUnionTypeFragment(scope) {
1718
1945
  const { programNode, allInstructions, nameApi } = scope;
@@ -1722,128 +1949,107 @@ function getProgramInstructionsParsedUnionTypeFragment(scope) {
1722
1949
  const typeVariants = allInstructions.map((instruction) => {
1723
1950
  const instructionEnumVariant = nameApi.programInstructionsEnumVariant(instruction.name);
1724
1951
  const parsedInstructionType = nameApi.instructionParsedType(instruction.name);
1725
- return fragment(
1726
- `| { instructionType: ${programInstructionsEnum}.${instructionEnumVariant} } & ${parsedInstructionType}<TProgram>`
1727
- ).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
+ );
1728
1958
  });
1729
1959
  return mergeFragments(
1730
1960
  [
1731
1961
  fragment(`export type ${programInstructionsType}<TProgram extends string = '${programAddress}'> =`),
1732
1962
  ...typeVariants
1733
1963
  ],
1734
- (r) => r.join("\n")
1964
+ (c) => c.join("\n")
1735
1965
  );
1736
1966
  }
1737
1967
 
1738
1968
  // src/fragments/typeDiscriminatedUnionHelpers.ts
1739
1969
  var import_nodes23 = require("@codama/nodes");
1970
+ var import_visitors_core29 = require("@codama/visitors-core");
1740
1971
  function getTypeDiscriminatedUnionHelpersFragment(scope) {
1741
1972
  const { name, typeNode, nameApi } = scope;
1742
1973
  const isDiscriminatedUnion = (0, import_nodes23.isNode)(typeNode, "enumTypeNode") && (0, import_nodes23.isDataEnum)(typeNode);
1743
1974
  if (!isDiscriminatedUnion) {
1744
1975
  return fragment("");
1745
1976
  }
1746
- return fragmentFromTemplate("typeDiscriminatedUnionHelpers.njk", {
1747
- discriminatedUnionDiscriminator: nameApi.discriminatedUnionDiscriminator(name),
1748
- discriminatedUnionFunction: nameApi.discriminatedUnionFunction(name),
1749
- getVariant: (variant) => nameApi.discriminatedUnionVariant(variant),
1750
- isDiscriminatedUnionFunction: nameApi.isDiscriminatedUnionFunction(name),
1751
- looseName: nameApi.dataArgsType(name),
1752
- strictName: nameApi.dataType(name),
1753
- typeNode
1754
- }).addImports("solanaCodecsDataStructures", [
1755
- "type GetDiscriminatedUnionVariantContent",
1756
- "type GetDiscriminatedUnionVariant"
1757
- ]);
1758
- }
1759
-
1760
- // src/TypeManifest.ts
1761
- function typeManifest() {
1762
- return {
1763
- decoder: fragment(""),
1764
- encoder: fragment(""),
1765
- isEnum: false,
1766
- looseType: fragment(""),
1767
- strictType: fragment(""),
1768
- value: fragment("")
1769
- };
1770
- }
1771
- function mergeManifests(manifests, options = {}) {
1772
- const { mergeTypes, mergeCodecs, mergeValues } = options;
1773
- const merge = (fragmentFn, mergeFn) => mergeFn ? mergeFragments(manifests.map(fragmentFn), mergeFn) : fragment("");
1774
- return {
1775
- decoder: merge((m) => m.decoder, mergeCodecs),
1776
- encoder: merge((m) => m.encoder, mergeCodecs),
1777
- isEnum: false,
1778
- looseType: merge((m) => m.looseType, mergeTypes),
1779
- strictType: merge((m) => m.strictType, mergeTypes),
1780
- value: merge((m) => m.value, mergeValues)
1781
- };
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
+ );
1782
1992
  }
1783
1993
 
1784
- // src/getRenderMapVisitor.ts
1785
- var import_node_path3 = require("path");
1786
- var import_errors2 = require("@codama/errors");
1787
- var import_nodes26 = require("@codama/nodes");
1788
- var import_renderers_core = require("@codama/renderers-core");
1789
- var import_visitors_core21 = require("@codama/visitors-core");
1790
-
1791
1994
  // src/getTypeManifestVisitor.ts
1792
1995
  var import_nodes24 = require("@codama/nodes");
1793
- 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");
1794
1998
  function getTypeManifestVisitor(input) {
1795
1999
  const { nameApi, linkables, nonScalarEnums, customAccountData, customInstructionData, getImportFrom } = input;
1796
- const stack = input.stack ?? new import_visitors_core20.NodeStack();
2000
+ const stack = input.stack ?? new import_visitors_core30.NodeStack();
1797
2001
  let parentName = null;
1798
- return (0, import_visitors_core20.pipe)(
1799
- (0, import_visitors_core20.staticVisitor)(
1800
- () => ({
1801
- decoder: fragment(""),
1802
- encoder: fragment(""),
1803
- isEnum: false,
1804
- looseType: fragment(""),
1805
- strictType: fragment(""),
1806
- value: fragment("")
1807
- }),
1808
- {
1809
- keys: [
1810
- ...import_nodes24.REGISTERED_TYPE_NODE_KINDS,
1811
- ...import_nodes24.REGISTERED_VALUE_NODE_KINDS,
1812
- "definedTypeLinkNode",
1813
- "definedTypeNode",
1814
- "accountNode",
1815
- "instructionNode"
1816
- ]
1817
- }
1818
- ),
1819
- (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, {
1820
2014
  visitAccount(account, { self }) {
1821
2015
  parentName = {
1822
2016
  loose: nameApi.dataArgsType(account.name),
1823
2017
  strict: nameApi.dataType(account.name)
1824
2018
  };
1825
2019
  const link = customAccountData.get(account.name)?.linkNode;
1826
- 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);
1827
2021
  parentName = null;
1828
2022
  return manifest;
1829
2023
  },
1830
2024
  visitAmountType(amountType, { self }) {
1831
- return (0, import_visitors_core20.visit)(amountType.number, self);
2025
+ return (0, import_visitors_core30.visit)(amountType.number, self);
1832
2026
  },
1833
2027
  visitArrayType(arrayType, { self }) {
1834
- const childManifest = (0, import_visitors_core20.visit)(arrayType.item, self);
1835
- childManifest.looseType.mapRender((r) => `Array<${r}>`);
1836
- childManifest.strictType.mapRender((r) => `Array<${r}>`);
2028
+ const childManifest = (0, import_visitors_core30.visit)(arrayType.item, self);
1837
2029
  const sizeManifest = getArrayLikeSizeOption(arrayType.count, self);
1838
- const encoderOptions = sizeManifest.encoder.render ? `, { ${sizeManifest.encoder.render} }` : "";
1839
- const decoderOptions = sizeManifest.decoder.render ? `, { ${sizeManifest.decoder.render} }` : "";
1840
- childManifest.encoder.mapRender((r) => `getArrayEncoder(${r + encoderOptions})`).mergeImportsWith(sizeManifest.encoder).addImports("solanaCodecsDataStructures", "getArrayEncoder");
1841
- childManifest.decoder.mapRender((r) => `getArrayDecoder(${r + decoderOptions})`).mergeImportsWith(sizeManifest.decoder).addImports("solanaCodecsDataStructures", "getArrayDecoder");
1842
- 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
+ });
1843
2049
  },
1844
2050
  visitArrayValue(node, { self }) {
1845
- return mergeManifests(
1846
- 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)),
1847
2053
  { mergeValues: (renders) => `[${renders.join(", ")}]` }
1848
2054
  );
1849
2055
  },
@@ -1854,75 +2060,74 @@ function getTypeManifestVisitor(input) {
1854
2060
  let sizeDecoder = "";
1855
2061
  const resolvedSize = (0, import_nodes24.resolveNestedTypeNode)(booleanType.size);
1856
2062
  if (resolvedSize.format !== "u8" || resolvedSize.endian !== "le") {
1857
- const size = (0, import_visitors_core20.visit)(booleanType.size, self);
2063
+ const size = (0, import_visitors_core30.visit)(booleanType.size, self);
1858
2064
  encoderImports.mergeWith(size.encoder);
1859
2065
  decoderImports.mergeWith(size.decoder);
1860
- sizeEncoder = `{ size: ${size.encoder.render} }`;
1861
- sizeDecoder = `{ size: ${size.decoder.render} }`;
2066
+ sizeEncoder = `{ size: ${size.encoder.content} }`;
2067
+ sizeDecoder = `{ size: ${size.decoder.content} }`;
1862
2068
  }
1863
- return {
1864
- decoder: fragment(`getBooleanDecoder(${sizeDecoder})`, decoderImports),
1865
- encoder: fragment(`getBooleanEncoder(${sizeEncoder})`, encoderImports),
1866
- 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
+ ),
1867
2078
  looseType: fragment("boolean"),
1868
- strictType: fragment("boolean"),
1869
- value: fragment("")
1870
- };
2079
+ strictType: fragment("boolean")
2080
+ });
1871
2081
  },
1872
2082
  visitBooleanValue(node) {
1873
- const manifest = typeManifest();
1874
- manifest.value.setRender(JSON.stringify(node.boolean));
1875
- return manifest;
2083
+ return typeManifest({
2084
+ value: fragment(JSON.stringify(node.boolean))
2085
+ });
1876
2086
  },
1877
2087
  visitBytesType() {
1878
- return {
1879
- decoder: fragment(`getBytesDecoder()`).addImports(
1880
- "solanaCodecsDataStructures",
1881
- "getBytesDecoder"
1882
- ),
1883
- encoder: fragment(`getBytesEncoder()`).addImports(
1884
- "solanaCodecsDataStructures",
1885
- "getBytesEncoder"
1886
- ),
1887
- isEnum: false,
1888
- looseType: fragment("ReadonlyUint8Array").addImports(
1889
- "solanaCodecsCore",
1890
- "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"])
1891
2096
  ),
1892
- strictType: fragment("ReadonlyUint8Array").addImports(
1893
- "solanaCodecsCore",
1894
- "type ReadonlyUint8Array"
2097
+ encoder: (0, import_visitors_core30.pipe)(
2098
+ fragment(`getBytesEncoder()`),
2099
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getBytesEncoder"])
1895
2100
  ),
1896
- value: fragment("")
1897
- };
2101
+ looseType: readonlyUint8Array,
2102
+ strictType: readonlyUint8Array
2103
+ });
1898
2104
  },
1899
2105
  visitBytesValue(node) {
1900
- const manifest = typeManifest();
1901
2106
  const bytes = getBytesFromBytesValueNode(node);
1902
- manifest.value.setRender(`new Uint8Array([${Array.from(bytes).join(", ")}])`);
1903
- return manifest;
2107
+ return typeManifest({
2108
+ value: fragment(`new Uint8Array([${Array.from(bytes).join(", ")}])`)
2109
+ });
1904
2110
  },
1905
2111
  visitConstantValue(node, { self }) {
1906
2112
  if ((0, import_nodes24.isNode)(node.type, "bytesTypeNode") && (0, import_nodes24.isNode)(node.value, "bytesValueNode")) {
1907
- return (0, import_visitors_core20.visit)(node.value, self);
2113
+ return (0, import_visitors_core30.visit)(node.value, self);
1908
2114
  }
1909
- return {
1910
- ...typeManifest(),
2115
+ return typeManifest({
1911
2116
  value: mergeFragments(
1912
- [(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],
1913
2118
  ([encoderFunction, value]) => `${encoderFunction}.encode(${value})`
1914
2119
  )
1915
- };
2120
+ });
1916
2121
  },
1917
2122
  visitDateTimeType(dateTimeType, { self }) {
1918
- return (0, import_visitors_core20.visit)(dateTimeType.number, self);
2123
+ return (0, import_visitors_core30.visit)(dateTimeType.number, self);
1919
2124
  },
1920
2125
  visitDefinedType(definedType, { self }) {
1921
2126
  parentName = {
1922
2127
  loose: nameApi.dataArgsType(definedType.name),
1923
2128
  strict: nameApi.dataType(definedType.name)
1924
2129
  };
1925
- const manifest = (0, import_visitors_core20.visit)(definedType.type, self);
2130
+ const manifest = (0, import_visitors_core30.visit)(definedType.type, self);
1926
2131
  parentName = null;
1927
2132
  return manifest;
1928
2133
  },
@@ -1932,33 +2137,41 @@ function getTypeManifestVisitor(input) {
1932
2137
  const encoderFunction = nameApi.encoderFunction(node.name);
1933
2138
  const decoderFunction = nameApi.decoderFunction(node.name);
1934
2139
  const importFrom = getImportFrom(node);
1935
- return {
1936
- decoder: fragment(`${decoderFunction}()`).addImports(importFrom, decoderFunction),
1937
- encoder: fragment(`${encoderFunction}()`).addImports(importFrom, encoderFunction),
1938
- isEnum: false,
1939
- looseType: fragment(looseName).addImports(importFrom, `type ${looseName}`),
1940
- strictType: fragment(strictName).addImports(importFrom, `type ${strictName}`),
1941
- value: fragment("")
1942
- };
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
+ });
1943
2158
  },
1944
2159
  visitEnumEmptyVariantType(enumEmptyVariantType) {
1945
2160
  const discriminator = nameApi.discriminatedUnionDiscriminator((0, import_nodes24.camelCase)(parentName?.strict ?? ""));
1946
2161
  const name = nameApi.discriminatedUnionVariant(enumEmptyVariantType.name);
1947
2162
  const kindAttribute = `${discriminator}: "${name}"`;
1948
- return {
1949
- decoder: fragment(`['${name}', getUnitDecoder()]`).addImports(
1950
- "solanaCodecsDataStructures",
1951
- "getUnitDecoder"
2163
+ return typeManifest({
2164
+ decoder: (0, import_visitors_core30.pipe)(
2165
+ fragment(`['${name}', getUnitDecoder()]`),
2166
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getUnitDecoder"])
1952
2167
  ),
1953
- encoder: fragment(`['${name}', getUnitEncoder()]`).addImports(
1954
- "solanaCodecsDataStructures",
1955
- "getUnitEncoder"
2168
+ encoder: (0, import_visitors_core30.pipe)(
2169
+ fragment(`['${name}', getUnitEncoder()]`),
2170
+ (f) => addFragmentImports(f, "solanaCodecsDataStructures", ["getUnitEncoder"])
1956
2171
  ),
1957
- isEnum: false,
1958
2172
  looseType: fragment(`{ ${kindAttribute} }`),
1959
- strictType: fragment(`{ ${kindAttribute} }`),
1960
- value: fragment("")
1961
- };
2173
+ strictType: fragment(`{ ${kindAttribute} }`)
2174
+ });
1962
2175
  },
1963
2176
  visitEnumStructVariantType(enumStructVariantType, { self }) {
1964
2177
  const currentParentName = parentName;
@@ -1968,13 +2181,21 @@ function getTypeManifestVisitor(input) {
1968
2181
  const name = nameApi.discriminatedUnionVariant(enumStructVariantType.name);
1969
2182
  const kindAttribute = `${discriminator}: "${name}"`;
1970
2183
  parentName = null;
1971
- const structManifest = (0, import_visitors_core20.visit)(enumStructVariantType.struct, self);
2184
+ const structManifest = (0, import_visitors_core30.visit)(enumStructVariantType.struct, self);
1972
2185
  parentName = currentParentName;
1973
- structManifest.strictType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1974
- structManifest.looseType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1975
- structManifest.encoder.mapRender((r) => `['${name}', ${r}]`);
1976
- structManifest.decoder.mapRender((r) => `['${name}', ${r}]`);
1977
- 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
+ });
1978
2199
  },
1979
2200
  visitEnumTupleVariantType(enumTupleVariantType, { self }) {
1980
2201
  const currentParentName = parentName;
@@ -1990,13 +2211,21 @@ function getTypeManifestVisitor(input) {
1990
2211
  })
1991
2212
  ]);
1992
2213
  parentName = null;
1993
- const structManifest = (0, import_visitors_core20.visit)(struct, self);
2214
+ const structManifest = (0, import_visitors_core30.visit)(struct, self);
1994
2215
  parentName = currentParentName;
1995
- structManifest.strictType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1996
- structManifest.looseType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1997
- structManifest.encoder.mapRender((r) => `['${name}', ${r}]`);
1998
- structManifest.decoder.mapRender((r) => `['${name}', ${r}]`);
1999
- 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
+ });
2000
2229
  },
2001
2230
  visitEnumType(enumType, { self }) {
2002
2231
  const currentParentName = parentName;
@@ -2006,11 +2235,11 @@ function getTypeManifestVisitor(input) {
2006
2235
  const decoderOptions = [];
2007
2236
  const enumSize = (0, import_nodes24.resolveNestedTypeNode)(enumType.size);
2008
2237
  if (enumSize.format !== "u8" || enumSize.endian !== "le") {
2009
- const sizeManifest = (0, import_visitors_core20.visit)(enumType.size, self);
2238
+ const sizeManifest = (0, import_visitors_core30.visit)(enumType.size, self);
2010
2239
  encoderImports.mergeWith(sizeManifest.encoder);
2011
2240
  decoderImports.mergeWith(sizeManifest.decoder);
2012
- encoderOptions.push(`size: ${sizeManifest.encoder.render}`);
2013
- decoderOptions.push(`size: ${sizeManifest.decoder.render}`);
2241
+ encoderOptions.push(`size: ${sizeManifest.encoder.content}`);
2242
+ decoderOptions.push(`size: ${sizeManifest.decoder.content}`);
2014
2243
  }
2015
2244
  const discriminator = nameApi.discriminatedUnionDiscriminator(
2016
2245
  (0, import_nodes24.camelCase)(currentParentName?.strict ?? "")
@@ -2028,31 +2257,50 @@ function getTypeManifestVisitor(input) {
2028
2257
  );
2029
2258
  }
2030
2259
  const variantNames = enumType.variants.map(({ name }) => nameApi.enumVariant(name));
2031
- return {
2032
- decoder: fragment(
2033
- `getEnumDecoder(${currentParentName.strict + decoderOptionsAsString})`,
2034
- 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"])
2035
2265
  ),
2036
- encoder: fragment(
2037
- `getEnumEncoder(${currentParentName.strict + encoderOptionsAsString})`,
2038
- 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"])
2039
2270
  ),
2040
2271
  isEnum: true,
2041
2272
  looseType: fragment(`{ ${variantNames.join(", ")} }`),
2042
- strictType: fragment(`{ ${variantNames.join(", ")} }`),
2043
- value: fragment("")
2044
- };
2273
+ strictType: fragment(`{ ${variantNames.join(", ")} }`)
2274
+ });
2045
2275
  }
2046
- const mergedManifest = mergeManifests(
2047
- 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)),
2048
2278
  {
2049
2279
  mergeCodecs: (renders) => renders.join(", "),
2050
2280
  mergeTypes: (renders) => renders.join(" | ")
2051
2281
  }
2052
2282
  );
2053
- mergedManifest.encoder.mapRender((r) => `getDiscriminatedUnionEncoder([${r}]${encoderOptionsAsString})`).mergeImportsWith(encoderImports).addImports("solanaCodecsDataStructures", ["getDiscriminatedUnionEncoder"]);
2054
- mergedManifest.decoder.mapRender((r) => `getDiscriminatedUnionDecoder([${r}]${decoderOptionsAsString})`).mergeImportsWith(decoderImports).addImports("solanaCodecsDataStructures", ["getDiscriminatedUnionDecoder"]);
2055
- 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
+ });
2056
2304
  },
2057
2305
  visitEnumValue(node, { self }) {
2058
2306
  const manifest = typeManifest();
@@ -2063,40 +2311,108 @@ function getTypeManifestVisitor(input) {
2063
2311
  const isScalar = enumNode && (0, import_nodes24.isNode)(enumNode, "enumTypeNode") ? (0, import_nodes24.isScalarEnum)(enumNode) : !nonScalarEnums.includes(node.enum.name);
2064
2312
  if (!node.value && isScalar) {
2065
2313
  const variantName2 = nameApi.enumVariant(node.variant);
2066
- manifest.value.setRender(`${enumName}.${variantName2}`).addImports(importFrom, enumName);
2067
- 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
+ });
2068
2322
  }
2069
2323
  const variantName = nameApi.discriminatedUnionVariant(node.variant);
2070
2324
  if (!node.value) {
2071
- manifest.value.setRender(`${enumFunction}('${variantName}')`).addImports(importFrom, enumFunction);
2072
- 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
+ });
2073
2333
  }
2074
- manifest.value = (0, import_visitors_core20.visit)(node.value, self).value.mapRender((r) => `${enumFunction}('${variantName}', ${r})`).addImports(importFrom, enumFunction);
2075
- 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
+ });
2076
2342
  },
2077
2343
  visitFixedSizeType(node, { self }) {
2078
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2079
- manifest.encoder.mapRender((r) => `fixEncoderSize(${r}, ${node.size})`).addImports("solanaCodecsCore", "fixEncoderSize");
2080
- manifest.decoder.mapRender((r) => `fixDecoderSize(${r}, ${node.size})`).addImports("solanaCodecsCore", "fixDecoderSize");
2081
- 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
+ });
2082
2358
  },
2083
2359
  visitHiddenPrefixType(node, { self }) {
2084
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2085
- const prefixes = node.prefix.map((c) => (0, import_visitors_core20.visit)(c, self).value);
2086
- const prefixEncoders = fragment(prefixes.map((c) => `getConstantEncoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantEncoder").mergeImportsWith(...prefixes);
2087
- const prefixDecoders = fragment(prefixes.map((c) => `getConstantDecoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantDecoder").mergeImportsWith(...prefixes);
2088
- manifest.encoder.mapRender((r) => `getHiddenPrefixEncoder(${r}, [${prefixEncoders.render}])`).mergeImportsWith(prefixEncoders).addImports("solanaCodecsDataStructures", "getHiddenPrefixEncoder");
2089
- manifest.decoder.mapRender((r) => `getHiddenPrefixDecoder(${r}, [${prefixDecoders.render}])`).mergeImportsWith(prefixDecoders).addImports("solanaCodecsDataStructures", "getHiddenPrefixDecoder");
2090
- 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
+ });
2091
2387
  },
2092
2388
  visitHiddenSuffixType(node, { self }) {
2093
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2094
- const suffixes = node.suffix.map((c) => (0, import_visitors_core20.visit)(c, self).value);
2095
- const suffixEncoders = fragment(suffixes.map((c) => `getConstantEncoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantEncoder").mergeImportsWith(...suffixes);
2096
- const suffixDecoders = fragment(suffixes.map((c) => `getConstantDecoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantDecoder").mergeImportsWith(...suffixes);
2097
- manifest.encoder.mapRender((r) => `getHiddenSuffixEncoder(${r}, [${suffixEncoders.render}])`).mergeImportsWith(suffixEncoders).addImports("solanaCodecsDataStructures", "getHiddenSuffixEncoder");
2098
- manifest.decoder.mapRender((r) => `getHiddenSuffixDecoder(${r}, [${suffixDecoders.render}])`).mergeImportsWith(suffixDecoders).addImports("solanaCodecsDataStructures", "getHiddenSuffixDecoder");
2099
- 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
+ });
2100
2416
  },
2101
2417
  visitInstruction(instruction, { self }) {
2102
2418
  const instructionDataName = nameApi.instructionDataType(instruction.name);
@@ -2106,39 +2422,49 @@ function getTypeManifestVisitor(input) {
2106
2422
  };
2107
2423
  const link = customInstructionData.get(instruction.name)?.linkNode;
2108
2424
  const struct = (0, import_nodes24.structTypeNodeFromInstructionArgumentNodes)(instruction.arguments);
2109
- 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);
2110
2426
  parentName = null;
2111
2427
  return manifest;
2112
2428
  },
2113
2429
  visitMapEntryValue(node, { self }) {
2114
- 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)], {
2115
2431
  mergeValues: (renders) => `[${renders.join(", ")}]`
2116
2432
  });
2117
2433
  },
2118
2434
  visitMapType(mapType, { self }) {
2119
- const key = (0, import_visitors_core20.visit)(mapType.key, self);
2120
- const value = (0, import_visitors_core20.visit)(mapType.value, self);
2121
- 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], {
2122
2438
  mergeCodecs: ([k, v]) => `${k}, ${v}`,
2123
2439
  mergeTypes: ([k, v]) => `Map<${k}, ${v}>`
2124
2440
  });
2125
2441
  const sizeManifest = getArrayLikeSizeOption(mapType.count, self);
2126
- const encoderOptions = sizeManifest.encoder.render ? `, { ${sizeManifest.encoder.render} }` : "";
2127
- const decoderOptions = sizeManifest.decoder.render ? `, { ${sizeManifest.decoder.render} }` : "";
2128
- mergedManifest.encoder.mapRender((r) => `getMapEncoder(${r}${encoderOptions})`).addImports("solanaCodecsDataStructures", "getMapEncoder");
2129
- mergedManifest.decoder.mapRender((r) => `getMapDecoder(${r}${decoderOptions})`).addImports("solanaCodecsDataStructures", "getMapDecoder");
2130
- 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
+ });
2131
2457
  },
2132
2458
  visitMapValue(node, { self }) {
2133
- const entryFragments = node.entries.map((entry) => (0, import_visitors_core20.visit)(entry, self));
2134
- return mergeManifests(entryFragments, {
2459
+ const entryFragments = node.entries.map((entry) => (0, import_visitors_core30.visit)(entry, self));
2460
+ return mergeTypeManifests(entryFragments, {
2135
2461
  mergeValues: (renders) => `new Map([${renders.join(", ")}])`
2136
2462
  });
2137
2463
  },
2138
2464
  visitNoneValue() {
2139
- const manifest = typeManifest();
2140
- manifest.value.setRender("none()").addImports("solanaOptions", "none");
2141
- return manifest;
2465
+ return typeManifest({
2466
+ value: (0, import_visitors_core30.pipe)(fragment("none()"), (f) => addFragmentImports(f, "solanaOptions", ["none"]))
2467
+ });
2142
2468
  },
2143
2469
  visitNumberType(numberType) {
2144
2470
  const encoderFunction = nameApi.encoderFunction(numberType.format);
@@ -2152,33 +2478,37 @@ function getTypeManifestVisitor(input) {
2152
2478
  decoderImports.add("solanaCodecsNumbers", "Endian");
2153
2479
  endianness = "{ endian: Endian.Big }";
2154
2480
  }
2155
- return {
2156
- decoder: fragment(`${decoderFunction}(${endianness})`, decoderImports),
2157
- encoder: fragment(`${encoderFunction}(${endianness})`, encoderImports),
2158
- 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
+ ),
2159
2490
  looseType: fragment(isBigNumber ? "number | bigint" : "number"),
2160
- strictType: fragment(isBigNumber ? "bigint" : "number"),
2161
- value: fragment("")
2162
- };
2491
+ strictType: fragment(isBigNumber ? "bigint" : "number")
2492
+ });
2163
2493
  },
2164
2494
  visitNumberValue(node) {
2165
- const manifest = typeManifest();
2166
- manifest.value.setRender(JSON.stringify(node.number));
2167
- return manifest;
2495
+ return typeManifest({
2496
+ value: fragment(JSON.stringify(node.number))
2497
+ });
2168
2498
  },
2169
2499
  visitOptionType(optionType, { self }) {
2170
- const childManifest = (0, import_visitors_core20.visit)(optionType.item, self);
2171
- childManifest.strictType.mapRender((r) => `Option<${r}>`).addImports("solanaOptions", "type Option");
2172
- childManifest.looseType.mapRender((r) => `OptionOrNullable<${r}>`).addImports("solanaOptions", "type OptionOrNullable");
2500
+ const childManifest = (0, import_visitors_core30.visit)(optionType.item, self);
2173
2501
  const encoderOptions = [];
2174
2502
  const decoderOptions = [];
2503
+ const encoderImports = new ImportMap();
2504
+ const decoderImports = new ImportMap();
2175
2505
  const optionPrefix = (0, import_nodes24.resolveNestedTypeNode)(optionType.prefix);
2176
2506
  if (optionPrefix.format !== "u8" || optionPrefix.endian !== "le") {
2177
- const prefixManifest = (0, import_visitors_core20.visit)(optionType.prefix, self);
2178
- childManifest.encoder.mergeImportsWith(prefixManifest.encoder);
2179
- childManifest.decoder.mergeImportsWith(prefixManifest.decoder);
2180
- encoderOptions.push(`prefix: ${prefixManifest.encoder.render}`);
2181
- 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}`);
2182
2512
  }
2183
2513
  if (optionType.fixed) {
2184
2514
  encoderOptions.push(`noneValue: "zeroes"`);
@@ -2186,16 +2516,48 @@ function getTypeManifestVisitor(input) {
2186
2516
  }
2187
2517
  const encoderOptionsAsString = encoderOptions.length > 0 ? `, { ${encoderOptions.join(", ")} }` : "";
2188
2518
  const decoderOptionsAsString = decoderOptions.length > 0 ? `, { ${decoderOptions.join(", ")} }` : "";
2189
- childManifest.encoder.mapRender((r) => `getOptionEncoder(${r + encoderOptionsAsString})`).addImports("solanaOptions", "getOptionEncoder");
2190
- childManifest.decoder.mapRender((r) => `getOptionDecoder(${r + decoderOptionsAsString})`).addImports("solanaOptions", "getOptionDecoder");
2191
- 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
+ });
2192
2544
  },
2193
2545
  visitPostOffsetType(node, { self }) {
2194
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2546
+ const manifest = (0, import_visitors_core30.visit)(node.type, self);
2195
2547
  if (node.strategy === "padded") {
2196
- manifest.encoder.mapRender((r) => `padRightEncoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padRightEncoder");
2197
- manifest.decoder.mapRender((r) => `padRightDecoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padRightDecoder");
2198
- 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
+ });
2199
2561
  }
2200
2562
  const fn = (() => {
2201
2563
  switch (node.strategy) {
@@ -2208,16 +2570,36 @@ function getTypeManifestVisitor(input) {
2208
2570
  return node.offset < 0 ? `({ postOffset }) => postOffset ${node.offset}` : `({ postOffset }) => postOffset + ${node.offset}`;
2209
2571
  }
2210
2572
  })();
2211
- manifest.encoder.mapRender((r) => `offsetEncoder(${r}, { postOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetEncoder");
2212
- manifest.decoder.mapRender((r) => `offsetDecoder(${r}, { postOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetDecoder");
2213
- 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
+ });
2214
2586
  },
2215
2587
  visitPreOffsetType(node, { self }) {
2216
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2588
+ const manifest = (0, import_visitors_core30.visit)(node.type, self);
2217
2589
  if (node.strategy === "padded") {
2218
- manifest.encoder.mapRender((r) => `padLeftEncoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padLeftEncoder");
2219
- manifest.decoder.mapRender((r) => `padLeftDecoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padLeftDecoder");
2220
- 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
+ });
2221
2603
  }
2222
2604
  const fn = (() => {
2223
2605
  switch (node.strategy) {
@@ -2228,85 +2610,177 @@ function getTypeManifestVisitor(input) {
2228
2610
  return node.offset < 0 ? `({ preOffset }) => preOffset ${node.offset}` : `({ preOffset }) => preOffset + ${node.offset}`;
2229
2611
  }
2230
2612
  })();
2231
- manifest.encoder.mapRender((r) => `offsetEncoder(${r}, { preOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetEncoder");
2232
- manifest.decoder.mapRender((r) => `offsetDecoder(${r}, { preOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetDecoder");
2233
- 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
+ });
2234
2626
  },
2235
2627
  visitPublicKeyType() {
2236
- const imports = new ImportMap().add("solanaAddresses", "type Address");
2237
- return {
2238
- decoder: fragment("getAddressDecoder()").addImports("solanaAddresses", "getAddressDecoder"),
2239
- encoder: fragment("getAddressEncoder()").addImports("solanaAddresses", "getAddressEncoder"),
2240
- isEnum: false,
2241
- looseType: fragment("Address", imports),
2242
- strictType: fragment("Address", imports),
2243
- value: fragment("")
2244
- };
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
+ });
2245
2644
  },
2246
2645
  visitPublicKeyValue(node) {
2247
- const manifest = typeManifest();
2248
- manifest.value.setRender(`address("${node.publicKey}")`).addImports("solanaAddresses", "address");
2249
- 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
+ });
2250
2652
  },
2251
2653
  visitRemainderOptionType(node, { self }) {
2252
- const childManifest = (0, import_visitors_core20.visit)(node.item, self);
2253
- childManifest.strictType.mapRender((r) => `Option<${r}>`).addImports("solanaOptions", "type Option");
2254
- childManifest.looseType.mapRender((r) => `OptionOrNullable<${r}>`).addImports("solanaOptions", "type OptionOrNullable");
2654
+ const childManifest = (0, import_visitors_core30.visit)(node.item, self);
2255
2655
  const encoderOptions = ["prefix: null"];
2256
2656
  const decoderOptions = ["prefix: null"];
2257
2657
  const encoderOptionsAsString = encoderOptions.length > 0 ? `, { ${encoderOptions.join(", ")} }` : "";
2258
2658
  const decoderOptionsAsString = decoderOptions.length > 0 ? `, { ${decoderOptions.join(", ")} }` : "";
2259
- childManifest.encoder.mapRender((r) => `getOptionEncoder(${r + encoderOptionsAsString})`).addImports("solanaOptions", "getOptionEncoder");
2260
- childManifest.decoder.mapRender((r) => `getOptionDecoder(${r + decoderOptionsAsString})`).addImports("solanaOptions", "getOptionDecoder");
2261
- 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
+ });
2262
2682
  },
2263
2683
  visitSentinelType(node, { self }) {
2264
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2265
- const sentinel = (0, import_visitors_core20.visit)(node.sentinel, self).value;
2266
- manifest.encoder.mapRender((r) => `addEncoderSentinel(${r}, ${sentinel.render})`).mergeImportsWith(sentinel).addImports("solanaCodecsCore", "addEncoderSentinel");
2267
- manifest.decoder.mapRender((r) => `addDecoderSentinel(${r}, ${sentinel.render})`).mergeImportsWith(sentinel).addImports("solanaCodecsCore", "addDecoderSentinel");
2268
- 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
+ });
2269
2703
  },
2270
2704
  visitSetType(setType, { self }) {
2271
- const childManifest = (0, import_visitors_core20.visit)(setType.item, self);
2272
- childManifest.strictType.mapRender((r) => `Set<${r}>`);
2273
- childManifest.looseType.mapRender((r) => `Set<${r}>`);
2705
+ const childManifest = (0, import_visitors_core30.visit)(setType.item, self);
2274
2706
  const sizeManifest = getArrayLikeSizeOption(setType.count, self);
2275
- const encoderOptions = sizeManifest.encoder.render ? `, { ${sizeManifest.encoder.render} }` : "";
2276
- const decoderOptions = sizeManifest.decoder.render ? `, { ${sizeManifest.decoder.render} }` : "";
2277
- childManifest.encoder.mergeImportsWith(sizeManifest.encoder).mapRender((r) => `getSetEncoder(${r + encoderOptions})`).addImports("solanaCodecsDataStructures", "getSetEncoder");
2278
- childManifest.decoder.mergeImportsWith(sizeManifest.decoder).mapRender((r) => `getSetDecoder(${r + decoderOptions})`).addImports("solanaCodecsDataStructures", "getSetDecoder");
2279
- 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
+ });
2280
2726
  },
2281
2727
  visitSetValue(node, { self }) {
2282
- return mergeManifests(
2283
- 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)),
2284
2730
  { mergeValues: (renders) => `new Set([${renders.join(", ")}])` }
2285
2731
  );
2286
2732
  },
2287
2733
  visitSizePrefixType(node, { self }) {
2288
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2289
- const prefix = (0, import_visitors_core20.visit)(node.prefix, self);
2290
- manifest.encoder.mapRender((r) => `addEncoderSizePrefix(${r}, ${prefix.encoder.render})`).mergeImportsWith(prefix.encoder).addImports("solanaCodecsCore", "addEncoderSizePrefix");
2291
- manifest.decoder.mapRender((r) => `addDecoderSizePrefix(${r}, ${prefix.decoder.render})`).mergeImportsWith(prefix.decoder).addImports("solanaCodecsCore", "addDecoderSizePrefix");
2292
- 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
+ });
2293
2753
  },
2294
2754
  visitSolAmountType({ number }, { self }) {
2295
- const numberManifest = (0, import_visitors_core20.visit)(number, self);
2296
- const lamportsType = "Lamports";
2297
- const lamportsImport = new ImportMap().add("solanaRpcTypes", "type Lamports");
2298
- 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({
2299
2761
  ...numberManifest,
2300
- decoder: numberManifest.decoder.mapRender((r) => `getLamportsDecoder(${r})`).addImports("solanaRpcTypes", "getLamportsDecoder"),
2301
- encoder: numberManifest.encoder.mapRender((r) => `getLamportsEncoder(${r})`).addImports("solanaRpcTypes", "getLamportsEncoder"),
2302
- looseType: fragment(lamportsType, lamportsImport),
2303
- strictType: fragment(lamportsType, lamportsImport)
2304
- };
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
+ });
2305
2775
  },
2306
2776
  visitSomeValue(node, { self }) {
2307
- const manifest = typeManifest();
2308
- manifest.value = (0, import_visitors_core20.visit)(node.value, self).value.mapRender((r) => `some(${r})`).addImports("solanaOptions", "some");
2309
- 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
+ });
2310
2784
  },
2311
2785
  visitStringType(stringType) {
2312
2786
  const [encoder, decoder] = (() => {
@@ -2323,66 +2797,109 @@ function getTypeManifestVisitor(input) {
2323
2797
  throw new Error(`Unsupported string encoding: ${stringType.encoding}`);
2324
2798
  }
2325
2799
  })();
2326
- return {
2327
- decoder: fragment(`${decoder}()`).addImports("solanaCodecsStrings", decoder),
2328
- encoder: fragment(`${encoder}()`).addImports("solanaCodecsStrings", encoder),
2329
- 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
+ ),
2330
2809
  looseType: fragment("string"),
2331
- strictType: fragment("string"),
2332
- value: fragment("")
2333
- };
2810
+ strictType: fragment("string")
2811
+ });
2334
2812
  },
2335
2813
  visitStringValue(node) {
2336
- const manifest = typeManifest();
2337
- manifest.value.setRender(JSON.stringify(node.string));
2338
- return manifest;
2814
+ return typeManifest({
2815
+ value: fragment(JSON.stringify(node.string))
2816
+ });
2339
2817
  },
2340
2818
  visitStructFieldType(structFieldType, { self }) {
2341
2819
  const name = (0, import_nodes24.camelCase)(structFieldType.name);
2342
- const childManifest = (0, import_visitors_core20.visit)(structFieldType.type, self);
2820
+ const originalChildManifest = (0, import_visitors_core30.visit)(structFieldType.type, self);
2343
2821
  const structFieldDocs = (0, import_nodes24.parseDocs)(structFieldType.docs);
2344
2822
  const docblock = structFieldDocs.length > 0 ? `
2345
2823
  ${jsDocblock(structFieldDocs)}` : "";
2346
- const originalLooseType = childManifest.looseType.render;
2347
- childManifest.strictType.mapRender((r) => `${docblock}${name}: ${r}; `);
2348
- childManifest.looseType.mapRender((r) => `${docblock}${name}: ${r}; `);
2349
- childManifest.encoder.mapRender((r) => `['${name}', ${r}]`);
2350
- 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
+ });
2351
2844
  if (!structFieldType.defaultValue) {
2352
2845
  return childManifest;
2353
2846
  }
2354
2847
  if (structFieldType.defaultValueStrategy !== "omitted") {
2355
- childManifest.looseType.setRender(`${docblock}${name}?: ${originalLooseType}; `);
2356
- 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
+ });
2357
2855
  }
2358
- childManifest.looseType = fragment("");
2359
- return childManifest;
2856
+ return typeManifest({
2857
+ ...childManifest,
2858
+ looseType: fragment("")
2859
+ });
2360
2860
  },
2361
2861
  visitStructFieldValue(node, { self }) {
2362
- const manifest = typeManifest();
2363
- manifest.value = (0, import_visitors_core20.visit)(node.value, self).value.mapRender((r) => `${node.name}: ${r}`);
2364
- 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
+ });
2365
2868
  },
2366
2869
  visitStructType(structType, { self }) {
2367
2870
  const optionalFields = structType.fields.filter((f) => !!f.defaultValue);
2368
- const mergedManifest = mergeManifests(
2369
- structType.fields.map((field) => (0, import_visitors_core20.visit)(field, self)),
2370
- {
2371
- mergeCodecs: (renders) => `([${renders.join(", ")}])`,
2372
- mergeTypes: (renders) => `{ ${renders.join("")} }`
2373
- }
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
+ })
2374
2892
  );
2375
- mergedManifest.encoder.mapRender((r) => `getStructEncoder${r}`).addImports("solanaCodecsDataStructures", "getStructEncoder");
2376
- mergedManifest.decoder.mapRender((r) => `getStructDecoder${r}`).addImports("solanaCodecsDataStructures", "getStructDecoder");
2377
2893
  if (optionalFields.length === 0) {
2378
2894
  return mergedManifest;
2379
2895
  }
2380
2896
  const parentPath = stack.getPath();
2381
- const instructionNode = (0, import_visitors_core20.findLastNodeFromPath)(parentPath, "instructionNode");
2382
- 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");
2383
2899
  const discriminatorPrefix = instructionNode ? instructionNode.name : accountNode?.name;
2384
2900
  const discriminators = (instructionNode ? instructionNode.discriminators : accountNode?.discriminators) ?? [];
2385
2901
  const fieldDiscriminators = discriminators.filter((0, import_nodes24.isNodeFilter)("fieldDiscriminatorNode"));
2902
+ const encoderImports = new ImportMap();
2386
2903
  const defaultValues = optionalFields.map((f) => {
2387
2904
  const key = (0, import_nodes24.camelCase)(f.name);
2388
2905
  if (fieldDiscriminators.some((d) => d.name === f.name)) {
@@ -2390,59 +2907,101 @@ ${jsDocblock(structFieldDocs)}` : "";
2390
2907
  return f.defaultValueStrategy === "omitted" ? `${key}: ${constantName}` : `${key}: value.${key} ?? ${constantName}`;
2391
2908
  }
2392
2909
  const defaultValue = f.defaultValue;
2393
- const { render: renderedValue, imports } = (0, import_visitors_core20.visit)(defaultValue, self).value;
2394
- mergedManifest.encoder.mergeImportsWith(imports);
2910
+ const { content: renderedValue, imports } = (0, import_visitors_core30.visit)(defaultValue, self).value;
2911
+ encoderImports.mergeWith(imports);
2395
2912
  return f.defaultValueStrategy === "omitted" ? `${key}: ${renderedValue}` : `${key}: value.${key} ?? ${renderedValue}`;
2396
2913
  }).join(", ");
2397
- mergedManifest.encoder.mapRender((r) => `transformEncoder(${r}, (value) => ({ ...value, ${defaultValues} }))`).addImports("solanaCodecsCore", "transformEncoder");
2398
- 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
+ });
2399
2926
  },
2400
2927
  visitStructValue(node, { self }) {
2401
- return mergeManifests(
2402
- 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)),
2403
2930
  { mergeValues: (renders) => `{ ${renders.join(", ")} }` }
2404
2931
  );
2405
2932
  },
2406
2933
  visitTupleType(tupleType, { self }) {
2407
- const items = tupleType.items.map((item) => (0, import_visitors_core20.visit)(item, self));
2408
- const mergedManifest = mergeManifests(items, {
2934
+ const items = tupleType.items.map((item) => (0, import_visitors_core30.visit)(item, self));
2935
+ const mergedManifest = mergeTypeManifests(items, {
2409
2936
  mergeCodecs: (codecs) => `[${codecs.join(", ")}]`,
2410
2937
  mergeTypes: (types) => `readonly [${types.join(", ")}]`
2411
2938
  });
2412
- mergedManifest.encoder.mapRender((render2) => `getTupleEncoder(${render2})`).addImports("solanaCodecsDataStructures", "getTupleEncoder");
2413
- mergedManifest.decoder.mapRender((render2) => `getTupleDecoder(${render2})`).addImports("solanaCodecsDataStructures", "getTupleDecoder");
2414
- 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
+ });
2415
2952
  },
2416
2953
  visitTupleValue(node, { self }) {
2417
- return mergeManifests(
2418
- 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)),
2419
2956
  { mergeValues: (renders) => `[${renders.join(", ")}]` }
2420
2957
  );
2421
2958
  },
2422
2959
  visitZeroableOptionType(node, { self }) {
2423
- const childManifest = (0, import_visitors_core20.visit)(node.item, self);
2424
- childManifest.strictType.mapRender((r) => `Option<${r}>`).addImports("solanaOptions", "type Option");
2425
- childManifest.looseType.mapRender((r) => `OptionOrNullable<${r}>`).addImports("solanaOptions", "type OptionOrNullable");
2960
+ const childManifest = (0, import_visitors_core30.visit)(node.item, self);
2426
2961
  const encoderOptions = ["prefix: null"];
2427
2962
  const decoderOptions = ["prefix: null"];
2963
+ const encoderImports = new ImportMap();
2964
+ const decoderImports = new ImportMap();
2428
2965
  if (node.zeroValue) {
2429
- const zeroValueManifest = (0, import_visitors_core20.visit)(node.zeroValue, self);
2430
- childManifest.encoder.mergeImportsWith(zeroValueManifest.value);
2431
- childManifest.decoder.mergeImportsWith(zeroValueManifest.value);
2432
- encoderOptions.push(`noneValue: ${zeroValueManifest.value.render}`);
2433
- 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}`);
2434
2971
  } else {
2435
2972
  encoderOptions.push(`noneValue: "zeroes"`);
2436
2973
  decoderOptions.push(`noneValue: "zeroes"`);
2437
2974
  }
2438
2975
  const encoderOptionsAsString = encoderOptions.length > 0 ? `, { ${encoderOptions.join(", ")} }` : "";
2439
2976
  const decoderOptionsAsString = decoderOptions.length > 0 ? `, { ${decoderOptions.join(", ")} }` : "";
2440
- childManifest.encoder.mapRender((r) => `getOptionEncoder(${r + encoderOptionsAsString})`).addImports("solanaOptions", "getOptionEncoder");
2441
- childManifest.decoder.mapRender((r) => `getOptionDecoder(${r + decoderOptionsAsString})`).addImports("solanaOptions", "getOptionDecoder");
2442
- 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
+ });
2443
3002
  }
2444
3003
  }),
2445
- (visitor) => (0, import_visitors_core20.recordNodeStackVisitor)(visitor, stack)
3004
+ (visitor) => (0, import_visitors_core30.recordNodeStackVisitor)(visitor, stack)
2446
3005
  );
2447
3006
  }
2448
3007
  function getArrayLikeSizeOption(count, visitor) {
@@ -2462,10 +3021,11 @@ function getArrayLikeSizeOption(count, visitor) {
2462
3021
  if (prefix.format === "u32" && prefix.endian === "le") {
2463
3022
  return { decoder: fragment(""), encoder: fragment("") };
2464
3023
  }
2465
- const prefixManifest = (0, import_visitors_core20.visit)(count.prefix, visitor);
2466
- prefixManifest.encoder.mapRender((r) => `size: ${r}`);
2467
- prefixManifest.decoder.mapRender((r) => `size: ${r}`);
2468
- 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
+ };
2469
3029
  }
2470
3030
 
2471
3031
  // src/nameTransformers.ts
@@ -2534,8 +3094,8 @@ var DEFAULT_NAME_TRANSFORMERS = {
2534
3094
 
2535
3095
  // src/getRenderMapVisitor.ts
2536
3096
  function getRenderMapVisitor(options = {}) {
2537
- const linkables = new import_visitors_core21.LinkableDictionary();
2538
- const stack = new import_visitors_core21.NodeStack();
3097
+ const linkables = new import_visitors_core31.LinkableDictionary();
3098
+ const stack = new import_visitors_core31.NodeStack();
2539
3099
  const nameTransformers = {
2540
3100
  ...DEFAULT_NAME_TRANSFORMERS,
2541
3101
  ...options.nameTransformers
@@ -2559,8 +3119,8 @@ function getRenderMapVisitor(options = {}) {
2559
3119
  nonScalarEnums,
2560
3120
  stack
2561
3121
  });
2562
- const resolvedInstructionInputVisitor = (0, import_visitors_core21.getResolvedInstructionInputsVisitor)();
2563
- 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 });
2564
3124
  const globalScope = {
2565
3125
  asyncResolvers,
2566
3126
  customAccountData,
@@ -2573,23 +3133,23 @@ function getRenderMapVisitor(options = {}) {
2573
3133
  typeManifestVisitor
2574
3134
  };
2575
3135
  const render2 = (template, context, renderOptions) => {
2576
- return render((0, import_node_path3.join)("pages", template), context, renderOptions);
3136
+ return render((0, import_node_path2.join)("pages", template), context, renderOptions);
2577
3137
  };
2578
- return (0, import_visitors_core21.pipe)(
2579
- (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)(), {
2580
3140
  keys: ["rootNode", "programNode", "pdaNode", "accountNode", "definedTypeNode", "instructionNode"]
2581
3141
  }),
2582
- (v) => (0, import_visitors_core21.extendVisitor)(v, {
3142
+ (v) => (0, import_visitors_core31.extendVisitor)(v, {
2583
3143
  visitAccount(node) {
2584
3144
  const accountPath = stack.getPath("accountNode");
2585
- if (!(0, import_visitors_core21.findProgramNodeFromPath)(accountPath)) {
3145
+ if (!(0, import_visitors_core31.findProgramNodeFromPath)(accountPath)) {
2586
3146
  throw new Error("Account must be visited inside a program.");
2587
3147
  }
2588
3148
  const scope = {
2589
3149
  ...globalScope,
2590
3150
  accountPath,
2591
- size: (0, import_visitors_core21.visit)(node, byteSizeVisitor),
2592
- 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)
2593
3153
  };
2594
3154
  const fields = (0, import_nodes26.resolveNestedTypeNode)(node.data).fields;
2595
3155
  const accountDiscriminatorConstantsFragment = getDiscriminatorConstantsFragment({
@@ -2609,14 +3169,15 @@ function getRenderMapVisitor(options = {}) {
2609
3169
  accountSizeHelpersFragment,
2610
3170
  accountPdaHelpersFragment
2611
3171
  );
2612
- return new import_renderers_core.RenderMap().add(
3172
+ return (0, import_renderers_core13.addToRenderMap)(
3173
+ (0, import_renderers_core13.renderMap)(),
2613
3174
  `accounts/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2614
3175
  render2("accountsPage.njk", {
2615
- accountDiscriminatorConstantsFragment,
2616
- accountFetchHelpersFragment,
2617
- accountPdaHelpersFragment,
2618
- accountSizeHelpersFragment,
2619
- accountTypeFragment,
3176
+ accountDiscriminatorConstantsFragment: accountDiscriminatorConstantsFragment.content,
3177
+ accountFetchHelpersFragment: accountFetchHelpersFragment.content,
3178
+ accountPdaHelpersFragment: accountPdaHelpersFragment.content,
3179
+ accountSizeHelpersFragment: accountSizeHelpersFragment.content,
3180
+ accountTypeFragment: accountTypeFragment.content,
2620
3181
  imports: imports.toString(dependencyMap, useGranularImports)
2621
3182
  })
2622
3183
  );
@@ -2627,10 +3188,10 @@ function getRenderMapVisitor(options = {}) {
2627
3188
  codecDocs: [],
2628
3189
  decoderDocs: [],
2629
3190
  encoderDocs: [],
2630
- manifest: (0, import_visitors_core21.visit)(node, typeManifestVisitor),
3191
+ manifest: (0, import_visitors_core31.visit)(node, typeManifestVisitor),
2631
3192
  name: node.name,
2632
3193
  node: node.type,
2633
- size: (0, import_visitors_core21.visit)(node, byteSizeVisitor),
3194
+ size: (0, import_visitors_core31.visit)(node, byteSizeVisitor),
2634
3195
  typeDocs: node.docs,
2635
3196
  typeNode: node.type
2636
3197
  };
@@ -2643,28 +3204,26 @@ function getRenderMapVisitor(options = {}) {
2643
3204
  nameApi.decoderFunction(node.name),
2644
3205
  nameApi.codecFunction(node.name)
2645
3206
  ]);
2646
- return new import_renderers_core.RenderMap().add(
3207
+ return (0, import_renderers_core13.addToRenderMap)(
3208
+ (0, import_renderers_core13.renderMap)(),
2647
3209
  `types/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2648
3210
  render2("definedTypesPage.njk", {
2649
- imports: imports.toString({
2650
- ...dependencyMap,
2651
- generatedTypes: "."
2652
- }),
2653
- typeDiscriminatedUnionHelpersFragment,
2654
- typeWithCodecFragment
3211
+ imports: imports.toString({ ...dependencyMap, generatedTypes: "." }),
3212
+ typeDiscriminatedUnionHelpersFragment: typeDiscriminatedUnionHelpersFragment.content,
3213
+ typeWithCodecFragment: typeWithCodecFragment.content
2655
3214
  })
2656
3215
  );
2657
3216
  },
2658
3217
  visitInstruction(node) {
2659
3218
  const instructionPath = stack.getPath("instructionNode");
2660
- if (!(0, import_visitors_core21.findProgramNodeFromPath)(instructionPath)) {
3219
+ if (!(0, import_visitors_core31.findProgramNodeFromPath)(instructionPath)) {
2661
3220
  throw new Error("Instruction must be visited inside a program.");
2662
3221
  }
2663
3222
  const instructionExtraName = nameApi.instructionExtraType(node.name);
2664
3223
  const scope = {
2665
3224
  ...globalScope,
2666
- dataArgsManifest: (0, import_visitors_core21.visit)(node, typeManifestVisitor),
2667
- extraArgsManifest: (0, import_visitors_core21.visit)(
3225
+ dataArgsManifest: (0, import_visitors_core31.visit)(node, typeManifestVisitor),
3226
+ extraArgsManifest: (0, import_visitors_core31.visit)(
2668
3227
  (0, import_nodes26.definedTypeNode)({
2669
3228
  name: instructionExtraName,
2670
3229
  type: (0, import_nodes26.structTypeNodeFromInstructionArgumentNodes)(node.extraArguments ?? [])
@@ -2673,8 +3232,8 @@ function getRenderMapVisitor(options = {}) {
2673
3232
  ),
2674
3233
  instructionPath,
2675
3234
  renamedArgs: getRenamedArgsMap(node),
2676
- resolvedInputs: (0, import_visitors_core21.visit)(node, resolvedInstructionInputVisitor),
2677
- 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)
2678
3237
  };
2679
3238
  const instructionDiscriminatorConstantsFragment = getDiscriminatorConstantsFragment({
2680
3239
  ...scope,
@@ -2703,34 +3262,36 @@ function getRenderMapVisitor(options = {}) {
2703
3262
  instructionFunctionSyncFragment,
2704
3263
  instructionParseFunctionFragment
2705
3264
  );
2706
- return new import_renderers_core.RenderMap().add(
3265
+ return (0, import_renderers_core13.addToRenderMap)(
3266
+ (0, import_renderers_core13.renderMap)(),
2707
3267
  `instructions/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2708
3268
  render2("instructionsPage.njk", {
2709
3269
  imports: imports.toString(dependencyMap, useGranularImports),
2710
3270
  instruction: node,
2711
- instructionDataFragment,
2712
- instructionDiscriminatorConstantsFragment,
2713
- instructionExtraArgsFragment,
2714
- instructionFunctionAsyncFragment,
2715
- instructionFunctionSyncFragment,
2716
- instructionParseFunctionFragment,
2717
- 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
2718
3278
  })
2719
3279
  );
2720
3280
  },
2721
3281
  visitPda(node) {
2722
3282
  const pdaPath = stack.getPath("pdaNode");
2723
- if (!(0, import_visitors_core21.findProgramNodeFromPath)(pdaPath)) {
2724
- 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.");
2725
3285
  }
2726
3286
  const scope = { ...globalScope, pdaPath };
2727
3287
  const pdaFunctionFragment = getPdaFunctionFragment(scope);
2728
3288
  const imports = new ImportMap().mergeWith(pdaFunctionFragment);
2729
- return new import_renderers_core.RenderMap().add(
3289
+ return (0, import_renderers_core13.addToRenderMap)(
3290
+ (0, import_renderers_core13.renderMap)(),
2730
3291
  `pdas/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2731
3292
  render2("pdasPage.njk", {
2732
3293
  imports: imports.toString(dependencyMap, useGranularImports),
2733
- pdaFunctionFragment
3294
+ pdaFunctionFragment: pdaFunctionFragment.content
2734
3295
  })
2735
3296
  );
2736
3297
  },
@@ -2740,35 +3301,42 @@ function getRenderMapVisitor(options = {}) {
2740
3301
  ...getDefinedTypeNodesToExtract(node.instructions, customInstructionData)
2741
3302
  ];
2742
3303
  const scope = { ...globalScope, programNode: node };
2743
- 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
+ ]);
2744
3310
  if (node.errors.length > 0) {
2745
3311
  const programErrorsFragment = getProgramErrorsFragment(scope);
2746
- renderMap.add(
3312
+ renders = (0, import_renderers_core13.addToRenderMap)(
3313
+ renders,
2747
3314
  `errors/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2748
3315
  render2("errorsPage.njk", {
2749
3316
  imports: new ImportMap().mergeWith(programErrorsFragment).toString(dependencyMap, useGranularImports),
2750
- programErrorsFragment
3317
+ programErrorsFragment: programErrorsFragment.content
2751
3318
  })
2752
3319
  );
2753
3320
  }
2754
3321
  const programFragment = getProgramFragment(scope);
2755
3322
  const programAccountsFragment = getProgramAccountsFragment(scope);
2756
3323
  const programInstructionsFragment = getProgramInstructionsFragment(scope);
2757
- renderMap.add(
3324
+ renders = (0, import_renderers_core13.addToRenderMap)(
3325
+ renders,
2758
3326
  `programs/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2759
3327
  render2("programsPage.njk", {
2760
3328
  imports: new ImportMap().mergeWith(programFragment, programAccountsFragment, programInstructionsFragment).toString(dependencyMap, useGranularImports),
2761
- programAccountsFragment,
2762
- programFragment,
2763
- programInstructionsFragment
3329
+ programAccountsFragment: programAccountsFragment.content,
3330
+ programFragment: programFragment.content,
3331
+ programInstructionsFragment: programInstructionsFragment.content
2764
3332
  })
2765
3333
  );
2766
- renderMap.mergeWith(
3334
+ return (0, import_renderers_core13.mergeRenderMaps)([
3335
+ renders,
2767
3336
  ...(0, import_nodes26.getAllInstructionsWithSubs)(node, {
2768
3337
  leavesOnly: !renderParentInstructions
2769
- }).map((ix) => (0, import_visitors_core21.visit)(ix, self))
2770
- );
2771
- return renderMap;
3338
+ }).map((ix) => (0, import_visitors_core31.visit)(ix, self))
3339
+ ]);
2772
3340
  },
2773
3341
  visitRoot(node, { self }) {
2774
3342
  const isNotInternal = (n) => !internalNodes.includes(n.name);
@@ -2791,9 +3359,10 @@ function getRenderMapVisitor(options = {}) {
2791
3359
  programsWithErrorsToExport,
2792
3360
  root: node
2793
3361
  };
2794
- const map = new import_renderers_core.RenderMap();
3362
+ let renders = (0, import_renderers_core13.renderMap)();
2795
3363
  if (hasAnythingToExport) {
2796
- map.add(
3364
+ renders = (0, import_renderers_core13.addToRenderMap)(
3365
+ renders,
2797
3366
  "shared/index.ts",
2798
3367
  render2("sharedPage.njk", {
2799
3368
  ...ctx,
@@ -2814,28 +3383,36 @@ function getRenderMapVisitor(options = {}) {
2814
3383
  );
2815
3384
  }
2816
3385
  if (programsToExport.length > 0) {
2817
- map.add("programs/index.ts", render2("programsIndex.njk", ctx));
3386
+ renders = (0, import_renderers_core13.addToRenderMap)(renders, "programs/index.ts", render2("programsIndex.njk", ctx));
2818
3387
  }
2819
3388
  if (programsWithErrorsToExport.length > 0) {
2820
- map.add("errors/index.ts", render2("errorsIndex.njk", ctx));
3389
+ renders = (0, import_renderers_core13.addToRenderMap)(renders, "errors/index.ts", render2("errorsIndex.njk", ctx));
2821
3390
  }
2822
3391
  if (accountsToExport.length > 0) {
2823
- map.add("accounts/index.ts", render2("accountsIndex.njk", ctx));
3392
+ renders = (0, import_renderers_core13.addToRenderMap)(renders, "accounts/index.ts", render2("accountsIndex.njk", ctx));
2824
3393
  }
2825
3394
  if (pdasToExport.length > 0) {
2826
- map.add("pdas/index.ts", render2("pdasIndex.njk", ctx));
3395
+ renders = (0, import_renderers_core13.addToRenderMap)(renders, "pdas/index.ts", render2("pdasIndex.njk", ctx));
2827
3396
  }
2828
3397
  if (instructionsToExport.length > 0) {
2829
- 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
+ );
2830
3403
  }
2831
3404
  if (definedTypesToExport.length > 0) {
2832
- map.add("types/index.ts", render2("definedTypesIndex.njk", ctx));
3405
+ renders = (0, import_renderers_core13.addToRenderMap)(renders, "types/index.ts", render2("definedTypesIndex.njk", ctx));
2833
3406
  }
2834
- 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
+ );
2835
3412
  }
2836
3413
  }),
2837
- (v) => (0, import_visitors_core21.recordNodeStackVisitor)(v, stack),
2838
- (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)
2839
3416
  );
2840
3417
  }
2841
3418
  function getRenamedArgsMap(instruction) {
@@ -2857,8 +3434,8 @@ function getRenamedArgsMap(instruction) {
2857
3434
  }
2858
3435
 
2859
3436
  // src/renderVisitor.ts
2860
- var import_renderers_core2 = require("@codama/renderers-core");
2861
- 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");
2862
3439
  var estreePlugin = __toESM(require("prettier/plugins/estree"));
2863
3440
  var typeScriptPlugin = __toESM(require("prettier/plugins/typescript"));
2864
3441
  var import_standalone = require("prettier/standalone");
@@ -2874,16 +3451,16 @@ var DEFAULT_PRETTIER_OPTIONS = {
2874
3451
  useTabs: false
2875
3452
  };
2876
3453
  function renderVisitor(path, options = {}) {
2877
- return (0, import_visitors_core22.rootNodeVisitor)(async (root) => {
3454
+ return (0, import_visitors_core32.rootNodeVisitor)(async (root) => {
2878
3455
  if (options.deleteFolderBeforeRendering ?? true) {
2879
- (0, import_renderers_core2.deleteDirectory)(path);
3456
+ (0, import_renderers_core14.deleteDirectory)(path);
2880
3457
  }
2881
- const renderMap = (0, import_visitors_core22.visit)(root, getRenderMapVisitor(options));
3458
+ let renderMap2 = (0, import_visitors_core32.visit)(root, getRenderMapVisitor(options));
2882
3459
  if (options.formatCode ?? true) {
2883
3460
  const prettierOptions = { ...DEFAULT_PRETTIER_OPTIONS, ...options.prettierOptions };
2884
- 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));
2885
3462
  }
2886
- renderMap.write(path);
3463
+ (0, import_renderers_core14.writeRenderMap)(renderMap2, path);
2887
3464
  });
2888
3465
  }
2889
3466
  // Annotate the CommonJS export names for ESM import in node:
@@ -2893,7 +3470,7 @@ function renderVisitor(path, options = {}) {
2893
3470
  getNameApi,
2894
3471
  getRenderMapVisitor,
2895
3472
  getTypeManifestVisitor,
2896
- mergeManifests,
3473
+ mergeTypeManifests,
2897
3474
  renderVisitor,
2898
3475
  typeManifest
2899
3476
  });