@codama/renderers-js 1.3.4 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/LICENSE +1 -1
  2. package/dist/index.browser.cjs +3247 -0
  3. package/dist/index.browser.cjs.map +1 -0
  4. package/dist/index.browser.mjs +3300 -0
  5. package/dist/index.browser.mjs.map +1 -0
  6. package/dist/index.node.cjs +2081 -1718
  7. package/dist/index.node.cjs.map +1 -1
  8. package/dist/index.node.mjs +2015 -1657
  9. package/dist/index.node.mjs.map +1 -1
  10. package/dist/index.react-native.mjs +3300 -0
  11. package/dist/index.react-native.mjs.map +1 -0
  12. package/dist/types/fragments/accountFetchHelpers.d.ts +2 -4
  13. package/dist/types/fragments/accountFetchHelpers.d.ts.map +1 -1
  14. package/dist/types/fragments/accountPage.d.ts +8 -0
  15. package/dist/types/fragments/accountPage.d.ts.map +1 -0
  16. package/dist/types/fragments/accountPdaHelpers.d.ts +3 -5
  17. package/dist/types/fragments/accountPdaHelpers.d.ts.map +1 -1
  18. package/dist/types/fragments/accountSizeHelpers.d.ts +3 -4
  19. package/dist/types/fragments/accountSizeHelpers.d.ts.map +1 -1
  20. package/dist/types/fragments/accountType.d.ts +3 -5
  21. package/dist/types/fragments/accountType.d.ts.map +1 -1
  22. package/dist/types/fragments/discriminatorCondition.d.ts +2 -3
  23. package/dist/types/fragments/discriminatorCondition.d.ts.map +1 -1
  24. package/dist/types/fragments/discriminatorConstants.d.ts +5 -6
  25. package/dist/types/fragments/discriminatorConstants.d.ts.map +1 -1
  26. package/dist/types/fragments/errorPage.d.ts +6 -0
  27. package/dist/types/fragments/errorPage.d.ts.map +1 -0
  28. package/dist/types/fragments/index.d.ts +11 -4
  29. package/dist/types/fragments/index.d.ts.map +1 -1
  30. package/dist/types/fragments/indexPage.d.ts +6 -0
  31. package/dist/types/fragments/indexPage.d.ts.map +1 -0
  32. package/dist/types/fragments/instructionAccountMeta.d.ts +1 -1
  33. package/dist/types/fragments/instructionAccountMeta.d.ts.map +1 -1
  34. package/dist/types/fragments/instructionAccountTypeParam.d.ts +2 -3
  35. package/dist/types/fragments/instructionAccountTypeParam.d.ts.map +1 -1
  36. package/dist/types/fragments/instructionByteDelta.d.ts +3 -4
  37. package/dist/types/fragments/instructionByteDelta.d.ts.map +1 -1
  38. package/dist/types/fragments/instructionData.d.ts +3 -5
  39. package/dist/types/fragments/instructionData.d.ts.map +1 -1
  40. package/dist/types/fragments/instructionExtraArgs.d.ts +3 -5
  41. package/dist/types/fragments/instructionExtraArgs.d.ts.map +1 -1
  42. package/dist/types/fragments/instructionFunction.d.ts +3 -5
  43. package/dist/types/fragments/instructionFunction.d.ts.map +1 -1
  44. package/dist/types/fragments/instructionInputDefault.d.ts +2 -3
  45. package/dist/types/fragments/instructionInputDefault.d.ts.map +1 -1
  46. package/dist/types/fragments/instructionInputResolved.d.ts +2 -3
  47. package/dist/types/fragments/instructionInputResolved.d.ts.map +1 -1
  48. package/dist/types/fragments/instructionInputType.d.ts +2 -4
  49. package/dist/types/fragments/instructionInputType.d.ts.map +1 -1
  50. package/dist/types/fragments/instructionPage.d.ts +9 -0
  51. package/dist/types/fragments/instructionPage.d.ts.map +1 -0
  52. package/dist/types/fragments/instructionParseFunction.d.ts +2 -4
  53. package/dist/types/fragments/instructionParseFunction.d.ts.map +1 -1
  54. package/dist/types/fragments/instructionRemainingAccounts.d.ts +3 -4
  55. package/dist/types/fragments/instructionRemainingAccounts.d.ts.map +1 -1
  56. package/dist/types/fragments/instructionType.d.ts +2 -3
  57. package/dist/types/fragments/instructionType.d.ts.map +1 -1
  58. package/dist/types/fragments/pdaFunction.d.ts +2 -3
  59. package/dist/types/fragments/pdaFunction.d.ts.map +1 -1
  60. package/dist/types/fragments/pdaPage.d.ts +7 -0
  61. package/dist/types/fragments/pdaPage.d.ts.map +1 -0
  62. package/dist/types/fragments/programAccounts.d.ts +3 -4
  63. package/dist/types/fragments/programAccounts.d.ts.map +1 -1
  64. package/dist/types/fragments/programConstant.d.ts +6 -0
  65. package/dist/types/fragments/programConstant.d.ts.map +1 -0
  66. package/dist/types/fragments/programInstructions.d.ts +3 -4
  67. package/dist/types/fragments/programInstructions.d.ts.map +1 -1
  68. package/dist/types/fragments/programPage.d.ts +6 -0
  69. package/dist/types/fragments/programPage.d.ts.map +1 -0
  70. package/dist/types/fragments/rootIndexPage.d.ts +10 -0
  71. package/dist/types/fragments/rootIndexPage.d.ts.map +1 -0
  72. package/dist/types/fragments/sharedPage.d.ts +3 -0
  73. package/dist/types/fragments/sharedPage.d.ts.map +1 -0
  74. package/dist/types/fragments/type.d.ts +2 -4
  75. package/dist/types/fragments/type.d.ts.map +1 -1
  76. package/dist/types/fragments/typeCodec.d.ts +2 -4
  77. package/dist/types/fragments/typeCodec.d.ts.map +1 -1
  78. package/dist/types/fragments/typeDecoder.d.ts +2 -4
  79. package/dist/types/fragments/typeDecoder.d.ts.map +1 -1
  80. package/dist/types/fragments/typeDiscriminatedUnionHelpers.d.ts +3 -4
  81. package/dist/types/fragments/typeDiscriminatedUnionHelpers.d.ts.map +1 -1
  82. package/dist/types/fragments/typeEncoder.d.ts +2 -4
  83. package/dist/types/fragments/typeEncoder.d.ts.map +1 -1
  84. package/dist/types/fragments/typePage.d.ts +7 -0
  85. package/dist/types/fragments/typePage.d.ts.map +1 -0
  86. package/dist/types/fragments/typeWithCodec.d.ts +2 -4
  87. package/dist/types/fragments/typeWithCodec.d.ts.map +1 -1
  88. package/dist/types/index.d.ts +5 -7
  89. package/dist/types/index.d.ts.map +1 -1
  90. package/dist/types/utils/fragment.d.ts +24 -0
  91. package/dist/types/utils/fragment.d.ts.map +1 -0
  92. package/dist/types/utils/importMap.d.ts +17 -0
  93. package/dist/types/utils/importMap.d.ts.map +1 -0
  94. package/dist/types/utils/index.d.ts +5 -1
  95. package/dist/types/utils/index.d.ts.map +1 -1
  96. package/dist/types/utils/nameTransformers.d.ts.map +1 -0
  97. package/dist/types/utils/options.d.ts +40 -0
  98. package/dist/types/utils/options.d.ts.map +1 -0
  99. package/dist/types/{TypeManifest.d.ts → utils/typeManifest.d.ts} +6 -6
  100. package/dist/types/utils/typeManifest.d.ts.map +1 -0
  101. package/dist/types/visitors/getRenderMapVisitor.d.ts +3 -0
  102. package/dist/types/visitors/getRenderMapVisitor.d.ts.map +1 -0
  103. package/dist/types/visitors/getTypeManifestVisitor.d.ts +21 -0
  104. package/dist/types/visitors/getTypeManifestVisitor.d.ts.map +1 -0
  105. package/dist/types/visitors/index.d.ts +4 -0
  106. package/dist/types/visitors/index.d.ts.map +1 -0
  107. package/dist/types/visitors/renderVisitor.d.ts +3 -0
  108. package/dist/types/visitors/renderVisitor.d.ts.map +1 -0
  109. package/package.json +22 -13
  110. package/dist/templates/fragments/accountFetchHelpers.njk +0 -43
  111. package/dist/templates/fragments/accountPdaHelpers.njk +0 -25
  112. package/dist/templates/fragments/accountSizeHelpers.njk +0 -3
  113. package/dist/templates/fragments/instructionExtraArgs.njk +0 -4
  114. package/dist/templates/fragments/instructionFunction.njk +0 -62
  115. package/dist/templates/fragments/instructionInputType.njk +0 -16
  116. package/dist/templates/fragments/instructionParseFunction.njk +0 -81
  117. package/dist/templates/fragments/instructionType.njk +0 -18
  118. package/dist/templates/fragments/pdaFunction.njk +0 -33
  119. package/dist/templates/fragments/program.njk +0 -3
  120. package/dist/templates/fragments/programErrors.njk +0 -36
  121. package/dist/templates/fragments/type.njk +0 -12
  122. package/dist/templates/fragments/typeCodec.njk +0 -6
  123. package/dist/templates/fragments/typeDecoder.njk +0 -6
  124. package/dist/templates/fragments/typeDiscriminatedUnionHelpers.njk +0 -23
  125. package/dist/templates/fragments/typeEncoder.njk +0 -6
  126. package/dist/templates/layout.njk +0 -9
  127. package/dist/templates/macros.njk +0 -12
  128. package/dist/templates/pages/accountsIndex.njk +0 -9
  129. package/dist/templates/pages/accountsPage.njk +0 -12
  130. package/dist/templates/pages/definedTypesIndex.njk +0 -9
  131. package/dist/templates/pages/definedTypesPage.njk +0 -9
  132. package/dist/templates/pages/errorsIndex.njk +0 -9
  133. package/dist/templates/pages/errorsPage.njk +0 -8
  134. package/dist/templates/pages/instructionsIndex.njk +0 -9
  135. package/dist/templates/pages/instructionsPage.njk +0 -14
  136. package/dist/templates/pages/pdasIndex.njk +0 -9
  137. package/dist/templates/pages/pdasPage.njk +0 -8
  138. package/dist/templates/pages/programsIndex.njk +0 -9
  139. package/dist/templates/pages/programsPage.njk +0 -10
  140. package/dist/templates/pages/rootIndex.njk +0 -26
  141. package/dist/templates/pages/sharedPage.njk +0 -106
  142. package/dist/types/ImportMap.d.ts +0 -15
  143. package/dist/types/ImportMap.d.ts.map +0 -1
  144. package/dist/types/TypeManifest.d.ts.map +0 -1
  145. package/dist/types/fragments/common.d.ts +0 -25
  146. package/dist/types/fragments/common.d.ts.map +0 -1
  147. package/dist/types/fragments/program.d.ts +0 -7
  148. package/dist/types/fragments/program.d.ts.map +0 -1
  149. package/dist/types/fragments/programErrors.d.ts +0 -7
  150. package/dist/types/fragments/programErrors.d.ts.map +0 -1
  151. package/dist/types/getRenderMapVisitor.d.ts +0 -31
  152. package/dist/types/getRenderMapVisitor.d.ts.map +0 -1
  153. package/dist/types/getTypeManifestVisitor.d.ts +0 -16
  154. package/dist/types/getTypeManifestVisitor.d.ts.map +0 -1
  155. package/dist/types/nameTransformers.d.ts.map +0 -1
  156. package/dist/types/renderVisitor.d.ts +0 -11
  157. package/dist/types/renderVisitor.d.ts.map +0 -1
  158. package/dist/types/utils/render.d.ts +0 -4
  159. package/dist/types/utils/render.d.ts.map +0 -1
  160. /package/dist/types/{nameTransformers.d.ts → utils/nameTransformers.d.ts} +0 -0
@@ -31,18 +31,23 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  DEFAULT_NAME_TRANSFORMERS: () => DEFAULT_NAME_TRANSFORMERS,
34
- ImportMap: () => ImportMap,
34
+ addToImportMap: () => addToImportMap,
35
+ createImportMap: () => createImportMap,
35
36
  default: () => renderVisitor,
36
37
  getNameApi: () => getNameApi,
37
38
  getRenderMapVisitor: () => getRenderMapVisitor,
38
39
  getTypeManifestVisitor: () => getTypeManifestVisitor,
39
- mergeManifests: () => mergeManifests,
40
+ importMapToString: () => importMapToString,
41
+ mergeImportMaps: () => mergeImportMaps,
42
+ mergeTypeManifests: () => mergeTypeManifests,
43
+ parseImportInput: () => parseImportInput,
44
+ removeFromImportMap: () => removeFromImportMap,
40
45
  renderVisitor: () => renderVisitor,
41
46
  typeManifest: () => typeManifest
42
47
  });
43
48
  module.exports = __toCommonJS(index_exports);
44
49
 
