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