@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.
- package/LICENSE +1 -1
- package/dist/index.browser.cjs +3247 -0
- package/dist/index.browser.cjs.map +1 -0
- package/dist/index.browser.mjs +3300 -0
- package/dist/index.browser.mjs.map +1 -0
- package/dist/index.node.cjs +2081 -1718
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +2015 -1657
- package/dist/index.node.mjs.map +1 -1
- package/dist/index.react-native.mjs +3300 -0
- package/dist/index.react-native.mjs.map +1 -0
- package/dist/types/fragments/accountFetchHelpers.d.ts +2 -4
- package/dist/types/fragments/accountFetchHelpers.d.ts.map +1 -1
- package/dist/types/fragments/accountPage.d.ts +8 -0
- package/dist/types/fragments/accountPage.d.ts.map +1 -0
- package/dist/types/fragments/accountPdaHelpers.d.ts +3 -5
- package/dist/types/fragments/accountPdaHelpers.d.ts.map +1 -1
- package/dist/types/fragments/accountSizeHelpers.d.ts +3 -4
- package/dist/types/fragments/accountSizeHelpers.d.ts.map +1 -1
- package/dist/types/fragments/accountType.d.ts +3 -5
- package/dist/types/fragments/accountType.d.ts.map +1 -1
- package/dist/types/fragments/discriminatorCondition.d.ts +2 -3
- package/dist/types/fragments/discriminatorCondition.d.ts.map +1 -1
- package/dist/types/fragments/discriminatorConstants.d.ts +5 -6
- package/dist/types/fragments/discriminatorConstants.d.ts.map +1 -1
- package/dist/types/fragments/errorPage.d.ts +6 -0
- package/dist/types/fragments/errorPage.d.ts.map +1 -0
- package/dist/types/fragments/index.d.ts +11 -4
- package/dist/types/fragments/index.d.ts.map +1 -1
- package/dist/types/fragments/indexPage.d.ts +6 -0
- package/dist/types/fragments/indexPage.d.ts.map +1 -0
- package/dist/types/fragments/instructionAccountMeta.d.ts +1 -1
- package/dist/types/fragments/instructionAccountMeta.d.ts.map +1 -1
- package/dist/types/fragments/instructionAccountTypeParam.d.ts +2 -3
- package/dist/types/fragments/instructionAccountTypeParam.d.ts.map +1 -1
- package/dist/types/fragments/instructionByteDelta.d.ts +3 -4
- package/dist/types/fragments/instructionByteDelta.d.ts.map +1 -1
- package/dist/types/fragments/instructionData.d.ts +3 -5
- package/dist/types/fragments/instructionData.d.ts.map +1 -1
- package/dist/types/fragments/instructionExtraArgs.d.ts +3 -5
- package/dist/types/fragments/instructionExtraArgs.d.ts.map +1 -1
- package/dist/types/fragments/instructionFunction.d.ts +3 -5
- package/dist/types/fragments/instructionFunction.d.ts.map +1 -1
- package/dist/types/fragments/instructionInputDefault.d.ts +2 -3
- package/dist/types/fragments/instructionInputDefault.d.ts.map +1 -1
- package/dist/types/fragments/instructionInputResolved.d.ts +2 -3
- package/dist/types/fragments/instructionInputResolved.d.ts.map +1 -1
- package/dist/types/fragments/instructionInputType.d.ts +2 -4
- package/dist/types/fragments/instructionInputType.d.ts.map +1 -1
- package/dist/types/fragments/instructionPage.d.ts +9 -0
- package/dist/types/fragments/instructionPage.d.ts.map +1 -0
- package/dist/types/fragments/instructionParseFunction.d.ts +2 -4
- package/dist/types/fragments/instructionParseFunction.d.ts.map +1 -1
- package/dist/types/fragments/instructionRemainingAccounts.d.ts +3 -4
- package/dist/types/fragments/instructionRemainingAccounts.d.ts.map +1 -1
- package/dist/types/fragments/instructionType.d.ts +2 -3
- package/dist/types/fragments/instructionType.d.ts.map +1 -1
- package/dist/types/fragments/pdaFunction.d.ts +2 -3
- package/dist/types/fragments/pdaFunction.d.ts.map +1 -1
- package/dist/types/fragments/pdaPage.d.ts +7 -0
- package/dist/types/fragments/pdaPage.d.ts.map +1 -0
- package/dist/types/fragments/programAccounts.d.ts +3 -4
- package/dist/types/fragments/programAccounts.d.ts.map +1 -1
- package/dist/types/fragments/programConstant.d.ts +6 -0
- package/dist/types/fragments/programConstant.d.ts.map +1 -0
- package/dist/types/fragments/programInstructions.d.ts +3 -4
- package/dist/types/fragments/programInstructions.d.ts.map +1 -1
- package/dist/types/fragments/programPage.d.ts +6 -0
- package/dist/types/fragments/programPage.d.ts.map +1 -0
- package/dist/types/fragments/rootIndexPage.d.ts +10 -0
- package/dist/types/fragments/rootIndexPage.d.ts.map +1 -0
- package/dist/types/fragments/sharedPage.d.ts +3 -0
- package/dist/types/fragments/sharedPage.d.ts.map +1 -0
- package/dist/types/fragments/type.d.ts +2 -4
- package/dist/types/fragments/type.d.ts.map +1 -1
- package/dist/types/fragments/typeCodec.d.ts +2 -4
- package/dist/types/fragments/typeCodec.d.ts.map +1 -1
- package/dist/types/fragments/typeDecoder.d.ts +2 -4
- package/dist/types/fragments/typeDecoder.d.ts.map +1 -1
- package/dist/types/fragments/typeDiscriminatedUnionHelpers.d.ts +3 -4
- package/dist/types/fragments/typeDiscriminatedUnionHelpers.d.ts.map +1 -1
- package/dist/types/fragments/typeEncoder.d.ts +2 -4
- package/dist/types/fragments/typeEncoder.d.ts.map +1 -1
- package/dist/types/fragments/typePage.d.ts +7 -0
- package/dist/types/fragments/typePage.d.ts.map +1 -0
- package/dist/types/fragments/typeWithCodec.d.ts +2 -4
- package/dist/types/fragments/typeWithCodec.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -7
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/utils/fragment.d.ts +24 -0
- package/dist/types/utils/fragment.d.ts.map +1 -0
- package/dist/types/utils/importMap.d.ts +17 -0
- package/dist/types/utils/importMap.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +5 -1
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/nameTransformers.d.ts.map +1 -0
- package/dist/types/utils/options.d.ts +40 -0
- package/dist/types/utils/options.d.ts.map +1 -0
- package/dist/types/{TypeManifest.d.ts → utils/typeManifest.d.ts} +6 -6
- package/dist/types/utils/typeManifest.d.ts.map +1 -0
- package/dist/types/visitors/getRenderMapVisitor.d.ts +3 -0
- package/dist/types/visitors/getRenderMapVisitor.d.ts.map +1 -0
- package/dist/types/visitors/getTypeManifestVisitor.d.ts +21 -0
- package/dist/types/visitors/getTypeManifestVisitor.d.ts.map +1 -0
- package/dist/types/visitors/index.d.ts +4 -0
- package/dist/types/visitors/index.d.ts.map +1 -0
- package/dist/types/visitors/renderVisitor.d.ts +3 -0
- package/dist/types/visitors/renderVisitor.d.ts.map +1 -0
- package/package.json +22 -13
- package/dist/templates/fragments/accountFetchHelpers.njk +0 -43
- package/dist/templates/fragments/accountPdaHelpers.njk +0 -25
- package/dist/templates/fragments/accountSizeHelpers.njk +0 -3
- package/dist/templates/fragments/instructionExtraArgs.njk +0 -4
- package/dist/templates/fragments/instructionFunction.njk +0 -62
- package/dist/templates/fragments/instructionInputType.njk +0 -16
- package/dist/templates/fragments/instructionParseFunction.njk +0 -81
- package/dist/templates/fragments/instructionType.njk +0 -18
- package/dist/templates/fragments/pdaFunction.njk +0 -33
- package/dist/templates/fragments/program.njk +0 -3
- package/dist/templates/fragments/programErrors.njk +0 -36
- package/dist/templates/fragments/type.njk +0 -12
- package/dist/templates/fragments/typeCodec.njk +0 -6
- package/dist/templates/fragments/typeDecoder.njk +0 -6
- package/dist/templates/fragments/typeDiscriminatedUnionHelpers.njk +0 -23
- package/dist/templates/fragments/typeEncoder.njk +0 -6
- package/dist/templates/layout.njk +0 -9
- package/dist/templates/macros.njk +0 -12
- package/dist/templates/pages/accountsIndex.njk +0 -9
- package/dist/templates/pages/accountsPage.njk +0 -12
- package/dist/templates/pages/definedTypesIndex.njk +0 -9
- package/dist/templates/pages/definedTypesPage.njk +0 -9
- package/dist/templates/pages/errorsIndex.njk +0 -9
- package/dist/templates/pages/errorsPage.njk +0 -8
- package/dist/templates/pages/instructionsIndex.njk +0 -9
- package/dist/templates/pages/instructionsPage.njk +0 -14
- package/dist/templates/pages/pdasIndex.njk +0 -9
- package/dist/templates/pages/pdasPage.njk +0 -8
- package/dist/templates/pages/programsIndex.njk +0 -9
- package/dist/templates/pages/programsPage.njk +0 -10
- package/dist/templates/pages/rootIndex.njk +0 -26
- package/dist/templates/pages/sharedPage.njk +0 -106
- package/dist/types/ImportMap.d.ts +0 -15
- package/dist/types/ImportMap.d.ts.map +0 -1
- package/dist/types/TypeManifest.d.ts.map +0 -1
- package/dist/types/fragments/common.d.ts +0 -25
- package/dist/types/fragments/common.d.ts.map +0 -1
- package/dist/types/fragments/program.d.ts +0 -7
- package/dist/types/fragments/program.d.ts.map +0 -1
- package/dist/types/fragments/programErrors.d.ts +0 -7
- package/dist/types/fragments/programErrors.d.ts.map +0 -1
- package/dist/types/getRenderMapVisitor.d.ts +0 -31
- package/dist/types/getRenderMapVisitor.d.ts.map +0 -1
- package/dist/types/getTypeManifestVisitor.d.ts +0 -16
- package/dist/types/getTypeManifestVisitor.d.ts.map +0 -1
- package/dist/types/nameTransformers.d.ts.map +0 -1
- package/dist/types/renderVisitor.d.ts +0 -11
- package/dist/types/renderVisitor.d.ts.map +0 -1
- package/dist/types/utils/render.d.ts +0 -4
- package/dist/types/utils/render.d.ts.map +0 -1
- /package/dist/types/{nameTransformers.d.ts → utils/nameTransformers.d.ts} +0 -0
package/dist/index.node.cjs
CHANGED
|
@@ -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
|
-
|
|
34
|
+
addToImportMap: () => addToImportMap,
|
|
35
|
+
createImportMap: () => createImportMap,
|
|
35
36
|
default: () => renderVisitor,
|
|
36
37
|
getNameApi: () => getNameApi,
|
|
37
38
|
getRenderMapVisitor: () => getRenderMapVisitor,
|
|
38
39
|
getTypeManifestVisitor: () => getTypeManifestVisitor,
|
|
39
|
-
|
|
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/
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
|
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,
|
|
329
|
+
({ value }) => (0, import_nodes2.isNode)(value, "resolverValueNode") && asyncResolvers.includes(value.name)
|
|
190
330
|
);
|
|
191
331
|
const hasRemainingAccountsAsync = (instructionNode.remainingAccounts ?? []).some(
|
|
192
|
-
({ value }) => (0,
|
|
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,
|
|
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,
|
|
227
|
-
return [(0,
|
|
366
|
+
if ((0, import_nodes2.isNode)(input.defaultValue, ["accountValueNode", "accountBumpValueNode"])) {
|
|
367
|
+
return [(0, import_nodes2.accountValueNode)(input.defaultValue.name)];
|
|
228
368
|
}
|
|
229
|
-
if ((0,
|
|
230
|
-
return [(0,
|
|
369
|
+
if ((0, import_nodes2.isNode)(input.defaultValue, ["argumentValueNode"])) {
|
|
370
|
+
return [(0, import_nodes2.argumentValueNode)(input.defaultValue.name)];
|
|
231
371
|
}
|
|
232
|
-
if ((0,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
418
|
+
const importAs = (0, import_nodes3.camelCase)(options.importAs ?? `${options.name}${defaultSuffix}`);
|
|
279
419
|
const importFrom = options.importFrom ?? "hooked";
|
|
280
420
|
return [
|
|
281
|
-
(0,
|
|
421
|
+
(0, import_nodes3.camelCase)(options.name),
|
|
282
422
|
{
|
|
283
423
|
extract: options.extract ?? false,
|
|
284
|
-
extractAs: options.extractAs ? (0,
|
|
424
|
+
extractAs: options.extractAs ? (0, import_nodes3.camelCase)(options.extractAs) : importAs,
|
|
285
425
|
importAs,
|
|
286
426
|
importFrom,
|
|
287
|
-
linkNode: (0,
|
|
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,
|
|
296
|
-
return [(0,
|
|
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,
|
|
439
|
+
(0, import_nodes3.definedTypeNode)({
|
|
300
440
|
name: options.extractAs,
|
|
301
|
-
type: (0,
|
|
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/
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
const
|
|
365
|
-
|
|
366
|
-
|
|
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
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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
|
-
|
|
388
|
-
|
|
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
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
const
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
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
|
-
|
|
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
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
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
|
-
|
|
527
|
-
}
|
|
528
|
-
return
|
|
529
|
-
|
|
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
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
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
|
|
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
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
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 {
|
|
590
|
-
const
|
|
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
|
-
|
|
596
|
-
|
|
597
|
-
|
|
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/
|
|
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
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
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
|
|
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,
|
|
662
|
-
return
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
938
|
+
var import_nodes11 = require("@codama/nodes");
|
|
688
939
|
function getInstructionAccountMetaFragment(instructionAccountNode) {
|
|
689
|
-
const typeParam = `TAccount${(0,
|
|
940
|
+
const typeParam = `TAccount${(0, import_nodes11.pascalCase)(instructionAccountNode.name)}`;
|
|
690
941
|
if (instructionAccountNode.isSigner === true && instructionAccountNode.isWritable) {
|
|
691
|
-
return fragment(
|
|
942
|
+
return fragment`${use("type WritableSignerAccount", "solanaInstructions")}<${typeParam}> & ${use("type AccountSignerMeta", "solanaSigners")}<${typeParam}>`;
|
|
692
943
|
}
|
|
693
944
|
if (instructionAccountNode.isSigner === true) {
|
|
694
|
-
return fragment(
|
|
945
|
+
return fragment`${use("type ReadonlySignerAccount", "solanaInstructions")}<${typeParam}> & ${use("type AccountSignerMeta", "solanaSigners")}<${typeParam}>`;
|
|
695
946
|
}
|
|
696
947
|
if (instructionAccountNode.isWritable) {
|
|
697
|
-
return fragment
|
|
948
|
+
return fragment`${use("type WritableAccount", "solanaInstructions")}<${typeParam}>`;
|
|
698
949
|
}
|
|
699
|
-
return fragment
|
|
950
|
+
return fragment`${use("type ReadonlyAccount", "solanaInstructions")}<${typeParam}>`;
|
|
700
951
|
}
|
|
701
952
|
|
|
702
953
|
// src/fragments/instructionAccountTypeParam.ts
|
|
703
|
-
var
|
|
704
|
-
var
|
|
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,
|
|
708
|
-
const instructionNode = (0,
|
|
709
|
-
const programNode = (0,
|
|
710
|
-
const typeParam = `TAccount${(0,
|
|
711
|
-
const accountMeta = allowAccountMeta ?
|
|
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
|
|
964
|
+
return fragment`${typeParam} extends string${accountMeta} | undefined = undefined`;
|
|
718
965
|
}
|
|
719
966
|
const defaultAddress = getDefaultAddress(instructionAccountNode.defaultValue, programNode.publicKey, linkables);
|
|
720
|
-
return fragment
|
|
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
|
|
738
|
-
var
|
|
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,
|
|
741
|
-
const fragments = (byteDeltas ?? []).flatMap((
|
|
742
|
-
if (fragments.length === 0) return
|
|
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
|
-
(
|
|
746
|
-
const byteDelta: number = [${
|
|
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
|
-
|
|
751
|
-
if ((0,
|
|
998
|
+
let bytesFragment = (() => {
|
|
999
|
+
if ((0, import_nodes13.isNode)(byteDelta.value, "numberValueNode")) {
|
|
752
1000
|
return getNumberValueNodeFragment(byteDelta);
|
|
753
1001
|
}
|
|
754
|
-
if ((0,
|
|
1002
|
+
if ((0, import_nodes13.isNode)(byteDelta.value, "argumentValueNode")) {
|
|
755
1003
|
return getArgumentValueNodeFragment(byteDelta);
|
|
756
1004
|
}
|
|
757
|
-
if ((0,
|
|
1005
|
+
if ((0, import_nodes13.isNode)(byteDelta.value, "accountLinkNode")) {
|
|
758
1006
|
return getAccountLinkNodeFragment(byteDelta, scope);
|
|
759
1007
|
}
|
|
760
|
-
if ((0,
|
|
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
|
|
1015
|
+
bytesFragment = fragment`${bytesFragment} + ${use("BASE_ACCOUNT_SIZE", "solanaAccounts")}`;
|
|
768
1016
|
}
|
|
769
1017
|
if (byteDelta.subtract) {
|
|
770
|
-
bytesFragment.
|
|
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,
|
|
776
|
-
return fragment
|
|
1023
|
+
(0, import_nodes13.assertIsNode)(byteDelta.value, "numberValueNode");
|
|
1024
|
+
return fragment`${byteDelta.value.number}`;
|
|
777
1025
|
}
|
|
778
1026
|
function getArgumentValueNodeFragment(byteDelta) {
|
|
779
|
-
(0,
|
|
780
|
-
const argumentName = (0,
|
|
781
|
-
return fragment
|
|
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,
|
|
785
|
-
const functionName =
|
|
786
|
-
|
|
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,
|
|
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 =
|
|
794
|
-
|
|
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
|
|
799
|
-
var
|
|
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,
|
|
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,
|
|
1066
|
+
node: (0, import_nodes14.structTypeNodeFromInstructionArgumentNodes)(instructionNode.arguments),
|
|
812
1067
|
size: scope.size
|
|
813
1068
|
});
|
|
814
1069
|
}
|
|
815
1070
|
|
|
816
|
-
// src/fragments/
|
|
817
|
-
var
|
|
818
|
-
var
|
|
819
|
-
function
|
|
820
|
-
const
|
|
821
|
-
|
|
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
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
const
|
|
840
|
-
|
|
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,
|
|
904
|
-
if (input.kind === "instructionAccountNode" && (0,
|
|
905
|
-
return fragment
|
|
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
|
|
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
|
|
1117
|
+
return fragment`args.${inputName} = ${renderedValue};`;
|
|
917
1118
|
};
|
|
918
1119
|
switch (defaultValue.kind) {
|
|
919
1120
|
case "accountValueNode":
|
|
920
|
-
const name = (0,
|
|
1121
|
+
const name = (0, import_nodes15.camelCase)(defaultValue.name);
|
|
921
1122
|
if (input.kind === "instructionAccountNode" && input.resolvedIsSigner && !input.isSigner) {
|
|
922
|
-
return
|
|
923
|
-
|
|
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
|
|
1129
|
+
return (0, import_visitors_core13.pipe)(
|
|
1130
|
+
defaultFragment(`expectSome(accounts.${name}.value)`),
|
|
1131
|
+
(f) => addFragmentImports(f, "shared", ["expectSome"])
|
|
1132
|
+
);
|
|
929
1133
|
}
|
|
930
|
-
return
|
|
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,
|
|
933
|
-
const pdaProgram = defaultValue.pda.programId ?
|
|
934
|
-
`'${defaultValue.pda.programId}' as Address<'${defaultValue.pda.programId}'
|
|
935
|
-
|
|
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,
|
|
1145
|
+
if ((0, import_nodes15.isNode)(seed, "constantPdaSeedNode") && (0, import_nodes15.isNode)(seed.value, "programIdValueNode")) {
|
|
938
1146
|
return [
|
|
939
|
-
|
|
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,
|
|
943
|
-
const typeManifest2 = (0,
|
|
944
|
-
const valueManifest2 = (0,
|
|
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,
|
|
952
|
-
const typeManifest2 = (0,
|
|
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,
|
|
1162
|
+
if ((0, import_nodes15.isNode)(valueSeed, "accountValueNode")) {
|
|
956
1163
|
return [
|
|
957
|
-
|
|
958
|
-
`${typeManifest2.encoder
|
|
959
|
-
|
|
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,
|
|
1170
|
+
if ((0, import_nodes15.isNode)(valueSeed, "argumentValueNode")) {
|
|
963
1171
|
return [
|
|
964
|
-
|
|
965
|
-
`${typeManifest2.encoder
|
|
966
|
-
|
|
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,
|
|
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
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
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,
|
|
988
|
-
return
|
|
989
|
-
`${seed.name}: expectAddress(accounts.${(0,
|
|
990
|
-
|
|
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,
|
|
993
|
-
return
|
|
994
|
-
|
|
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,
|
|
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 =
|
|
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.
|
|
1217
|
+
pdaArgs.push(pdaSeedsFragment.content);
|
|
1003
1218
|
}
|
|
1004
|
-
|
|
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
|
|
1007
|
-
|
|
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
|
|
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
|
|
1023
|
-
`expectProgramDerivedAddress(accounts.${(0,
|
|
1024
|
-
|
|
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
|
|
1027
|
-
|
|
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
|
|
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
|
-
|
|
1274
|
+
let conditionalFragment = fragment``;
|
|
1047
1275
|
if (ifTrueRenderer) {
|
|
1048
|
-
conditionalFragment
|
|
1276
|
+
conditionalFragment = mergeFragments([conditionalFragment, ifTrueRenderer], (c) => c[0]);
|
|
1049
1277
|
}
|
|
1050
1278
|
if (ifFalseRenderer) {
|
|
1051
|
-
conditionalFragment
|
|
1279
|
+
conditionalFragment = mergeFragments([conditionalFragment, ifFalseRenderer], (c) => c[0]);
|
|
1052
1280
|
}
|
|
1053
1281
|
const negatedCondition = !ifTrueRenderer;
|
|
1054
1282
|
let condition = "true";
|
|
1055
|
-
if ((0,
|
|
1283
|
+
if ((0, import_nodes15.isNode)(defaultValue.condition, "resolverValueNode")) {
|
|
1056
1284
|
const conditionalResolverFunction = nameApi.resolverFunction(defaultValue.condition.name);
|
|
1057
|
-
|
|
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,
|
|
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,
|
|
1065
|
-
conditionalFragment
|
|
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.
|
|
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
|
|
1306
|
+
return (0, import_renderers_core5.setFragmentContent)(
|
|
1307
|
+
conditionalFragment,
|
|
1074
1308
|
`if (${condition}) {
|
|
1075
|
-
${ifTrueRenderer.
|
|
1309
|
+
${ifTrueRenderer.content}
|
|
1076
1310
|
} else {
|
|
1077
|
-
${ifFalseRenderer.
|
|
1311
|
+
${ifFalseRenderer.content}
|
|
1078
1312
|
}`
|
|
1079
1313
|
);
|
|
1080
1314
|
}
|
|
1081
|
-
return
|
|
1315
|
+
return (0, import_renderers_core5.setFragmentContent)(
|
|
1316
|
+
conditionalFragment,
|
|
1082
1317
|
`if (${condition}) {
|
|
1083
|
-
${ifTrueRenderer ? ifTrueRenderer.
|
|
1318
|
+
${ifTrueRenderer ? ifTrueRenderer.content : ifFalseRenderer?.content}
|
|
1084
1319
|
}`
|
|
1085
1320
|
);
|
|
1086
1321
|
default:
|
|
1087
|
-
const valueManifest = (0,
|
|
1088
|
-
return
|
|
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,
|
|
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,
|
|
1342
|
+
optionalAccountStrategy: (0, import_nodes16.parseOptionalAccountStrategy)(instructionNode.optionalAccountStrategy)
|
|
1108
1343
|
});
|
|
1109
|
-
if (!inputFragment.
|
|
1110
|
-
const camelName = (0,
|
|
1344
|
+
if (!inputFragment.content) return [];
|
|
1345
|
+
const camelName = (0, import_nodes16.camelCase)(input.name);
|
|
1111
1346
|
return [
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
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
|
-
${
|
|
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
|
|
1132
|
-
var
|
|
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,
|
|
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
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
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,
|
|
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,
|
|
1165
|
-
const
|
|
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)
|
|
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, (
|
|
1402
|
+
return mergeFragments(fragments, (c) => c.join("\n"));
|
|
1173
1403
|
}
|
|
1174
1404
|
function getAccountTypeFragment2(account) {
|
|
1175
|
-
const typeParam = `TAccount${(0,
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
}
|
|
1181
|
-
if (account.
|
|
1182
|
-
|
|
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,
|
|
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
|
-
|
|
1199
|
-
|
|
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,
|
|
1432
|
+
const argFragment = getArgumentFragment(arg, dataArgsType, scope.resolvedInputs, scope.renamedArgs);
|
|
1206
1433
|
return argFragment ? [argFragment] : [];
|
|
1207
1434
|
});
|
|
1208
|
-
return [mergeFragments(fragments, (
|
|
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,
|
|
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,
|
|
1443
|
+
const argFragment = getArgumentFragment(arg, extraArgsType, scope.resolvedInputs, scope.renamedArgs);
|
|
1217
1444
|
return argFragment ? [argFragment] : [];
|
|
1218
1445
|
});
|
|
1219
|
-
|
|
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,
|
|
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
|
|
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,
|
|
1460
|
+
if ((0, import_nodes17.isNode)(remainingAccountsNode.value, "resolverValueNode")) return [];
|
|
1233
1461
|
const { name } = remainingAccountsNode.value;
|
|
1234
|
-
const allArguments = (0,
|
|
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 =
|
|
1240
|
-
const addressFragment =
|
|
1241
|
-
|
|
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
|
-
})()
|
|
1472
|
+
})();
|
|
1473
|
+
return fragment`${(0, import_nodes17.camelCase)(name)}${optionalSign}: Array<${typeFragment}>;`;
|
|
1247
1474
|
});
|
|
1248
|
-
|
|
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
|
|
1253
|
-
var
|
|
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,
|
|
1256
|
-
const fragments = (remainingAccounts ?? []).flatMap((
|
|
1257
|
-
if (fragments.length === 0) return
|
|
1258
|
-
return
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
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,
|
|
1497
|
+
if ((0, import_nodes18.isNode)(remainingAccounts.value, "argumentValueNode")) {
|
|
1267
1498
|
return getArgumentValueNodeFragment2(remainingAccounts, scope);
|
|
1268
1499
|
}
|
|
1269
|
-
if ((0,
|
|
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,
|
|
1279
|
-
(0,
|
|
1280
|
-
const argumentName = (0,
|
|
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
|
|
1285
|
-
const
|
|
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,
|
|
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
|
|
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,
|
|
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 =
|
|
1314
|
-
|
|
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
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
1575
|
+
const resolvedInputFragment = mergeFragments(
|
|
1373
1576
|
[resolvedInputsFragment, remainingAccountsFragment, byteDeltaFragment],
|
|
1374
|
-
(
|
|
1577
|
+
(content) => content.join("\n\n")
|
|
1375
1578
|
);
|
|
1376
|
-
const hasRemainingAccounts = remainingAccountsFragment
|
|
1377
|
-
const hasByteDeltas = byteDeltaFragment
|
|
1378
|
-
const hasResolver =
|
|
1379
|
-
const
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
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
|
-
|
|
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
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
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
|
|
1696
|
+
function getInstructionTypeFragment(scope) {
|
|
1432
1697
|
const { instructionPath, nameApi } = scope;
|
|
1433
|
-
const instructionNode = (0,
|
|
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,
|
|
1438
|
-
const camelName = (0,
|
|
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 =
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
)
|
|
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
|
|
1713
|
+
return typeParam;
|
|
1446
1714
|
});
|
|
1447
|
-
return
|
|
1448
|
-
[
|
|
1449
|
-
(
|
|
1450
|
-
)
|
|
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
|
|
1720
|
+
function getInputTypeCallFragment(scope) {
|
|
1453
1721
|
const { instructionPath, useAsync, nameApi } = scope;
|
|
1454
|
-
const instructionNode = (0,
|
|
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
|
|
1457
|
-
const accountTypeParams = instructionNode.accounts.map((account) => `TAccount${(0,
|
|
1458
|
-
return fragment
|
|
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
|
|
1735
|
+
var import_nodes20 = require("@codama/nodes");
|
|
1736
|
+
var import_visitors_core18 = require("@codama/visitors-core");
|
|
1463
1737
|
function getInstructionParseFunctionFragment(scope) {
|
|
1464
|
-
const
|
|
1465
|
-
const
|
|
1466
|
-
const
|
|
1467
|
-
const
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
const
|
|
1472
|
-
const
|
|
1473
|
-
const
|
|
1474
|
-
const
|
|
1475
|
-
|
|
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
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
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
|
|
1497
|
-
var
|
|
1498
|
-
|
|
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,
|
|
1501
|
-
const programNode = (0,
|
|
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
|
|
1506
|
-
const programAddressConstant = nameApi.programAddressConstant(programNode.name);
|
|
1507
|
-
const
|
|
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
|
-
(
|
|
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)
|
|
1522
|
-
const typeParam = `TAccount${(0,
|
|
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 ? ${
|
|
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
|
-
(
|
|
1530
|
-
);
|
|
1531
|
-
const
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
"
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
...
|
|
1545
|
-
|
|
1546
|
-
|
|
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
|
|
1551
|
-
var
|
|
1941
|
+
var import_nodes23 = require("@codama/nodes");
|
|
1942
|
+
var import_visitors_core21 = require("@codama/visitors-core");
|
|
1552
1943
|
function getPdaFunctionFragment(scope) {
|
|
1553
|
-
const
|
|
1554
|
-
const
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
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,
|
|
1564
|
-
|
|
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
|
|
1568
|
-
|
|
1569
|
-
|
|
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
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
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
|
|
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
|
|
2019
|
+
if (scope.programNode.accounts.length === 0) return;
|
|
1597
2020
|
return mergeFragments(
|
|
1598
2021
|
[getProgramAccountsEnumFragment(scope), getProgramAccountsIdentifierFunctionFragment(scope)],
|
|
1599
|
-
(
|
|
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
|
|
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
|
|
2039
|
+
if (!hasAccountDiscriminators) return;
|
|
1618
2040
|
const programAccountsEnum = nameApi.programAccountsEnum(programNode.name);
|
|
1619
2041
|
const programAccountsIdentifierFunction = nameApi.programAccountsIdentifierFunction(programNode.name);
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
(
|
|
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
|
-
|
|
2063
|
+
),
|
|
2064
|
+
(f) => addFragmentImports(f, "solanaCodecsCore", ["type ReadonlyUint8Array"])
|
|
2065
|
+
);
|
|
1640
2066
|
}
|
|
1641
2067
|
|
|
1642
|
-
// src/fragments/
|
|
1643
|
-
|
|
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
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
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
|
|
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
|
|
1662
|
-
const allInstructions = (0,
|
|
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
|
-
(
|
|
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
|
|
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,
|
|
2124
|
+
struct: (0, import_nodes25.structTypeNodeFromInstructionArgumentNodes)(instruction.arguments)
|
|
1705
2125
|
});
|
|
1706
2126
|
}),
|
|
1707
|
-
(
|
|
2127
|
+
(c) => c.join("\n")
|
|
1708
2128
|
);
|
|
1709
|
-
return
|
|
1710
|
-
|
|
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
|
-
|
|
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 =
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
)
|
|
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
|
|
2157
|
+
fragment`export type ${programInstructionsType}<TProgram extends string = '${programAddress}'> =`,
|
|
1732
2158
|
...typeVariants
|
|
1733
2159
|
],
|
|
1734
|
-
(
|
|
2160
|
+
(c) => c.join("\n")
|
|
1735
2161
|
);
|
|
1736
2162
|
}
|
|
1737
2163
|
|
|
1738
|
-
// src/fragments/
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
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
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
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/
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
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
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
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
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
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
|
-
|
|
1789
|
-
|
|
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
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
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
|
|
2377
|
+
const stack = input.stack ?? new import_visitors_core28.NodeStack();
|
|
1797
2378
|
let parentName = null;
|
|
1798
|
-
return (0,
|
|
1799
|
-
(0,
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
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,
|
|
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,
|
|
2402
|
+
return (0, import_visitors_core28.visit)(amountType.number, self);
|
|
1832
2403
|
},
|
|
1833
2404
|
visitArrayType(arrayType, { self }) {
|
|
1834
|
-
const childManifest = (0,
|
|
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
|
|
1839
|
-
const decoderOptions = sizeManifest.decoder
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
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
|
|
1846
|
-
node.items.map((v) => (0,
|
|
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
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
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,
|
|
1858
|
-
|
|
1859
|
-
|
|
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(
|
|
1865
|
-
encoder: fragment(
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
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
|
-
|
|
1903
|
-
return manifest;
|
|
2453
|
+
return typeManifest({ value: fragment`new Uint8Array([${Array.from(bytes).join(", ")}])` });
|
|
1904
2454
|
},
|
|
1905
2455
|
visitConstantValue(node, { self }) {
|
|
1906
|
-
if ((0,
|
|
1907
|
-
return (0,
|
|
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
|
-
|
|
1911
|
-
|
|
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,
|
|
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,
|
|
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
|
|
1937
|
-
encoder: fragment
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
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,
|
|
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
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
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,
|
|
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,
|
|
2507
|
+
const structManifest = (0, import_visitors_core28.visit)(enumStructVariantType.struct, self);
|
|
1972
2508
|
parentName = currentParentName;
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
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,
|
|
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,
|
|
1987
|
-
(0,
|
|
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,
|
|
2537
|
+
const structManifest = (0, import_visitors_core28.visit)(struct, self);
|
|
1994
2538
|
parentName = currentParentName;
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
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,
|
|
2557
|
+
const enumSize = (0, import_nodes27.resolveNestedTypeNode)(enumType.size);
|
|
2008
2558
|
if (enumSize.format !== "u8" || enumSize.endian !== "le") {
|
|
2009
|
-
const sizeManifest = (0,
|
|
2010
|
-
|
|
2011
|
-
|
|
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,
|
|
2564
|
+
(0, import_nodes27.camelCase)(currentParentName?.strict ?? "")
|
|
2017
2565
|
);
|
|
2018
|
-
if (!(0,
|
|
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
|
|
2023
|
-
|
|
2024
|
-
|
|
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
|
-
|
|
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
|
|
2042
|
-
strictType: fragment
|
|
2043
|
-
|
|
2044
|
-
};
|
|
2589
|
+
looseType: fragment`{ ${variantNames.join(", ")} }`,
|
|
2590
|
+
strictType: fragment`{ ${variantNames.join(", ")} }`
|
|
2591
|
+
});
|
|
2045
2592
|
}
|
|
2046
|
-
const mergedManifest =
|
|
2047
|
-
enumType.variants.map((variant) => (0,
|
|
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
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
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,
|
|
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
|
-
|
|
2067
|
-
|
|
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
|
-
|
|
2072
|
-
|
|
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
|
-
|
|
2075
|
-
|
|
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,
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
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,
|
|
2085
|
-
const prefixes = node.prefix.map((c) => (0,
|
|
2086
|
-
const prefixEncoders =
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
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,
|
|
2094
|
-
const suffixes = node.suffix.map((c) => (0,
|
|
2095
|
-
const suffixEncoders =
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
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,
|
|
2109
|
-
const manifest = link ? (0,
|
|
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
|
|
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,
|
|
2120
|
-
const value = (0,
|
|
2121
|
-
const mergedManifest =
|
|
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
|
|
2127
|
-
const decoderOptions = sizeManifest.decoder
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
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,
|
|
2134
|
-
return
|
|
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
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
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
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
2749
|
+
const optionPrefix = (0, import_nodes27.resolveNestedTypeNode)(optionType.prefix);
|
|
2176
2750
|
if (optionPrefix.format !== "u8" || optionPrefix.endian !== "le") {
|
|
2177
|
-
const prefixManifest = (0,
|
|
2178
|
-
|
|
2179
|
-
|
|
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
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
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,
|
|
2776
|
+
const manifest = (0, import_visitors_core28.visit)(node.type, self);
|
|
2195
2777
|
if (node.strategy === "padded") {
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
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
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
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,
|
|
2802
|
+
const manifest = (0, import_visitors_core28.visit)(node.type, self);
|
|
2217
2803
|
if (node.strategy === "padded") {
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
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
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
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
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
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
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2834
|
+
return typeManifest({
|
|
2835
|
+
value: fragment`${use("address", "solanaAddresses")}("${node.publicKey}")`
|
|
2836
|
+
});
|
|
2250
2837
|
},
|
|
2251
2838
|
visitRemainderOptionType(node, { self }) {
|
|
2252
|
-
const childManifest = (0,
|
|
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
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
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,
|
|
2265
|
-
const sentinel = (0,
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
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,
|
|
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
|
|
2276
|
-
const decoderOptions = sizeManifest.decoder
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
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
|
|
2283
|
-
node.items.map((v) => (0,
|
|
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,
|
|
2289
|
-
const prefix = (0,
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
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,
|
|
2296
|
-
|
|
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:
|
|
2301
|
-
encoder:
|
|
2302
|
-
looseType:
|
|
2303
|
-
strictType:
|
|
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
|
|
2308
|
-
|
|
2309
|
-
|
|
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
|
|
2328
|
-
encoder: fragment
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
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
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2928
|
+
return typeManifest({
|
|
2929
|
+
value: fragment`${JSON.stringify(node.string)}`
|
|
2930
|
+
});
|
|
2339
2931
|
},
|
|
2340
2932
|
visitStructFieldType(structFieldType, { self }) {
|
|
2341
|
-
const name = (0,
|
|
2342
|
-
const
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
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
|
-
|
|
2356
|
-
|
|
2948
|
+
return typeManifest({
|
|
2949
|
+
...childManifest,
|
|
2950
|
+
looseType: fragment`${docs}${name}?: ${originalChildManifest.looseType}; `
|
|
2951
|
+
});
|
|
2357
2952
|
}
|
|
2358
|
-
childManifest
|
|
2359
|
-
return childManifest;
|
|
2953
|
+
return typeManifest({ ...childManifest, looseType: fragment`` });
|
|
2360
2954
|
},
|
|
2361
2955
|
visitStructFieldValue(node, { self }) {
|
|
2362
|
-
const
|
|
2363
|
-
|
|
2364
|
-
|
|
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 =
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2372
|
-
|
|
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,
|
|
2382
|
-
const accountNode = (0,
|
|
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,
|
|
2386
|
-
const defaultValues =
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
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
|
|
2402
|
-
node.fields.map((field) => (0,
|
|
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,
|
|
2408
|
-
const mergedManifest =
|
|
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
|
-
|
|
2413
|
-
|
|
2414
|
-
|
|
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
|
|
2418
|
-
node.items.map((v) => (0,
|
|
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,
|
|
2424
|
-
|
|
2425
|
-
|
|
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,
|
|
2430
|
-
|
|
2431
|
-
|
|
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
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
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,
|
|
3057
|
+
(visitor) => (0, import_visitors_core28.recordNodeStackVisitor)(visitor, stack)
|
|
2446
3058
|
);
|
|
2447
3059
|
}
|
|
2448
3060
|
function getArrayLikeSizeOption(count, visitor) {
|
|
2449
|
-
if ((0,
|
|
3061
|
+
if ((0, import_nodes27.isNode)(count, "fixedCountNode")) {
|
|
2450
3062
|
return {
|
|
2451
|
-
decoder: fragment
|
|
2452
|
-
encoder: fragment
|
|
3063
|
+
decoder: fragment`size: ${count.value}`,
|
|
3064
|
+
encoder: fragment`size: ${count.value}`
|
|
2453
3065
|
};
|
|
2454
3066
|
}
|
|
2455
|
-
if ((0,
|
|
3067
|
+
if ((0, import_nodes27.isNode)(count, "remainderCountNode")) {
|
|
2456
3068
|
return {
|
|
2457
|
-
decoder: fragment
|
|
2458
|
-
encoder: fragment
|
|
3069
|
+
decoder: fragment`size: 'remainder'`,
|
|
3070
|
+
encoder: fragment`size: 'remainder'`
|
|
2459
3071
|
};
|
|
2460
3072
|
}
|
|
2461
|
-
const prefix = (0,
|
|
3073
|
+
const prefix = (0, import_nodes27.resolveNestedTypeNode)(count.prefix);
|
|
2462
3074
|
if (prefix.format === "u32" && prefix.endian === "le") {
|
|
2463
|
-
return { decoder:
|
|
3075
|
+
return { decoder: void 0, encoder: void 0 };
|
|
2464
3076
|
}
|
|
2465
|
-
const prefixManifest = (0,
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
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
|
|
2538
|
-
const stack = new
|
|
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
|
|
2553
|
-
|
|
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
|
-
|
|
3094
|
+
dependencyMap: options.dependencyMap ?? {},
|
|
3095
|
+
getImportFrom: getImportFromFactory(options.linkOverrides ?? {}, customAccountData, customInstructionData),
|
|
2569
3096
|
linkables,
|
|
2570
|
-
nameApi,
|
|
2571
|
-
nonScalarEnums,
|
|
2572
|
-
renderParentInstructions,
|
|
2573
|
-
|
|
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
|
|
2576
|
-
|
|
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,
|
|
2579
|
-
(0,
|
|
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,
|
|
3118
|
+
(v) => (0, import_visitors_core29.extendVisitor)(v, {
|
|
2583
3119
|
visitAccount(node) {
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
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
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
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
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
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
|
-
|
|
2723
|
-
|
|
2724
|
-
|
|
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 = { ...
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
)
|
|
2753
|
-
|
|
2754
|
-
|
|
2755
|
-
|
|
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,
|
|
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,
|
|
2778
|
-
const accountsToExport = (0,
|
|
2779
|
-
const instructionsToExport = (0,
|
|
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,
|
|
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
|
|
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
|
-
|
|
2795
|
-
|
|
2796
|
-
|
|
2797
|
-
"
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2803
|
-
|
|
2804
|
-
|
|
2805
|
-
|
|
2806
|
-
|
|
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,
|
|
2838
|
-
(v) => (0,
|
|
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
|
|
2861
|
-
var
|
|
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,
|
|
3235
|
+
return (0, import_visitors_core30.rootNodeVisitor)(async (root) => {
|
|
2878
3236
|
if (options.deleteFolderBeforeRendering ?? true) {
|
|
2879
|
-
(0,
|
|
3237
|
+
(0, import_renderers_core14.deleteDirectory)(path);
|
|
2880
3238
|
}
|
|
2881
|
-
|
|
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
|
|
3242
|
+
renderMap = await (0, import_renderers_core14.mapRenderMapContentAsync)(renderMap, (code) => (0, import_standalone.format)(code, prettierOptions));
|
|
2885
3243
|
}
|
|
2886
|
-
|
|
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
|
-
|
|
3250
|
+
addToImportMap,
|
|
3251
|
+
createImportMap,
|
|
2893
3252
|
getNameApi,
|
|
2894
3253
|
getRenderMapVisitor,
|
|
2895
3254
|
getTypeManifestVisitor,
|
|
2896
|
-
|
|
3255
|
+
importMapToString,
|
|
3256
|
+
mergeImportMaps,
|
|
3257
|
+
mergeTypeManifests,
|
|
3258
|
+
parseImportInput,
|
|
3259
|
+
removeFromImportMap,
|
|
2897
3260
|
renderVisitor,
|
|
2898
3261
|
typeManifest
|
|
2899
3262
|
});
|