45
- // src/ImportMap.ts
50
+ // src/utils/importMap.ts
46
51
  var DEFAULT_EXTERNAL_MODULE_MAP = {
47
52
  solanaAccounts: "@solana/kit",
48
53
  solanaAddresses: "@solana/kit",
@@ -84,112 +89,247 @@ var DEFAULT_INTERNAL_MODULE_MAP = {
84
89
  shared: "../shared",
85
90
  types: "../types"
86
91
  };
87
- var ImportMap = class {
88
- _imports = /* @__PURE__ */ new Map();
89
- _aliases = /* @__PURE__ */ new Map();
90
- add(module2, imports) {
91
- const newImports = new Set(typeof imports === "string" ? [imports] : imports);
92
- if (newImports.size === 0) return this;
93
- const currentImports = this._imports.get(module2) ?? /* @__PURE__ */ new Set();
94
- newImports.forEach((i) => currentImports.add(i));
95
- this._imports.set(module2, currentImports);
96
- return this;
97
- }
98
- remove(module2, imports) {
99
- const importsToRemove = new Set(typeof imports === "string" ? [imports] : imports);
100
- if (importsToRemove.size === 0) return this;
101
- const currentImports = this._imports.get(module2) ?? /* @__PURE__ */ new Set();
102
- importsToRemove.forEach((i) => currentImports.delete(i));
103
- if (currentImports.size === 0) {
104
- this._imports.delete(module2);
105
- } else {
106
- this._imports.set(module2, currentImports);
107
- }
108
- return this;
109
- }
110
- mergeWith(...others) {
111
- others.forEach((rawOther) => {
112
- const other = "imports" in rawOther ? rawOther.imports : rawOther;
113
- other._imports.forEach((imports, module2) => {
114
- this.add(module2, imports);
115
- });
116
- other._aliases.forEach((aliases, module2) => {
117
- Object.entries(aliases).forEach(([name, alias]) => {
118
- this.addAlias(module2, name, alias);
119
- });
120
- });
121
- });
122
- return this;
123
- }
124
- mergeWithManifest(manifest) {
125
- return this.mergeWith(manifest.strictType, manifest.looseType, manifest.encoder, manifest.decoder);
126
- }
127
- addAlias(module2, name, alias) {
128
- const currentAliases = this._aliases.get(module2) ?? {};
129
- currentAliases[name] = alias;
130
- this._aliases.set(module2, currentAliases);
131
- return this;
132
- }
133
- isEmpty() {
134
- return this._imports.size === 0;
135
- }
136
- resolve(dependencies = {}, useGranularImports = false) {
137
- const aliasedMap = new Map(
138
- [...this._imports.entries()].map(([module2, imports]) => {
139
- const aliasMap = this._aliases.get(module2) ?? {};
140
- const joinedImports = [...imports].map((i) => aliasMap[i] ? `${i} as ${aliasMap[i]}` : i);
141
- return [module2, new Set(joinedImports)];
142
- })
143
- );
144
- const dependencyMap = {
145
- ...useGranularImports ? DEFAULT_GRANULAR_EXTERNAL_MODULE_MAP : DEFAULT_EXTERNAL_MODULE_MAP,
146
- ...DEFAULT_INTERNAL_MODULE_MAP,
147
- ...dependencies
148
- };
149
- const resolvedMap = /* @__PURE__ */ new Map();
150
- aliasedMap.forEach((imports, module2) => {
151
- const resolvedModule = dependencyMap[module2] ?? module2;
152
- const currentImports = resolvedMap.get(resolvedModule) ?? /* @__PURE__ */ new Set();
153
- imports.forEach((i) => currentImports.add(i));
154
- resolvedMap.set(resolvedModule, currentImports);
155
- });
156
- return resolvedMap;
157
- }
158
- toString(dependencies = {}, useGranularImports = false) {
159
- return [...this.resolve(dependencies, useGranularImports).entries()].sort(([a], [b]) => {
160
- const aIsRelative = a.startsWith(".");
161
- const bIsRelative = b.startsWith(".");
162
- if (aIsRelative && !bIsRelative) return 1;
163
- if (!aIsRelative && bIsRelative) return -1;
164
- return a.localeCompare(b);
165
- }).map(([module2, imports]) => {
166
- const joinedImports = [...imports].sort().filter((i) => {
167
- const name = i.split(" ");
168
- if (name.length > 1) {
169
- return !imports.has(name[1]);
92
+ function createImportMap() {
93
+ return Object.freeze(/* @__PURE__ */ new Map());
94
+ }
95
+ function parseImportInput(input) {
96
+ const matches = input.match(/^(type )?([^ ]+)(?: as (.+))?$/);
97
+ if (!matches) return Object.freeze({ importedIdentifier: input, isType: false, usedIdentifier: input });
98
+ const [_, isType, name, alias] = matches;
99
+ return Object.freeze({
100
+ importedIdentifier: name,
101
+ isType: !!isType,
102
+ usedIdentifier: alias ?? name
103
+ });
104
+ }
105
+ function addToImportMap(importMap, module2, imports) {
106
+ const parsedImports = imports.map(parseImportInput).map((i) => [i.usedIdentifier, i]);
107
+ return mergeImportMaps([importMap, /* @__PURE__ */ new Map([[module2, new Map(parsedImports)]])]);
108
+ }
109
+ function removeFromImportMap(importMap, module2, usedIdentifiers) {
110
+ const newMap = new Map(importMap);
111
+ const newModuleMap = new Map(newMap.get(module2));
112
+ usedIdentifiers.forEach((usedIdentifier) => {
113
+ newModuleMap.delete(usedIdentifier);
114
+ });
115
+ if (newModuleMap.size === 0) {
116
+ newMap.delete(module2);
117
+ } else {
118
+ newMap.set(module2, newModuleMap);
119
+ }
120
+ return Object.freeze(newMap);
121
+ }
122
+ function mergeImportMaps(importMaps) {
123
+ if (importMaps.length === 0) return createImportMap();
124
+ if (importMaps.length === 1) return importMaps[0];
125
+ const mergedMap = new Map(importMaps[0]);
126
+ for (const map of importMaps.slice(1)) {
127
+ for (const [module2, imports] of map) {
128
+ const mergedModuleMap = mergedMap.get(module2) ?? /* @__PURE__ */ new Map();
129
+ for (const [usedIdentifier, importInfo] of imports) {
130
+ const existingImportInfo = mergedModuleMap.get(usedIdentifier);
131
+ const shouldOverwriteTypeOnly = existingImportInfo && existingImportInfo.importedIdentifier === importInfo.importedIdentifier && existingImportInfo.isType && !importInfo.isType;
132
+ if (!existingImportInfo || shouldOverwriteTypeOnly) {
133
+ mergedModuleMap.set(usedIdentifier, importInfo);
170
134
  }
171
- return true;
172
- }).join(", ");
173
- return `import { ${joinedImports} } from '${module2}';`;
174
- }).join("\n");
135
+ }
136
+ mergedMap.set(module2, mergedModuleMap);
137
+ }
175
138
  }
139
+ return Object.freeze(mergedMap);
140
+ }
141
+ function importMapToString(importMap, dependencyMap = {}, useGranularImports = false) {
142
+ const resolvedMap = resolveImportMapModules(importMap, dependencyMap, useGranularImports);
143
+ return [...resolvedMap.entries()].sort(([a], [b]) => {
144
+ const relative = Number(a.startsWith(".")) - Number(b.startsWith("."));
145
+ if (relative !== 0) return relative;
146
+ return a.localeCompare(b);
147
+ }).map(([module2, imports]) => {
148
+ const innerImports = [...imports.values()].map(importInfoToString).sort((a, b) => a.localeCompare(b)).join(", ");
149
+ return `import { ${innerImports} } from '${module2}';`;
150
+ }).join("\n");
151
+ }
152
+ function resolveImportMapModules(importMap, dependencyMap, useGranularImports) {
153
+ const dependencyMapWithDefaults = {
154
+ ...useGranularImports ? DEFAULT_GRANULAR_EXTERNAL_MODULE_MAP : DEFAULT_EXTERNAL_MODULE_MAP,
155
+ ...DEFAULT_INTERNAL_MODULE_MAP,
156
+ ...dependencyMap
157
+ };
158
+ return mergeImportMaps(
159
+ [...importMap.entries()].map(([module2, imports]) => {
160
+ const resolvedModule = dependencyMapWithDefaults[module2] ?? module2;
161
+ return /* @__PURE__ */ new Map([[resolvedModule, imports]]);
162
+ })
163
+ );
164
+ }
165
+ function importInfoToString({ importedIdentifier, isType, usedIdentifier }) {
166
+ const alias = importedIdentifier !== usedIdentifier ? ` as ${usedIdentifier}` : "";
167
+ return `${isType ? "type " : ""}${importedIdentifier}${alias}`;
168
+ }
169
+
170
+ // src/utils/nameTransformers.ts
171
+ var import_nodes = require("@codama/nodes");
172
+ function getNameApi(transformers) {
173
+ const helpers = {
174
+ camelCase: import_nodes.camelCase,
175
+ capitalize: import_nodes.capitalize,
176
+ kebabCase: import_nodes.kebabCase,
177
+ pascalCase: import_nodes.pascalCase,
178
+ snakeCase: import_nodes.snakeCase,
179
+ titleCase: import_nodes.titleCase
180
+ };
181
+ return Object.fromEntries(
182
+ Object.entries(transformers).map(([key, transformer]) => [key, (name) => transformer(name, helpers)])
183
+ );
184
+ }
185
+ var DEFAULT_NAME_TRANSFORMERS = {
186
+ accountDecodeFunction: (name) => `decode${(0, import_nodes.pascalCase)(name)}`,
187
+ accountFetchAllFunction: (name) => `fetchAll${(0, import_nodes.pascalCase)(name)}`,
188
+ accountFetchAllMaybeFunction: (name) => `fetchAllMaybe${(0, import_nodes.pascalCase)(name)}`,
189
+ accountFetchFromSeedsFunction: (name) => `fetch${(0, import_nodes.pascalCase)(name)}FromSeeds`,
190
+ accountFetchFunction: (name) => `fetch${(0, import_nodes.pascalCase)(name)}`,
191
+ accountFetchMaybeFromSeedsFunction: (name) => `fetchMaybe${(0, import_nodes.pascalCase)(name)}FromSeeds`,
192
+ accountFetchMaybeFunction: (name) => `fetchMaybe${(0, import_nodes.pascalCase)(name)}`,
193
+ accountGetSizeFunction: (name) => `get${(0, import_nodes.pascalCase)(name)}Size`,
194
+ codecFunction: (name) => `get${(0, import_nodes.pascalCase)(name)}Codec`,
195
+ constant: (name) => (0, import_nodes.snakeCase)(name).toUpperCase(),
196
+ constantFunction: (name) => `get${(0, import_nodes.pascalCase)(name)}Bytes`,
197
+ dataArgsType: (name) => `${(0, import_nodes.pascalCase)(name)}Args`,
198
+ dataType: (name) => `${(0, import_nodes.pascalCase)(name)}`,
199
+ decoderFunction: (name) => `get${(0, import_nodes.pascalCase)(name)}Decoder`,
200
+ discriminatedUnionDiscriminator: () => "__kind",
201
+ discriminatedUnionFunction: (name) => `${(0, import_nodes.camelCase)(name)}`,
202
+ discriminatedUnionVariant: (name) => `${(0, import_nodes.pascalCase)(name)}`,
203
+ encoderFunction: (name) => `get${(0, import_nodes.pascalCase)(name)}Encoder`,
204
+ enumVariant: (name) => `${(0, import_nodes.pascalCase)(name)}`,
205
+ instructionAsyncFunction: (name) => `get${(0, import_nodes.pascalCase)(name)}InstructionAsync`,
206
+ instructionAsyncInputType: (name) => `${(0, import_nodes.pascalCase)(name)}AsyncInput`,
207
+ instructionDataType: (name) => `${(0, import_nodes.pascalCase)(name)}InstructionData`,
208
+ instructionExtraType: (name) => `${(0, import_nodes.pascalCase)(name)}InstructionExtra`,
209
+ instructionParseFunction: (name) => `parse${(0, import_nodes.pascalCase)(name)}Instruction`,
210
+ instructionParsedType: (name) => `Parsed${(0, import_nodes.pascalCase)(name)}Instruction`,
211
+ instructionSyncFunction: (name) => `get${(0, import_nodes.pascalCase)(name)}Instruction`,
212
+ instructionSyncInputType: (name) => `${(0, import_nodes.pascalCase)(name)}Input`,
213
+ instructionType: (name) => `${(0, import_nodes.pascalCase)(name)}Instruction`,
214
+ isDiscriminatedUnionFunction: (name) => `is${(0, import_nodes.pascalCase)(name)}`,
215
+ pdaFindFunction: (name) => `find${(0, import_nodes.pascalCase)(name)}Pda`,
216
+ pdaSeedsType: (name) => `${(0, import_nodes.pascalCase)(name)}Seeds`,
217
+ programAccountsEnum: (name) => `${(0, import_nodes.pascalCase)(name)}Account`,
218
+ programAccountsEnumVariant: (name) => `${(0, import_nodes.pascalCase)(name)}`,
219
+ programAccountsIdentifierFunction: (name) => `identify${(0, import_nodes.pascalCase)(name)}Account`,
220
+ programAddressConstant: (name) => `${(0, import_nodes.snakeCase)(name).toUpperCase()}_PROGRAM_ADDRESS`,
221
+ programErrorConstant: (name) => (0, import_nodes.snakeCase)(name).toUpperCase(),
222
+ programErrorConstantPrefix: (name) => `${(0, import_nodes.snakeCase)(name).toUpperCase()}_ERROR__`,
223
+ programErrorMessagesMap: (name) => `${(0, import_nodes.camelCase)(name)}ErrorMessages`,
224
+ programErrorUnion: (name) => `${(0, import_nodes.pascalCase)(name)}Error`,
225
+ programGetErrorMessageFunction: (name) => `get${(0, import_nodes.pascalCase)(name)}ErrorMessage`,
226
+ programInstructionsEnum: (name) => `${(0, import_nodes.pascalCase)(name)}Instruction`,
227
+ programInstructionsEnumVariant: (name) => `${(0, import_nodes.pascalCase)(name)}`,
228
+ programInstructionsIdentifierFunction: (name) => `identify${(0, import_nodes.pascalCase)(name)}Instruction`,
229
+ programInstructionsParsedUnionType: (name) => `Parsed${(0, import_nodes.pascalCase)(name)}Instruction`,
230
+ programIsErrorFunction: (name) => `is${(0, import_nodes.pascalCase)(name)}Error`,
231
+ resolverFunction: (name) => `${(0, import_nodes.camelCase)(name)}`
176
232
  };
177
233
 
234
+ // src/utils/fragment.ts
235
+ var import_renderers_core = require("@codama/renderers-core");
236
+ function createFragment(content) {
237
+ return Object.freeze({ content, features: /* @__PURE__ */ new Set(), imports: createImportMap() });
238
+ }
239
+ function isFragment(value) {
240
+ return typeof value === "object" && value !== null && "content" in value;
241
+ }
242
+ function fragment(template, ...items) {
243
+ return (0, import_renderers_core.createFragmentTemplate)(template, items, isFragment, mergeFragments);
244
+ }
245
+ function mergeFragments(fragments, mergeContent) {
246
+ const filteredFragments = fragments.filter((f) => f !== void 0);
247
+ return Object.freeze({
248
+ content: mergeContent(filteredFragments.map((fragment2) => fragment2.content)),
249
+ features: new Set(filteredFragments.flatMap((f) => [...f.features])),
250
+ imports: mergeImportMaps(filteredFragments.map((f) => f.imports))
251
+ });
252
+ }
253
+ function use(importInput, module2) {
254
+ const importInfo = parseImportInput(importInput);
255
+ return addFragmentImports(createFragment(importInfo.usedIdentifier), module2, [importInput]);
256
+ }
257
+ function mergeFragmentImports(fragment2, importMaps) {
258
+ return Object.freeze({ ...fragment2, imports: mergeImportMaps([fragment2.imports, ...importMaps]) });
259
+ }
260
+ function addFragmentImports(fragment2, module2, importInputs) {
261
+ return Object.freeze({ ...fragment2, imports: addToImportMap(fragment2.imports, module2, importInputs) });
262
+ }
263
+ function removeFragmentImports(fragment2, module2, usedIdentifiers) {
264
+ return Object.freeze({ ...fragment2, imports: removeFromImportMap(fragment2.imports, module2, usedIdentifiers) });
265
+ }
266
+ function addFragmentFeatures(fragment2, features) {
267
+ return Object.freeze({ ...fragment2, features: /* @__PURE__ */ new Set([...fragment2.features, ...features]) });
268
+ }
269
+ function getExportAllFragment(module2) {
270
+ return fragment`export * from '${module2}';`;
271
+ }
272
+ function getDocblockFragment(lines, withLineJump = false) {
273
+ const lineJump = withLineJump ? "\n" : "";
274
+ if (lines.length === 0) return;
275
+ if (lines.length === 1) return fragment`/** ${lines[0]} */${lineJump}`;
276
+ const prefixedLines = lines.map((line) => line ? ` * ${line}` : " *");
277
+ return fragment`/**\n${prefixedLines.join("\n")}\n */${lineJump}`;
278
+ }
279
+ function getPageFragment(page, scope) {
280
+ const header = getDocblockFragment([
281
+ "This code was AUTOGENERATED using the Codama library.",
282
+ "Please DO NOT EDIT THIS FILE, instead use visitors",
283
+ "to add features, then rerun Codama to update it.",
284
+ "",
285
+ "@see https://github.com/codama-idl/codama"
286
+ ]);
287
+ const imports = page.imports.size === 0 ? void 0 : fragment`${importMapToString(page.imports, scope.dependencyMap, scope.useGranularImports)}`;
288
+ return mergeFragments([header, imports, page], (cs) => cs.join("\n\n"));
289
+ }
290
+
291
+ // src/utils/typeManifest.ts
292
+ function typeManifest(input = {}) {
293
+ return Object.freeze({
294
+ decoder: fragment``,
295
+ encoder: fragment``,
296
+ isEnum: false,
297
+ looseType: fragment``,
298
+ strictType: fragment``,
299
+ value: fragment``,
300
+ ...input
301
+ });
302
+ }
303
+ function mergeTypeManifests(manifests, options = {}) {
304
+ const { mergeTypes, mergeCodecs, mergeValues } = options;
305
+ const merge = (fragmentFn, mergeFn) => mergeFn ? mergeFragments(manifests.map(fragmentFn), mergeFn) : fragment``;
306
+ return Object.freeze({
307
+ decoder: merge((m) => m.decoder, mergeCodecs),
308
+ encoder: merge((m) => m.encoder, mergeCodecs),
309
+ isEnum: false,
310
+ looseType: merge((m) => m.looseType, mergeTypes),
311
+ strictType: merge((m) => m.strictType, mergeTypes),
312
+ value: merge((m) => m.value, mergeValues)
313
+ });
314
+ }
315
+
316
+ // src/visitors/getRenderMapVisitor.ts
317
+ var import_nodes28 = require("@codama/nodes");
318
+ var import_renderers_core13 = require("@codama/renderers-core");
319
+ var import_visitors_core29 = require("@codama/visitors-core");
320
+
178
321
  // src/fragments/accountFetchHelpers.ts
179
322
  var import_visitors_core2 = require("@codama/visitors-core");
180
323
 
181
- // src/fragments/common.ts
182
- var import_node_path2 = require("path");
183
-
184
324
  // src/utils/async.ts
185
- var import_nodes = require("@codama/nodes");
325
+ var import_nodes2 = require("@codama/nodes");
186
326
  var import_visitors_core = require("@codama/visitors-core");
187
327
  function hasAsyncFunction(instructionNode, resolvedInputs, asyncResolvers) {
188
328
  const hasByteDeltasAsync = (instructionNode.byteDeltas ?? []).some(
189
- ({ value }) => (0, import_nodes.isNode)(value, "resolverValueNode") && asyncResolvers.includes(value.name)
329
+ ({ value }) => (0, import_nodes2.isNode)(value, "resolverValueNode") && asyncResolvers.includes(value.name)
190
330
  );
191
331
  const hasRemainingAccountsAsync = (instructionNode.remainingAccounts ?? []).some(
192
- ({ value }) => (0, import_nodes.isNode)(value, "resolverValueNode") && asyncResolvers.includes(value.name)
332
+ ({ value }) => (0, import_nodes2.isNode)(value, "resolverValueNode") && asyncResolvers.includes(value.name)
193
333
  );
194
334
  return hasAsyncDefaultValues(resolvedInputs, asyncResolvers) || hasByteDeltasAsync || hasRemainingAccountsAsync;
195
335
  }
@@ -211,7 +351,7 @@ function isAsyncDefaultValue(defaultValue, asyncResolvers) {
211
351
  }
212
352
  }
213
353
  function getInstructionDependencies(input, asyncResolvers, useAsync) {
214
- if ((0, import_nodes.isNode)(input, "instructionNode")) {
354
+ if ((0, import_nodes2.isNode)(input, "instructionNode")) {
215
355
  return (0, import_visitors_core.deduplicateInstructionDependencies)([
216
356
  ...input.accounts.flatMap((x) => getInstructionDependencies(x, asyncResolvers, useAsync)),
217
357
  ...input.arguments.flatMap((x) => getInstructionDependencies(x, asyncResolvers, useAsync)),
@@ -223,28 +363,28 @@ function getInstructionDependencies(input, asyncResolvers, useAsync) {
223
363
  if (!defaultValue) return [];
224
364
  return getInstructionDependencies({ ...input, defaultValue }, asyncResolvers, useAsync);
225
365
  };
226
- if ((0, import_nodes.isNode)(input.defaultValue, ["accountValueNode", "accountBumpValueNode"])) {
227
- return [(0, import_nodes.accountValueNode)(input.defaultValue.name)];
366
+ if ((0, import_nodes2.isNode)(input.defaultValue, ["accountValueNode", "accountBumpValueNode"])) {
367
+ return [(0, import_nodes2.accountValueNode)(input.defaultValue.name)];
228
368
  }
229
- if ((0, import_nodes.isNode)(input.defaultValue, ["argumentValueNode"])) {
230
- return [(0, import_nodes.argumentValueNode)(input.defaultValue.name)];
369
+ if ((0, import_nodes2.isNode)(input.defaultValue, ["argumentValueNode"])) {
370
+ return [(0, import_nodes2.argumentValueNode)(input.defaultValue.name)];
231
371
  }
232
- if ((0, import_nodes.isNode)(input.defaultValue, "pdaValueNode")) {
372
+ if ((0, import_nodes2.isNode)(input.defaultValue, "pdaValueNode")) {
233
373
  const dependencies = /* @__PURE__ */ new Map();
234
374
  input.defaultValue.seeds.forEach((seed) => {
235
- if ((0, import_nodes.isNode)(seed.value, ["accountValueNode", "argumentValueNode"])) {
375
+ if ((0, import_nodes2.isNode)(seed.value, ["accountValueNode", "argumentValueNode"])) {
236
376
  dependencies.set(seed.value.name, { ...seed.value });
237
377
  }
238
378
  });
239
379
  return [...dependencies.values()];
240
380
  }
241
- if ((0, import_nodes.isNode)(input.defaultValue, "resolverValueNode")) {
381
+ if ((0, import_nodes2.isNode)(input.defaultValue, "resolverValueNode")) {
242
382
  const isSynchronousResolver = !asyncResolvers.includes(input.defaultValue.name);
243
383
  if (useAsync || isSynchronousResolver) {
244
384
  return input.defaultValue.dependsOn ?? [];
245
385
  }
246
386
  }
247
- if ((0, import_nodes.isNode)(input.defaultValue, "conditionalValueNode")) {
387
+ if ((0, import_nodes2.isNode)(input.defaultValue, "conditionalValueNode")) {
248
388
  return (0, import_visitors_core.deduplicateInstructionDependencies)([
249
389
  ...getNestedDependencies(input.defaultValue.condition),
250
390
  ...getNestedDependencies(input.defaultValue.ifTrue),
@@ -271,20 +411,20 @@ function getBytesFromBytesValueNode(node) {
271
411
  }
272
412
 
273
413
  // src/utils/customData.ts
274
- var import_nodes2 = require("@codama/nodes");
414
+ var import_nodes3 = require("@codama/nodes");
275
415
  var parseCustomDataOptions = (customDataOptions, defaultSuffix) => new Map(
276
416
  customDataOptions.map((o) => {
277
417
  const options = typeof o === "string" ? { name: o } : o;
278
- const importAs = (0, import_nodes2.camelCase)(options.importAs ?? `${options.name}${defaultSuffix}`);
418
+ const importAs = (0, import_nodes3.camelCase)(options.importAs ?? `${options.name}${defaultSuffix}`);
279
419
  const importFrom = options.importFrom ?? "hooked";
280
420
  return [
281
- (0, import_nodes2.camelCase)(options.name),
421
+ (0, import_nodes3.camelCase)(options.name),
282
422
  {
283
423
  extract: options.extract ?? false,
284
- extractAs: options.extractAs ? (0, import_nodes2.camelCase)(options.extractAs) : importAs,
424
+ extractAs: options.extractAs ? (0, import_nodes3.camelCase)(options.extractAs) : importAs,
285
425
  importAs,
286
426
  importFrom,
287
- linkNode: (0, import_nodes2.definedTypeLinkNode)(importAs)
427
+ linkNode: (0, import_nodes3.definedTypeLinkNode)(importAs)
288
428
  }
289
429
  ];
290
430
  })
@@ -292,13 +432,13 @@ var parseCustomDataOptions = (customDataOptions, defaultSuffix) => new Map(
292
432
  var getDefinedTypeNodesToExtract = (nodes, parsedCustomDataOptions) => nodes.flatMap((node) => {
293
433
  const options = parsedCustomDataOptions.get(node.name);
294
434
  if (!options || !options.extract) return [];
295
- if ((0, import_nodes2.isNode)(node, "accountNode")) {
296
- return [(0, import_nodes2.definedTypeNode)({ name: options.extractAs, type: { ...node.data } })];
435
+ if ((0, import_nodes3.isNode)(node, "accountNode")) {
436
+ return [(0, import_nodes3.definedTypeNode)({ name: options.extractAs, type: { ...node.data } })];
297
437
  }
298
438
  return [
299
- (0, import_nodes2.definedTypeNode)({
439
+ (0, import_nodes3.definedTypeNode)({
300
440
  name: options.extractAs,
301
- type: (0, import_nodes2.structTypeNodeFromInstructionArgumentNodes)(node.arguments)
441
+ type: (0, import_nodes3.structTypeNodeFromInstructionArgumentNodes)(node.arguments)
302
442
  })
303
443
  ];
304
444
  });
@@ -352,169 +492,128 @@ function getImportFromFactory(overrides, customAccountData, customInstructionDat
352
492
  };
353
493
  }
354
494
 
355
- // src/utils/render.ts
356
- var import_node_path = require("path");
357
- var import_node_url = require("url");
358
- var import_nodes3 = require("@codama/nodes");
359
- var import_nunjucks = __toESM(require("nunjucks"));
360
- function jsDocblock(docs) {
361
- if (docs.length <= 0) return "";
362
- if (docs.length === 1) return `/** ${docs[0]} */
363
- `;
364
- const lines = docs.map((doc) => ` * ${doc}`);
365
- return `/**
366
- ${lines.join("\n")}
367
- */
368
- `;
495
+ // src/fragments/accountFetchHelpers.ts
496
+ function getAccountFetchHelpersFragment(scope) {
497
+ const { accountPath, typeManifest: typeManifest2, nameApi, customAccountData } = scope;
498
+ const accountNode = (0, import_visitors_core2.getLastNodeFromPath)(accountPath);
499
+ const decodeFunction = nameApi.accountDecodeFunction(accountNode.name);
500
+ const fetchAllFunction = nameApi.accountFetchAllFunction(accountNode.name);
501
+ const fetchAllMaybeFunction = nameApi.accountFetchAllMaybeFunction(accountNode.name);
502
+ const fetchFunction = nameApi.accountFetchFunction(accountNode.name);
503
+ const fetchMaybeFunction = nameApi.accountFetchMaybeFunction(accountNode.name);
504
+ const hasCustomData = customAccountData.has(accountNode.name);
505
+ const accountType = hasCustomData ? typeManifest2.strictType : nameApi.dataType(accountNode.name);
506
+ const decoderFunction = hasCustomData ? typeManifest2.decoder : `${nameApi.decoderFunction(accountNode.name)}()`;
507
+ return (0, import_visitors_core2.pipe)(
508
+ fragment`export function ${decodeFunction}<TAddress extends string = string>(encodedAccount: EncodedAccount<TAddress>): Account<${accountType}, TAddress>;
509
+ export function ${decodeFunction}<TAddress extends string = string>(encodedAccount: MaybeEncodedAccount<TAddress>): MaybeAccount<${accountType}, TAddress>;
510
+ export function ${decodeFunction}<TAddress extends string = string>(encodedAccount: EncodedAccount<TAddress> | MaybeEncodedAccount<TAddress>): Account<${accountType}, TAddress> | MaybeAccount<${accountType}, TAddress> {
511
+ return decodeAccount(encodedAccount as MaybeEncodedAccount<TAddress>, ${decoderFunction});
369
512
  }
370
- var render = (template, context, options) => {
371
- const dirname = false ? pathDirname(fileURLToPath(import_meta.url)) : __dirname;
372
- const templates = false ? (0, import_node_path.join)(dirname, "..", "..", "public", "templates") : (0, import_node_path.join)(dirname, "templates");
373
- const env = import_nunjucks.default.configure(templates, { autoescape: false, trimBlocks: true, ...options });
374
- env.addFilter("pascalCase", import_nodes3.pascalCase);
375
- env.addFilter("camelCase", import_nodes3.camelCase);
376
- env.addFilter("snakeCase", import_nodes3.snakeCase);
377
- env.addFilter("kebabCase", import_nodes3.kebabCase);
378
- env.addFilter("titleCase", import_nodes3.titleCase);
379
- env.addFilter("jsDocblock", jsDocblock);
380
- return env.render(template, context);
381
- };
382
513
 
383
- // src/fragments/common.ts
384
- function fragment(render2, imports) {
385
- return new Fragment(render2, imports);
514
+ export async function ${fetchFunction}<TAddress extends string = string>(
515
+ rpc: Parameters<typeof fetchEncodedAccount>[0],
516
+ address: Address<TAddress>,
517
+ config?: FetchAccountConfig,
518
+ ): Promise<Account<${accountType}, TAddress>> {
519
+ const maybeAccount = await ${fetchMaybeFunction}(rpc, address, config);
520
+ assertAccountExists(maybeAccount);
521
+ return maybeAccount;
386
522
  }
387
- function fragmentFromTemplate(fragmentFile, context, options) {
388
- return fragment(render((0, import_node_path2.join)("fragments", fragmentFile), context, options));
523
+
524
+ export async function ${fetchMaybeFunction}<TAddress extends string = string>(
525
+ rpc: Parameters<typeof fetchEncodedAccount>[0],
526
+ address: Address<TAddress>,
527
+ config?: FetchAccountConfig,
528
+ ): Promise<MaybeAccount<${accountType}, TAddress>> {
529
+ const maybeAccount = await fetchEncodedAccount(rpc, address, config);
530
+ return ${decodeFunction}(maybeAccount);
389
531
  }
390
- function mergeFragments(fragments, mergeRenders) {
391
- return new Fragment(
392
- mergeRenders(fragments.map((f) => f.render)),
393
- new ImportMap().mergeWith(...fragments),
394
- new Set(fragments.flatMap((f) => [...f.features]))
395
- );
532
+
533
+ export async function ${fetchAllFunction}(
534
+ rpc: Parameters<typeof fetchEncodedAccounts>[0],
535
+ addresses: Array<Address>,
536
+ config?: FetchAccountsConfig,
537
+ ): Promise<Account<${accountType}>[]> {
538
+ const maybeAccounts = await ${fetchAllMaybeFunction}(rpc, addresses, config);
539
+ assertAccountsExist(maybeAccounts);
540
+ return maybeAccounts;
396
541
  }
397
- var Fragment = class _Fragment {
398
- render;
399
- imports;
400
- features;
401
- constructor(render2, imports, features) {
402
- this.render = render2;
403
- this.imports = imports ? new ImportMap().mergeWith(imports) : new ImportMap();
404
- this.features = /* @__PURE__ */ new Set([...features ?? []]);
405
- }
406
- setRender(render2) {
407
- this.render = render2;
408
- return this;
409
- }
410
- mapRender(fn) {
411
- this.render = fn(this.render);
412
- return this;
413
- }
414
- addImports(module2, imports) {
415
- this.imports.add(module2, imports);
416
- return this;
417
- }
418
- removeImports(module2, imports) {
419
- this.imports.remove(module2, imports);
420
- return this;
421
- }
422
- mergeImportsWith(...others) {
423
- this.imports.mergeWith(...others);
424
- return this;
425
- }
426
- addImportAlias(module2, name, alias) {
427
- this.imports.addAlias(module2, name, alias);
428
- return this;
429
- }
430
- addFeatures(features) {
431
- const featureArray = typeof features === "string" ? [features] : features;
432
- featureArray.forEach((f) => this.features.add(f));
433
- return this;
434
- }
435
- removeFeatures(features) {
436
- const featureArray = typeof features === "string" ? [features] : features;
437
- featureArray.forEach((f) => this.features.delete(f));
438
- return this;
439
- }
440
- hasFeatures(features) {
441
- const featureArray = typeof features === "string" ? [features] : features;
442
- return featureArray.every((f) => this.features.has(f));
443
- }
444
- mergeFeaturesWith(...others) {
445
- others.forEach((f) => this.addFeatures([...f.features]));
446
- return this;
447
- }
448
- clone() {
449
- return new _Fragment(this.render).mergeImportsWith(this.imports);
450
- }
451
- toString() {
452
- return this.render;
453
- }
454
- };
455
542
 
456
- // src/fragments/accountFetchHelpers.ts
457
- function getAccountFetchHelpersFragment(scope) {
458
- const { accountPath, typeManifest: typeManifest2, nameApi, customAccountData } = scope;
459
- const accountNode = (0, import_visitors_core2.getLastNodeFromPath)(accountPath);
460
- const hasCustomData = customAccountData.has(accountNode.name);
461
- const accountTypeFragment = hasCustomData ? typeManifest2.strictType.clone() : fragment(nameApi.dataType(accountNode.name));
462
- const decoderFunctionFragment = hasCustomData ? typeManifest2.decoder.clone() : fragment(`${nameApi.decoderFunction(accountNode.name)}()`);
463
- return fragmentFromTemplate("accountFetchHelpers.njk", {
464
- accountType: accountTypeFragment.render,
465
- decodeFunction: nameApi.accountDecodeFunction(accountNode.name),
466
- decoderFunction: decoderFunctionFragment.render,
467
- fetchAllFunction: nameApi.accountFetchAllFunction(accountNode.name),
468
- fetchAllMaybeFunction: nameApi.accountFetchAllMaybeFunction(accountNode.name),
469
- fetchFunction: nameApi.accountFetchFunction(accountNode.name),
470
- fetchMaybeFunction: nameApi.accountFetchMaybeFunction(accountNode.name)
471
- }).mergeImportsWith(accountTypeFragment, decoderFunctionFragment).addImports("solanaAddresses", ["type Address"]).addImports("solanaAccounts", [
472
- "type Account",
473
- "assertAccountExists",
474
- "assertAccountsExist",
475
- "decodeAccount",
476
- "type EncodedAccount",
477
- "fetchEncodedAccount",
478
- "fetchEncodedAccounts",
479
- "type FetchAccountConfig",
480
- "type FetchAccountsConfig",
481
- "type MaybeAccount",
482
- "type MaybeEncodedAccount"
483
- ]);
543
+ export async function ${fetchAllMaybeFunction}(
544
+ rpc: Parameters<typeof fetchEncodedAccounts>[0],
545
+ addresses: Array<Address>,
546
+ config?: FetchAccountsConfig,
547
+ ): Promise<MaybeAccount<${accountType}>[]> {
548
+ const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);
549
+ return maybeAccounts.map((maybeAccount) => ${decodeFunction}(maybeAccount));
550
+ }`,
551
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"]),
552
+ (f) => addFragmentImports(f, "solanaAccounts", [
553
+ "type Account",
554
+ "assertAccountExists",
555
+ "assertAccountsExist",
556
+ "decodeAccount",
557
+ "type EncodedAccount",
558
+ "fetchEncodedAccount",
559
+ "fetchEncodedAccounts",
560
+ "type FetchAccountConfig",
561
+ "type FetchAccountsConfig",
562
+ "type MaybeAccount",
563
+ "type MaybeEncodedAccount"
564
+ ])
565
+ );
484
566
  }
485
567
 
568
+ // src/fragments/accountPage.ts
569
+ var import_nodes9 = require("@codama/nodes");
570
+ var import_visitors_core7 = require("@codama/visitors-core");
571
+
486
572
  // src/fragments/accountPdaHelpers.ts
487
573
  var import_nodes4 = require("@codama/nodes");
488
574
  var import_visitors_core3 = require("@codama/visitors-core");
489
575
  function getAccountPdaHelpersFragment(scope) {
490
576
  const { accountPath, nameApi, linkables, customAccountData, typeManifest: typeManifest2 } = scope;
491
577
  const accountNode = (0, import_visitors_core3.getLastNodeFromPath)(accountPath);
492
- const programNode = (0, import_visitors_core3.findProgramNodeFromPath)(accountPath);
493
578
  const pdaNode = accountNode.pda ? linkables.get([...accountPath, accountNode.pda]) : void 0;
494
- if (!pdaNode) {
495
- return fragment("");
496
- }
497
- const accountTypeFragment = customAccountData.has(accountNode.name) ? typeManifest2.strictType.clone() : fragment(nameApi.dataType(accountNode.name));
579
+ if (!pdaNode) return;
580
+ const accountType = customAccountData.has(accountNode.name) ? typeManifest2.strictType : nameApi.dataType(accountNode.name);
498
581
  const importFrom = "generatedPdas";
499
582
  const pdaSeedsType = nameApi.pdaSeedsType(pdaNode.name);
500
583
  const findPdaFunction = nameApi.pdaFindFunction(pdaNode.name);
501
584
  const hasVariableSeeds = pdaNode.seeds.filter((0, import_nodes4.isNodeFilter)("variablePdaSeedNode")).length > 0;
502
- return fragmentFromTemplate("accountPdaHelpers.njk", {
503
- accountType: accountTypeFragment.render,
504
- fetchFromSeedsFunction: nameApi.accountFetchFromSeedsFunction(accountNode.name),
505
- fetchFunction: nameApi.accountFetchFunction(accountNode.name),
506
- fetchMaybeFromSeedsFunction: nameApi.accountFetchMaybeFromSeedsFunction(accountNode.name),
507
- fetchMaybeFunction: nameApi.accountFetchMaybeFunction(accountNode.name),
508
- findPdaFunction,
509
- hasVariableSeeds,
510
- pdaSeedsType,
511
- program: programNode
512
- }).mergeImportsWith(accountTypeFragment).addImports(importFrom, hasVariableSeeds ? [pdaSeedsType, findPdaFunction] : [findPdaFunction]).addImports("solanaAddresses", ["type Address"]).addImports("solanaAccounts", [
513
- "type Account",
514
- "assertAccountExists",
515
- "type FetchAccountConfig",
516
- "type MaybeAccount"
517
- ]);
585
+ const fetchFromSeedsFunction = nameApi.accountFetchFromSeedsFunction(accountNode.name);
586
+ const fetchMaybeFromSeedsFunction = nameApi.accountFetchMaybeFromSeedsFunction(accountNode.name);
587
+ const fetchMaybeFunction = nameApi.accountFetchMaybeFunction(accountNode.name);
588
+ return (0, import_visitors_core3.pipe)(
589
+ fragment`export async function ${fetchFromSeedsFunction}(
590
+ rpc: Parameters<typeof fetchEncodedAccount>[0],
591
+ ${hasVariableSeeds ? `seeds: ${pdaSeedsType},` : ""}
592
+ config: FetchAccountConfig & { programAddress?: Address } = {},
593
+ ): Promise<Account<${accountType}>> {
594
+ const maybeAccount = await ${fetchMaybeFromSeedsFunction}(rpc, ${hasVariableSeeds ? "seeds, " : ""}config);
595
+ assertAccountExists(maybeAccount);
596
+ return maybeAccount;
597
+ }
598
+
599
+ export async function ${fetchMaybeFromSeedsFunction}(
600
+ rpc: Parameters<typeof fetchEncodedAccount>[0],
601
+ ${hasVariableSeeds ? `seeds: ${pdaSeedsType},` : ""}
602
+ config: FetchAccountConfig & { programAddress?: Address } = {},
603
+ ): Promise<MaybeAccount<${accountType}>> {
604
+ const { programAddress, ...fetchConfig } = config;
605
+ const [address] = await ${findPdaFunction}(${hasVariableSeeds ? "seeds, " : ""}{ programAddress });
606
+ return await ${fetchMaybeFunction}(rpc, address, fetchConfig);
607
+ }`,
608
+ (f) => addFragmentImports(f, importFrom, hasVariableSeeds ? [pdaSeedsType, findPdaFunction] : [findPdaFunction]),
609
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"]),
610
+ (f) => addFragmentImports(f, "solanaAccounts", [
611
+ "type Account",
612
+ "assertAccountExists",
613
+ "type FetchAccountConfig",
614
+ "type MaybeAccount"
615
+ ])
616
+ );
518
617
  }
519
618
 
520
619
  // src/fragments/accountSizeHelpers.ts
@@ -522,13 +621,11 @@ var import_visitors_core4 = require("@codama/visitors-core");
522
621
  function getAccountSizeHelpersFragment(scope) {
523
622
  const { accountPath, nameApi } = scope;
524
623
  const accountNode = (0, import_visitors_core4.getLastNodeFromPath)(accountPath);
525
- if (accountNode.size == null) {
526
- return fragment("");
527
- }
528
- return fragmentFromTemplate("accountSizeHelpers.njk", {
529
- account: accountNode,
530
- getSizeFunction: nameApi.accountGetSizeFunction(accountNode.name)
531
- });
624
+ if (accountNode.size == null) return;
625
+ const getSizeFunction = nameApi.accountGetSizeFunction(accountNode.name);
626
+ return fragment`export function ${getSizeFunction}(): number {
627
+ return ${accountNode.size};
628
+ }`;
532
629
  }
533
630
 
534
631
  // src/fragments/accountType.ts
@@ -538,70 +635,70 @@ var import_visitors_core5 = require("@codama/visitors-core");
538
635
  // src/fragments/type.ts
539
636
  function getTypeFragment(scope) {
540
637
  const { name, manifest, nameApi, docs = [] } = scope;
541
- const typeFragment = fragmentFromTemplate("type.njk", {
542
- docs,
543
- looseName: nameApi.dataArgsType(name),
544
- manifest,
545
- strictName: nameApi.dataType(name)
546
- });
547
- if (!manifest.isEnum) {
548
- typeFragment.mergeImportsWith(manifest.strictType, manifest.looseType);
638
+ const docblock = getDocblockFragment(docs, true);
639
+ const strictName = nameApi.dataType(name);
640
+ const looseName = nameApi.dataArgsType(name);
641
+ const aliasedLooseName = `export type ${looseName} = ${strictName};`;
642
+ if (manifest.isEnum) {
643
+ return fragment`${docblock}export enum ${strictName} ${manifest.strictType};\n\n${aliasedLooseName}`;
549
644
  }
550
- return typeFragment;
645
+ const looseExport = manifest.strictType.content === manifest.looseType.content ? aliasedLooseName : fragment`export type ${looseName} = ${manifest.looseType};`;
646
+ return fragment`${docblock}export type ${strictName} = ${manifest.strictType};\n\n${looseExport}`;
551
647
  }
552
648
 
553
649
  // src/fragments/typeDecoder.ts
554
650
  var import_nodes5 = require("@codama/nodes");
555
651
  function getTypeDecoderFragment(scope) {
556
652
  const { name, node, manifest, nameApi, docs = [] } = scope;
557
- const decoderType = typeof scope.size === "number" ? "FixedSizeDecoder" : "Decoder";
653
+ const decoderFunction = nameApi.decoderFunction(name);
654
+ const strictName = nameApi.dataType(name);
655
+ const docblock = getDocblockFragment(docs, true);
656
+ const decoderType = use(
657
+ typeof scope.size === "number" ? "type FixedSizeDecoder" : "type Decoder",
658
+ "solanaCodecsCore"
659
+ );
558
660
  const useTypeCast = (0, import_nodes5.isNode)(node, "enumTypeNode") && (0, import_nodes5.isDataEnum)(node) && typeof scope.size === "number";
559
- return fragmentFromTemplate("typeDecoder.njk", {
560
- decoderFunction: nameApi.decoderFunction(name),
561
- decoderType,
562
- docs,
563
- looseName: nameApi.dataArgsType(name),
564
- manifest,
565
- strictName: nameApi.dataType(name),
566
- useTypeCast
567
- }).mergeImportsWith(manifest.decoder).addImports("solanaCodecsCore", `type ${decoderType}`);
661
+ const typeCast = useTypeCast ? fragment` as ${decoderType}<${strictName}>` : "";
662
+ return fragment`${docblock}export function ${decoderFunction}(): ${decoderType}<${strictName}> {
663
+ return ${manifest.decoder}${typeCast};
664
+ }`;
568
665
  }
569
666
 
570
667
  // src/fragments/typeEncoder.ts
571
668
  var import_nodes6 = require("@codama/nodes");
572
669
  function getTypeEncoderFragment(scope) {
573
670
  const { name, node, manifest, nameApi, docs = [] } = scope;
574
- const encoderType = typeof scope.size === "number" ? "FixedSizeEncoder" : "Encoder";
671
+ const encoderFunction = nameApi.encoderFunction(name);
672
+ const looseName = nameApi.dataArgsType(name);
673
+ const docblock = getDocblockFragment(docs, true);
674
+ const encoderType = use(
675
+ typeof scope.size === "number" ? "type FixedSizeEncoder" : "type Encoder",
676
+ "solanaCodecsCore"
677
+ );
575
678
  const useTypeCast = (0, import_nodes6.isNode)(node, "enumTypeNode") && (0, import_nodes6.isDataEnum)(node) && typeof scope.size === "number";
576
- return fragmentFromTemplate("typeEncoder.njk", {
577
- docs,
578
- encoderFunction: nameApi.encoderFunction(name),
579
- encoderType,
580
- looseName: nameApi.dataArgsType(name),
581
- manifest,
582
- strictName: nameApi.dataType(name),
583
- useTypeCast
584
- }).mergeImportsWith(manifest.encoder).addImports("solanaCodecsCore", `type ${encoderType}`);
679
+ const typeCast = useTypeCast ? fragment` as ${encoderType}<${looseName}>` : "";
680
+ return fragment`${docblock}export function ${encoderFunction}(): ${encoderType}<${looseName}> {
681
+ return ${manifest.encoder}${typeCast};
682
+ }`;
585
683
  }
586
684
 
587
685
  // src/fragments/typeCodec.ts
588
686
  function getTypeCodecFragment(scope) {
589
- const { name, manifest, nameApi } = scope;
590
- const codecType = typeof scope.size === "number" ? "FixedSizeCodec" : "Codec";
687
+ const { codecDocs = [], name, nameApi } = scope;
688
+ const codecFunction = nameApi.codecFunction(name);
689
+ const decoderFunction = nameApi.decoderFunction(name);
690
+ const encoderFunction = nameApi.encoderFunction(name);
691
+ const looseName = nameApi.dataArgsType(name);
692
+ const strictName = nameApi.dataType(name);
693
+ const docblock = getDocblockFragment(codecDocs, true);
694
+ const codecType = use(typeof scope.size === "number" ? "type FixedSizeCodec" : "type Codec", "solanaCodecsCore");
591
695
  return mergeFragments(
592
696
  [
593
697
  getTypeEncoderFragment({ ...scope, docs: scope.encoderDocs }),
594
698
  getTypeDecoderFragment({ ...scope, docs: scope.decoderDocs }),
595
- fragmentFromTemplate("typeCodec.njk", {
596
- codecFunction: nameApi.codecFunction(name),
597
- codecType,
598
- decoderFunction: nameApi.decoderFunction(name),
599
- docs: scope.codecDocs,
600
- encoderFunction: nameApi.encoderFunction(name),
601
- looseName: nameApi.dataArgsType(name),
602
- manifest,
603
- strictName: nameApi.dataType(name)
604
- }).addImports("solanaCodecsCore", [`type ${codecType}`, "combineCodec"])
699
+ fragment`${docblock}export function ${codecFunction}(): ${codecType}<${looseName}, ${strictName}> {
700
+ return ${use("combineCodec", "solanaCodecsCore")}(${encoderFunction}(), ${decoderFunction}());
701
+ }`
605
702
  ],
606
703
  (renders) => renders.join("\n\n")
607
704
  );
@@ -619,9 +716,7 @@ function getTypeWithCodecFragment(scope) {
619
716
  function getAccountTypeFragment(scope) {
620
717
  const { accountPath, typeManifest: typeManifest2, nameApi, customAccountData } = scope;
621
718
  const accountNode = (0, import_visitors_core5.getLastNodeFromPath)(accountPath);
622
- if (customAccountData.has(accountNode.name)) {
623
- return fragment("");
624
- }
719
+ if (customAccountData.has(accountNode.name)) return;
625
720
  return getTypeWithCodecFragment({
626
721
  manifest: typeManifest2,
627
722
  name: accountNode.name,
@@ -631,35 +726,108 @@ function getAccountTypeFragment(scope) {
631
726
  });
632
727
  }
633
728
 
634
- // src/fragments/discriminatorCondition.ts
729
+ // src/fragments/discriminatorConstants.ts
635
730
  var import_nodes8 = require("@codama/nodes");
636
731
  var import_visitors_core6 = require("@codama/visitors-core");
732
+ function getDiscriminatorConstantsFragment(scope) {
733
+ const fragments = scope.discriminatorNodes.map((node) => getDiscriminatorConstantFragment(node, scope)).filter(Boolean);
734
+ return mergeFragments(fragments, (c) => c.join("\n\n"));
735
+ }
736
+ function getDiscriminatorConstantFragment(discriminatorNode, scope) {
737
+ switch (discriminatorNode.kind) {
738
+ case "constantDiscriminatorNode":
739
+ return getConstantDiscriminatorConstantFragment(discriminatorNode, scope);
740
+ case "fieldDiscriminatorNode":
741
+ return getFieldDiscriminatorConstantFragment(discriminatorNode, scope);
742
+ default:
743
+ return null;
744
+ }
745
+ }
746
+ function getConstantDiscriminatorConstantFragment(discriminatorNode, scope) {
747
+ const { discriminatorNodes, typeManifestVisitor, prefix } = scope;
748
+ const index = discriminatorNodes.filter((0, import_nodes8.isNodeFilter)("constantDiscriminatorNode")).indexOf(discriminatorNode);
749
+ const suffix = index <= 0 ? "" : `_${index + 1}`;
750
+ const name = (0, import_nodes8.camelCase)(`${prefix}_discriminator${suffix}`);
751
+ const encoder = (0, import_visitors_core6.visit)(discriminatorNode.constant.type, typeManifestVisitor).encoder;
752
+ const value = (0, import_visitors_core6.visit)(discriminatorNode.constant.value, typeManifestVisitor).value;
753
+ return getConstantFragment({ ...scope, encoder, name, value });
754
+ }
755
+ function getFieldDiscriminatorConstantFragment(discriminatorNode, scope) {
756
+ const { fields, prefix, typeManifestVisitor } = scope;
757
+ const field = fields.find((f) => f.name === discriminatorNode.name);
758
+ if (!field || !field.defaultValue || !(0, import_nodes8.isNode)(field.defaultValue, import_nodes8.VALUE_NODES)) {
759
+ return null;
760
+ }
761
+ const name = (0, import_nodes8.camelCase)(`${prefix}_${discriminatorNode.name}`);
762
+ const encoder = (0, import_visitors_core6.visit)(field.type, typeManifestVisitor).encoder;
763
+ const value = (0, import_visitors_core6.visit)(field.defaultValue, typeManifestVisitor).value;
764
+ return getConstantFragment({ ...scope, encoder, name, value });
765
+ }
766
+ function getConstantFragment(scope) {
767
+ const { encoder, name, nameApi, value } = scope;
768
+ const constantName = nameApi.constant(name);
769
+ const constantFunction = nameApi.constantFunction(name);
770
+ return fragment`export const ${constantName} = ${value};\n\nexport function ${constantFunction}() { return ${encoder}.encode(${constantName}); }`;
771
+ }
772
+
773
+ // src/fragments/accountPage.ts
774
+ function getAccountPageFragment(scope) {
775
+ const node = (0, import_visitors_core7.getLastNodeFromPath)(scope.accountPath);
776
+ if (!(0, import_visitors_core7.findProgramNodeFromPath)(scope.accountPath)) {
777
+ throw new Error("Account must be visited inside a program.");
778
+ }
779
+ const typeManifest2 = (0, import_visitors_core7.visit)(node, scope.typeManifestVisitor);
780
+ const fields = (0, import_nodes9.resolveNestedTypeNode)(node.data).fields;
781
+ return mergeFragments(
782
+ [
783
+ getDiscriminatorConstantsFragment({
784
+ ...scope,
785
+ discriminatorNodes: node.discriminators ?? [],
786
+ fields,
787
+ prefix: node.name
788
+ }),
789
+ getAccountTypeFragment({ ...scope, typeManifest: typeManifest2 }),
790
+ getAccountFetchHelpersFragment({ ...scope, typeManifest: typeManifest2 }),
791
+ getAccountSizeHelpersFragment(scope),
792
+ getAccountPdaHelpersFragment({ ...scope, typeManifest: typeManifest2 })
793
+ ],
794
+ (cs) => cs.join("\n\n")
795
+ );
796
+ }
797
+
798
+ // src/fragments/discriminatorCondition.ts
799
+ var import_nodes10 = require("@codama/nodes");
800
+ var import_renderers_core2 = require("@codama/renderers-core");
801
+ var import_visitors_core8 = require("@codama/visitors-core");
637
802
  var import_codecs_strings2 = require("@solana/codecs-strings");
638
803
  function getDiscriminatorConditionFragment(scope) {
639
- return mergeFragments(
640
- scope.discriminators.flatMap((discriminator) => {
641
- if ((0, import_nodes8.isNode)(discriminator, "sizeDiscriminatorNode")) {
642
- return [getSizeConditionFragment(discriminator, scope)];
643
- }
644
- if ((0, import_nodes8.isNode)(discriminator, "constantDiscriminatorNode")) {
645
- return [getByteConditionFragment(discriminator, scope)];
646
- }
647
- if ((0, import_nodes8.isNode)(discriminator, "fieldDiscriminatorNode")) {
648
- return [getFieldConditionFragment(discriminator, scope)];
649
- }
650
- return [];
651
- }),
652
- (r) => r.join(" && ")
653
- ).mapRender((r) => `if (${r}) { ${scope.ifTrue}; }`);
804
+ return (0, import_visitors_core8.pipe)(
805
+ mergeFragments(
806
+ scope.discriminators.flatMap((discriminator) => {
807
+ if ((0, import_nodes10.isNode)(discriminator, "sizeDiscriminatorNode")) {
808
+ return [getSizeConditionFragment(discriminator, scope)];
809
+ }
810
+ if ((0, import_nodes10.isNode)(discriminator, "constantDiscriminatorNode")) {
811
+ return [getByteConditionFragment(discriminator, scope)];
812
+ }
813
+ if ((0, import_nodes10.isNode)(discriminator, "fieldDiscriminatorNode")) {
814
+ return [getFieldConditionFragment(discriminator, scope)];
815
+ }
816
+ return [];
817
+ }),
818
+ (c) => c.join(" && ")
819
+ ),
820
+ (f) => (0, import_renderers_core2.mapFragmentContent)(f, (c) => `if (${c}) { ${scope.ifTrue}; }`)
821
+ );
654
822
  }
655
823
  function getSizeConditionFragment(discriminator, scope) {
656
824
  const { dataName } = scope;
657
- return fragment(`${dataName}.length === ${discriminator.size}`);
825
+ return fragment`${dataName}.length === ${discriminator.size}`;
658
826
  }
659
827
  function getByteConditionFragment(discriminator, scope) {
660
828
  const { dataName, typeManifestVisitor } = scope;
661
- const constant = (0, import_visitors_core6.visit)(discriminator.constant, typeManifestVisitor).value;
662
- return constant.mapRender((r) => `containsBytes(${dataName}, ${r}, ${discriminator.offset})`).addImports("solanaCodecsCore", "containsBytes");
829
+ const constant = (0, import_visitors_core8.visit)(discriminator.constant, typeManifestVisitor).value;
830
+ return fragment`${use("containsBytes", "solanaCodecsCore")}(${dataName}, ${constant}, ${discriminator.offset})`;
663
831
  }
664
832
  function getFieldConditionFragment(discriminator, scope) {
665
833
  const field = scope.struct.fields.find((f) => f.name === discriminator.name);
@@ -668,56 +836,135 @@ function getFieldConditionFragment(discriminator, scope) {
668
836
  `Field discriminator "${discriminator.name}" does not have a matching argument with default value.`
669
837
  );
670
838
  }
671
- if ((0, import_nodes8.isNode)(field.type, "arrayTypeNode") && (0, import_nodes8.isNode)(field.type.item, "numberTypeNode") && field.type.item.format === "u8" && (0, import_nodes8.isNode)(field.type.count, "fixedCountNode") && (0, import_nodes8.isNode)(field.defaultValue, "arrayValueNode") && field.defaultValue.items.every((0, import_nodes8.isNodeFilter)("numberValueNode"))) {
839
+ if ((0, import_nodes10.isNode)(field.type, "arrayTypeNode") && (0, import_nodes10.isNode)(field.type.item, "numberTypeNode") && field.type.item.format === "u8" && (0, import_nodes10.isNode)(field.type.count, "fixedCountNode") && (0, import_nodes10.isNode)(field.defaultValue, "arrayValueNode") && field.defaultValue.items.every((0, import_nodes10.isNodeFilter)("numberValueNode"))) {
672
840
  const base64Bytes = (0, import_codecs_strings2.getBase64Decoder)().decode(
673
841
  new Uint8Array(field.defaultValue.items.map((node) => node.number))
674
842
  );
675
843
  return getByteConditionFragment(
676
- (0, import_nodes8.constantDiscriminatorNode)((0, import_nodes8.constantValueNodeFromBytes)("base64", base64Bytes), discriminator.offset),
844
+ (0, import_nodes10.constantDiscriminatorNode)((0, import_nodes10.constantValueNodeFromBytes)("base64", base64Bytes), discriminator.offset),
677
845
  scope
678
846
  );
679
847
  }
680
848
  return getByteConditionFragment(
681
- (0, import_nodes8.constantDiscriminatorNode)((0, import_nodes8.constantValueNode)(field.type, field.defaultValue), discriminator.offset),
849
+ (0, import_nodes10.constantDiscriminatorNode)((0, import_nodes10.constantValueNode)(field.type, field.defaultValue), discriminator.offset),
682
850
  scope
683
851
  );
684
852
  }
685
853
 
854
+ // src/fragments/errorPage.ts
855
+ function getErrorPageFragment(scope) {
856
+ return mergeFragments(
857
+ [
858
+ getConstantsFragment(scope),
859
+ getConstantUnionTypeFragment(scope),
860
+ getErrorMessagesFragment(scope),
861
+ getErrorMessageFunctionFragment(scope),
862
+ getIsErrorFunctionFragment(scope)
863
+ ],
864
+ (cs) => cs.join("\n\n")
865
+ );
866
+ }
867
+ function getConstantsFragment(scope) {
868
+ const constantPrefix = scope.nameApi.programErrorConstantPrefix(scope.programNode.name);
869
+ return mergeFragments(
870
+ [...scope.programNode.errors].sort((a, b) => a.code - b.code).map((error) => {
871
+ const docs = getDocblockFragment(error.docs ?? [], true);
872
+ const name = constantPrefix + scope.nameApi.programErrorConstant(error.name);
873
+ return fragment`${docs}export const ${name} = 0x${error.code.toString(16)}; // ${error.code}`;
874
+ }),
875
+ (cs) => cs.join("\n")
876
+ );
877
+ }
878
+ function getConstantUnionTypeFragment(scope) {
879
+ const constantPrefix = scope.nameApi.programErrorConstantPrefix(scope.programNode.name);
880
+ const typeName = scope.nameApi.programErrorUnion(scope.programNode.name);
881
+ const errorTypes = mergeFragments(
882
+ [...scope.programNode.errors].sort((a, b) => a.name.localeCompare(b.name)).map((error) => fragment`typeof ${constantPrefix + scope.nameApi.programErrorConstant(error.name)}`),
883
+ (cs) => cs.join(" | ")
884
+ );
885
+ return fragment`export type ${typeName} = ${errorTypes};`;
886
+ }
887
+ function getErrorMessagesFragment(scope) {
888
+ const mapName = scope.nameApi.programErrorMessagesMap(scope.programNode.name);
889
+ const errorUnionType = scope.nameApi.programErrorUnion(scope.programNode.name);
890
+ const constantPrefix = scope.nameApi.programErrorConstantPrefix(scope.programNode.name);
891
+ const messageEntries = mergeFragments(
892
+ [...scope.programNode.errors].sort((a, b) => a.name.localeCompare(b.name)).map((error) => {
893
+ const constantName = constantPrefix + scope.nameApi.programErrorConstant(error.name);
894
+ const escapedMessage = error.message.replace(/`/g, "\\`");
895
+ return fragment`[${constantName}]: \`${escapedMessage}\``;
896
+ }),
897
+ (cs) => cs.join(", ")
898
+ );
899
+ return fragment`let ${mapName}: Record<${errorUnionType}, string> | undefined;
900
+ if (process.env.NODE_ENV !== 'production') {
901
+ ${mapName} = { ${messageEntries} };
902
+ }`;
903
+ }
904
+ function getErrorMessageFunctionFragment(scope) {
905
+ const functionName = scope.nameApi.programGetErrorMessageFunction(scope.programNode.name);
906
+ const errorUnionType = scope.nameApi.programErrorUnion(scope.programNode.name);
907
+ const messageMapName = scope.nameApi.programErrorMessagesMap(scope.programNode.name);
908
+ return fragment`export function ${functionName}(code: ${errorUnionType}): string {
909
+ if (process.env.NODE_ENV !== 'production') {
910
+ return (${messageMapName} as Record<${errorUnionType}, string>)[code];
911
+ }
912
+
913
+ return 'Error message not available in production bundles.';
914
+ }`;
915
+ }
916
+ function getIsErrorFunctionFragment(scope) {
917
+ const { programNode, nameApi } = scope;
918
+ const programAddressConstant = use(nameApi.programAddressConstant(programNode.name), "generatedPrograms");
919
+ const functionName = nameApi.programIsErrorFunction(programNode.name);
920
+ const programErrorUnion = nameApi.programErrorUnion(programNode.name);
921
+ return fragment`export function ${functionName}<TProgramErrorCode extends ${programErrorUnion}>(
922
+ error: unknown,
923
+ transactionMessage: { instructions: Record<number, { programAddress: ${use("type Address", "solanaAddresses")} }> },
924
+ code?: TProgramErrorCode,
925
+ ): error is ${use("type SolanaError", "solanaErrors")}<typeof ${use("type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM", "solanaErrors")}> & Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {
926
+ return ${use("isProgramError", "solanaPrograms")}<TProgramErrorCode>(error, transactionMessage, ${programAddressConstant}, code);
927
+ }`;
928
+ }
929
+
930
+ // src/fragments/indexPage.ts
931
+ function getIndexPageFragment(items) {
932
+ if (items.length === 0) return;
933
+ const names = items.map((item) => item.name).sort((a, b) => a.localeCompare(b)).map((name) => getExportAllFragment(`./${name}`));
934
+ return mergeFragments(names, (cs) => cs.join("\n"));
935
+ }
936
+
686
937
  // src/fragments/instructionAccountMeta.ts
687
- var import_nodes9 = require("@codama/nodes");
938
+ var import_nodes11 = require("@codama/nodes");
688
939
  function getInstructionAccountMetaFragment(instructionAccountNode) {
689
- const typeParam = `TAccount${(0, import_nodes9.pascalCase)(instructionAccountNode.name)}`;
940
+ const typeParam = `TAccount${(0, import_nodes11.pascalCase)(instructionAccountNode.name)}`;
690
941
  if (instructionAccountNode.isSigner === true && instructionAccountNode.isWritable) {
691
- return fragment(`WritableSignerAccount<${typeParam}> & AccountSignerMeta<${typeParam}>`).addImports("solanaInstructions", ["type WritableSignerAccount"]).addImports("solanaSigners", ["type AccountSignerMeta"]);
942
+ return fragment`${use("type WritableSignerAccount", "solanaInstructions")}<${typeParam}> & ${use("type AccountSignerMeta", "solanaSigners")}<${typeParam}>`;
692
943
  }
693
944
  if (instructionAccountNode.isSigner === true) {
694
- return fragment(`ReadonlySignerAccount<${typeParam}> & AccountSignerMeta<${typeParam}>`).addImports("solanaInstructions", ["type ReadonlySignerAccount"]).addImports("solanaSigners", ["type AccountSignerMeta"]);
945
+ return fragment`${use("type ReadonlySignerAccount", "solanaInstructions")}<${typeParam}> & ${use("type AccountSignerMeta", "solanaSigners")}<${typeParam}>`;
695
946
  }
696
947
  if (instructionAccountNode.isWritable) {
697
- return fragment(`WritableAccount<${typeParam}>`).addImports("solanaInstructions", "type WritableAccount");
948
+ return fragment`${use("type WritableAccount", "solanaInstructions")}<${typeParam}>`;
698
949
  }
699
- return fragment(`ReadonlyAccount<${typeParam}>`).addImports("solanaInstructions", "type ReadonlyAccount");
950
+ return fragment`${use("type ReadonlyAccount", "solanaInstructions")}<${typeParam}>`;
700
951
  }
701
952
 
702
953
  // src/fragments/instructionAccountTypeParam.ts
703
- var import_nodes10 = require("@codama/nodes");
704
- var import_visitors_core7 = require("@codama/visitors-core");
954
+ var import_nodes12 = require("@codama/nodes");
955
+ var import_visitors_core9 = require("@codama/visitors-core");
705
956
  function getInstructionAccountTypeParamFragment(scope) {
706
957
  const { instructionAccountPath, allowAccountMeta, linkables } = scope;
707
- const instructionAccountNode = (0, import_visitors_core7.getLastNodeFromPath)(instructionAccountPath);
708
- const instructionNode = (0, import_visitors_core7.findInstructionNodeFromPath)(instructionAccountPath);
709
- const programNode = (0, import_visitors_core7.findProgramNodeFromPath)(instructionAccountPath);
710
- const typeParam = `TAccount${(0, import_nodes10.pascalCase)(instructionAccountNode.name)}`;
711
- const accountMeta = allowAccountMeta ? " | AccountMeta<string>" : "";
712
- const imports = new ImportMap();
713
- if (allowAccountMeta) {
714
- imports.add("solanaInstructions", "type AccountMeta");
715
- }
958
+ const instructionAccountNode = (0, import_visitors_core9.getLastNodeFromPath)(instructionAccountPath);
959
+ const instructionNode = (0, import_visitors_core9.findInstructionNodeFromPath)(instructionAccountPath);
960
+ const programNode = (0, import_visitors_core9.findProgramNodeFromPath)(instructionAccountPath);
961
+ const typeParam = `TAccount${(0, import_nodes12.pascalCase)(instructionAccountNode.name)}`;
962
+ const accountMeta = allowAccountMeta ? fragment` | ${use("type AccountMeta", "solanaInstructions")}<string>` : void 0;
716
963
  if (instructionNode.optionalAccountStrategy === "omitted" && instructionAccountNode.isOptional) {
717
- return fragment(`${typeParam} extends string${accountMeta} | undefined = undefined`, imports);
964
+ return fragment`${typeParam} extends string${accountMeta} | undefined = undefined`;
718
965
  }
719
966
  const defaultAddress = getDefaultAddress(instructionAccountNode.defaultValue, programNode.publicKey, linkables);
720
- return fragment(`${typeParam} extends string${accountMeta} = ${defaultAddress}`, imports);
967
+ return fragment`${typeParam} extends string${accountMeta} = ${defaultAddress}`;
721
968
  }
722
969
  function getDefaultAddress(defaultValue, programId, linkables) {
723
970
  switch (defaultValue?.kind) {
@@ -734,303 +981,284 @@ function getDefaultAddress(defaultValue, programId, linkables) {
734
981
  }
735
982
 
736
983
  // src/fragments/instructionByteDelta.ts
737
- var import_nodes11 = require("@codama/nodes");
738
- var import_visitors_core8 = require("@codama/visitors-core");
984
+ var import_nodes13 = require("@codama/nodes");
985
+ var import_renderers_core3 = require("@codama/renderers-core");
986
+ var import_visitors_core10 = require("@codama/visitors-core");
739
987
  function getInstructionByteDeltaFragment(scope) {
740
- const { byteDeltas } = (0, import_visitors_core8.getLastNodeFromPath)(scope.instructionPath);
741
- const fragments = (byteDeltas ?? []).flatMap((r) => getByteDeltaFragment(r, scope));
742
- if (fragments.length === 0) return fragment("");
988
+ const { byteDeltas } = (0, import_visitors_core10.getLastNodeFromPath)(scope.instructionPath);
989
+ const fragments = (byteDeltas ?? []).flatMap((c) => getByteDeltaFragment(c, scope));
990
+ if (fragments.length === 0) return;
743
991
  return mergeFragments(
744
992
  fragments,
745
- (r) => `// Bytes created or reallocated by the instruction.
746
- const byteDelta: number = [${r.join(",")}].reduce((a, b) => a + b, 0);`
993
+ (c) => `// Bytes created or reallocated by the instruction.
994
+ const byteDelta: number = [${c.join(",")}].reduce((a, b) => a + b, 0);`
747
995
  );
748
996
  }
749
997
  function getByteDeltaFragment(byteDelta, scope) {
750
- const bytesFragment = (() => {
751
- if ((0, import_nodes11.isNode)(byteDelta.value, "numberValueNode")) {
998
+ let bytesFragment = (() => {
999
+ if ((0, import_nodes13.isNode)(byteDelta.value, "numberValueNode")) {
752
1000
  return getNumberValueNodeFragment(byteDelta);
753
1001
  }
754
- if ((0, import_nodes11.isNode)(byteDelta.value, "argumentValueNode")) {
1002
+ if ((0, import_nodes13.isNode)(byteDelta.value, "argumentValueNode")) {
755
1003
  return getArgumentValueNodeFragment(byteDelta);
756
1004
  }
757
- if ((0, import_nodes11.isNode)(byteDelta.value, "accountLinkNode")) {
1005
+ if ((0, import_nodes13.isNode)(byteDelta.value, "accountLinkNode")) {
758
1006
  return getAccountLinkNodeFragment(byteDelta, scope);
759
1007
  }
760
- if ((0, import_nodes11.isNode)(byteDelta.value, "resolverValueNode")) {
1008
+ if ((0, import_nodes13.isNode)(byteDelta.value, "resolverValueNode")) {
761
1009
  return getResolverValueNodeFragment(byteDelta, scope);
762
1010
  }
763
1011
  return null;
764
1012
  })();
765
1013
  if (bytesFragment === null) return [];
766
1014
  if (byteDelta.withHeader) {
767
- bytesFragment.mapRender((r) => `${r} + BASE_ACCOUNT_SIZE`).addImports("solanaAccounts", "BASE_ACCOUNT_SIZE");
1015
+ bytesFragment = fragment`${bytesFragment} + ${use("BASE_ACCOUNT_SIZE", "solanaAccounts")}`;
768
1016
  }
769
1017
  if (byteDelta.subtract) {
770
- bytesFragment.mapRender((r) => `- (${r})`);
1018
+ bytesFragment = (0, import_visitors_core10.pipe)(bytesFragment, (f) => (0, import_renderers_core3.mapFragmentContent)(f, (c) => `- (${c})`));
771
1019
  }
772
1020
  return [bytesFragment];
773
1021
  }
774
1022
  function getNumberValueNodeFragment(byteDelta) {
775
- (0, import_nodes11.assertIsNode)(byteDelta.value, "numberValueNode");
776
- return fragment(byteDelta.value.number.toString());
1023
+ (0, import_nodes13.assertIsNode)(byteDelta.value, "numberValueNode");
1024
+ return fragment`${byteDelta.value.number}`;
777
1025
  }
778
1026
  function getArgumentValueNodeFragment(byteDelta) {
779
- (0, import_nodes11.assertIsNode)(byteDelta.value, "argumentValueNode");
780
- const argumentName = (0, import_nodes11.camelCase)(byteDelta.value.name);
781
- return fragment(`Number(args.${argumentName})`);
1027
+ (0, import_nodes13.assertIsNode)(byteDelta.value, "argumentValueNode");
1028
+ const argumentName = (0, import_nodes13.camelCase)(byteDelta.value.name);
1029
+ return fragment`Number(args.${argumentName})`;
782
1030
  }
783
1031
  function getAccountLinkNodeFragment(byteDelta, scope) {
784
- (0, import_nodes11.assertIsNode)(byteDelta.value, "accountLinkNode");
785
- const functionName = scope.nameApi.accountGetSizeFunction(byteDelta.value.name);
786
- return fragment(`${functionName}()`).addImports(scope.getImportFrom(byteDelta.value), functionName);
1032
+ (0, import_nodes13.assertIsNode)(byteDelta.value, "accountLinkNode");
1033
+ const functionName = use(
1034
+ scope.nameApi.accountGetSizeFunction(byteDelta.value.name),
1035
+ scope.getImportFrom(byteDelta.value)
1036
+ );
1037
+ return fragment`${functionName}()`;
787
1038
  }
788
1039
  function getResolverValueNodeFragment(byteDelta, scope) {
789
- (0, import_nodes11.assertIsNode)(byteDelta.value, "resolverValueNode");
1040
+ (0, import_nodes13.assertIsNode)(byteDelta.value, "resolverValueNode");
790
1041
  const isAsync = scope.asyncResolvers.includes(byteDelta.value.name);
791
1042
  if (!scope.useAsync && isAsync) return null;
792
1043
  const awaitKeyword = scope.useAsync && isAsync ? "await " : "";
793
- const functionName = scope.nameApi.resolverFunction(byteDelta.value.name);
794
- return fragment(`${awaitKeyword}${functionName}(resolverScope)`).addImports(scope.getImportFrom(byteDelta.value), functionName).addFeatures(["instruction:resolverScopeVariable"]);
1044
+ const functionName = use(
1045
+ scope.nameApi.resolverFunction(byteDelta.value.name),
1046
+ scope.getImportFrom(byteDelta.value)
1047
+ );
1048
+ return (0, import_visitors_core10.pipe)(
1049
+ fragment`${awaitKeyword}${functionName}(resolverScope)`,
1050
+ (f) => addFragmentFeatures(f, ["instruction:resolverScopeVariable"])
1051
+ );
795
1052
  }
796
1053
 
797
1054
  // src/fragments/instructionData.ts
798
- var import_nodes12 = require("@codama/nodes");
799
- var import_visitors_core9 = require("@codama/visitors-core");
1055
+ var import_nodes14 = require("@codama/nodes");
1056
+ var import_visitors_core11 = require("@codama/visitors-core");
800
1057
  function getInstructionDataFragment(scope) {
801
1058
  const { instructionPath, dataArgsManifest, nameApi, customInstructionData } = scope;
802
- const instructionNode = (0, import_visitors_core9.getLastNodeFromPath)(instructionPath);
803
- if (instructionNode.arguments.length === 0 || customInstructionData.has(instructionNode.name)) {
804
- return fragment("");
805
- }
1059
+ const instructionNode = (0, import_visitors_core11.getLastNodeFromPath)(instructionPath);
1060
+ if (instructionNode.arguments.length === 0 || customInstructionData.has(instructionNode.name)) return;
806
1061
  const instructionDataName = nameApi.instructionDataType(instructionNode.name);
807
1062
  return getTypeWithCodecFragment({
808
1063
  manifest: dataArgsManifest,
809
1064
  name: instructionDataName,
810
1065
  nameApi,
811
- node: (0, import_nodes12.structTypeNodeFromInstructionArgumentNodes)(instructionNode.arguments),
1066
+ node: (0, import_nodes14.structTypeNodeFromInstructionArgumentNodes)(instructionNode.arguments),
812
1067
  size: scope.size
813
1068
  });
814
1069
  }
815
1070
 
816
- // src/fragments/discriminatorConstants.ts
817
- var import_nodes13 = require("@codama/nodes");
818
- var import_visitors_core10 = require("@codama/visitors-core");
819
- function getDiscriminatorConstantsFragment(scope) {
820
- const fragments = scope.discriminatorNodes.map((node) => getDiscriminatorConstantFragment(node, scope)).filter(Boolean);
821
- return mergeFragments(fragments, (r) => r.join("\n\n"));
1071
+ // src/fragments/instructionExtraArgs.ts
1072
+ var import_renderers_core4 = require("@codama/renderers-core");
1073
+ var import_visitors_core12 = require("@codama/visitors-core");
1074
+ function getInstructionExtraArgsFragment(scope) {
1075
+ const { instructionPath, extraArgsManifest, nameApi } = scope;
1076
+ const instructionNode = (0, import_visitors_core12.getLastNodeFromPath)(instructionPath);
1077
+ if ((instructionNode.extraArguments ?? []).length === 0) return;
1078
+ const instructionExtraName = nameApi.instructionExtraType(instructionNode.name);
1079
+ const looseName = nameApi.dataArgsType(instructionExtraName);
1080
+ return (0, import_renderers_core4.mapFragmentContent)(extraArgsManifest.looseType, (c) => `export type ${looseName} = ${c};`);
822
1081
  }
823
- function getDiscriminatorConstantFragment(discriminatorNode, scope) {
824
- switch (discriminatorNode.kind) {
825
- case "constantDiscriminatorNode":
826
- return getConstantDiscriminatorConstantFragment(discriminatorNode, scope);
827
- case "fieldDiscriminatorNode":
828
- return getFieldDiscriminatorConstantFragment(discriminatorNode, scope);
829
- default:
830
- return null;
831
- }
832
- }
833
- function getConstantDiscriminatorConstantFragment(discriminatorNode, scope) {
834
- const { discriminatorNodes, typeManifestVisitor, prefix } = scope;
835
- const index = discriminatorNodes.filter((0, import_nodes13.isNodeFilter)("constantDiscriminatorNode")).indexOf(discriminatorNode);
836
- const suffix = index <= 0 ? "" : `_${index + 1}`;
837
- const name = (0, import_nodes13.camelCase)(`${prefix}_discriminator${suffix}`);
838
- const encoder = (0, import_visitors_core10.visit)(discriminatorNode.constant.type, typeManifestVisitor).encoder;
839
- const value = (0, import_visitors_core10.visit)(discriminatorNode.constant.value, typeManifestVisitor).value;
840
- return getConstantFragment({ ...scope, encoder, name, value });
841
- }
842
- function getFieldDiscriminatorConstantFragment(discriminatorNode, scope) {
843
- const { fields, prefix, typeManifestVisitor } = scope;
844
- const field = fields.find((f) => f.name === discriminatorNode.name);
845
- if (!field || !field.defaultValue || !(0, import_nodes13.isNode)(field.defaultValue, import_nodes13.VALUE_NODES)) {
846
- return null;
847
- }
848
- const name = (0, import_nodes13.camelCase)(`${prefix}_${discriminatorNode.name}`);
849
- const encoder = (0, import_visitors_core10.visit)(field.type, typeManifestVisitor).encoder;
850
- const value = (0, import_visitors_core10.visit)(field.defaultValue, typeManifestVisitor).value;
851
- return getConstantFragment({ ...scope, encoder, name, value });
852
- }
853
- function getConstantFragment(scope) {
854
- const { encoder, name, nameApi, value } = scope;
855
- const constantName = nameApi.constant(name);
856
- const constantFunction = nameApi.constantFunction(name);
857
- return mergeFragments(
858
- [
859
- value.mapRender((r) => `export const ${constantName} = ${r};`),
860
- encoder.mapRender((r) => `export function ${constantFunction}() { return ${r}.encode(${constantName}); }`)
861
- ],
862
- (r) => r.join("\n\n")
863
- );
864
- }
865
-
866
- // src/fragments/instructionExtraArgs.ts
867
- var import_visitors_core11 = require("@codama/visitors-core");
868
- function getInstructionExtraArgsFragment(scope) {
869
- const { instructionPath, extraArgsManifest, nameApi } = scope;
870
- const instructionNode = (0, import_visitors_core11.getLastNodeFromPath)(instructionPath);
871
- if ((instructionNode.extraArguments ?? []).length === 0) {
872
- return fragment("");
873
- }
874
- const instructionExtraName = nameApi.instructionExtraType(instructionNode.name);
875
- return fragmentFromTemplate("instructionExtraArgs.njk", {
876
- looseName: nameApi.dataArgsType(instructionExtraName),
877
- manifest: extraArgsManifest,
878
- strictName: nameApi.dataType(instructionExtraName)
879
- }).mergeImportsWith(extraArgsManifest.looseType);
880
- }
881
-
882
- // src/fragments/instructionFunction.ts
883
- var import_nodes18 = require("@codama/nodes");
884
- var import_visitors_core16 = require("@codama/visitors-core");
885
-
886
- // src/fragments/instructionInputResolved.ts
887
- var import_nodes15 = require("@codama/nodes");
888
- var import_visitors_core13 = require("@codama/visitors-core");
889
-
890
- // src/fragments/instructionInputDefault.ts
891
- var import_nodes14 = require("@codama/nodes");
892
- var import_visitors_core12 = require("@codama/visitors-core");
893
- function getInstructionInputDefaultFragment(scope) {
894
- const { input, optionalAccountStrategy, asyncResolvers, useAsync, nameApi, typeManifestVisitor, getImportFrom } = scope;
895
- if (!input.defaultValue) {
896
- return fragment("");
1082
+
1083
+ // src/fragments/instructionFunction.ts
1084
+ var import_nodes19 = require("@codama/nodes");
1085
+ var import_renderers_core8 = require("@codama/renderers-core");
1086
+ var import_visitors_core17 = require("@codama/visitors-core");
1087
+
1088
+ // src/fragments/instructionInputResolved.ts
1089
+ var import_nodes16 = require("@codama/nodes");
1090
+ var import_renderers_core6 = require("@codama/renderers-core");
1091
+ var import_visitors_core14 = require("@codama/visitors-core");
1092
+
1093
+ // src/fragments/instructionInputDefault.ts
1094
+ var import_nodes15 = require("@codama/nodes");
1095
+ var import_renderers_core5 = require("@codama/renderers-core");
1096
+ var import_visitors_core13 = require("@codama/visitors-core");
1097
+ function getInstructionInputDefaultFragment(scope) {
1098
+ const { input, optionalAccountStrategy, asyncResolvers, useAsync, nameApi, typeManifestVisitor, getImportFrom } = scope;
1099
+ if (!input.defaultValue) {
1100
+ return fragment``;
897
1101
  }
898
1102
  if (!useAsync && isAsyncDefaultValue(input.defaultValue, asyncResolvers)) {
899
- return fragment("");
1103
+ return fragment``;
900
1104
  }
901
1105
  const { defaultValue } = input;
902
1106
  const defaultFragment = (renderedValue, isWritable) => {
903
- const inputName = (0, import_nodes14.camelCase)(input.name);
904
- if (input.kind === "instructionAccountNode" && (0, import_nodes14.isNode)(defaultValue, "resolverValueNode")) {
905
- return fragment(`accounts.${inputName} = { ...accounts.${inputName}, ...${renderedValue} };`);
1107
+ const inputName = (0, import_nodes15.camelCase)(input.name);
1108
+ if (input.kind === "instructionAccountNode" && (0, import_nodes15.isNode)(defaultValue, "resolverValueNode")) {
1109
+ return fragment`accounts.${inputName} = { ...accounts.${inputName}, ...${renderedValue} };`;
906
1110
  }
907
1111
  if (input.kind === "instructionAccountNode" && isWritable === void 0) {
908
- return fragment(`accounts.${inputName}.value = ${renderedValue};`);
1112
+ return fragment`accounts.${inputName}.value = ${renderedValue};`;
909
1113
  }
910
1114
  if (input.kind === "instructionAccountNode") {
911
- return fragment(
912
- `accounts.${inputName}.value = ${renderedValue};
913
- accounts.${inputName}.isWritable = ${isWritable ? "true" : "false"}`
914
- );
1115
+ return fragment`accounts.${inputName}.value = ${renderedValue};\naccounts.${inputName}.isWritable = ${isWritable ? "true" : "false"}`;
915
1116
  }
916
- return fragment(`args.${inputName} = ${renderedValue};`);
1117
+ return fragment`args.${inputName} = ${renderedValue};`;
917
1118
  };
918
1119
  switch (defaultValue.kind) {
919
1120
  case "accountValueNode":
920
- const name = (0, import_nodes14.camelCase)(defaultValue.name);
1121
+ const name = (0, import_nodes15.camelCase)(defaultValue.name);
921
1122
  if (input.kind === "instructionAccountNode" && input.resolvedIsSigner && !input.isSigner) {
922
- return defaultFragment(`expectTransactionSigner(accounts.${name}.value).address`).addImports(
923
- "shared",
924
- "expectTransactionSigner"
1123
+ return (0, import_visitors_core13.pipe)(
1124
+ defaultFragment(`expectTransactionSigner(accounts.${name}.value).address`),
1125
+ (f) => addFragmentImports(f, "shared", ["expectTransactionSigner"])
925
1126
  );
926
1127
  }
927
1128
  if (input.kind === "instructionAccountNode") {
928
- return defaultFragment(`expectSome(accounts.${name}.value)`).addImports("shared", "expectSome");
1129
+ return (0, import_visitors_core13.pipe)(
1130
+ defaultFragment(`expectSome(accounts.${name}.value)`),
1131
+ (f) => addFragmentImports(f, "shared", ["expectSome"])
1132
+ );
929
1133
  }
930
- return defaultFragment(`expectAddress(accounts.${name}.value)`).addImports("shared", "expectAddress");
1134
+ return (0, import_visitors_core13.pipe)(
1135
+ defaultFragment(`expectAddress(accounts.${name}.value)`),
1136
+ (f) => addFragmentImports(f, "shared", ["expectAddress"])
1137
+ );
931
1138
  case "pdaValueNode":
932
- if ((0, import_nodes14.isNode)(defaultValue.pda, "pdaNode")) {
933
- const pdaProgram = defaultValue.pda.programId ? fragment(
934
- `'${defaultValue.pda.programId}' as Address<'${defaultValue.pda.programId}'>`
935
- ).addImports("solanaAddresses", "type Address") : fragment("programAddress");
1139
+ if ((0, import_nodes15.isNode)(defaultValue.pda, "pdaNode")) {
1140
+ const pdaProgram = defaultValue.pda.programId ? (0, import_visitors_core13.pipe)(
1141
+ fragment`'${defaultValue.pda.programId}' as Address<'${defaultValue.pda.programId}'>`,
1142
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"])
1143
+ ) : fragment`programAddress`;
936
1144
  const pdaSeeds2 = defaultValue.pda.seeds.flatMap((seed) => {
937
- if ((0, import_nodes14.isNode)(seed, "constantPdaSeedNode") && (0, import_nodes14.isNode)(seed.value, "programIdValueNode")) {
1145
+ if ((0, import_nodes15.isNode)(seed, "constantPdaSeedNode") && (0, import_nodes15.isNode)(seed.value, "programIdValueNode")) {
938
1146
  return [
939
- fragment(`getAddressEncoder().encode(${pdaProgram.render})`).mergeImportsWith(pdaProgram).addImports("solanaAddresses", "getAddressEncoder")
1147
+ (0, import_visitors_core13.pipe)(
1148
+ fragment`getAddressEncoder().encode(${pdaProgram})`,
1149
+ (f) => addFragmentImports(f, "solanaAddresses", ["getAddressEncoder"])
1150
+ )
940
1151
  ];
941
1152
  }
942
- if ((0, import_nodes14.isNode)(seed, "constantPdaSeedNode") && !(0, import_nodes14.isNode)(seed.value, "programIdValueNode")) {
943
- const typeManifest2 = (0, import_visitors_core12.visit)(seed.type, typeManifestVisitor);
944
- const valueManifest2 = (0, import_visitors_core12.visit)(seed.value, typeManifestVisitor);
945
- return [
946
- fragment(
947
- `${typeManifest2.encoder.render}.encode(${valueManifest2.value.render})`
948
- ).mergeImportsWith(typeManifest2.encoder, valueManifest2.value)
949
- ];
1153
+ if ((0, import_nodes15.isNode)(seed, "constantPdaSeedNode") && !(0, import_nodes15.isNode)(seed.value, "programIdValueNode")) {
1154
+ const typeManifest2 = (0, import_visitors_core13.visit)(seed.type, typeManifestVisitor);
1155
+ const valueManifest2 = (0, import_visitors_core13.visit)(seed.value, typeManifestVisitor);
1156
+ return [fragment`${typeManifest2.encoder}.encode(${valueManifest2.value})`];
950
1157
  }
951
- if ((0, import_nodes14.isNode)(seed, "variablePdaSeedNode")) {
952
- const typeManifest2 = (0, import_visitors_core12.visit)(seed.type, typeManifestVisitor);
1158
+ if ((0, import_nodes15.isNode)(seed, "variablePdaSeedNode")) {
1159
+ const typeManifest2 = (0, import_visitors_core13.visit)(seed.type, typeManifestVisitor);
953
1160
  const valueSeed = defaultValue.seeds.find((s) => s.name === seed.name)?.value;
954
1161
  if (!valueSeed) return [];
955
- if ((0, import_nodes14.isNode)(valueSeed, "accountValueNode")) {
1162
+ if ((0, import_nodes15.isNode)(valueSeed, "accountValueNode")) {
956
1163
  return [
957
- fragment(
958
- `${typeManifest2.encoder.render}.encode(expectAddress(accounts.${(0, import_nodes14.camelCase)(valueSeed.name)}.value))`
959
- ).mergeImportsWith(typeManifest2.encoder).addImports("shared", "expectAddress")
1164
+ (0, import_visitors_core13.pipe)(
1165
+ fragment`${typeManifest2.encoder}.encode(expectAddress(accounts.${(0, import_nodes15.camelCase)(valueSeed.name)}.value))`,
1166
+ (f) => addFragmentImports(f, "shared", ["expectAddress"])
1167
+ )
960
1168
  ];
961
1169
  }
962
- if ((0, import_nodes14.isNode)(valueSeed, "argumentValueNode")) {
1170
+ if ((0, import_nodes15.isNode)(valueSeed, "argumentValueNode")) {
963
1171
  return [
964
- fragment(
965
- `${typeManifest2.encoder.render}.encode(expectSome(args.${(0, import_nodes14.camelCase)(valueSeed.name)}))`
966
- ).mergeImportsWith(typeManifest2.encoder).addImports("shared", "expectSome")
1172
+ (0, import_visitors_core13.pipe)(
1173
+ fragment`${typeManifest2.encoder}.encode(expectSome(args.${(0, import_nodes15.camelCase)(valueSeed.name)}))`,
1174
+ (f) => addFragmentImports(f, "shared", ["expectSome"])
1175
+ )
967
1176
  ];
968
1177
  }
969
- const valueManifest2 = (0, import_visitors_core12.visit)(valueSeed, typeManifestVisitor);
970
- return [
971
- fragment(
972
- `${typeManifest2.encoder.render}.encode(${valueManifest2.value.render})`
973
- ).mergeImportsWith(typeManifest2.encoder, valueManifest2.value)
974
- ];
1178
+ const valueManifest2 = (0, import_visitors_core13.visit)(valueSeed, typeManifestVisitor);
1179
+ return [fragment`${typeManifest2.encoder}.encode(${valueManifest2.value})`];
975
1180
  }
976
1181
  return [];
977
1182
  });
978
- const pdaStatement = mergeFragments([pdaProgram, ...pdaSeeds2], ([p, ...s]) => {
979
- const programAddress2 = p === "programAddress" ? p : `programAddress: ${p}`;
980
- return `await getProgramDerivedAddress({ ${programAddress2}, seeds: [${s.join(", ")}] })`;
981
- }).addImports("solanaAddresses", "getProgramDerivedAddress");
982
- return defaultFragment(pdaStatement.render).mergeImportsWith(pdaStatement);
1183
+ return (0, import_visitors_core13.pipe)(
1184
+ mergeFragments([pdaProgram, ...pdaSeeds2], ([p, ...s]) => {
1185
+ const programAddress2 = p === "programAddress" ? p : `programAddress: ${p}`;
1186
+ return `await getProgramDerivedAddress({ ${programAddress2}, seeds: [${s.join(", ")}] })`;
1187
+ }),
1188
+ (f) => addFragmentImports(f, "solanaAddresses", ["getProgramDerivedAddress"]),
1189
+ (f) => (0, import_renderers_core5.mapFragmentContent)(f, (c) => defaultFragment(c).content)
1190
+ );
983
1191
  }
984
1192
  const pdaFunction = nameApi.pdaFindFunction(defaultValue.pda.name);
985
1193
  const pdaArgs = [];
986
1194
  const pdaSeeds = defaultValue.seeds.map((seed) => {
987
- if ((0, import_nodes14.isNode)(seed.value, "accountValueNode")) {
988
- return fragment(
989
- `${seed.name}: expectAddress(accounts.${(0, import_nodes14.camelCase)(seed.value.name)}.value)`
990
- ).addImports("shared", "expectAddress");
1195
+ if ((0, import_nodes15.isNode)(seed.value, "accountValueNode")) {
1196
+ return (0, import_visitors_core13.pipe)(
1197
+ fragment`${seed.name}: expectAddress(accounts.${(0, import_nodes15.camelCase)(seed.value.name)}.value)`,
1198
+ (f) => addFragmentImports(f, "shared", ["expectAddress"])
1199
+ );
991
1200
  }
992
- if ((0, import_nodes14.isNode)(seed.value, "argumentValueNode")) {
993
- return fragment(`${seed.name}: expectSome(args.${(0, import_nodes14.camelCase)(seed.value.name)})`).addImports(
994
- "shared",
995
- "expectSome"
1201
+ if ((0, import_nodes15.isNode)(seed.value, "argumentValueNode")) {
1202
+ return (0, import_visitors_core13.pipe)(
1203
+ fragment`${seed.name}: expectSome(args.${(0, import_nodes15.camelCase)(seed.value.name)})`,
1204
+ (f) => addFragmentImports(f, "shared", ["expectSome"])
996
1205
  );
997
1206
  }
998
- return (0, import_visitors_core12.visit)(seed.value, typeManifestVisitor).value.mapRender((r) => `${seed.name}: ${r}`);
1207
+ return (0, import_visitors_core13.pipe)(
1208
+ (0, import_visitors_core13.visit)(seed.value, typeManifestVisitor).value,
1209
+ (f) => (0, import_renderers_core5.mapFragmentContent)(f, (c) => `${seed.name}: ${c}`)
1210
+ );
999
1211
  });
1000
- const pdaSeedsFragment = mergeFragments(pdaSeeds, (renders) => renders.join(", ")).mapRender((r) => `{ ${r} }`);
1212
+ const pdaSeedsFragment = (0, import_visitors_core13.pipe)(
1213
+ mergeFragments(pdaSeeds, (renders) => renders.join(", ")),
1214
+ (f) => (0, import_renderers_core5.mapFragmentContent)(f, (c) => `{ ${c} }`)
1215
+ );
1001
1216
  if (pdaSeeds.length > 0) {
1002
- pdaArgs.push(pdaSeedsFragment.render);
1217
+ pdaArgs.push(pdaSeedsFragment.content);
1003
1218
  }
1004
- return defaultFragment(`await ${pdaFunction}(${pdaArgs.join(", ")})`).mergeImportsWith(pdaSeedsFragment).addImports(getImportFrom(defaultValue.pda), pdaFunction);
1219
+ const module2 = getImportFrom(defaultValue.pda);
1220
+ return (0, import_visitors_core13.pipe)(
1221
+ defaultFragment(`await ${pdaFunction}(${pdaArgs.join(", ")})`),
1222
+ (f) => mergeFragmentImports(f, [pdaSeedsFragment.imports]),
1223
+ (f) => addFragmentImports(f, module2, [pdaFunction])
1224
+ );
1005
1225
  case "publicKeyValueNode":
1006
- return defaultFragment(`'${defaultValue.publicKey}' as Address<'${defaultValue.publicKey}'>`).addImports(
1007
- "solanaAddresses",
1008
- "type Address"
1226
+ return (0, import_visitors_core13.pipe)(
1227
+ defaultFragment(`'${defaultValue.publicKey}' as Address<'${defaultValue.publicKey}'>`),
1228
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"])
1009
1229
  );
1010
1230
  case "programLinkNode":
1011
1231
  const programAddress = nameApi.programAddressConstant(defaultValue.name);
1012
- return defaultFragment(programAddress, false).addImports(getImportFrom(defaultValue), programAddress);
1232
+ return (0, import_visitors_core13.pipe)(
1233
+ defaultFragment(programAddress, false),
1234
+ (f) => addFragmentImports(f, getImportFrom(defaultValue), [programAddress])
1235
+ );
1013
1236
  case "programIdValueNode":
1014
1237
  if (optionalAccountStrategy === "programId" && input.kind === "instructionAccountNode" && input.isOptional) {
1015
- return fragment("");
1238
+ return fragment``;
1016
1239
  }
1017
1240
  return defaultFragment("programAddress", false);
1018
1241
  case "identityValueNode":
1019
1242
  case "payerValueNode":
1020
- return fragment("");
1243
+ return fragment``;
1021
1244
  case "accountBumpValueNode":
1022
- return defaultFragment(
1023
- `expectProgramDerivedAddress(accounts.${(0, import_nodes14.camelCase)(defaultValue.name)}.value)[1]`
1024
- ).addImports("shared", "expectProgramDerivedAddress");
1245
+ return (0, import_visitors_core13.pipe)(
1246
+ defaultFragment(`expectProgramDerivedAddress(accounts.${(0, import_nodes15.camelCase)(defaultValue.name)}.value)[1]`),
1247
+ (f) => addFragmentImports(f, "shared", ["expectProgramDerivedAddress"])
1248
+ );
1025
1249
  case "argumentValueNode":
1026
- return defaultFragment(`expectSome(args.${(0, import_nodes14.camelCase)(defaultValue.name)})`).addImports(
1027
- "shared",
1028
- "expectSome"
1250
+ return (0, import_visitors_core13.pipe)(
1251
+ defaultFragment(`expectSome(args.${(0, import_nodes15.camelCase)(defaultValue.name)})`),
1252
+ (f) => addFragmentImports(f, "shared", ["expectSome"])
1029
1253
  );
1030
1254
  case "resolverValueNode":
1031
1255
  const resolverFunction = nameApi.resolverFunction(defaultValue.name);
1032
1256
  const resolverAwait = useAsync && asyncResolvers.includes(defaultValue.name) ? "await " : "";
1033
- return defaultFragment(`${resolverAwait}${resolverFunction}(resolverScope)`).addImports(getImportFrom(defaultValue), resolverFunction).addFeatures(["instruction:resolverScopeVariable"]);
1257
+ return (0, import_visitors_core13.pipe)(
1258
+ defaultFragment(`${resolverAwait}${resolverFunction}(resolverScope)`),
1259
+ (f) => addFragmentImports(f, getImportFrom(defaultValue), [resolverFunction]),
1260
+ (f) => addFragmentFeatures(f, ["instruction:resolverScopeVariable"])
1261
+ );
1034
1262
  case "conditionalValueNode":
1035
1263
  const ifTrueRenderer = renderNestedInstructionDefault({
1036
1264
  ...scope,
@@ -1041,51 +1269,58 @@ accounts.${inputName}.isWritable = ${isWritable ? "true" : "false"}`
1041
1269
  defaultValue: defaultValue.ifFalse
1042
1270
  });
1043
1271
  if (!ifTrueRenderer && !ifFalseRenderer) {
1044
- return fragment("");
1272
+ return fragment``;
1045
1273
  }
1046
- const conditionalFragment = fragment("");
1274
+ let conditionalFragment = fragment``;
1047
1275
  if (ifTrueRenderer) {
1048
- conditionalFragment.mergeImportsWith(ifTrueRenderer).mergeFeaturesWith(ifTrueRenderer);
1276
+ conditionalFragment = mergeFragments([conditionalFragment, ifTrueRenderer], (c) => c[0]);
1049
1277
  }
1050
1278
  if (ifFalseRenderer) {
1051
- conditionalFragment.mergeImportsWith(ifFalseRenderer).mergeFeaturesWith(ifFalseRenderer);
1279
+ conditionalFragment = mergeFragments([conditionalFragment, ifFalseRenderer], (c) => c[0]);
1052
1280
  }
1053
1281
  const negatedCondition = !ifTrueRenderer;
1054
1282
  let condition = "true";
1055
- if ((0, import_nodes14.isNode)(defaultValue.condition, "resolverValueNode")) {
1283
+ if ((0, import_nodes15.isNode)(defaultValue.condition, "resolverValueNode")) {
1056
1284
  const conditionalResolverFunction = nameApi.resolverFunction(defaultValue.condition.name);
1057
- conditionalFragment.addImports(getImportFrom(defaultValue.condition), conditionalResolverFunction).addFeatures(["instruction:resolverScopeVariable"]);
1285
+ const module3 = getImportFrom(defaultValue.condition);
1286
+ conditionalFragment = (0, import_visitors_core13.pipe)(
1287
+ conditionalFragment,
1288
+ (f) => addFragmentImports(f, module3, [conditionalResolverFunction]),
1289
+ (f) => addFragmentFeatures(f, ["instruction:resolverScopeVariable"])
1290
+ );
1058
1291
  const conditionalResolverAwait = useAsync && asyncResolvers.includes(defaultValue.condition.name) ? "await " : "";
1059
1292
  condition = `${conditionalResolverAwait}${conditionalResolverFunction}(resolverScope)`;
1060
1293
  condition = negatedCondition ? `!${condition}` : condition;
1061
1294
  } else {
1062
- const comparedInputName = (0, import_nodes14.isNode)(defaultValue.condition, "accountValueNode") ? `accounts.${(0, import_nodes14.camelCase)(defaultValue.condition.name)}.value` : `args.${(0, import_nodes14.camelCase)(defaultValue.condition.name)}`;
1295
+ const comparedInputName = (0, import_nodes15.isNode)(defaultValue.condition, "accountValueNode") ? `accounts.${(0, import_nodes15.camelCase)(defaultValue.condition.name)}.value` : `args.${(0, import_nodes15.camelCase)(defaultValue.condition.name)}`;
1063
1296
  if (defaultValue.value) {
1064
- const comparedValue = (0, import_visitors_core12.visit)(defaultValue.value, typeManifestVisitor).value;
1065
- conditionalFragment.mergeImportsWith(comparedValue).mergeFeaturesWith(comparedValue);
1297
+ const comparedValue = (0, import_visitors_core13.visit)(defaultValue.value, typeManifestVisitor).value;
1298
+ conditionalFragment = mergeFragments([conditionalFragment, comparedValue], (c) => c[0]);
1066
1299
  const operator = negatedCondition ? "!==" : "===";
1067
- condition = `${comparedInputName} ${operator} ${comparedValue.render}`;
1300
+ condition = `${comparedInputName} ${operator} ${comparedValue.content}`;
1068
1301
  } else {
1069
1302
  condition = negatedCondition ? `!${comparedInputName}` : comparedInputName;
1070
1303
  }
1071
1304
  }
1072
1305
  if (ifTrueRenderer && ifFalseRenderer) {
1073
- return conditionalFragment.setRender(
1306
+ return (0, import_renderers_core5.setFragmentContent)(
1307
+ conditionalFragment,
1074
1308
  `if (${condition}) {
1075
- ${ifTrueRenderer.render}
1309
+ ${ifTrueRenderer.content}
1076
1310
  } else {
1077
- ${ifFalseRenderer.render}
1311
+ ${ifFalseRenderer.content}
1078
1312
  }`
1079
1313
  );
1080
1314
  }
1081
- return conditionalFragment.setRender(
1315
+ return (0, import_renderers_core5.setFragmentContent)(
1316
+ conditionalFragment,
1082
1317
  `if (${condition}) {
1083
- ${ifTrueRenderer ? ifTrueRenderer.render : ifFalseRenderer?.render}
1318
+ ${ifTrueRenderer ? ifTrueRenderer.content : ifFalseRenderer?.content}
1084
1319
  }`
1085
1320
  );
1086
1321
  default:
1087
- const valueManifest = (0, import_visitors_core12.visit)(defaultValue, typeManifestVisitor).value;
1088
- return defaultFragment(valueManifest.render).mergeImportsWith(valueManifest);
1322
+ const valueManifest = (0, import_visitors_core13.visit)(defaultValue, typeManifestVisitor).value;
1323
+ return (0, import_visitors_core13.pipe)(valueManifest, (f) => (0, import_renderers_core5.mapFragmentContent)(f, (c) => defaultFragment(c).content));
1089
1324
  }
1090
1325
  }
1091
1326
  function renderNestedInstructionDefault(scope) {
@@ -1099,174 +1334,170 @@ function renderNestedInstructionDefault(scope) {
1099
1334
 
1100
1335
  // src/fragments/instructionInputResolved.ts
1101
1336
  function getInstructionInputResolvedFragment(scope) {
1102
- const instructionNode = (0, import_visitors_core13.getLastNodeFromPath)(scope.instructionPath);
1337
+ const instructionNode = (0, import_visitors_core14.getLastNodeFromPath)(scope.instructionPath);
1103
1338
  const resolvedInputFragments = scope.resolvedInputs.flatMap((input) => {
1104
1339
  const inputFragment = getInstructionInputDefaultFragment({
1105
1340
  ...scope,
1106
1341
  input,
1107
- optionalAccountStrategy: (0, import_nodes15.parseOptionalAccountStrategy)(instructionNode.optionalAccountStrategy)
1342
+ optionalAccountStrategy: (0, import_nodes16.parseOptionalAccountStrategy)(instructionNode.optionalAccountStrategy)
1108
1343
  });
1109
- if (!inputFragment.render) return [];
1110
- const camelName = (0, import_nodes15.camelCase)(input.name);
1344
+ if (!inputFragment.content) return [];
1345
+ const camelName = (0, import_nodes16.camelCase)(input.name);
1111
1346
  return [
1112
- inputFragment.mapRender(
1113
- (r) => (0, import_nodes15.isNode)(input, "instructionArgumentNode") ? `if (!args.${camelName}) {
1114
- ${r}
1347
+ (0, import_renderers_core6.mapFragmentContent)(
1348
+ inputFragment,
1349
+ (c) => (0, import_nodes16.isNode)(input, "instructionArgumentNode") ? `if (!args.${camelName}) {
1350
+ ${c}
1115
1351
  }` : `if (!accounts.${camelName}.value) {
1116
- ${r}
1352
+ ${c}
1117
1353
  }`
1118
1354
  )
1119
1355
  ];
1120
1356
  });
1121
1357
  if (resolvedInputFragments.length === 0) {
1122
- return fragment("");
1358
+ return fragment``;
1123
1359
  }
1124
- return mergeFragments(
1125
- [fragment("// Resolve default values."), ...resolvedInputFragments],
1126
- (renders) => renders.join("\n")
1127
- );
1360
+ return mergeFragments([fragment`// Resolve default values.`, ...resolvedInputFragments], (c) => c.join("\n"));
1128
1361
  }
1129
1362
 
1130
1363
  // src/fragments/instructionInputType.ts
1131
- var import_nodes16 = require("@codama/nodes");
1132
- var import_visitors_core14 = require("@codama/visitors-core");
1364
+ var import_nodes17 = require("@codama/nodes");
1365
+ var import_renderers_core7 = require("@codama/renderers-core");
1366
+ var import_visitors_core15 = require("@codama/visitors-core");
1133
1367
  function getInstructionInputTypeFragment(scope) {
1134
1368
  const { instructionPath, useAsync, nameApi } = scope;
1135
- const instructionNode = (0, import_visitors_core14.getLastNodeFromPath)(instructionPath);
1369
+ const instructionNode = (0, import_visitors_core15.getLastNodeFromPath)(instructionPath);
1136
1370
  const instructionInputType = useAsync ? nameApi.instructionAsyncInputType(instructionNode.name) : nameApi.instructionSyncInputType(instructionNode.name);
1137
- const accountsFragment = getAccountsFragment(scope);
1138
1371
  const [dataArgumentsFragment, customDataArgumentsFragment] = getDataArgumentsFragments(scope);
1139
- const extraArgumentsFragment = getExtraArgumentsFragment(scope);
1140
- const remainingAccountsFragment = getRemainingAccountsFragment(instructionNode);
1141
- return fragmentFromTemplate("instructionInputType.njk", {
1142
- accountsFragment,
1143
- customDataArgumentsFragment,
1144
- dataArgumentsFragment,
1145
- extraArgumentsFragment,
1146
- instruction: instructionNode,
1147
- instructionInputType,
1148
- remainingAccountsFragment
1149
- }).mergeImportsWith(
1150
- accountsFragment,
1151
- dataArgumentsFragment,
1152
- customDataArgumentsFragment,
1153
- extraArgumentsFragment,
1154
- remainingAccountsFragment
1155
- ).addImports("solanaAddresses", ["type Address"]);
1372
+ let accountTypeParams = "";
1373
+ if (instructionNode.accounts.length > 0) {
1374
+ accountTypeParams = instructionNode.accounts.map((account) => `TAccount${(0, import_nodes17.pascalCase)(account.name)} extends string = string`).join(", ");
1375
+ accountTypeParams = `<${accountTypeParams}>`;
1376
+ }
1377
+ const typeBodyFragment = mergeFragments(
1378
+ [
1379
+ getAccountsFragment(scope),
1380
+ dataArgumentsFragment,
1381
+ getExtraArgumentsFragment(scope),
1382
+ getRemainingAccountsFragment(instructionNode)
1383
+ ],
1384
+ (c) => c.join("\n")
1385
+ );
1386
+ return fragment`export type ${instructionInputType}${accountTypeParams} = ${customDataArgumentsFragment} {
1387
+ ${typeBodyFragment}
1388
+ }`;
1156
1389
  }
1157
1390
  function getAccountsFragment(scope) {
1158
1391
  const { instructionPath, resolvedInputs, useAsync, asyncResolvers } = scope;
1159
- const instructionNode = (0, import_visitors_core14.getLastNodeFromPath)(instructionPath);
1392
+ const instructionNode = (0, import_visitors_core15.getLastNodeFromPath)(instructionPath);
1160
1393
  const fragments = instructionNode.accounts.map((account) => {
1161
1394
  const resolvedAccount = resolvedInputs.find(
1162
1395
  (input) => input.kind === "instructionAccountNode" && input.name === account.name
1163
1396
  );
1164
- const hasDefaultValue = !!resolvedAccount.defaultValue && !(0, import_nodes16.isNode)(resolvedAccount.defaultValue, ["identityValueNode", "payerValueNode"]) && (useAsync || !isAsyncDefaultValue(resolvedAccount.defaultValue, asyncResolvers));
1165
- const accountDocs = (0, import_nodes16.parseDocs)(account.docs);
1166
- const docblock = accountDocs.length > 0 ? jsDocblock(accountDocs) : "";
1397
+ const hasDefaultValue = !!resolvedAccount.defaultValue && !(0, import_nodes17.isNode)(resolvedAccount.defaultValue, ["identityValueNode", "payerValueNode"]) && (useAsync || !isAsyncDefaultValue(resolvedAccount.defaultValue, asyncResolvers));
1398
+ const docs = getDocblockFragment(account.docs ?? [], true);
1167
1399
  const optionalSign = hasDefaultValue || resolvedAccount.isOptional ? "?" : "";
1168
- return getAccountTypeFragment2(resolvedAccount).mapRender(
1169
- (r) => `${docblock}${(0, import_nodes16.camelCase)(account.name)}${optionalSign}: ${r};`
1170
- );
1400
+ return fragment`${docs}${(0, import_nodes17.camelCase)(account.name)}${optionalSign}: ${getAccountTypeFragment2(resolvedAccount)};`;
1171
1401
  });
1172
- return mergeFragments(fragments, (r) => r.join("\n"));
1402
+ return mergeFragments(fragments, (c) => c.join("\n"));
1173
1403
  }
1174
1404
  function getAccountTypeFragment2(account) {
1175
- const typeParam = `TAccount${(0, import_nodes16.pascalCase)(account.name)}`;
1176
- if (account.isPda && account.isSigner === false) {
1177
- return fragment(`ProgramDerivedAddress<${typeParam}>`).addImports("solanaAddresses", [
1178
- "type ProgramDerivedAddress"
1179
- ]);
1180
- }
1181
- if (account.isPda && account.isSigner === "either") {
1182
- return fragment(`ProgramDerivedAddress<${typeParam}> | TransactionSigner<${typeParam}>`).addImports("solanaAddresses", ["type ProgramDerivedAddress"]).addImports("solanaSigners", ["type TransactionSigner"]);
1183
- }
1184
- if (account.isSigner === "either") {
1185
- return fragment(`Address<${typeParam}> | TransactionSigner<${typeParam}>`).addImports("solanaAddresses", ["type Address"]).addImports("solanaSigners", ["type TransactionSigner"]);
1186
- }
1187
- if (account.isSigner) {
1188
- return fragment(`TransactionSigner<${typeParam}>`).addImports("solanaSigners", ["type TransactionSigner"]);
1189
- }
1190
- return fragment(`Address<${typeParam}>`).addImports("solanaAddresses", ["type Address"]);
1405
+ const typeParam = `TAccount${(0, import_nodes17.pascalCase)(account.name)}`;
1406
+ const address = use("type Address", "solanaAddresses");
1407
+ const signer = use("type TransactionSigner", "solanaSigners");
1408
+ const pda = use("type ProgramDerivedAddress", "solanaAddresses");
1409
+ if (account.isPda && account.isSigner === false) return fragment`${pda}<${typeParam}>`;
1410
+ if (account.isPda && account.isSigner === "either") return fragment`${pda}<${typeParam}> | ${signer}<${typeParam}>`;
1411
+ if (account.isSigner === "either") return fragment`${address}<${typeParam}> | ${signer}<${typeParam}>`;
1412
+ if (account.isSigner) return fragment`${signer}<${typeParam}>`;
1413
+ return fragment`${address}<${typeParam}>`;
1191
1414
  }
1192
1415
  function getDataArgumentsFragments(scope) {
1193
1416
  const { instructionPath, nameApi } = scope;
1194
- const instructionNode = (0, import_visitors_core14.getLastNodeFromPath)(instructionPath);
1417
+ const instructionNode = (0, import_visitors_core15.getLastNodeFromPath)(instructionPath);
1195
1418
  const customData = scope.customInstructionData.get(instructionNode.name);
1196
1419
  if (customData) {
1197
1420
  return [
1198
- fragment(""),
1199
- fragment(nameApi.dataArgsType(customData.importAs)).mergeImportsWith(scope.dataArgsManifest.looseType).mapRender((r) => `${r} & `)
1421
+ void 0,
1422
+ (0, import_visitors_core15.pipe)(
1423
+ fragment`${nameApi.dataArgsType(customData.importAs)}`,
1424
+ (f) => mergeFragmentImports(f, [scope.dataArgsManifest.looseType.imports]),
1425
+ (f) => (0, import_renderers_core7.mapFragmentContent)(f, (c) => `${c} & `)
1426
+ )
1200
1427
  ];
1201
1428
  }
1202
1429
  const instructionDataName = nameApi.instructionDataType(instructionNode.name);
1203
1430
  const dataArgsType = nameApi.dataArgsType(instructionDataName);
1204
1431
  const fragments = instructionNode.arguments.flatMap((arg) => {
1205
- const argFragment = getArgumentFragment(arg, fragment(dataArgsType), scope.resolvedInputs, scope.renamedArgs);
1432
+ const argFragment = getArgumentFragment(arg, dataArgsType, scope.resolvedInputs, scope.renamedArgs);
1206
1433
  return argFragment ? [argFragment] : [];
1207
1434
  });
1208
- return [mergeFragments(fragments, (r) => r.join("\n")), fragment("")];
1435
+ return [fragments.length === 0 ? void 0 : mergeFragments(fragments, (c) => c.join("\n")), fragment``];
1209
1436
  }
1210
1437
  function getExtraArgumentsFragment(scope) {
1211
1438
  const { instructionPath, nameApi } = scope;
1212
- const instructionNode = (0, import_visitors_core14.getLastNodeFromPath)(instructionPath);
1439
+ const instructionNode = (0, import_visitors_core15.getLastNodeFromPath)(instructionPath);
1213
1440
  const instructionExtraName = nameApi.instructionExtraType(instructionNode.name);
1214
1441
  const extraArgsType = nameApi.dataArgsType(instructionExtraName);
1215
1442
  const fragments = (instructionNode.extraArguments ?? []).flatMap((arg) => {
1216
- const argFragment = getArgumentFragment(arg, fragment(extraArgsType), scope.resolvedInputs, scope.renamedArgs);
1443
+ const argFragment = getArgumentFragment(arg, extraArgsType, scope.resolvedInputs, scope.renamedArgs);
1217
1444
  return argFragment ? [argFragment] : [];
1218
1445
  });
1219
- return mergeFragments(fragments, (r) => r.join("\n"));
1446
+ if (fragments.length === 0) return;
1447
+ return mergeFragments(fragments, (c) => c.join("\n"));
1220
1448
  }
1221
1449
  function getArgumentFragment(arg, argsType, resolvedInputs, renamedArgs) {
1222
1450
  const resolvedArg = resolvedInputs.find(
1223
- (input) => (0, import_nodes16.isNode)(input, "instructionArgumentNode") && input.name === arg.name
1451
+ (input) => (0, import_nodes17.isNode)(input, "instructionArgumentNode") && input.name === arg.name
1224
1452
  );
1225
1453
  if (arg.defaultValue && arg.defaultValueStrategy === "omitted") return null;
1226
1454
  const renamedName = renamedArgs.get(arg.name) ?? arg.name;
1227
1455
  const optionalSign = arg.defaultValue || resolvedArg?.defaultValue ? "?" : "";
1228
- return argsType.mapRender((r) => `${(0, import_nodes16.camelCase)(renamedName)}${optionalSign}: ${r}["${(0, import_nodes16.camelCase)(arg.name)}"];`);
1456
+ return fragment`${(0, import_nodes17.camelCase)(renamedName)}${optionalSign}: ${argsType}["${(0, import_nodes17.camelCase)(arg.name)}"];`;
1229
1457
  }
1230
1458
  function getRemainingAccountsFragment(instructionNode) {
1231
1459
  const fragments = (instructionNode.remainingAccounts ?? []).flatMap((remainingAccountsNode) => {
1232
- if ((0, import_nodes16.isNode)(remainingAccountsNode.value, "resolverValueNode")) return [];
1460
+ if ((0, import_nodes17.isNode)(remainingAccountsNode.value, "resolverValueNode")) return [];
1233
1461
  const { name } = remainingAccountsNode.value;
1234
- const allArguments = (0, import_nodes16.getAllInstructionArguments)(instructionNode);
1462
+ const allArguments = (0, import_nodes17.getAllInstructionArguments)(instructionNode);
1235
1463
  const argumentExists = allArguments.some((arg) => arg.name === name);
1236
1464
  if (argumentExists) return [];
1237
1465
  const isSigner = remainingAccountsNode.isSigner ?? false;
1238
1466
  const optionalSign = remainingAccountsNode.isOptional ?? false ? "?" : "";
1239
- const signerFragment = fragment(`TransactionSigner`).addImports("solanaSigners", ["type TransactionSigner"]);
1240
- const addressFragment = fragment(`Address`).addImports("solanaAddresses", ["type Address"]);
1241
- return (() => {
1242
- if (isSigner === "either") {
1243
- return mergeFragments([signerFragment, addressFragment], (r) => r.join(" | "));
1244
- }
1467
+ const signerFragment = use("type TransactionSigner", "solanaSigners");
1468
+ const addressFragment = use("type Address", "solanaAddresses");
1469
+ const typeFragment = (() => {
1470
+ if (isSigner === "either") return fragment`${signerFragment} | ${addressFragment}`;
1245
1471
  return isSigner ? signerFragment : addressFragment;
1246
- })().mapRender((r) => `${(0, import_nodes16.camelCase)(name)}${optionalSign}: Array<${r}>;`);
1472
+ })();
1473
+ return fragment`${(0, import_nodes17.camelCase)(name)}${optionalSign}: Array<${typeFragment}>;`;
1247
1474
  });
1248
- return mergeFragments(fragments, (r) => r.join("\n"));
1475
+ if (fragments.length === 0) return;
1476
+ return mergeFragments(fragments, (c) => c.join("\n"));
1249
1477
  }
1250
1478
 
1251
1479
  // src/fragments/instructionRemainingAccounts.ts
1252
- var import_nodes17 = require("@codama/nodes");
1253
- var import_visitors_core15 = require("@codama/visitors-core");
1480
+ var import_nodes18 = require("@codama/nodes");
1481
+ var import_visitors_core16 = require("@codama/visitors-core");
1254
1482
  function getInstructionRemainingAccountsFragment(scope) {
1255
- const { remainingAccounts } = (0, import_visitors_core15.getLastNodeFromPath)(scope.instructionPath);
1256
- const fragments = (remainingAccounts ?? []).flatMap((r) => getRemainingAccountsFragment2(r, scope));
1257
- if (fragments.length === 0) return fragment("");
1258
- return mergeFragments(
1259
- fragments,
1260
- (r) => `// Remaining accounts.
1261
- const remainingAccounts: AccountMeta[] = ${r.length === 1 ? r[0] : `[...${r.join(", ...")}]`}`
1262
- ).addImports("solanaInstructions", ["type AccountMeta"]);
1483
+ const { remainingAccounts } = (0, import_visitors_core16.getLastNodeFromPath)(scope.instructionPath);
1484
+ const fragments = (remainingAccounts ?? []).flatMap((a) => getRemainingAccountsFragment2(a, scope));
1485
+ if (fragments.length === 0) return;
1486
+ return (0, import_visitors_core16.pipe)(
1487
+ mergeFragments(
1488
+ fragments,
1489
+ (c) => `// Remaining accounts.
1490
+ const remainingAccounts: AccountMeta[] = ${c.length === 1 ? c[0] : `[...${c.join(", ...")}]`}`
1491
+ ),
1492
+ (f) => addFragmentImports(f, "solanaInstructions", ["type AccountMeta"])
1493
+ );
1263
1494
  }
1264
1495
  function getRemainingAccountsFragment2(remainingAccounts, scope) {
1265
1496
  const remainingAccountsFragment = (() => {
1266
- if ((0, import_nodes17.isNode)(remainingAccounts.value, "argumentValueNode")) {
1497
+ if ((0, import_nodes18.isNode)(remainingAccounts.value, "argumentValueNode")) {
1267
1498
  return getArgumentValueNodeFragment2(remainingAccounts, scope);
1268
1499
  }
1269
- if ((0, import_nodes17.isNode)(remainingAccounts.value, "resolverValueNode")) {
1500
+ if ((0, import_nodes18.isNode)(remainingAccounts.value, "resolverValueNode")) {
1270
1501
  return getResolverValueNodeFragment2(remainingAccounts, scope);
1271
1502
  }
1272
1503
  return null;
@@ -1275,67 +1506,52 @@ function getRemainingAccountsFragment2(remainingAccounts, scope) {
1275
1506
  return [remainingAccountsFragment];
1276
1507
  }
1277
1508
  function getArgumentValueNodeFragment2(remainingAccounts, scope) {
1278
- const instructionNode = (0, import_visitors_core15.getLastNodeFromPath)(scope.instructionPath);
1279
- (0, import_nodes17.assertIsNode)(remainingAccounts.value, "argumentValueNode");
1280
- const argumentName = (0, import_nodes17.camelCase)(remainingAccounts.value.name);
1509
+ const instructionNode = (0, import_visitors_core16.getLastNodeFromPath)(scope.instructionPath);
1510
+ (0, import_nodes18.assertIsNode)(remainingAccounts.value, "argumentValueNode");
1511
+ const argumentName = (0, import_nodes18.camelCase)(remainingAccounts.value.name);
1281
1512
  const isOptional = remainingAccounts.isOptional ?? false;
1282
1513
  const isSigner = remainingAccounts.isSigner ?? false;
1283
1514
  const isWritable = remainingAccounts.isWritable ?? false;
1284
- const nonSignerRole = isWritable ? "AccountRole.WRITABLE" : "AccountRole.READONLY";
1285
- const signerRole = isWritable ? "AccountRole.WRITABLE_SIGNER" : "AccountRole.READONLY_SIGNER";
1515
+ const accountRole = use("AccountRole", "solanaInstructions");
1516
+ const nonSignerRole = isWritable ? fragment`${accountRole}.WRITABLE` : fragment`${accountRole}.READONLY`;
1517
+ const signerRole = isWritable ? fragment`${accountRole}.WRITABLE_SIGNER` : fragment`${accountRole}.READONLY_SIGNER`;
1286
1518
  const role = isSigner === true ? signerRole : nonSignerRole;
1287
1519
  const argumentArray = isOptional ? `(args.${argumentName} ?? [])` : `args.${argumentName}`;
1288
- const allArguments = (0, import_nodes17.getAllInstructionArguments)(instructionNode);
1520
+ const allArguments = (0, import_nodes18.getAllInstructionArguments)(instructionNode);
1289
1521
  const argumentExists = allArguments.some((arg) => arg.name === remainingAccounts.value.name);
1290
1522
  if (argumentExists || isSigner === false) {
1291
- return fragment(`${argumentArray}.map((address) => ({ address, role: ${role} }))`).addImports(
1292
- "solanaInstructions",
1293
- ["AccountRole"]
1294
- );
1523
+ return fragment`${argumentArray}.map((address) => ({ address, role: ${role} }))`;
1295
1524
  }
1296
1525
  if (isSigner === "either") {
1297
- return fragment(
1298
- `${argumentArray}.map((addressOrSigner) => (isTransactionSigner(addressOrSigner)
1299
- ? { address: addressOrSigner.address, role: ${role}, signer: addressOrSigner }
1300
- : { address: addressOrSigner, role: ${role} }
1301
- ))`
1302
- ).addImports("solanaInstructions", ["AccountRole"]).addImports("shared", ["isTransactionSigner"]);
1526
+ return fragment`${argumentArray}.map((addressOrSigner) => (${use("isTransactionSigner", "shared")}(addressOrSigner) ? { address: addressOrSigner.address, role: ${role}, signer: addressOrSigner } : { address: addressOrSigner, role: ${role} }))`;
1303
1527
  }
1304
- return fragment(
1305
- `${argumentArray}.map((signer) => ({ address: signer.address, role: ${signerRole}, signer }))`
1306
- ).addImports("solanaInstructions", ["AccountRole"]);
1528
+ return fragment`${argumentArray}.map((signer) => ({ address: signer.address, role: ${signerRole}, signer }))`;
1307
1529
  }
1308
1530
  function getResolverValueNodeFragment2(remainingAccounts, scope) {
1309
- (0, import_nodes17.assertIsNode)(remainingAccounts.value, "resolverValueNode");
1531
+ (0, import_nodes18.assertIsNode)(remainingAccounts.value, "resolverValueNode");
1310
1532
  const isAsync = scope.asyncResolvers.includes(remainingAccounts.value.name);
1311
1533
  if (!scope.useAsync && isAsync) return null;
1312
1534
  const awaitKeyword = scope.useAsync && isAsync ? "await " : "";
1313
- const functionName = scope.nameApi.resolverFunction(remainingAccounts.value.name);
1314
- return fragment(`${awaitKeyword}${functionName}(resolverScope)`).addImports(scope.getImportFrom(remainingAccounts.value), functionName).addFeatures(["instruction:resolverScopeVariable"]);
1535
+ const functionName = use(
1536
+ scope.nameApi.resolverFunction(remainingAccounts.value.name),
1537
+ scope.getImportFrom(remainingAccounts.value)
1538
+ );
1539
+ return (0, import_visitors_core16.pipe)(
1540
+ fragment`${awaitKeyword}${functionName}(resolverScope)`,
1541
+ (f) => addFragmentFeatures(f, ["instruction:resolverScopeVariable"])
1542
+ );
1315
1543
  }
1316
1544
 
1317
1545
  // src/fragments/instructionFunction.ts
1318
1546
  function getInstructionFunctionFragment(scope) {
1319
- const {
1320
- useAsync,
1321
- instructionPath,
1322
- resolvedInputs,
1323
- renamedArgs,
1324
- dataArgsManifest,
1325
- asyncResolvers,
1326
- nameApi,
1327
- customInstructionData
1328
- } = scope;
1329
- const instructionNode = (0, import_visitors_core16.getLastNodeFromPath)(instructionPath);
1330
- const programNode = (0, import_visitors_core16.findProgramNodeFromPath)(instructionPath);
1331
- if (useAsync && !hasAsyncFunction(instructionNode, resolvedInputs, asyncResolvers)) {
1332
- return fragment("");
1333
- }
1547
+ const { useAsync, instructionPath, resolvedInputs, renamedArgs, asyncResolvers, nameApi, customInstructionData } = scope;
1548
+ const instructionNode = (0, import_visitors_core17.getLastNodeFromPath)(instructionPath);
1549
+ const programNode = (0, import_visitors_core17.findProgramNodeFromPath)(instructionPath);
1550
+ if (useAsync && !hasAsyncFunction(instructionNode, resolvedInputs, asyncResolvers)) return;
1334
1551
  const customData = customInstructionData.get(instructionNode.name);
1335
1552
  const hasAccounts = instructionNode.accounts.length > 0;
1336
- const hasLegacyOptionalAccounts = instructionNode.optionalAccountStrategy === "omitted" && instructionNode.accounts.some((account) => account.isOptional);
1337
1553
  const instructionDependencies = getInstructionDependencies(instructionNode, asyncResolvers, useAsync);
1338
- const argDependencies = instructionDependencies.filter((0, import_nodes18.isNodeFilter)("argumentValueNode")).map((node) => node.name);
1554
+ const argDependencies = instructionDependencies.filter((0, import_nodes19.isNodeFilter)("argumentValueNode")).map((node) => node.name);
1339
1555
  const hasData = !!customData || instructionNode.arguments.length > 0;
1340
1556
  const argIsNotOmitted = (arg) => !(arg.defaultValue && arg.defaultValueStrategy === "omitted");
1341
1557
  const argIsDependent = (arg) => argDependencies.includes(arg.name);
@@ -1348,164 +1564,296 @@ function getInstructionFunctionFragment(scope) {
1348
1564
  const hasExtraArgs = (instructionNode.extraArguments ?? []).filter(
1349
1565
  (field) => argIsNotOmitted(field) && (argIsDependent(field) || argHasDefaultValue(field))
1350
1566
  ).length > 0;
1351
- const hasRemainingAccountArgs = (instructionNode.remainingAccounts ?? []).filter(({ value }) => (0, import_nodes18.isNode)(value, "argumentValueNode")).length > 0;
1567
+ const hasRemainingAccountArgs = (instructionNode.remainingAccounts ?? []).filter(({ value }) => (0, import_nodes19.isNode)(value, "argumentValueNode")).length > 0;
1352
1568
  const hasAnyArgs = hasDataArgs || hasExtraArgs || hasRemainingAccountArgs;
1353
1569
  const hasInput = hasAccounts || hasAnyArgs;
1354
- const instructionDataName = nameApi.instructionDataType(instructionNode.name);
1355
- const programAddressConstant = nameApi.programAddressConstant(programNode.name);
1356
- const encoderFunction = customData ? dataArgsManifest.encoder.render : `${nameApi.encoderFunction(instructionDataName)}()`;
1357
- const argsTypeFragment = fragment(
1358
- customData ? dataArgsManifest.looseType.render : nameApi.dataArgsType(instructionDataName)
1359
- );
1360
- if (customData) {
1361
- argsTypeFragment.mergeImportsWith(dataArgsManifest.looseType, dataArgsManifest.encoder);
1362
- }
1570
+ const programAddressConstant = use(nameApi.programAddressConstant(programNode.name), "generatedPrograms");
1363
1571
  const functionName = useAsync ? nameApi.instructionAsyncFunction(instructionNode.name) : nameApi.instructionSyncFunction(instructionNode.name);
1364
- const typeParamsFragment = getTypeParams(instructionNode, programAddressConstant);
1365
- const instructionTypeFragment = getInstructionType(scope);
1366
- const inputTypeFragment = getInstructionInputTypeFragment(scope);
1367
- const inputTypeCallFragment = getInputTypeCall(scope);
1368
- const renamedArgsText = [...renamedArgs.entries()].map(([k, v]) => `${k}: input.${v}`).join(", ");
1369
1572
  const resolvedInputsFragment = getInstructionInputResolvedFragment(scope);
1370
1573
  const remainingAccountsFragment = getInstructionRemainingAccountsFragment(scope);
1371
1574
  const byteDeltaFragment = getInstructionByteDeltaFragment(scope);
1372
- const resolvedFragment = mergeFragments(
1575
+ const resolvedInputFragment = mergeFragments(
1373
1576
  [resolvedInputsFragment, remainingAccountsFragment, byteDeltaFragment],
1374
- (renders) => renders.join("\n\n")
1577
+ (content) => content.join("\n\n")
1375
1578
  );
1376
- const hasRemainingAccounts = remainingAccountsFragment.render !== "";
1377
- const hasByteDeltas = byteDeltaFragment.render !== "";
1378
- const hasResolver = resolvedFragment.hasFeatures("instruction:resolverScopeVariable");
1379
- const getReturnType = (instructionType) => {
1380
- let returnType = instructionType;
1381
- if (hasByteDeltas) {
1382
- returnType = `${returnType} & InstructionWithByteDelta`;
1383
- }
1384
- return useAsync ? `Promise<${returnType}>` : returnType;
1385
- };
1386
- const functionFragment = fragmentFromTemplate("instructionFunction.njk", {
1387
- argsTypeFragment,
1388
- encoderFunction,
1389
- functionName,
1390
- getReturnType,
1391
- hasAccounts,
1392
- hasAnyArgs,
1393
- hasByteDeltas,
1394
- hasData,
1395
- hasDataArgs,
1396
- hasExtraArgs,
1397
- hasInput,
1398
- hasLegacyOptionalAccounts,
1399
- hasRemainingAccounts,
1400
- hasResolver,
1401
- inputTypeCallFragment,
1402
- inputTypeFragment,
1403
- instruction: instructionNode,
1404
- instructionTypeFragment,
1405
- programAddressConstant,
1406
- renamedArgs: renamedArgsText,
1407
- resolvedFragment,
1408
- typeParamsFragment,
1409
- useAsync
1410
- }).mergeImportsWith(
1411
- typeParamsFragment,
1412
- instructionTypeFragment,
1413
- inputTypeFragment,
1414
- inputTypeCallFragment,
1415
- resolvedFragment,
1416
- argsTypeFragment
1417
- ).addImports("generatedPrograms", [programAddressConstant]).addImports("solanaAddresses", ["type Address"]);
1418
- if (hasAccounts) {
1419
- functionFragment.addImports("solanaInstructions", ["type AccountMeta"]).addImports("shared", ["getAccountMetaFactory", "type ResolvedAccount"]);
1420
- }
1421
- if (hasByteDeltas) {
1422
- functionFragment.addImports("shared", ["type InstructionWithByteDelta"]);
1579
+ const hasRemainingAccounts = !!remainingAccountsFragment;
1580
+ const hasByteDeltas = !!byteDeltaFragment;
1581
+ const hasResolver = resolvedInputFragment.features.has("instruction:resolverScopeVariable");
1582
+ const instructionTypeFragment = getInstructionTypeFragment(scope);
1583
+ const typeParams = getTypeParamsFragment(instructionNode, programAddressConstant);
1584
+ const returnType = getReturnTypeFragment(instructionTypeFragment, hasByteDeltas, useAsync);
1585
+ const inputType = getInstructionInputTypeFragment(scope);
1586
+ const inputArg = (0, import_renderers_core8.mapFragmentContent)(getInputTypeCallFragment(scope), (c) => hasInput ? `input: ${c}, ` : "");
1587
+ const functionBody = mergeFragments(
1588
+ [
1589
+ getProgramAddressInitializationFragment(programAddressConstant),
1590
+ getAccountsInitializationFragment(instructionNode),
1591
+ getArgumentsInitializationFragment(hasAnyArgs, renamedArgs),
1592
+ getResolverScopeInitializationFragment(hasResolver, hasAccounts, hasAnyArgs),
1593
+ resolvedInputFragment,
1594
+ getReturnStatementFragment({
1595
+ ...scope,
1596
+ hasByteDeltas,
1597
+ hasData,
1598
+ hasDataArgs,
1599
+ hasRemainingAccounts,
1600
+ instructionNode,
1601
+ syncReturnTypeFragment: getReturnTypeFragment(instructionTypeFragment, hasByteDeltas, false)
1602
+ })
1603
+ ],
1604
+ (cs) => cs.join("\n\n")
1605
+ );
1606
+ return fragment`${inputType}\n\nexport ${useAsync ? "async " : ""}function ${functionName}${typeParams}(${inputArg}config?: { programAddress?: TProgramAddress } ): ${returnType} {
1607
+ ${functionBody}
1608
+ }`;
1609
+ }
1610
+ function getProgramAddressInitializationFragment(programAddressConstant) {
1611
+ return fragment`// Program address.
1612
+ const programAddress = config?.programAddress ?? ${programAddressConstant};`;
1613
+ }
1614
+ function getAccountsInitializationFragment(instructionNode) {
1615
+ if (instructionNode.accounts.length === 0) return;
1616
+ const accounts = mergeFragments(
1617
+ instructionNode.accounts.map((account) => {
1618
+ const name = (0, import_nodes19.camelCase)(account.name);
1619
+ const isWritable = account.isWritable ? "true" : "false";
1620
+ return fragment`${name}: { value: input.${name} ?? null, isWritable: ${isWritable} }`;
1621
+ }),
1622
+ (cs) => cs.join(", ")
1623
+ );
1624
+ return fragment` // Original accounts.
1625
+ const originalAccounts = { ${accounts} }
1626
+ const accounts = originalAccounts as Record<keyof typeof originalAccounts, ${use("type ResolvedAccount", "shared")}>;
1627
+ `;
1628
+ }
1629
+ function getArgumentsInitializationFragment(hasAnyArgs, renamedArgs) {
1630
+ if (!hasAnyArgs) return;
1631
+ const renamedArgsText = [...renamedArgs.entries()].map(([k, v]) => `${k}: input.${v}`).join(", ");
1632
+ return fragment`// Original args.
1633
+ const args = { ...input, ${renamedArgsText} };
1634
+ `;
1635
+ }
1636
+ function getResolverScopeInitializationFragment(hasResolver, hasAccounts, hasAnyArgs) {
1637
+ if (!hasResolver) return;
1638
+ const resolverAttributes = [
1639
+ "programAddress",
1640
+ ...hasAccounts ? ["accounts"] : [],
1641
+ ...hasAnyArgs ? ["args"] : []
1642
+ ].join(", ");
1643
+ return fragment`// Resolver scope.
1644
+ const resolverScope = { ${resolverAttributes} };`;
1645
+ }
1646
+ function getReturnStatementFragment(scope) {
1647
+ const { instructionNode, hasByteDeltas, hasData, hasDataArgs, hasRemainingAccounts, nameApi } = scope;
1648
+ const optionalAccountStrategy = instructionNode.optionalAccountStrategy ?? "programId";
1649
+ const hasAccounts = instructionNode.accounts.length > 0;
1650
+ const hasLegacyOptionalAccounts = instructionNode.optionalAccountStrategy === "omitted" && instructionNode.accounts.some((account) => account.isOptional);
1651
+ const getAccountMeta = hasAccounts ? fragment`const getAccountMeta = ${use("getAccountMetaFactory", "shared")}(programAddress, '${optionalAccountStrategy}');` : "";
1652
+ const accountItems = [
1653
+ ...instructionNode.accounts.map((account) => `getAccountMeta(accounts.${(0, import_nodes19.camelCase)(account.name)})`),
1654
+ ...hasRemainingAccounts ? ["...remainingAccounts"] : []
1655
+ ].join(", ");
1656
+ let accounts;
1657
+ if (hasAccounts && hasLegacyOptionalAccounts) {
1658
+ accounts = fragment`accounts: [${accountItems}].filter(<T>(x: T | undefined): x is T => x !== undefined)`;
1659
+ } else if (hasAccounts) {
1660
+ accounts = fragment`accounts: [${accountItems}]`;
1661
+ } else if (hasRemainingAccounts) {
1662
+ accounts = fragment`accounts: remainingAccounts`;
1423
1663
  }
1424
- return functionFragment;
1664
+ const customData = scope.customInstructionData.get(instructionNode.name);
1665
+ const instructionDataName = nameApi.instructionDataType(instructionNode.name);
1666
+ const encoderFunctionFragment = customData ? scope.dataArgsManifest.encoder : `${nameApi.encoderFunction(instructionDataName)}()`;
1667
+ const argsTypeFragment = customData ? scope.dataArgsManifest.looseType : nameApi.dataArgsType(instructionDataName);
1668
+ let data;
1669
+ if (hasDataArgs) {
1670
+ data = fragment`data: ${encoderFunctionFragment}.encode(args as ${argsTypeFragment})`;
1671
+ } else if (hasData) {
1672
+ data = fragment`data: ${encoderFunctionFragment}.encode({})`;
1673
+ }
1674
+ const instructionAttributes = (0, import_visitors_core17.pipe)(
1675
+ [accounts, hasByteDeltas ? fragment`byteDelta` : void 0, data, fragment`programAddress`],
1676
+ (fs) => mergeFragments(fs, (cs) => cs.join(", "))
1677
+ );
1678
+ return fragment`${getAccountMeta}\nreturn Object.freeze({ ${instructionAttributes} } as ${scope.syncReturnTypeFragment});`;
1679
+ }
1680
+ function getReturnTypeFragment(instructionTypeFragment, hasByteDeltas, useAsync) {
1681
+ return (0, import_visitors_core17.pipe)(
1682
+ instructionTypeFragment,
1683
+ (f) => hasByteDeltas ? fragment`${f} & ${use("type InstructionWithByteDelta", "shared")}` : f,
1684
+ (f) => useAsync ? fragment`Promise<${f}>` : f
1685
+ );
1425
1686
  }
1426
- function getTypeParams(instructionNode, programAddressConstant) {
1427
- const typeParams = instructionNode.accounts.map((account) => `TAccount${(0, import_nodes18.pascalCase)(account.name)} extends string`);
1428
- typeParams.push(`TProgramAddress extends Address = typeof ${programAddressConstant}`);
1429
- return fragment(typeParams.filter((x) => !!x).join(", ")).mapRender((r) => `<${r}>`).addImports("generatedPrograms", [programAddressConstant]);
1687
+ function getTypeParamsFragment(instructionNode, programAddressConstant) {
1688
+ return mergeFragments(
1689
+ [
1690
+ ...instructionNode.accounts.map((account) => fragment`TAccount${(0, import_nodes19.pascalCase)(account.name)} extends string`),
1691
+ fragment`TProgramAddress extends ${use("type Address", "solanaAddresses")} = typeof ${programAddressConstant}`
1692
+ ],
1693
+ (cs) => `<${cs.join(", ")}>`
1694
+ );
1430
1695
  }
1431
- function getInstructionType(scope) {
1696
+ function getInstructionTypeFragment(scope) {
1432
1697
  const { instructionPath, nameApi } = scope;
1433
- const instructionNode = (0, import_visitors_core16.getLastNodeFromPath)(instructionPath);
1698
+ const instructionNode = (0, import_visitors_core17.getLastNodeFromPath)(instructionPath);
1434
1699
  const instructionTypeName = nameApi.instructionType(instructionNode.name);
1435
- const programAddressFragment = fragment("TProgramAddress");
1436
1700
  const accountTypeParamsFragments = instructionNode.accounts.map((account) => {
1437
- const typeParam = `TAccount${(0, import_nodes18.pascalCase)(account.name)}`;
1438
- const camelName = (0, import_nodes18.camelCase)(account.name);
1701
+ const typeParam = fragment`TAccount${(0, import_nodes19.pascalCase)(account.name)}`;
1702
+ const camelName = (0, import_nodes19.camelCase)(account.name);
1439
1703
  if (account.isSigner === "either") {
1440
- const signerRole = account.isWritable ? "WritableSignerAccount" : "ReadonlySignerAccount";
1441
- return fragment(
1442
- `typeof input["${camelName}"] extends TransactionSigner<${typeParam}> ? ${signerRole}<${typeParam}> & AccountSignerMeta<${typeParam}> : ${typeParam}`
1443
- ).addImports("solanaInstructions", [`type ${signerRole}`]).addImports("solanaSigners", ["type AccountSignerMeta"]);
1704
+ const signerRole = use(
1705
+ account.isWritable ? "type WritableSignerAccount" : "type ReadonlySignerAccount",
1706
+ "solanaInstructions"
1707
+ );
1708
+ return (0, import_visitors_core17.pipe)(
1709
+ fragment`typeof input["${camelName}"] extends TransactionSigner<${typeParam}> ? ${signerRole}<${typeParam}> & AccountSignerMeta<${typeParam}> : ${typeParam}`,
1710
+ (f) => addFragmentImports(f, "solanaSigners", ["type AccountSignerMeta", "type TransactionSigner"])
1711
+ );
1444
1712
  }
1445
- return fragment(typeParam);
1713
+ return typeParam;
1446
1714
  });
1447
- return mergeFragments(
1448
- [programAddressFragment, ...accountTypeParamsFragments],
1449
- (renders) => renders.join(", ")
1450
- ).mapRender((r) => `${instructionTypeName}<${r}>`);
1715
+ return (0, import_visitors_core17.pipe)(
1716
+ mergeFragments([fragment`TProgramAddress`, ...accountTypeParamsFragments], (c) => c.join(", ")),
1717
+ (f) => (0, import_renderers_core8.mapFragmentContent)(f, (c) => `${instructionTypeName}<${c}>`)
1718
+ );
1451
1719
  }
1452
- function getInputTypeCall(scope) {
1720
+ function getInputTypeCallFragment(scope) {
1453
1721
  const { instructionPath, useAsync, nameApi } = scope;
1454
- const instructionNode = (0, import_visitors_core16.getLastNodeFromPath)(instructionPath);
1722
+ const instructionNode = (0, import_visitors_core17.getLastNodeFromPath)(instructionPath);
1455
1723
  const inputTypeName = useAsync ? nameApi.instructionAsyncInputType(instructionNode.name) : nameApi.instructionSyncInputType(instructionNode.name);
1456
- if (instructionNode.accounts.length === 0) return fragment(inputTypeName);
1457
- const accountTypeParams = instructionNode.accounts.map((account) => `TAccount${(0, import_nodes18.pascalCase)(account.name)}`).join(", ");
1458
- return fragment(`${inputTypeName}<${accountTypeParams}>`);
1724
+ if (instructionNode.accounts.length === 0) return fragment`${inputTypeName}`;
1725
+ const accountTypeParams = instructionNode.accounts.map((account) => `TAccount${(0, import_nodes19.pascalCase)(account.name)}`).join(", ");
1726
+ return fragment`${inputTypeName}<${accountTypeParams}>`;
1459
1727
  }
1460
1728
 
1729
+ // src/fragments/instructionPage.ts
1730
+ var import_errors2 = require("@codama/errors");
1731
+ var import_nodes22 = require("@codama/nodes");
1732
+ var import_visitors_core20 = require("@codama/visitors-core");
1733
+
1461
1734
  // src/fragments/instructionParseFunction.ts
1462
- var import_visitors_core17 = require("@codama/visitors-core");
1735
+ var import_nodes20 = require("@codama/nodes");
1736
+ var import_visitors_core18 = require("@codama/visitors-core");
1463
1737
  function getInstructionParseFunctionFragment(scope) {
1464
- const { instructionPath, dataArgsManifest, nameApi, customInstructionData } = scope;
1465
- const instructionNode = (0, import_visitors_core17.getLastNodeFromPath)(instructionPath);
1466
- const programNode = (0, import_visitors_core17.findProgramNodeFromPath)(instructionPath);
1467
- const customData = customInstructionData.get(instructionNode.name);
1468
- const hasAccounts = instructionNode.accounts.length > 0;
1469
- const hasOptionalAccounts = instructionNode.accounts.some((account) => account.isOptional);
1470
- const minimumNumberOfAccounts = instructionNode.optionalAccountStrategy === "omitted" ? instructionNode.accounts.filter((account) => !account.isOptional).length : instructionNode.accounts.length;
1471
- const hasData = !!customData || instructionNode.arguments.length > 0;
1472
- const instructionDataName = nameApi.instructionDataType(instructionNode.name);
1473
- const programAddressConstant = nameApi.programAddressConstant(programNode.name);
1474
- const dataTypeFragment = fragment(
1475
- customData ? dataArgsManifest.strictType.render : nameApi.dataType(instructionDataName)
1738
+ const instructionNode = (0, import_visitors_core18.getLastNodeFromPath)(scope.instructionPath);
1739
+ const programNode = (0, import_visitors_core18.findProgramNodeFromPath)(scope.instructionPath);
1740
+ const programAddressConstant = use(scope.nameApi.programAddressConstant(programNode.name), "generatedPrograms");
1741
+ const childScope = { ...scope, instructionNode, programAddressConstant };
1742
+ return mergeFragments([getTypeFragment2(childScope), getFunctionFragment(childScope)], (cs) => cs.join("\n\n"));
1743
+ }
1744
+ function getTypeFragment2(scope) {
1745
+ const customData = scope.customInstructionData.get(scope.instructionNode.name);
1746
+ const instructionParsedType = scope.nameApi.instructionParsedType(scope.instructionNode.name);
1747
+ const instructionDataName = scope.nameApi.instructionDataType(scope.instructionNode.name);
1748
+ const hasData = !!customData || scope.instructionNode.arguments.length > 0;
1749
+ const hasAccounts = scope.instructionNode.accounts.length > 0;
1750
+ const typeParamDeclarations = mergeFragments(
1751
+ [
1752
+ fragment`TProgram extends string = typeof ${scope.programAddressConstant}`,
1753
+ hasAccounts ? fragment`TAccountMetas extends readonly ${use("type AccountMeta", "solanaInstructions")}[] = readonly AccountMeta[]` : void 0
1754
+ ],
1755
+ (cs) => cs.join(", ")
1476
1756
  );
1477
- const decoderFunction = customData ? dataArgsManifest.decoder.render : `${nameApi.decoderFunction(instructionDataName)}()`;
1478
- if (customData) {
1479
- dataTypeFragment.mergeImportsWith(dataArgsManifest.strictType, dataArgsManifest.decoder);
1480
- }
1481
- return fragmentFromTemplate("instructionParseFunction.njk", {
1482
- dataTypeFragment,
1483
- decoderFunction,
1484
- hasAccounts,
1485
- hasData,
1486
- hasOptionalAccounts,
1487
- instruction: instructionNode,
1488
- instructionParseFunction: nameApi.instructionParseFunction(instructionNode.name),
1489
- instructionParsedType: nameApi.instructionParsedType(instructionNode.name),
1490
- minimumNumberOfAccounts,
1491
- programAddressConstant
1492
- }).mergeImportsWith(dataTypeFragment).addImports("generatedPrograms", [programAddressConstant]).addImports("solanaInstructions", ["type Instruction"]).addImports("solanaInstructions", hasAccounts ? ["type InstructionWithAccounts", "type AccountMeta"] : []).addImports("solanaInstructions", hasData ? ["type InstructionWithData"] : []).addImports("solanaCodecsCore", hasData ? ["type ReadonlyUint8Array"] : []);
1757
+ const accounts = mergeFragments(
1758
+ scope.instructionNode.accounts.map((account, i) => {
1759
+ const docs = getDocblockFragment(account.docs ?? [], true);
1760
+ const name = (0, import_nodes20.camelCase)(account.name);
1761
+ return fragment`${docs}${name}${account.isOptional ? "?" : ""}: TAccountMetas[${i}]${account.isOptional ? " | undefined" : ""};`;
1762
+ }),
1763
+ (cs) => hasAccounts ? `
1764
+ accounts: {
1765
+ ${cs.join("\n")}
1766
+ };` : ""
1767
+ );
1768
+ const dataTypeFragment = customData ? scope.dataArgsManifest.strictType : fragment`${scope.nameApi.dataType(instructionDataName)}`;
1769
+ const data = hasData ? fragment`\ndata: ${dataTypeFragment};` : fragment``;
1770
+ return fragment`export type ${instructionParsedType}<${typeParamDeclarations}> = { programAddress: ${use("type Address", "solanaAddresses")}<TProgram>;${accounts}${data} };`;
1771
+ }
1772
+ function getFunctionFragment(scope) {
1773
+ const customData = scope.customInstructionData.get(scope.instructionNode.name);
1774
+ const instructionParsedType = scope.nameApi.instructionParsedType(scope.instructionNode.name);
1775
+ const instructionParseFunction = scope.nameApi.instructionParseFunction(scope.instructionNode.name);
1776
+ const instructionDataName = scope.nameApi.instructionDataType(scope.instructionNode.name);
1777
+ const decoderFunction = customData ? scope.dataArgsManifest.decoder : fragment`${scope.nameApi.decoderFunction(instructionDataName)}()`;
1778
+ const hasData = !!customData || scope.instructionNode.arguments.length > 0;
1779
+ const hasAccounts = scope.instructionNode.accounts.length > 0;
1780
+ const hasOptionalAccounts = scope.instructionNode.accounts.some((account) => account.isOptional);
1781
+ const minimumNumberOfAccounts = scope.instructionNode.optionalAccountStrategy === "omitted" ? scope.instructionNode.accounts.filter((account) => !account.isOptional).length : scope.instructionNode.accounts.length;
1782
+ const typeParams = ["TProgram", hasAccounts ? "TAccountMetas" : void 0].filter(Boolean).join(", ");
1783
+ const typeParamDeclarations = mergeFragments(
1784
+ [
1785
+ fragment`TProgram extends string`,
1786
+ hasAccounts ? fragment`TAccountMetas extends readonly ${use("type AccountMeta", "solanaInstructions")}[]` : void 0
1787
+ ],
1788
+ (cs) => cs.join(", ")
1789
+ );
1790
+ const instructionType = mergeFragments(
1791
+ [
1792
+ fragment`${use("type Instruction", "solanaInstructions")}<TProgram>`,
1793
+ hasAccounts ? fragment`${use("type InstructionWithAccounts", "solanaInstructions")}<TAccountMetas>` : void 0,
1794
+ hasData ? (0, import_visitors_core18.pipe)(
1795
+ fragment`InstructionWithData<ReadonlyUint8Array>`,
1796
+ (f) => addFragmentImports(f, "solanaInstructions", ["type InstructionWithData"]),
1797
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["type ReadonlyUint8Array"])
1798
+ ) : void 0
1799
+ ],
1800
+ (cs) => cs.join(" & ")
1801
+ );
1802
+ let accountHelpers;
1803
+ if (hasAccounts) {
1804
+ accountHelpers = fragment`if (instruction.accounts.length < ${minimumNumberOfAccounts}) {
1805
+ // TODO: Coded error.
1806
+ throw new Error('Not enough accounts');
1807
+ }
1808
+ let accountIndex = 0;
1809
+ const getNextAccount = () => {
1810
+ const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;
1811
+ accountIndex += 1;
1812
+ return accountMeta;
1813
+ }`;
1814
+ }
1815
+ if (hasOptionalAccounts && scope.instructionNode.optionalAccountStrategy === "omitted") {
1816
+ accountHelpers = fragment`${accountHelpers}
1817
+ let optionalAccountsRemaining = instruction.accounts.length - ${minimumNumberOfAccounts};
1818
+ const getNextOptionalAccount = () => {
1819
+ if (optionalAccountsRemaining === 0) return undefined;
1820
+ optionalAccountsRemaining -= 1;
1821
+ return getNextAccount();
1822
+ };`;
1823
+ } else if (hasOptionalAccounts) {
1824
+ accountHelpers = fragment`${accountHelpers}
1825
+ const getNextOptionalAccount = () => {
1826
+ const accountMeta = getNextAccount();
1827
+ return accountMeta.address === ${scope.programAddressConstant} ? undefined : accountMeta;
1828
+ };`;
1829
+ }
1830
+ const accounts = mergeFragments(
1831
+ scope.instructionNode.accounts.map(
1832
+ (account) => account.isOptional ? fragment`${(0, import_nodes20.camelCase)(account.name)}: getNextOptionalAccount()` : fragment`${(0, import_nodes20.camelCase)(account.name)}: getNextAccount()`
1833
+ ),
1834
+ (cs) => hasAccounts ? `, accounts: { ${cs.join(", ")} }` : ""
1835
+ );
1836
+ const data = hasData ? fragment`, data: ${decoderFunction}.decode(instruction.data)` : fragment``;
1837
+ return fragment`export function ${instructionParseFunction}<${typeParamDeclarations}>(instruction: ${instructionType}): ${instructionParsedType}<${typeParams}> {
1838
+ ${accountHelpers}
1839
+ return { programAddress: instruction.programAddress${accounts}${data} };
1840
+ }`;
1493
1841
  }
1494
1842
 
1495
1843
  // src/fragments/instructionType.ts
1496
- var import_nodes19 = require("@codama/nodes");
1497
- var import_visitors_core18 = require("@codama/visitors-core");
1498
- function getInstructionTypeFragment(scope) {
1844
+ var import_nodes21 = require("@codama/nodes");
1845
+ var import_renderers_core9 = require("@codama/renderers-core");
1846
+ var import_visitors_core19 = require("@codama/visitors-core");
1847
+ function getInstructionTypeFragment2(scope) {
1499
1848
  const { instructionPath, nameApi, customInstructionData } = scope;
1500
- const instructionNode = (0, import_visitors_core18.getLastNodeFromPath)(instructionPath);
1501
- const programNode = (0, import_visitors_core18.findProgramNodeFromPath)(instructionPath);
1849
+ const instructionNode = (0, import_visitors_core19.getLastNodeFromPath)(instructionPath);
1850
+ const programNode = (0, import_visitors_core19.findProgramNodeFromPath)(instructionPath);
1502
1851
  const hasAccounts = instructionNode.accounts.length > 0;
1503
1852
  const customData = customInstructionData.get(instructionNode.name);
1504
1853
  const hasData = !!customData || instructionNode.arguments.length > 0;
1505
- const instructionDataName = nameApi.instructionDataType(instructionNode.name);
1506
- const programAddressConstant = nameApi.programAddressConstant(programNode.name);
1507
- const dataType = customData ? (0, import_nodes19.pascalCase)(customData.importAs) : (0, import_nodes19.pascalCase)(instructionDataName);
1508
- const accountTypeParamsFragment = mergeFragments(
1854
+ const instructionType = nameApi.instructionType(instructionNode.name);
1855
+ const programAddressConstant = use(nameApi.programAddressConstant(programNode.name), "generatedPrograms");
1856
+ const accountTypeParams = mergeFragments(
1509
1857
  instructionNode.accounts.map(
1510
1858
  (account) => getInstructionAccountTypeParamFragment({
1511
1859
  ...scope,
@@ -1513,91 +1861,165 @@ function getInstructionTypeFragment(scope) {
1513
1861
  instructionAccountPath: [...instructionPath, account]
1514
1862
  })
1515
1863
  ),
1516
- (renders) => renders.join(", ")
1864
+ (cs) => cs.length > 0 ? `${cs.join(", ")}, ` : ""
1517
1865
  );
1866
+ const data = hasData ? fragment` & ${use("type InstructionWithData", "solanaInstructions")}<${use("type ReadonlyUint8Array", "solanaCodecsCore")}>` : void 0;
1518
1867
  const usesLegacyOptionalAccounts = instructionNode.optionalAccountStrategy === "omitted";
1519
1868
  const accountMetasFragment = mergeFragments(
1520
1869
  instructionNode.accounts.map(
1521
- (account) => getInstructionAccountMetaFragment(account).mapRender((r) => {
1522
- const typeParam = `TAccount${(0, import_nodes19.pascalCase)(account.name)}`;
1870
+ (account) => (0, import_renderers_core9.mapFragmentContent)(getInstructionAccountMetaFragment(account), (c) => {
1871
+ const typeParam = `TAccount${(0, import_nodes21.pascalCase)(account.name)}`;
1523
1872
  const isLegacyOptional = account.isOptional && usesLegacyOptionalAccounts;
1524
- const type = `${typeParam} extends string ? ${r} : ${typeParam}`;
1873
+ const type = `${typeParam} extends string ? ${c} : ${typeParam}`;
1525
1874
  if (!isLegacyOptional) return type;
1526
1875
  return `...(${typeParam} extends undefined ? [] : [${type}])`;
1527
1876
  })
1528
1877
  ),
1529
- (renders) => renders.join(", ")
1530
- );
1531
- const fragment2 = fragmentFromTemplate("instructionType.njk", {
1532
- accountMetas: accountMetasFragment.render,
1533
- accountTypeParams: accountTypeParamsFragment.render,
1534
- dataType,
1535
- hasAccounts,
1536
- hasData,
1537
- instruction: instructionNode,
1538
- instructionType: nameApi.instructionType(instructionNode.name),
1539
- programAddressConstant
1540
- }).mergeImportsWith(accountTypeParamsFragment, accountMetasFragment).addImports("generatedPrograms", [programAddressConstant]).addImports("solanaCodecsCore", hasData ? ["type ReadonlyUint8Array"] : []).addImports("solanaInstructions", [
1541
- "type AccountMeta",
1542
- "type Instruction",
1543
- "type InstructionWithAccounts",
1544
- ...hasData ? ["type InstructionWithData"] : []
1545
- ]);
1546
- return fragment2;
1878
+ (c) => c.join(", ")
1879
+ );
1880
+ const instructionWithAccounts = use("type InstructionWithAccounts", "solanaInstructions");
1881
+ const accounts = hasAccounts ? fragment` & ${instructionWithAccounts}<[${accountMetasFragment}, ...TRemainingAccounts]>` : fragment` & ${instructionWithAccounts}<TRemainingAccounts>`;
1882
+ return fragment`export type ${instructionType}<TProgram extends string = typeof ${programAddressConstant}, ${accountTypeParams}TRemainingAccounts extends readonly ${use("type AccountMeta", "solanaInstructions")}<string>[] = []> =
1883
+ ${use("type Instruction", "solanaInstructions")}<TProgram>${data}${accounts};`;
1884
+ }
1885
+
1886
+ // src/fragments/instructionPage.ts
1887
+ function getInstructionPageFragment(scope) {
1888
+ const node = (0, import_visitors_core20.getLastNodeFromPath)(scope.instructionPath);
1889
+ if (!(0, import_visitors_core20.findProgramNodeFromPath)(scope.instructionPath)) {
1890
+ throw new Error("Instruction must be visited inside a program.");
1891
+ }
1892
+ const childScope = {
1893
+ ...scope,
1894
+ dataArgsManifest: (0, import_visitors_core20.visit)(node, scope.typeManifestVisitor),
1895
+ extraArgsManifest: (0, import_visitors_core20.visit)(
1896
+ (0, import_nodes22.definedTypeNode)({
1897
+ name: scope.nameApi.instructionExtraType(node.name),
1898
+ type: (0, import_nodes22.structTypeNodeFromInstructionArgumentNodes)(node.extraArguments ?? [])
1899
+ }),
1900
+ scope.typeManifestVisitor
1901
+ ),
1902
+ renamedArgs: getRenamedArgsMap(node)
1903
+ };
1904
+ return mergeFragments(
1905
+ [
1906
+ getDiscriminatorConstantsFragment({
1907
+ ...childScope,
1908
+ discriminatorNodes: node.discriminators ?? [],
1909
+ fields: node.arguments,
1910
+ prefix: node.name
1911
+ }),
1912
+ getInstructionTypeFragment2(childScope),
1913
+ getInstructionDataFragment(childScope),
1914
+ getInstructionExtraArgsFragment(childScope),
1915
+ getInstructionFunctionFragment({ ...childScope, useAsync: true }),
1916
+ getInstructionFunctionFragment({ ...childScope, useAsync: false }),
1917
+ getInstructionParseFunctionFragment(childScope)
1918
+ ],
1919
+ (cs) => cs.join("\n\n")
1920
+ );
1921
+ }
1922
+ function getRenamedArgsMap(instruction) {
1923
+ const argNames = [
1924
+ ...instruction.arguments.map((a) => a.name),
1925
+ ...(instruction.extraArguments ?? []).map((a) => a.name)
1926
+ ];
1927
+ const duplicateArgs = argNames.filter((e, i, a) => a.indexOf(e) !== i);
1928
+ if (duplicateArgs.length > 0) {
1929
+ throw new Error(`Duplicate args found: [${duplicateArgs.join(", ")}] in instruction [${instruction.name}].`);
1930
+ }
1931
+ const allNames = [...instruction.accounts.map((account) => account.name), ...argNames];
1932
+ const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);
1933
+ if (duplicates.length === 0) return /* @__PURE__ */ new Map();
1934
+ (0, import_errors2.logWarn)(
1935
+ `[JavaScript] Accounts and args of instruction [${instruction.name}] have the following conflicting attributes [${duplicates.join(", ")}]. Thus, the arguments have been renamed to avoid conflicts in the input type.`
1936
+ );
1937
+ return new Map(duplicates.map((name) => [(0, import_nodes22.camelCase)(name), (0, import_nodes22.camelCase)(`${name}Arg`)]));
1547
1938
  }
1548
1939
 
1549
1940
  // src/fragments/pdaFunction.ts
1550
- var import_nodes20 = require("@codama/nodes");
1551
- var import_visitors_core19 = require("@codama/visitors-core");
1941
+ var import_nodes23 = require("@codama/nodes");
1942
+ var import_visitors_core21 = require("@codama/visitors-core");
1552
1943
  function getPdaFunctionFragment(scope) {
1553
- const { pdaPath, typeManifestVisitor, nameApi } = scope;
1554
- const pdaNode = (0, import_visitors_core19.getLastNodeFromPath)(pdaPath);
1555
- const programNode = (0, import_visitors_core19.findProgramNodeFromPath)(pdaPath);
1556
- const imports = new ImportMap();
1557
- const seeds = pdaNode.seeds.map((seed) => {
1558
- if ((0, import_nodes20.isNode)(seed, "variablePdaSeedNode")) {
1559
- const seedManifest2 = (0, import_visitors_core19.visit)(seed.type, typeManifestVisitor);
1560
- imports.mergeWith(seedManifest2.looseType, seedManifest2.encoder);
1561
- return { ...seed, typeManifest: seedManifest2 };
1944
+ const pdaNode = (0, import_visitors_core21.getLastNodeFromPath)(scope.pdaPath);
1945
+ const seeds = parsePdaSeedNodes(pdaNode.seeds, scope);
1946
+ return mergeFragments(
1947
+ [getSeedInputTypeFragment(seeds, scope), getFunctionFragment2(seeds, scope)],
1948
+ (cs) => cs.join("\n\n")
1949
+ );
1950
+ }
1951
+ function getSeedInputTypeFragment(seeds, scope) {
1952
+ const variableSeeds = seeds.filter((0, import_nodes23.isNodeFilter)("variablePdaSeedNode"));
1953
+ if (variableSeeds.length === 0) return;
1954
+ const pdaNode = (0, import_visitors_core21.getLastNodeFromPath)(scope.pdaPath);
1955
+ const seedTypeName = scope.nameApi.pdaSeedsType(pdaNode.name);
1956
+ const seedAttributes = mergeFragments(
1957
+ variableSeeds.map((seed) => seed.inputAttribute),
1958
+ (cs) => cs.join("\n")
1959
+ );
1960
+ return fragment`export type ${seedTypeName} = {\n${seedAttributes}\n};`;
1961
+ }
1962
+ function getFunctionFragment2(seeds, scope) {
1963
+ const pdaNode = (0, import_visitors_core21.getLastNodeFromPath)(scope.pdaPath);
1964
+ const programNode = (0, import_visitors_core21.findProgramNodeFromPath)(scope.pdaPath);
1965
+ const addressType = use("type Address", "solanaAddresses");
1966
+ const pdaType = use("type ProgramDerivedAddress", "solanaAddresses");
1967
+ const getPdaFunction = use("getProgramDerivedAddress", "solanaAddresses");
1968
+ const seedTypeName = scope.nameApi.pdaSeedsType(pdaNode.name);
1969
+ const findPdaFunction = scope.nameApi.pdaFindFunction(pdaNode.name);
1970
+ const docs = getDocblockFragment(pdaNode.docs ?? [], true);
1971
+ const hasVariableSeeds = seeds.filter((0, import_nodes23.isNodeFilter)("variablePdaSeedNode")).length > 0;
1972
+ const seedArgument = hasVariableSeeds ? `seeds: ${seedTypeName}, ` : "";
1973
+ const programAddress = pdaNode.programId ?? programNode.publicKey;
1974
+ const encodedSeeds = mergeFragments(
1975
+ seeds.map((s) => s.encodedValue),
1976
+ (cs) => cs.join(", ")
1977
+ );
1978
+ return fragment`${docs}export async function ${findPdaFunction}(${seedArgument}config: { programAddress?: ${addressType} | undefined } = {}): Promise<${pdaType}> {
1979
+ const { programAddress = '${programAddress}' as ${addressType}<'${programAddress}'> } = config;
1980
+ return await ${getPdaFunction}({ programAddress, seeds: [${encodedSeeds}]});
1981
+ }`;
1982
+ }
1983
+ function parsePdaSeedNodes(seeds, scope) {
1984
+ return seeds.map((seed) => {
1985
+ if ((0, import_nodes23.isNode)(seed, "variablePdaSeedNode")) {
1986
+ const name = (0, import_nodes23.camelCase)(seed.name);
1987
+ const docs = getDocblockFragment(seed.docs ?? [], true);
1988
+ const { encoder: encoder2, looseType } = (0, import_visitors_core21.visit)(seed.type, scope.typeManifestVisitor);
1989
+ return {
1990
+ ...seed,
1991
+ encodedValue: fragment`${encoder2}.encode(seeds.${name})`,
1992
+ inputAttribute: fragment`${docs}${name}: ${looseType};`
1993
+ };
1562
1994
  }
1563
- if ((0, import_nodes20.isNode)(seed.value, "programIdValueNode")) {
1564
- imports.add("solanaAddresses", "getAddressEncoder");
1565
- return seed;
1995
+ if ((0, import_nodes23.isNode)(seed.value, "programIdValueNode")) {
1996
+ const addressEncoder = use("getAddressEncoder", "solanaAddresses");
1997
+ return { ...seed, encodedValue: fragment`${addressEncoder}().encode(programAddress)` };
1566
1998
  }
1567
- const seedManifest = (0, import_visitors_core19.visit)(seed.type, typeManifestVisitor);
1568
- imports.mergeWith(seedManifest.encoder);
1569
- const valueManifest = (0, import_visitors_core19.visit)(seed.value, typeManifestVisitor).value;
1570
- imports.mergeWith(valueManifest.imports);
1571
- return { ...seed, typeManifest: seedManifest, valueManifest };
1999
+ const { encoder } = (0, import_visitors_core21.visit)(seed.type, scope.typeManifestVisitor);
2000
+ const { value } = (0, import_visitors_core21.visit)(seed.value, scope.typeManifestVisitor);
2001
+ return { ...seed, encodedValue: fragment`${encoder}.encode(${value})` };
1572
2002
  });
1573
- const hasVariableSeeds = pdaNode.seeds.filter((0, import_nodes20.isNodeFilter)("variablePdaSeedNode")).length > 0;
1574
- return fragmentFromTemplate("pdaFunction.njk", {
1575
- findPdaFunction: nameApi.pdaFindFunction(pdaNode.name),
1576
- hasVariableSeeds,
1577
- pdaDocs: pdaNode.docs,
1578
- pdaSeedsType: nameApi.pdaSeedsType(pdaNode.name),
1579
- programAddress: pdaNode.programId ?? programNode.publicKey,
1580
- seeds
1581
- }).mergeImportsWith(imports).addImports("solanaAddresses", ["type Address", "getProgramDerivedAddress", "type ProgramDerivedAddress"]);
1582
- }
1583
-
1584
- // src/fragments/program.ts
1585
- function getProgramFragment(scope) {
1586
- const { programNode, nameApi } = scope;
1587
- return fragmentFromTemplate("program.njk", {
1588
- program: programNode,
1589
- programAddressConstant: nameApi.programAddressConstant(programNode.name)
1590
- }).addImports("solanaAddresses", ["type Address"]);
2003
+ }
2004
+
2005
+ // src/fragments/pdaPage.ts
2006
+ var import_visitors_core22 = require("@codama/visitors-core");
2007
+ function getPdaPageFragment(scope) {
2008
+ if (!(0, import_visitors_core22.findProgramNodeFromPath)(scope.pdaPath)) {
2009
+ throw new Error("PDA must be visited inside a program.");
2010
+ }
2011
+ return getPdaFunctionFragment(scope);
1591
2012
  }
1592
2013
 
1593
2014
  // src/fragments/programAccounts.ts
1594
- var import_nodes21 = require("@codama/nodes");
2015
+ var import_nodes24 = require("@codama/nodes");
2016
+ var import_renderers_core10 = require("@codama/renderers-core");
2017
+ var import_visitors_core23 = require("@codama/visitors-core");
1595
2018
  function getProgramAccountsFragment(scope) {
1596
- if (scope.programNode.accounts.length === 0) return fragment("");
2019
+ if (scope.programNode.accounts.length === 0) return;
1597
2020
  return mergeFragments(
1598
2021
  [getProgramAccountsEnumFragment(scope), getProgramAccountsIdentifierFunctionFragment(scope)],
1599
- (r) => `${r.join("\n\n")}
1600
- `
2022
+ (c) => c.join("\n\n")
1601
2023
  );
1602
2024
  }
1603
2025
  function getProgramAccountsEnumFragment(scope) {
@@ -1606,7 +2028,7 @@ function getProgramAccountsEnumFragment(scope) {
1606
2028
  const programAccountsEnumVariants = programNode.accounts.map(
1607
2029
  (account) => nameApi.programAccountsEnumVariant(account.name)
1608
2030
  );
1609
- return fragment(`export enum ${programAccountsEnum} { ${programAccountsEnumVariants.join(", ")} }`);
2031
+ return fragment`export enum ${programAccountsEnum} { ${programAccountsEnumVariants.join(", ")} }`;
1610
2032
  }
1611
2033
  function getProgramAccountsIdentifierFunctionFragment(scope) {
1612
2034
  const { programNode, nameApi } = scope;
@@ -1614,52 +2036,53 @@ function getProgramAccountsIdentifierFunctionFragment(scope) {
1614
2036
  (account) => (account.discriminators ?? []).length > 0
1615
2037
  );
1616
2038
  const hasAccountDiscriminators = accountsWithDiscriminators.length > 0;
1617
- if (!hasAccountDiscriminators) return fragment("");
2039
+ if (!hasAccountDiscriminators) return;
1618
2040
  const programAccountsEnum = nameApi.programAccountsEnum(programNode.name);
1619
2041
  const programAccountsIdentifierFunction = nameApi.programAccountsIdentifierFunction(programNode.name);
1620
- const discriminatorsFragment = mergeFragments(
1621
- accountsWithDiscriminators.map((account) => {
1622
- const variant = nameApi.programAccountsEnumVariant(account.name);
1623
- return getDiscriminatorConditionFragment({
1624
- ...scope,
1625
- dataName: "data",
1626
- discriminators: account.discriminators ?? [],
1627
- ifTrue: `return ${programAccountsEnum}.${variant};`,
1628
- struct: (0, import_nodes21.resolveNestedTypeNode)(account.data)
1629
- });
1630
- }),
1631
- (r) => r.join("\n")
1632
- );
1633
- return discriminatorsFragment.mapRender(
1634
- (discriminators) => `export function ${programAccountsIdentifierFunction}(account: { data: ReadonlyUint8Array } | ReadonlyUint8Array): ${programAccountsEnum} {
2042
+ return (0, import_visitors_core23.pipe)(
2043
+ mergeFragments(
2044
+ accountsWithDiscriminators.map((account) => {
2045
+ const variant = nameApi.programAccountsEnumVariant(account.name);
2046
+ return getDiscriminatorConditionFragment({
2047
+ ...scope,
2048
+ dataName: "data",
2049
+ discriminators: account.discriminators ?? [],
2050
+ ifTrue: `return ${programAccountsEnum}.${variant};`,
2051
+ struct: (0, import_nodes24.resolveNestedTypeNode)(account.data)
2052
+ });
2053
+ }),
2054
+ (c) => c.join("\n")
2055
+ ),
2056
+ (f) => (0, import_renderers_core10.mapFragmentContent)(
2057
+ f,
2058
+ (discriminators) => `export function ${programAccountsIdentifierFunction}(account: { data: ReadonlyUint8Array } | ReadonlyUint8Array): ${programAccountsEnum} {
1635
2059
  const data = 'data' in account ? account.data : account;
1636
2060
  ${discriminators}
1637
2061
  throw new Error("The provided account could not be identified as a ${programNode.name} account.")
1638
2062
  }`
1639
- ).addImports("solanaCodecsCore", "type ReadonlyUint8Array");
2063
+ ),
2064
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["type ReadonlyUint8Array"])
2065
+ );
1640
2066
  }
1641
2067
 
1642
- // src/fragments/programErrors.ts
1643
- function getProgramErrorsFragment(scope) {
2068
+ // src/fragments/programConstant.ts
2069
+ var import_visitors_core24 = require("@codama/visitors-core");
2070
+ function getProgramConstantFragment(scope) {
1644
2071
  const { programNode, nameApi } = scope;
1645
2072
  const programAddressConstant = nameApi.programAddressConstant(programNode.name);
1646
- return fragmentFromTemplate("programErrors.njk", {
1647
- errors: programNode.errors,
1648
- escapeProgramErrorMessage: (message) => message.replace(/`/g, "\\`"),
1649
- getProgramErrorConstant: (name) => nameApi.programErrorConstantPrefix(programNode.name) + nameApi.programErrorConstant(name),
1650
- programAddressConstant,
1651
- programErrorMessagesMap: nameApi.programErrorMessagesMap(programNode.name),
1652
- programErrorUnion: nameApi.programErrorUnion(programNode.name),
1653
- programGetErrorMessageFunction: nameApi.programGetErrorMessageFunction(programNode.name),
1654
- programIsErrorFunction: nameApi.programIsErrorFunction(programNode.name)
1655
- }).addImports("generatedPrograms", [programAddressConstant]).addImports("solanaPrograms", ["isProgramError"]).addImports("solanaErrors", ["type SolanaError", "type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM"]).addImports("solanaAddresses", ["type Address"]);
2073
+ return (0, import_visitors_core24.pipe)(
2074
+ fragment`export const ${programAddressConstant} = '${programNode.publicKey}' as Address<'${programNode.publicKey}'>;`,
2075
+ (f) => addFragmentImports(f, "solanaAddresses", ["type Address"])
2076
+ );
1656
2077
  }
1657
2078
 
1658
2079
  // src/fragments/programInstructions.ts
1659
- var import_nodes22 = require("@codama/nodes");
2080
+ var import_nodes25 = require("@codama/nodes");
2081
+ var import_renderers_core11 = require("@codama/renderers-core");
2082
+ var import_visitors_core25 = require("@codama/visitors-core");
1660
2083
  function getProgramInstructionsFragment(scope) {
1661
- if (scope.programNode.instructions.length === 0) return fragment("");
1662
- const allInstructions = (0, import_nodes22.getAllInstructionsWithSubs)(scope.programNode, {
2084
+ if (scope.programNode.instructions.length === 0) return;
2085
+ const allInstructions = (0, import_nodes25.getAllInstructionsWithSubs)(scope.programNode, {
1663
2086
  leavesOnly: !scope.renderParentInstructions,
1664
2087
  subInstructionsFirst: true
1665
2088
  });
@@ -1670,8 +2093,7 @@ function getProgramInstructionsFragment(scope) {
1670
2093
  getProgramInstructionsIdentifierFunctionFragment(scopeWithInstructions),
1671
2094
  getProgramInstructionsParsedUnionTypeFragment(scopeWithInstructions)
1672
2095
  ],
1673
- (r) => `${r.join("\n\n")}
1674
- `
2096
+ (c) => c.join("\n\n")
1675
2097
  );
1676
2098
  }
1677
2099
  function getProgramInstructionsEnumFragment(scope) {
@@ -1680,9 +2102,7 @@ function getProgramInstructionsEnumFragment(scope) {
1680
2102
  const programInstructionsEnumVariants = allInstructions.map(
1681
2103
  (instruction) => nameApi.programInstructionsEnumVariant(instruction.name)
1682
2104
  );
1683
- return fragment(
1684
- `export enum ${programInstructionsEnum} { ${programInstructionsEnumVariants.join(", ")} }`
1685
- );
2105
+ return fragment`export enum ${programInstructionsEnum} { ${programInstructionsEnumVariants.join(", ")} }`;
1686
2106
  }
1687
2107
  function getProgramInstructionsIdentifierFunctionFragment(scope) {
1688
2108
  const { programNode, nameApi, allInstructions } = scope;
@@ -1690,7 +2110,7 @@ function getProgramInstructionsIdentifierFunctionFragment(scope) {
1690
2110
  (instruction) => (instruction.discriminators ?? []).length > 0
1691
2111
  );
1692
2112
  const hasInstructionDiscriminators = instructionsWithDiscriminators.length > 0;
1693
- if (!hasInstructionDiscriminators) return fragment("");
2113
+ if (!hasInstructionDiscriminators) return;
1694
2114
  const programInstructionsEnum = nameApi.programInstructionsEnum(programNode.name);
1695
2115
  const programInstructionsIdentifierFunction = nameApi.programInstructionsIdentifierFunction(programNode.name);
1696
2116
  const discriminatorsFragment = mergeFragments(
@@ -1701,18 +2121,23 @@ function getProgramInstructionsIdentifierFunctionFragment(scope) {
1701
2121
  dataName: "data",
1702
2122
  discriminators: instruction.discriminators ?? [],
1703
2123
  ifTrue: `return ${programInstructionsEnum}.${variant};`,
1704
- struct: (0, import_nodes22.structTypeNodeFromInstructionArgumentNodes)(instruction.arguments)
2124
+ struct: (0, import_nodes25.structTypeNodeFromInstructionArgumentNodes)(instruction.arguments)
1705
2125
  });
1706
2126
  }),
1707
- (r) => r.join("\n")
2127
+ (c) => c.join("\n")
1708
2128
  );
1709
- return discriminatorsFragment.mapRender(
1710
- (discriminators) => `export function ${programInstructionsIdentifierFunction}(instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array): ${programInstructionsEnum} {
2129
+ return (0, import_visitors_core25.pipe)(
2130
+ discriminatorsFragment,
2131
+ (f) => (0, import_renderers_core11.mapFragmentContent)(
2132
+ f,
2133
+ (discriminators) => `export function ${programInstructionsIdentifierFunction}(instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array): ${programInstructionsEnum} {
1711
2134
  const data = 'data' in instruction ? instruction.data : instruction;
1712
2135
  ${discriminators}
1713
2136
  throw new Error("The provided instruction could not be identified as a ${programNode.name} instruction.")
1714
2137
  }`
1715
- ).addImports("solanaCodecsCore", "type ReadonlyUint8Array");
2138
+ ),
2139
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["type ReadonlyUint8Array"])
2140
+ );
1716
2141
  }
1717
2142
  function getProgramInstructionsParsedUnionTypeFragment(scope) {
1718
2143
  const { programNode, allInstructions, nameApi } = scope;
@@ -1721,208 +2146,329 @@ function getProgramInstructionsParsedUnionTypeFragment(scope) {
1721
2146
  const programInstructionsEnum = nameApi.programInstructionsEnum(programNode.name);
1722
2147
  const typeVariants = allInstructions.map((instruction) => {
1723
2148
  const instructionEnumVariant = nameApi.programInstructionsEnumVariant(instruction.name);
1724
- const parsedInstructionType = nameApi.instructionParsedType(instruction.name);
1725
- return fragment(
1726
- `| { instructionType: ${programInstructionsEnum}.${instructionEnumVariant} } & ${parsedInstructionType}<TProgram>`
1727
- ).addImports("generatedInstructions", `type ${parsedInstructionType}`);
2149
+ const parsedInstructionType = use(
2150
+ `type ${nameApi.instructionParsedType(instruction.name)}`,
2151
+ "generatedInstructions"
2152
+ );
2153
+ return fragment`| { instructionType: ${programInstructionsEnum}.${instructionEnumVariant} } & ${parsedInstructionType}<TProgram>`;
1728
2154
  });
1729
2155
  return mergeFragments(
1730
2156
  [
1731
- fragment(`export type ${programInstructionsType}<TProgram extends string = '${programAddress}'> =`),
2157
+ fragment`export type ${programInstructionsType}<TProgram extends string = '${programAddress}'> =`,
1732
2158
  ...typeVariants
1733
2159
  ],
1734
- (r) => r.join("\n")
2160
+ (c) => c.join("\n")
1735
2161
  );
1736
2162
  }
1737
2163
 
1738
- // src/fragments/typeDiscriminatedUnionHelpers.ts
1739
- var import_nodes23 = require("@codama/nodes");
1740
- function getTypeDiscriminatedUnionHelpersFragment(scope) {
1741
- const { name, typeNode, nameApi } = scope;
1742
- const isDiscriminatedUnion = (0, import_nodes23.isNode)(typeNode, "enumTypeNode") && (0, import_nodes23.isDataEnum)(typeNode);
1743
- if (!isDiscriminatedUnion) {
1744
- return fragment("");
2164
+ // src/fragments/programPage.ts
2165
+ function getProgramPageFragment(scope) {
2166
+ return mergeFragments(
2167
+ [getProgramConstantFragment(scope), getProgramAccountsFragment(scope), getProgramInstructionsFragment(scope)],
2168
+ (cs) => cs.join("\n\n")
2169
+ );
2170
+ }
2171
+
2172
+ // src/fragments/rootIndexPage.ts
2173
+ function getRootIndexPageFragment(scope) {
2174
+ const hasAnythingToExport = scope.programsToExport.length > 0 || scope.accountsToExport.length > 0 || scope.instructionsToExport.length > 0 || scope.definedTypesToExport.length > 0;
2175
+ if (!hasAnythingToExport) {
2176
+ return fragment`export default {};`;
1745
2177
  }
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
- ]);
2178
+ const programsWithErrorsToExport = scope.programsToExport.filter((p) => p.errors.length > 0);
2179
+ return mergeFragments(
2180
+ [
2181
+ scope.accountsToExport.length > 0 ? getExportAllFragment("./accounts") : void 0,
2182
+ programsWithErrorsToExport.length > 0 ? getExportAllFragment("./errors") : void 0,
2183
+ scope.instructionsToExport.length > 0 ? getExportAllFragment("./instructions") : void 0,
2184
+ scope.pdasToExport.length > 0 ? getExportAllFragment("./pdas") : void 0,
2185
+ scope.programsToExport.length > 0 ? getExportAllFragment("./programs") : void 0,
2186
+ scope.definedTypesToExport.length > 0 ? getExportAllFragment("./types") : void 0
2187
+ ],
2188
+ (cs) => cs.join("\n")
2189
+ );
1758
2190
  }
1759
2191
 
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
- };
2192
+ // src/fragments/sharedPage.ts
2193
+ var import_visitors_core26 = require("@codama/visitors-core");
2194
+ function getSharedPageFragment() {
2195
+ const sharedPage = fragment`/**
2196
+ * Asserts that the given value is not null or undefined.
2197
+ * @internal
2198
+ */
2199
+ export function expectSome<T>(value: T | null | undefined): T {
2200
+ if (value === null || value === undefined) {
2201
+ throw new Error('Expected a value but received null or undefined.');
2202
+ }
2203
+ return value;
1770
2204
  }
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)
2205
+
2206
+ /**
2207
+ * Asserts that the given value is a PublicKey.
2208
+ * @internal
2209
+ */
2210
+ export function expectAddress<T extends string = string>(
2211
+ value: Address<T> | ProgramDerivedAddress<T> | TransactionSigner<T> | null | undefined
2212
+ ): Address<T> {
2213
+ if (!value) {
2214
+ throw new Error('Expected a Address.');
2215
+ }
2216
+ if (typeof value === 'object' && "address" in value) {
2217
+ return value.address;
2218
+ }
2219
+ if (Array.isArray(value)) {
2220
+ return value[0] as Address<T>;
2221
+ }
2222
+ return value as Address<T>;
2223
+ }
2224
+
2225
+ /**
2226
+ * Asserts that the given value is a PDA.
2227
+ * @internal
2228
+ */
2229
+ export function expectProgramDerivedAddress<T extends string = string>(
2230
+ value: Address<T> | ProgramDerivedAddress<T> | TransactionSigner<T> | null | undefined
2231
+ ): ProgramDerivedAddress<T> {
2232
+ if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) {
2233
+ throw new Error('Expected a ProgramDerivedAddress.');
2234
+ }
2235
+ return value;
2236
+ }
2237
+
2238
+ /**
2239
+ * Asserts that the given value is a TransactionSigner.
2240
+ * @internal
2241
+ */
2242
+ export function expectTransactionSigner<T extends string = string>(
2243
+ value: Address<T> | ProgramDerivedAddress<T> | TransactionSigner<T> | null | undefined
2244
+ ): TransactionSigner<T> {
2245
+ if (!value || !isTransactionSigner(value)) {
2246
+ throw new Error('Expected a TransactionSigner.');
2247
+ }
2248
+ return value;
2249
+ }
2250
+
2251
+ /**
2252
+ * Defines an instruction account to resolve.
2253
+ * @internal
2254
+ */
2255
+ export type ResolvedAccount<T extends string = string, U extends Address<T> | ProgramDerivedAddress<T> | TransactionSigner<T> | null = Address<T> | ProgramDerivedAddress<T> | TransactionSigner<T> | null> = {
2256
+ isWritable: boolean;
2257
+ value: U;
2258
+ };
2259
+
2260
+ /**
2261
+ * Defines an instruction that stores additional bytes on-chain.
2262
+ * @internal
2263
+ */
2264
+ export type InstructionWithByteDelta = {
2265
+ byteDelta: number;
2266
+ };
2267
+
2268
+ /**
2269
+ * Get account metas and signers from resolved accounts.
2270
+ * @internal
2271
+ */
2272
+ export function getAccountMetaFactory(
2273
+ programAddress: Address,
2274
+ optionalAccountStrategy: 'omitted' | 'programId',
2275
+ ) {
2276
+ return (account: ResolvedAccount): AccountMeta | AccountSignerMeta | undefined => {
2277
+ if (!account.value) {
2278
+ if (optionalAccountStrategy === 'omitted') return;
2279
+ return Object.freeze({ address: programAddress, role: AccountRole.READONLY });
2280
+ }
2281
+
2282
+ const writableRole = account.isWritable ? AccountRole.WRITABLE : AccountRole.READONLY;
2283
+ return Object.freeze({
2284
+ address: expectAddress(account.value),
2285
+ role: isTransactionSigner(account.value) ? upgradeRoleToSigner(writableRole) : writableRole,
2286
+ ...(isTransactionSigner(account.value) ? { signer: account.value } : {})
2287
+ });
1781
2288
  };
1782
2289
  }
1783
2290
 
1784
- // src/getRenderMapVisitor.ts
1785
- var import_node_path3 = require("path");
1786
- var import_errors2 = require("@codama/errors");
2291
+ export function isTransactionSigner<TAddress extends string = string>(value: Address<TAddress> | ProgramDerivedAddress<TAddress> | TransactionSigner<TAddress>): value is TransactionSigner<TAddress> {
2292
+ return !!value && typeof value === 'object' && 'address' in value && kitIsTransactionSigner(value);
2293
+ }`;
2294
+ return (0, import_visitors_core26.pipe)(
2295
+ sharedPage,
2296
+ (f) => addFragmentImports(f, "solanaAddresses", [
2297
+ "type Address",
2298
+ "isProgramDerivedAddress",
2299
+ "type ProgramDerivedAddress"
2300
+ ]),
2301
+ (f) => addFragmentImports(f, "solanaInstructions", ["AccountRole", "type AccountMeta", "upgradeRoleToSigner"]),
2302
+ (f) => addFragmentImports(f, "solanaSigners", [
2303
+ "type AccountSignerMeta",
2304
+ "isTransactionSigner as kitIsTransactionSigner",
2305
+ "type TransactionSigner"
2306
+ ])
2307
+ );
2308
+ }
2309
+
2310
+ // src/fragments/typeDiscriminatedUnionHelpers.ts
1787
2311
  var import_nodes26 = require("@codama/nodes");
1788
- var import_renderers_core = require("@codama/renderers-core");
1789
- var import_visitors_core21 = require("@codama/visitors-core");
2312
+ function getTypeDiscriminatedUnionHelpersFragment(scope) {
2313
+ const { name, typeNode, nameApi } = scope;
2314
+ const isDiscriminatedUnion = (0, import_nodes26.isNode)(typeNode, "enumTypeNode") && (0, import_nodes26.isDataEnum)(typeNode);
2315
+ if (!isDiscriminatedUnion) return;
2316
+ const functionName = nameApi.discriminatedUnionFunction(name);
2317
+ const isDiscriminatedUnionFunctionName = nameApi.isDiscriminatedUnionFunction(name);
2318
+ const discriminatorName = nameApi.discriminatedUnionDiscriminator(name);
2319
+ const strictName = nameApi.dataType(name);
2320
+ const looseName = nameApi.dataArgsType(name);
2321
+ const getVariantContentType = use("type GetDiscriminatedUnionVariantContent", "solanaCodecsDataStructures");
2322
+ const getVariantType = use("type GetDiscriminatedUnionVariant", "solanaCodecsDataStructures");
2323
+ const variantSignatures = mergeFragments(
2324
+ typeNode.variants.map((variant) => {
2325
+ const variantName = nameApi.discriminatedUnionVariant(variant.name);
2326
+ if ((0, import_nodes26.isNode)(variant, "enumStructVariantTypeNode")) {
2327
+ return fragment`export function ${functionName}(kind: '${variantName}', data: ${getVariantContentType}<${looseName}, '${discriminatorName}', '${variantName}'>): ${getVariantType}<${looseName}, '${discriminatorName}', '${variantName}'>;`;
2328
+ }
2329
+ if ((0, import_nodes26.isNode)(variant, "enumTupleVariantTypeNode")) {
2330
+ return fragment`export function ${functionName}(kind: '${variantName}', data: ${getVariantContentType}<${looseName}, '${discriminatorName}', '${variantName}'>['fields']): ${getVariantType}<${looseName}, '${discriminatorName}', '${variantName}'>;`;
2331
+ }
2332
+ return fragment`export function ${functionName}(kind: '${variantName}'): ${getVariantType}<${looseName}, '${discriminatorName}', '${variantName}'>;`;
2333
+ }),
2334
+ (cs) => cs.length > 0 ? `${cs.join("\n")}
2335
+ ` : ""
2336
+ );
2337
+ return fragment`// Data Enum Helpers.
2338
+ ${variantSignatures}export function ${functionName}<K extends ${looseName}['${discriminatorName}'], Data>(kind: K, data?: Data) {
2339
+ return Array.isArray(data) ? { ${discriminatorName}: kind, fields: data } : { ${discriminatorName}: kind, ...(data ?? {}) };
2340
+ }
1790
2341
 
1791
- // src/getTypeManifestVisitor.ts
1792
- var import_nodes24 = require("@codama/nodes");
1793
- var import_visitors_core20 = require("@codama/visitors-core");
2342
+ export function ${isDiscriminatedUnionFunctionName}<K extends ${strictName}['${discriminatorName}']>(kind: K, value: ${strictName}): value is ${strictName} & { ${discriminatorName}: K } {
2343
+ return value.${discriminatorName} === kind;
2344
+ };
2345
+ `;
2346
+ }
2347
+
2348
+ // src/fragments/typePage.ts
2349
+ var import_visitors_core27 = require("@codama/visitors-core");
2350
+ function getTypePageFragment(scope) {
2351
+ const node = scope.node;
2352
+ const manifest = (0, import_visitors_core27.visit)(node, scope.typeManifestVisitor);
2353
+ return (0, import_visitors_core27.pipe)(
2354
+ mergeFragments(
2355
+ [
2356
+ getTypeWithCodecFragment({ ...scope, manifest, name: node.name, node: node.type, typeDocs: node.docs }),
2357
+ getTypeDiscriminatedUnionHelpersFragment({ ...scope, name: node.name, typeNode: node.type })
2358
+ ],
2359
+ (cs) => cs.join("\n\n")
2360
+ ),
2361
+ (f) => removeFragmentImports(f, "generatedTypes", [
2362
+ scope.nameApi.dataType(node.name),
2363
+ scope.nameApi.dataArgsType(node.name),
2364
+ scope.nameApi.encoderFunction(node.name),
2365
+ scope.nameApi.decoderFunction(node.name),
2366
+ scope.nameApi.codecFunction(node.name)
2367
+ ])
2368
+ );
2369
+ }
2370
+
2371
+ // src/visitors/getTypeManifestVisitor.ts
2372
+ var import_nodes27 = require("@codama/nodes");
2373
+ var import_renderers_core12 = require("@codama/renderers-core");
2374
+ var import_visitors_core28 = require("@codama/visitors-core");
1794
2375
  function getTypeManifestVisitor(input) {
1795
2376
  const { nameApi, linkables, nonScalarEnums, customAccountData, customInstructionData, getImportFrom } = input;
1796
- const stack = input.stack ?? new import_visitors_core20.NodeStack();
2377
+ const stack = input.stack ?? new import_visitors_core28.NodeStack();
1797
2378
  let parentName = null;
1798
- return (0, import_visitors_core20.pipe)(
1799
- (0, import_visitors_core20.staticVisitor)(
1800
- () => ({
1801
- decoder: fragment(""),
1802
- encoder: fragment(""),
1803
- isEnum: false,
1804
- looseType: fragment(""),
1805
- strictType: fragment(""),
1806
- value: fragment("")
1807
- }),
1808
- {
1809
- keys: [
1810
- ...import_nodes24.REGISTERED_TYPE_NODE_KINDS,
1811
- ...import_nodes24.REGISTERED_VALUE_NODE_KINDS,
1812
- "definedTypeLinkNode",
1813
- "definedTypeNode",
1814
- "accountNode",
1815
- "instructionNode"
1816
- ]
1817
- }
1818
- ),
1819
- (visitor) => (0, import_visitors_core20.extendVisitor)(visitor, {
2379
+ return (0, import_visitors_core28.pipe)(
2380
+ (0, import_visitors_core28.staticVisitor)(() => typeManifest(), {
2381
+ keys: [
2382
+ ...import_nodes27.REGISTERED_TYPE_NODE_KINDS,
2383
+ ...import_nodes27.REGISTERED_VALUE_NODE_KINDS,
2384
+ "definedTypeLinkNode",
2385
+ "definedTypeNode",
2386
+ "accountNode",
2387
+ "instructionNode"
2388
+ ]
2389
+ }),
2390
+ (visitor) => (0, import_visitors_core28.extendVisitor)(visitor, {
1820
2391
  visitAccount(account, { self }) {
1821
2392
  parentName = {
1822
2393
  loose: nameApi.dataArgsType(account.name),
1823
2394
  strict: nameApi.dataType(account.name)
1824
2395
  };
1825
2396
  const link = customAccountData.get(account.name)?.linkNode;
1826
- const manifest = link ? (0, import_visitors_core20.visit)(link, self) : (0, import_visitors_core20.visit)(account.data, self);
2397
+ const manifest = link ? (0, import_visitors_core28.visit)(link, self) : (0, import_visitors_core28.visit)(account.data, self);
1827
2398
  parentName = null;
1828
2399
  return manifest;
1829
2400
  },
1830
2401
  visitAmountType(amountType, { self }) {
1831
- return (0, import_visitors_core20.visit)(amountType.number, self);
2402
+ return (0, import_visitors_core28.visit)(amountType.number, self);
1832
2403
  },
1833
2404
  visitArrayType(arrayType, { self }) {
1834
- const childManifest = (0, import_visitors_core20.visit)(arrayType.item, self);
1835
- childManifest.looseType.mapRender((r) => `Array<${r}>`);
1836
- childManifest.strictType.mapRender((r) => `Array<${r}>`);
2405
+ const childManifest = (0, import_visitors_core28.visit)(arrayType.item, self);
1837
2406
  const sizeManifest = getArrayLikeSizeOption(arrayType.count, self);
1838
- const encoderOptions = sizeManifest.encoder.render ? `, { ${sizeManifest.encoder.render} }` : "";
1839
- const decoderOptions = sizeManifest.decoder.render ? `, { ${sizeManifest.decoder.render} }` : "";
1840
- childManifest.encoder.mapRender((r) => `getArrayEncoder(${r + encoderOptions})`).mergeImportsWith(sizeManifest.encoder).addImports("solanaCodecsDataStructures", "getArrayEncoder");
1841
- childManifest.decoder.mapRender((r) => `getArrayDecoder(${r + decoderOptions})`).mergeImportsWith(sizeManifest.decoder).addImports("solanaCodecsDataStructures", "getArrayDecoder");
1842
- return childManifest;
2407
+ const encoderOptions = sizeManifest.encoder ? fragment`, { ${sizeManifest.encoder} }` : "";
2408
+ const decoderOptions = sizeManifest.decoder ? fragment`, { ${sizeManifest.decoder} }` : "";
2409
+ return typeManifest({
2410
+ ...childManifest,
2411
+ decoder: fragment`${use("getArrayDecoder", "solanaCodecsDataStructures")}(${childManifest.decoder}${decoderOptions})`,
2412
+ encoder: fragment`${use("getArrayEncoder", "solanaCodecsDataStructures")}(${childManifest.encoder}${encoderOptions})`,
2413
+ looseType: fragment`Array<${childManifest.looseType}>`,
2414
+ strictType: fragment`Array<${childManifest.strictType}>`
2415
+ });
1843
2416
  },
1844
2417
  visitArrayValue(node, { self }) {
1845
- return mergeManifests(
1846
- node.items.map((v) => (0, import_visitors_core20.visit)(v, self)),
2418
+ return mergeTypeManifests(
2419
+ node.items.map((v) => (0, import_visitors_core28.visit)(v, self)),
1847
2420
  { mergeValues: (renders) => `[${renders.join(", ")}]` }
1848
2421
  );
1849
2422
  },
1850
2423
  visitBooleanType(booleanType, { self }) {
1851
- const encoderImports = new ImportMap().add("solanaCodecsDataStructures", "getBooleanEncoder");
1852
- const decoderImports = new ImportMap().add("solanaCodecsDataStructures", "getBooleanDecoder");
1853
- let sizeEncoder = "";
1854
- let sizeDecoder = "";
1855
- const resolvedSize = (0, import_nodes24.resolveNestedTypeNode)(booleanType.size);
2424
+ let sizeEncoder = fragment``;
2425
+ let sizeDecoder = fragment``;
2426
+ const resolvedSize = (0, import_nodes27.resolveNestedTypeNode)(booleanType.size);
1856
2427
  if (resolvedSize.format !== "u8" || resolvedSize.endian !== "le") {
1857
- const size = (0, import_visitors_core20.visit)(booleanType.size, self);
1858
- encoderImports.mergeWith(size.encoder);
1859
- decoderImports.mergeWith(size.decoder);
1860
- sizeEncoder = `{ size: ${size.encoder.render} }`;
1861
- sizeDecoder = `{ size: ${size.decoder.render} }`;
2428
+ const size = (0, import_visitors_core28.visit)(booleanType.size, self);
2429
+ sizeEncoder = fragment`{ size: ${size.encoder} }`;
2430
+ sizeDecoder = fragment`{ size: ${size.decoder} }`;
1862
2431
  }
1863
- return {
1864
- decoder: fragment(`getBooleanDecoder(${sizeDecoder})`, decoderImports),
1865
- encoder: fragment(`getBooleanEncoder(${sizeEncoder})`, encoderImports),
1866
- isEnum: false,
1867
- looseType: fragment("boolean"),
1868
- strictType: fragment("boolean"),
1869
- value: fragment("")
1870
- };
2432
+ return typeManifest({
2433
+ decoder: fragment`${use("getBooleanDecoder", "solanaCodecsDataStructures")}(${sizeDecoder})`,
2434
+ encoder: fragment`${use("getBooleanEncoder", "solanaCodecsDataStructures")}(${sizeEncoder})`,
2435
+ looseType: fragment`boolean`,
2436
+ strictType: fragment`boolean`
2437
+ });
1871
2438
  },
1872
2439
  visitBooleanValue(node) {
1873
- const manifest = typeManifest();
1874
- manifest.value.setRender(JSON.stringify(node.boolean));
1875
- return manifest;
2440
+ return typeManifest({ value: fragment`${JSON.stringify(node.boolean)}` });
1876
2441
  },
1877
2442
  visitBytesType() {
1878
- return {
1879
- decoder: fragment(`getBytesDecoder()`).addImports(
1880
- "solanaCodecsDataStructures",
1881
- "getBytesDecoder"
1882
- ),
1883
- encoder: fragment(`getBytesEncoder()`).addImports(
1884
- "solanaCodecsDataStructures",
1885
- "getBytesEncoder"
1886
- ),
1887
- isEnum: false,
1888
- looseType: fragment("ReadonlyUint8Array").addImports(
1889
- "solanaCodecsCore",
1890
- "type ReadonlyUint8Array"
1891
- ),
1892
- strictType: fragment("ReadonlyUint8Array").addImports(
1893
- "solanaCodecsCore",
1894
- "type ReadonlyUint8Array"
1895
- ),
1896
- value: fragment("")
1897
- };
2443
+ const readonlyUint8Array = use("type ReadonlyUint8Array", "solanaCodecsCore");
2444
+ return typeManifest({
2445
+ decoder: fragment`${use("getBytesDecoder", "solanaCodecsDataStructures")}()`,
2446
+ encoder: fragment`${use("getBytesEncoder", "solanaCodecsDataStructures")}()`,
2447
+ looseType: readonlyUint8Array,
2448
+ strictType: readonlyUint8Array
2449
+ });
1898
2450
  },
1899
2451
  visitBytesValue(node) {
1900
- const manifest = typeManifest();
1901
2452
  const bytes = getBytesFromBytesValueNode(node);
1902
- manifest.value.setRender(`new Uint8Array([${Array.from(bytes).join(", ")}])`);
1903
- return manifest;
2453
+ return typeManifest({ value: fragment`new Uint8Array([${Array.from(bytes).join(", ")}])` });
1904
2454
  },
1905
2455
  visitConstantValue(node, { self }) {
1906
- if ((0, import_nodes24.isNode)(node.type, "bytesTypeNode") && (0, import_nodes24.isNode)(node.value, "bytesValueNode")) {
1907
- return (0, import_visitors_core20.visit)(node.value, self);
2456
+ if ((0, import_nodes27.isNode)(node.type, "bytesTypeNode") && (0, import_nodes27.isNode)(node.value, "bytesValueNode")) {
2457
+ return (0, import_visitors_core28.visit)(node.value, self);
1908
2458
  }
1909
- return {
1910
- ...typeManifest(),
1911
- value: mergeFragments(
1912
- [(0, import_visitors_core20.visit)(node.type, self).encoder, (0, import_visitors_core20.visit)(node.value, self).value],
1913
- ([encoderFunction, value]) => `${encoderFunction}.encode(${value})`
1914
- )
1915
- };
2459
+ return typeManifest({
2460
+ value: fragment`${(0, import_visitors_core28.visit)(node.type, self).encoder}.encode(${(0, import_visitors_core28.visit)(node.value, self).value})`
2461
+ });
1916
2462
  },
1917
2463
  visitDateTimeType(dateTimeType, { self }) {
1918
- return (0, import_visitors_core20.visit)(dateTimeType.number, self);
2464
+ return (0, import_visitors_core28.visit)(dateTimeType.number, self);
1919
2465
  },
1920
2466
  visitDefinedType(definedType, { self }) {
1921
2467
  parentName = {
1922
2468
  loose: nameApi.dataArgsType(definedType.name),
1923
2469
  strict: nameApi.dataType(definedType.name)
1924
2470
  };
1925
- const manifest = (0, import_visitors_core20.visit)(definedType.type, self);
2471
+ const manifest = (0, import_visitors_core28.visit)(definedType.type, self);
1926
2472
  parentName = null;
1927
2473
  return manifest;
1928
2474
  },
@@ -1932,127 +2478,130 @@ function getTypeManifestVisitor(input) {
1932
2478
  const encoderFunction = nameApi.encoderFunction(node.name);
1933
2479
  const decoderFunction = nameApi.decoderFunction(node.name);
1934
2480
  const importFrom = getImportFrom(node);
1935
- return {
1936
- decoder: fragment(`${decoderFunction}()`).addImports(importFrom, decoderFunction),
1937
- encoder: fragment(`${encoderFunction}()`).addImports(importFrom, encoderFunction),
1938
- isEnum: false,
1939
- looseType: fragment(looseName).addImports(importFrom, `type ${looseName}`),
1940
- strictType: fragment(strictName).addImports(importFrom, `type ${strictName}`),
1941
- value: fragment("")
1942
- };
2481
+ return typeManifest({
2482
+ decoder: fragment`${use(decoderFunction, importFrom)}()`,
2483
+ encoder: fragment`${use(encoderFunction, importFrom)}()`,
2484
+ looseType: use(`type ${looseName}`, importFrom),
2485
+ strictType: use(`type ${strictName}`, importFrom)
2486
+ });
1943
2487
  },
1944
2488
  visitEnumEmptyVariantType(enumEmptyVariantType) {
1945
- const discriminator = nameApi.discriminatedUnionDiscriminator((0, import_nodes24.camelCase)(parentName?.strict ?? ""));
2489
+ const discriminator = nameApi.discriminatedUnionDiscriminator((0, import_nodes27.camelCase)(parentName?.strict ?? ""));
1946
2490
  const name = nameApi.discriminatedUnionVariant(enumEmptyVariantType.name);
1947
2491
  const kindAttribute = `${discriminator}: "${name}"`;
1948
- return {
1949
- decoder: fragment(`['${name}', getUnitDecoder()]`).addImports(
1950
- "solanaCodecsDataStructures",
1951
- "getUnitDecoder"
1952
- ),
1953
- encoder: fragment(`['${name}', getUnitEncoder()]`).addImports(
1954
- "solanaCodecsDataStructures",
1955
- "getUnitEncoder"
1956
- ),
1957
- isEnum: false,
1958
- looseType: fragment(`{ ${kindAttribute} }`),
1959
- strictType: fragment(`{ ${kindAttribute} }`),
1960
- value: fragment("")
1961
- };
2492
+ return typeManifest({
2493
+ decoder: fragment`['${name}', ${use("getUnitDecoder", "solanaCodecsDataStructures")}()]`,
2494
+ encoder: fragment`['${name}', ${use("getUnitEncoder", "solanaCodecsDataStructures")}()]`,
2495
+ looseType: fragment`{ ${kindAttribute} }`,
2496
+ strictType: fragment`{ ${kindAttribute} }`
2497
+ });
1962
2498
  },
1963
2499
  visitEnumStructVariantType(enumStructVariantType, { self }) {
1964
2500
  const currentParentName = parentName;
1965
2501
  const discriminator = nameApi.discriminatedUnionDiscriminator(
1966
- (0, import_nodes24.camelCase)(currentParentName?.strict ?? "")
2502
+ (0, import_nodes27.camelCase)(currentParentName?.strict ?? "")
1967
2503
  );
1968
2504
  const name = nameApi.discriminatedUnionVariant(enumStructVariantType.name);
1969
2505
  const kindAttribute = `${discriminator}: "${name}"`;
1970
2506
  parentName = null;
1971
- const structManifest = (0, import_visitors_core20.visit)(enumStructVariantType.struct, self);
2507
+ const structManifest = (0, import_visitors_core28.visit)(enumStructVariantType.struct, self);
1972
2508
  parentName = currentParentName;
1973
- structManifest.strictType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1974
- structManifest.looseType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1975
- structManifest.encoder.mapRender((r) => `['${name}', ${r}]`);
1976
- structManifest.decoder.mapRender((r) => `['${name}', ${r}]`);
1977
- return structManifest;
2509
+ return typeManifest({
2510
+ ...structManifest,
2511
+ decoder: fragment`['${name}', ${structManifest.decoder}]`,
2512
+ encoder: fragment`['${name}', ${structManifest.encoder}]`,
2513
+ looseType: (0, import_visitors_core28.pipe)(
2514
+ structManifest.looseType,
2515
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `{ ${kindAttribute},${c.slice(1, -1)}}`)
2516
+ ),
2517
+ strictType: (0, import_visitors_core28.pipe)(
2518
+ structManifest.strictType,
2519
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `{ ${kindAttribute},${c.slice(1, -1)}}`)
2520
+ )
2521
+ });
1978
2522
  },
1979
2523
  visitEnumTupleVariantType(enumTupleVariantType, { self }) {
1980
2524
  const currentParentName = parentName;
1981
2525
  const discriminator = nameApi.discriminatedUnionDiscriminator(
1982
- (0, import_nodes24.camelCase)(currentParentName?.strict ?? "")
2526
+ (0, import_nodes27.camelCase)(currentParentName?.strict ?? "")
1983
2527
  );
1984
2528
  const name = nameApi.discriminatedUnionVariant(enumTupleVariantType.name);
1985
2529
  const kindAttribute = `${discriminator}: "${name}"`;
1986
- const struct = (0, import_nodes24.structTypeNode)([
1987
- (0, import_nodes24.structFieldTypeNode)({
2530
+ const struct = (0, import_nodes27.structTypeNode)([
2531
+ (0, import_nodes27.structFieldTypeNode)({
1988
2532
  name: "fields",
1989
2533
  type: enumTupleVariantType.tuple
1990
2534
  })
1991
2535
  ]);
1992
2536
  parentName = null;
1993
- const structManifest = (0, import_visitors_core20.visit)(struct, self);
2537
+ const structManifest = (0, import_visitors_core28.visit)(struct, self);
1994
2538
  parentName = currentParentName;
1995
- structManifest.strictType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1996
- structManifest.looseType.mapRender((r) => `{ ${kindAttribute},${r.slice(1, -1)}}`);
1997
- structManifest.encoder.mapRender((r) => `['${name}', ${r}]`);
1998
- structManifest.decoder.mapRender((r) => `['${name}', ${r}]`);
1999
- return structManifest;
2539
+ return typeManifest({
2540
+ ...structManifest,
2541
+ decoder: fragment`['${name}', ${structManifest.decoder}]`,
2542
+ encoder: fragment`['${name}', ${structManifest.encoder}]`,
2543
+ looseType: (0, import_visitors_core28.pipe)(
2544
+ structManifest.looseType,
2545
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `{ ${kindAttribute},${c.slice(1, -1)}}`)
2546
+ ),
2547
+ strictType: (0, import_visitors_core28.pipe)(
2548
+ structManifest.strictType,
2549
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `{ ${kindAttribute},${c.slice(1, -1)}}`)
2550
+ )
2551
+ });
2000
2552
  },
2001
2553
  visitEnumType(enumType, { self }) {
2002
2554
  const currentParentName = parentName;
2003
- const encoderImports = new ImportMap();
2004
- const decoderImports = new ImportMap();
2005
2555
  const encoderOptions = [];
2006
2556
  const decoderOptions = [];
2007
- const enumSize = (0, import_nodes24.resolveNestedTypeNode)(enumType.size);
2557
+ const enumSize = (0, import_nodes27.resolveNestedTypeNode)(enumType.size);
2008
2558
  if (enumSize.format !== "u8" || enumSize.endian !== "le") {
2009
- const sizeManifest = (0, import_visitors_core20.visit)(enumType.size, self);
2010
- encoderImports.mergeWith(sizeManifest.encoder);
2011
- decoderImports.mergeWith(sizeManifest.decoder);
2012
- encoderOptions.push(`size: ${sizeManifest.encoder.render}`);
2013
- decoderOptions.push(`size: ${sizeManifest.decoder.render}`);
2559
+ const sizeManifest = (0, import_visitors_core28.visit)(enumType.size, self);
2560
+ encoderOptions.push(fragment`size: ${sizeManifest.encoder}`);
2561
+ decoderOptions.push(fragment`size: ${sizeManifest.decoder}`);
2014
2562
  }
2015
2563
  const discriminator = nameApi.discriminatedUnionDiscriminator(
2016
- (0, import_nodes24.camelCase)(currentParentName?.strict ?? "")
2564
+ (0, import_nodes27.camelCase)(currentParentName?.strict ?? "")
2017
2565
  );
2018
- if (!(0, import_nodes24.isScalarEnum)(enumType) && discriminator !== "__kind") {
2019
- encoderOptions.push(`discriminator: '${discriminator}'`);
2020
- decoderOptions.push(`discriminator: '${discriminator}'`);
2566
+ if (!(0, import_nodes27.isScalarEnum)(enumType) && discriminator !== "__kind") {
2567
+ encoderOptions.push(fragment`discriminator: '${discriminator}'`);
2568
+ decoderOptions.push(fragment`discriminator: '${discriminator}'`);
2021
2569
  }
2022
- const encoderOptionsAsString = encoderOptions.length > 0 ? `, { ${encoderOptions.join(", ")} }` : "";
2023
- const decoderOptionsAsString = decoderOptions.length > 0 ? `, { ${decoderOptions.join(", ")} }` : "";
2024
- if ((0, import_nodes24.isScalarEnum)(enumType)) {
2570
+ const encoderOptionsFragment = mergeFragments(
2571
+ encoderOptions,
2572
+ (cs) => cs.length > 0 ? `, { ${cs.join(", ")} }` : ""
2573
+ );
2574
+ const decoderOptionsFragment = mergeFragments(
2575
+ decoderOptions,
2576
+ (cs) => cs.length > 0 ? `, { ${cs.join(", ")} }` : ""
2577
+ );
2578
+ if ((0, import_nodes27.isScalarEnum)(enumType)) {
2025
2579
  if (currentParentName === null) {
2026
2580
  throw new Error(
2027
2581
  "Scalar enums cannot be inlined and must be introduced via a defined type. Ensure you are not inlining a defined type that is a scalar enum through a visitor."
2028
2582
  );
2029
2583
  }
2030
2584
  const variantNames = enumType.variants.map(({ name }) => nameApi.enumVariant(name));
2031
- return {
2032
- decoder: fragment(
2033
- `getEnumDecoder(${currentParentName.strict + decoderOptionsAsString})`,
2034
- decoderImports.add("solanaCodecsDataStructures", "getEnumDecoder")
2035
- ),
2036
- encoder: fragment(
2037
- `getEnumEncoder(${currentParentName.strict + encoderOptionsAsString})`,
2038
- encoderImports.add("solanaCodecsDataStructures", "getEnumEncoder")
2039
- ),
2585
+ return typeManifest({
2586
+ decoder: fragment`${use("getEnumDecoder", "solanaCodecsDataStructures")}(${currentParentName.strict}${decoderOptionsFragment})`,
2587
+ encoder: fragment`${use("getEnumEncoder", "solanaCodecsDataStructures")}(${currentParentName.strict}${encoderOptionsFragment})`,
2040
2588
  isEnum: true,
2041
- looseType: fragment(`{ ${variantNames.join(", ")} }`),
2042
- strictType: fragment(`{ ${variantNames.join(", ")} }`),
2043
- value: fragment("")
2044
- };
2589
+ looseType: fragment`{ ${variantNames.join(", ")} }`,
2590
+ strictType: fragment`{ ${variantNames.join(", ")} }`
2591
+ });
2045
2592
  }
2046
- const mergedManifest = mergeManifests(
2047
- enumType.variants.map((variant) => (0, import_visitors_core20.visit)(variant, self)),
2593
+ const mergedManifest = mergeTypeManifests(
2594
+ enumType.variants.map((variant) => (0, import_visitors_core28.visit)(variant, self)),
2048
2595
  {
2049
2596
  mergeCodecs: (renders) => renders.join(", "),
2050
2597
  mergeTypes: (renders) => renders.join(" | ")
2051
2598
  }
2052
2599
  );
2053
- mergedManifest.encoder.mapRender((r) => `getDiscriminatedUnionEncoder([${r}]${encoderOptionsAsString})`).mergeImportsWith(encoderImports).addImports("solanaCodecsDataStructures", ["getDiscriminatedUnionEncoder"]);
2054
- mergedManifest.decoder.mapRender((r) => `getDiscriminatedUnionDecoder([${r}]${decoderOptionsAsString})`).mergeImportsWith(decoderImports).addImports("solanaCodecsDataStructures", ["getDiscriminatedUnionDecoder"]);
2055
- return mergedManifest;
2600
+ return typeManifest({
2601
+ ...mergedManifest,
2602
+ decoder: fragment`${use("getDiscriminatedUnionDecoder", "solanaCodecsDataStructures")}([${mergedManifest.decoder}]${decoderOptionsFragment})`,
2603
+ encoder: fragment`${use("getDiscriminatedUnionEncoder", "solanaCodecsDataStructures")}([${mergedManifest.encoder}]${encoderOptionsFragment})`
2604
+ });
2056
2605
  },
2057
2606
  visitEnumValue(node, { self }) {
2058
2607
  const manifest = typeManifest();
@@ -2060,43 +2609,79 @@ function getTypeManifestVisitor(input) {
2060
2609
  const enumFunction = nameApi.discriminatedUnionFunction(node.enum.name);
2061
2610
  const importFrom = getImportFrom(node.enum);
2062
2611
  const enumNode = linkables.get([...stack.getPath(), node.enum])?.type;
2063
- const isScalar = enumNode && (0, import_nodes24.isNode)(enumNode, "enumTypeNode") ? (0, import_nodes24.isScalarEnum)(enumNode) : !nonScalarEnums.includes(node.enum.name);
2612
+ const isScalar = enumNode && (0, import_nodes27.isNode)(enumNode, "enumTypeNode") ? (0, import_nodes27.isScalarEnum)(enumNode) : !nonScalarEnums.includes(node.enum.name);
2064
2613
  if (!node.value && isScalar) {
2065
2614
  const variantName2 = nameApi.enumVariant(node.variant);
2066
- manifest.value.setRender(`${enumName}.${variantName2}`).addImports(importFrom, enumName);
2067
- return manifest;
2615
+ return typeManifest({
2616
+ ...manifest,
2617
+ value: (0, import_visitors_core28.pipe)(
2618
+ manifest.value,
2619
+ (f) => (0, import_renderers_core12.setFragmentContent)(f, `${enumName}.${variantName2}`),
2620
+ (f) => addFragmentImports(f, importFrom, [enumName])
2621
+ )
2622
+ });
2068
2623
  }
2069
2624
  const variantName = nameApi.discriminatedUnionVariant(node.variant);
2070
2625
  if (!node.value) {
2071
- manifest.value.setRender(`${enumFunction}('${variantName}')`).addImports(importFrom, enumFunction);
2072
- return manifest;
2626
+ return typeManifest({
2627
+ ...manifest,
2628
+ value: (0, import_visitors_core28.pipe)(
2629
+ manifest.value,
2630
+ (f) => (0, import_renderers_core12.setFragmentContent)(f, `${enumFunction}('${variantName}')`),
2631
+ (f) => addFragmentImports(f, importFrom, [enumFunction])
2632
+ )
2633
+ });
2073
2634
  }
2074
- manifest.value = (0, import_visitors_core20.visit)(node.value, self).value.mapRender((r) => `${enumFunction}('${variantName}', ${r})`).addImports(importFrom, enumFunction);
2075
- return manifest;
2635
+ return typeManifest({
2636
+ ...manifest,
2637
+ value: (0, import_visitors_core28.pipe)(
2638
+ (0, import_visitors_core28.visit)(node.value, self).value,
2639
+ (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `${enumFunction}('${variantName}', ${c})`),
2640
+ (f) => addFragmentImports(f, importFrom, [enumFunction])
2641
+ )
2642
+ });
2076
2643
  },
2077
2644
  visitFixedSizeType(node, { self }) {
2078
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2079
- manifest.encoder.mapRender((r) => `fixEncoderSize(${r}, ${node.size})`).addImports("solanaCodecsCore", "fixEncoderSize");
2080
- manifest.decoder.mapRender((r) => `fixDecoderSize(${r}, ${node.size})`).addImports("solanaCodecsCore", "fixDecoderSize");
2081
- return manifest;
2645
+ const manifest = (0, import_visitors_core28.visit)(node.type, self);
2646
+ return typeManifest({
2647
+ ...manifest,
2648
+ decoder: fragment`${use("fixDecoderSize", "solanaCodecsCore")}(${manifest.decoder}, ${node.size})`,
2649
+ encoder: fragment`${use("fixEncoderSize", "solanaCodecsCore")}(${manifest.encoder}, ${node.size})`
2650
+ });
2082
2651
  },
2083
2652
  visitHiddenPrefixType(node, { self }) {
2084
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2085
- const prefixes = node.prefix.map((c) => (0, import_visitors_core20.visit)(c, self).value);
2086
- const prefixEncoders = fragment(prefixes.map((c) => `getConstantEncoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantEncoder").mergeImportsWith(...prefixes);
2087
- const prefixDecoders = fragment(prefixes.map((c) => `getConstantDecoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantDecoder").mergeImportsWith(...prefixes);
2088
- manifest.encoder.mapRender((r) => `getHiddenPrefixEncoder(${r}, [${prefixEncoders.render}])`).mergeImportsWith(prefixEncoders).addImports("solanaCodecsDataStructures", "getHiddenPrefixEncoder");
2089
- manifest.decoder.mapRender((r) => `getHiddenPrefixDecoder(${r}, [${prefixDecoders.render}])`).mergeImportsWith(prefixDecoders).addImports("solanaCodecsDataStructures", "getHiddenPrefixDecoder");
2090
- return manifest;
2653
+ const manifest = (0, import_visitors_core28.visit)(node.type, self);
2654
+ const prefixes = node.prefix.map((c) => (0, import_visitors_core28.visit)(c, self).value);
2655
+ const prefixEncoders = (0, import_visitors_core28.pipe)(
2656
+ mergeFragments(prefixes, (cs) => cs.map((c) => `getConstantEncoder(${c})`).join(", ")),
2657
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["getConstantEncoder"])
2658
+ );
2659
+ const prefixDecoders = (0, import_visitors_core28.pipe)(
2660
+ mergeFragments(prefixes, (cs) => cs.map((c) => `getConstantDecoder(${c})`).join(", ")),
2661
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["getConstantDecoder"])
2662
+ );
2663
+ return typeManifest({
2664
+ ...manifest,
2665
+ decoder: fragment`${use("getHiddenPrefixDecoder", "solanaCodecsDataStructures")}(${manifest.decoder}, [${prefixDecoders}])`,
2666
+ encoder: fragment`${use("getHiddenPrefixEncoder", "solanaCodecsDataStructures")}(${manifest.encoder}, [${prefixEncoders}])`
2667
+ });
2091
2668
  },
2092
2669
  visitHiddenSuffixType(node, { self }) {
2093
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2094
- const suffixes = node.suffix.map((c) => (0, import_visitors_core20.visit)(c, self).value);
2095
- const suffixEncoders = fragment(suffixes.map((c) => `getConstantEncoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantEncoder").mergeImportsWith(...suffixes);
2096
- const suffixDecoders = fragment(suffixes.map((c) => `getConstantDecoder(${c.render})`).join(", ")).addImports("solanaCodecsCore", "getConstantDecoder").mergeImportsWith(...suffixes);
2097
- manifest.encoder.mapRender((r) => `getHiddenSuffixEncoder(${r}, [${suffixEncoders.render}])`).mergeImportsWith(suffixEncoders).addImports("solanaCodecsDataStructures", "getHiddenSuffixEncoder");
2098
- manifest.decoder.mapRender((r) => `getHiddenSuffixDecoder(${r}, [${suffixDecoders.render}])`).mergeImportsWith(suffixDecoders).addImports("solanaCodecsDataStructures", "getHiddenSuffixDecoder");
2099
- return manifest;
2670
+ const manifest = (0, import_visitors_core28.visit)(node.type, self);
2671
+ const suffixes = node.suffix.map((c) => (0, import_visitors_core28.visit)(c, self).value);
2672
+ const suffixEncoders = (0, import_visitors_core28.pipe)(
2673
+ mergeFragments(suffixes, (cs) => cs.map((c) => `getConstantEncoder(${c})`).join(", ")),
2674
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["getConstantEncoder"])
2675
+ );
2676
+ const suffixDecoders = (0, import_visitors_core28.pipe)(
2677
+ mergeFragments(suffixes, (cs) => cs.map((c) => `getConstantDecoder(${c})`).join(", ")),
2678
+ (f) => addFragmentImports(f, "solanaCodecsCore", ["getConstantDecoder"])
2679
+ );
2680
+ return typeManifest({
2681
+ ...manifest,
2682
+ decoder: fragment`${use("getHiddenSuffixDecoder", "solanaCodecsDataStructures")}(${manifest.decoder}, [${suffixDecoders}])`,
2683
+ encoder: fragment`${use("getHiddenSuffixEncoder", "solanaCodecsDataStructures")}(${manifest.encoder}, [${suffixEncoders}])`
2684
+ });
2100
2685
  },
2101
2686
  visitInstruction(instruction, { self }) {
2102
2687
  const instructionDataName = nameApi.instructionDataType(instruction.name);
@@ -2105,97 +2690,96 @@ function getTypeManifestVisitor(input) {
2105
2690
  strict: nameApi.dataType(instructionDataName)
2106
2691
  };
2107
2692
  const link = customInstructionData.get(instruction.name)?.linkNode;
2108
- const struct = (0, import_nodes24.structTypeNodeFromInstructionArgumentNodes)(instruction.arguments);
2109
- const manifest = link ? (0, import_visitors_core20.visit)(link, self) : (0, import_visitors_core20.visit)(struct, self);
2693
+ const struct = (0, import_nodes27.structTypeNodeFromInstructionArgumentNodes)(instruction.arguments);
2694
+ const manifest = link ? (0, import_visitors_core28.visit)(link, self) : (0, import_visitors_core28.visit)(struct, self);
2110
2695
  parentName = null;
2111
2696
  return manifest;
2112
2697
  },
2113
2698
  visitMapEntryValue(node, { self }) {
2114
- return mergeManifests([(0, import_visitors_core20.visit)(node.key, self), (0, import_visitors_core20.visit)(node.value, self)], {
2699
+ return mergeTypeManifests([(0, import_visitors_core28.visit)(node.key, self), (0, import_visitors_core28.visit)(node.value, self)], {
2115
2700
  mergeValues: (renders) => `[${renders.join(", ")}]`
2116
2701
  });
2117
2702
  },
2118
2703
  visitMapType(mapType, { self }) {
2119
- const key = (0, import_visitors_core20.visit)(mapType.key, self);
2120
- const value = (0, import_visitors_core20.visit)(mapType.value, self);
2121
- const mergedManifest = mergeManifests([key, value], {
2704
+ const key = (0, import_visitors_core28.visit)(mapType.key, self);
2705
+ const value = (0, import_visitors_core28.visit)(mapType.value, self);
2706
+ const mergedManifest = mergeTypeManifests([key, value], {
2122
2707
  mergeCodecs: ([k, v]) => `${k}, ${v}`,
2123
2708
  mergeTypes: ([k, v]) => `Map<${k}, ${v}>`
2124
2709
  });
2125
2710
  const sizeManifest = getArrayLikeSizeOption(mapType.count, self);
2126
- const encoderOptions = sizeManifest.encoder.render ? `, { ${sizeManifest.encoder.render} }` : "";
2127
- const decoderOptions = sizeManifest.decoder.render ? `, { ${sizeManifest.decoder.render} }` : "";
2128
- mergedManifest.encoder.mapRender((r) => `getMapEncoder(${r}${encoderOptions})`).addImports("solanaCodecsDataStructures", "getMapEncoder");
2129
- mergedManifest.decoder.mapRender((r) => `getMapDecoder(${r}${decoderOptions})`).addImports("solanaCodecsDataStructures", "getMapDecoder");
2130
- return mergedManifest;
2711
+ const encoderOptions = sizeManifest.encoder ? fragment`, { ${sizeManifest.encoder} }` : "";
2712
+ const decoderOptions = sizeManifest.decoder ? fragment`, { ${sizeManifest.decoder} }` : "";
2713
+ return typeManifest({
2714
+ ...mergedManifest,
2715
+ decoder: fragment`${use("getMapDecoder", "solanaCodecsDataStructures")}(${mergedManifest.decoder}${decoderOptions})`,
2716
+ encoder: fragment`${use("getMapEncoder", "solanaCodecsDataStructures")}(${mergedManifest.encoder}${encoderOptions})`
2717
+ });
2131
2718
  },
2132
2719
  visitMapValue(node, { self }) {
2133
- const entryFragments = node.entries.map((entry) => (0, import_visitors_core20.visit)(entry, self));
2134
- return mergeManifests(entryFragments, {
2720
+ const entryFragments = node.entries.map((entry) => (0, import_visitors_core28.visit)(entry, self));
2721
+ return mergeTypeManifests(entryFragments, {
2135
2722
  mergeValues: (renders) => `new Map([${renders.join(", ")}])`
2136
2723
  });
2137
2724
  },
2138
2725
  visitNoneValue() {
2139
- const manifest = typeManifest();
2140
- manifest.value.setRender("none()").addImports("solanaOptions", "none");
2141
- return manifest;
2726
+ return typeManifest({
2727
+ value: fragment`${use("none", "solanaOptions")}()`
2728
+ });
2142
2729
  },
2143
2730
  visitNumberType(numberType) {
2144
- const encoderFunction = nameApi.encoderFunction(numberType.format);
2145
- const decoderFunction = nameApi.decoderFunction(numberType.format);
2731
+ const encoderFunction = use(nameApi.encoderFunction(numberType.format), "solanaCodecsNumbers");
2732
+ const decoderFunction = use(nameApi.decoderFunction(numberType.format), "solanaCodecsNumbers");
2146
2733
  const isBigNumber = ["u64", "u128", "i64", "i128"].includes(numberType.format);
2147
- const encoderImports = new ImportMap().add("solanaCodecsNumbers", encoderFunction);
2148
- const decoderImports = new ImportMap().add("solanaCodecsNumbers", decoderFunction);
2149
- let endianness = "";
2150
- if (numberType.endian === "be") {
2151
- encoderImports.add("solanaCodecsNumbers", "Endian");
2152
- decoderImports.add("solanaCodecsNumbers", "Endian");
2153
- endianness = "{ endian: Endian.Big }";
2154
- }
2155
- return {
2156
- decoder: fragment(`${decoderFunction}(${endianness})`, decoderImports),
2157
- encoder: fragment(`${encoderFunction}(${endianness})`, encoderImports),
2158
- isEnum: false,
2159
- looseType: fragment(isBigNumber ? "number | bigint" : "number"),
2160
- strictType: fragment(isBigNumber ? "bigint" : "number"),
2161
- value: fragment("")
2162
- };
2734
+ const endianness = numberType.endian === "be" ? fragment`{ endian: ${use("Endian", "solanaCodecsNumbers")}.Big }` : "";
2735
+ return typeManifest({
2736
+ decoder: fragment`${decoderFunction}(${endianness})`,
2737
+ encoder: fragment`${encoderFunction}(${endianness})`,
2738
+ looseType: fragment`${isBigNumber ? "number | bigint" : "number"}`,
2739
+ strictType: fragment`${isBigNumber ? "bigint" : "number"}`
2740
+ });
2163
2741
  },
2164
2742
  visitNumberValue(node) {
2165
- const manifest = typeManifest();
2166
- manifest.value.setRender(JSON.stringify(node.number));
2167
- return manifest;
2743
+ return typeManifest({ value: fragment`${JSON.stringify(node.number)}` });
2168
2744
  },
2169
2745
  visitOptionType(optionType, { self }) {
2170
- const childManifest = (0, import_visitors_core20.visit)(optionType.item, self);
2171
- childManifest.strictType.mapRender((r) => `Option<${r}>`).addImports("solanaOptions", "type Option");
2172
- childManifest.looseType.mapRender((r) => `OptionOrNullable<${r}>`).addImports("solanaOptions", "type OptionOrNullable");
2746
+ const childManifest = (0, import_visitors_core28.visit)(optionType.item, self);
2173
2747
  const encoderOptions = [];
2174
2748
  const decoderOptions = [];
2175
- const optionPrefix = (0, import_nodes24.resolveNestedTypeNode)(optionType.prefix);
2749
+ const optionPrefix = (0, import_nodes27.resolveNestedTypeNode)(optionType.prefix);
2176
2750
  if (optionPrefix.format !== "u8" || optionPrefix.endian !== "le") {
2177
- const prefixManifest = (0, import_visitors_core20.visit)(optionType.prefix, self);
2178
- childManifest.encoder.mergeImportsWith(prefixManifest.encoder);
2179
- childManifest.decoder.mergeImportsWith(prefixManifest.decoder);
2180
- encoderOptions.push(`prefix: ${prefixManifest.encoder.render}`);
2181
- decoderOptions.push(`prefix: ${prefixManifest.decoder.render}`);
2751
+ const prefixManifest = (0, import_visitors_core28.visit)(optionType.prefix, self);
2752
+ encoderOptions.push(fragment`prefix: ${prefixManifest.encoder}`);
2753
+ decoderOptions.push(fragment`prefix: ${prefixManifest.decoder}`);
2182
2754
  }
2183
2755
  if (optionType.fixed) {
2184
- encoderOptions.push(`noneValue: "zeroes"`);
2185
- decoderOptions.push(`noneValue: "zeroes"`);
2756
+ encoderOptions.push(fragment`noneValue: "zeroes"`);
2757
+ decoderOptions.push(fragment`noneValue: "zeroes"`);
2186
2758
  }
2187
- const encoderOptionsAsString = encoderOptions.length > 0 ? `, { ${encoderOptions.join(", ")} }` : "";
2188
- const decoderOptionsAsString = decoderOptions.length > 0 ? `, { ${decoderOptions.join(", ")} }` : "";
2189
- childManifest.encoder.mapRender((r) => `getOptionEncoder(${r + encoderOptionsAsString})`).addImports("solanaOptions", "getOptionEncoder");
2190
- childManifest.decoder.mapRender((r) => `getOptionDecoder(${r + decoderOptionsAsString})`).addImports("solanaOptions", "getOptionDecoder");
2191
- return childManifest;
2759
+ const encoderOptionsFragment = mergeFragments(
2760
+ encoderOptions,
2761
+ (cs) => cs.length > 0 ? `, { ${cs.join(", ")} }` : ""
2762
+ );
2763
+ const decoderOptionsFragment = mergeFragments(
2764
+ decoderOptions,
2765
+ (cs) => cs.length > 0 ? `, { ${cs.join(", ")} }` : ""
2766
+ );
2767
+ return typeManifest({
2768
+ ...childManifest,
2769
+ decoder: fragment`${use("getOptionDecoder", "solanaOptions")}(${childManifest.decoder}${decoderOptionsFragment})`,
2770
+ encoder: fragment`${use("getOptionEncoder", "solanaOptions")}(${childManifest.encoder}${encoderOptionsFragment})`,
2771
+ looseType: fragment`${use("type OptionOrNullable", "solanaOptions")}<${childManifest.looseType}>`,
2772
+ strictType: fragment`${use("type Option", "solanaOptions")}<${childManifest.strictType}>`
2773
+ });
2192
2774
  },
2193
2775
  visitPostOffsetType(node, { self }) {
2194
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2776
+ const manifest = (0, import_visitors_core28.visit)(node.type, self);
2195
2777
  if (node.strategy === "padded") {
2196
- manifest.encoder.mapRender((r) => `padRightEncoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padRightEncoder");
2197
- manifest.decoder.mapRender((r) => `padRightDecoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padRightDecoder");
2198
- return manifest;
2778
+ return typeManifest({
2779
+ ...manifest,
2780
+ decoder: fragment`${use("padRightDecoder", "solanaCodecsCore")}(${manifest.decoder}, ${node.offset})`,
2781
+ encoder: fragment`${use("padRightEncoder", "solanaCodecsCore")}(${manifest.encoder}, ${node.offset})`
2782
+ });
2199
2783
  }
2200
2784
  const fn = (() => {
2201
2785
  switch (node.strategy) {
@@ -2208,16 +2792,20 @@ function getTypeManifestVisitor(input) {
2208
2792
  return node.offset < 0 ? `({ postOffset }) => postOffset ${node.offset}` : `({ postOffset }) => postOffset + ${node.offset}`;
2209
2793
  }
2210
2794
  })();
2211
- manifest.encoder.mapRender((r) => `offsetEncoder(${r}, { postOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetEncoder");
2212
- manifest.decoder.mapRender((r) => `offsetDecoder(${r}, { postOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetDecoder");
2213
- return manifest;
2795
+ return typeManifest({
2796
+ ...manifest,
2797
+ decoder: fragment`${use("offsetDecoder", "solanaCodecsCore")}(${manifest.decoder}, { postOffset: ${fn} })`,
2798
+ encoder: fragment`${use("offsetEncoder", "solanaCodecsCore")}(${manifest.encoder}, { postOffset: ${fn} })`
2799
+ });
2214
2800
  },
2215
2801
  visitPreOffsetType(node, { self }) {
2216
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2802
+ const manifest = (0, import_visitors_core28.visit)(node.type, self);
2217
2803
  if (node.strategy === "padded") {
2218
- manifest.encoder.mapRender((r) => `padLeftEncoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padLeftEncoder");
2219
- manifest.decoder.mapRender((r) => `padLeftDecoder(${r}, ${node.offset})`).addImports("solanaCodecsCore", "padLeftDecoder");
2220
- return manifest;
2804
+ return typeManifest({
2805
+ ...manifest,
2806
+ decoder: fragment`${use("padLeftDecoder", "solanaCodecsCore")}(${manifest.decoder}, ${node.offset})`,
2807
+ encoder: fragment`${use("padLeftEncoder", "solanaCodecsCore")}(${manifest.encoder}, ${node.offset})`
2808
+ });
2221
2809
  }
2222
2810
  const fn = (() => {
2223
2811
  switch (node.strategy) {
@@ -2228,85 +2816,91 @@ function getTypeManifestVisitor(input) {
2228
2816
  return node.offset < 0 ? `({ preOffset }) => preOffset ${node.offset}` : `({ preOffset }) => preOffset + ${node.offset}`;
2229
2817
  }
2230
2818
  })();
2231
- manifest.encoder.mapRender((r) => `offsetEncoder(${r}, { preOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetEncoder");
2232
- manifest.decoder.mapRender((r) => `offsetDecoder(${r}, { preOffset: ${fn} })`).addImports("solanaCodecsCore", "offsetDecoder");
2233
- return manifest;
2819
+ return typeManifest({
2820
+ ...manifest,
2821
+ decoder: fragment`${use("offsetDecoder", "solanaCodecsCore")}(${manifest.decoder}, { preOffset: ${fn} })`,
2822
+ encoder: fragment`${use("offsetEncoder", "solanaCodecsCore")}(${manifest.encoder}, { preOffset: ${fn} })`
2823
+ });
2234
2824
  },
2235
2825
  visitPublicKeyType() {
2236
- const imports = new ImportMap().add("solanaAddresses", "type Address");
2237
- return {
2238
- decoder: fragment("getAddressDecoder()").addImports("solanaAddresses", "getAddressDecoder"),
2239
- encoder: fragment("getAddressEncoder()").addImports("solanaAddresses", "getAddressEncoder"),
2240
- isEnum: false,
2241
- looseType: fragment("Address", imports),
2242
- strictType: fragment("Address", imports),
2243
- value: fragment("")
2244
- };
2826
+ return typeManifest({
2827
+ decoder: fragment`${use("getAddressDecoder", "solanaAddresses")}()`,
2828
+ encoder: fragment`${use("getAddressEncoder", "solanaAddresses")}()`,
2829
+ looseType: use("type Address", "solanaAddresses"),
2830
+ strictType: use("type Address", "solanaAddresses")
2831
+ });
2245
2832
  },
2246
2833
  visitPublicKeyValue(node) {
2247
- const manifest = typeManifest();
2248
- manifest.value.setRender(`address("${node.publicKey}")`).addImports("solanaAddresses", "address");
2249
- return manifest;
2834
+ return typeManifest({
2835
+ value: fragment`${use("address", "solanaAddresses")}("${node.publicKey}")`
2836
+ });
2250
2837
  },
2251
2838
  visitRemainderOptionType(node, { self }) {
2252
- const childManifest = (0, import_visitors_core20.visit)(node.item, self);
2253
- childManifest.strictType.mapRender((r) => `Option<${r}>`).addImports("solanaOptions", "type Option");
2254
- childManifest.looseType.mapRender((r) => `OptionOrNullable<${r}>`).addImports("solanaOptions", "type OptionOrNullable");
2839
+ const childManifest = (0, import_visitors_core28.visit)(node.item, self);
2255
2840
  const encoderOptions = ["prefix: null"];
2256
2841
  const decoderOptions = ["prefix: null"];
2257
2842
  const encoderOptionsAsString = encoderOptions.length > 0 ? `, { ${encoderOptions.join(", ")} }` : "";
2258
2843
  const decoderOptionsAsString = decoderOptions.length > 0 ? `, { ${decoderOptions.join(", ")} }` : "";
2259
- childManifest.encoder.mapRender((r) => `getOptionEncoder(${r + encoderOptionsAsString})`).addImports("solanaOptions", "getOptionEncoder");
2260
- childManifest.decoder.mapRender((r) => `getOptionDecoder(${r + decoderOptionsAsString})`).addImports("solanaOptions", "getOptionDecoder");
2261
- return childManifest;
2844
+ return typeManifest({
2845
+ ...childManifest,
2846
+ decoder: fragment`${use("getOptionDecoder", "solanaOptions")}(${childManifest.decoder}${decoderOptionsAsString})`,
2847
+ encoder: fragment`${use("getOptionEncoder", "solanaOptions")}(${childManifest.encoder}${encoderOptionsAsString})`,
2848
+ looseType: fragment`${use("type OptionOrNullable", "solanaOptions")}<${childManifest.looseType}>`,
2849
+ strictType: fragment`${use("type Option", "solanaOptions")}<${childManifest.strictType}>`
2850
+ });
2262
2851
  },
2263
2852
  visitSentinelType(node, { self }) {
2264
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2265
- const sentinel = (0, import_visitors_core20.visit)(node.sentinel, self).value;
2266
- manifest.encoder.mapRender((r) => `addEncoderSentinel(${r}, ${sentinel.render})`).mergeImportsWith(sentinel).addImports("solanaCodecsCore", "addEncoderSentinel");
2267
- manifest.decoder.mapRender((r) => `addDecoderSentinel(${r}, ${sentinel.render})`).mergeImportsWith(sentinel).addImports("solanaCodecsCore", "addDecoderSentinel");
2268
- return manifest;
2853
+ const manifest = (0, import_visitors_core28.visit)(node.type, self);
2854
+ const sentinel = (0, import_visitors_core28.visit)(node.sentinel, self).value;
2855
+ return typeManifest({
2856
+ ...manifest,
2857
+ decoder: fragment`${use("addDecoderSentinel", "solanaCodecsCore")}(${manifest.decoder}, ${sentinel})`,
2858
+ encoder: fragment`${use("addEncoderSentinel", "solanaCodecsCore")}(${manifest.encoder}, ${sentinel})`
2859
+ });
2269
2860
  },
2270
2861
  visitSetType(setType, { self }) {
2271
- const childManifest = (0, import_visitors_core20.visit)(setType.item, self);
2272
- childManifest.strictType.mapRender((r) => `Set<${r}>`);
2273
- childManifest.looseType.mapRender((r) => `Set<${r}>`);
2862
+ const childManifest = (0, import_visitors_core28.visit)(setType.item, self);
2274
2863
  const sizeManifest = getArrayLikeSizeOption(setType.count, self);
2275
- const encoderOptions = sizeManifest.encoder.render ? `, { ${sizeManifest.encoder.render} }` : "";
2276
- const decoderOptions = sizeManifest.decoder.render ? `, { ${sizeManifest.decoder.render} }` : "";
2277
- childManifest.encoder.mergeImportsWith(sizeManifest.encoder).mapRender((r) => `getSetEncoder(${r + encoderOptions})`).addImports("solanaCodecsDataStructures", "getSetEncoder");
2278
- childManifest.decoder.mergeImportsWith(sizeManifest.decoder).mapRender((r) => `getSetDecoder(${r + decoderOptions})`).addImports("solanaCodecsDataStructures", "getSetDecoder");
2279
- return childManifest;
2864
+ const encoderOptions = sizeManifest.encoder ? fragment`, { ${sizeManifest.encoder} }` : "";
2865
+ const decoderOptions = sizeManifest.decoder ? fragment`, { ${sizeManifest.decoder} }` : "";
2866
+ return typeManifest({
2867
+ ...childManifest,
2868
+ decoder: fragment`${use("getSetDecoder", "solanaCodecsDataStructures")}(${childManifest.decoder}${decoderOptions})`,
2869
+ encoder: fragment`${use("getSetEncoder", "solanaCodecsDataStructures")}(${childManifest.encoder}${encoderOptions})`,
2870
+ looseType: fragment`Set<${childManifest.looseType}>`,
2871
+ strictType: fragment`Set<${childManifest.strictType}>`
2872
+ });
2280
2873
  },
2281
2874
  visitSetValue(node, { self }) {
2282
- return mergeManifests(
2283
- node.items.map((v) => (0, import_visitors_core20.visit)(v, self)),
2875
+ return mergeTypeManifests(
2876
+ node.items.map((v) => (0, import_visitors_core28.visit)(v, self)),
2284
2877
  { mergeValues: (renders) => `new Set([${renders.join(", ")}])` }
2285
2878
  );
2286
2879
  },
2287
2880
  visitSizePrefixType(node, { self }) {
2288
- const manifest = (0, import_visitors_core20.visit)(node.type, self);
2289
- const prefix = (0, import_visitors_core20.visit)(node.prefix, self);
2290
- manifest.encoder.mapRender((r) => `addEncoderSizePrefix(${r}, ${prefix.encoder.render})`).mergeImportsWith(prefix.encoder).addImports("solanaCodecsCore", "addEncoderSizePrefix");
2291
- manifest.decoder.mapRender((r) => `addDecoderSizePrefix(${r}, ${prefix.decoder.render})`).mergeImportsWith(prefix.decoder).addImports("solanaCodecsCore", "addDecoderSizePrefix");
2292
- return manifest;
2881
+ const manifest = (0, import_visitors_core28.visit)(node.type, self);
2882
+ const prefix = (0, import_visitors_core28.visit)(node.prefix, self);
2883
+ return typeManifest({
2884
+ ...manifest,
2885
+ decoder: fragment`${use("addDecoderSizePrefix", "solanaCodecsCore")}(${manifest.decoder}, ${prefix.decoder})`,
2886
+ encoder: fragment`${use("addEncoderSizePrefix", "solanaCodecsCore")}(${manifest.encoder}, ${prefix.encoder})`
2887
+ });
2293
2888
  },
2294
2889
  visitSolAmountType({ number }, { self }) {
2295
- const numberManifest = (0, import_visitors_core20.visit)(number, self);
2296
- const lamportsType = "Lamports";
2297
- const lamportsImport = new ImportMap().add("solanaRpcTypes", "type Lamports");
2298
- return {
2890
+ const numberManifest = (0, import_visitors_core28.visit)(number, self);
2891
+ return typeManifest({
2299
2892
  ...numberManifest,
2300
- decoder: numberManifest.decoder.mapRender((r) => `getLamportsDecoder(${r})`).addImports("solanaRpcTypes", "getLamportsDecoder"),
2301
- encoder: numberManifest.encoder.mapRender((r) => `getLamportsEncoder(${r})`).addImports("solanaRpcTypes", "getLamportsEncoder"),
2302
- looseType: fragment(lamportsType, lamportsImport),
2303
- strictType: fragment(lamportsType, lamportsImport)
2304
- };
2893
+ decoder: fragment`${use("getLamportsDecoder", "solanaRpcTypes")}(${numberManifest.decoder})`,
2894
+ encoder: fragment`${use("getLamportsEncoder", "solanaRpcTypes")}(${numberManifest.encoder})`,
2895
+ looseType: use("type Lamports", "solanaRpcTypes"),
2896
+ strictType: use("type Lamports", "solanaRpcTypes")
2897
+ });
2305
2898
  },
2306
2899
  visitSomeValue(node, { self }) {
2307
- const manifest = typeManifest();
2308
- manifest.value = (0, import_visitors_core20.visit)(node.value, self).value.mapRender((r) => `some(${r})`).addImports("solanaOptions", "some");
2309
- return manifest;
2900
+ const innerValue = (0, import_visitors_core28.visit)(node.value, self).value;
2901
+ return typeManifest({
2902
+ value: fragment`${use("some", "solanaOptions")}(${innerValue})`
2903
+ });
2310
2904
  },
2311
2905
  visitStringType(stringType) {
2312
2906
  const [encoder, decoder] = (() => {
@@ -2323,415 +2917,242 @@ function getTypeManifestVisitor(input) {
2323
2917
  throw new Error(`Unsupported string encoding: ${stringType.encoding}`);
2324
2918
  }
2325
2919
  })();
2326
- return {
2327
- decoder: fragment(`${decoder}()`).addImports("solanaCodecsStrings", decoder),
2328
- encoder: fragment(`${encoder}()`).addImports("solanaCodecsStrings", encoder),
2329
- isEnum: false,
2330
- looseType: fragment("string"),
2331
- strictType: fragment("string"),
2332
- value: fragment("")
2333
- };
2920
+ return typeManifest({
2921
+ decoder: fragment`${use(decoder, "solanaCodecsStrings")}()`,
2922
+ encoder: fragment`${use(encoder, "solanaCodecsStrings")}()`,
2923
+ looseType: fragment`string`,
2924
+ strictType: fragment`string`
2925
+ });
2334
2926
  },
2335
2927
  visitStringValue(node) {
2336
- const manifest = typeManifest();
2337
- manifest.value.setRender(JSON.stringify(node.string));
2338
- return manifest;
2928
+ return typeManifest({
2929
+ value: fragment`${JSON.stringify(node.string)}`
2930
+ });
2339
2931
  },
2340
2932
  visitStructFieldType(structFieldType, { self }) {
2341
- const name = (0, import_nodes24.camelCase)(structFieldType.name);
2342
- const childManifest = (0, import_visitors_core20.visit)(structFieldType.type, self);
2343
- const structFieldDocs = (0, import_nodes24.parseDocs)(structFieldType.docs);
2344
- const docblock = structFieldDocs.length > 0 ? `
2345
- ${jsDocblock(structFieldDocs)}` : "";
2346
- const originalLooseType = childManifest.looseType.render;
2347
- childManifest.strictType.mapRender((r) => `${docblock}${name}: ${r}; `);
2348
- childManifest.looseType.mapRender((r) => `${docblock}${name}: ${r}; `);
2349
- childManifest.encoder.mapRender((r) => `['${name}', ${r}]`);
2350
- childManifest.decoder.mapRender((r) => `['${name}', ${r}]`);
2933
+ const name = (0, import_nodes27.camelCase)(structFieldType.name);
2934
+ const originalChildManifest = (0, import_visitors_core28.visit)(structFieldType.type, self);
2935
+ let docs = getDocblockFragment(structFieldType.docs ?? [], true);
2936
+ docs = docs ? fragment`\n${docs}` : docs;
2937
+ const childManifest = typeManifest({
2938
+ ...originalChildManifest,
2939
+ decoder: fragment`['${name}', ${originalChildManifest.decoder}]`,
2940
+ encoder: fragment`['${name}', ${originalChildManifest.encoder}]`,
2941
+ looseType: fragment`${docs}${name}: ${originalChildManifest.looseType}; `,
2942
+ strictType: fragment`${docs}${name}: ${originalChildManifest.strictType}; `
2943
+ });
2351
2944
  if (!structFieldType.defaultValue) {
2352
2945
  return childManifest;
2353
2946
  }
2354
2947
  if (structFieldType.defaultValueStrategy !== "omitted") {
2355
- childManifest.looseType.setRender(`${docblock}${name}?: ${originalLooseType}; `);
2356
- return childManifest;
2948
+ return typeManifest({
2949
+ ...childManifest,
2950
+ looseType: fragment`${docs}${name}?: ${originalChildManifest.looseType}; `
2951
+ });
2357
2952
  }
2358
- childManifest.looseType = fragment("");
2359
- return childManifest;
2953
+ return typeManifest({ ...childManifest, looseType: fragment`` });
2360
2954
  },
2361
2955
  visitStructFieldValue(node, { self }) {
2362
- const manifest = typeManifest();
2363
- manifest.value = (0, import_visitors_core20.visit)(node.value, self).value.mapRender((r) => `${node.name}: ${r}`);
2364
- return manifest;
2956
+ const innerValue = (0, import_visitors_core28.visit)(node.value, self).value;
2957
+ return typeManifest({
2958
+ value: fragment`${node.name}: ${innerValue}`
2959
+ });
2365
2960
  },
2366
2961
  visitStructType(structType, { self }) {
2367
2962
  const optionalFields = structType.fields.filter((f) => !!f.defaultValue);
2368
- const mergedManifest = mergeManifests(
2369
- structType.fields.map((field) => (0, import_visitors_core20.visit)(field, self)),
2370
- {
2371
- mergeCodecs: (renders) => `([${renders.join(", ")}])`,
2372
- mergeTypes: (renders) => `{ ${renders.join("")} }`
2373
- }
2963
+ const mergedManifest = (0, import_visitors_core28.pipe)(
2964
+ mergeTypeManifests(
2965
+ structType.fields.map((field) => (0, import_visitors_core28.visit)(field, self)),
2966
+ {
2967
+ mergeCodecs: (renders) => `([${renders.join(", ")}])`,
2968
+ mergeTypes: (renders) => `{ ${renders.join("")} }`
2969
+ }
2970
+ ),
2971
+ (manifest) => typeManifest({
2972
+ ...manifest,
2973
+ decoder: fragment`${use("getStructDecoder", "solanaCodecsDataStructures")}${manifest.decoder}`,
2974
+ encoder: fragment`${use("getStructEncoder", "solanaCodecsDataStructures")}${manifest.encoder}`
2975
+ })
2374
2976
  );
2375
- mergedManifest.encoder.mapRender((r) => `getStructEncoder${r}`).addImports("solanaCodecsDataStructures", "getStructEncoder");
2376
- mergedManifest.decoder.mapRender((r) => `getStructDecoder${r}`).addImports("solanaCodecsDataStructures", "getStructDecoder");
2377
2977
  if (optionalFields.length === 0) {
2378
2978
  return mergedManifest;
2379
2979
  }
2380
2980
  const parentPath = stack.getPath();
2381
- const instructionNode = (0, import_visitors_core20.findLastNodeFromPath)(parentPath, "instructionNode");
2382
- const accountNode = (0, import_visitors_core20.findLastNodeFromPath)(parentPath, "accountNode");
2981
+ const instructionNode = (0, import_visitors_core28.findLastNodeFromPath)(parentPath, "instructionNode");
2982
+ const accountNode = (0, import_visitors_core28.findLastNodeFromPath)(parentPath, "accountNode");
2383
2983
  const discriminatorPrefix = instructionNode ? instructionNode.name : accountNode?.name;
2384
2984
  const discriminators = (instructionNode ? instructionNode.discriminators : accountNode?.discriminators) ?? [];
2385
- const fieldDiscriminators = discriminators.filter((0, import_nodes24.isNodeFilter)("fieldDiscriminatorNode"));
2386
- const defaultValues = optionalFields.map((f) => {
2387
- const key = (0, import_nodes24.camelCase)(f.name);
2388
- if (fieldDiscriminators.some((d) => d.name === f.name)) {
2389
- const constantName = nameApi.constant((0, import_nodes24.camelCase)(`${discriminatorPrefix}_${f.name}`));
2390
- return f.defaultValueStrategy === "omitted" ? `${key}: ${constantName}` : `${key}: value.${key} ?? ${constantName}`;
2391
- }
2392
- const defaultValue = f.defaultValue;
2393
- const { render: renderedValue, imports } = (0, import_visitors_core20.visit)(defaultValue, self).value;
2394
- mergedManifest.encoder.mergeImportsWith(imports);
2395
- return f.defaultValueStrategy === "omitted" ? `${key}: ${renderedValue}` : `${key}: value.${key} ?? ${renderedValue}`;
2396
- }).join(", ");
2397
- mergedManifest.encoder.mapRender((r) => `transformEncoder(${r}, (value) => ({ ...value, ${defaultValues} }))`).addImports("solanaCodecsCore", "transformEncoder");
2398
- return mergedManifest;
2985
+ const fieldDiscriminators = discriminators.filter((0, import_nodes27.isNodeFilter)("fieldDiscriminatorNode"));
2986
+ const defaultValues = mergeFragments(
2987
+ optionalFields.map((f) => {
2988
+ const key = (0, import_nodes27.camelCase)(f.name);
2989
+ if (fieldDiscriminators.some((d) => d.name === f.name)) {
2990
+ const constantName = nameApi.constant((0, import_nodes27.camelCase)(`${discriminatorPrefix}_${f.name}`));
2991
+ return f.defaultValueStrategy === "omitted" ? fragment`${key}: ${constantName}` : fragment`${key}: value.${key} ?? ${constantName}`;
2992
+ }
2993
+ const defaultValue = f.defaultValue;
2994
+ const value = (0, import_visitors_core28.visit)(defaultValue, self).value;
2995
+ return f.defaultValueStrategy === "omitted" ? fragment`${key}: ${value}` : fragment`${key}: value.${key} ?? ${value}`;
2996
+ }),
2997
+ (cs) => cs.join(", ")
2998
+ );
2999
+ return typeManifest({
3000
+ ...mergedManifest,
3001
+ encoder: fragment`${use("transformEncoder", "solanaCodecsCore")}(${mergedManifest.encoder}, (value) => ({ ...value, ${defaultValues} }))`
3002
+ });
2399
3003
  },
2400
3004
  visitStructValue(node, { self }) {
2401
- return mergeManifests(
2402
- node.fields.map((field) => (0, import_visitors_core20.visit)(field, self)),
3005
+ return mergeTypeManifests(
3006
+ node.fields.map((field) => (0, import_visitors_core28.visit)(field, self)),
2403
3007
  { mergeValues: (renders) => `{ ${renders.join(", ")} }` }
2404
3008
  );
2405
3009
  },
2406
3010
  visitTupleType(tupleType, { self }) {
2407
- const items = tupleType.items.map((item) => (0, import_visitors_core20.visit)(item, self));
2408
- const mergedManifest = mergeManifests(items, {
3011
+ const items = tupleType.items.map((item) => (0, import_visitors_core28.visit)(item, self));
3012
+ const mergedManifest = mergeTypeManifests(items, {
2409
3013
  mergeCodecs: (codecs) => `[${codecs.join(", ")}]`,
2410
3014
  mergeTypes: (types) => `readonly [${types.join(", ")}]`
2411
3015
  });
2412
- mergedManifest.encoder.mapRender((render2) => `getTupleEncoder(${render2})`).addImports("solanaCodecsDataStructures", "getTupleEncoder");
2413
- mergedManifest.decoder.mapRender((render2) => `getTupleDecoder(${render2})`).addImports("solanaCodecsDataStructures", "getTupleDecoder");
2414
- return mergedManifest;
3016
+ return typeManifest({
3017
+ ...mergedManifest,
3018
+ decoder: fragment`${use("getTupleDecoder", "solanaCodecsDataStructures")}(${mergedManifest.decoder})`,
3019
+ encoder: fragment`${use("getTupleEncoder", "solanaCodecsDataStructures")}(${mergedManifest.encoder})`
3020
+ });
2415
3021
  },
2416
3022
  visitTupleValue(node, { self }) {
2417
- return mergeManifests(
2418
- node.items.map((v) => (0, import_visitors_core20.visit)(v, self)),
3023
+ return mergeTypeManifests(
3024
+ node.items.map((v) => (0, import_visitors_core28.visit)(v, self)),
2419
3025
  { mergeValues: (renders) => `[${renders.join(", ")}]` }
2420
3026
  );
2421
3027
  },
2422
3028
  visitZeroableOptionType(node, { self }) {
2423
- const childManifest = (0, import_visitors_core20.visit)(node.item, self);
2424
- childManifest.strictType.mapRender((r) => `Option<${r}>`).addImports("solanaOptions", "type Option");
2425
- childManifest.looseType.mapRender((r) => `OptionOrNullable<${r}>`).addImports("solanaOptions", "type OptionOrNullable");
2426
- const encoderOptions = ["prefix: null"];
2427
- const decoderOptions = ["prefix: null"];
3029
+ const childManifest = (0, import_visitors_core28.visit)(node.item, self);
3030
+ const encoderOptions = [fragment`prefix: null`];
3031
+ const decoderOptions = [fragment`prefix: null`];
2428
3032
  if (node.zeroValue) {
2429
- const zeroValueManifest = (0, import_visitors_core20.visit)(node.zeroValue, self);
2430
- childManifest.encoder.mergeImportsWith(zeroValueManifest.value);
2431
- childManifest.decoder.mergeImportsWith(zeroValueManifest.value);
2432
- encoderOptions.push(`noneValue: ${zeroValueManifest.value.render}`);
2433
- decoderOptions.push(`noneValue: ${zeroValueManifest.value.render}`);
3033
+ const zeroValueManifest = (0, import_visitors_core28.visit)(node.zeroValue, self);
3034
+ encoderOptions.push(fragment`noneValue: ${zeroValueManifest.value}`);
3035
+ decoderOptions.push(fragment`noneValue: ${zeroValueManifest.value}`);
2434
3036
  } else {
2435
- encoderOptions.push(`noneValue: "zeroes"`);
2436
- decoderOptions.push(`noneValue: "zeroes"`);
3037
+ encoderOptions.push(fragment`noneValue: "zeroes"`);
3038
+ decoderOptions.push(fragment`noneValue: "zeroes"`);
2437
3039
  }
2438
- const encoderOptionsAsString = encoderOptions.length > 0 ? `, { ${encoderOptions.join(", ")} }` : "";
2439
- const decoderOptionsAsString = decoderOptions.length > 0 ? `, { ${decoderOptions.join(", ")} }` : "";
2440
- childManifest.encoder.mapRender((r) => `getOptionEncoder(${r + encoderOptionsAsString})`).addImports("solanaOptions", "getOptionEncoder");
2441
- childManifest.decoder.mapRender((r) => `getOptionDecoder(${r + decoderOptionsAsString})`).addImports("solanaOptions", "getOptionDecoder");
2442
- return childManifest;
3040
+ const encoderOptionsFragment = mergeFragments(
3041
+ encoderOptions,
3042
+ (cs) => cs.length > 0 ? `, { ${cs.join(", ")} }` : ""
3043
+ );
3044
+ const decoderOptionsFragment = mergeFragments(
3045
+ decoderOptions,
3046
+ (cs) => cs.length > 0 ? `, { ${cs.join(", ")} }` : ""
3047
+ );
3048
+ return typeManifest({
3049
+ ...childManifest,
3050
+ decoder: fragment`${use("getOptionDecoder", "solanaOptions")}(${childManifest.decoder}${decoderOptionsFragment})`,
3051
+ encoder: fragment`${use("getOptionEncoder", "solanaOptions")}(${childManifest.encoder}${encoderOptionsFragment})`,
3052
+ looseType: fragment`${use("type OptionOrNullable", "solanaOptions")}<${childManifest.looseType}>`,
3053
+ strictType: fragment`${use("type Option", "solanaOptions")}<${childManifest.strictType}>`
3054
+ });
2443
3055
  }
2444
3056
  }),
2445
- (visitor) => (0, import_visitors_core20.recordNodeStackVisitor)(visitor, stack)
3057
+ (visitor) => (0, import_visitors_core28.recordNodeStackVisitor)(visitor, stack)
2446
3058
  );
2447
3059
  }
2448
3060
  function getArrayLikeSizeOption(count, visitor) {
2449
- if ((0, import_nodes24.isNode)(count, "fixedCountNode")) {
3061
+ if ((0, import_nodes27.isNode)(count, "fixedCountNode")) {
2450
3062
  return {
2451
- decoder: fragment(`size: ${count.value}`),
2452
- encoder: fragment(`size: ${count.value}`)
3063
+ decoder: fragment`size: ${count.value}`,
3064
+ encoder: fragment`size: ${count.value}`
2453
3065
  };
2454
3066
  }
2455
- if ((0, import_nodes24.isNode)(count, "remainderCountNode")) {
3067
+ if ((0, import_nodes27.isNode)(count, "remainderCountNode")) {
2456
3068
  return {
2457
- decoder: fragment(`size: 'remainder'`),
2458
- encoder: fragment(`size: 'remainder'`)
3069
+ decoder: fragment`size: 'remainder'`,
3070
+ encoder: fragment`size: 'remainder'`
2459
3071
  };
2460
3072
  }
2461
- const prefix = (0, import_nodes24.resolveNestedTypeNode)(count.prefix);
3073
+ const prefix = (0, import_nodes27.resolveNestedTypeNode)(count.prefix);
2462
3074
  if (prefix.format === "u32" && prefix.endian === "le") {
2463
- return { decoder: fragment(""), encoder: fragment("") };
3075
+ return { decoder: void 0, encoder: void 0 };
2464
3076
  }
2465
- const prefixManifest = (0, import_visitors_core20.visit)(count.prefix, visitor);
2466
- prefixManifest.encoder.mapRender((r) => `size: ${r}`);
2467
- prefixManifest.decoder.mapRender((r) => `size: ${r}`);
2468
- return prefixManifest;
2469
- }
2470
-
2471
- // src/nameTransformers.ts
2472
- var import_nodes25 = require("@codama/nodes");
2473
- function getNameApi(transformers) {
2474
- const helpers = {
2475
- camelCase: import_nodes25.camelCase,
2476
- capitalize: import_nodes25.capitalize,
2477
- kebabCase: import_nodes25.kebabCase,
2478
- pascalCase: import_nodes25.pascalCase,
2479
- snakeCase: import_nodes25.snakeCase,
2480
- titleCase: import_nodes25.titleCase
3077
+ const prefixManifest = (0, import_visitors_core28.visit)(count.prefix, visitor);
3078
+ return {
3079
+ decoder: (0, import_visitors_core28.pipe)(prefixManifest.decoder, (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `size: ${c}`)),
3080
+ encoder: (0, import_visitors_core28.pipe)(prefixManifest.encoder, (f) => (0, import_renderers_core12.mapFragmentContent)(f, (c) => `size: ${c}`))
2481
3081
  };
2482
- return Object.fromEntries(
2483
- Object.entries(transformers).map(([key, transformer]) => [key, (name) => transformer(name, helpers)])
2484
- );
2485
3082
  }
2486
- var DEFAULT_NAME_TRANSFORMERS = {
2487
- accountDecodeFunction: (name) => `decode${(0, import_nodes25.pascalCase)(name)}`,
2488
- accountFetchAllFunction: (name) => `fetchAll${(0, import_nodes25.pascalCase)(name)}`,
2489
- accountFetchAllMaybeFunction: (name) => `fetchAllMaybe${(0, import_nodes25.pascalCase)(name)}`,
2490
- accountFetchFromSeedsFunction: (name) => `fetch${(0, import_nodes25.pascalCase)(name)}FromSeeds`,
2491
- accountFetchFunction: (name) => `fetch${(0, import_nodes25.pascalCase)(name)}`,
2492
- accountFetchMaybeFromSeedsFunction: (name) => `fetchMaybe${(0, import_nodes25.pascalCase)(name)}FromSeeds`,
2493
- accountFetchMaybeFunction: (name) => `fetchMaybe${(0, import_nodes25.pascalCase)(name)}`,
2494
- accountGetSizeFunction: (name) => `get${(0, import_nodes25.pascalCase)(name)}Size`,
2495
- codecFunction: (name) => `get${(0, import_nodes25.pascalCase)(name)}Codec`,
2496
- constant: (name) => (0, import_nodes25.snakeCase)(name).toUpperCase(),
2497
- constantFunction: (name) => `get${(0, import_nodes25.pascalCase)(name)}Bytes`,
2498
- dataArgsType: (name) => `${(0, import_nodes25.pascalCase)(name)}Args`,
2499
- dataType: (name) => `${(0, import_nodes25.pascalCase)(name)}`,
2500
- decoderFunction: (name) => `get${(0, import_nodes25.pascalCase)(name)}Decoder`,
2501
- discriminatedUnionDiscriminator: () => "__kind",
2502
- discriminatedUnionFunction: (name) => `${(0, import_nodes25.camelCase)(name)}`,
2503
- discriminatedUnionVariant: (name) => `${(0, import_nodes25.pascalCase)(name)}`,
2504
- encoderFunction: (name) => `get${(0, import_nodes25.pascalCase)(name)}Encoder`,
2505
- enumVariant: (name) => `${(0, import_nodes25.pascalCase)(name)}`,
2506
- instructionAsyncFunction: (name) => `get${(0, import_nodes25.pascalCase)(name)}InstructionAsync`,
2507
- instructionAsyncInputType: (name) => `${(0, import_nodes25.pascalCase)(name)}AsyncInput`,
2508
- instructionDataType: (name) => `${(0, import_nodes25.pascalCase)(name)}InstructionData`,
2509
- instructionExtraType: (name) => `${(0, import_nodes25.pascalCase)(name)}InstructionExtra`,
2510
- instructionParseFunction: (name) => `parse${(0, import_nodes25.pascalCase)(name)}Instruction`,
2511
- instructionParsedType: (name) => `Parsed${(0, import_nodes25.pascalCase)(name)}Instruction`,
2512
- instructionSyncFunction: (name) => `get${(0, import_nodes25.pascalCase)(name)}Instruction`,
2513
- instructionSyncInputType: (name) => `${(0, import_nodes25.pascalCase)(name)}Input`,
2514
- instructionType: (name) => `${(0, import_nodes25.pascalCase)(name)}Instruction`,
2515
- isDiscriminatedUnionFunction: (name) => `is${(0, import_nodes25.pascalCase)(name)}`,
2516
- pdaFindFunction: (name) => `find${(0, import_nodes25.pascalCase)(name)}Pda`,
2517
- pdaSeedsType: (name) => `${(0, import_nodes25.pascalCase)(name)}Seeds`,
2518
- programAccountsEnum: (name) => `${(0, import_nodes25.pascalCase)(name)}Account`,
2519
- programAccountsEnumVariant: (name) => `${(0, import_nodes25.pascalCase)(name)}`,
2520
- programAccountsIdentifierFunction: (name) => `identify${(0, import_nodes25.pascalCase)(name)}Account`,
2521
- programAddressConstant: (name) => `${(0, import_nodes25.snakeCase)(name).toUpperCase()}_PROGRAM_ADDRESS`,
2522
- programErrorConstant: (name) => (0, import_nodes25.snakeCase)(name).toUpperCase(),
2523
- programErrorConstantPrefix: (name) => `${(0, import_nodes25.snakeCase)(name).toUpperCase()}_ERROR__`,
2524
- programErrorMessagesMap: (name) => `${(0, import_nodes25.camelCase)(name)}ErrorMessages`,
2525
- programErrorUnion: (name) => `${(0, import_nodes25.pascalCase)(name)}Error`,
2526
- programGetErrorMessageFunction: (name) => `get${(0, import_nodes25.pascalCase)(name)}ErrorMessage`,
2527
- programInstructionsEnum: (name) => `${(0, import_nodes25.pascalCase)(name)}Instruction`,
2528
- programInstructionsEnumVariant: (name) => `${(0, import_nodes25.pascalCase)(name)}`,
2529
- programInstructionsIdentifierFunction: (name) => `identify${(0, import_nodes25.pascalCase)(name)}Instruction`,
2530
- programInstructionsParsedUnionType: (name) => `Parsed${(0, import_nodes25.pascalCase)(name)}Instruction`,
2531
- programIsErrorFunction: (name) => `is${(0, import_nodes25.pascalCase)(name)}Error`,
2532
- resolverFunction: (name) => `${(0, import_nodes25.camelCase)(name)}`
2533
- };
2534
3083
 
2535
- // src/getRenderMapVisitor.ts
3084
+ // src/visitors/getRenderMapVisitor.ts
2536
3085
  function getRenderMapVisitor(options = {}) {
2537
- const linkables = new import_visitors_core21.LinkableDictionary();
2538
- const stack = new import_visitors_core21.NodeStack();
2539
- const nameTransformers = {
2540
- ...DEFAULT_NAME_TRANSFORMERS,
2541
- ...options.nameTransformers
2542
- };
2543
- const nameApi = getNameApi(nameTransformers);
2544
- const renderParentInstructions = options.renderParentInstructions ?? false;
2545
- const dependencyMap = options.dependencyMap ?? {};
2546
- const useGranularImports = options.useGranularImports ?? false;
2547
- const asyncResolvers = (options.asyncResolvers ?? []).map(import_nodes26.camelCase);
2548
- const nonScalarEnums = (options.nonScalarEnums ?? []).map(import_nodes26.camelCase);
2549
- const internalNodes = (options.internalNodes ?? []).map(import_nodes26.camelCase);
3086
+ const linkables = new import_visitors_core29.LinkableDictionary();
3087
+ const stack = new import_visitors_core29.NodeStack();
2550
3088
  const customAccountData = parseCustomDataOptions(options.customAccountData ?? [], "AccountData");
2551
3089
  const customInstructionData = parseCustomDataOptions(options.customInstructionData ?? [], "InstructionData");
2552
- const getImportFrom = getImportFromFactory(options.linkOverrides ?? {}, customAccountData, customInstructionData);
2553
- const typeManifestVisitor = getTypeManifestVisitor({
2554
- customAccountData,
2555
- customInstructionData,
2556
- getImportFrom,
2557
- linkables,
2558
- nameApi,
2559
- nonScalarEnums,
2560
- stack
2561
- });
2562
- const resolvedInstructionInputVisitor = (0, import_visitors_core21.getResolvedInstructionInputsVisitor)();
2563
- const byteSizeVisitor = (0, import_visitors_core21.getByteSizeVisitor)(linkables, { stack });
2564
- const globalScope = {
2565
- asyncResolvers,
3090
+ const renderScopeWithTypeManifestVisitor = {
3091
+ asyncResolvers: (options.asyncResolvers ?? []).map(import_nodes28.camelCase),
2566
3092
  customAccountData,
2567
3093
  customInstructionData,
2568
- getImportFrom,
3094
+ dependencyMap: options.dependencyMap ?? {},
3095
+ getImportFrom: getImportFromFactory(options.linkOverrides ?? {}, customAccountData, customInstructionData),
2569
3096
  linkables,
2570
- nameApi,
2571
- nonScalarEnums,
2572
- renderParentInstructions,
2573
- typeManifestVisitor
3097
+ nameApi: getNameApi({ ...DEFAULT_NAME_TRANSFORMERS, ...options.nameTransformers }),
3098
+ nonScalarEnums: (options.nonScalarEnums ?? []).map(import_nodes28.camelCase),
3099
+ renderParentInstructions: options.renderParentInstructions ?? false,
3100
+ useGranularImports: options.useGranularImports ?? false
2574
3101
  };
2575
- const render2 = (template, context, renderOptions) => {
2576
- return render((0, import_node_path3.join)("pages", template), context, renderOptions);
3102
+ const typeManifestVisitor = getTypeManifestVisitor({ ...renderScopeWithTypeManifestVisitor, stack });
3103
+ const renderScope = { ...renderScopeWithTypeManifestVisitor, typeManifestVisitor };
3104
+ const internalNodes = (options.internalNodes ?? []).map(import_nodes28.camelCase);
3105
+ const resolvedInstructionInputVisitor = (0, import_visitors_core29.getResolvedInstructionInputsVisitor)();
3106
+ const byteSizeVisitor = (0, import_visitors_core29.getByteSizeVisitor)(linkables, { stack });
3107
+ const asPage = (fragment2, dependencyMap = {}) => {
3108
+ if (!fragment2) return void 0;
3109
+ return getPageFragment(fragment2, {
3110
+ ...renderScope,
3111
+ dependencyMap: { ...renderScope.dependencyMap, ...dependencyMap }
3112
+ });
2577
3113
  };
2578
- return (0, import_visitors_core21.pipe)(
2579
- (0, import_visitors_core21.staticVisitor)(() => new import_renderers_core.RenderMap(), {
3114
+ return (0, import_visitors_core29.pipe)(
3115
+ (0, import_visitors_core29.staticVisitor)(() => (0, import_renderers_core13.createRenderMap)(), {
2580
3116
  keys: ["rootNode", "programNode", "pdaNode", "accountNode", "definedTypeNode", "instructionNode"]
2581
3117
  }),
2582
- (v) => (0, import_visitors_core21.extendVisitor)(v, {
3118
+ (v) => (0, import_visitors_core29.extendVisitor)(v, {
2583
3119
  visitAccount(node) {
2584
- const accountPath = stack.getPath("accountNode");
2585
- if (!(0, import_visitors_core21.findProgramNodeFromPath)(accountPath)) {
2586
- throw new Error("Account must be visited inside a program.");
2587
- }
2588
- const scope = {
2589
- ...globalScope,
2590
- accountPath,
2591
- size: (0, import_visitors_core21.visit)(node, byteSizeVisitor),
2592
- typeManifest: (0, import_visitors_core21.visit)(node, typeManifestVisitor)
2593
- };
2594
- const fields = (0, import_nodes26.resolveNestedTypeNode)(node.data).fields;
2595
- const accountDiscriminatorConstantsFragment = getDiscriminatorConstantsFragment({
2596
- ...scope,
2597
- discriminatorNodes: node.discriminators ?? [],
2598
- fields,
2599
- prefix: node.name
2600
- });
2601
- const accountTypeFragment = getAccountTypeFragment(scope);
2602
- const accountFetchHelpersFragment = getAccountFetchHelpersFragment(scope);
2603
- const accountSizeHelpersFragment = getAccountSizeHelpersFragment(scope);
2604
- const accountPdaHelpersFragment = getAccountPdaHelpersFragment(scope);
2605
- const imports = new ImportMap().mergeWith(
2606
- accountDiscriminatorConstantsFragment,
2607
- accountTypeFragment,
2608
- accountFetchHelpersFragment,
2609
- accountSizeHelpersFragment,
2610
- accountPdaHelpersFragment
2611
- );
2612
- return new import_renderers_core.RenderMap().add(
2613
- `accounts/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2614
- render2("accountsPage.njk", {
2615
- accountDiscriminatorConstantsFragment,
2616
- accountFetchHelpersFragment,
2617
- accountPdaHelpersFragment,
2618
- accountSizeHelpersFragment,
2619
- accountTypeFragment,
2620
- imports: imports.toString(dependencyMap, useGranularImports)
2621
- })
3120
+ return (0, import_renderers_core13.createRenderMap)(
3121
+ `accounts/${(0, import_nodes28.camelCase)(node.name)}.ts`,
3122
+ asPage(
3123
+ getAccountPageFragment({
3124
+ ...renderScope,
3125
+ accountPath: stack.getPath("accountNode"),
3126
+ size: (0, import_visitors_core29.visit)(node, byteSizeVisitor)
3127
+ })
3128
+ )
2622
3129
  );
2623
3130
  },
2624
3131
  visitDefinedType(node) {
2625
- const scope = {
2626
- ...globalScope,
2627
- codecDocs: [],
2628
- decoderDocs: [],
2629
- encoderDocs: [],
2630
- manifest: (0, import_visitors_core21.visit)(node, typeManifestVisitor),
2631
- name: node.name,
2632
- node: node.type,
2633
- size: (0, import_visitors_core21.visit)(node, byteSizeVisitor),
2634
- typeDocs: node.docs,
2635
- typeNode: node.type
2636
- };
2637
- const typeWithCodecFragment = getTypeWithCodecFragment(scope);
2638
- const typeDiscriminatedUnionHelpersFragment = getTypeDiscriminatedUnionHelpersFragment(scope);
2639
- const imports = new ImportMap().mergeWith(typeWithCodecFragment, typeDiscriminatedUnionHelpersFragment).remove("generatedTypes", [
2640
- nameApi.dataType(node.name),
2641
- nameApi.dataArgsType(node.name),
2642
- nameApi.encoderFunction(node.name),
2643
- nameApi.decoderFunction(node.name),
2644
- nameApi.codecFunction(node.name)
2645
- ]);
2646
- return new import_renderers_core.RenderMap().add(
2647
- `types/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2648
- render2("definedTypesPage.njk", {
2649
- imports: imports.toString({
2650
- ...dependencyMap,
2651
- generatedTypes: "."
2652
- }),
2653
- typeDiscriminatedUnionHelpersFragment,
2654
- typeWithCodecFragment
3132
+ return (0, import_renderers_core13.createRenderMap)(
3133
+ `types/${(0, import_nodes28.camelCase)(node.name)}.ts`,
3134
+ asPage(getTypePageFragment({ ...renderScope, node, size: (0, import_visitors_core29.visit)(node, byteSizeVisitor) }), {
3135
+ generatedTypes: "."
2655
3136
  })
2656
3137
  );
2657
3138
  },
2658
3139
  visitInstruction(node) {
2659
- const instructionPath = stack.getPath("instructionNode");
2660
- if (!(0, import_visitors_core21.findProgramNodeFromPath)(instructionPath)) {
2661
- throw new Error("Instruction must be visited inside a program.");
2662
- }
2663
- const instructionExtraName = nameApi.instructionExtraType(node.name);
2664
- const scope = {
2665
- ...globalScope,
2666
- dataArgsManifest: (0, import_visitors_core21.visit)(node, typeManifestVisitor),
2667
- extraArgsManifest: (0, import_visitors_core21.visit)(
2668
- (0, import_nodes26.definedTypeNode)({
2669
- name: instructionExtraName,
2670
- type: (0, import_nodes26.structTypeNodeFromInstructionArgumentNodes)(node.extraArguments ?? [])
2671
- }),
2672
- typeManifestVisitor
2673
- ),
2674
- instructionPath,
2675
- renamedArgs: getRenamedArgsMap(node),
2676
- resolvedInputs: (0, import_visitors_core21.visit)(node, resolvedInstructionInputVisitor),
2677
- size: (0, import_visitors_core21.visit)(node, byteSizeVisitor)
2678
- };
2679
- const instructionDiscriminatorConstantsFragment = getDiscriminatorConstantsFragment({
2680
- ...scope,
2681
- discriminatorNodes: node.discriminators ?? [],
2682
- fields: node.arguments,
2683
- prefix: node.name
2684
- });
2685
- const instructionTypeFragment = getInstructionTypeFragment(scope);
2686
- const instructionDataFragment = getInstructionDataFragment(scope);
2687
- const instructionExtraArgsFragment = getInstructionExtraArgsFragment(scope);
2688
- const instructionFunctionAsyncFragment = getInstructionFunctionFragment({
2689
- ...scope,
2690
- useAsync: true
2691
- });
2692
- const instructionFunctionSyncFragment = getInstructionFunctionFragment({
2693
- ...scope,
2694
- useAsync: false
2695
- });
2696
- const instructionParseFunctionFragment = getInstructionParseFunctionFragment(scope);
2697
- const imports = new ImportMap().mergeWith(
2698
- instructionDiscriminatorConstantsFragment,
2699
- instructionTypeFragment,
2700
- instructionDataFragment,
2701
- instructionExtraArgsFragment,
2702
- instructionFunctionAsyncFragment,
2703
- instructionFunctionSyncFragment,
2704
- instructionParseFunctionFragment
2705
- );
2706
- return new import_renderers_core.RenderMap().add(
2707
- `instructions/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2708
- render2("instructionsPage.njk", {
2709
- imports: imports.toString(dependencyMap, useGranularImports),
2710
- instruction: node,
2711
- instructionDataFragment,
2712
- instructionDiscriminatorConstantsFragment,
2713
- instructionExtraArgsFragment,
2714
- instructionFunctionAsyncFragment,
2715
- instructionFunctionSyncFragment,
2716
- instructionParseFunctionFragment,
2717
- instructionTypeFragment
2718
- })
3140
+ return (0, import_renderers_core13.createRenderMap)(
3141
+ `instructions/${(0, import_nodes28.camelCase)(node.name)}.ts`,
3142
+ asPage(
3143
+ getInstructionPageFragment({
3144
+ ...renderScope,
3145
+ instructionPath: stack.getPath("instructionNode"),
3146
+ resolvedInputs: (0, import_visitors_core29.visit)(node, resolvedInstructionInputVisitor),
3147
+ size: (0, import_visitors_core29.visit)(node, byteSizeVisitor)
3148
+ })
3149
+ )
2719
3150
  );
2720
3151
  },
2721
3152
  visitPda(node) {
2722
- const pdaPath = stack.getPath("pdaNode");
2723
- if (!(0, import_visitors_core21.findProgramNodeFromPath)(pdaPath)) {
2724
- throw new Error("Account must be visited inside a program.");
2725
- }
2726
- const scope = { ...globalScope, pdaPath };
2727
- const pdaFunctionFragment = getPdaFunctionFragment(scope);
2728
- const imports = new ImportMap().mergeWith(pdaFunctionFragment);
2729
- return new import_renderers_core.RenderMap().add(
2730
- `pdas/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2731
- render2("pdasPage.njk", {
2732
- imports: imports.toString(dependencyMap, useGranularImports),
2733
- pdaFunctionFragment
2734
- })
3153
+ return (0, import_renderers_core13.createRenderMap)(
3154
+ `pdas/${(0, import_nodes28.camelCase)(node.name)}.ts`,
3155
+ asPage(getPdaPageFragment({ ...renderScope, pdaPath: stack.getPath("pdaNode") }))
2735
3156
  );
2736
3157
  },
2737
3158
  visitProgram(node, { self }) {
@@ -2739,126 +3160,63 @@ function getRenderMapVisitor(options = {}) {
2739
3160
  ...getDefinedTypeNodesToExtract(node.accounts, customAccountData),
2740
3161
  ...getDefinedTypeNodesToExtract(node.instructions, customInstructionData)
2741
3162
  ];
2742
- const scope = { ...globalScope, programNode: node };
2743
- const renderMap = new import_renderers_core.RenderMap().mergeWith(...node.pdas.map((p) => (0, import_visitors_core21.visit)(p, self))).mergeWith(...node.accounts.map((a) => (0, import_visitors_core21.visit)(a, self))).mergeWith(...node.definedTypes.map((t) => (0, import_visitors_core21.visit)(t, self))).mergeWith(...customDataDefinedType.map((t) => (0, import_visitors_core21.visit)(t, self)));
2744
- if (node.errors.length > 0) {
2745
- const programErrorsFragment = getProgramErrorsFragment(scope);
2746
- renderMap.add(
2747
- `errors/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2748
- render2("errorsPage.njk", {
2749
- imports: new ImportMap().mergeWith(programErrorsFragment).toString(dependencyMap, useGranularImports),
2750
- programErrorsFragment
2751
- })
2752
- );
2753
- }
2754
- const programFragment = getProgramFragment(scope);
2755
- const programAccountsFragment = getProgramAccountsFragment(scope);
2756
- const programInstructionsFragment = getProgramInstructionsFragment(scope);
2757
- renderMap.add(
2758
- `programs/${(0, import_nodes26.camelCase)(node.name)}.ts`,
2759
- render2("programsPage.njk", {
2760
- imports: new ImportMap().mergeWith(programFragment, programAccountsFragment, programInstructionsFragment).toString(dependencyMap, useGranularImports),
2761
- programAccountsFragment,
2762
- programFragment,
2763
- programInstructionsFragment
2764
- })
2765
- );
2766
- renderMap.mergeWith(
2767
- ...(0, import_nodes26.getAllInstructionsWithSubs)(node, {
2768
- leavesOnly: !renderParentInstructions
2769
- }).map((ix) => (0, import_visitors_core21.visit)(ix, self))
2770
- );
2771
- return renderMap;
3163
+ const scope = { ...renderScope, programNode: node };
3164
+ return (0, import_renderers_core13.mergeRenderMaps)([
3165
+ (0, import_renderers_core13.createRenderMap)({
3166
+ [`programs/${(0, import_nodes28.camelCase)(node.name)}.ts`]: asPage(getProgramPageFragment(scope)),
3167
+ [`errors/${(0, import_nodes28.camelCase)(node.name)}.ts`]: node.errors.length > 0 ? asPage(getErrorPageFragment(scope)) : void 0
3168
+ }),
3169
+ ...node.pdas.map((p) => (0, import_visitors_core29.visit)(p, self)),
3170
+ ...node.accounts.map((a) => (0, import_visitors_core29.visit)(a, self)),
3171
+ ...node.definedTypes.map((t) => (0, import_visitors_core29.visit)(t, self)),
3172
+ ...customDataDefinedType.map((t) => (0, import_visitors_core29.visit)(t, self)),
3173
+ ...(0, import_nodes28.getAllInstructionsWithSubs)(node, { leavesOnly: !renderScope.renderParentInstructions }).map(
3174
+ (i) => (0, import_visitors_core29.visit)(i, self)
3175
+ )
3176
+ ]);
2772
3177
  },
2773
3178
  visitRoot(node, { self }) {
2774
3179
  const isNotInternal = (n) => !internalNodes.includes(n.name);
2775
- const programsToExport = (0, import_nodes26.getAllPrograms)(node).filter(isNotInternal);
3180
+ const programsToExport = (0, import_nodes28.getAllPrograms)(node).filter(isNotInternal);
2776
3181
  const programsWithErrorsToExport = programsToExport.filter((p) => p.errors.length > 0);
2777
- const pdasToExport = (0, import_nodes26.getAllPdas)(node);
2778
- const accountsToExport = (0, import_nodes26.getAllAccounts)(node).filter(isNotInternal);
2779
- const instructionsToExport = (0, import_nodes26.getAllInstructionsWithSubs)(node, {
2780
- leavesOnly: !renderParentInstructions
3182
+ const pdasToExport = (0, import_nodes28.getAllPdas)(node);
3183
+ const accountsToExport = (0, import_nodes28.getAllAccounts)(node).filter(isNotInternal);
3184
+ const instructionsToExport = (0, import_nodes28.getAllInstructionsWithSubs)(node, {
3185
+ leavesOnly: !renderScope.renderParentInstructions
2781
3186
  }).filter(isNotInternal);
2782
- const definedTypesToExport = (0, import_nodes26.getAllDefinedTypes)(node).filter(isNotInternal);
3187
+ const definedTypesToExport = (0, import_nodes28.getAllDefinedTypes)(node).filter(isNotInternal);
2783
3188
  const hasAnythingToExport = programsToExport.length > 0 || accountsToExport.length > 0 || instructionsToExport.length > 0 || definedTypesToExport.length > 0;
2784
- const ctx = {
3189
+ const scope = {
3190
+ ...renderScope,
2785
3191
  accountsToExport,
2786
3192
  definedTypesToExport,
2787
- hasAnythingToExport,
2788
3193
  instructionsToExport,
2789
3194
  pdasToExport,
2790
- programsToExport,
2791
- programsWithErrorsToExport,
2792
- root: node
3195
+ programsToExport
2793
3196
  };
2794
- const map = new import_renderers_core.RenderMap();
2795
- if (hasAnythingToExport) {
2796
- map.add(
2797
- "shared/index.ts",
2798
- render2("sharedPage.njk", {
2799
- ...ctx,
2800
- imports: new ImportMap().add("solanaAddresses", [
2801
- "type Address",
2802
- "isProgramDerivedAddress",
2803
- "type ProgramDerivedAddress"
2804
- ]).add("solanaInstructions", [
2805
- "AccountRole",
2806
- "type AccountMeta",
2807
- "upgradeRoleToSigner"
2808
- ]).add("solanaSigners", [
2809
- "type AccountSignerMeta",
2810
- "isTransactionSigner",
2811
- "type TransactionSigner"
2812
- ]).addAlias("solanaSigners", "isTransactionSigner", "kitIsTransactionSigner").toString(dependencyMap, useGranularImports)
2813
- })
2814
- );
2815
- }
2816
- if (programsToExport.length > 0) {
2817
- map.add("programs/index.ts", render2("programsIndex.njk", ctx));
2818
- }
2819
- if (programsWithErrorsToExport.length > 0) {
2820
- map.add("errors/index.ts", render2("errorsIndex.njk", ctx));
2821
- }
2822
- if (accountsToExport.length > 0) {
2823
- map.add("accounts/index.ts", render2("accountsIndex.njk", ctx));
2824
- }
2825
- if (pdasToExport.length > 0) {
2826
- map.add("pdas/index.ts", render2("pdasIndex.njk", ctx));
2827
- }
2828
- if (instructionsToExport.length > 0) {
2829
- map.add("instructions/index.ts", render2("instructionsIndex.njk", ctx));
2830
- }
2831
- if (definedTypesToExport.length > 0) {
2832
- map.add("types/index.ts", render2("definedTypesIndex.njk", ctx));
2833
- }
2834
- return map.add("index.ts", render2("rootIndex.njk", ctx)).mergeWith(...(0, import_nodes26.getAllPrograms)(node).map((p) => (0, import_visitors_core21.visit)(p, self)));
3197
+ return (0, import_renderers_core13.mergeRenderMaps)([
3198
+ (0, import_renderers_core13.createRenderMap)({
3199
+ ["accounts/index.ts"]: asPage(getIndexPageFragment(accountsToExport)),
3200
+ ["errors/index.ts"]: asPage(getIndexPageFragment(programsWithErrorsToExport)),
3201
+ ["index.ts"]: asPage(getRootIndexPageFragment(scope)),
3202
+ ["instructions/index.ts"]: asPage(getIndexPageFragment(instructionsToExport)),
3203
+ ["pdas/index.ts"]: asPage(getIndexPageFragment(pdasToExport)),
3204
+ ["programs/index.ts"]: asPage(getIndexPageFragment(programsToExport)),
3205
+ ["shared/index.ts"]: hasAnythingToExport ? asPage(getSharedPageFragment()) : void 0,
3206
+ ["types/index.ts"]: asPage(getIndexPageFragment(definedTypesToExport))
3207
+ }),
3208
+ ...(0, import_nodes28.getAllPrograms)(node).map((p) => (0, import_visitors_core29.visit)(p, self))
3209
+ ]);
2835
3210
  }
2836
3211
  }),
2837
- (v) => (0, import_visitors_core21.recordNodeStackVisitor)(v, stack),
2838
- (v) => (0, import_visitors_core21.recordLinkablesOnFirstVisitVisitor)(v, linkables)
2839
- );
2840
- }
2841
- function getRenamedArgsMap(instruction) {
2842
- const argNames = [
2843
- ...instruction.arguments.map((a) => a.name),
2844
- ...(instruction.extraArguments ?? []).map((a) => a.name)
2845
- ];
2846
- const duplicateArgs = argNames.filter((e, i, a) => a.indexOf(e) !== i);
2847
- if (duplicateArgs.length > 0) {
2848
- throw new Error(`Duplicate args found: [${duplicateArgs.join(", ")}] in instruction [${instruction.name}].`);
2849
- }
2850
- const allNames = [...instruction.accounts.map((account) => account.name), ...argNames];
2851
- const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);
2852
- if (duplicates.length === 0) return /* @__PURE__ */ new Map();
2853
- (0, import_errors2.logWarn)(
2854
- `[JavaScript] Accounts and args of instruction [${instruction.name}] have the following conflicting attributes [${duplicates.join(", ")}]. Thus, the arguments have been renamed to avoid conflicts in the input type.`
3212
+ (v) => (0, import_visitors_core29.recordNodeStackVisitor)(v, stack),
3213
+ (v) => (0, import_visitors_core29.recordLinkablesOnFirstVisitVisitor)(v, linkables)
2855
3214
  );
2856
- return new Map(duplicates.map((name) => [(0, import_nodes26.camelCase)(name), (0, import_nodes26.camelCase)(`${name}Arg`)]));
2857
3215
  }
2858
3216
 
2859
- // src/renderVisitor.ts
2860
- var import_renderers_core2 = require("@codama/renderers-core");
2861
- var import_visitors_core22 = require("@codama/visitors-core");
3217
+ // src/visitors/renderVisitor.ts
3218
+ var import_renderers_core14 = require("@codama/renderers-core");
3219
+ var import_visitors_core30 = require("@codama/visitors-core");
2862
3220
  var estreePlugin = __toESM(require("prettier/plugins/estree"));
2863
3221
  var typeScriptPlugin = __toESM(require("prettier/plugins/typescript"));
2864
3222
  var import_standalone = require("prettier/standalone");
@@ -2874,26 +3232,31 @@ var DEFAULT_PRETTIER_OPTIONS = {
2874
3232
  useTabs: false
2875
3233
  };
2876
3234
  function renderVisitor(path, options = {}) {
2877
- return (0, import_visitors_core22.rootNodeVisitor)(async (root) => {
3235
+ return (0, import_visitors_core30.rootNodeVisitor)(async (root) => {
2878
3236
  if (options.deleteFolderBeforeRendering ?? true) {
2879
- (0, import_renderers_core2.deleteDirectory)(path);
3237
+ (0, import_renderers_core14.deleteDirectory)(path);
2880
3238
  }
2881
- const renderMap = (0, import_visitors_core22.visit)(root, getRenderMapVisitor(options));
3239
+ let renderMap = (0, import_visitors_core30.visit)(root, getRenderMapVisitor(options));
2882
3240
  if (options.formatCode ?? true) {
2883
3241
  const prettierOptions = { ...DEFAULT_PRETTIER_OPTIONS, ...options.prettierOptions };
2884
- await renderMap.mapContentAsync((code) => (0, import_standalone.format)(code, prettierOptions));
3242
+ renderMap = await (0, import_renderers_core14.mapRenderMapContentAsync)(renderMap, (code) => (0, import_standalone.format)(code, prettierOptions));
2885
3243
  }
2886
- renderMap.write(path);
3244
+ (0, import_renderers_core14.writeRenderMap)(renderMap, path);
2887
3245
  });
2888
3246
  }
2889
3247
  // Annotate the CommonJS export names for ESM import in node:
2890
3248
  0 && (module.exports = {
2891
3249
  DEFAULT_NAME_TRANSFORMERS,
2892
- ImportMap,
3250
+ addToImportMap,
3251
+ createImportMap,
2893
3252
  getNameApi,
2894
3253
  getRenderMapVisitor,
2895
3254
  getTypeManifestVisitor,
2896
- mergeManifests,
3255
+ importMapToString,
3256
+ mergeImportMaps,
3257
+ mergeTypeManifests,
3258
+ parseImportInput,
3259
+ removeFromImportMap,
2897
3260
  renderVisitor,
2898
3261
  typeManifest
2899
3262
  });