@codama/renderers-rust 1.2.7 → 1.2.8
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/dist/index.node.cjs
CHANGED
|
@@ -981,9 +981,8 @@ function getRenderMapVisitor(options = {}) {
|
|
|
981
981
|
if (hasVariableSeeds) {
|
|
982
982
|
imports.mergeWith(seedsImports);
|
|
983
983
|
}
|
|
984
|
-
return (0, import_renderers_core.createRenderMap)(
|
|
985
|
-
|
|
986
|
-
render("accountsPage.njk", {
|
|
984
|
+
return (0, import_renderers_core.createRenderMap)(`accounts/${(0, import_nodes6.snakeCase)(node.name)}.rs`, {
|
|
985
|
+
content: render("accountsPage.njk", {
|
|
987
986
|
account: node,
|
|
988
987
|
anchorTraits,
|
|
989
988
|
constantSeeds,
|
|
@@ -995,19 +994,18 @@ function getRenderMapVisitor(options = {}) {
|
|
|
995
994
|
seeds,
|
|
996
995
|
typeManifest
|
|
997
996
|
})
|
|
998
|
-
);
|
|
997
|
+
});
|
|
999
998
|
},
|
|
1000
999
|
visitDefinedType(node) {
|
|
1001
1000
|
const typeManifest = (0, import_visitors_core4.visit)(node, typeManifestVisitor);
|
|
1002
1001
|
const imports = new ImportMap().mergeWithManifest(typeManifest);
|
|
1003
|
-
return (0, import_renderers_core.createRenderMap)(
|
|
1004
|
-
|
|
1005
|
-
render("definedTypesPage.njk", {
|
|
1002
|
+
return (0, import_renderers_core.createRenderMap)(`types/${(0, import_nodes6.snakeCase)(node.name)}.rs`, {
|
|
1003
|
+
content: render("definedTypesPage.njk", {
|
|
1006
1004
|
definedType: node,
|
|
1007
1005
|
imports: imports.remove(`generatedTypes::${(0, import_nodes6.pascalCase)(node.name)}`).toString(dependencyMap),
|
|
1008
1006
|
typeManifest
|
|
1009
1007
|
})
|
|
1010
|
-
);
|
|
1008
|
+
});
|
|
1011
1009
|
},
|
|
1012
1010
|
visitInstruction(node) {
|
|
1013
1011
|
const imports = new ImportMap();
|
|
@@ -1068,9 +1066,8 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1068
1066
|
const typeManifest = (0, import_visitors_core4.visit)(struct, structVisitor);
|
|
1069
1067
|
const dataTraits = getTraitsFromNode2(node);
|
|
1070
1068
|
imports.mergeWith(dataTraits.imports);
|
|
1071
|
-
return (0, import_renderers_core.createRenderMap)(
|
|
1072
|
-
|
|
1073
|
-
render("instructionsPage.njk", {
|
|
1069
|
+
return (0, import_renderers_core.createRenderMap)(`instructions/${(0, import_nodes6.snakeCase)(node.name)}.rs`, {
|
|
1070
|
+
content: render("instructionsPage.njk", {
|
|
1074
1071
|
dataTraits: dataTraits.render,
|
|
1075
1072
|
discriminatorConstants: discriminatorConstants.render,
|
|
1076
1073
|
hasArgs,
|
|
@@ -1081,7 +1078,7 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1081
1078
|
program,
|
|
1082
1079
|
typeManifest
|
|
1083
1080
|
})
|
|
1084
|
-
);
|
|
1081
|
+
});
|
|
1085
1082
|
},
|
|
1086
1083
|
visitProgram(node, { self }) {
|
|
1087
1084
|
program = node;
|
|
@@ -1093,15 +1090,13 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1093
1090
|
}).map((ix) => (0, import_visitors_core4.visit)(ix, self))
|
|
1094
1091
|
]);
|
|
1095
1092
|
if (node.errors.length > 0) {
|
|
1096
|
-
renders = (0, import_renderers_core.addToRenderMap)(
|
|
1097
|
-
|
|
1098
|
-
`errors/${(0, import_nodes6.snakeCase)(node.name)}.rs`,
|
|
1099
|
-
render("errorsPage.njk", {
|
|
1093
|
+
renders = (0, import_renderers_core.addToRenderMap)(renders, `errors/${(0, import_nodes6.snakeCase)(node.name)}.rs`, {
|
|
1094
|
+
content: render("errorsPage.njk", {
|
|
1100
1095
|
errors: node.errors,
|
|
1101
1096
|
imports: new ImportMap().toString(dependencyMap),
|
|
1102
1097
|
program: node
|
|
1103
1098
|
})
|
|
1104
|
-
);
|
|
1099
|
+
});
|
|
1105
1100
|
}
|
|
1106
1101
|
program = null;
|
|
1107
1102
|
return renders;
|
|
@@ -1124,13 +1119,13 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1124
1119
|
};
|
|
1125
1120
|
return (0, import_renderers_core.mergeRenderMaps)([
|
|
1126
1121
|
(0, import_renderers_core.createRenderMap)({
|
|
1127
|
-
["accounts/mod.rs"]: accountsToExport.length > 0 ? render("accountsMod.njk", ctx) : void 0,
|
|
1128
|
-
["errors/mod.rs"]: programsToExport.length > 0 ? render("errorsMod.njk", ctx) : void 0,
|
|
1129
|
-
["instructions/mod.rs"]: instructionsToExport.length > 0 ? render("instructionsMod.njk", ctx) : void 0,
|
|
1130
|
-
["mod.rs"]: render("rootMod.njk", ctx),
|
|
1131
|
-
["programs.rs"]: programsToExport.length > 0 ? render("programsMod.njk", ctx) : void 0,
|
|
1132
|
-
["shared.rs"]: accountsToExport.length > 0 ? render("sharedPage.njk", ctx) : void 0,
|
|
1133
|
-
["types/mod.rs"]: definedTypesToExport.length > 0 ? render("definedTypesMod.njk", ctx) : void 0
|
|
1122
|
+
["accounts/mod.rs"]: accountsToExport.length > 0 ? { content: render("accountsMod.njk", ctx) } : void 0,
|
|
1123
|
+
["errors/mod.rs"]: programsToExport.length > 0 ? { content: render("errorsMod.njk", ctx) } : void 0,
|
|
1124
|
+
["instructions/mod.rs"]: instructionsToExport.length > 0 ? { content: render("instructionsMod.njk", ctx) } : void 0,
|
|
1125
|
+
["mod.rs"]: { content: render("rootMod.njk", ctx) },
|
|
1126
|
+
["programs.rs"]: programsToExport.length > 0 ? { content: render("programsMod.njk", ctx) } : void 0,
|
|
1127
|
+
["shared.rs"]: accountsToExport.length > 0 ? { content: render("sharedPage.njk", ctx) } : void 0,
|
|
1128
|
+
["types/mod.rs"]: definedTypesToExport.length > 0 ? { content: render("definedTypesMod.njk", ctx) } : void 0
|
|
1134
1129
|
}),
|
|
1135
1130
|
...(0, import_nodes6.getAllPrograms)(node).map((p) => (0, import_visitors_core4.visit)(p, self))
|
|
1136
1131
|
]);
|
package/dist/index.node.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/ImportMap.ts","../src/getRenderMapVisitor.ts","../src/getTypeManifestVisitor.ts","../src/utils/codecs.ts","../src/utils/discriminatorConstant.ts","../src/renderValueNodeVisitor.ts","../src/utils/linkOverrides.ts","../src/utils/render.ts","../src/utils/traitOptions.ts","../src/renderVisitor.ts"],"sourcesContent":["export * from './ImportMap';\nexport * from './getRenderMapVisitor';\nexport * from './getTypeManifestVisitor';\nexport * from './renderVisitor';\n\nexport { renderVisitor as default } from './renderVisitor';\n","import { TypeManifest } from './getTypeManifestVisitor';\n\nconst DEFAULT_MODULE_MAP: Record<string, string> = {\n generated: 'crate::generated',\n generatedAccounts: 'crate::generated::accounts',\n generatedErrors: 'crate::generated::errors',\n generatedInstructions: 'crate::generated::instructions',\n generatedTypes: 'crate::generated::types',\n hooked: 'crate::hooked',\n mplEssentials: 'mpl_toolbox',\n mplToolbox: 'mpl_toolbox',\n};\n\nexport class ImportMap {\n protected readonly _imports: Set<string> = new Set();\n\n protected readonly _aliases: Map<string, string> = new Map();\n\n get imports(): Set<string> {\n return this._imports;\n }\n\n get aliases(): Map<string, string> {\n return this._aliases;\n }\n\n add(imports: Set<string> | string[] | string): ImportMap {\n const newImports = typeof imports === 'string' ? [imports] : imports;\n newImports.forEach(i => this._imports.add(i));\n return this;\n }\n\n remove(imports: Set<string> | string[] | string): ImportMap {\n const importsToRemove = typeof imports === 'string' ? [imports] : imports;\n importsToRemove.forEach(i => this._imports.delete(i));\n return this;\n }\n\n mergeWith(...others: ImportMap[]): ImportMap {\n others.forEach(other => {\n this.add(other._imports);\n other._aliases.forEach((alias, importName) => this.addAlias(importName, alias));\n });\n return this;\n }\n\n mergeWithManifest(manifest: TypeManifest): ImportMap {\n return this.mergeWith(manifest.imports);\n }\n\n addAlias(importName: string, alias: string): ImportMap {\n this._aliases.set(importName, alias);\n return this;\n }\n\n isEmpty(): boolean {\n return this._imports.size === 0;\n }\n\n resolveDependencyMap(dependencies: Record<string, string>): ImportMap {\n const dependencyMap = { ...DEFAULT_MODULE_MAP, ...dependencies };\n const newImportMap = new ImportMap();\n const resolveDependency = (i: string): string => {\n const dependencyKey = Object.keys(dependencyMap).find(key => i.startsWith(`${key}::`));\n if (!dependencyKey) return i;\n const dependencyValue = dependencyMap[dependencyKey];\n return dependencyValue + i.slice(dependencyKey.length);\n };\n this._imports.forEach(i => newImportMap.add(resolveDependency(i)));\n this._aliases.forEach((alias, i) => newImportMap.addAlias(resolveDependency(i), alias));\n return newImportMap;\n }\n\n toString(dependencies: Record<string, string>): string {\n const resolvedMap = this.resolveDependencyMap(dependencies);\n const importStatements = [...resolvedMap.imports].map(i => {\n const alias = resolvedMap.aliases.get(i);\n if (alias) return `use ${i} as ${alias};`;\n return `use ${i};`;\n });\n return importStatements.join('\\n');\n }\n}\n","import { logWarn } from '@codama/errors';\nimport {\n getAllAccounts,\n getAllDefinedTypes,\n getAllInstructionsWithSubs,\n getAllPrograms,\n InstructionNode,\n isNode,\n isNodeFilter,\n pascalCase,\n ProgramNode,\n resolveNestedTypeNode,\n snakeCase,\n structTypeNodeFromInstructionArgumentNodes,\n VALUE_NODES,\n} from '@codama/nodes';\nimport { addToRenderMap, createRenderMap, mergeRenderMaps } from '@codama/renderers-core';\nimport {\n extendVisitor,\n LinkableDictionary,\n NodeStack,\n pipe,\n recordLinkablesOnFirstVisitVisitor,\n recordNodeStackVisitor,\n staticVisitor,\n visit,\n} from '@codama/visitors-core';\n\nimport { getTypeManifestVisitor } from './getTypeManifestVisitor';\nimport { ImportMap } from './ImportMap';\nimport { renderValueNode } from './renderValueNodeVisitor';\nimport {\n getDiscriminatorConstants,\n getImportFromFactory,\n getTraitsFromNodeFactory,\n LinkOverrides,\n render,\n TraitOptions,\n} from './utils';\n\nexport type GetRenderMapOptions = {\n anchorTraits?: boolean;\n defaultTraitOverrides?: string[];\n dependencyMap?: Record<string, string>;\n linkOverrides?: LinkOverrides;\n renderParentInstructions?: boolean;\n traitOptions?: TraitOptions;\n};\n\nexport function getRenderMapVisitor(options: GetRenderMapOptions = {}) {\n const linkables = new LinkableDictionary();\n const stack = new NodeStack();\n let program: ProgramNode | null = null;\n\n const renderParentInstructions = options.renderParentInstructions ?? false;\n const dependencyMap = options.dependencyMap ?? {};\n const getImportFrom = getImportFromFactory(options.linkOverrides ?? {});\n const getTraitsFromNode = getTraitsFromNodeFactory(options.traitOptions);\n const typeManifestVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n traitOptions: options.traitOptions,\n });\n const anchorTraits = options.anchorTraits ?? true;\n\n return pipe(\n staticVisitor(() => createRenderMap(), {\n keys: ['rootNode', 'programNode', 'instructionNode', 'accountNode', 'definedTypeNode'],\n }),\n v =>\n extendVisitor(v, {\n visitAccount(node) {\n const typeManifest = visit(node, typeManifestVisitor);\n\n // Discriminator constants.\n const fields = resolveNestedTypeNode(node.data).fields;\n const discriminatorConstants = getDiscriminatorConstants({\n discriminatorNodes: node.discriminators ?? [],\n fields,\n getImportFrom,\n prefix: node.name,\n typeManifestVisitor,\n });\n\n // Seeds.\n const seedsImports = new ImportMap();\n const pda = node.pda ? linkables.get([...stack.getPath(), node.pda]) : undefined;\n const pdaSeeds = pda?.seeds ?? [];\n const seeds = pdaSeeds.map(seed => {\n if (isNode(seed, 'variablePdaSeedNode')) {\n const seedManifest = visit(seed.type, typeManifestVisitor);\n seedsImports.mergeWith(seedManifest.imports);\n const resolvedType = resolveNestedTypeNode(seed.type);\n return { ...seed, resolvedType, typeManifest: seedManifest };\n }\n if (isNode(seed.value, 'programIdValueNode')) {\n return seed;\n }\n const seedManifest = visit(seed.type, typeManifestVisitor);\n const valueManifest = renderValueNode(seed.value, getImportFrom, true);\n seedsImports.mergeWith(valueManifest.imports);\n const resolvedType = resolveNestedTypeNode(seed.type);\n return { ...seed, resolvedType, typeManifest: seedManifest, valueManifest };\n });\n const hasVariableSeeds = pdaSeeds.filter(isNodeFilter('variablePdaSeedNode')).length > 0;\n const constantSeeds = seeds\n .filter(isNodeFilter('constantPdaSeedNode'))\n .filter(seed => !isNode(seed.value, 'programIdValueNode'));\n\n const { imports } = typeManifest;\n\n if (hasVariableSeeds) {\n imports.mergeWith(seedsImports);\n }\n\n return createRenderMap(\n `accounts/${snakeCase(node.name)}.rs`,\n render('accountsPage.njk', {\n account: node,\n anchorTraits,\n constantSeeds,\n discriminatorConstants: discriminatorConstants.render,\n hasVariableSeeds,\n imports: imports\n .mergeWith(discriminatorConstants.imports)\n .remove(`generatedAccounts::${pascalCase(node.name)}`)\n .toString(dependencyMap),\n pda,\n program,\n seeds,\n typeManifest,\n }),\n );\n },\n\n visitDefinedType(node) {\n const typeManifest = visit(node, typeManifestVisitor);\n const imports = new ImportMap().mergeWithManifest(typeManifest);\n\n return createRenderMap(\n `types/${snakeCase(node.name)}.rs`,\n render('definedTypesPage.njk', {\n definedType: node,\n imports: imports.remove(`generatedTypes::${pascalCase(node.name)}`).toString(dependencyMap),\n typeManifest,\n }),\n );\n },\n\n visitInstruction(node) {\n // Imports.\n const imports = new ImportMap();\n\n // canMergeAccountsAndArgs\n const accountsAndArgsConflicts = getConflictsForInstructionAccountsAndArgs(node);\n if (accountsAndArgsConflicts.length > 0) {\n logWarn(\n `[Rust] Accounts and args of instruction [${node.name}] have the following ` +\n `conflicting attributes [${accountsAndArgsConflicts.join(', ')}]. ` +\n `Thus, the conflicting arguments will be suffixed with \"_arg\". ` +\n 'You may want to rename the conflicting attributes.',\n );\n }\n\n // Discriminator constants.\n const discriminatorConstants = getDiscriminatorConstants({\n discriminatorNodes: node.discriminators ?? [],\n fields: node.arguments,\n getImportFrom,\n prefix: node.name,\n typeManifestVisitor,\n });\n\n // Instruction args.\n const instructionArgs: {\n default: boolean;\n innerOptionType: string | null;\n name: string;\n optional: boolean;\n type: string;\n value: string | null;\n }[] = [];\n let hasArgs = false;\n let hasOptional = false;\n\n node.arguments.forEach(argument => {\n const argumentVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n nestedStruct: true,\n parentName: `${pascalCase(node.name)}InstructionData`,\n });\n const manifest = visit(argument.type, argumentVisitor);\n imports.mergeWith(manifest.imports);\n const innerOptionType = isNode(argument.type, 'optionTypeNode')\n ? manifest.type.slice('Option<'.length, -1)\n : null;\n\n const hasDefaultValue = !!argument.defaultValue && isNode(argument.defaultValue, VALUE_NODES);\n let renderValue: string | null = null;\n if (hasDefaultValue) {\n const { imports: argImports, render: value } = renderValueNode(\n argument.defaultValue,\n getImportFrom,\n );\n imports.mergeWith(argImports);\n renderValue = value;\n }\n\n hasArgs = hasArgs || argument.defaultValueStrategy !== 'omitted';\n hasOptional = hasOptional || (hasDefaultValue && argument.defaultValueStrategy !== 'omitted');\n\n const name = accountsAndArgsConflicts.includes(argument.name)\n ? `${argument.name}_arg`\n : argument.name;\n\n instructionArgs.push({\n default: hasDefaultValue && argument.defaultValueStrategy === 'omitted',\n innerOptionType,\n name,\n optional: hasDefaultValue && argument.defaultValueStrategy !== 'omitted',\n type: manifest.type,\n value: renderValue,\n });\n });\n\n const struct = structTypeNodeFromInstructionArgumentNodes(node.arguments);\n const structVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n parentName: `${pascalCase(node.name)}InstructionData`,\n });\n const typeManifest = visit(struct, structVisitor);\n\n const dataTraits = getTraitsFromNode(node);\n imports.mergeWith(dataTraits.imports);\n\n return createRenderMap(\n `instructions/${snakeCase(node.name)}.rs`,\n render('instructionsPage.njk', {\n dataTraits: dataTraits.render,\n discriminatorConstants: discriminatorConstants.render,\n hasArgs,\n hasOptional,\n imports: imports\n .mergeWith(discriminatorConstants.imports)\n .remove(`generatedInstructions::${pascalCase(node.name)}`)\n .toString(dependencyMap),\n instruction: node,\n instructionArgs,\n program,\n typeManifest,\n }),\n );\n },\n\n visitProgram(node, { self }) {\n program = node;\n let renders = mergeRenderMaps([\n ...node.accounts.map(account => visit(account, self)),\n ...node.definedTypes.map(type => visit(type, self)),\n ...getAllInstructionsWithSubs(node, {\n leavesOnly: !renderParentInstructions,\n }).map(ix => visit(ix, self)),\n ]);\n\n // Errors.\n if (node.errors.length > 0) {\n renders = addToRenderMap(\n renders,\n `errors/${snakeCase(node.name)}.rs`,\n render('errorsPage.njk', {\n errors: node.errors,\n imports: new ImportMap().toString(dependencyMap),\n program: node,\n }),\n );\n }\n\n program = null;\n return renders;\n },\n\n visitRoot(node, { self }) {\n const programsToExport = getAllPrograms(node);\n const accountsToExport = getAllAccounts(node);\n const instructionsToExport = getAllInstructionsWithSubs(node, {\n leavesOnly: !renderParentInstructions,\n });\n const definedTypesToExport = getAllDefinedTypes(node);\n const hasAnythingToExport =\n programsToExport.length > 0 ||\n accountsToExport.length > 0 ||\n instructionsToExport.length > 0 ||\n definedTypesToExport.length > 0;\n\n const ctx = {\n accountsToExport,\n definedTypesToExport,\n hasAnythingToExport,\n instructionsToExport,\n programsToExport,\n root: node,\n };\n\n return mergeRenderMaps([\n createRenderMap({\n ['accounts/mod.rs']:\n accountsToExport.length > 0 ? render('accountsMod.njk', ctx) : undefined,\n ['errors/mod.rs']: programsToExport.length > 0 ? render('errorsMod.njk', ctx) : undefined,\n ['instructions/mod.rs']:\n instructionsToExport.length > 0 ? render('instructionsMod.njk', ctx) : undefined,\n ['mod.rs']: render('rootMod.njk', ctx),\n ['programs.rs']: programsToExport.length > 0 ? render('programsMod.njk', ctx) : undefined,\n ['shared.rs']: accountsToExport.length > 0 ? render('sharedPage.njk', ctx) : undefined,\n ['types/mod.rs']:\n definedTypesToExport.length > 0 ? render('definedTypesMod.njk', ctx) : undefined,\n }),\n ...getAllPrograms(node).map(p => visit(p, self)),\n ]);\n },\n }),\n v => recordNodeStackVisitor(v, stack),\n v => recordLinkablesOnFirstVisitVisitor(v, linkables),\n );\n}\n\nfunction getConflictsForInstructionAccountsAndArgs(instruction: InstructionNode): string[] {\n const allNames = [\n ...instruction.accounts.map(account => account.name),\n ...instruction.arguments.map(argument => argument.name),\n ];\n const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);\n return [...new Set(duplicates)];\n}\n","import { CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, CodamaError } from '@codama/errors';\nimport {\n AccountNode,\n arrayTypeNode,\n CountNode,\n DefinedTypeNode,\n definedTypeNode,\n fixedCountNode,\n InstructionNode,\n isNode,\n NumberTypeNode,\n numberTypeNode,\n parseDocs,\n pascalCase,\n prefixedCountNode,\n REGISTERED_TYPE_NODE_KINDS,\n remainderCountNode,\n resolveNestedTypeNode,\n snakeCase,\n} from '@codama/nodes';\nimport { extendVisitor, mergeVisitor, pipe, visit } from '@codama/visitors-core';\n\nimport { ImportMap } from './ImportMap';\nimport {\n GetImportFromFunction,\n getSerdeFieldAttribute,\n GetTraitsFromNodeFunction,\n rustDocblock,\n TraitOptions,\n} from './utils';\n\nexport type TypeManifest = {\n imports: ImportMap;\n nestedStructs: string[];\n type: string;\n};\n\nexport function getTypeManifestVisitor(options: {\n getImportFrom: GetImportFromFunction;\n getTraitsFromNode: GetTraitsFromNodeFunction;\n nestedStruct?: boolean;\n parentName?: string | null;\n traitOptions?: TraitOptions;\n}) {\n const { getImportFrom, getTraitsFromNode, traitOptions } = options;\n let parentName: string | null = options.parentName ?? null;\n let nestedStruct: boolean = options.nestedStruct ?? false;\n let inlineStruct: boolean = false;\n let parentSize: NumberTypeNode | number | null = null;\n let parentNode: AccountNode | DefinedTypeNode | InstructionNode | null = null;\n\n return pipe(\n mergeVisitor(\n (): TypeManifest => ({ imports: new ImportMap(), nestedStructs: [], type: '' }),\n (_, values) => ({\n ...mergeManifests(values),\n type: values.map(v => v.type).join('\\n'),\n }),\n { keys: [...REGISTERED_TYPE_NODE_KINDS, 'definedTypeLinkNode', 'definedTypeNode', 'accountNode'] },\n ),\n v =>\n extendVisitor(v, {\n visitAccount(account, { self }) {\n parentName = pascalCase(account.name);\n parentNode = account;\n const manifest = visit(account.data, self);\n const traits = getTraitsFromNode(account);\n manifest.imports.mergeWith(traits.imports);\n parentName = null;\n parentNode = null;\n return {\n ...manifest,\n type: traits.render + manifest.type,\n };\n },\n\n visitArrayType(arrayType, { self }) {\n const childManifest = visit(arrayType.item, self);\n\n if (isNode(arrayType.count, 'fixedCountNode')) {\n return {\n ...childManifest,\n type: `[${childManifest.type}; ${arrayType.count.value}]`,\n };\n }\n\n if (isNode(arrayType.count, 'remainderCountNode')) {\n childManifest.imports.add('kaigan::types::RemainderVec');\n return {\n ...childManifest,\n type: `RemainderVec<${childManifest.type}>`,\n };\n }\n\n const prefix = resolveNestedTypeNode(arrayType.count.prefix);\n if (prefix.endian === 'le') {\n switch (prefix.format) {\n case 'u32':\n return {\n ...childManifest,\n type: `Vec<${childManifest.type}>`,\n };\n case 'u8':\n case 'u16':\n case 'u64': {\n const prefixFormat = prefix.format.toUpperCase();\n childManifest.imports.add(`kaigan::types::${prefixFormat}PrefixVec`);\n return {\n ...childManifest,\n type: `${prefixFormat}PrefixVec<${childManifest.type}>`,\n };\n }\n case 'shortU16': {\n childManifest.imports.add('solana_short_vec::ShortVec');\n return {\n ...childManifest,\n type: `ShortVec<${childManifest.type}>`,\n };\n }\n default:\n throw new Error(`Array prefix not supported: ${prefix.format}`);\n }\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Array size not supported by Borsh');\n },\n\n visitBooleanType(booleanType) {\n const resolvedSize = resolveNestedTypeNode(booleanType.size);\n if (resolvedSize.format === 'u8' && resolvedSize.endian === 'le') {\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: 'bool',\n };\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Bool size not supported by Borsh');\n },\n\n visitBytesType(_bytesType, { self }) {\n let arraySize: CountNode = remainderCountNode();\n if (typeof parentSize === 'number') {\n arraySize = fixedCountNode(parentSize);\n } else if (parentSize && typeof parentSize === 'object') {\n arraySize = prefixedCountNode(parentSize);\n }\n const arrayType = arrayTypeNode(numberTypeNode('u8'), arraySize);\n return visit(arrayType, self);\n },\n\n visitDefinedType(definedType, { self }) {\n parentName = pascalCase(definedType.name);\n parentNode = definedType;\n const manifest = visit(definedType.type, self);\n const traits = getTraitsFromNode(definedType);\n manifest.imports.mergeWith(traits.imports);\n parentName = null;\n parentNode = null;\n\n const renderedType = isNode(definedType.type, ['enumTypeNode', 'structTypeNode'])\n ? manifest.type\n : `pub type ${pascalCase(definedType.name)} = ${manifest.type};`;\n\n return { ...manifest, type: `${traits.render}${renderedType}` };\n },\n\n visitDefinedTypeLink(node) {\n const pascalCaseDefinedType = pascalCase(node.name);\n const importFrom = getImportFrom(node);\n return {\n imports: new ImportMap().add(`${importFrom}::${pascalCaseDefinedType}`),\n nestedStructs: [],\n type: pascalCaseDefinedType,\n };\n },\n\n visitEnumEmptyVariantType(enumEmptyVariantType) {\n const name = pascalCase(enumEmptyVariantType.name);\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: `${name},`,\n };\n },\n\n visitEnumStructVariantType(enumStructVariantType, { self }) {\n const name = pascalCase(enumStructVariantType.name);\n const originalParentName = parentName;\n\n if (!originalParentName) {\n throw new Error('Enum struct variant type must have a parent name.');\n }\n\n inlineStruct = true;\n parentName = pascalCase(originalParentName) + name;\n const typeManifest = visit(enumStructVariantType.struct, self);\n inlineStruct = false;\n parentName = originalParentName;\n\n return {\n ...typeManifest,\n type: `${name} ${typeManifest.type},`,\n };\n },\n\n visitEnumTupleVariantType(enumTupleVariantType, { self }) {\n const name = pascalCase(enumTupleVariantType.name);\n const originalParentName = parentName;\n\n if (!originalParentName) {\n throw new Error('Enum struct variant type must have a parent name.');\n }\n\n parentName = pascalCase(originalParentName) + name;\n const childManifest = visit(enumTupleVariantType.tuple, self);\n parentName = originalParentName;\n\n let derive = '';\n if (parentNode && childManifest.type === '(Pubkey)') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::DisplayFromStr>',\n parentNode,\n traitOptions,\n );\n } else if (parentNode && childManifest.type === '(Vec<Pubkey>)') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<Vec<serde_with::DisplayFromStr>>',\n parentNode,\n traitOptions,\n );\n }\n\n return {\n ...childManifest,\n type: `${derive}${name}${childManifest.type},`,\n };\n },\n\n visitEnumType(enumType, { self }) {\n const originalParentName = parentName;\n if (!originalParentName) {\n // TODO: Add to the Rust validator.\n throw new Error('Enum type must have a parent name.');\n }\n\n const variants = enumType.variants.map(variant => visit(variant, self));\n const variantNames = variants.map(variant => variant.type).join('\\n');\n const mergedManifest = mergeManifests(variants);\n\n return {\n ...mergedManifest,\n type: `pub enum ${pascalCase(originalParentName)} {\\n${variantNames}\\n}`,\n };\n },\n\n visitFixedSizeType(fixedSizeType, { self }) {\n parentSize = fixedSizeType.size;\n const manifest = visit(fixedSizeType.type, self);\n parentSize = null;\n return manifest;\n },\n\n visitMapType(mapType, { self }) {\n const key = visit(mapType.key, self);\n const value = visit(mapType.value, self);\n const mergedManifest = mergeManifests([key, value]);\n mergedManifest.imports.add('std::collections::HashMap');\n return {\n ...mergedManifest,\n type: `HashMap<${key.type}, ${value.type}>`,\n };\n },\n\n visitNumberType(numberType) {\n if (numberType.endian !== 'le') {\n // TODO: Add to the Rust validator.\n throw new Error('Number endianness not supported by Borsh');\n }\n\n if (numberType.format === 'shortU16') {\n return {\n imports: new ImportMap().add('solana_short_vec::ShortU16'),\n nestedStructs: [],\n type: 'ShortU16',\n };\n }\n\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: numberType.format,\n };\n },\n\n visitOptionType(optionType, { self }) {\n const childManifest = visit(optionType.item, self);\n\n const optionPrefix = resolveNestedTypeNode(optionType.prefix);\n if (optionPrefix.format === 'u8' && optionPrefix.endian === 'le') {\n return {\n ...childManifest,\n type: `Option<${childManifest.type}>`,\n };\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Option size not supported by Borsh');\n },\n\n visitPublicKeyType() {\n return {\n imports: new ImportMap().add('solana_pubkey::Pubkey'),\n nestedStructs: [],\n type: 'Pubkey',\n };\n },\n\n visitRemainderOptionType(node) {\n throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });\n },\n\n visitSetType(setType, { self }) {\n const childManifest = visit(setType.item, self);\n childManifest.imports.add('std::collections::HashSet');\n return {\n ...childManifest,\n type: `HashSet<${childManifest.type}>`,\n };\n },\n\n visitSizePrefixType(sizePrefixType, { self }) {\n parentSize = resolveNestedTypeNode(sizePrefixType.prefix);\n const manifest = visit(sizePrefixType.type, self);\n parentSize = null;\n return manifest;\n },\n\n visitStringType() {\n if (!parentSize) {\n return {\n imports: new ImportMap().add(`kaigan::types::RemainderStr`),\n nestedStructs: [],\n type: `RemainderStr`,\n };\n }\n\n if (typeof parentSize === 'number') {\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: `[u8; ${parentSize}]`,\n };\n }\n\n if (isNode(parentSize, 'numberTypeNode') && parentSize.endian === 'le') {\n switch (parentSize.format) {\n case 'u32':\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: 'String',\n };\n case 'u8':\n case 'u16':\n case 'u64': {\n const prefix = parentSize.format.toUpperCase();\n return {\n imports: new ImportMap().add(`kaigan::types::${prefix}PrefixString`),\n nestedStructs: [],\n type: `${prefix}PrefixString`,\n };\n }\n default:\n throw new Error(`'String size not supported: ${parentSize.format}`);\n }\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('String size not supported by Borsh');\n },\n\n visitStructFieldType(structFieldType, { self }) {\n const originalParentName = parentName;\n const originalInlineStruct = inlineStruct;\n const originalNestedStruct = nestedStruct;\n\n if (!originalParentName) {\n throw new Error('Struct field type must have a parent name.');\n }\n\n parentName = pascalCase(originalParentName) + pascalCase(structFieldType.name);\n nestedStruct = true;\n inlineStruct = false;\n\n const fieldManifest = visit(structFieldType.type, self);\n\n parentName = originalParentName;\n inlineStruct = originalInlineStruct;\n nestedStruct = originalNestedStruct;\n\n const fieldName = snakeCase(structFieldType.name);\n const docblock = rustDocblock(parseDocs(structFieldType.docs));\n const resolvedNestedType = resolveNestedTypeNode(structFieldType.type);\n\n let derive = '';\n if (parentNode) {\n if (fieldManifest.type === 'Pubkey') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::DisplayFromStr>',\n parentNode,\n traitOptions,\n );\n } else if (fieldManifest.type === 'Vec<Pubkey>') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<Vec<serde_with::DisplayFromStr>>',\n parentNode,\n traitOptions,\n );\n } else if (\n isNode(resolvedNestedType, 'arrayTypeNode') &&\n isNode(resolvedNestedType.count, 'fixedCountNode') &&\n resolvedNestedType.count.value > 32\n ) {\n derive = getSerdeFieldAttribute('serde_big_array::BigArray', parentNode, traitOptions);\n } else if (\n isNode(resolvedNestedType, ['bytesTypeNode', 'stringTypeNode']) &&\n isNode(structFieldType.type, 'fixedSizeTypeNode') &&\n structFieldType.type.size > 32\n ) {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::Bytes>',\n parentNode,\n traitOptions,\n );\n }\n }\n\n return {\n ...fieldManifest,\n type: inlineStruct\n ? `${docblock}${derive}${fieldName}: ${fieldManifest.type},`\n : `${docblock}${derive}pub ${fieldName}: ${fieldManifest.type},`,\n };\n },\n\n visitStructType(structType, { self }) {\n const originalParentName = parentName;\n\n if (!originalParentName) {\n // TODO: Add to the Rust validator.\n throw new Error('Struct type must have a parent name.');\n }\n\n const fields = structType.fields.map(field => visit(field, self));\n const fieldTypes = fields.map(field => field.type).join('\\n');\n const mergedManifest = mergeManifests(fields);\n\n if (nestedStruct) {\n const nestedTraits = getTraitsFromNode(\n definedTypeNode({ name: originalParentName, type: structType }),\n );\n mergedManifest.imports.mergeWith(nestedTraits.imports);\n return {\n ...mergedManifest,\n nestedStructs: [\n ...mergedManifest.nestedStructs,\n `${nestedTraits.render}pub struct ${pascalCase(originalParentName)} {\\n${fieldTypes}\\n}`,\n ],\n type: pascalCase(originalParentName),\n };\n }\n\n if (inlineStruct) {\n return { ...mergedManifest, type: `{\\n${fieldTypes}\\n}` };\n }\n\n return {\n ...mergedManifest,\n type: `pub struct ${pascalCase(originalParentName)} {\\n${fieldTypes}\\n}`,\n };\n },\n\n visitTupleType(tupleType, { self }) {\n const items = tupleType.items.map(item => visit(item, self));\n const mergedManifest = mergeManifests(items);\n\n return {\n ...mergedManifest,\n type: `(${items.map(item => item.type).join(', ')})`,\n };\n },\n\n visitZeroableOptionType(node) {\n throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });\n },\n }),\n );\n}\n\nfunction mergeManifests(manifests: TypeManifest[]): Pick<TypeManifest, 'imports' | 'nestedStructs'> {\n return {\n imports: new ImportMap().mergeWith(...manifests.map(td => td.imports)),\n nestedStructs: manifests.flatMap(m => m.nestedStructs),\n };\n}\n","import { BytesValueNode } from '@codama/nodes';\nimport { getBase16Encoder, getBase58Encoder, getBase64Encoder, getUtf8Encoder } from '@solana/codecs-strings';\n\nexport function getBytesFromBytesValueNode(node: BytesValueNode): Uint8Array {\n switch (node.encoding) {\n case 'utf8':\n return getUtf8Encoder().encode(node.data) as Uint8Array;\n case 'base16':\n return getBase16Encoder().encode(node.data) as Uint8Array;\n case 'base58':\n return getBase58Encoder().encode(node.data) as Uint8Array;\n case 'base64':\n default:\n return getBase64Encoder().encode(node.data) as Uint8Array;\n }\n}\n","import {\n camelCase,\n ConstantDiscriminatorNode,\n DiscriminatorNode,\n FieldDiscriminatorNode,\n InstructionArgumentNode,\n isNode,\n isNodeFilter,\n snakeCase,\n StructFieldTypeNode,\n VALUE_NODES,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\n\nimport { getTypeManifestVisitor, TypeManifest } from '../getTypeManifestVisitor';\nimport { ImportMap } from '../ImportMap';\nimport { renderValueNode } from '../renderValueNodeVisitor';\nimport { GetImportFromFunction } from './linkOverrides';\n\ntype Fragment = { imports: ImportMap; render: string };\n\nfunction mergeFragments(fragments: Fragment[], merge: (parts: string[]) => string): Fragment {\n const imports = fragments.reduce((acc, frag) => acc.mergeWith(frag.imports), new ImportMap());\n const render = merge(fragments.map(frag => frag.render));\n return { imports, render };\n}\n\nexport function getDiscriminatorConstants(scope: {\n discriminatorNodes: DiscriminatorNode[];\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n}): Fragment {\n const fragments = scope.discriminatorNodes\n .map(node => getDiscriminatorConstant(node, scope))\n .filter(Boolean) as Fragment[];\n\n return mergeFragments(fragments, r => r.join('\\n\\n'));\n}\n\nfunction getDiscriminatorConstant(\n discriminatorNode: DiscriminatorNode,\n scope: {\n discriminatorNodes: DiscriminatorNode[];\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n) {\n switch (discriminatorNode.kind) {\n case 'constantDiscriminatorNode':\n return getConstantDiscriminatorConstant(discriminatorNode, scope);\n case 'fieldDiscriminatorNode':\n return getFieldDiscriminatorConstant(discriminatorNode, scope);\n default:\n return null;\n }\n}\n\nfunction getConstantDiscriminatorConstant(\n discriminatorNode: ConstantDiscriminatorNode,\n scope: {\n discriminatorNodes: DiscriminatorNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n): Fragment {\n const { discriminatorNodes, getImportFrom, prefix, typeManifestVisitor } = scope;\n\n const index = discriminatorNodes.filter(isNodeFilter('constantDiscriminatorNode')).indexOf(discriminatorNode);\n const suffix = index <= 0 ? '' : `_${index + 1}`;\n\n const name = camelCase(`${prefix}_discriminator${suffix}`);\n const typeManifest = visit(discriminatorNode.constant.type, typeManifestVisitor);\n const value = renderValueNode(discriminatorNode.constant.value, getImportFrom);\n return getConstant(name, typeManifest, value);\n}\n\nfunction getFieldDiscriminatorConstant(\n discriminatorNode: FieldDiscriminatorNode,\n scope: {\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n): Fragment | null {\n const { fields, prefix, getImportFrom, typeManifestVisitor } = scope;\n\n const field = fields.find(f => f.name === discriminatorNode.name);\n if (!field || !field.defaultValue || !isNode(field.defaultValue, VALUE_NODES)) {\n return null;\n }\n\n const name = camelCase(`${prefix}_${discriminatorNode.name}`);\n const typeManifest = visit(field.type, typeManifestVisitor);\n const value = renderValueNode(field.defaultValue, getImportFrom);\n return getConstant(name, typeManifest, value);\n}\n\nfunction getConstant(name: string, typeManifest: TypeManifest, value: Fragment): Fragment {\n const type: Fragment = { imports: typeManifest.imports, render: typeManifest.type };\n return mergeFragments([type, value], ([t, v]) => `pub const ${snakeCase(name).toUpperCase()}: ${t} = ${v};`);\n}\n","import {\n arrayValueNode,\n bytesValueNode,\n isNode,\n numberValueNode,\n pascalCase,\n RegisteredValueNode,\n ValueNode,\n} from '@codama/nodes';\nimport { visit, Visitor } from '@codama/visitors-core';\n\nimport { ImportMap } from './ImportMap';\nimport { getBytesFromBytesValueNode, GetImportFromFunction } from './utils';\n\nexport function renderValueNode(\n value: ValueNode,\n getImportFrom: GetImportFromFunction,\n useStr: boolean = false,\n): {\n imports: ImportMap;\n render: string;\n} {\n return visit(value, renderValueNodeVisitor(getImportFrom, useStr));\n}\n\nexport function renderValueNodeVisitor(\n getImportFrom: GetImportFromFunction,\n useStr: boolean = false,\n): Visitor<\n {\n imports: ImportMap;\n render: string;\n },\n RegisteredValueNode['kind']\n> {\n return {\n visitArrayValue(node) {\n const list = node.items.map(v => visit(v, this));\n return {\n imports: new ImportMap().mergeWith(...list.map(c => c.imports)),\n render: `[${list.map(c => c.render).join(', ')}]`,\n };\n },\n visitBooleanValue(node) {\n return {\n imports: new ImportMap(),\n render: JSON.stringify(node.boolean),\n };\n },\n visitBytesValue(node) {\n const bytes = getBytesFromBytesValueNode(node);\n const numbers = Array.from(bytes).map(numberValueNode);\n return visit(arrayValueNode(numbers), this);\n },\n visitConstantValue(node) {\n if (isNode(node.value, 'bytesValueNode')) {\n return visit(node.value, this);\n }\n if (isNode(node.type, 'stringTypeNode') && isNode(node.value, 'stringValueNode')) {\n return visit(bytesValueNode(node.type.encoding, node.value.string), this);\n }\n if (isNode(node.type, 'numberTypeNode') && isNode(node.value, 'numberValueNode')) {\n const numberManifest = visit(node.value, this);\n const { format, endian } = node.type;\n const byteFunction = endian === 'le' ? 'to_le_bytes' : 'to_be_bytes';\n numberManifest.render = `${numberManifest.render}${format}.${byteFunction}()`;\n return numberManifest;\n }\n throw new Error('Unsupported constant value type.');\n },\n visitEnumValue(node) {\n const imports = new ImportMap();\n const enumName = pascalCase(node.enum.name);\n const variantName = pascalCase(node.variant);\n const importFrom = getImportFrom(node.enum);\n imports.add(`${importFrom}::${enumName}`);\n if (!node.value) {\n return { imports, render: `${enumName}::${variantName}` };\n }\n const enumValue = visit(node.value, this);\n const fields = enumValue.render;\n return {\n imports: imports.mergeWith(enumValue.imports),\n render: `${enumName}::${variantName} ${fields}`,\n };\n },\n visitMapEntryValue(node) {\n const mapKey = visit(node.key, this);\n const mapValue = visit(node.value, this);\n return {\n imports: mapKey.imports.mergeWith(mapValue.imports),\n render: `[${mapKey.render}, ${mapValue.render}]`,\n };\n },\n visitMapValue(node) {\n const map = node.entries.map(entry => visit(entry, this));\n const imports = new ImportMap().add('std::collection::HashMap');\n return {\n imports: imports.mergeWith(...map.map(c => c.imports)),\n render: `HashMap::from([${map.map(c => c.render).join(', ')}])`,\n };\n },\n visitNoneValue() {\n return {\n imports: new ImportMap(),\n render: 'None',\n };\n },\n visitNumberValue(node) {\n return {\n imports: new ImportMap(),\n render: node.number.toString(),\n };\n },\n visitPublicKeyValue(node) {\n return {\n imports: new ImportMap().add('solana_pubkey'),\n render: `pubkey!(\"${node.publicKey}\")`,\n };\n },\n visitSetValue(node) {\n const set = node.items.map(v => visit(v, this));\n const imports = new ImportMap().add('std::collection::HashSet');\n return {\n imports: imports.mergeWith(...set.map(c => c.imports)),\n render: `HashSet::from([${set.map(c => c.render).join(', ')}])`,\n };\n },\n visitSomeValue(node) {\n const child = visit(node.value, this);\n return {\n ...child,\n render: `Some(${child.render})`,\n };\n },\n visitStringValue(node) {\n return {\n imports: new ImportMap(),\n render: useStr ? `${JSON.stringify(node.string)}` : `String::from(${JSON.stringify(node.string)})`,\n };\n },\n visitStructFieldValue(node) {\n const structValue = visit(node.value, this);\n return {\n imports: structValue.imports,\n render: `${node.name}: ${structValue.render}`,\n };\n },\n visitStructValue(node) {\n const struct = node.fields.map(field => visit(field, this));\n return {\n imports: new ImportMap().mergeWith(...struct.map(c => c.imports)),\n render: `{ ${struct.map(c => c.render).join(', ')} }`,\n };\n },\n visitTupleValue(node) {\n const tuple = node.items.map(v => visit(v, this));\n return {\n imports: new ImportMap().mergeWith(...tuple.map(c => c.imports)),\n render: `(${tuple.map(c => c.render).join(', ')})`,\n };\n },\n };\n}\n","import { CODAMA_ERROR__UNEXPECTED_NODE_KIND, CodamaError } from '@codama/errors';\nimport {\n AccountLinkNode,\n DefinedTypeLinkNode,\n InstructionLinkNode,\n PdaLinkNode,\n ProgramLinkNode,\n ResolverValueNode,\n} from '@codama/nodes';\n\nexport type LinkOverrides = {\n accounts?: Record<string, string>;\n definedTypes?: Record<string, string>;\n instructions?: Record<string, string>;\n pdas?: Record<string, string>;\n programs?: Record<string, string>;\n resolvers?: Record<string, string>;\n};\n\ntype OverridableNodes =\n | AccountLinkNode\n | DefinedTypeLinkNode\n | InstructionLinkNode\n | PdaLinkNode\n | ProgramLinkNode\n | ResolverValueNode;\n\nexport type GetImportFromFunction = (node: OverridableNodes, fallback?: string) => string;\n\nexport function getImportFromFactory(overrides: LinkOverrides): GetImportFromFunction {\n const linkOverrides = {\n accounts: overrides.accounts ?? {},\n definedTypes: overrides.definedTypes ?? {},\n instructions: overrides.instructions ?? {},\n pdas: overrides.pdas ?? {},\n programs: overrides.programs ?? {},\n resolvers: overrides.resolvers ?? {},\n };\n\n return (node: OverridableNodes) => {\n const kind = node.kind;\n switch (kind) {\n case 'accountLinkNode':\n return linkOverrides.accounts[node.name] ?? 'generatedAccounts';\n case 'definedTypeLinkNode':\n return linkOverrides.definedTypes[node.name] ?? 'generatedTypes';\n case 'instructionLinkNode':\n return linkOverrides.instructions[node.name] ?? 'generatedInstructions';\n case 'pdaLinkNode':\n return linkOverrides.pdas[node.name] ?? 'generatedAccounts';\n case 'programLinkNode':\n return linkOverrides.programs[node.name] ?? 'generatedPrograms';\n case 'resolverValueNode':\n return linkOverrides.resolvers[node.name] ?? 'hooked';\n default:\n throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n expectedKinds: [\n 'AccountLinkNode',\n 'DefinedTypeLinkNode',\n 'InstructionLinkNode',\n 'PdaLinkNode',\n 'ProgramLinkNode',\n 'resolverValueNode',\n ],\n kind: kind satisfies never,\n node,\n });\n }\n };\n}\n","import { dirname as pathDirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { camelCase, kebabCase, pascalCase, snakeCase, titleCase } from '@codama/nodes';\nimport nunjucks, { ConfigureOptions as NunJucksOptions } from 'nunjucks';\n\nexport function rustDocblock(docs: string[]): string {\n if (docs.length <= 0) return '';\n const lines = docs.map(doc => `/// ${doc}`);\n return `${lines.join('\\n')}\\n`;\n}\n\nexport const render = (template: string, context?: object, options?: NunJucksOptions): string => {\n // @ts-expect-error import.meta will be used in the right environment.\n const dirname = __ESM__ ? pathDirname(fileURLToPath(import.meta.url)) : __dirname;\n const templates = __TEST__ ? join(dirname, '..', '..', 'public', 'templates') : join(dirname, 'templates'); // Path to templates from bundled output file.\n const env = nunjucks.configure(templates, { autoescape: false, trimBlocks: true, ...options });\n env.addFilter('pascalCase', pascalCase);\n env.addFilter('camelCase', camelCase);\n env.addFilter('snakeCase', snakeCase);\n env.addFilter('kebabCase', kebabCase);\n env.addFilter('titleCase', titleCase);\n env.addFilter('rustDocblock', rustDocblock);\n // Returns whether or not the provided traits are implemented on the type.\n env.addFilter('hasTrait', (traits: string, ...traitNames: string[]) => {\n if (typeof traits !== 'string') return false;\n return traitNames.some(traitName => traits.includes(traitName));\n });\n return env.render(template, context);\n};\n","import {\n AccountNode,\n assertIsNode,\n camelCase,\n DefinedTypeNode,\n InstructionNode,\n isNode,\n isScalarEnum,\n} from '@codama/nodes';\n\nimport { ImportMap } from '../ImportMap';\n\nexport type TraitOptions = {\n /** The default traits to implement for all types. */\n baseDefaults?: string[];\n /**\n * The default traits to implement for data enums only — on top of the base defaults.\n * Data enums are enums with at least one non-unit variant.\n */\n dataEnumDefaults?: string[];\n /**\n * The mapping of feature flags to traits.\n * For each entry, the traits will be rendered within a\n * `#[cfg_attr(feature = \"feature_name\", derive(Traits))]` attribute.\n */\n featureFlags?: Record<string, string[]>;\n /** The complete trait overrides of specific types. */\n overrides?: Record<string, string[]>;\n /**\n * The default traits to implement for scalar enums only — on top of the base defaults.\n * Scalar enums are enums with no variants or only unit variants.\n */\n scalarEnumDefaults?: string[];\n /** The default traits to implement for structs only — on top of the base defaults. */\n structDefaults?: string[];\n /** Whether or not to use the fully qualified name for traits, instead of importing them. */\n useFullyQualifiedName?: boolean;\n};\n\nexport const DEFAULT_TRAIT_OPTIONS: Required<TraitOptions> = {\n baseDefaults: [\n 'borsh::BorshSerialize',\n 'borsh::BorshDeserialize',\n 'serde::Serialize',\n 'serde::Deserialize',\n 'Clone',\n 'Debug',\n 'Eq',\n 'PartialEq',\n ],\n dataEnumDefaults: [],\n featureFlags: { serde: ['serde::Serialize', 'serde::Deserialize'] },\n overrides: {},\n scalarEnumDefaults: ['Copy', 'PartialOrd', 'Hash', 'num_derive::FromPrimitive'],\n structDefaults: [],\n useFullyQualifiedName: false,\n};\n\nexport type GetTraitsFromNodeFunction = (node: AccountNode | DefinedTypeNode | InstructionNode) => {\n imports: ImportMap;\n render: string;\n};\n\nexport function getTraitsFromNodeFactory(options: TraitOptions = {}): GetTraitsFromNodeFunction {\n return node => getTraitsFromNode(node, options);\n}\n\nexport function getTraitsFromNode(\n node: AccountNode | DefinedTypeNode | InstructionNode,\n userOptions: TraitOptions = {},\n): { imports: ImportMap; render: string } {\n assertIsNode(node, ['accountNode', 'definedTypeNode', 'instructionNode']);\n const options: Required<TraitOptions> = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };\n\n // Get the node type and return early if it's a type alias.\n const nodeType = getNodeType(node);\n if (nodeType === 'alias') {\n return { imports: new ImportMap(), render: '' };\n }\n\n // Find all the FQN traits for the node.\n const sanitizedOverrides = Object.fromEntries(\n Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value]),\n );\n const nodeOverrides: string[] | undefined = sanitizedOverrides[node.name];\n const allTraits = nodeOverrides === undefined ? getDefaultTraits(nodeType, options) : nodeOverrides;\n\n // Wrap the traits in feature flags if necessary.\n const partitionedTraits = partitionTraitsInFeatures(allTraits, options.featureFlags);\n let unfeaturedTraits = partitionedTraits[0];\n const featuredTraits = partitionedTraits[1];\n\n // Import the traits if necessary.\n const imports = new ImportMap();\n if (!options.useFullyQualifiedName) {\n unfeaturedTraits = extractFullyQualifiedNames(unfeaturedTraits, imports);\n }\n\n // Render the trait lines.\n const traitLines: string[] = [\n ...(unfeaturedTraits.length > 0 ? [`#[derive(${unfeaturedTraits.join(', ')})]\\n`] : []),\n ...Object.entries(featuredTraits).map(([feature, traits]) => {\n return `#[cfg_attr(feature = \"${feature}\", derive(${traits.join(', ')}))]\\n`;\n }),\n ];\n\n return { imports, render: traitLines.join('') };\n}\n\nfunction getNodeType(\n node: AccountNode | DefinedTypeNode | InstructionNode,\n): 'alias' | 'dataEnum' | 'scalarEnum' | 'struct' {\n if (isNode(node, ['accountNode', 'instructionNode'])) return 'struct';\n if (isNode(node.type, 'structTypeNode')) return 'struct';\n if (isNode(node.type, 'enumTypeNode')) {\n return isScalarEnum(node.type) ? 'scalarEnum' : 'dataEnum';\n }\n return 'alias';\n}\n\nfunction getDefaultTraits(\n nodeType: 'dataEnum' | 'scalarEnum' | 'struct',\n options: Pick<\n Required<TraitOptions>,\n 'baseDefaults' | 'dataEnumDefaults' | 'scalarEnumDefaults' | 'structDefaults'\n >,\n): string[] {\n switch (nodeType) {\n case 'dataEnum':\n return [...options.baseDefaults, ...options.dataEnumDefaults];\n case 'scalarEnum':\n return [...options.baseDefaults, ...options.scalarEnumDefaults];\n case 'struct':\n return [...options.baseDefaults, ...options.structDefaults];\n }\n}\n\nfunction partitionTraitsInFeatures(\n traits: string[],\n featureFlags: Record<string, string[]>,\n): [string[], Record<string, string[]>] {\n // Reverse the feature flags option for quick lookup.\n // If there are any duplicate traits, the first one encountered will be used.\n const reverseFeatureFlags = Object.entries(featureFlags).reduce(\n (acc, [feature, traits]) => {\n for (const trait of traits) {\n if (!acc[trait]) acc[trait] = feature;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const unfeaturedTraits: string[] = [];\n const featuredTraits: Record<string, string[]> = {};\n for (const trait of traits) {\n const feature: string | undefined = reverseFeatureFlags[trait];\n if (feature === undefined) {\n unfeaturedTraits.push(trait);\n } else {\n if (!featuredTraits[feature]) featuredTraits[feature] = [];\n featuredTraits[feature].push(trait);\n }\n }\n\n return [unfeaturedTraits, featuredTraits];\n}\n\nfunction extractFullyQualifiedNames(traits: string[], imports: ImportMap): string[] {\n return traits.map(trait => {\n const index = trait.lastIndexOf('::');\n if (index === -1) return trait;\n imports.add(trait);\n return trait.slice(index + 2);\n });\n}\n\n/**\n * Helper function to get the serde field attribute format based on trait configuration.\n * Returns the appropriate attribute string for serde field customization, or empty string if no serde traits.\n */\nexport function getSerdeFieldAttribute(\n serdeWith: string,\n node: AccountNode | DefinedTypeNode | InstructionNode,\n userOptions: TraitOptions = {},\n): string {\n assertIsNode(node, ['accountNode', 'definedTypeNode', 'instructionNode']);\n const options: Required<TraitOptions> = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };\n\n // Get the node type and return early if it's a type alias.\n const nodeType = getNodeType(node);\n if (nodeType === 'alias') {\n return '';\n }\n\n // Find all the traits for the node.\n const sanitizedOverrides = Object.fromEntries(\n Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value]),\n );\n const nodeOverrides: string[] | undefined = sanitizedOverrides[node.name];\n const allTraits = nodeOverrides === undefined ? getDefaultTraits(nodeType, options) : nodeOverrides;\n\n // Check if serde traits are present.\n const hasSerdeSerialize = allTraits.some(t => t === 'serde::Serialize' || t === 'Serialize');\n const hasSerdeDeserialize = allTraits.some(t => t === 'serde::Deserialize' || t === 'Deserialize');\n\n if (!hasSerdeSerialize && !hasSerdeDeserialize) {\n return '';\n }\n\n // Check if serde is feature-flagged.\n const partitionedTraits = partitionTraitsInFeatures(allTraits, options.featureFlags);\n const featuredTraits = partitionedTraits[1];\n\n // Find which feature flag contains serde traits.\n let serdeFeatureName: string | undefined;\n for (const [feature, traits] of Object.entries(featuredTraits)) {\n if (\n traits.some(\n t => t === 'serde::Serialize' || t === 'serde::Deserialize' || t === 'Serialize' || t === 'Deserialize',\n )\n ) {\n serdeFeatureName = feature;\n break;\n }\n }\n\n if (serdeFeatureName) {\n return `#[cfg_attr(feature = \"${serdeFeatureName}\", serde(with = \"${serdeWith}\"))]\\n`;\n } else {\n return `#[serde(with = \"${serdeWith}\")]\\n`;\n }\n}\n","import { logError, logWarn } from '@codama/errors';\nimport { deleteDirectory, writeRenderMapVisitor } from '@codama/renderers-core';\nimport { rootNodeVisitor, visit } from '@codama/visitors-core';\nimport { spawnSync } from 'child_process';\n\nimport { GetRenderMapOptions, getRenderMapVisitor } from './getRenderMapVisitor';\n\nexport type RenderOptions = GetRenderMapOptions & {\n crateFolder?: string;\n deleteFolderBeforeRendering?: boolean;\n formatCode?: boolean;\n toolchain?: string;\n};\n\nexport function renderVisitor(path: string, options: RenderOptions = {}) {\n return rootNodeVisitor(root => {\n // Delete existing generated folder.\n if (options.deleteFolderBeforeRendering ?? true) {\n deleteDirectory(path);\n }\n\n // Render the new files.\n visit(root, writeRenderMapVisitor(getRenderMapVisitor(options), path));\n\n // format the code\n if (options.formatCode) {\n if (options.crateFolder) {\n const removeFalsy = <T>(arg: T | false | null | undefined): arg is T => Boolean(arg);\n runFormatter(\n 'cargo',\n [options.toolchain, 'fmt', '--manifest-path', `${options.crateFolder}/Cargo.toml`].filter(\n removeFalsy,\n ),\n );\n } else {\n logWarn('No crate folder specified, skipping formatting.');\n }\n }\n });\n}\n\nfunction runFormatter(cmd: string, args: string[]) {\n const { stdout, stderr, error } = spawnSync(cmd, args);\n if (error?.message?.includes('ENOENT')) {\n logWarn(`Could not find ${cmd}, skipping formatting.`);\n return;\n }\n if (stdout.length > 0) {\n logWarn(`(cargo-fmt) ${stdout ? stdout?.toString() : error}`);\n }\n if (stderr.length > 0) {\n logError(`(cargo-fmt) ${stderr ? stderr.toString() : error}`);\n }\n}\n"],"mappings":"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","names":["import_errors","import_nodes","import_visitors_core","import_errors","import_nodes","import_visitors_core","import_nodes","import_visitors_core","render","import_nodes","nunjucks","import_nodes","traits","getTraitsFromNode","getTraitsFromNode","seedManifest","resolvedType","import_errors","import_renderers_core","import_visitors_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/ImportMap.ts","../src/getRenderMapVisitor.ts","../src/getTypeManifestVisitor.ts","../src/utils/codecs.ts","../src/utils/discriminatorConstant.ts","../src/renderValueNodeVisitor.ts","../src/utils/linkOverrides.ts","../src/utils/render.ts","../src/utils/traitOptions.ts","../src/renderVisitor.ts"],"sourcesContent":["export * from './ImportMap';\nexport * from './getRenderMapVisitor';\nexport * from './getTypeManifestVisitor';\nexport * from './renderVisitor';\n\nexport { renderVisitor as default } from './renderVisitor';\n","import { TypeManifest } from './getTypeManifestVisitor';\n\nconst DEFAULT_MODULE_MAP: Record<string, string> = {\n generated: 'crate::generated',\n generatedAccounts: 'crate::generated::accounts',\n generatedErrors: 'crate::generated::errors',\n generatedInstructions: 'crate::generated::instructions',\n generatedTypes: 'crate::generated::types',\n hooked: 'crate::hooked',\n mplEssentials: 'mpl_toolbox',\n mplToolbox: 'mpl_toolbox',\n};\n\nexport class ImportMap {\n protected readonly _imports: Set<string> = new Set();\n\n protected readonly _aliases: Map<string, string> = new Map();\n\n get imports(): Set<string> {\n return this._imports;\n }\n\n get aliases(): Map<string, string> {\n return this._aliases;\n }\n\n add(imports: Set<string> | string[] | string): ImportMap {\n const newImports = typeof imports === 'string' ? [imports] : imports;\n newImports.forEach(i => this._imports.add(i));\n return this;\n }\n\n remove(imports: Set<string> | string[] | string): ImportMap {\n const importsToRemove = typeof imports === 'string' ? [imports] : imports;\n importsToRemove.forEach(i => this._imports.delete(i));\n return this;\n }\n\n mergeWith(...others: ImportMap[]): ImportMap {\n others.forEach(other => {\n this.add(other._imports);\n other._aliases.forEach((alias, importName) => this.addAlias(importName, alias));\n });\n return this;\n }\n\n mergeWithManifest(manifest: TypeManifest): ImportMap {\n return this.mergeWith(manifest.imports);\n }\n\n addAlias(importName: string, alias: string): ImportMap {\n this._aliases.set(importName, alias);\n return this;\n }\n\n isEmpty(): boolean {\n return this._imports.size === 0;\n }\n\n resolveDependencyMap(dependencies: Record<string, string>): ImportMap {\n const dependencyMap = { ...DEFAULT_MODULE_MAP, ...dependencies };\n const newImportMap = new ImportMap();\n const resolveDependency = (i: string): string => {\n const dependencyKey = Object.keys(dependencyMap).find(key => i.startsWith(`${key}::`));\n if (!dependencyKey) return i;\n const dependencyValue = dependencyMap[dependencyKey];\n return dependencyValue + i.slice(dependencyKey.length);\n };\n this._imports.forEach(i => newImportMap.add(resolveDependency(i)));\n this._aliases.forEach((alias, i) => newImportMap.addAlias(resolveDependency(i), alias));\n return newImportMap;\n }\n\n toString(dependencies: Record<string, string>): string {\n const resolvedMap = this.resolveDependencyMap(dependencies);\n const importStatements = [...resolvedMap.imports].map(i => {\n const alias = resolvedMap.aliases.get(i);\n if (alias) return `use ${i} as ${alias};`;\n return `use ${i};`;\n });\n return importStatements.join('\\n');\n }\n}\n","import { logWarn } from '@codama/errors';\nimport {\n getAllAccounts,\n getAllDefinedTypes,\n getAllInstructionsWithSubs,\n getAllPrograms,\n InstructionNode,\n isNode,\n isNodeFilter,\n pascalCase,\n ProgramNode,\n resolveNestedTypeNode,\n snakeCase,\n structTypeNodeFromInstructionArgumentNodes,\n VALUE_NODES,\n} from '@codama/nodes';\nimport { addToRenderMap, createRenderMap, mergeRenderMaps } from '@codama/renderers-core';\nimport {\n extendVisitor,\n LinkableDictionary,\n NodeStack,\n pipe,\n recordLinkablesOnFirstVisitVisitor,\n recordNodeStackVisitor,\n staticVisitor,\n visit,\n} from '@codama/visitors-core';\n\nimport { getTypeManifestVisitor } from './getTypeManifestVisitor';\nimport { ImportMap } from './ImportMap';\nimport { renderValueNode } from './renderValueNodeVisitor';\nimport {\n getDiscriminatorConstants,\n getImportFromFactory,\n getTraitsFromNodeFactory,\n LinkOverrides,\n render,\n TraitOptions,\n} from './utils';\n\nexport type GetRenderMapOptions = {\n anchorTraits?: boolean;\n defaultTraitOverrides?: string[];\n dependencyMap?: Record<string, string>;\n linkOverrides?: LinkOverrides;\n renderParentInstructions?: boolean;\n traitOptions?: TraitOptions;\n};\n\nexport function getRenderMapVisitor(options: GetRenderMapOptions = {}) {\n const linkables = new LinkableDictionary();\n const stack = new NodeStack();\n let program: ProgramNode | null = null;\n\n const renderParentInstructions = options.renderParentInstructions ?? false;\n const dependencyMap = options.dependencyMap ?? {};\n const getImportFrom = getImportFromFactory(options.linkOverrides ?? {});\n const getTraitsFromNode = getTraitsFromNodeFactory(options.traitOptions);\n const typeManifestVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n traitOptions: options.traitOptions,\n });\n const anchorTraits = options.anchorTraits ?? true;\n\n return pipe(\n staticVisitor(() => createRenderMap(), {\n keys: ['rootNode', 'programNode', 'instructionNode', 'accountNode', 'definedTypeNode'],\n }),\n v =>\n extendVisitor(v, {\n visitAccount(node) {\n const typeManifest = visit(node, typeManifestVisitor);\n\n // Discriminator constants.\n const fields = resolveNestedTypeNode(node.data).fields;\n const discriminatorConstants = getDiscriminatorConstants({\n discriminatorNodes: node.discriminators ?? [],\n fields,\n getImportFrom,\n prefix: node.name,\n typeManifestVisitor,\n });\n\n // Seeds.\n const seedsImports = new ImportMap();\n const pda = node.pda ? linkables.get([...stack.getPath(), node.pda]) : undefined;\n const pdaSeeds = pda?.seeds ?? [];\n const seeds = pdaSeeds.map(seed => {\n if (isNode(seed, 'variablePdaSeedNode')) {\n const seedManifest = visit(seed.type, typeManifestVisitor);\n seedsImports.mergeWith(seedManifest.imports);\n const resolvedType = resolveNestedTypeNode(seed.type);\n return { ...seed, resolvedType, typeManifest: seedManifest };\n }\n if (isNode(seed.value, 'programIdValueNode')) {\n return seed;\n }\n const seedManifest = visit(seed.type, typeManifestVisitor);\n const valueManifest = renderValueNode(seed.value, getImportFrom, true);\n seedsImports.mergeWith(valueManifest.imports);\n const resolvedType = resolveNestedTypeNode(seed.type);\n return { ...seed, resolvedType, typeManifest: seedManifest, valueManifest };\n });\n const hasVariableSeeds = pdaSeeds.filter(isNodeFilter('variablePdaSeedNode')).length > 0;\n const constantSeeds = seeds\n .filter(isNodeFilter('constantPdaSeedNode'))\n .filter(seed => !isNode(seed.value, 'programIdValueNode'));\n\n const { imports } = typeManifest;\n\n if (hasVariableSeeds) {\n imports.mergeWith(seedsImports);\n }\n\n return createRenderMap(`accounts/${snakeCase(node.name)}.rs`, {\n content: render('accountsPage.njk', {\n account: node,\n anchorTraits,\n constantSeeds,\n discriminatorConstants: discriminatorConstants.render,\n hasVariableSeeds,\n imports: imports\n .mergeWith(discriminatorConstants.imports)\n .remove(`generatedAccounts::${pascalCase(node.name)}`)\n .toString(dependencyMap),\n pda,\n program,\n seeds,\n typeManifest,\n }),\n });\n },\n\n visitDefinedType(node) {\n const typeManifest = visit(node, typeManifestVisitor);\n const imports = new ImportMap().mergeWithManifest(typeManifest);\n\n return createRenderMap(`types/${snakeCase(node.name)}.rs`, {\n content: render('definedTypesPage.njk', {\n definedType: node,\n imports: imports.remove(`generatedTypes::${pascalCase(node.name)}`).toString(dependencyMap),\n typeManifest,\n }),\n });\n },\n\n visitInstruction(node) {\n // Imports.\n const imports = new ImportMap();\n\n // canMergeAccountsAndArgs\n const accountsAndArgsConflicts = getConflictsForInstructionAccountsAndArgs(node);\n if (accountsAndArgsConflicts.length > 0) {\n logWarn(\n `[Rust] Accounts and args of instruction [${node.name}] have the following ` +\n `conflicting attributes [${accountsAndArgsConflicts.join(', ')}]. ` +\n `Thus, the conflicting arguments will be suffixed with \"_arg\". ` +\n 'You may want to rename the conflicting attributes.',\n );\n }\n\n // Discriminator constants.\n const discriminatorConstants = getDiscriminatorConstants({\n discriminatorNodes: node.discriminators ?? [],\n fields: node.arguments,\n getImportFrom,\n prefix: node.name,\n typeManifestVisitor,\n });\n\n // Instruction args.\n const instructionArgs: {\n default: boolean;\n innerOptionType: string | null;\n name: string;\n optional: boolean;\n type: string;\n value: string | null;\n }[] = [];\n let hasArgs = false;\n let hasOptional = false;\n\n node.arguments.forEach(argument => {\n const argumentVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n nestedStruct: true,\n parentName: `${pascalCase(node.name)}InstructionData`,\n });\n const manifest = visit(argument.type, argumentVisitor);\n imports.mergeWith(manifest.imports);\n const innerOptionType = isNode(argument.type, 'optionTypeNode')\n ? manifest.type.slice('Option<'.length, -1)\n : null;\n\n const hasDefaultValue = !!argument.defaultValue && isNode(argument.defaultValue, VALUE_NODES);\n let renderValue: string | null = null;\n if (hasDefaultValue) {\n const { imports: argImports, render: value } = renderValueNode(\n argument.defaultValue,\n getImportFrom,\n );\n imports.mergeWith(argImports);\n renderValue = value;\n }\n\n hasArgs = hasArgs || argument.defaultValueStrategy !== 'omitted';\n hasOptional = hasOptional || (hasDefaultValue && argument.defaultValueStrategy !== 'omitted');\n\n const name = accountsAndArgsConflicts.includes(argument.name)\n ? `${argument.name}_arg`\n : argument.name;\n\n instructionArgs.push({\n default: hasDefaultValue && argument.defaultValueStrategy === 'omitted',\n innerOptionType,\n name,\n optional: hasDefaultValue && argument.defaultValueStrategy !== 'omitted',\n type: manifest.type,\n value: renderValue,\n });\n });\n\n const struct = structTypeNodeFromInstructionArgumentNodes(node.arguments);\n const structVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n parentName: `${pascalCase(node.name)}InstructionData`,\n });\n const typeManifest = visit(struct, structVisitor);\n\n const dataTraits = getTraitsFromNode(node);\n imports.mergeWith(dataTraits.imports);\n\n return createRenderMap(`instructions/${snakeCase(node.name)}.rs`, {\n content: render('instructionsPage.njk', {\n dataTraits: dataTraits.render,\n discriminatorConstants: discriminatorConstants.render,\n hasArgs,\n hasOptional,\n imports: imports\n .mergeWith(discriminatorConstants.imports)\n .remove(`generatedInstructions::${pascalCase(node.name)}`)\n .toString(dependencyMap),\n instruction: node,\n instructionArgs,\n program,\n typeManifest,\n }),\n });\n },\n\n visitProgram(node, { self }) {\n program = node;\n let renders = mergeRenderMaps([\n ...node.accounts.map(account => visit(account, self)),\n ...node.definedTypes.map(type => visit(type, self)),\n ...getAllInstructionsWithSubs(node, {\n leavesOnly: !renderParentInstructions,\n }).map(ix => visit(ix, self)),\n ]);\n\n // Errors.\n if (node.errors.length > 0) {\n renders = addToRenderMap(renders, `errors/${snakeCase(node.name)}.rs`, {\n content: render('errorsPage.njk', {\n errors: node.errors,\n imports: new ImportMap().toString(dependencyMap),\n program: node,\n }),\n });\n }\n\n program = null;\n return renders;\n },\n\n visitRoot(node, { self }) {\n const programsToExport = getAllPrograms(node);\n const accountsToExport = getAllAccounts(node);\n const instructionsToExport = getAllInstructionsWithSubs(node, {\n leavesOnly: !renderParentInstructions,\n });\n const definedTypesToExport = getAllDefinedTypes(node);\n const hasAnythingToExport =\n programsToExport.length > 0 ||\n accountsToExport.length > 0 ||\n instructionsToExport.length > 0 ||\n definedTypesToExport.length > 0;\n\n const ctx = {\n accountsToExport,\n definedTypesToExport,\n hasAnythingToExport,\n instructionsToExport,\n programsToExport,\n root: node,\n };\n\n return mergeRenderMaps([\n createRenderMap({\n ['accounts/mod.rs']:\n accountsToExport.length > 0 ? { content: render('accountsMod.njk', ctx) } : undefined,\n ['errors/mod.rs']:\n programsToExport.length > 0 ? { content: render('errorsMod.njk', ctx) } : undefined,\n ['instructions/mod.rs']:\n instructionsToExport.length > 0\n ? { content: render('instructionsMod.njk', ctx) }\n : undefined,\n ['mod.rs']: { content: render('rootMod.njk', ctx) },\n ['programs.rs']:\n programsToExport.length > 0 ? { content: render('programsMod.njk', ctx) } : undefined,\n ['shared.rs']:\n accountsToExport.length > 0 ? { content: render('sharedPage.njk', ctx) } : undefined,\n ['types/mod.rs']:\n definedTypesToExport.length > 0\n ? { content: render('definedTypesMod.njk', ctx) }\n : undefined,\n }),\n ...getAllPrograms(node).map(p => visit(p, self)),\n ]);\n },\n }),\n v => recordNodeStackVisitor(v, stack),\n v => recordLinkablesOnFirstVisitVisitor(v, linkables),\n );\n}\n\nfunction getConflictsForInstructionAccountsAndArgs(instruction: InstructionNode): string[] {\n const allNames = [\n ...instruction.accounts.map(account => account.name),\n ...instruction.arguments.map(argument => argument.name),\n ];\n const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);\n return [...new Set(duplicates)];\n}\n","import { CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, CodamaError } from '@codama/errors';\nimport {\n AccountNode,\n arrayTypeNode,\n CountNode,\n DefinedTypeNode,\n definedTypeNode,\n fixedCountNode,\n InstructionNode,\n isNode,\n NumberTypeNode,\n numberTypeNode,\n parseDocs,\n pascalCase,\n prefixedCountNode,\n REGISTERED_TYPE_NODE_KINDS,\n remainderCountNode,\n resolveNestedTypeNode,\n snakeCase,\n} from '@codama/nodes';\nimport { extendVisitor, mergeVisitor, pipe, visit } from '@codama/visitors-core';\n\nimport { ImportMap } from './ImportMap';\nimport {\n GetImportFromFunction,\n getSerdeFieldAttribute,\n GetTraitsFromNodeFunction,\n rustDocblock,\n TraitOptions,\n} from './utils';\n\nexport type TypeManifest = {\n imports: ImportMap;\n nestedStructs: string[];\n type: string;\n};\n\nexport function getTypeManifestVisitor(options: {\n getImportFrom: GetImportFromFunction;\n getTraitsFromNode: GetTraitsFromNodeFunction;\n nestedStruct?: boolean;\n parentName?: string | null;\n traitOptions?: TraitOptions;\n}) {\n const { getImportFrom, getTraitsFromNode, traitOptions } = options;\n let parentName: string | null = options.parentName ?? null;\n let nestedStruct: boolean = options.nestedStruct ?? false;\n let inlineStruct: boolean = false;\n let parentSize: NumberTypeNode | number | null = null;\n let parentNode: AccountNode | DefinedTypeNode | InstructionNode | null = null;\n\n return pipe(\n mergeVisitor(\n (): TypeManifest => ({ imports: new ImportMap(), nestedStructs: [], type: '' }),\n (_, values) => ({\n ...mergeManifests(values),\n type: values.map(v => v.type).join('\\n'),\n }),\n { keys: [...REGISTERED_TYPE_NODE_KINDS, 'definedTypeLinkNode', 'definedTypeNode', 'accountNode'] },\n ),\n v =>\n extendVisitor(v, {\n visitAccount(account, { self }) {\n parentName = pascalCase(account.name);\n parentNode = account;\n const manifest = visit(account.data, self);\n const traits = getTraitsFromNode(account);\n manifest.imports.mergeWith(traits.imports);\n parentName = null;\n parentNode = null;\n return {\n ...manifest,\n type: traits.render + manifest.type,\n };\n },\n\n visitArrayType(arrayType, { self }) {\n const childManifest = visit(arrayType.item, self);\n\n if (isNode(arrayType.count, 'fixedCountNode')) {\n return {\n ...childManifest,\n type: `[${childManifest.type}; ${arrayType.count.value}]`,\n };\n }\n\n if (isNode(arrayType.count, 'remainderCountNode')) {\n childManifest.imports.add('kaigan::types::RemainderVec');\n return {\n ...childManifest,\n type: `RemainderVec<${childManifest.type}>`,\n };\n }\n\n const prefix = resolveNestedTypeNode(arrayType.count.prefix);\n if (prefix.endian === 'le') {\n switch (prefix.format) {\n case 'u32':\n return {\n ...childManifest,\n type: `Vec<${childManifest.type}>`,\n };\n case 'u8':\n case 'u16':\n case 'u64': {\n const prefixFormat = prefix.format.toUpperCase();\n childManifest.imports.add(`kaigan::types::${prefixFormat}PrefixVec`);\n return {\n ...childManifest,\n type: `${prefixFormat}PrefixVec<${childManifest.type}>`,\n };\n }\n case 'shortU16': {\n childManifest.imports.add('solana_short_vec::ShortVec');\n return {\n ...childManifest,\n type: `ShortVec<${childManifest.type}>`,\n };\n }\n default:\n throw new Error(`Array prefix not supported: ${prefix.format}`);\n }\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Array size not supported by Borsh');\n },\n\n visitBooleanType(booleanType) {\n const resolvedSize = resolveNestedTypeNode(booleanType.size);\n if (resolvedSize.format === 'u8' && resolvedSize.endian === 'le') {\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: 'bool',\n };\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Bool size not supported by Borsh');\n },\n\n visitBytesType(_bytesType, { self }) {\n let arraySize: CountNode = remainderCountNode();\n if (typeof parentSize === 'number') {\n arraySize = fixedCountNode(parentSize);\n } else if (parentSize && typeof parentSize === 'object') {\n arraySize = prefixedCountNode(parentSize);\n }\n const arrayType = arrayTypeNode(numberTypeNode('u8'), arraySize);\n return visit(arrayType, self);\n },\n\n visitDefinedType(definedType, { self }) {\n parentName = pascalCase(definedType.name);\n parentNode = definedType;\n const manifest = visit(definedType.type, self);\n const traits = getTraitsFromNode(definedType);\n manifest.imports.mergeWith(traits.imports);\n parentName = null;\n parentNode = null;\n\n const renderedType = isNode(definedType.type, ['enumTypeNode', 'structTypeNode'])\n ? manifest.type\n : `pub type ${pascalCase(definedType.name)} = ${manifest.type};`;\n\n return { ...manifest, type: `${traits.render}${renderedType}` };\n },\n\n visitDefinedTypeLink(node) {\n const pascalCaseDefinedType = pascalCase(node.name);\n const importFrom = getImportFrom(node);\n return {\n imports: new ImportMap().add(`${importFrom}::${pascalCaseDefinedType}`),\n nestedStructs: [],\n type: pascalCaseDefinedType,\n };\n },\n\n visitEnumEmptyVariantType(enumEmptyVariantType) {\n const name = pascalCase(enumEmptyVariantType.name);\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: `${name},`,\n };\n },\n\n visitEnumStructVariantType(enumStructVariantType, { self }) {\n const name = pascalCase(enumStructVariantType.name);\n const originalParentName = parentName;\n\n if (!originalParentName) {\n throw new Error('Enum struct variant type must have a parent name.');\n }\n\n inlineStruct = true;\n parentName = pascalCase(originalParentName) + name;\n const typeManifest = visit(enumStructVariantType.struct, self);\n inlineStruct = false;\n parentName = originalParentName;\n\n return {\n ...typeManifest,\n type: `${name} ${typeManifest.type},`,\n };\n },\n\n visitEnumTupleVariantType(enumTupleVariantType, { self }) {\n const name = pascalCase(enumTupleVariantType.name);\n const originalParentName = parentName;\n\n if (!originalParentName) {\n throw new Error('Enum struct variant type must have a parent name.');\n }\n\n parentName = pascalCase(originalParentName) + name;\n const childManifest = visit(enumTupleVariantType.tuple, self);\n parentName = originalParentName;\n\n let derive = '';\n if (parentNode && childManifest.type === '(Pubkey)') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::DisplayFromStr>',\n parentNode,\n traitOptions,\n );\n } else if (parentNode && childManifest.type === '(Vec<Pubkey>)') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<Vec<serde_with::DisplayFromStr>>',\n parentNode,\n traitOptions,\n );\n }\n\n return {\n ...childManifest,\n type: `${derive}${name}${childManifest.type},`,\n };\n },\n\n visitEnumType(enumType, { self }) {\n const originalParentName = parentName;\n if (!originalParentName) {\n // TODO: Add to the Rust validator.\n throw new Error('Enum type must have a parent name.');\n }\n\n const variants = enumType.variants.map(variant => visit(variant, self));\n const variantNames = variants.map(variant => variant.type).join('\\n');\n const mergedManifest = mergeManifests(variants);\n\n return {\n ...mergedManifest,\n type: `pub enum ${pascalCase(originalParentName)} {\\n${variantNames}\\n}`,\n };\n },\n\n visitFixedSizeType(fixedSizeType, { self }) {\n parentSize = fixedSizeType.size;\n const manifest = visit(fixedSizeType.type, self);\n parentSize = null;\n return manifest;\n },\n\n visitMapType(mapType, { self }) {\n const key = visit(mapType.key, self);\n const value = visit(mapType.value, self);\n const mergedManifest = mergeManifests([key, value]);\n mergedManifest.imports.add('std::collections::HashMap');\n return {\n ...mergedManifest,\n type: `HashMap<${key.type}, ${value.type}>`,\n };\n },\n\n visitNumberType(numberType) {\n if (numberType.endian !== 'le') {\n // TODO: Add to the Rust validator.\n throw new Error('Number endianness not supported by Borsh');\n }\n\n if (numberType.format === 'shortU16') {\n return {\n imports: new ImportMap().add('solana_short_vec::ShortU16'),\n nestedStructs: [],\n type: 'ShortU16',\n };\n }\n\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: numberType.format,\n };\n },\n\n visitOptionType(optionType, { self }) {\n const childManifest = visit(optionType.item, self);\n\n const optionPrefix = resolveNestedTypeNode(optionType.prefix);\n if (optionPrefix.format === 'u8' && optionPrefix.endian === 'le') {\n return {\n ...childManifest,\n type: `Option<${childManifest.type}>`,\n };\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Option size not supported by Borsh');\n },\n\n visitPublicKeyType() {\n return {\n imports: new ImportMap().add('solana_pubkey::Pubkey'),\n nestedStructs: [],\n type: 'Pubkey',\n };\n },\n\n visitRemainderOptionType(node) {\n throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });\n },\n\n visitSetType(setType, { self }) {\n const childManifest = visit(setType.item, self);\n childManifest.imports.add('std::collections::HashSet');\n return {\n ...childManifest,\n type: `HashSet<${childManifest.type}>`,\n };\n },\n\n visitSizePrefixType(sizePrefixType, { self }) {\n parentSize = resolveNestedTypeNode(sizePrefixType.prefix);\n const manifest = visit(sizePrefixType.type, self);\n parentSize = null;\n return manifest;\n },\n\n visitStringType() {\n if (!parentSize) {\n return {\n imports: new ImportMap().add(`kaigan::types::RemainderStr`),\n nestedStructs: [],\n type: `RemainderStr`,\n };\n }\n\n if (typeof parentSize === 'number') {\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: `[u8; ${parentSize}]`,\n };\n }\n\n if (isNode(parentSize, 'numberTypeNode') && parentSize.endian === 'le') {\n switch (parentSize.format) {\n case 'u32':\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: 'String',\n };\n case 'u8':\n case 'u16':\n case 'u64': {\n const prefix = parentSize.format.toUpperCase();\n return {\n imports: new ImportMap().add(`kaigan::types::${prefix}PrefixString`),\n nestedStructs: [],\n type: `${prefix}PrefixString`,\n };\n }\n default:\n throw new Error(`'String size not supported: ${parentSize.format}`);\n }\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('String size not supported by Borsh');\n },\n\n visitStructFieldType(structFieldType, { self }) {\n const originalParentName = parentName;\n const originalInlineStruct = inlineStruct;\n const originalNestedStruct = nestedStruct;\n\n if (!originalParentName) {\n throw new Error('Struct field type must have a parent name.');\n }\n\n parentName = pascalCase(originalParentName) + pascalCase(structFieldType.name);\n nestedStruct = true;\n inlineStruct = false;\n\n const fieldManifest = visit(structFieldType.type, self);\n\n parentName = originalParentName;\n inlineStruct = originalInlineStruct;\n nestedStruct = originalNestedStruct;\n\n const fieldName = snakeCase(structFieldType.name);\n const docblock = rustDocblock(parseDocs(structFieldType.docs));\n const resolvedNestedType = resolveNestedTypeNode(structFieldType.type);\n\n let derive = '';\n if (parentNode) {\n if (fieldManifest.type === 'Pubkey') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::DisplayFromStr>',\n parentNode,\n traitOptions,\n );\n } else if (fieldManifest.type === 'Vec<Pubkey>') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<Vec<serde_with::DisplayFromStr>>',\n parentNode,\n traitOptions,\n );\n } else if (\n isNode(resolvedNestedType, 'arrayTypeNode') &&\n isNode(resolvedNestedType.count, 'fixedCountNode') &&\n resolvedNestedType.count.value > 32\n ) {\n derive = getSerdeFieldAttribute('serde_big_array::BigArray', parentNode, traitOptions);\n } else if (\n isNode(resolvedNestedType, ['bytesTypeNode', 'stringTypeNode']) &&\n isNode(structFieldType.type, 'fixedSizeTypeNode') &&\n structFieldType.type.size > 32\n ) {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::Bytes>',\n parentNode,\n traitOptions,\n );\n }\n }\n\n return {\n ...fieldManifest,\n type: inlineStruct\n ? `${docblock}${derive}${fieldName}: ${fieldManifest.type},`\n : `${docblock}${derive}pub ${fieldName}: ${fieldManifest.type},`,\n };\n },\n\n visitStructType(structType, { self }) {\n const originalParentName = parentName;\n\n if (!originalParentName) {\n // TODO: Add to the Rust validator.\n throw new Error('Struct type must have a parent name.');\n }\n\n const fields = structType.fields.map(field => visit(field, self));\n const fieldTypes = fields.map(field => field.type).join('\\n');\n const mergedManifest = mergeManifests(fields);\n\n if (nestedStruct) {\n const nestedTraits = getTraitsFromNode(\n definedTypeNode({ name: originalParentName, type: structType }),\n );\n mergedManifest.imports.mergeWith(nestedTraits.imports);\n return {\n ...mergedManifest,\n nestedStructs: [\n ...mergedManifest.nestedStructs,\n `${nestedTraits.render}pub struct ${pascalCase(originalParentName)} {\\n${fieldTypes}\\n}`,\n ],\n type: pascalCase(originalParentName),\n };\n }\n\n if (inlineStruct) {\n return { ...mergedManifest, type: `{\\n${fieldTypes}\\n}` };\n }\n\n return {\n ...mergedManifest,\n type: `pub struct ${pascalCase(originalParentName)} {\\n${fieldTypes}\\n}`,\n };\n },\n\n visitTupleType(tupleType, { self }) {\n const items = tupleType.items.map(item => visit(item, self));\n const mergedManifest = mergeManifests(items);\n\n return {\n ...mergedManifest,\n type: `(${items.map(item => item.type).join(', ')})`,\n };\n },\n\n visitZeroableOptionType(node) {\n throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });\n },\n }),\n );\n}\n\nfunction mergeManifests(manifests: TypeManifest[]): Pick<TypeManifest, 'imports' | 'nestedStructs'> {\n return {\n imports: new ImportMap().mergeWith(...manifests.map(td => td.imports)),\n nestedStructs: manifests.flatMap(m => m.nestedStructs),\n };\n}\n","import { BytesValueNode } from '@codama/nodes';\nimport { getBase16Encoder, getBase58Encoder, getBase64Encoder, getUtf8Encoder } from '@solana/codecs-strings';\n\nexport function getBytesFromBytesValueNode(node: BytesValueNode): Uint8Array {\n switch (node.encoding) {\n case 'utf8':\n return getUtf8Encoder().encode(node.data) as Uint8Array;\n case 'base16':\n return getBase16Encoder().encode(node.data) as Uint8Array;\n case 'base58':\n return getBase58Encoder().encode(node.data) as Uint8Array;\n case 'base64':\n default:\n return getBase64Encoder().encode(node.data) as Uint8Array;\n }\n}\n","import {\n camelCase,\n ConstantDiscriminatorNode,\n DiscriminatorNode,\n FieldDiscriminatorNode,\n InstructionArgumentNode,\n isNode,\n isNodeFilter,\n snakeCase,\n StructFieldTypeNode,\n VALUE_NODES,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\n\nimport { getTypeManifestVisitor, TypeManifest } from '../getTypeManifestVisitor';\nimport { ImportMap } from '../ImportMap';\nimport { renderValueNode } from '../renderValueNodeVisitor';\nimport { GetImportFromFunction } from './linkOverrides';\n\ntype Fragment = { imports: ImportMap; render: string };\n\nfunction mergeFragments(fragments: Fragment[], merge: (parts: string[]) => string): Fragment {\n const imports = fragments.reduce((acc, frag) => acc.mergeWith(frag.imports), new ImportMap());\n const render = merge(fragments.map(frag => frag.render));\n return { imports, render };\n}\n\nexport function getDiscriminatorConstants(scope: {\n discriminatorNodes: DiscriminatorNode[];\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n}): Fragment {\n const fragments = scope.discriminatorNodes\n .map(node => getDiscriminatorConstant(node, scope))\n .filter(Boolean) as Fragment[];\n\n return mergeFragments(fragments, r => r.join('\\n\\n'));\n}\n\nfunction getDiscriminatorConstant(\n discriminatorNode: DiscriminatorNode,\n scope: {\n discriminatorNodes: DiscriminatorNode[];\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n) {\n switch (discriminatorNode.kind) {\n case 'constantDiscriminatorNode':\n return getConstantDiscriminatorConstant(discriminatorNode, scope);\n case 'fieldDiscriminatorNode':\n return getFieldDiscriminatorConstant(discriminatorNode, scope);\n default:\n return null;\n }\n}\n\nfunction getConstantDiscriminatorConstant(\n discriminatorNode: ConstantDiscriminatorNode,\n scope: {\n discriminatorNodes: DiscriminatorNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n): Fragment {\n const { discriminatorNodes, getImportFrom, prefix, typeManifestVisitor } = scope;\n\n const index = discriminatorNodes.filter(isNodeFilter('constantDiscriminatorNode')).indexOf(discriminatorNode);\n const suffix = index <= 0 ? '' : `_${index + 1}`;\n\n const name = camelCase(`${prefix}_discriminator${suffix}`);\n const typeManifest = visit(discriminatorNode.constant.type, typeManifestVisitor);\n const value = renderValueNode(discriminatorNode.constant.value, getImportFrom);\n return getConstant(name, typeManifest, value);\n}\n\nfunction getFieldDiscriminatorConstant(\n discriminatorNode: FieldDiscriminatorNode,\n scope: {\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n): Fragment | null {\n const { fields, prefix, getImportFrom, typeManifestVisitor } = scope;\n\n const field = fields.find(f => f.name === discriminatorNode.name);\n if (!field || !field.defaultValue || !isNode(field.defaultValue, VALUE_NODES)) {\n return null;\n }\n\n const name = camelCase(`${prefix}_${discriminatorNode.name}`);\n const typeManifest = visit(field.type, typeManifestVisitor);\n const value = renderValueNode(field.defaultValue, getImportFrom);\n return getConstant(name, typeManifest, value);\n}\n\nfunction getConstant(name: string, typeManifest: TypeManifest, value: Fragment): Fragment {\n const type: Fragment = { imports: typeManifest.imports, render: typeManifest.type };\n return mergeFragments([type, value], ([t, v]) => `pub const ${snakeCase(name).toUpperCase()}: ${t} = ${v};`);\n}\n","import {\n arrayValueNode,\n bytesValueNode,\n isNode,\n numberValueNode,\n pascalCase,\n RegisteredValueNode,\n ValueNode,\n} from '@codama/nodes';\nimport { visit, Visitor } from '@codama/visitors-core';\n\nimport { ImportMap } from './ImportMap';\nimport { getBytesFromBytesValueNode, GetImportFromFunction } from './utils';\n\nexport function renderValueNode(\n value: ValueNode,\n getImportFrom: GetImportFromFunction,\n useStr: boolean = false,\n): {\n imports: ImportMap;\n render: string;\n} {\n return visit(value, renderValueNodeVisitor(getImportFrom, useStr));\n}\n\nexport function renderValueNodeVisitor(\n getImportFrom: GetImportFromFunction,\n useStr: boolean = false,\n): Visitor<\n {\n imports: ImportMap;\n render: string;\n },\n RegisteredValueNode['kind']\n> {\n return {\n visitArrayValue(node) {\n const list = node.items.map(v => visit(v, this));\n return {\n imports: new ImportMap().mergeWith(...list.map(c => c.imports)),\n render: `[${list.map(c => c.render).join(', ')}]`,\n };\n },\n visitBooleanValue(node) {\n return {\n imports: new ImportMap(),\n render: JSON.stringify(node.boolean),\n };\n },\n visitBytesValue(node) {\n const bytes = getBytesFromBytesValueNode(node);\n const numbers = Array.from(bytes).map(numberValueNode);\n return visit(arrayValueNode(numbers), this);\n },\n visitConstantValue(node) {\n if (isNode(node.value, 'bytesValueNode')) {\n return visit(node.value, this);\n }\n if (isNode(node.type, 'stringTypeNode') && isNode(node.value, 'stringValueNode')) {\n return visit(bytesValueNode(node.type.encoding, node.value.string), this);\n }\n if (isNode(node.type, 'numberTypeNode') && isNode(node.value, 'numberValueNode')) {\n const numberManifest = visit(node.value, this);\n const { format, endian } = node.type;\n const byteFunction = endian === 'le' ? 'to_le_bytes' : 'to_be_bytes';\n numberManifest.render = `${numberManifest.render}${format}.${byteFunction}()`;\n return numberManifest;\n }\n throw new Error('Unsupported constant value type.');\n },\n visitEnumValue(node) {\n const imports = new ImportMap();\n const enumName = pascalCase(node.enum.name);\n const variantName = pascalCase(node.variant);\n const importFrom = getImportFrom(node.enum);\n imports.add(`${importFrom}::${enumName}`);\n if (!node.value) {\n return { imports, render: `${enumName}::${variantName}` };\n }\n const enumValue = visit(node.value, this);\n const fields = enumValue.render;\n return {\n imports: imports.mergeWith(enumValue.imports),\n render: `${enumName}::${variantName} ${fields}`,\n };\n },\n visitMapEntryValue(node) {\n const mapKey = visit(node.key, this);\n const mapValue = visit(node.value, this);\n return {\n imports: mapKey.imports.mergeWith(mapValue.imports),\n render: `[${mapKey.render}, ${mapValue.render}]`,\n };\n },\n visitMapValue(node) {\n const map = node.entries.map(entry => visit(entry, this));\n const imports = new ImportMap().add('std::collection::HashMap');\n return {\n imports: imports.mergeWith(...map.map(c => c.imports)),\n render: `HashMap::from([${map.map(c => c.render).join(', ')}])`,\n };\n },\n visitNoneValue() {\n return {\n imports: new ImportMap(),\n render: 'None',\n };\n },\n visitNumberValue(node) {\n return {\n imports: new ImportMap(),\n render: node.number.toString(),\n };\n },\n visitPublicKeyValue(node) {\n return {\n imports: new ImportMap().add('solana_pubkey'),\n render: `pubkey!(\"${node.publicKey}\")`,\n };\n },\n visitSetValue(node) {\n const set = node.items.map(v => visit(v, this));\n const imports = new ImportMap().add('std::collection::HashSet');\n return {\n imports: imports.mergeWith(...set.map(c => c.imports)),\n render: `HashSet::from([${set.map(c => c.render).join(', ')}])`,\n };\n },\n visitSomeValue(node) {\n const child = visit(node.value, this);\n return {\n ...child,\n render: `Some(${child.render})`,\n };\n },\n visitStringValue(node) {\n return {\n imports: new ImportMap(),\n render: useStr ? `${JSON.stringify(node.string)}` : `String::from(${JSON.stringify(node.string)})`,\n };\n },\n visitStructFieldValue(node) {\n const structValue = visit(node.value, this);\n return {\n imports: structValue.imports,\n render: `${node.name}: ${structValue.render}`,\n };\n },\n visitStructValue(node) {\n const struct = node.fields.map(field => visit(field, this));\n return {\n imports: new ImportMap().mergeWith(...struct.map(c => c.imports)),\n render: `{ ${struct.map(c => c.render).join(', ')} }`,\n };\n },\n visitTupleValue(node) {\n const tuple = node.items.map(v => visit(v, this));\n return {\n imports: new ImportMap().mergeWith(...tuple.map(c => c.imports)),\n render: `(${tuple.map(c => c.render).join(', ')})`,\n };\n },\n };\n}\n","import { CODAMA_ERROR__UNEXPECTED_NODE_KIND, CodamaError } from '@codama/errors';\nimport {\n AccountLinkNode,\n DefinedTypeLinkNode,\n InstructionLinkNode,\n PdaLinkNode,\n ProgramLinkNode,\n ResolverValueNode,\n} from '@codama/nodes';\n\nexport type LinkOverrides = {\n accounts?: Record<string, string>;\n definedTypes?: Record<string, string>;\n instructions?: Record<string, string>;\n pdas?: Record<string, string>;\n programs?: Record<string, string>;\n resolvers?: Record<string, string>;\n};\n\ntype OverridableNodes =\n | AccountLinkNode\n | DefinedTypeLinkNode\n | InstructionLinkNode\n | PdaLinkNode\n | ProgramLinkNode\n | ResolverValueNode;\n\nexport type GetImportFromFunction = (node: OverridableNodes, fallback?: string) => string;\n\nexport function getImportFromFactory(overrides: LinkOverrides): GetImportFromFunction {\n const linkOverrides = {\n accounts: overrides.accounts ?? {},\n definedTypes: overrides.definedTypes ?? {},\n instructions: overrides.instructions ?? {},\n pdas: overrides.pdas ?? {},\n programs: overrides.programs ?? {},\n resolvers: overrides.resolvers ?? {},\n };\n\n return (node: OverridableNodes) => {\n const kind = node.kind;\n switch (kind) {\n case 'accountLinkNode':\n return linkOverrides.accounts[node.name] ?? 'generatedAccounts';\n case 'definedTypeLinkNode':\n return linkOverrides.definedTypes[node.name] ?? 'generatedTypes';\n case 'instructionLinkNode':\n return linkOverrides.instructions[node.name] ?? 'generatedInstructions';\n case 'pdaLinkNode':\n return linkOverrides.pdas[node.name] ?? 'generatedAccounts';\n case 'programLinkNode':\n return linkOverrides.programs[node.name] ?? 'generatedPrograms';\n case 'resolverValueNode':\n return linkOverrides.resolvers[node.name] ?? 'hooked';\n default:\n throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n expectedKinds: [\n 'AccountLinkNode',\n 'DefinedTypeLinkNode',\n 'InstructionLinkNode',\n 'PdaLinkNode',\n 'ProgramLinkNode',\n 'resolverValueNode',\n ],\n kind: kind satisfies never,\n node,\n });\n }\n };\n}\n","import { dirname as pathDirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { camelCase, kebabCase, pascalCase, snakeCase, titleCase } from '@codama/nodes';\nimport nunjucks, { ConfigureOptions as NunJucksOptions } from 'nunjucks';\n\nexport function rustDocblock(docs: string[]): string {\n if (docs.length <= 0) return '';\n const lines = docs.map(doc => `/// ${doc}`);\n return `${lines.join('\\n')}\\n`;\n}\n\nexport const render = (template: string, context?: object, options?: NunJucksOptions): string => {\n // @ts-expect-error import.meta will be used in the right environment.\n const dirname = __ESM__ ? pathDirname(fileURLToPath(import.meta.url)) : __dirname;\n const templates = __TEST__ ? join(dirname, '..', '..', 'public', 'templates') : join(dirname, 'templates'); // Path to templates from bundled output file.\n const env = nunjucks.configure(templates, { autoescape: false, trimBlocks: true, ...options });\n env.addFilter('pascalCase', pascalCase);\n env.addFilter('camelCase', camelCase);\n env.addFilter('snakeCase', snakeCase);\n env.addFilter('kebabCase', kebabCase);\n env.addFilter('titleCase', titleCase);\n env.addFilter('rustDocblock', rustDocblock);\n // Returns whether or not the provided traits are implemented on the type.\n env.addFilter('hasTrait', (traits: string, ...traitNames: string[]) => {\n if (typeof traits !== 'string') return false;\n return traitNames.some(traitName => traits.includes(traitName));\n });\n return env.render(template, context);\n};\n","import {\n AccountNode,\n assertIsNode,\n camelCase,\n DefinedTypeNode,\n InstructionNode,\n isNode,\n isScalarEnum,\n} from '@codama/nodes';\n\nimport { ImportMap } from '../ImportMap';\n\nexport type TraitOptions = {\n /** The default traits to implement for all types. */\n baseDefaults?: string[];\n /**\n * The default traits to implement for data enums only — on top of the base defaults.\n * Data enums are enums with at least one non-unit variant.\n */\n dataEnumDefaults?: string[];\n /**\n * The mapping of feature flags to traits.\n * For each entry, the traits will be rendered within a\n * `#[cfg_attr(feature = \"feature_name\", derive(Traits))]` attribute.\n */\n featureFlags?: Record<string, string[]>;\n /** The complete trait overrides of specific types. */\n overrides?: Record<string, string[]>;\n /**\n * The default traits to implement for scalar enums only — on top of the base defaults.\n * Scalar enums are enums with no variants or only unit variants.\n */\n scalarEnumDefaults?: string[];\n /** The default traits to implement for structs only — on top of the base defaults. */\n structDefaults?: string[];\n /** Whether or not to use the fully qualified name for traits, instead of importing them. */\n useFullyQualifiedName?: boolean;\n};\n\nexport const DEFAULT_TRAIT_OPTIONS: Required<TraitOptions> = {\n baseDefaults: [\n 'borsh::BorshSerialize',\n 'borsh::BorshDeserialize',\n 'serde::Serialize',\n 'serde::Deserialize',\n 'Clone',\n 'Debug',\n 'Eq',\n 'PartialEq',\n ],\n dataEnumDefaults: [],\n featureFlags: { serde: ['serde::Serialize', 'serde::Deserialize'] },\n overrides: {},\n scalarEnumDefaults: ['Copy', 'PartialOrd', 'Hash', 'num_derive::FromPrimitive'],\n structDefaults: [],\n useFullyQualifiedName: false,\n};\n\nexport type GetTraitsFromNodeFunction = (node: AccountNode | DefinedTypeNode | InstructionNode) => {\n imports: ImportMap;\n render: string;\n};\n\nexport function getTraitsFromNodeFactory(options: TraitOptions = {}): GetTraitsFromNodeFunction {\n return node => getTraitsFromNode(node, options);\n}\n\nexport function getTraitsFromNode(\n node: AccountNode | DefinedTypeNode | InstructionNode,\n userOptions: TraitOptions = {},\n): { imports: ImportMap; render: string } {\n assertIsNode(node, ['accountNode', 'definedTypeNode', 'instructionNode']);\n const options: Required<TraitOptions> = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };\n\n // Get the node type and return early if it's a type alias.\n const nodeType = getNodeType(node);\n if (nodeType === 'alias') {\n return { imports: new ImportMap(), render: '' };\n }\n\n // Find all the FQN traits for the node.\n const sanitizedOverrides = Object.fromEntries(\n Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value]),\n );\n const nodeOverrides: string[] | undefined = sanitizedOverrides[node.name];\n const allTraits = nodeOverrides === undefined ? getDefaultTraits(nodeType, options) : nodeOverrides;\n\n // Wrap the traits in feature flags if necessary.\n const partitionedTraits = partitionTraitsInFeatures(allTraits, options.featureFlags);\n let unfeaturedTraits = partitionedTraits[0];\n const featuredTraits = partitionedTraits[1];\n\n // Import the traits if necessary.\n const imports = new ImportMap();\n if (!options.useFullyQualifiedName) {\n unfeaturedTraits = extractFullyQualifiedNames(unfeaturedTraits, imports);\n }\n\n // Render the trait lines.\n const traitLines: string[] = [\n ...(unfeaturedTraits.length > 0 ? [`#[derive(${unfeaturedTraits.join(', ')})]\\n`] : []),\n ...Object.entries(featuredTraits).map(([feature, traits]) => {\n return `#[cfg_attr(feature = \"${feature}\", derive(${traits.join(', ')}))]\\n`;\n }),\n ];\n\n return { imports, render: traitLines.join('') };\n}\n\nfunction getNodeType(\n node: AccountNode | DefinedTypeNode | InstructionNode,\n): 'alias' | 'dataEnum' | 'scalarEnum' | 'struct' {\n if (isNode(node, ['accountNode', 'instructionNode'])) return 'struct';\n if (isNode(node.type, 'structTypeNode')) return 'struct';\n if (isNode(node.type, 'enumTypeNode')) {\n return isScalarEnum(node.type) ? 'scalarEnum' : 'dataEnum';\n }\n return 'alias';\n}\n\nfunction getDefaultTraits(\n nodeType: 'dataEnum' | 'scalarEnum' | 'struct',\n options: Pick<\n Required<TraitOptions>,\n 'baseDefaults' | 'dataEnumDefaults' | 'scalarEnumDefaults' | 'structDefaults'\n >,\n): string[] {\n switch (nodeType) {\n case 'dataEnum':\n return [...options.baseDefaults, ...options.dataEnumDefaults];\n case 'scalarEnum':\n return [...options.baseDefaults, ...options.scalarEnumDefaults];\n case 'struct':\n return [...options.baseDefaults, ...options.structDefaults];\n }\n}\n\nfunction partitionTraitsInFeatures(\n traits: string[],\n featureFlags: Record<string, string[]>,\n): [string[], Record<string, string[]>] {\n // Reverse the feature flags option for quick lookup.\n // If there are any duplicate traits, the first one encountered will be used.\n const reverseFeatureFlags = Object.entries(featureFlags).reduce(\n (acc, [feature, traits]) => {\n for (const trait of traits) {\n if (!acc[trait]) acc[trait] = feature;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const unfeaturedTraits: string[] = [];\n const featuredTraits: Record<string, string[]> = {};\n for (const trait of traits) {\n const feature: string | undefined = reverseFeatureFlags[trait];\n if (feature === undefined) {\n unfeaturedTraits.push(trait);\n } else {\n if (!featuredTraits[feature]) featuredTraits[feature] = [];\n featuredTraits[feature].push(trait);\n }\n }\n\n return [unfeaturedTraits, featuredTraits];\n}\n\nfunction extractFullyQualifiedNames(traits: string[], imports: ImportMap): string[] {\n return traits.map(trait => {\n const index = trait.lastIndexOf('::');\n if (index === -1) return trait;\n imports.add(trait);\n return trait.slice(index + 2);\n });\n}\n\n/**\n * Helper function to get the serde field attribute format based on trait configuration.\n * Returns the appropriate attribute string for serde field customization, or empty string if no serde traits.\n */\nexport function getSerdeFieldAttribute(\n serdeWith: string,\n node: AccountNode | DefinedTypeNode | InstructionNode,\n userOptions: TraitOptions = {},\n): string {\n assertIsNode(node, ['accountNode', 'definedTypeNode', 'instructionNode']);\n const options: Required<TraitOptions> = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };\n\n // Get the node type and return early if it's a type alias.\n const nodeType = getNodeType(node);\n if (nodeType === 'alias') {\n return '';\n }\n\n // Find all the traits for the node.\n const sanitizedOverrides = Object.fromEntries(\n Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value]),\n );\n const nodeOverrides: string[] | undefined = sanitizedOverrides[node.name];\n const allTraits = nodeOverrides === undefined ? getDefaultTraits(nodeType, options) : nodeOverrides;\n\n // Check if serde traits are present.\n const hasSerdeSerialize = allTraits.some(t => t === 'serde::Serialize' || t === 'Serialize');\n const hasSerdeDeserialize = allTraits.some(t => t === 'serde::Deserialize' || t === 'Deserialize');\n\n if (!hasSerdeSerialize && !hasSerdeDeserialize) {\n return '';\n }\n\n // Check if serde is feature-flagged.\n const partitionedTraits = partitionTraitsInFeatures(allTraits, options.featureFlags);\n const featuredTraits = partitionedTraits[1];\n\n // Find which feature flag contains serde traits.\n let serdeFeatureName: string | undefined;\n for (const [feature, traits] of Object.entries(featuredTraits)) {\n if (\n traits.some(\n t => t === 'serde::Serialize' || t === 'serde::Deserialize' || t === 'Serialize' || t === 'Deserialize',\n )\n ) {\n serdeFeatureName = feature;\n break;\n }\n }\n\n if (serdeFeatureName) {\n return `#[cfg_attr(feature = \"${serdeFeatureName}\", serde(with = \"${serdeWith}\"))]\\n`;\n } else {\n return `#[serde(with = \"${serdeWith}\")]\\n`;\n }\n}\n","import { logError, logWarn } from '@codama/errors';\nimport { deleteDirectory, writeRenderMapVisitor } from '@codama/renderers-core';\nimport { rootNodeVisitor, visit } from '@codama/visitors-core';\nimport { spawnSync } from 'child_process';\n\nimport { GetRenderMapOptions, getRenderMapVisitor } from './getRenderMapVisitor';\n\nexport type RenderOptions = GetRenderMapOptions & {\n crateFolder?: string;\n deleteFolderBeforeRendering?: boolean;\n formatCode?: boolean;\n toolchain?: string;\n};\n\nexport function renderVisitor(path: string, options: RenderOptions = {}) {\n return rootNodeVisitor(root => {\n // Delete existing generated folder.\n if (options.deleteFolderBeforeRendering ?? true) {\n deleteDirectory(path);\n }\n\n // Render the new files.\n visit(root, writeRenderMapVisitor(getRenderMapVisitor(options), path));\n\n // format the code\n if (options.formatCode) {\n if (options.crateFolder) {\n const removeFalsy = <T>(arg: T | false | null | undefined): arg is T => Boolean(arg);\n runFormatter(\n 'cargo',\n [options.toolchain, 'fmt', '--manifest-path', `${options.crateFolder}/Cargo.toml`].filter(\n removeFalsy,\n ),\n );\n } else {\n logWarn('No crate folder specified, skipping formatting.');\n }\n }\n });\n}\n\nfunction runFormatter(cmd: string, args: string[]) {\n const { stdout, stderr, error } = spawnSync(cmd, args);\n if (error?.message?.includes('ENOENT')) {\n logWarn(`Could not find ${cmd}, skipping formatting.`);\n return;\n }\n if (stdout.length > 0) {\n logWarn(`(cargo-fmt) ${stdout ? stdout?.toString() : error}`);\n }\n if (stderr.length > 0) {\n logError(`(cargo-fmt) ${stderr ? stderr.toString() : error}`);\n }\n}\n"],"mappings":"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","names":["import_errors","import_nodes","import_visitors_core","import_errors","import_nodes","import_visitors_core","import_nodes","import_visitors_core","render","import_nodes","nunjucks","import_nodes","traits","getTraitsFromNode","getTraitsFromNode","seedManifest","resolvedType","import_errors","import_renderers_core","import_visitors_core"]}
|
package/dist/index.node.mjs
CHANGED
|
@@ -992,9 +992,8 @@ function getRenderMapVisitor(options = {}) {
|
|
|
992
992
|
if (hasVariableSeeds) {
|
|
993
993
|
imports.mergeWith(seedsImports);
|
|
994
994
|
}
|
|
995
|
-
return createRenderMap(
|
|
996
|
-
|
|
997
|
-
render("accountsPage.njk", {
|
|
995
|
+
return createRenderMap(`accounts/${snakeCase4(node.name)}.rs`, {
|
|
996
|
+
content: render("accountsPage.njk", {
|
|
998
997
|
account: node,
|
|
999
998
|
anchorTraits,
|
|
1000
999
|
constantSeeds,
|
|
@@ -1006,19 +1005,18 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1006
1005
|
seeds,
|
|
1007
1006
|
typeManifest
|
|
1008
1007
|
})
|
|
1009
|
-
);
|
|
1008
|
+
});
|
|
1010
1009
|
},
|
|
1011
1010
|
visitDefinedType(node) {
|
|
1012
1011
|
const typeManifest = visit4(node, typeManifestVisitor);
|
|
1013
1012
|
const imports = new ImportMap().mergeWithManifest(typeManifest);
|
|
1014
|
-
return createRenderMap(
|
|
1015
|
-
|
|
1016
|
-
render("definedTypesPage.njk", {
|
|
1013
|
+
return createRenderMap(`types/${snakeCase4(node.name)}.rs`, {
|
|
1014
|
+
content: render("definedTypesPage.njk", {
|
|
1017
1015
|
definedType: node,
|
|
1018
1016
|
imports: imports.remove(`generatedTypes::${pascalCase4(node.name)}`).toString(dependencyMap),
|
|
1019
1017
|
typeManifest
|
|
1020
1018
|
})
|
|
1021
|
-
);
|
|
1019
|
+
});
|
|
1022
1020
|
},
|
|
1023
1021
|
visitInstruction(node) {
|
|
1024
1022
|
const imports = new ImportMap();
|
|
@@ -1079,9 +1077,8 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1079
1077
|
const typeManifest = visit4(struct, structVisitor);
|
|
1080
1078
|
const dataTraits = getTraitsFromNode2(node);
|
|
1081
1079
|
imports.mergeWith(dataTraits.imports);
|
|
1082
|
-
return createRenderMap(
|
|
1083
|
-
|
|
1084
|
-
render("instructionsPage.njk", {
|
|
1080
|
+
return createRenderMap(`instructions/${snakeCase4(node.name)}.rs`, {
|
|
1081
|
+
content: render("instructionsPage.njk", {
|
|
1085
1082
|
dataTraits: dataTraits.render,
|
|
1086
1083
|
discriminatorConstants: discriminatorConstants.render,
|
|
1087
1084
|
hasArgs,
|
|
@@ -1092,7 +1089,7 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1092
1089
|
program,
|
|
1093
1090
|
typeManifest
|
|
1094
1091
|
})
|
|
1095
|
-
);
|
|
1092
|
+
});
|
|
1096
1093
|
},
|
|
1097
1094
|
visitProgram(node, { self }) {
|
|
1098
1095
|
program = node;
|
|
@@ -1104,15 +1101,13 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1104
1101
|
}).map((ix) => visit4(ix, self))
|
|
1105
1102
|
]);
|
|
1106
1103
|
if (node.errors.length > 0) {
|
|
1107
|
-
renders = addToRenderMap(
|
|
1108
|
-
|
|
1109
|
-
`errors/${snakeCase4(node.name)}.rs`,
|
|
1110
|
-
render("errorsPage.njk", {
|
|
1104
|
+
renders = addToRenderMap(renders, `errors/${snakeCase4(node.name)}.rs`, {
|
|
1105
|
+
content: render("errorsPage.njk", {
|
|
1111
1106
|
errors: node.errors,
|
|
1112
1107
|
imports: new ImportMap().toString(dependencyMap),
|
|
1113
1108
|
program: node
|
|
1114
1109
|
})
|
|
1115
|
-
);
|
|
1110
|
+
});
|
|
1116
1111
|
}
|
|
1117
1112
|
program = null;
|
|
1118
1113
|
return renders;
|
|
@@ -1135,13 +1130,13 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1135
1130
|
};
|
|
1136
1131
|
return mergeRenderMaps([
|
|
1137
1132
|
createRenderMap({
|
|
1138
|
-
["accounts/mod.rs"]: accountsToExport.length > 0 ? render("accountsMod.njk", ctx) : void 0,
|
|
1139
|
-
["errors/mod.rs"]: programsToExport.length > 0 ? render("errorsMod.njk", ctx) : void 0,
|
|
1140
|
-
["instructions/mod.rs"]: instructionsToExport.length > 0 ? render("instructionsMod.njk", ctx) : void 0,
|
|
1141
|
-
["mod.rs"]: render("rootMod.njk", ctx),
|
|
1142
|
-
["programs.rs"]: programsToExport.length > 0 ? render("programsMod.njk", ctx) : void 0,
|
|
1143
|
-
["shared.rs"]: accountsToExport.length > 0 ? render("sharedPage.njk", ctx) : void 0,
|
|
1144
|
-
["types/mod.rs"]: definedTypesToExport.length > 0 ? render("definedTypesMod.njk", ctx) : void 0
|
|
1133
|
+
["accounts/mod.rs"]: accountsToExport.length > 0 ? { content: render("accountsMod.njk", ctx) } : void 0,
|
|
1134
|
+
["errors/mod.rs"]: programsToExport.length > 0 ? { content: render("errorsMod.njk", ctx) } : void 0,
|
|
1135
|
+
["instructions/mod.rs"]: instructionsToExport.length > 0 ? { content: render("instructionsMod.njk", ctx) } : void 0,
|
|
1136
|
+
["mod.rs"]: { content: render("rootMod.njk", ctx) },
|
|
1137
|
+
["programs.rs"]: programsToExport.length > 0 ? { content: render("programsMod.njk", ctx) } : void 0,
|
|
1138
|
+
["shared.rs"]: accountsToExport.length > 0 ? { content: render("sharedPage.njk", ctx) } : void 0,
|
|
1139
|
+
["types/mod.rs"]: definedTypesToExport.length > 0 ? { content: render("definedTypesMod.njk", ctx) } : void 0
|
|
1145
1140
|
}),
|
|
1146
1141
|
...getAllPrograms(node).map((p) => visit4(p, self))
|
|
1147
1142
|
]);
|
package/dist/index.node.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ImportMap.ts","../src/getRenderMapVisitor.ts","../src/getTypeManifestVisitor.ts","../src/utils/codecs.ts","../src/utils/discriminatorConstant.ts","../src/renderValueNodeVisitor.ts","../src/utils/linkOverrides.ts","../src/utils/render.ts","../src/utils/traitOptions.ts","../src/renderVisitor.ts"],"sourcesContent":["import { TypeManifest } from './getTypeManifestVisitor';\n\nconst DEFAULT_MODULE_MAP: Record<string, string> = {\n generated: 'crate::generated',\n generatedAccounts: 'crate::generated::accounts',\n generatedErrors: 'crate::generated::errors',\n generatedInstructions: 'crate::generated::instructions',\n generatedTypes: 'crate::generated::types',\n hooked: 'crate::hooked',\n mplEssentials: 'mpl_toolbox',\n mplToolbox: 'mpl_toolbox',\n};\n\nexport class ImportMap {\n protected readonly _imports: Set<string> = new Set();\n\n protected readonly _aliases: Map<string, string> = new Map();\n\n get imports(): Set<string> {\n return this._imports;\n }\n\n get aliases(): Map<string, string> {\n return this._aliases;\n }\n\n add(imports: Set<string> | string[] | string): ImportMap {\n const newImports = typeof imports === 'string' ? [imports] : imports;\n newImports.forEach(i => this._imports.add(i));\n return this;\n }\n\n remove(imports: Set<string> | string[] | string): ImportMap {\n const importsToRemove = typeof imports === 'string' ? [imports] : imports;\n importsToRemove.forEach(i => this._imports.delete(i));\n return this;\n }\n\n mergeWith(...others: ImportMap[]): ImportMap {\n others.forEach(other => {\n this.add(other._imports);\n other._aliases.forEach((alias, importName) => this.addAlias(importName, alias));\n });\n return this;\n }\n\n mergeWithManifest(manifest: TypeManifest): ImportMap {\n return this.mergeWith(manifest.imports);\n }\n\n addAlias(importName: string, alias: string): ImportMap {\n this._aliases.set(importName, alias);\n return this;\n }\n\n isEmpty(): boolean {\n return this._imports.size === 0;\n }\n\n resolveDependencyMap(dependencies: Record<string, string>): ImportMap {\n const dependencyMap = { ...DEFAULT_MODULE_MAP, ...dependencies };\n const newImportMap = new ImportMap();\n const resolveDependency = (i: string): string => {\n const dependencyKey = Object.keys(dependencyMap).find(key => i.startsWith(`${key}::`));\n if (!dependencyKey) return i;\n const dependencyValue = dependencyMap[dependencyKey];\n return dependencyValue + i.slice(dependencyKey.length);\n };\n this._imports.forEach(i => newImportMap.add(resolveDependency(i)));\n this._aliases.forEach((alias, i) => newImportMap.addAlias(resolveDependency(i), alias));\n return newImportMap;\n }\n\n toString(dependencies: Record<string, string>): string {\n const resolvedMap = this.resolveDependencyMap(dependencies);\n const importStatements = [...resolvedMap.imports].map(i => {\n const alias = resolvedMap.aliases.get(i);\n if (alias) return `use ${i} as ${alias};`;\n return `use ${i};`;\n });\n return importStatements.join('\\n');\n }\n}\n","import { logWarn } from '@codama/errors';\nimport {\n getAllAccounts,\n getAllDefinedTypes,\n getAllInstructionsWithSubs,\n getAllPrograms,\n InstructionNode,\n isNode,\n isNodeFilter,\n pascalCase,\n ProgramNode,\n resolveNestedTypeNode,\n snakeCase,\n structTypeNodeFromInstructionArgumentNodes,\n VALUE_NODES,\n} from '@codama/nodes';\nimport { addToRenderMap, createRenderMap, mergeRenderMaps } from '@codama/renderers-core';\nimport {\n extendVisitor,\n LinkableDictionary,\n NodeStack,\n pipe,\n recordLinkablesOnFirstVisitVisitor,\n recordNodeStackVisitor,\n staticVisitor,\n visit,\n} from '@codama/visitors-core';\n\nimport { getTypeManifestVisitor } from './getTypeManifestVisitor';\nimport { ImportMap } from './ImportMap';\nimport { renderValueNode } from './renderValueNodeVisitor';\nimport {\n getDiscriminatorConstants,\n getImportFromFactory,\n getTraitsFromNodeFactory,\n LinkOverrides,\n render,\n TraitOptions,\n} from './utils';\n\nexport type GetRenderMapOptions = {\n anchorTraits?: boolean;\n defaultTraitOverrides?: string[];\n dependencyMap?: Record<string, string>;\n linkOverrides?: LinkOverrides;\n renderParentInstructions?: boolean;\n traitOptions?: TraitOptions;\n};\n\nexport function getRenderMapVisitor(options: GetRenderMapOptions = {}) {\n const linkables = new LinkableDictionary();\n const stack = new NodeStack();\n let program: ProgramNode | null = null;\n\n const renderParentInstructions = options.renderParentInstructions ?? false;\n const dependencyMap = options.dependencyMap ?? {};\n const getImportFrom = getImportFromFactory(options.linkOverrides ?? {});\n const getTraitsFromNode = getTraitsFromNodeFactory(options.traitOptions);\n const typeManifestVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n traitOptions: options.traitOptions,\n });\n const anchorTraits = options.anchorTraits ?? true;\n\n return pipe(\n staticVisitor(() => createRenderMap(), {\n keys: ['rootNode', 'programNode', 'instructionNode', 'accountNode', 'definedTypeNode'],\n }),\n v =>\n extendVisitor(v, {\n visitAccount(node) {\n const typeManifest = visit(node, typeManifestVisitor);\n\n // Discriminator constants.\n const fields = resolveNestedTypeNode(node.data).fields;\n const discriminatorConstants = getDiscriminatorConstants({\n discriminatorNodes: node.discriminators ?? [],\n fields,\n getImportFrom,\n prefix: node.name,\n typeManifestVisitor,\n });\n\n // Seeds.\n const seedsImports = new ImportMap();\n const pda = node.pda ? linkables.get([...stack.getPath(), node.pda]) : undefined;\n const pdaSeeds = pda?.seeds ?? [];\n const seeds = pdaSeeds.map(seed => {\n if (isNode(seed, 'variablePdaSeedNode')) {\n const seedManifest = visit(seed.type, typeManifestVisitor);\n seedsImports.mergeWith(seedManifest.imports);\n const resolvedType = resolveNestedTypeNode(seed.type);\n return { ...seed, resolvedType, typeManifest: seedManifest };\n }\n if (isNode(seed.value, 'programIdValueNode')) {\n return seed;\n }\n const seedManifest = visit(seed.type, typeManifestVisitor);\n const valueManifest = renderValueNode(seed.value, getImportFrom, true);\n seedsImports.mergeWith(valueManifest.imports);\n const resolvedType = resolveNestedTypeNode(seed.type);\n return { ...seed, resolvedType, typeManifest: seedManifest, valueManifest };\n });\n const hasVariableSeeds = pdaSeeds.filter(isNodeFilter('variablePdaSeedNode')).length > 0;\n const constantSeeds = seeds\n .filter(isNodeFilter('constantPdaSeedNode'))\n .filter(seed => !isNode(seed.value, 'programIdValueNode'));\n\n const { imports } = typeManifest;\n\n if (hasVariableSeeds) {\n imports.mergeWith(seedsImports);\n }\n\n return createRenderMap(\n `accounts/${snakeCase(node.name)}.rs`,\n render('accountsPage.njk', {\n account: node,\n anchorTraits,\n constantSeeds,\n discriminatorConstants: discriminatorConstants.render,\n hasVariableSeeds,\n imports: imports\n .mergeWith(discriminatorConstants.imports)\n .remove(`generatedAccounts::${pascalCase(node.name)}`)\n .toString(dependencyMap),\n pda,\n program,\n seeds,\n typeManifest,\n }),\n );\n },\n\n visitDefinedType(node) {\n const typeManifest = visit(node, typeManifestVisitor);\n const imports = new ImportMap().mergeWithManifest(typeManifest);\n\n return createRenderMap(\n `types/${snakeCase(node.name)}.rs`,\n render('definedTypesPage.njk', {\n definedType: node,\n imports: imports.remove(`generatedTypes::${pascalCase(node.name)}`).toString(dependencyMap),\n typeManifest,\n }),\n );\n },\n\n visitInstruction(node) {\n // Imports.\n const imports = new ImportMap();\n\n // canMergeAccountsAndArgs\n const accountsAndArgsConflicts = getConflictsForInstructionAccountsAndArgs(node);\n if (accountsAndArgsConflicts.length > 0) {\n logWarn(\n `[Rust] Accounts and args of instruction [${node.name}] have the following ` +\n `conflicting attributes [${accountsAndArgsConflicts.join(', ')}]. ` +\n `Thus, the conflicting arguments will be suffixed with \"_arg\". ` +\n 'You may want to rename the conflicting attributes.',\n );\n }\n\n // Discriminator constants.\n const discriminatorConstants = getDiscriminatorConstants({\n discriminatorNodes: node.discriminators ?? [],\n fields: node.arguments,\n getImportFrom,\n prefix: node.name,\n typeManifestVisitor,\n });\n\n // Instruction args.\n const instructionArgs: {\n default: boolean;\n innerOptionType: string | null;\n name: string;\n optional: boolean;\n type: string;\n value: string | null;\n }[] = [];\n let hasArgs = false;\n let hasOptional = false;\n\n node.arguments.forEach(argument => {\n const argumentVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n nestedStruct: true,\n parentName: `${pascalCase(node.name)}InstructionData`,\n });\n const manifest = visit(argument.type, argumentVisitor);\n imports.mergeWith(manifest.imports);\n const innerOptionType = isNode(argument.type, 'optionTypeNode')\n ? manifest.type.slice('Option<'.length, -1)\n : null;\n\n const hasDefaultValue = !!argument.defaultValue && isNode(argument.defaultValue, VALUE_NODES);\n let renderValue: string | null = null;\n if (hasDefaultValue) {\n const { imports: argImports, render: value } = renderValueNode(\n argument.defaultValue,\n getImportFrom,\n );\n imports.mergeWith(argImports);\n renderValue = value;\n }\n\n hasArgs = hasArgs || argument.defaultValueStrategy !== 'omitted';\n hasOptional = hasOptional || (hasDefaultValue && argument.defaultValueStrategy !== 'omitted');\n\n const name = accountsAndArgsConflicts.includes(argument.name)\n ? `${argument.name}_arg`\n : argument.name;\n\n instructionArgs.push({\n default: hasDefaultValue && argument.defaultValueStrategy === 'omitted',\n innerOptionType,\n name,\n optional: hasDefaultValue && argument.defaultValueStrategy !== 'omitted',\n type: manifest.type,\n value: renderValue,\n });\n });\n\n const struct = structTypeNodeFromInstructionArgumentNodes(node.arguments);\n const structVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n parentName: `${pascalCase(node.name)}InstructionData`,\n });\n const typeManifest = visit(struct, structVisitor);\n\n const dataTraits = getTraitsFromNode(node);\n imports.mergeWith(dataTraits.imports);\n\n return createRenderMap(\n `instructions/${snakeCase(node.name)}.rs`,\n render('instructionsPage.njk', {\n dataTraits: dataTraits.render,\n discriminatorConstants: discriminatorConstants.render,\n hasArgs,\n hasOptional,\n imports: imports\n .mergeWith(discriminatorConstants.imports)\n .remove(`generatedInstructions::${pascalCase(node.name)}`)\n .toString(dependencyMap),\n instruction: node,\n instructionArgs,\n program,\n typeManifest,\n }),\n );\n },\n\n visitProgram(node, { self }) {\n program = node;\n let renders = mergeRenderMaps([\n ...node.accounts.map(account => visit(account, self)),\n ...node.definedTypes.map(type => visit(type, self)),\n ...getAllInstructionsWithSubs(node, {\n leavesOnly: !renderParentInstructions,\n }).map(ix => visit(ix, self)),\n ]);\n\n // Errors.\n if (node.errors.length > 0) {\n renders = addToRenderMap(\n renders,\n `errors/${snakeCase(node.name)}.rs`,\n render('errorsPage.njk', {\n errors: node.errors,\n imports: new ImportMap().toString(dependencyMap),\n program: node,\n }),\n );\n }\n\n program = null;\n return renders;\n },\n\n visitRoot(node, { self }) {\n const programsToExport = getAllPrograms(node);\n const accountsToExport = getAllAccounts(node);\n const instructionsToExport = getAllInstructionsWithSubs(node, {\n leavesOnly: !renderParentInstructions,\n });\n const definedTypesToExport = getAllDefinedTypes(node);\n const hasAnythingToExport =\n programsToExport.length > 0 ||\n accountsToExport.length > 0 ||\n instructionsToExport.length > 0 ||\n definedTypesToExport.length > 0;\n\n const ctx = {\n accountsToExport,\n definedTypesToExport,\n hasAnythingToExport,\n instructionsToExport,\n programsToExport,\n root: node,\n };\n\n return mergeRenderMaps([\n createRenderMap({\n ['accounts/mod.rs']:\n accountsToExport.length > 0 ? render('accountsMod.njk', ctx) : undefined,\n ['errors/mod.rs']: programsToExport.length > 0 ? render('errorsMod.njk', ctx) : undefined,\n ['instructions/mod.rs']:\n instructionsToExport.length > 0 ? render('instructionsMod.njk', ctx) : undefined,\n ['mod.rs']: render('rootMod.njk', ctx),\n ['programs.rs']: programsToExport.length > 0 ? render('programsMod.njk', ctx) : undefined,\n ['shared.rs']: accountsToExport.length > 0 ? render('sharedPage.njk', ctx) : undefined,\n ['types/mod.rs']:\n definedTypesToExport.length > 0 ? render('definedTypesMod.njk', ctx) : undefined,\n }),\n ...getAllPrograms(node).map(p => visit(p, self)),\n ]);\n },\n }),\n v => recordNodeStackVisitor(v, stack),\n v => recordLinkablesOnFirstVisitVisitor(v, linkables),\n );\n}\n\nfunction getConflictsForInstructionAccountsAndArgs(instruction: InstructionNode): string[] {\n const allNames = [\n ...instruction.accounts.map(account => account.name),\n ...instruction.arguments.map(argument => argument.name),\n ];\n const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);\n return [...new Set(duplicates)];\n}\n","import { CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, CodamaError } from '@codama/errors';\nimport {\n AccountNode,\n arrayTypeNode,\n CountNode,\n DefinedTypeNode,\n definedTypeNode,\n fixedCountNode,\n InstructionNode,\n isNode,\n NumberTypeNode,\n numberTypeNode,\n parseDocs,\n pascalCase,\n prefixedCountNode,\n REGISTERED_TYPE_NODE_KINDS,\n remainderCountNode,\n resolveNestedTypeNode,\n snakeCase,\n} from '@codama/nodes';\nimport { extendVisitor, mergeVisitor, pipe, visit } from '@codama/visitors-core';\n\nimport { ImportMap } from './ImportMap';\nimport {\n GetImportFromFunction,\n getSerdeFieldAttribute,\n GetTraitsFromNodeFunction,\n rustDocblock,\n TraitOptions,\n} from './utils';\n\nexport type TypeManifest = {\n imports: ImportMap;\n nestedStructs: string[];\n type: string;\n};\n\nexport function getTypeManifestVisitor(options: {\n getImportFrom: GetImportFromFunction;\n getTraitsFromNode: GetTraitsFromNodeFunction;\n nestedStruct?: boolean;\n parentName?: string | null;\n traitOptions?: TraitOptions;\n}) {\n const { getImportFrom, getTraitsFromNode, traitOptions } = options;\n let parentName: string | null = options.parentName ?? null;\n let nestedStruct: boolean = options.nestedStruct ?? false;\n let inlineStruct: boolean = false;\n let parentSize: NumberTypeNode | number | null = null;\n let parentNode: AccountNode | DefinedTypeNode | InstructionNode | null = null;\n\n return pipe(\n mergeVisitor(\n (): TypeManifest => ({ imports: new ImportMap(), nestedStructs: [], type: '' }),\n (_, values) => ({\n ...mergeManifests(values),\n type: values.map(v => v.type).join('\\n'),\n }),\n { keys: [...REGISTERED_TYPE_NODE_KINDS, 'definedTypeLinkNode', 'definedTypeNode', 'accountNode'] },\n ),\n v =>\n extendVisitor(v, {\n visitAccount(account, { self }) {\n parentName = pascalCase(account.name);\n parentNode = account;\n const manifest = visit(account.data, self);\n const traits = getTraitsFromNode(account);\n manifest.imports.mergeWith(traits.imports);\n parentName = null;\n parentNode = null;\n return {\n ...manifest,\n type: traits.render + manifest.type,\n };\n },\n\n visitArrayType(arrayType, { self }) {\n const childManifest = visit(arrayType.item, self);\n\n if (isNode(arrayType.count, 'fixedCountNode')) {\n return {\n ...childManifest,\n type: `[${childManifest.type}; ${arrayType.count.value}]`,\n };\n }\n\n if (isNode(arrayType.count, 'remainderCountNode')) {\n childManifest.imports.add('kaigan::types::RemainderVec');\n return {\n ...childManifest,\n type: `RemainderVec<${childManifest.type}>`,\n };\n }\n\n const prefix = resolveNestedTypeNode(arrayType.count.prefix);\n if (prefix.endian === 'le') {\n switch (prefix.format) {\n case 'u32':\n return {\n ...childManifest,\n type: `Vec<${childManifest.type}>`,\n };\n case 'u8':\n case 'u16':\n case 'u64': {\n const prefixFormat = prefix.format.toUpperCase();\n childManifest.imports.add(`kaigan::types::${prefixFormat}PrefixVec`);\n return {\n ...childManifest,\n type: `${prefixFormat}PrefixVec<${childManifest.type}>`,\n };\n }\n case 'shortU16': {\n childManifest.imports.add('solana_short_vec::ShortVec');\n return {\n ...childManifest,\n type: `ShortVec<${childManifest.type}>`,\n };\n }\n default:\n throw new Error(`Array prefix not supported: ${prefix.format}`);\n }\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Array size not supported by Borsh');\n },\n\n visitBooleanType(booleanType) {\n const resolvedSize = resolveNestedTypeNode(booleanType.size);\n if (resolvedSize.format === 'u8' && resolvedSize.endian === 'le') {\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: 'bool',\n };\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Bool size not supported by Borsh');\n },\n\n visitBytesType(_bytesType, { self }) {\n let arraySize: CountNode = remainderCountNode();\n if (typeof parentSize === 'number') {\n arraySize = fixedCountNode(parentSize);\n } else if (parentSize && typeof parentSize === 'object') {\n arraySize = prefixedCountNode(parentSize);\n }\n const arrayType = arrayTypeNode(numberTypeNode('u8'), arraySize);\n return visit(arrayType, self);\n },\n\n visitDefinedType(definedType, { self }) {\n parentName = pascalCase(definedType.name);\n parentNode = definedType;\n const manifest = visit(definedType.type, self);\n const traits = getTraitsFromNode(definedType);\n manifest.imports.mergeWith(traits.imports);\n parentName = null;\n parentNode = null;\n\n const renderedType = isNode(definedType.type, ['enumTypeNode', 'structTypeNode'])\n ? manifest.type\n : `pub type ${pascalCase(definedType.name)} = ${manifest.type};`;\n\n return { ...manifest, type: `${traits.render}${renderedType}` };\n },\n\n visitDefinedTypeLink(node) {\n const pascalCaseDefinedType = pascalCase(node.name);\n const importFrom = getImportFrom(node);\n return {\n imports: new ImportMap().add(`${importFrom}::${pascalCaseDefinedType}`),\n nestedStructs: [],\n type: pascalCaseDefinedType,\n };\n },\n\n visitEnumEmptyVariantType(enumEmptyVariantType) {\n const name = pascalCase(enumEmptyVariantType.name);\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: `${name},`,\n };\n },\n\n visitEnumStructVariantType(enumStructVariantType, { self }) {\n const name = pascalCase(enumStructVariantType.name);\n const originalParentName = parentName;\n\n if (!originalParentName) {\n throw new Error('Enum struct variant type must have a parent name.');\n }\n\n inlineStruct = true;\n parentName = pascalCase(originalParentName) + name;\n const typeManifest = visit(enumStructVariantType.struct, self);\n inlineStruct = false;\n parentName = originalParentName;\n\n return {\n ...typeManifest,\n type: `${name} ${typeManifest.type},`,\n };\n },\n\n visitEnumTupleVariantType(enumTupleVariantType, { self }) {\n const name = pascalCase(enumTupleVariantType.name);\n const originalParentName = parentName;\n\n if (!originalParentName) {\n throw new Error('Enum struct variant type must have a parent name.');\n }\n\n parentName = pascalCase(originalParentName) + name;\n const childManifest = visit(enumTupleVariantType.tuple, self);\n parentName = originalParentName;\n\n let derive = '';\n if (parentNode && childManifest.type === '(Pubkey)') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::DisplayFromStr>',\n parentNode,\n traitOptions,\n );\n } else if (parentNode && childManifest.type === '(Vec<Pubkey>)') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<Vec<serde_with::DisplayFromStr>>',\n parentNode,\n traitOptions,\n );\n }\n\n return {\n ...childManifest,\n type: `${derive}${name}${childManifest.type},`,\n };\n },\n\n visitEnumType(enumType, { self }) {\n const originalParentName = parentName;\n if (!originalParentName) {\n // TODO: Add to the Rust validator.\n throw new Error('Enum type must have a parent name.');\n }\n\n const variants = enumType.variants.map(variant => visit(variant, self));\n const variantNames = variants.map(variant => variant.type).join('\\n');\n const mergedManifest = mergeManifests(variants);\n\n return {\n ...mergedManifest,\n type: `pub enum ${pascalCase(originalParentName)} {\\n${variantNames}\\n}`,\n };\n },\n\n visitFixedSizeType(fixedSizeType, { self }) {\n parentSize = fixedSizeType.size;\n const manifest = visit(fixedSizeType.type, self);\n parentSize = null;\n return manifest;\n },\n\n visitMapType(mapType, { self }) {\n const key = visit(mapType.key, self);\n const value = visit(mapType.value, self);\n const mergedManifest = mergeManifests([key, value]);\n mergedManifest.imports.add('std::collections::HashMap');\n return {\n ...mergedManifest,\n type: `HashMap<${key.type}, ${value.type}>`,\n };\n },\n\n visitNumberType(numberType) {\n if (numberType.endian !== 'le') {\n // TODO: Add to the Rust validator.\n throw new Error('Number endianness not supported by Borsh');\n }\n\n if (numberType.format === 'shortU16') {\n return {\n imports: new ImportMap().add('solana_short_vec::ShortU16'),\n nestedStructs: [],\n type: 'ShortU16',\n };\n }\n\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: numberType.format,\n };\n },\n\n visitOptionType(optionType, { self }) {\n const childManifest = visit(optionType.item, self);\n\n const optionPrefix = resolveNestedTypeNode(optionType.prefix);\n if (optionPrefix.format === 'u8' && optionPrefix.endian === 'le') {\n return {\n ...childManifest,\n type: `Option<${childManifest.type}>`,\n };\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Option size not supported by Borsh');\n },\n\n visitPublicKeyType() {\n return {\n imports: new ImportMap().add('solana_pubkey::Pubkey'),\n nestedStructs: [],\n type: 'Pubkey',\n };\n },\n\n visitRemainderOptionType(node) {\n throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });\n },\n\n visitSetType(setType, { self }) {\n const childManifest = visit(setType.item, self);\n childManifest.imports.add('std::collections::HashSet');\n return {\n ...childManifest,\n type: `HashSet<${childManifest.type}>`,\n };\n },\n\n visitSizePrefixType(sizePrefixType, { self }) {\n parentSize = resolveNestedTypeNode(sizePrefixType.prefix);\n const manifest = visit(sizePrefixType.type, self);\n parentSize = null;\n return manifest;\n },\n\n visitStringType() {\n if (!parentSize) {\n return {\n imports: new ImportMap().add(`kaigan::types::RemainderStr`),\n nestedStructs: [],\n type: `RemainderStr`,\n };\n }\n\n if (typeof parentSize === 'number') {\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: `[u8; ${parentSize}]`,\n };\n }\n\n if (isNode(parentSize, 'numberTypeNode') && parentSize.endian === 'le') {\n switch (parentSize.format) {\n case 'u32':\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: 'String',\n };\n case 'u8':\n case 'u16':\n case 'u64': {\n const prefix = parentSize.format.toUpperCase();\n return {\n imports: new ImportMap().add(`kaigan::types::${prefix}PrefixString`),\n nestedStructs: [],\n type: `${prefix}PrefixString`,\n };\n }\n default:\n throw new Error(`'String size not supported: ${parentSize.format}`);\n }\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('String size not supported by Borsh');\n },\n\n visitStructFieldType(structFieldType, { self }) {\n const originalParentName = parentName;\n const originalInlineStruct = inlineStruct;\n const originalNestedStruct = nestedStruct;\n\n if (!originalParentName) {\n throw new Error('Struct field type must have a parent name.');\n }\n\n parentName = pascalCase(originalParentName) + pascalCase(structFieldType.name);\n nestedStruct = true;\n inlineStruct = false;\n\n const fieldManifest = visit(structFieldType.type, self);\n\n parentName = originalParentName;\n inlineStruct = originalInlineStruct;\n nestedStruct = originalNestedStruct;\n\n const fieldName = snakeCase(structFieldType.name);\n const docblock = rustDocblock(parseDocs(structFieldType.docs));\n const resolvedNestedType = resolveNestedTypeNode(structFieldType.type);\n\n let derive = '';\n if (parentNode) {\n if (fieldManifest.type === 'Pubkey') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::DisplayFromStr>',\n parentNode,\n traitOptions,\n );\n } else if (fieldManifest.type === 'Vec<Pubkey>') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<Vec<serde_with::DisplayFromStr>>',\n parentNode,\n traitOptions,\n );\n } else if (\n isNode(resolvedNestedType, 'arrayTypeNode') &&\n isNode(resolvedNestedType.count, 'fixedCountNode') &&\n resolvedNestedType.count.value > 32\n ) {\n derive = getSerdeFieldAttribute('serde_big_array::BigArray', parentNode, traitOptions);\n } else if (\n isNode(resolvedNestedType, ['bytesTypeNode', 'stringTypeNode']) &&\n isNode(structFieldType.type, 'fixedSizeTypeNode') &&\n structFieldType.type.size > 32\n ) {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::Bytes>',\n parentNode,\n traitOptions,\n );\n }\n }\n\n return {\n ...fieldManifest,\n type: inlineStruct\n ? `${docblock}${derive}${fieldName}: ${fieldManifest.type},`\n : `${docblock}${derive}pub ${fieldName}: ${fieldManifest.type},`,\n };\n },\n\n visitStructType(structType, { self }) {\n const originalParentName = parentName;\n\n if (!originalParentName) {\n // TODO: Add to the Rust validator.\n throw new Error('Struct type must have a parent name.');\n }\n\n const fields = structType.fields.map(field => visit(field, self));\n const fieldTypes = fields.map(field => field.type).join('\\n');\n const mergedManifest = mergeManifests(fields);\n\n if (nestedStruct) {\n const nestedTraits = getTraitsFromNode(\n definedTypeNode({ name: originalParentName, type: structType }),\n );\n mergedManifest.imports.mergeWith(nestedTraits.imports);\n return {\n ...mergedManifest,\n nestedStructs: [\n ...mergedManifest.nestedStructs,\n `${nestedTraits.render}pub struct ${pascalCase(originalParentName)} {\\n${fieldTypes}\\n}`,\n ],\n type: pascalCase(originalParentName),\n };\n }\n\n if (inlineStruct) {\n return { ...mergedManifest, type: `{\\n${fieldTypes}\\n}` };\n }\n\n return {\n ...mergedManifest,\n type: `pub struct ${pascalCase(originalParentName)} {\\n${fieldTypes}\\n}`,\n };\n },\n\n visitTupleType(tupleType, { self }) {\n const items = tupleType.items.map(item => visit(item, self));\n const mergedManifest = mergeManifests(items);\n\n return {\n ...mergedManifest,\n type: `(${items.map(item => item.type).join(', ')})`,\n };\n },\n\n visitZeroableOptionType(node) {\n throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });\n },\n }),\n );\n}\n\nfunction mergeManifests(manifests: TypeManifest[]): Pick<TypeManifest, 'imports' | 'nestedStructs'> {\n return {\n imports: new ImportMap().mergeWith(...manifests.map(td => td.imports)),\n nestedStructs: manifests.flatMap(m => m.nestedStructs),\n };\n}\n","import { BytesValueNode } from '@codama/nodes';\nimport { getBase16Encoder, getBase58Encoder, getBase64Encoder, getUtf8Encoder } from '@solana/codecs-strings';\n\nexport function getBytesFromBytesValueNode(node: BytesValueNode): Uint8Array {\n switch (node.encoding) {\n case 'utf8':\n return getUtf8Encoder().encode(node.data) as Uint8Array;\n case 'base16':\n return getBase16Encoder().encode(node.data) as Uint8Array;\n case 'base58':\n return getBase58Encoder().encode(node.data) as Uint8Array;\n case 'base64':\n default:\n return getBase64Encoder().encode(node.data) as Uint8Array;\n }\n}\n","import {\n camelCase,\n ConstantDiscriminatorNode,\n DiscriminatorNode,\n FieldDiscriminatorNode,\n InstructionArgumentNode,\n isNode,\n isNodeFilter,\n snakeCase,\n StructFieldTypeNode,\n VALUE_NODES,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\n\nimport { getTypeManifestVisitor, TypeManifest } from '../getTypeManifestVisitor';\nimport { ImportMap } from '../ImportMap';\nimport { renderValueNode } from '../renderValueNodeVisitor';\nimport { GetImportFromFunction } from './linkOverrides';\n\ntype Fragment = { imports: ImportMap; render: string };\n\nfunction mergeFragments(fragments: Fragment[], merge: (parts: string[]) => string): Fragment {\n const imports = fragments.reduce((acc, frag) => acc.mergeWith(frag.imports), new ImportMap());\n const render = merge(fragments.map(frag => frag.render));\n return { imports, render };\n}\n\nexport function getDiscriminatorConstants(scope: {\n discriminatorNodes: DiscriminatorNode[];\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n}): Fragment {\n const fragments = scope.discriminatorNodes\n .map(node => getDiscriminatorConstant(node, scope))\n .filter(Boolean) as Fragment[];\n\n return mergeFragments(fragments, r => r.join('\\n\\n'));\n}\n\nfunction getDiscriminatorConstant(\n discriminatorNode: DiscriminatorNode,\n scope: {\n discriminatorNodes: DiscriminatorNode[];\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n) {\n switch (discriminatorNode.kind) {\n case 'constantDiscriminatorNode':\n return getConstantDiscriminatorConstant(discriminatorNode, scope);\n case 'fieldDiscriminatorNode':\n return getFieldDiscriminatorConstant(discriminatorNode, scope);\n default:\n return null;\n }\n}\n\nfunction getConstantDiscriminatorConstant(\n discriminatorNode: ConstantDiscriminatorNode,\n scope: {\n discriminatorNodes: DiscriminatorNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n): Fragment {\n const { discriminatorNodes, getImportFrom, prefix, typeManifestVisitor } = scope;\n\n const index = discriminatorNodes.filter(isNodeFilter('constantDiscriminatorNode')).indexOf(discriminatorNode);\n const suffix = index <= 0 ? '' : `_${index + 1}`;\n\n const name = camelCase(`${prefix}_discriminator${suffix}`);\n const typeManifest = visit(discriminatorNode.constant.type, typeManifestVisitor);\n const value = renderValueNode(discriminatorNode.constant.value, getImportFrom);\n return getConstant(name, typeManifest, value);\n}\n\nfunction getFieldDiscriminatorConstant(\n discriminatorNode: FieldDiscriminatorNode,\n scope: {\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n): Fragment | null {\n const { fields, prefix, getImportFrom, typeManifestVisitor } = scope;\n\n const field = fields.find(f => f.name === discriminatorNode.name);\n if (!field || !field.defaultValue || !isNode(field.defaultValue, VALUE_NODES)) {\n return null;\n }\n\n const name = camelCase(`${prefix}_${discriminatorNode.name}`);\n const typeManifest = visit(field.type, typeManifestVisitor);\n const value = renderValueNode(field.defaultValue, getImportFrom);\n return getConstant(name, typeManifest, value);\n}\n\nfunction getConstant(name: string, typeManifest: TypeManifest, value: Fragment): Fragment {\n const type: Fragment = { imports: typeManifest.imports, render: typeManifest.type };\n return mergeFragments([type, value], ([t, v]) => `pub const ${snakeCase(name).toUpperCase()}: ${t} = ${v};`);\n}\n","import {\n arrayValueNode,\n bytesValueNode,\n isNode,\n numberValueNode,\n pascalCase,\n RegisteredValueNode,\n ValueNode,\n} from '@codama/nodes';\nimport { visit, Visitor } from '@codama/visitors-core';\n\nimport { ImportMap } from './ImportMap';\nimport { getBytesFromBytesValueNode, GetImportFromFunction } from './utils';\n\nexport function renderValueNode(\n value: ValueNode,\n getImportFrom: GetImportFromFunction,\n useStr: boolean = false,\n): {\n imports: ImportMap;\n render: string;\n} {\n return visit(value, renderValueNodeVisitor(getImportFrom, useStr));\n}\n\nexport function renderValueNodeVisitor(\n getImportFrom: GetImportFromFunction,\n useStr: boolean = false,\n): Visitor<\n {\n imports: ImportMap;\n render: string;\n },\n RegisteredValueNode['kind']\n> {\n return {\n visitArrayValue(node) {\n const list = node.items.map(v => visit(v, this));\n return {\n imports: new ImportMap().mergeWith(...list.map(c => c.imports)),\n render: `[${list.map(c => c.render).join(', ')}]`,\n };\n },\n visitBooleanValue(node) {\n return {\n imports: new ImportMap(),\n render: JSON.stringify(node.boolean),\n };\n },\n visitBytesValue(node) {\n const bytes = getBytesFromBytesValueNode(node);\n const numbers = Array.from(bytes).map(numberValueNode);\n return visit(arrayValueNode(numbers), this);\n },\n visitConstantValue(node) {\n if (isNode(node.value, 'bytesValueNode')) {\n return visit(node.value, this);\n }\n if (isNode(node.type, 'stringTypeNode') && isNode(node.value, 'stringValueNode')) {\n return visit(bytesValueNode(node.type.encoding, node.value.string), this);\n }\n if (isNode(node.type, 'numberTypeNode') && isNode(node.value, 'numberValueNode')) {\n const numberManifest = visit(node.value, this);\n const { format, endian } = node.type;\n const byteFunction = endian === 'le' ? 'to_le_bytes' : 'to_be_bytes';\n numberManifest.render = `${numberManifest.render}${format}.${byteFunction}()`;\n return numberManifest;\n }\n throw new Error('Unsupported constant value type.');\n },\n visitEnumValue(node) {\n const imports = new ImportMap();\n const enumName = pascalCase(node.enum.name);\n const variantName = pascalCase(node.variant);\n const importFrom = getImportFrom(node.enum);\n imports.add(`${importFrom}::${enumName}`);\n if (!node.value) {\n return { imports, render: `${enumName}::${variantName}` };\n }\n const enumValue = visit(node.value, this);\n const fields = enumValue.render;\n return {\n imports: imports.mergeWith(enumValue.imports),\n render: `${enumName}::${variantName} ${fields}`,\n };\n },\n visitMapEntryValue(node) {\n const mapKey = visit(node.key, this);\n const mapValue = visit(node.value, this);\n return {\n imports: mapKey.imports.mergeWith(mapValue.imports),\n render: `[${mapKey.render}, ${mapValue.render}]`,\n };\n },\n visitMapValue(node) {\n const map = node.entries.map(entry => visit(entry, this));\n const imports = new ImportMap().add('std::collection::HashMap');\n return {\n imports: imports.mergeWith(...map.map(c => c.imports)),\n render: `HashMap::from([${map.map(c => c.render).join(', ')}])`,\n };\n },\n visitNoneValue() {\n return {\n imports: new ImportMap(),\n render: 'None',\n };\n },\n visitNumberValue(node) {\n return {\n imports: new ImportMap(),\n render: node.number.toString(),\n };\n },\n visitPublicKeyValue(node) {\n return {\n imports: new ImportMap().add('solana_pubkey'),\n render: `pubkey!(\"${node.publicKey}\")`,\n };\n },\n visitSetValue(node) {\n const set = node.items.map(v => visit(v, this));\n const imports = new ImportMap().add('std::collection::HashSet');\n return {\n imports: imports.mergeWith(...set.map(c => c.imports)),\n render: `HashSet::from([${set.map(c => c.render).join(', ')}])`,\n };\n },\n visitSomeValue(node) {\n const child = visit(node.value, this);\n return {\n ...child,\n render: `Some(${child.render})`,\n };\n },\n visitStringValue(node) {\n return {\n imports: new ImportMap(),\n render: useStr ? `${JSON.stringify(node.string)}` : `String::from(${JSON.stringify(node.string)})`,\n };\n },\n visitStructFieldValue(node) {\n const structValue = visit(node.value, this);\n return {\n imports: structValue.imports,\n render: `${node.name}: ${structValue.render}`,\n };\n },\n visitStructValue(node) {\n const struct = node.fields.map(field => visit(field, this));\n return {\n imports: new ImportMap().mergeWith(...struct.map(c => c.imports)),\n render: `{ ${struct.map(c => c.render).join(', ')} }`,\n };\n },\n visitTupleValue(node) {\n const tuple = node.items.map(v => visit(v, this));\n return {\n imports: new ImportMap().mergeWith(...tuple.map(c => c.imports)),\n render: `(${tuple.map(c => c.render).join(', ')})`,\n };\n },\n };\n}\n","import { CODAMA_ERROR__UNEXPECTED_NODE_KIND, CodamaError } from '@codama/errors';\nimport {\n AccountLinkNode,\n DefinedTypeLinkNode,\n InstructionLinkNode,\n PdaLinkNode,\n ProgramLinkNode,\n ResolverValueNode,\n} from '@codama/nodes';\n\nexport type LinkOverrides = {\n accounts?: Record<string, string>;\n definedTypes?: Record<string, string>;\n instructions?: Record<string, string>;\n pdas?: Record<string, string>;\n programs?: Record<string, string>;\n resolvers?: Record<string, string>;\n};\n\ntype OverridableNodes =\n | AccountLinkNode\n | DefinedTypeLinkNode\n | InstructionLinkNode\n | PdaLinkNode\n | ProgramLinkNode\n | ResolverValueNode;\n\nexport type GetImportFromFunction = (node: OverridableNodes, fallback?: string) => string;\n\nexport function getImportFromFactory(overrides: LinkOverrides): GetImportFromFunction {\n const linkOverrides = {\n accounts: overrides.accounts ?? {},\n definedTypes: overrides.definedTypes ?? {},\n instructions: overrides.instructions ?? {},\n pdas: overrides.pdas ?? {},\n programs: overrides.programs ?? {},\n resolvers: overrides.resolvers ?? {},\n };\n\n return (node: OverridableNodes) => {\n const kind = node.kind;\n switch (kind) {\n case 'accountLinkNode':\n return linkOverrides.accounts[node.name] ?? 'generatedAccounts';\n case 'definedTypeLinkNode':\n return linkOverrides.definedTypes[node.name] ?? 'generatedTypes';\n case 'instructionLinkNode':\n return linkOverrides.instructions[node.name] ?? 'generatedInstructions';\n case 'pdaLinkNode':\n return linkOverrides.pdas[node.name] ?? 'generatedAccounts';\n case 'programLinkNode':\n return linkOverrides.programs[node.name] ?? 'generatedPrograms';\n case 'resolverValueNode':\n return linkOverrides.resolvers[node.name] ?? 'hooked';\n default:\n throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n expectedKinds: [\n 'AccountLinkNode',\n 'DefinedTypeLinkNode',\n 'InstructionLinkNode',\n 'PdaLinkNode',\n 'ProgramLinkNode',\n 'resolverValueNode',\n ],\n kind: kind satisfies never,\n node,\n });\n }\n };\n}\n","import { dirname as pathDirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { camelCase, kebabCase, pascalCase, snakeCase, titleCase } from '@codama/nodes';\nimport nunjucks, { ConfigureOptions as NunJucksOptions } from 'nunjucks';\n\nexport function rustDocblock(docs: string[]): string {\n if (docs.length <= 0) return '';\n const lines = docs.map(doc => `/// ${doc}`);\n return `${lines.join('\\n')}\\n`;\n}\n\nexport const render = (template: string, context?: object, options?: NunJucksOptions): string => {\n // @ts-expect-error import.meta will be used in the right environment.\n const dirname = __ESM__ ? pathDirname(fileURLToPath(import.meta.url)) : __dirname;\n const templates = __TEST__ ? join(dirname, '..', '..', 'public', 'templates') : join(dirname, 'templates'); // Path to templates from bundled output file.\n const env = nunjucks.configure(templates, { autoescape: false, trimBlocks: true, ...options });\n env.addFilter('pascalCase', pascalCase);\n env.addFilter('camelCase', camelCase);\n env.addFilter('snakeCase', snakeCase);\n env.addFilter('kebabCase', kebabCase);\n env.addFilter('titleCase', titleCase);\n env.addFilter('rustDocblock', rustDocblock);\n // Returns whether or not the provided traits are implemented on the type.\n env.addFilter('hasTrait', (traits: string, ...traitNames: string[]) => {\n if (typeof traits !== 'string') return false;\n return traitNames.some(traitName => traits.includes(traitName));\n });\n return env.render(template, context);\n};\n","import {\n AccountNode,\n assertIsNode,\n camelCase,\n DefinedTypeNode,\n InstructionNode,\n isNode,\n isScalarEnum,\n} from '@codama/nodes';\n\nimport { ImportMap } from '../ImportMap';\n\nexport type TraitOptions = {\n /** The default traits to implement for all types. */\n baseDefaults?: string[];\n /**\n * The default traits to implement for data enums only — on top of the base defaults.\n * Data enums are enums with at least one non-unit variant.\n */\n dataEnumDefaults?: string[];\n /**\n * The mapping of feature flags to traits.\n * For each entry, the traits will be rendered within a\n * `#[cfg_attr(feature = \"feature_name\", derive(Traits))]` attribute.\n */\n featureFlags?: Record<string, string[]>;\n /** The complete trait overrides of specific types. */\n overrides?: Record<string, string[]>;\n /**\n * The default traits to implement for scalar enums only — on top of the base defaults.\n * Scalar enums are enums with no variants or only unit variants.\n */\n scalarEnumDefaults?: string[];\n /** The default traits to implement for structs only — on top of the base defaults. */\n structDefaults?: string[];\n /** Whether or not to use the fully qualified name for traits, instead of importing them. */\n useFullyQualifiedName?: boolean;\n};\n\nexport const DEFAULT_TRAIT_OPTIONS: Required<TraitOptions> = {\n baseDefaults: [\n 'borsh::BorshSerialize',\n 'borsh::BorshDeserialize',\n 'serde::Serialize',\n 'serde::Deserialize',\n 'Clone',\n 'Debug',\n 'Eq',\n 'PartialEq',\n ],\n dataEnumDefaults: [],\n featureFlags: { serde: ['serde::Serialize', 'serde::Deserialize'] },\n overrides: {},\n scalarEnumDefaults: ['Copy', 'PartialOrd', 'Hash', 'num_derive::FromPrimitive'],\n structDefaults: [],\n useFullyQualifiedName: false,\n};\n\nexport type GetTraitsFromNodeFunction = (node: AccountNode | DefinedTypeNode | InstructionNode) => {\n imports: ImportMap;\n render: string;\n};\n\nexport function getTraitsFromNodeFactory(options: TraitOptions = {}): GetTraitsFromNodeFunction {\n return node => getTraitsFromNode(node, options);\n}\n\nexport function getTraitsFromNode(\n node: AccountNode | DefinedTypeNode | InstructionNode,\n userOptions: TraitOptions = {},\n): { imports: ImportMap; render: string } {\n assertIsNode(node, ['accountNode', 'definedTypeNode', 'instructionNode']);\n const options: Required<TraitOptions> = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };\n\n // Get the node type and return early if it's a type alias.\n const nodeType = getNodeType(node);\n if (nodeType === 'alias') {\n return { imports: new ImportMap(), render: '' };\n }\n\n // Find all the FQN traits for the node.\n const sanitizedOverrides = Object.fromEntries(\n Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value]),\n );\n const nodeOverrides: string[] | undefined = sanitizedOverrides[node.name];\n const allTraits = nodeOverrides === undefined ? getDefaultTraits(nodeType, options) : nodeOverrides;\n\n // Wrap the traits in feature flags if necessary.\n const partitionedTraits = partitionTraitsInFeatures(allTraits, options.featureFlags);\n let unfeaturedTraits = partitionedTraits[0];\n const featuredTraits = partitionedTraits[1];\n\n // Import the traits if necessary.\n const imports = new ImportMap();\n if (!options.useFullyQualifiedName) {\n unfeaturedTraits = extractFullyQualifiedNames(unfeaturedTraits, imports);\n }\n\n // Render the trait lines.\n const traitLines: string[] = [\n ...(unfeaturedTraits.length > 0 ? [`#[derive(${unfeaturedTraits.join(', ')})]\\n`] : []),\n ...Object.entries(featuredTraits).map(([feature, traits]) => {\n return `#[cfg_attr(feature = \"${feature}\", derive(${traits.join(', ')}))]\\n`;\n }),\n ];\n\n return { imports, render: traitLines.join('') };\n}\n\nfunction getNodeType(\n node: AccountNode | DefinedTypeNode | InstructionNode,\n): 'alias' | 'dataEnum' | 'scalarEnum' | 'struct' {\n if (isNode(node, ['accountNode', 'instructionNode'])) return 'struct';\n if (isNode(node.type, 'structTypeNode')) return 'struct';\n if (isNode(node.type, 'enumTypeNode')) {\n return isScalarEnum(node.type) ? 'scalarEnum' : 'dataEnum';\n }\n return 'alias';\n}\n\nfunction getDefaultTraits(\n nodeType: 'dataEnum' | 'scalarEnum' | 'struct',\n options: Pick<\n Required<TraitOptions>,\n 'baseDefaults' | 'dataEnumDefaults' | 'scalarEnumDefaults' | 'structDefaults'\n >,\n): string[] {\n switch (nodeType) {\n case 'dataEnum':\n return [...options.baseDefaults, ...options.dataEnumDefaults];\n case 'scalarEnum':\n return [...options.baseDefaults, ...options.scalarEnumDefaults];\n case 'struct':\n return [...options.baseDefaults, ...options.structDefaults];\n }\n}\n\nfunction partitionTraitsInFeatures(\n traits: string[],\n featureFlags: Record<string, string[]>,\n): [string[], Record<string, string[]>] {\n // Reverse the feature flags option for quick lookup.\n // If there are any duplicate traits, the first one encountered will be used.\n const reverseFeatureFlags = Object.entries(featureFlags).reduce(\n (acc, [feature, traits]) => {\n for (const trait of traits) {\n if (!acc[trait]) acc[trait] = feature;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const unfeaturedTraits: string[] = [];\n const featuredTraits: Record<string, string[]> = {};\n for (const trait of traits) {\n const feature: string | undefined = reverseFeatureFlags[trait];\n if (feature === undefined) {\n unfeaturedTraits.push(trait);\n } else {\n if (!featuredTraits[feature]) featuredTraits[feature] = [];\n featuredTraits[feature].push(trait);\n }\n }\n\n return [unfeaturedTraits, featuredTraits];\n}\n\nfunction extractFullyQualifiedNames(traits: string[], imports: ImportMap): string[] {\n return traits.map(trait => {\n const index = trait.lastIndexOf('::');\n if (index === -1) return trait;\n imports.add(trait);\n return trait.slice(index + 2);\n });\n}\n\n/**\n * Helper function to get the serde field attribute format based on trait configuration.\n * Returns the appropriate attribute string for serde field customization, or empty string if no serde traits.\n */\nexport function getSerdeFieldAttribute(\n serdeWith: string,\n node: AccountNode | DefinedTypeNode | InstructionNode,\n userOptions: TraitOptions = {},\n): string {\n assertIsNode(node, ['accountNode', 'definedTypeNode', 'instructionNode']);\n const options: Required<TraitOptions> = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };\n\n // Get the node type and return early if it's a type alias.\n const nodeType = getNodeType(node);\n if (nodeType === 'alias') {\n return '';\n }\n\n // Find all the traits for the node.\n const sanitizedOverrides = Object.fromEntries(\n Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value]),\n );\n const nodeOverrides: string[] | undefined = sanitizedOverrides[node.name];\n const allTraits = nodeOverrides === undefined ? getDefaultTraits(nodeType, options) : nodeOverrides;\n\n // Check if serde traits are present.\n const hasSerdeSerialize = allTraits.some(t => t === 'serde::Serialize' || t === 'Serialize');\n const hasSerdeDeserialize = allTraits.some(t => t === 'serde::Deserialize' || t === 'Deserialize');\n\n if (!hasSerdeSerialize && !hasSerdeDeserialize) {\n return '';\n }\n\n // Check if serde is feature-flagged.\n const partitionedTraits = partitionTraitsInFeatures(allTraits, options.featureFlags);\n const featuredTraits = partitionedTraits[1];\n\n // Find which feature flag contains serde traits.\n let serdeFeatureName: string | undefined;\n for (const [feature, traits] of Object.entries(featuredTraits)) {\n if (\n traits.some(\n t => t === 'serde::Serialize' || t === 'serde::Deserialize' || t === 'Serialize' || t === 'Deserialize',\n )\n ) {\n serdeFeatureName = feature;\n break;\n }\n }\n\n if (serdeFeatureName) {\n return `#[cfg_attr(feature = \"${serdeFeatureName}\", serde(with = \"${serdeWith}\"))]\\n`;\n } else {\n return `#[serde(with = \"${serdeWith}\")]\\n`;\n }\n}\n","import { logError, logWarn } from '@codama/errors';\nimport { deleteDirectory, writeRenderMapVisitor } from '@codama/renderers-core';\nimport { rootNodeVisitor, visit } from '@codama/visitors-core';\nimport { spawnSync } from 'child_process';\n\nimport { GetRenderMapOptions, getRenderMapVisitor } from './getRenderMapVisitor';\n\nexport type RenderOptions = GetRenderMapOptions & {\n crateFolder?: string;\n deleteFolderBeforeRendering?: boolean;\n formatCode?: boolean;\n toolchain?: string;\n};\n\nexport function renderVisitor(path: string, options: RenderOptions = {}) {\n return rootNodeVisitor(root => {\n // Delete existing generated folder.\n if (options.deleteFolderBeforeRendering ?? true) {\n deleteDirectory(path);\n }\n\n // Render the new files.\n visit(root, writeRenderMapVisitor(getRenderMapVisitor(options), path));\n\n // format the code\n if (options.formatCode) {\n if (options.crateFolder) {\n const removeFalsy = <T>(arg: T | false | null | undefined): arg is T => Boolean(arg);\n runFormatter(\n 'cargo',\n [options.toolchain, 'fmt', '--manifest-path', `${options.crateFolder}/Cargo.toml`].filter(\n removeFalsy,\n ),\n );\n } else {\n logWarn('No crate folder specified, skipping formatting.');\n }\n }\n });\n}\n\nfunction runFormatter(cmd: string, args: string[]) {\n const { stdout, stderr, error } = spawnSync(cmd, args);\n if (error?.message?.includes('ENOENT')) {\n logWarn(`Could not find ${cmd}, skipping formatting.`);\n return;\n }\n if (stdout.length > 0) {\n logWarn(`(cargo-fmt) ${stdout ? stdout?.toString() : error}`);\n }\n if (stderr.length > 0) {\n logError(`(cargo-fmt) ${stderr ? stderr.toString() : error}`);\n }\n}\n"],"mappings":"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","names":["isNode","isNodeFilter","pascalCase","resolveNestedTypeNode","snakeCase","VALUE_NODES","extendVisitor","pipe","visit","CodamaError","isNode","pascalCase","snakeCase","visit","isNode","visit","render","visit","isNode","camelCase","pascalCase","snakeCase","camelCase","isNode","camelCase","isNode","traits","getTraitsFromNode","pascalCase","visit","isNode","CodamaError","snakeCase","getTraitsFromNode","pipe","extendVisitor","visit","resolveNestedTypeNode","isNode","seedManifest","resolvedType","isNodeFilter","snakeCase","pascalCase","VALUE_NODES","logWarn","visit","visit","logWarn"]}
|
|
1
|
+
{"version":3,"sources":["../src/ImportMap.ts","../src/getRenderMapVisitor.ts","../src/getTypeManifestVisitor.ts","../src/utils/codecs.ts","../src/utils/discriminatorConstant.ts","../src/renderValueNodeVisitor.ts","../src/utils/linkOverrides.ts","../src/utils/render.ts","../src/utils/traitOptions.ts","../src/renderVisitor.ts"],"sourcesContent":["import { TypeManifest } from './getTypeManifestVisitor';\n\nconst DEFAULT_MODULE_MAP: Record<string, string> = {\n generated: 'crate::generated',\n generatedAccounts: 'crate::generated::accounts',\n generatedErrors: 'crate::generated::errors',\n generatedInstructions: 'crate::generated::instructions',\n generatedTypes: 'crate::generated::types',\n hooked: 'crate::hooked',\n mplEssentials: 'mpl_toolbox',\n mplToolbox: 'mpl_toolbox',\n};\n\nexport class ImportMap {\n protected readonly _imports: Set<string> = new Set();\n\n protected readonly _aliases: Map<string, string> = new Map();\n\n get imports(): Set<string> {\n return this._imports;\n }\n\n get aliases(): Map<string, string> {\n return this._aliases;\n }\n\n add(imports: Set<string> | string[] | string): ImportMap {\n const newImports = typeof imports === 'string' ? [imports] : imports;\n newImports.forEach(i => this._imports.add(i));\n return this;\n }\n\n remove(imports: Set<string> | string[] | string): ImportMap {\n const importsToRemove = typeof imports === 'string' ? [imports] : imports;\n importsToRemove.forEach(i => this._imports.delete(i));\n return this;\n }\n\n mergeWith(...others: ImportMap[]): ImportMap {\n others.forEach(other => {\n this.add(other._imports);\n other._aliases.forEach((alias, importName) => this.addAlias(importName, alias));\n });\n return this;\n }\n\n mergeWithManifest(manifest: TypeManifest): ImportMap {\n return this.mergeWith(manifest.imports);\n }\n\n addAlias(importName: string, alias: string): ImportMap {\n this._aliases.set(importName, alias);\n return this;\n }\n\n isEmpty(): boolean {\n return this._imports.size === 0;\n }\n\n resolveDependencyMap(dependencies: Record<string, string>): ImportMap {\n const dependencyMap = { ...DEFAULT_MODULE_MAP, ...dependencies };\n const newImportMap = new ImportMap();\n const resolveDependency = (i: string): string => {\n const dependencyKey = Object.keys(dependencyMap).find(key => i.startsWith(`${key}::`));\n if (!dependencyKey) return i;\n const dependencyValue = dependencyMap[dependencyKey];\n return dependencyValue + i.slice(dependencyKey.length);\n };\n this._imports.forEach(i => newImportMap.add(resolveDependency(i)));\n this._aliases.forEach((alias, i) => newImportMap.addAlias(resolveDependency(i), alias));\n return newImportMap;\n }\n\n toString(dependencies: Record<string, string>): string {\n const resolvedMap = this.resolveDependencyMap(dependencies);\n const importStatements = [...resolvedMap.imports].map(i => {\n const alias = resolvedMap.aliases.get(i);\n if (alias) return `use ${i} as ${alias};`;\n return `use ${i};`;\n });\n return importStatements.join('\\n');\n }\n}\n","import { logWarn } from '@codama/errors';\nimport {\n getAllAccounts,\n getAllDefinedTypes,\n getAllInstructionsWithSubs,\n getAllPrograms,\n InstructionNode,\n isNode,\n isNodeFilter,\n pascalCase,\n ProgramNode,\n resolveNestedTypeNode,\n snakeCase,\n structTypeNodeFromInstructionArgumentNodes,\n VALUE_NODES,\n} from '@codama/nodes';\nimport { addToRenderMap, createRenderMap, mergeRenderMaps } from '@codama/renderers-core';\nimport {\n extendVisitor,\n LinkableDictionary,\n NodeStack,\n pipe,\n recordLinkablesOnFirstVisitVisitor,\n recordNodeStackVisitor,\n staticVisitor,\n visit,\n} from '@codama/visitors-core';\n\nimport { getTypeManifestVisitor } from './getTypeManifestVisitor';\nimport { ImportMap } from './ImportMap';\nimport { renderValueNode } from './renderValueNodeVisitor';\nimport {\n getDiscriminatorConstants,\n getImportFromFactory,\n getTraitsFromNodeFactory,\n LinkOverrides,\n render,\n TraitOptions,\n} from './utils';\n\nexport type GetRenderMapOptions = {\n anchorTraits?: boolean;\n defaultTraitOverrides?: string[];\n dependencyMap?: Record<string, string>;\n linkOverrides?: LinkOverrides;\n renderParentInstructions?: boolean;\n traitOptions?: TraitOptions;\n};\n\nexport function getRenderMapVisitor(options: GetRenderMapOptions = {}) {\n const linkables = new LinkableDictionary();\n const stack = new NodeStack();\n let program: ProgramNode | null = null;\n\n const renderParentInstructions = options.renderParentInstructions ?? false;\n const dependencyMap = options.dependencyMap ?? {};\n const getImportFrom = getImportFromFactory(options.linkOverrides ?? {});\n const getTraitsFromNode = getTraitsFromNodeFactory(options.traitOptions);\n const typeManifestVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n traitOptions: options.traitOptions,\n });\n const anchorTraits = options.anchorTraits ?? true;\n\n return pipe(\n staticVisitor(() => createRenderMap(), {\n keys: ['rootNode', 'programNode', 'instructionNode', 'accountNode', 'definedTypeNode'],\n }),\n v =>\n extendVisitor(v, {\n visitAccount(node) {\n const typeManifest = visit(node, typeManifestVisitor);\n\n // Discriminator constants.\n const fields = resolveNestedTypeNode(node.data).fields;\n const discriminatorConstants = getDiscriminatorConstants({\n discriminatorNodes: node.discriminators ?? [],\n fields,\n getImportFrom,\n prefix: node.name,\n typeManifestVisitor,\n });\n\n // Seeds.\n const seedsImports = new ImportMap();\n const pda = node.pda ? linkables.get([...stack.getPath(), node.pda]) : undefined;\n const pdaSeeds = pda?.seeds ?? [];\n const seeds = pdaSeeds.map(seed => {\n if (isNode(seed, 'variablePdaSeedNode')) {\n const seedManifest = visit(seed.type, typeManifestVisitor);\n seedsImports.mergeWith(seedManifest.imports);\n const resolvedType = resolveNestedTypeNode(seed.type);\n return { ...seed, resolvedType, typeManifest: seedManifest };\n }\n if (isNode(seed.value, 'programIdValueNode')) {\n return seed;\n }\n const seedManifest = visit(seed.type, typeManifestVisitor);\n const valueManifest = renderValueNode(seed.value, getImportFrom, true);\n seedsImports.mergeWith(valueManifest.imports);\n const resolvedType = resolveNestedTypeNode(seed.type);\n return { ...seed, resolvedType, typeManifest: seedManifest, valueManifest };\n });\n const hasVariableSeeds = pdaSeeds.filter(isNodeFilter('variablePdaSeedNode')).length > 0;\n const constantSeeds = seeds\n .filter(isNodeFilter('constantPdaSeedNode'))\n .filter(seed => !isNode(seed.value, 'programIdValueNode'));\n\n const { imports } = typeManifest;\n\n if (hasVariableSeeds) {\n imports.mergeWith(seedsImports);\n }\n\n return createRenderMap(`accounts/${snakeCase(node.name)}.rs`, {\n content: render('accountsPage.njk', {\n account: node,\n anchorTraits,\n constantSeeds,\n discriminatorConstants: discriminatorConstants.render,\n hasVariableSeeds,\n imports: imports\n .mergeWith(discriminatorConstants.imports)\n .remove(`generatedAccounts::${pascalCase(node.name)}`)\n .toString(dependencyMap),\n pda,\n program,\n seeds,\n typeManifest,\n }),\n });\n },\n\n visitDefinedType(node) {\n const typeManifest = visit(node, typeManifestVisitor);\n const imports = new ImportMap().mergeWithManifest(typeManifest);\n\n return createRenderMap(`types/${snakeCase(node.name)}.rs`, {\n content: render('definedTypesPage.njk', {\n definedType: node,\n imports: imports.remove(`generatedTypes::${pascalCase(node.name)}`).toString(dependencyMap),\n typeManifest,\n }),\n });\n },\n\n visitInstruction(node) {\n // Imports.\n const imports = new ImportMap();\n\n // canMergeAccountsAndArgs\n const accountsAndArgsConflicts = getConflictsForInstructionAccountsAndArgs(node);\n if (accountsAndArgsConflicts.length > 0) {\n logWarn(\n `[Rust] Accounts and args of instruction [${node.name}] have the following ` +\n `conflicting attributes [${accountsAndArgsConflicts.join(', ')}]. ` +\n `Thus, the conflicting arguments will be suffixed with \"_arg\". ` +\n 'You may want to rename the conflicting attributes.',\n );\n }\n\n // Discriminator constants.\n const discriminatorConstants = getDiscriminatorConstants({\n discriminatorNodes: node.discriminators ?? [],\n fields: node.arguments,\n getImportFrom,\n prefix: node.name,\n typeManifestVisitor,\n });\n\n // Instruction args.\n const instructionArgs: {\n default: boolean;\n innerOptionType: string | null;\n name: string;\n optional: boolean;\n type: string;\n value: string | null;\n }[] = [];\n let hasArgs = false;\n let hasOptional = false;\n\n node.arguments.forEach(argument => {\n const argumentVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n nestedStruct: true,\n parentName: `${pascalCase(node.name)}InstructionData`,\n });\n const manifest = visit(argument.type, argumentVisitor);\n imports.mergeWith(manifest.imports);\n const innerOptionType = isNode(argument.type, 'optionTypeNode')\n ? manifest.type.slice('Option<'.length, -1)\n : null;\n\n const hasDefaultValue = !!argument.defaultValue && isNode(argument.defaultValue, VALUE_NODES);\n let renderValue: string | null = null;\n if (hasDefaultValue) {\n const { imports: argImports, render: value } = renderValueNode(\n argument.defaultValue,\n getImportFrom,\n );\n imports.mergeWith(argImports);\n renderValue = value;\n }\n\n hasArgs = hasArgs || argument.defaultValueStrategy !== 'omitted';\n hasOptional = hasOptional || (hasDefaultValue && argument.defaultValueStrategy !== 'omitted');\n\n const name = accountsAndArgsConflicts.includes(argument.name)\n ? `${argument.name}_arg`\n : argument.name;\n\n instructionArgs.push({\n default: hasDefaultValue && argument.defaultValueStrategy === 'omitted',\n innerOptionType,\n name,\n optional: hasDefaultValue && argument.defaultValueStrategy !== 'omitted',\n type: manifest.type,\n value: renderValue,\n });\n });\n\n const struct = structTypeNodeFromInstructionArgumentNodes(node.arguments);\n const structVisitor = getTypeManifestVisitor({\n getImportFrom,\n getTraitsFromNode,\n parentName: `${pascalCase(node.name)}InstructionData`,\n });\n const typeManifest = visit(struct, structVisitor);\n\n const dataTraits = getTraitsFromNode(node);\n imports.mergeWith(dataTraits.imports);\n\n return createRenderMap(`instructions/${snakeCase(node.name)}.rs`, {\n content: render('instructionsPage.njk', {\n dataTraits: dataTraits.render,\n discriminatorConstants: discriminatorConstants.render,\n hasArgs,\n hasOptional,\n imports: imports\n .mergeWith(discriminatorConstants.imports)\n .remove(`generatedInstructions::${pascalCase(node.name)}`)\n .toString(dependencyMap),\n instruction: node,\n instructionArgs,\n program,\n typeManifest,\n }),\n });\n },\n\n visitProgram(node, { self }) {\n program = node;\n let renders = mergeRenderMaps([\n ...node.accounts.map(account => visit(account, self)),\n ...node.definedTypes.map(type => visit(type, self)),\n ...getAllInstructionsWithSubs(node, {\n leavesOnly: !renderParentInstructions,\n }).map(ix => visit(ix, self)),\n ]);\n\n // Errors.\n if (node.errors.length > 0) {\n renders = addToRenderMap(renders, `errors/${snakeCase(node.name)}.rs`, {\n content: render('errorsPage.njk', {\n errors: node.errors,\n imports: new ImportMap().toString(dependencyMap),\n program: node,\n }),\n });\n }\n\n program = null;\n return renders;\n },\n\n visitRoot(node, { self }) {\n const programsToExport = getAllPrograms(node);\n const accountsToExport = getAllAccounts(node);\n const instructionsToExport = getAllInstructionsWithSubs(node, {\n leavesOnly: !renderParentInstructions,\n });\n const definedTypesToExport = getAllDefinedTypes(node);\n const hasAnythingToExport =\n programsToExport.length > 0 ||\n accountsToExport.length > 0 ||\n instructionsToExport.length > 0 ||\n definedTypesToExport.length > 0;\n\n const ctx = {\n accountsToExport,\n definedTypesToExport,\n hasAnythingToExport,\n instructionsToExport,\n programsToExport,\n root: node,\n };\n\n return mergeRenderMaps([\n createRenderMap({\n ['accounts/mod.rs']:\n accountsToExport.length > 0 ? { content: render('accountsMod.njk', ctx) } : undefined,\n ['errors/mod.rs']:\n programsToExport.length > 0 ? { content: render('errorsMod.njk', ctx) } : undefined,\n ['instructions/mod.rs']:\n instructionsToExport.length > 0\n ? { content: render('instructionsMod.njk', ctx) }\n : undefined,\n ['mod.rs']: { content: render('rootMod.njk', ctx) },\n ['programs.rs']:\n programsToExport.length > 0 ? { content: render('programsMod.njk', ctx) } : undefined,\n ['shared.rs']:\n accountsToExport.length > 0 ? { content: render('sharedPage.njk', ctx) } : undefined,\n ['types/mod.rs']:\n definedTypesToExport.length > 0\n ? { content: render('definedTypesMod.njk', ctx) }\n : undefined,\n }),\n ...getAllPrograms(node).map(p => visit(p, self)),\n ]);\n },\n }),\n v => recordNodeStackVisitor(v, stack),\n v => recordLinkablesOnFirstVisitVisitor(v, linkables),\n );\n}\n\nfunction getConflictsForInstructionAccountsAndArgs(instruction: InstructionNode): string[] {\n const allNames = [\n ...instruction.accounts.map(account => account.name),\n ...instruction.arguments.map(argument => argument.name),\n ];\n const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);\n return [...new Set(duplicates)];\n}\n","import { CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, CodamaError } from '@codama/errors';\nimport {\n AccountNode,\n arrayTypeNode,\n CountNode,\n DefinedTypeNode,\n definedTypeNode,\n fixedCountNode,\n InstructionNode,\n isNode,\n NumberTypeNode,\n numberTypeNode,\n parseDocs,\n pascalCase,\n prefixedCountNode,\n REGISTERED_TYPE_NODE_KINDS,\n remainderCountNode,\n resolveNestedTypeNode,\n snakeCase,\n} from '@codama/nodes';\nimport { extendVisitor, mergeVisitor, pipe, visit } from '@codama/visitors-core';\n\nimport { ImportMap } from './ImportMap';\nimport {\n GetImportFromFunction,\n getSerdeFieldAttribute,\n GetTraitsFromNodeFunction,\n rustDocblock,\n TraitOptions,\n} from './utils';\n\nexport type TypeManifest = {\n imports: ImportMap;\n nestedStructs: string[];\n type: string;\n};\n\nexport function getTypeManifestVisitor(options: {\n getImportFrom: GetImportFromFunction;\n getTraitsFromNode: GetTraitsFromNodeFunction;\n nestedStruct?: boolean;\n parentName?: string | null;\n traitOptions?: TraitOptions;\n}) {\n const { getImportFrom, getTraitsFromNode, traitOptions } = options;\n let parentName: string | null = options.parentName ?? null;\n let nestedStruct: boolean = options.nestedStruct ?? false;\n let inlineStruct: boolean = false;\n let parentSize: NumberTypeNode | number | null = null;\n let parentNode: AccountNode | DefinedTypeNode | InstructionNode | null = null;\n\n return pipe(\n mergeVisitor(\n (): TypeManifest => ({ imports: new ImportMap(), nestedStructs: [], type: '' }),\n (_, values) => ({\n ...mergeManifests(values),\n type: values.map(v => v.type).join('\\n'),\n }),\n { keys: [...REGISTERED_TYPE_NODE_KINDS, 'definedTypeLinkNode', 'definedTypeNode', 'accountNode'] },\n ),\n v =>\n extendVisitor(v, {\n visitAccount(account, { self }) {\n parentName = pascalCase(account.name);\n parentNode = account;\n const manifest = visit(account.data, self);\n const traits = getTraitsFromNode(account);\n manifest.imports.mergeWith(traits.imports);\n parentName = null;\n parentNode = null;\n return {\n ...manifest,\n type: traits.render + manifest.type,\n };\n },\n\n visitArrayType(arrayType, { self }) {\n const childManifest = visit(arrayType.item, self);\n\n if (isNode(arrayType.count, 'fixedCountNode')) {\n return {\n ...childManifest,\n type: `[${childManifest.type}; ${arrayType.count.value}]`,\n };\n }\n\n if (isNode(arrayType.count, 'remainderCountNode')) {\n childManifest.imports.add('kaigan::types::RemainderVec');\n return {\n ...childManifest,\n type: `RemainderVec<${childManifest.type}>`,\n };\n }\n\n const prefix = resolveNestedTypeNode(arrayType.count.prefix);\n if (prefix.endian === 'le') {\n switch (prefix.format) {\n case 'u32':\n return {\n ...childManifest,\n type: `Vec<${childManifest.type}>`,\n };\n case 'u8':\n case 'u16':\n case 'u64': {\n const prefixFormat = prefix.format.toUpperCase();\n childManifest.imports.add(`kaigan::types::${prefixFormat}PrefixVec`);\n return {\n ...childManifest,\n type: `${prefixFormat}PrefixVec<${childManifest.type}>`,\n };\n }\n case 'shortU16': {\n childManifest.imports.add('solana_short_vec::ShortVec');\n return {\n ...childManifest,\n type: `ShortVec<${childManifest.type}>`,\n };\n }\n default:\n throw new Error(`Array prefix not supported: ${prefix.format}`);\n }\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Array size not supported by Borsh');\n },\n\n visitBooleanType(booleanType) {\n const resolvedSize = resolveNestedTypeNode(booleanType.size);\n if (resolvedSize.format === 'u8' && resolvedSize.endian === 'le') {\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: 'bool',\n };\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Bool size not supported by Borsh');\n },\n\n visitBytesType(_bytesType, { self }) {\n let arraySize: CountNode = remainderCountNode();\n if (typeof parentSize === 'number') {\n arraySize = fixedCountNode(parentSize);\n } else if (parentSize && typeof parentSize === 'object') {\n arraySize = prefixedCountNode(parentSize);\n }\n const arrayType = arrayTypeNode(numberTypeNode('u8'), arraySize);\n return visit(arrayType, self);\n },\n\n visitDefinedType(definedType, { self }) {\n parentName = pascalCase(definedType.name);\n parentNode = definedType;\n const manifest = visit(definedType.type, self);\n const traits = getTraitsFromNode(definedType);\n manifest.imports.mergeWith(traits.imports);\n parentName = null;\n parentNode = null;\n\n const renderedType = isNode(definedType.type, ['enumTypeNode', 'structTypeNode'])\n ? manifest.type\n : `pub type ${pascalCase(definedType.name)} = ${manifest.type};`;\n\n return { ...manifest, type: `${traits.render}${renderedType}` };\n },\n\n visitDefinedTypeLink(node) {\n const pascalCaseDefinedType = pascalCase(node.name);\n const importFrom = getImportFrom(node);\n return {\n imports: new ImportMap().add(`${importFrom}::${pascalCaseDefinedType}`),\n nestedStructs: [],\n type: pascalCaseDefinedType,\n };\n },\n\n visitEnumEmptyVariantType(enumEmptyVariantType) {\n const name = pascalCase(enumEmptyVariantType.name);\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: `${name},`,\n };\n },\n\n visitEnumStructVariantType(enumStructVariantType, { self }) {\n const name = pascalCase(enumStructVariantType.name);\n const originalParentName = parentName;\n\n if (!originalParentName) {\n throw new Error('Enum struct variant type must have a parent name.');\n }\n\n inlineStruct = true;\n parentName = pascalCase(originalParentName) + name;\n const typeManifest = visit(enumStructVariantType.struct, self);\n inlineStruct = false;\n parentName = originalParentName;\n\n return {\n ...typeManifest,\n type: `${name} ${typeManifest.type},`,\n };\n },\n\n visitEnumTupleVariantType(enumTupleVariantType, { self }) {\n const name = pascalCase(enumTupleVariantType.name);\n const originalParentName = parentName;\n\n if (!originalParentName) {\n throw new Error('Enum struct variant type must have a parent name.');\n }\n\n parentName = pascalCase(originalParentName) + name;\n const childManifest = visit(enumTupleVariantType.tuple, self);\n parentName = originalParentName;\n\n let derive = '';\n if (parentNode && childManifest.type === '(Pubkey)') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::DisplayFromStr>',\n parentNode,\n traitOptions,\n );\n } else if (parentNode && childManifest.type === '(Vec<Pubkey>)') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<Vec<serde_with::DisplayFromStr>>',\n parentNode,\n traitOptions,\n );\n }\n\n return {\n ...childManifest,\n type: `${derive}${name}${childManifest.type},`,\n };\n },\n\n visitEnumType(enumType, { self }) {\n const originalParentName = parentName;\n if (!originalParentName) {\n // TODO: Add to the Rust validator.\n throw new Error('Enum type must have a parent name.');\n }\n\n const variants = enumType.variants.map(variant => visit(variant, self));\n const variantNames = variants.map(variant => variant.type).join('\\n');\n const mergedManifest = mergeManifests(variants);\n\n return {\n ...mergedManifest,\n type: `pub enum ${pascalCase(originalParentName)} {\\n${variantNames}\\n}`,\n };\n },\n\n visitFixedSizeType(fixedSizeType, { self }) {\n parentSize = fixedSizeType.size;\n const manifest = visit(fixedSizeType.type, self);\n parentSize = null;\n return manifest;\n },\n\n visitMapType(mapType, { self }) {\n const key = visit(mapType.key, self);\n const value = visit(mapType.value, self);\n const mergedManifest = mergeManifests([key, value]);\n mergedManifest.imports.add('std::collections::HashMap');\n return {\n ...mergedManifest,\n type: `HashMap<${key.type}, ${value.type}>`,\n };\n },\n\n visitNumberType(numberType) {\n if (numberType.endian !== 'le') {\n // TODO: Add to the Rust validator.\n throw new Error('Number endianness not supported by Borsh');\n }\n\n if (numberType.format === 'shortU16') {\n return {\n imports: new ImportMap().add('solana_short_vec::ShortU16'),\n nestedStructs: [],\n type: 'ShortU16',\n };\n }\n\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: numberType.format,\n };\n },\n\n visitOptionType(optionType, { self }) {\n const childManifest = visit(optionType.item, self);\n\n const optionPrefix = resolveNestedTypeNode(optionType.prefix);\n if (optionPrefix.format === 'u8' && optionPrefix.endian === 'le') {\n return {\n ...childManifest,\n type: `Option<${childManifest.type}>`,\n };\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('Option size not supported by Borsh');\n },\n\n visitPublicKeyType() {\n return {\n imports: new ImportMap().add('solana_pubkey::Pubkey'),\n nestedStructs: [],\n type: 'Pubkey',\n };\n },\n\n visitRemainderOptionType(node) {\n throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });\n },\n\n visitSetType(setType, { self }) {\n const childManifest = visit(setType.item, self);\n childManifest.imports.add('std::collections::HashSet');\n return {\n ...childManifest,\n type: `HashSet<${childManifest.type}>`,\n };\n },\n\n visitSizePrefixType(sizePrefixType, { self }) {\n parentSize = resolveNestedTypeNode(sizePrefixType.prefix);\n const manifest = visit(sizePrefixType.type, self);\n parentSize = null;\n return manifest;\n },\n\n visitStringType() {\n if (!parentSize) {\n return {\n imports: new ImportMap().add(`kaigan::types::RemainderStr`),\n nestedStructs: [],\n type: `RemainderStr`,\n };\n }\n\n if (typeof parentSize === 'number') {\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: `[u8; ${parentSize}]`,\n };\n }\n\n if (isNode(parentSize, 'numberTypeNode') && parentSize.endian === 'le') {\n switch (parentSize.format) {\n case 'u32':\n return {\n imports: new ImportMap(),\n nestedStructs: [],\n type: 'String',\n };\n case 'u8':\n case 'u16':\n case 'u64': {\n const prefix = parentSize.format.toUpperCase();\n return {\n imports: new ImportMap().add(`kaigan::types::${prefix}PrefixString`),\n nestedStructs: [],\n type: `${prefix}PrefixString`,\n };\n }\n default:\n throw new Error(`'String size not supported: ${parentSize.format}`);\n }\n }\n\n // TODO: Add to the Rust validator.\n throw new Error('String size not supported by Borsh');\n },\n\n visitStructFieldType(structFieldType, { self }) {\n const originalParentName = parentName;\n const originalInlineStruct = inlineStruct;\n const originalNestedStruct = nestedStruct;\n\n if (!originalParentName) {\n throw new Error('Struct field type must have a parent name.');\n }\n\n parentName = pascalCase(originalParentName) + pascalCase(structFieldType.name);\n nestedStruct = true;\n inlineStruct = false;\n\n const fieldManifest = visit(structFieldType.type, self);\n\n parentName = originalParentName;\n inlineStruct = originalInlineStruct;\n nestedStruct = originalNestedStruct;\n\n const fieldName = snakeCase(structFieldType.name);\n const docblock = rustDocblock(parseDocs(structFieldType.docs));\n const resolvedNestedType = resolveNestedTypeNode(structFieldType.type);\n\n let derive = '';\n if (parentNode) {\n if (fieldManifest.type === 'Pubkey') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::DisplayFromStr>',\n parentNode,\n traitOptions,\n );\n } else if (fieldManifest.type === 'Vec<Pubkey>') {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<Vec<serde_with::DisplayFromStr>>',\n parentNode,\n traitOptions,\n );\n } else if (\n isNode(resolvedNestedType, 'arrayTypeNode') &&\n isNode(resolvedNestedType.count, 'fixedCountNode') &&\n resolvedNestedType.count.value > 32\n ) {\n derive = getSerdeFieldAttribute('serde_big_array::BigArray', parentNode, traitOptions);\n } else if (\n isNode(resolvedNestedType, ['bytesTypeNode', 'stringTypeNode']) &&\n isNode(structFieldType.type, 'fixedSizeTypeNode') &&\n structFieldType.type.size > 32\n ) {\n derive = getSerdeFieldAttribute(\n 'serde_with::As::<serde_with::Bytes>',\n parentNode,\n traitOptions,\n );\n }\n }\n\n return {\n ...fieldManifest,\n type: inlineStruct\n ? `${docblock}${derive}${fieldName}: ${fieldManifest.type},`\n : `${docblock}${derive}pub ${fieldName}: ${fieldManifest.type},`,\n };\n },\n\n visitStructType(structType, { self }) {\n const originalParentName = parentName;\n\n if (!originalParentName) {\n // TODO: Add to the Rust validator.\n throw new Error('Struct type must have a parent name.');\n }\n\n const fields = structType.fields.map(field => visit(field, self));\n const fieldTypes = fields.map(field => field.type).join('\\n');\n const mergedManifest = mergeManifests(fields);\n\n if (nestedStruct) {\n const nestedTraits = getTraitsFromNode(\n definedTypeNode({ name: originalParentName, type: structType }),\n );\n mergedManifest.imports.mergeWith(nestedTraits.imports);\n return {\n ...mergedManifest,\n nestedStructs: [\n ...mergedManifest.nestedStructs,\n `${nestedTraits.render}pub struct ${pascalCase(originalParentName)} {\\n${fieldTypes}\\n}`,\n ],\n type: pascalCase(originalParentName),\n };\n }\n\n if (inlineStruct) {\n return { ...mergedManifest, type: `{\\n${fieldTypes}\\n}` };\n }\n\n return {\n ...mergedManifest,\n type: `pub struct ${pascalCase(originalParentName)} {\\n${fieldTypes}\\n}`,\n };\n },\n\n visitTupleType(tupleType, { self }) {\n const items = tupleType.items.map(item => visit(item, self));\n const mergedManifest = mergeManifests(items);\n\n return {\n ...mergedManifest,\n type: `(${items.map(item => item.type).join(', ')})`,\n };\n },\n\n visitZeroableOptionType(node) {\n throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });\n },\n }),\n );\n}\n\nfunction mergeManifests(manifests: TypeManifest[]): Pick<TypeManifest, 'imports' | 'nestedStructs'> {\n return {\n imports: new ImportMap().mergeWith(...manifests.map(td => td.imports)),\n nestedStructs: manifests.flatMap(m => m.nestedStructs),\n };\n}\n","import { BytesValueNode } from '@codama/nodes';\nimport { getBase16Encoder, getBase58Encoder, getBase64Encoder, getUtf8Encoder } from '@solana/codecs-strings';\n\nexport function getBytesFromBytesValueNode(node: BytesValueNode): Uint8Array {\n switch (node.encoding) {\n case 'utf8':\n return getUtf8Encoder().encode(node.data) as Uint8Array;\n case 'base16':\n return getBase16Encoder().encode(node.data) as Uint8Array;\n case 'base58':\n return getBase58Encoder().encode(node.data) as Uint8Array;\n case 'base64':\n default:\n return getBase64Encoder().encode(node.data) as Uint8Array;\n }\n}\n","import {\n camelCase,\n ConstantDiscriminatorNode,\n DiscriminatorNode,\n FieldDiscriminatorNode,\n InstructionArgumentNode,\n isNode,\n isNodeFilter,\n snakeCase,\n StructFieldTypeNode,\n VALUE_NODES,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\n\nimport { getTypeManifestVisitor, TypeManifest } from '../getTypeManifestVisitor';\nimport { ImportMap } from '../ImportMap';\nimport { renderValueNode } from '../renderValueNodeVisitor';\nimport { GetImportFromFunction } from './linkOverrides';\n\ntype Fragment = { imports: ImportMap; render: string };\n\nfunction mergeFragments(fragments: Fragment[], merge: (parts: string[]) => string): Fragment {\n const imports = fragments.reduce((acc, frag) => acc.mergeWith(frag.imports), new ImportMap());\n const render = merge(fragments.map(frag => frag.render));\n return { imports, render };\n}\n\nexport function getDiscriminatorConstants(scope: {\n discriminatorNodes: DiscriminatorNode[];\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n}): Fragment {\n const fragments = scope.discriminatorNodes\n .map(node => getDiscriminatorConstant(node, scope))\n .filter(Boolean) as Fragment[];\n\n return mergeFragments(fragments, r => r.join('\\n\\n'));\n}\n\nfunction getDiscriminatorConstant(\n discriminatorNode: DiscriminatorNode,\n scope: {\n discriminatorNodes: DiscriminatorNode[];\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n) {\n switch (discriminatorNode.kind) {\n case 'constantDiscriminatorNode':\n return getConstantDiscriminatorConstant(discriminatorNode, scope);\n case 'fieldDiscriminatorNode':\n return getFieldDiscriminatorConstant(discriminatorNode, scope);\n default:\n return null;\n }\n}\n\nfunction getConstantDiscriminatorConstant(\n discriminatorNode: ConstantDiscriminatorNode,\n scope: {\n discriminatorNodes: DiscriminatorNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n): Fragment {\n const { discriminatorNodes, getImportFrom, prefix, typeManifestVisitor } = scope;\n\n const index = discriminatorNodes.filter(isNodeFilter('constantDiscriminatorNode')).indexOf(discriminatorNode);\n const suffix = index <= 0 ? '' : `_${index + 1}`;\n\n const name = camelCase(`${prefix}_discriminator${suffix}`);\n const typeManifest = visit(discriminatorNode.constant.type, typeManifestVisitor);\n const value = renderValueNode(discriminatorNode.constant.value, getImportFrom);\n return getConstant(name, typeManifest, value);\n}\n\nfunction getFieldDiscriminatorConstant(\n discriminatorNode: FieldDiscriminatorNode,\n scope: {\n fields: InstructionArgumentNode[] | StructFieldTypeNode[];\n getImportFrom: GetImportFromFunction;\n prefix: string;\n typeManifestVisitor: ReturnType<typeof getTypeManifestVisitor>;\n },\n): Fragment | null {\n const { fields, prefix, getImportFrom, typeManifestVisitor } = scope;\n\n const field = fields.find(f => f.name === discriminatorNode.name);\n if (!field || !field.defaultValue || !isNode(field.defaultValue, VALUE_NODES)) {\n return null;\n }\n\n const name = camelCase(`${prefix}_${discriminatorNode.name}`);\n const typeManifest = visit(field.type, typeManifestVisitor);\n const value = renderValueNode(field.defaultValue, getImportFrom);\n return getConstant(name, typeManifest, value);\n}\n\nfunction getConstant(name: string, typeManifest: TypeManifest, value: Fragment): Fragment {\n const type: Fragment = { imports: typeManifest.imports, render: typeManifest.type };\n return mergeFragments([type, value], ([t, v]) => `pub const ${snakeCase(name).toUpperCase()}: ${t} = ${v};`);\n}\n","import {\n arrayValueNode,\n bytesValueNode,\n isNode,\n numberValueNode,\n pascalCase,\n RegisteredValueNode,\n ValueNode,\n} from '@codama/nodes';\nimport { visit, Visitor } from '@codama/visitors-core';\n\nimport { ImportMap } from './ImportMap';\nimport { getBytesFromBytesValueNode, GetImportFromFunction } from './utils';\n\nexport function renderValueNode(\n value: ValueNode,\n getImportFrom: GetImportFromFunction,\n useStr: boolean = false,\n): {\n imports: ImportMap;\n render: string;\n} {\n return visit(value, renderValueNodeVisitor(getImportFrom, useStr));\n}\n\nexport function renderValueNodeVisitor(\n getImportFrom: GetImportFromFunction,\n useStr: boolean = false,\n): Visitor<\n {\n imports: ImportMap;\n render: string;\n },\n RegisteredValueNode['kind']\n> {\n return {\n visitArrayValue(node) {\n const list = node.items.map(v => visit(v, this));\n return {\n imports: new ImportMap().mergeWith(...list.map(c => c.imports)),\n render: `[${list.map(c => c.render).join(', ')}]`,\n };\n },\n visitBooleanValue(node) {\n return {\n imports: new ImportMap(),\n render: JSON.stringify(node.boolean),\n };\n },\n visitBytesValue(node) {\n const bytes = getBytesFromBytesValueNode(node);\n const numbers = Array.from(bytes).map(numberValueNode);\n return visit(arrayValueNode(numbers), this);\n },\n visitConstantValue(node) {\n if (isNode(node.value, 'bytesValueNode')) {\n return visit(node.value, this);\n }\n if (isNode(node.type, 'stringTypeNode') && isNode(node.value, 'stringValueNode')) {\n return visit(bytesValueNode(node.type.encoding, node.value.string), this);\n }\n if (isNode(node.type, 'numberTypeNode') && isNode(node.value, 'numberValueNode')) {\n const numberManifest = visit(node.value, this);\n const { format, endian } = node.type;\n const byteFunction = endian === 'le' ? 'to_le_bytes' : 'to_be_bytes';\n numberManifest.render = `${numberManifest.render}${format}.${byteFunction}()`;\n return numberManifest;\n }\n throw new Error('Unsupported constant value type.');\n },\n visitEnumValue(node) {\n const imports = new ImportMap();\n const enumName = pascalCase(node.enum.name);\n const variantName = pascalCase(node.variant);\n const importFrom = getImportFrom(node.enum);\n imports.add(`${importFrom}::${enumName}`);\n if (!node.value) {\n return { imports, render: `${enumName}::${variantName}` };\n }\n const enumValue = visit(node.value, this);\n const fields = enumValue.render;\n return {\n imports: imports.mergeWith(enumValue.imports),\n render: `${enumName}::${variantName} ${fields}`,\n };\n },\n visitMapEntryValue(node) {\n const mapKey = visit(node.key, this);\n const mapValue = visit(node.value, this);\n return {\n imports: mapKey.imports.mergeWith(mapValue.imports),\n render: `[${mapKey.render}, ${mapValue.render}]`,\n };\n },\n visitMapValue(node) {\n const map = node.entries.map(entry => visit(entry, this));\n const imports = new ImportMap().add('std::collection::HashMap');\n return {\n imports: imports.mergeWith(...map.map(c => c.imports)),\n render: `HashMap::from([${map.map(c => c.render).join(', ')}])`,\n };\n },\n visitNoneValue() {\n return {\n imports: new ImportMap(),\n render: 'None',\n };\n },\n visitNumberValue(node) {\n return {\n imports: new ImportMap(),\n render: node.number.toString(),\n };\n },\n visitPublicKeyValue(node) {\n return {\n imports: new ImportMap().add('solana_pubkey'),\n render: `pubkey!(\"${node.publicKey}\")`,\n };\n },\n visitSetValue(node) {\n const set = node.items.map(v => visit(v, this));\n const imports = new ImportMap().add('std::collection::HashSet');\n return {\n imports: imports.mergeWith(...set.map(c => c.imports)),\n render: `HashSet::from([${set.map(c => c.render).join(', ')}])`,\n };\n },\n visitSomeValue(node) {\n const child = visit(node.value, this);\n return {\n ...child,\n render: `Some(${child.render})`,\n };\n },\n visitStringValue(node) {\n return {\n imports: new ImportMap(),\n render: useStr ? `${JSON.stringify(node.string)}` : `String::from(${JSON.stringify(node.string)})`,\n };\n },\n visitStructFieldValue(node) {\n const structValue = visit(node.value, this);\n return {\n imports: structValue.imports,\n render: `${node.name}: ${structValue.render}`,\n };\n },\n visitStructValue(node) {\n const struct = node.fields.map(field => visit(field, this));\n return {\n imports: new ImportMap().mergeWith(...struct.map(c => c.imports)),\n render: `{ ${struct.map(c => c.render).join(', ')} }`,\n };\n },\n visitTupleValue(node) {\n const tuple = node.items.map(v => visit(v, this));\n return {\n imports: new ImportMap().mergeWith(...tuple.map(c => c.imports)),\n render: `(${tuple.map(c => c.render).join(', ')})`,\n };\n },\n };\n}\n","import { CODAMA_ERROR__UNEXPECTED_NODE_KIND, CodamaError } from '@codama/errors';\nimport {\n AccountLinkNode,\n DefinedTypeLinkNode,\n InstructionLinkNode,\n PdaLinkNode,\n ProgramLinkNode,\n ResolverValueNode,\n} from '@codama/nodes';\n\nexport type LinkOverrides = {\n accounts?: Record<string, string>;\n definedTypes?: Record<string, string>;\n instructions?: Record<string, string>;\n pdas?: Record<string, string>;\n programs?: Record<string, string>;\n resolvers?: Record<string, string>;\n};\n\ntype OverridableNodes =\n | AccountLinkNode\n | DefinedTypeLinkNode\n | InstructionLinkNode\n | PdaLinkNode\n | ProgramLinkNode\n | ResolverValueNode;\n\nexport type GetImportFromFunction = (node: OverridableNodes, fallback?: string) => string;\n\nexport function getImportFromFactory(overrides: LinkOverrides): GetImportFromFunction {\n const linkOverrides = {\n accounts: overrides.accounts ?? {},\n definedTypes: overrides.definedTypes ?? {},\n instructions: overrides.instructions ?? {},\n pdas: overrides.pdas ?? {},\n programs: overrides.programs ?? {},\n resolvers: overrides.resolvers ?? {},\n };\n\n return (node: OverridableNodes) => {\n const kind = node.kind;\n switch (kind) {\n case 'accountLinkNode':\n return linkOverrides.accounts[node.name] ?? 'generatedAccounts';\n case 'definedTypeLinkNode':\n return linkOverrides.definedTypes[node.name] ?? 'generatedTypes';\n case 'instructionLinkNode':\n return linkOverrides.instructions[node.name] ?? 'generatedInstructions';\n case 'pdaLinkNode':\n return linkOverrides.pdas[node.name] ?? 'generatedAccounts';\n case 'programLinkNode':\n return linkOverrides.programs[node.name] ?? 'generatedPrograms';\n case 'resolverValueNode':\n return linkOverrides.resolvers[node.name] ?? 'hooked';\n default:\n throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n expectedKinds: [\n 'AccountLinkNode',\n 'DefinedTypeLinkNode',\n 'InstructionLinkNode',\n 'PdaLinkNode',\n 'ProgramLinkNode',\n 'resolverValueNode',\n ],\n kind: kind satisfies never,\n node,\n });\n }\n };\n}\n","import { dirname as pathDirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { camelCase, kebabCase, pascalCase, snakeCase, titleCase } from '@codama/nodes';\nimport nunjucks, { ConfigureOptions as NunJucksOptions } from 'nunjucks';\n\nexport function rustDocblock(docs: string[]): string {\n if (docs.length <= 0) return '';\n const lines = docs.map(doc => `/// ${doc}`);\n return `${lines.join('\\n')}\\n`;\n}\n\nexport const render = (template: string, context?: object, options?: NunJucksOptions): string => {\n // @ts-expect-error import.meta will be used in the right environment.\n const dirname = __ESM__ ? pathDirname(fileURLToPath(import.meta.url)) : __dirname;\n const templates = __TEST__ ? join(dirname, '..', '..', 'public', 'templates') : join(dirname, 'templates'); // Path to templates from bundled output file.\n const env = nunjucks.configure(templates, { autoescape: false, trimBlocks: true, ...options });\n env.addFilter('pascalCase', pascalCase);\n env.addFilter('camelCase', camelCase);\n env.addFilter('snakeCase', snakeCase);\n env.addFilter('kebabCase', kebabCase);\n env.addFilter('titleCase', titleCase);\n env.addFilter('rustDocblock', rustDocblock);\n // Returns whether or not the provided traits are implemented on the type.\n env.addFilter('hasTrait', (traits: string, ...traitNames: string[]) => {\n if (typeof traits !== 'string') return false;\n return traitNames.some(traitName => traits.includes(traitName));\n });\n return env.render(template, context);\n};\n","import {\n AccountNode,\n assertIsNode,\n camelCase,\n DefinedTypeNode,\n InstructionNode,\n isNode,\n isScalarEnum,\n} from '@codama/nodes';\n\nimport { ImportMap } from '../ImportMap';\n\nexport type TraitOptions = {\n /** The default traits to implement for all types. */\n baseDefaults?: string[];\n /**\n * The default traits to implement for data enums only — on top of the base defaults.\n * Data enums are enums with at least one non-unit variant.\n */\n dataEnumDefaults?: string[];\n /**\n * The mapping of feature flags to traits.\n * For each entry, the traits will be rendered within a\n * `#[cfg_attr(feature = \"feature_name\", derive(Traits))]` attribute.\n */\n featureFlags?: Record<string, string[]>;\n /** The complete trait overrides of specific types. */\n overrides?: Record<string, string[]>;\n /**\n * The default traits to implement for scalar enums only — on top of the base defaults.\n * Scalar enums are enums with no variants or only unit variants.\n */\n scalarEnumDefaults?: string[];\n /** The default traits to implement for structs only — on top of the base defaults. */\n structDefaults?: string[];\n /** Whether or not to use the fully qualified name for traits, instead of importing them. */\n useFullyQualifiedName?: boolean;\n};\n\nexport const DEFAULT_TRAIT_OPTIONS: Required<TraitOptions> = {\n baseDefaults: [\n 'borsh::BorshSerialize',\n 'borsh::BorshDeserialize',\n 'serde::Serialize',\n 'serde::Deserialize',\n 'Clone',\n 'Debug',\n 'Eq',\n 'PartialEq',\n ],\n dataEnumDefaults: [],\n featureFlags: { serde: ['serde::Serialize', 'serde::Deserialize'] },\n overrides: {},\n scalarEnumDefaults: ['Copy', 'PartialOrd', 'Hash', 'num_derive::FromPrimitive'],\n structDefaults: [],\n useFullyQualifiedName: false,\n};\n\nexport type GetTraitsFromNodeFunction = (node: AccountNode | DefinedTypeNode | InstructionNode) => {\n imports: ImportMap;\n render: string;\n};\n\nexport function getTraitsFromNodeFactory(options: TraitOptions = {}): GetTraitsFromNodeFunction {\n return node => getTraitsFromNode(node, options);\n}\n\nexport function getTraitsFromNode(\n node: AccountNode | DefinedTypeNode | InstructionNode,\n userOptions: TraitOptions = {},\n): { imports: ImportMap; render: string } {\n assertIsNode(node, ['accountNode', 'definedTypeNode', 'instructionNode']);\n const options: Required<TraitOptions> = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };\n\n // Get the node type and return early if it's a type alias.\n const nodeType = getNodeType(node);\n if (nodeType === 'alias') {\n return { imports: new ImportMap(), render: '' };\n }\n\n // Find all the FQN traits for the node.\n const sanitizedOverrides = Object.fromEntries(\n Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value]),\n );\n const nodeOverrides: string[] | undefined = sanitizedOverrides[node.name];\n const allTraits = nodeOverrides === undefined ? getDefaultTraits(nodeType, options) : nodeOverrides;\n\n // Wrap the traits in feature flags if necessary.\n const partitionedTraits = partitionTraitsInFeatures(allTraits, options.featureFlags);\n let unfeaturedTraits = partitionedTraits[0];\n const featuredTraits = partitionedTraits[1];\n\n // Import the traits if necessary.\n const imports = new ImportMap();\n if (!options.useFullyQualifiedName) {\n unfeaturedTraits = extractFullyQualifiedNames(unfeaturedTraits, imports);\n }\n\n // Render the trait lines.\n const traitLines: string[] = [\n ...(unfeaturedTraits.length > 0 ? [`#[derive(${unfeaturedTraits.join(', ')})]\\n`] : []),\n ...Object.entries(featuredTraits).map(([feature, traits]) => {\n return `#[cfg_attr(feature = \"${feature}\", derive(${traits.join(', ')}))]\\n`;\n }),\n ];\n\n return { imports, render: traitLines.join('') };\n}\n\nfunction getNodeType(\n node: AccountNode | DefinedTypeNode | InstructionNode,\n): 'alias' | 'dataEnum' | 'scalarEnum' | 'struct' {\n if (isNode(node, ['accountNode', 'instructionNode'])) return 'struct';\n if (isNode(node.type, 'structTypeNode')) return 'struct';\n if (isNode(node.type, 'enumTypeNode')) {\n return isScalarEnum(node.type) ? 'scalarEnum' : 'dataEnum';\n }\n return 'alias';\n}\n\nfunction getDefaultTraits(\n nodeType: 'dataEnum' | 'scalarEnum' | 'struct',\n options: Pick<\n Required<TraitOptions>,\n 'baseDefaults' | 'dataEnumDefaults' | 'scalarEnumDefaults' | 'structDefaults'\n >,\n): string[] {\n switch (nodeType) {\n case 'dataEnum':\n return [...options.baseDefaults, ...options.dataEnumDefaults];\n case 'scalarEnum':\n return [...options.baseDefaults, ...options.scalarEnumDefaults];\n case 'struct':\n return [...options.baseDefaults, ...options.structDefaults];\n }\n}\n\nfunction partitionTraitsInFeatures(\n traits: string[],\n featureFlags: Record<string, string[]>,\n): [string[], Record<string, string[]>] {\n // Reverse the feature flags option for quick lookup.\n // If there are any duplicate traits, the first one encountered will be used.\n const reverseFeatureFlags = Object.entries(featureFlags).reduce(\n (acc, [feature, traits]) => {\n for (const trait of traits) {\n if (!acc[trait]) acc[trait] = feature;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const unfeaturedTraits: string[] = [];\n const featuredTraits: Record<string, string[]> = {};\n for (const trait of traits) {\n const feature: string | undefined = reverseFeatureFlags[trait];\n if (feature === undefined) {\n unfeaturedTraits.push(trait);\n } else {\n if (!featuredTraits[feature]) featuredTraits[feature] = [];\n featuredTraits[feature].push(trait);\n }\n }\n\n return [unfeaturedTraits, featuredTraits];\n}\n\nfunction extractFullyQualifiedNames(traits: string[], imports: ImportMap): string[] {\n return traits.map(trait => {\n const index = trait.lastIndexOf('::');\n if (index === -1) return trait;\n imports.add(trait);\n return trait.slice(index + 2);\n });\n}\n\n/**\n * Helper function to get the serde field attribute format based on trait configuration.\n * Returns the appropriate attribute string for serde field customization, or empty string if no serde traits.\n */\nexport function getSerdeFieldAttribute(\n serdeWith: string,\n node: AccountNode | DefinedTypeNode | InstructionNode,\n userOptions: TraitOptions = {},\n): string {\n assertIsNode(node, ['accountNode', 'definedTypeNode', 'instructionNode']);\n const options: Required<TraitOptions> = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };\n\n // Get the node type and return early if it's a type alias.\n const nodeType = getNodeType(node);\n if (nodeType === 'alias') {\n return '';\n }\n\n // Find all the traits for the node.\n const sanitizedOverrides = Object.fromEntries(\n Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value]),\n );\n const nodeOverrides: string[] | undefined = sanitizedOverrides[node.name];\n const allTraits = nodeOverrides === undefined ? getDefaultTraits(nodeType, options) : nodeOverrides;\n\n // Check if serde traits are present.\n const hasSerdeSerialize = allTraits.some(t => t === 'serde::Serialize' || t === 'Serialize');\n const hasSerdeDeserialize = allTraits.some(t => t === 'serde::Deserialize' || t === 'Deserialize');\n\n if (!hasSerdeSerialize && !hasSerdeDeserialize) {\n return '';\n }\n\n // Check if serde is feature-flagged.\n const partitionedTraits = partitionTraitsInFeatures(allTraits, options.featureFlags);\n const featuredTraits = partitionedTraits[1];\n\n // Find which feature flag contains serde traits.\n let serdeFeatureName: string | undefined;\n for (const [feature, traits] of Object.entries(featuredTraits)) {\n if (\n traits.some(\n t => t === 'serde::Serialize' || t === 'serde::Deserialize' || t === 'Serialize' || t === 'Deserialize',\n )\n ) {\n serdeFeatureName = feature;\n break;\n }\n }\n\n if (serdeFeatureName) {\n return `#[cfg_attr(feature = \"${serdeFeatureName}\", serde(with = \"${serdeWith}\"))]\\n`;\n } else {\n return `#[serde(with = \"${serdeWith}\")]\\n`;\n }\n}\n","import { logError, logWarn } from '@codama/errors';\nimport { deleteDirectory, writeRenderMapVisitor } from '@codama/renderers-core';\nimport { rootNodeVisitor, visit } from '@codama/visitors-core';\nimport { spawnSync } from 'child_process';\n\nimport { GetRenderMapOptions, getRenderMapVisitor } from './getRenderMapVisitor';\n\nexport type RenderOptions = GetRenderMapOptions & {\n crateFolder?: string;\n deleteFolderBeforeRendering?: boolean;\n formatCode?: boolean;\n toolchain?: string;\n};\n\nexport function renderVisitor(path: string, options: RenderOptions = {}) {\n return rootNodeVisitor(root => {\n // Delete existing generated folder.\n if (options.deleteFolderBeforeRendering ?? true) {\n deleteDirectory(path);\n }\n\n // Render the new files.\n visit(root, writeRenderMapVisitor(getRenderMapVisitor(options), path));\n\n // format the code\n if (options.formatCode) {\n if (options.crateFolder) {\n const removeFalsy = <T>(arg: T | false | null | undefined): arg is T => Boolean(arg);\n runFormatter(\n 'cargo',\n [options.toolchain, 'fmt', '--manifest-path', `${options.crateFolder}/Cargo.toml`].filter(\n removeFalsy,\n ),\n );\n } else {\n logWarn('No crate folder specified, skipping formatting.');\n }\n }\n });\n}\n\nfunction runFormatter(cmd: string, args: string[]) {\n const { stdout, stderr, error } = spawnSync(cmd, args);\n if (error?.message?.includes('ENOENT')) {\n logWarn(`Could not find ${cmd}, skipping formatting.`);\n return;\n }\n if (stdout.length > 0) {\n logWarn(`(cargo-fmt) ${stdout ? stdout?.toString() : error}`);\n }\n if (stderr.length > 0) {\n logError(`(cargo-fmt) ${stderr ? stderr.toString() : error}`);\n }\n}\n"],"mappings":"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","names":["isNode","isNodeFilter","pascalCase","resolveNestedTypeNode","snakeCase","VALUE_NODES","extendVisitor","pipe","visit","CodamaError","isNode","pascalCase","snakeCase","visit","isNode","visit","render","visit","isNode","camelCase","pascalCase","snakeCase","camelCase","isNode","camelCase","isNode","traits","getTraitsFromNode","pascalCase","visit","isNode","CodamaError","snakeCase","getTraitsFromNode","pipe","extendVisitor","visit","resolveNestedTypeNode","isNode","seedManifest","resolvedType","isNodeFilter","snakeCase","pascalCase","VALUE_NODES","logWarn","visit","visit","logWarn"]}
|
|
@@ -7,5 +7,7 @@ export type GetRenderMapOptions = {
|
|
|
7
7
|
renderParentInstructions?: boolean;
|
|
8
8
|
traitOptions?: TraitOptions;
|
|
9
9
|
};
|
|
10
|
-
export declare function getRenderMapVisitor(options?: GetRenderMapOptions): import("@codama/visitors-core").Visitor<import("@codama/renderers-core").RenderMap
|
|
10
|
+
export declare function getRenderMapVisitor(options?: GetRenderMapOptions): import("@codama/visitors-core").Visitor<import("@codama/renderers-core").RenderMap<Readonly<{
|
|
11
|
+
content: string;
|
|
12
|
+
}>>, "accountNode" | "definedTypeNode" | "instructionNode" | "programNode" | "rootNode">;
|
|
11
13
|
//# sourceMappingURL=getRenderMapVisitor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getRenderMapVisitor.d.ts","sourceRoot":"","sources":["../../src/getRenderMapVisitor.ts"],"names":[],"mappings":"AA+BA,OAAO,EAIH,aAAa,EAEb,YAAY,EACf,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,mBAAmB,GAAG;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,mBAAwB
|
|
1
|
+
{"version":3,"file":"getRenderMapVisitor.d.ts","sourceRoot":"","sources":["../../src/getRenderMapVisitor.ts"],"names":[],"mappings":"AA+BA,OAAO,EAIH,aAAa,EAEb,YAAY,EACf,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,mBAAmB,GAAG;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,mBAAwB;;yFAsRpE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codama/renderers-rust",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.8",
|
|
4
4
|
"description": "Renders Rust clients for your programs",
|
|
5
5
|
"exports": {
|
|
6
6
|
"types": "./dist/types/index.d.ts",
|
|
@@ -28,15 +28,15 @@
|
|
|
28
28
|
"client"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@codama/errors": "^1.
|
|
32
|
-
"@codama/nodes": "^1.
|
|
33
|
-
"@codama/renderers-core": "^1.
|
|
34
|
-
"@codama/visitors-core": "^1.
|
|
35
|
-
"@solana/codecs-strings": "^
|
|
31
|
+
"@codama/errors": "^1.4.1",
|
|
32
|
+
"@codama/nodes": "^1.4.1",
|
|
33
|
+
"@codama/renderers-core": "^1.3.0",
|
|
34
|
+
"@codama/visitors-core": "^1.4.1",
|
|
35
|
+
"@solana/codecs-strings": "^5.0.0",
|
|
36
36
|
"nunjucks": "^3.2.4"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@codama/nodes-from-anchor": "^1.
|
|
39
|
+
"@codama/nodes-from-anchor": "^1.3.3",
|
|
40
40
|
"@changesets/changelog-github": "^0.5.1",
|
|
41
41
|
"@changesets/cli": "^2.29.7",
|
|
42
42
|
"@solana/eslint-config-solana": "^5.0.0",
|
|
@@ -45,12 +45,12 @@
|
|
|
45
45
|
"@types/nunjucks": "^3.2.6",
|
|
46
46
|
"agadoo": "^3.0.0",
|
|
47
47
|
"eslint": "^9.35.0",
|
|
48
|
-
"happy-dom": "^
|
|
48
|
+
"happy-dom": "^20.0.0",
|
|
49
49
|
"prettier": "^3.6.2",
|
|
50
|
-
"rimraf": "6.
|
|
50
|
+
"rimraf": "6.1.2",
|
|
51
51
|
"tsup": "^8.5.0",
|
|
52
52
|
"typescript": "^5.9.2",
|
|
53
|
-
"vitest": "^
|
|
53
|
+
"vitest": "^4.0.1"
|
|
54
54
|
},
|
|
55
55
|
"license": "MIT",
|
|
56
56
|
"repository": {
|