@codama/visitors
Version:
All visitors for the Codama framework
1,295 lines • 56.8 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
addPdasVisitor: () => addPdasVisitor,
createSubInstructionsFromEnumArgsVisitor: () => createSubInstructionsFromEnumArgsVisitor,
deduplicateIdenticalDefinedTypesVisitor: () => deduplicateIdenticalDefinedTypesVisitor,
fillDefaultPdaSeedValuesVisitor: () => fillDefaultPdaSeedValuesVisitor,
flattenInstructionArguments: () => flattenInstructionArguments,
flattenInstructionDataArgumentsVisitor: () => flattenInstructionDataArgumentsVisitor,
flattenStruct: () => flattenStruct,
flattenStructVisitor: () => flattenStructVisitor,
getCommonInstructionAccountDefaultRules: () => getCommonInstructionAccountDefaultRules,
getDefinedTypeHistogramVisitor: () => getDefinedTypeHistogramVisitor,
setAccountDiscriminatorFromFieldVisitor: () => setAccountDiscriminatorFromFieldVisitor,
setFixedAccountSizesVisitor: () => setFixedAccountSizesVisitor,
setInstructionAccountDefaultValuesVisitor: () => setInstructionAccountDefaultValuesVisitor,
setInstructionDiscriminatorsVisitor: () => setInstructionDiscriminatorsVisitor,
setNumberWrappersVisitor: () => setNumberWrappersVisitor,
setStructDefaultValuesVisitor: () => setStructDefaultValuesVisitor,
transformDefinedTypesIntoAccountsVisitor: () => transformDefinedTypesIntoAccountsVisitor,
transformU8ArraysToBytesVisitor: () => transformU8ArraysToBytesVisitor,
unwrapDefinedTypesVisitor: () => unwrapDefinedTypesVisitor,
unwrapInstructionArgsDefinedTypesVisitor: () => unwrapInstructionArgsDefinedTypesVisitor,
unwrapTupleEnumWithSingleStructVisitor: () => unwrapTupleEnumWithSingleStructVisitor,
unwrapTypeDefinedLinksVisitor: () => unwrapTypeDefinedLinksVisitor,
updateAccountsVisitor: () => updateAccountsVisitor,
updateDefinedTypesVisitor: () => updateDefinedTypesVisitor,
updateErrorsVisitor: () => updateErrorsVisitor,
updateInstructionsVisitor: () => updateInstructionsVisitor,
updateProgramsVisitor: () => updateProgramsVisitor
});
module.exports = __toCommonJS(index_exports);
__reExport(index_exports, require("@codama/visitors-core"), module.exports);
// src/addPdasVisitor.ts
var import_errors = require("@codama/errors");
var import_nodes = require("@codama/nodes");
var import_visitors_core = require("@codama/visitors-core");
function addPdasVisitor(pdas) {
return (0, import_visitors_core.bottomUpTransformerVisitor)(
Object.entries(pdas).map(([uncasedProgramName, newPdas]) => {
const programName = (0, import_nodes.camelCase)(uncasedProgramName);
return {
select: `[programNode]${programName}`,
transform: (node) => {
(0, import_nodes.assertIsNode)(node, "programNode");
const existingPdaNames = new Set(node.pdas.map((pda) => pda.name));
const newPdaNames = new Set(newPdas.map((pda) => pda.name));
const overlappingPdaNames = new Set([...existingPdaNames].filter((name) => newPdaNames.has(name)));
if (overlappingPdaNames.size > 0) {
throw new import_errors.CodamaError(import_errors.CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES, {
duplicatedPdaNames: [...overlappingPdaNames],
program: node,
programName: node.name
});
}
return (0, import_nodes.programNode)({
...node,
pdas: [...node.pdas, ...newPdas.map((pda) => (0, import_nodes.pdaNode)({ name: pda.name, seeds: pda.seeds }))]
});
}
};
})
);
}
// src/createSubInstructionsFromEnumArgsVisitor.ts
var import_errors3 = require("@codama/errors");
var import_nodes3 = require("@codama/nodes");
var import_visitors_core3 = require("@codama/visitors-core");
// src/flattenInstructionDataArgumentsVisitor.ts
var import_errors2 = require("@codama/errors");
var import_nodes2 = require("@codama/nodes");
var import_visitors_core2 = require("@codama/visitors-core");
function flattenInstructionDataArgumentsVisitor() {
return (0, import_visitors_core2.bottomUpTransformerVisitor)([
{
select: "[instructionNode]",
transform: (instruction) => {
(0, import_nodes2.assertIsNode)(instruction, "instructionNode");
return (0, import_nodes2.instructionNode)({
...instruction,
arguments: flattenInstructionArguments(instruction.arguments)
});
}
}
]);
}
var flattenInstructionArguments = (nodes, options = "*") => {
const camelCaseOptions = options === "*" ? options : options.map(import_nodes2.camelCase);
const shouldInline = (node) => options === "*" || camelCaseOptions.includes((0, import_nodes2.camelCase)(node.name));
const inlinedArguments = nodes.flatMap((node) => {
if ((0, import_nodes2.isNode)(node.type, "structTypeNode") && shouldInline(node)) {
return node.type.fields.map((field) => (0, import_nodes2.instructionArgumentNode)({ ...field }));
}
return node;
});
const inlinedFieldsNames = inlinedArguments.map((arg) => arg.name);
const duplicates = inlinedFieldsNames.filter((e, i, a) => a.indexOf(e) !== i);
const uniqueDuplicates = [...new Set(duplicates)];
const hasConflictingNames = uniqueDuplicates.length > 0;
if (hasConflictingNames) {
throw new import_errors2.CodamaError(import_errors2.CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES, {
conflictingAttributes: uniqueDuplicates
});
}
return hasConflictingNames ? nodes : inlinedArguments;
};
// src/createSubInstructionsFromEnumArgsVisitor.ts
function createSubInstructionsFromEnumArgsVisitor(map) {
const linkables = new import_visitors_core3.LinkableDictionary();
const visitor = (0, import_visitors_core3.bottomUpTransformerVisitor)(
Object.entries(map).map(
([selector, argNameInput]) => ({
select: ["[instructionNode]", selector],
transform: (node, stack) => {
(0, import_nodes3.assertIsNode)(node, "instructionNode");
const argFields = node.arguments;
const argName = (0, import_nodes3.camelCase)(argNameInput);
const argFieldIndex = argFields.findIndex((field) => field.name === argName);
const argField = argFieldIndex >= 0 ? argFields[argFieldIndex] : null;
if (!argField) {
throw new import_errors3.CodamaError(import_errors3.CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND, {
argumentName: argName,
instruction: node,
instructionName: node.name
});
}
let argType;
if ((0, import_nodes3.isNode)(argField.type, "enumTypeNode")) {
argType = argField.type;
} else if ((0, import_nodes3.isNode)(argField.type, "definedTypeLinkNode") && linkables.has([...stack.getPath(), argField.type])) {
const linkedType = linkables.get([...stack.getPath(), argField.type])?.type;
(0, import_nodes3.assertIsNode)(linkedType, "enumTypeNode");
argType = linkedType;
} else {
throw new import_errors3.CodamaError(import_errors3.CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND, {
argumentName: argName,
instruction: node,
instructionName: node.name
});
}
const subInstructions = argType.variants.map((variant, index) => {
const subName = (0, import_nodes3.camelCase)(`${node.name} ${variant.name}`);
const subFields = argFields.slice(0, argFieldIndex);
subFields.push(
(0, import_nodes3.instructionArgumentNode)({
defaultValue: (0, import_nodes3.numberValueNode)(index),
defaultValueStrategy: "omitted",
name: `${subName}Discriminator`,
type: (0, import_nodes3.numberTypeNode)("u8")
})
);
if ((0, import_nodes3.isNode)(variant, "enumStructVariantTypeNode")) {
subFields.push(
(0, import_nodes3.instructionArgumentNode)({
...argField,
type: variant.struct
})
);
} else if ((0, import_nodes3.isNode)(variant, "enumTupleVariantTypeNode")) {
subFields.push(
(0, import_nodes3.instructionArgumentNode)({
...argField,
type: variant.tuple
})
);
}
subFields.push(...argFields.slice(argFieldIndex + 1));
return (0, import_nodes3.instructionNode)({
...node,
arguments: flattenInstructionArguments(subFields),
name: subName
});
});
return (0, import_nodes3.instructionNode)({
...node,
subInstructions: [...node.subInstructions ?? [], ...subInstructions]
});
}
})
)
);
return (0, import_visitors_core3.pipe)(visitor, (v) => (0, import_visitors_core3.recordLinkablesOnFirstVisitVisitor)(v, linkables));
}
// src/deduplicateIdenticalDefinedTypesVisitor.ts
var import_nodes4 = require("@codama/nodes");
var import_visitors_core4 = require("@codama/visitors-core");
function deduplicateIdenticalDefinedTypesVisitor() {
return (0, import_visitors_core4.rootNodeVisitor)((root) => {
const typeMap = /* @__PURE__ */ new Map();
const allPrograms = (0, import_nodes4.getAllPrograms)(root);
allPrograms.forEach((program) => {
program.definedTypes.forEach((type) => {
const typeWithProgram = { program, type };
const list = typeMap.get(type.name) ?? [];
typeMap.set(type.name, [...list, typeWithProgram]);
});
});
typeMap.forEach((list, name) => {
if (list.length <= 1) {
typeMap.delete(name);
}
});
const hashVisitor = (0, import_visitors_core4.getUniqueHashStringVisitor)({ removeDocs: true });
typeMap.forEach((list, name) => {
const types = list.map((item) => (0, import_visitors_core4.visit)(item.type, hashVisitor));
const typesAreEqual = types.every((type, _, arr) => type === arr[0]);
if (!typesAreEqual) {
typeMap.delete(name);
}
});
const deleteSelectors = Array.from(typeMap.values()).flatMap((list) => {
const sortedList = list.sort((a, b) => allPrograms.indexOf(a.program) - allPrograms.indexOf(b.program));
const [, ...sortedListTail] = sortedList;
return sortedListTail;
}).map(({ program, type }) => `[programNode]${program.name}.[definedTypeNode]${type.name}`);
if (deleteSelectors.length > 0) {
const newRoot = (0, import_visitors_core4.visit)(root, (0, import_visitors_core4.deleteNodesVisitor)(deleteSelectors));
(0, import_nodes4.assertIsNode)(newRoot, "rootNode");
return newRoot;
}
return root;
});
}
// src/fillDefaultPdaSeedValuesVisitor.ts
var import_errors4 = require("@codama/errors");
var import_nodes5 = require("@codama/nodes");
var import_visitors_core5 = require("@codama/visitors-core");
function fillDefaultPdaSeedValuesVisitor(instructionPath, linkables, strictMode = false) {
const instruction = (0, import_visitors_core5.getLastNodeFromPath)(instructionPath);
return (0, import_visitors_core5.pipe)(
(0, import_visitors_core5.identityVisitor)({ keys: import_nodes5.INSTRUCTION_INPUT_VALUE_NODES }),
(v) => (0, import_visitors_core5.extendVisitor)(v, {
visitPdaValue(node, { next }) {
const visitedNode = next(node);
(0, import_nodes5.assertIsNode)(visitedNode, "pdaValueNode");
const foundPda = (0, import_nodes5.isNode)(visitedNode.pda, "pdaNode") ? visitedNode.pda : linkables.get([...instructionPath, visitedNode.pda]);
if (!foundPda) return visitedNode;
const seeds = addDefaultSeedValuesFromPdaWhenMissing(instruction, foundPda, visitedNode.seeds);
if (strictMode && !allSeedsAreValid(instruction, foundPda, seeds)) {
throw new import_errors4.CodamaError(import_errors4.CODAMA_ERROR__VISITORS__INVALID_PDA_SEED_VALUES, {
instruction,
instructionName: instruction.name,
pda: foundPda,
pdaName: foundPda.name
});
}
return (0, import_nodes5.pdaValueNode)(visitedNode.pda, seeds);
}
})
);
}
function addDefaultSeedValuesFromPdaWhenMissing(instruction, pda, existingSeeds) {
const existingSeedNames = new Set(existingSeeds.map((seed) => seed.name));
const defaultSeeds = getDefaultSeedValuesFromPda(instruction, pda).filter(
(seed) => !existingSeedNames.has(seed.name)
);
return [...existingSeeds, ...defaultSeeds];
}
function getDefaultSeedValuesFromPda(instruction, pda) {
return pda.seeds.flatMap((seed) => {
if (!(0, import_nodes5.isNode)(seed, "variablePdaSeedNode")) return [];
const hasMatchingAccount = instruction.accounts.some((a) => a.name === seed.name);
if ((0, import_nodes5.isNode)(seed.type, "publicKeyTypeNode") && hasMatchingAccount) {
return [(0, import_nodes5.pdaSeedValueNode)(seed.name, (0, import_nodes5.accountValueNode)(seed.name))];
}
const hasMatchingArgument = (0, import_nodes5.getAllInstructionArguments)(instruction).some((a) => a.name === seed.name);
if (hasMatchingArgument) {
return [(0, import_nodes5.pdaSeedValueNode)(seed.name, (0, import_nodes5.argumentValueNode)(seed.name))];
}
return [];
});
}
function allSeedsAreValid(instruction, foundPda, seeds) {
const hasAllVariableSeeds = foundPda.seeds.filter((0, import_nodes5.isNodeFilter)("variablePdaSeedNode")).length === seeds.length;
const allAccountsName = instruction.accounts.map((a) => a.name);
const allArgumentsName = (0, import_nodes5.getAllInstructionArguments)(instruction).map((a) => a.name);
const validSeeds = seeds.every((seed) => {
if ((0, import_nodes5.isNode)(seed.value, "accountValueNode")) {
return allAccountsName.includes(seed.value.name);
}
if ((0, import_nodes5.isNode)(seed.value, "argumentValueNode")) {
return allArgumentsName.includes(seed.value.name);
}
return true;
});
return hasAllVariableSeeds && validSeeds;
}
// src/flattenStructVisitor.ts
var import_errors5 = require("@codama/errors");
var import_nodes6 = require("@codama/nodes");
var import_visitors_core6 = require("@codama/visitors-core");
function flattenStructVisitor(map) {
return (0, import_visitors_core6.bottomUpTransformerVisitor)(
Object.entries(map).map(
([stack, options]) => ({
select: `${stack}.[structTypeNode]`,
transform: (node) => flattenStruct(node, options)
})
)
);
}
var flattenStruct = (node, options = "*") => {
(0, import_nodes6.assertIsNode)(node, "structTypeNode");
const camelCaseOptions = options === "*" ? options : options.map(import_nodes6.camelCase);
const shouldInline = (field) => options === "*" || camelCaseOptions.includes((0, import_nodes6.camelCase)(field.name));
const inlinedFields = node.fields.flatMap((field) => {
if ((0, import_nodes6.isNode)(field.type, "structTypeNode") && shouldInline(field)) {
return field.type.fields;
}
return [field];
});
const inlinedFieldsNames = inlinedFields.map((arg) => arg.name);
const duplicates = inlinedFieldsNames.filter((e, i, a) => a.indexOf(e) !== i);
const uniqueDuplicates = [...new Set(duplicates)];
const hasConflictingNames = uniqueDuplicates.length > 0;
if (hasConflictingNames) {
throw new import_errors5.CodamaError(import_errors5.CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES, {
conflictingAttributes: uniqueDuplicates
});
}
return hasConflictingNames ? node : (0, import_nodes6.structTypeNode)(inlinedFields);
};
// src/getDefinedTypeHistogramVisitor.ts
var import_visitors_core7 = require("@codama/visitors-core");
function mergeHistograms(histograms) {
const result = {};
histograms.forEach((histogram) => {
Object.keys(histogram).forEach((key) => {
const mainCaseKey = key;
if (result[mainCaseKey] === void 0) {
result[mainCaseKey] = histogram[mainCaseKey];
} else {
result[mainCaseKey].total += histogram[mainCaseKey].total;
result[mainCaseKey].inAccounts += histogram[mainCaseKey].inAccounts;
result[mainCaseKey].inDefinedTypes += histogram[mainCaseKey].inDefinedTypes;
result[mainCaseKey].inInstructionArgs += histogram[mainCaseKey].inInstructionArgs;
result[mainCaseKey].directlyAsInstructionArgs += histogram[mainCaseKey].directlyAsInstructionArgs;
}
});
});
return result;
}
function getDefinedTypeHistogramVisitor() {
const stack = new import_visitors_core7.NodeStack();
let mode = null;
let stackLevel = 0;
return (0, import_visitors_core7.pipe)(
(0, import_visitors_core7.mergeVisitor)(
() => ({}),
(_, histograms) => mergeHistograms(histograms)
),
(v) => (0, import_visitors_core7.interceptVisitor)(v, (node, next) => {
stackLevel += 1;
const newNode = next(node);
stackLevel -= 1;
return newNode;
}),
(v) => (0, import_visitors_core7.extendVisitor)(v, {
visitAccount(node, { self }) {
mode = "account";
stackLevel = 0;
const histogram = (0, import_visitors_core7.visit)(node.data, self);
mode = null;
return histogram;
},
visitDefinedType(node, { self }) {
mode = "definedType";
stackLevel = 0;
const histogram = (0, import_visitors_core7.visit)(node.type, self);
mode = null;
return histogram;
},
visitDefinedTypeLink(node) {
const program = (0, import_visitors_core7.findProgramNodeFromPath)(stack.getPath());
const key = program ? `${program.name}.${node.name}` : node.name;
return {
[key]: {
directlyAsInstructionArgs: Number(mode === "instruction" && stackLevel <= 1),
inAccounts: Number(mode === "account"),
inDefinedTypes: Number(mode === "definedType"),
inInstructionArgs: Number(mode === "instruction"),
total: 1
}
};
},
visitInstruction(node, { self }) {
mode = "instruction";
stackLevel = 0;
const dataHistograms = node.arguments.map((arg) => (0, import_visitors_core7.visit)(arg, self));
const extraHistograms = (node.extraArguments ?? []).map((arg) => (0, import_visitors_core7.visit)(arg, self));
mode = null;
const subHistograms = (node.subInstructions ?? []).map((ix) => (0, import_visitors_core7.visit)(ix, self));
return mergeHistograms([...dataHistograms, ...extraHistograms, ...subHistograms]);
}
}),
(v) => (0, import_visitors_core7.recordNodeStackVisitor)(v, stack)
);
}
// src/setAccountDiscriminatorFromFieldVisitor.ts
var import_errors6 = require("@codama/errors");
var import_nodes7 = require("@codama/nodes");
var import_visitors_core8 = require("@codama/visitors-core");
function setAccountDiscriminatorFromFieldVisitor(map) {
return (0, import_visitors_core8.bottomUpTransformerVisitor)(
Object.entries(map).map(
([selector, { field, value, offset }]) => ({
select: ["[accountNode]", selector],
transform: (node) => {
(0, import_nodes7.assertIsNode)(node, "accountNode");
const accountData = (0, import_nodes7.resolveNestedTypeNode)(node.data);
const fieldIndex = accountData.fields.findIndex((f) => f.name === field);
if (fieldIndex < 0) {
throw new import_errors6.CodamaError(import_errors6.CODAMA_ERROR__VISITORS__ACCOUNT_FIELD_NOT_FOUND, {
account: node,
missingField: field,
name: node.name
});
}
const fieldNode = accountData.fields[fieldIndex];
return (0, import_nodes7.accountNode)({
...node,
data: (0, import_nodes7.transformNestedTypeNode)(
node.data,
() => (0, import_nodes7.structTypeNode)([
...accountData.fields.slice(0, fieldIndex),
(0, import_nodes7.structFieldTypeNode)({
...fieldNode,
defaultValue: value,
defaultValueStrategy: "omitted"
}),
...accountData.fields.slice(fieldIndex + 1)
])
),
discriminators: [(0, import_nodes7.fieldDiscriminatorNode)(field, offset), ...node.discriminators ?? []]
});
}
})
)
);
}
// src/setFixedAccountSizesVisitor.ts
var import_nodes8 = require("@codama/nodes");
var import_visitors_core9 = require("@codama/visitors-core");
function setFixedAccountSizesVisitor() {
const linkables = new import_visitors_core9.LinkableDictionary();
const visitor = (0, import_visitors_core9.topDownTransformerVisitor)(
[
{
select: (path) => (0, import_visitors_core9.isNodePath)(path, "accountNode") && (0, import_visitors_core9.getLastNodeFromPath)(path).size === void 0,
transform: (node, stack) => {
(0, import_nodes8.assertIsNode)(node, "accountNode");
const size = (0, import_visitors_core9.visit)(node.data, (0, import_visitors_core9.getByteSizeVisitor)(linkables, { stack }));
if (size === null) return node;
return (0, import_nodes8.accountNode)({ ...node, size });
}
}
],
{ keys: ["rootNode", "programNode", "accountNode"] }
);
return (0, import_visitors_core9.pipe)(visitor, (v) => (0, import_visitors_core9.recordLinkablesOnFirstVisitVisitor)(v, linkables));
}
// src/setInstructionAccountDefaultValuesVisitor.ts
var import_nodes9 = require("@codama/nodes");
var import_visitors_core10 = require("@codama/visitors-core");
var getCommonInstructionAccountDefaultRules = () => [
{
account: /^(payer|feePayer)$/,
defaultValue: (0, import_nodes9.payerValueNode)(),
ignoreIfOptional: true
},
{
account: /^(authority)$/,
defaultValue: (0, import_nodes9.identityValueNode)(),
ignoreIfOptional: true
},
{
account: /^(programId)$/,
defaultValue: (0, import_nodes9.programIdValueNode)(),
ignoreIfOptional: true
},
{
account: /^(systemProgram|splSystemProgram)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("11111111111111111111111111111111", "splSystem"),
ignoreIfOptional: true
},
{
account: /^(tokenProgram|splTokenProgram)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", "splToken"),
ignoreIfOptional: true
},
{
account: /^(ataProgram|splAtaProgram)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", "splAssociatedToken"),
ignoreIfOptional: true
},
{
account: /^(tokenMetadataProgram|mplTokenMetadataProgram)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", "mplTokenMetadata"),
ignoreIfOptional: true
},
{
account: /^(tokenAuth|mplTokenAuth|authorization|mplAuthorization|auth|mplAuth)RulesProgram$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg", "mplTokenAuthRules"),
ignoreIfOptional: true
},
{
account: /^(candyMachineProgram|mplCandyMachineProgram)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR", "mplCandyMachine"),
ignoreIfOptional: true
},
{
account: /^(candyGuardProgram|mplCandyGuardProgram)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g", "mplCandyGuard"),
ignoreIfOptional: true
},
{
account: /^(clockSysvar|sysvarClock)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("SysvarC1ock11111111111111111111111111111111"),
ignoreIfOptional: true
},
{
account: /^(epochScheduleSysvar|sysvarEpochSchedule)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("SysvarEpochSchedu1e111111111111111111111111"),
ignoreIfOptional: true
},
{
account: /^(instructions?Sysvar|sysvarInstructions?)(Account)?$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("Sysvar1nstructions1111111111111111111111111"),
ignoreIfOptional: true
},
{
account: /^(recentBlockhashesSysvar|sysvarRecentBlockhashes)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("SysvarRecentB1ockHashes11111111111111111111"),
ignoreIfOptional: true
},
{
account: /^(rent|rentSysvar|sysvarRent)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("SysvarRent111111111111111111111111111111111"),
ignoreIfOptional: true
},
{
account: /^(rewardsSysvar|sysvarRewards)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("SysvarRewards111111111111111111111111111111"),
ignoreIfOptional: true
},
{
account: /^(slotHashesSysvar|sysvarSlotHashes)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("SysvarS1otHashes111111111111111111111111111"),
ignoreIfOptional: true
},
{
account: /^(slotHistorySysvar|sysvarSlotHistory)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("SysvarS1otHistory11111111111111111111111111"),
ignoreIfOptional: true
},
{
account: /^(stakeHistorySysvar|sysvarStakeHistory)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("SysvarStakeHistory1111111111111111111111111"),
ignoreIfOptional: true
},
{
account: /^(mplCoreProgram)$/,
defaultValue: (0, import_nodes9.publicKeyValueNode)("CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d", "mplCore"),
ignoreIfOptional: true
}
];
function setInstructionAccountDefaultValuesVisitor(rules) {
const linkables = new import_visitors_core10.LinkableDictionary();
const stack = new import_visitors_core10.NodeStack();
const sortedRules = rules.sort((a, b) => {
const ia = "instruction" in a;
const ib = "instruction" in b;
if (ia && ib || !a && !ib) return 0;
return ia ? -1 : 1;
});
function matchRule(instruction, account) {
return sortedRules.find((rule) => {
if ("instruction" in rule && rule.instruction && (0, import_nodes9.camelCase)(rule.instruction) !== instruction.name) {
return false;
}
return typeof rule.account === "string" ? (0, import_nodes9.camelCase)(rule.account) === account.name : rule.account.test(account.name);
});
}
return (0, import_visitors_core10.pipe)(
(0, import_visitors_core10.nonNullableIdentityVisitor)({ keys: ["rootNode", "programNode", "instructionNode"] }),
(v) => (0, import_visitors_core10.extendVisitor)(v, {
visitInstruction(node) {
const instructionPath = stack.getPath("instructionNode");
const instructionAccounts = node.accounts.map((account) => {
const rule = matchRule(node, account);
if (!rule) return account;
if ((rule.ignoreIfOptional ?? false) && (account.isOptional || !!account.defaultValue)) {
return account;
}
try {
return {
...account,
defaultValue: (0, import_visitors_core10.visit)(
rule.defaultValue,
fillDefaultPdaSeedValuesVisitor(instructionPath, linkables, true)
)
};
} catch {
return account;
}
});
return (0, import_nodes9.instructionNode)({
...node,
accounts: instructionAccounts
});
}
}),
(v) => (0, import_visitors_core10.recordNodeStackVisitor)(v, stack),
(v) => (0, import_visitors_core10.recordLinkablesOnFirstVisitVisitor)(v, linkables)
);
}
// src/setInstructionDiscriminatorsVisitor.ts
var import_nodes10 = require("@codama/nodes");
var import_visitors_core11 = require("@codama/visitors-core");
function setInstructionDiscriminatorsVisitor(map) {
return (0, import_visitors_core11.bottomUpTransformerVisitor)(
Object.entries(map).map(
([selector, discriminator]) => ({
select: ["[instructionNode]", selector],
transform: (node) => {
(0, import_nodes10.assertIsNode)(node, "instructionNode");
const discriminatorArgument = (0, import_nodes10.instructionArgumentNode)({
defaultValue: discriminator.value,
defaultValueStrategy: discriminator.strategy ?? "omitted",
docs: discriminator.docs ?? [],
name: discriminator.name ?? "discriminator",
type: discriminator.type ?? (0, import_nodes10.numberTypeNode)("u8")
});
return (0, import_nodes10.instructionNode)({
...node,
arguments: [discriminatorArgument, ...node.arguments],
discriminators: [
(0, import_nodes10.fieldDiscriminatorNode)(discriminator.name ?? "discriminator"),
...node.discriminators ?? []
]
});
}
})
)
);
}
// src/setNumberWrappersVisitor.ts
var import_errors7 = require("@codama/errors");
var import_nodes11 = require("@codama/nodes");
var import_visitors_core12 = require("@codama/visitors-core");
function setNumberWrappersVisitor(map) {
return (0, import_visitors_core12.bottomUpTransformerVisitor)(
Object.entries(map).map(
([selectorStack, wrapper]) => ({
select: `${selectorStack}.[numberTypeNode]`,
transform: (node) => {
(0, import_nodes11.assertIsNestedTypeNode)(node, "numberTypeNode");
switch (wrapper.kind) {
case "DateTime":
return (0, import_nodes11.dateTimeTypeNode)(node);
case "SolAmount":
return (0, import_nodes11.solAmountTypeNode)(node);
case "Amount":
return (0, import_nodes11.amountTypeNode)(node, wrapper.decimals, wrapper.unit);
default:
throw new import_errors7.CodamaError(import_errors7.CODAMA_ERROR__VISITORS__INVALID_NUMBER_WRAPPER, { wrapper });
}
}
})
)
);
}
// src/setStructDefaultValuesVisitor.ts
var import_nodes12 = require("@codama/nodes");
var import_visitors_core13 = require("@codama/visitors-core");
function setStructDefaultValuesVisitor(map) {
return (0, import_visitors_core13.bottomUpTransformerVisitor)(
Object.entries(map).flatMap(([stack, defaultValues]) => {
const camelCasedDefaultValues = Object.fromEntries(
Object.entries(defaultValues).map(([key, value]) => [(0, import_nodes12.camelCase)(key), value])
);
return [
{
select: `${stack}.[structTypeNode]`,
transform: (node) => {
(0, import_nodes12.assertIsNode)(node, "structTypeNode");
const fields = node.fields.map((field) => {
const defaultValue = camelCasedDefaultValues[field.name];
if (defaultValue === void 0) return field;
if (defaultValue === null) {
return (0, import_nodes12.structFieldTypeNode)({
...field,
defaultValue: void 0,
defaultValueStrategy: void 0
});
}
return (0, import_nodes12.structFieldTypeNode)({
...field,
defaultValue: "kind" in defaultValue ? defaultValue : defaultValue.value,
defaultValueStrategy: "kind" in defaultValue ? void 0 : defaultValue.strategy
});
});
return (0, import_nodes12.structTypeNode)(fields);
}
},
{
select: ["[instructionNode]", stack],
transform: (node) => {
(0, import_nodes12.assertIsNode)(node, "instructionNode");
const transformArguments = (arg) => {
const defaultValue = camelCasedDefaultValues[arg.name];
if (defaultValue === void 0) return arg;
if (defaultValue === null) {
return (0, import_nodes12.instructionArgumentNode)({
...arg,
defaultValue: void 0,
defaultValueStrategy: void 0
});
}
return (0, import_nodes12.instructionArgumentNode)({
...arg,
defaultValue: "kind" in defaultValue ? defaultValue : defaultValue.value,
defaultValueStrategy: "kind" in defaultValue ? void 0 : defaultValue.strategy
});
};
return (0, import_nodes12.instructionNode)({
...node,
arguments: node.arguments.map(transformArguments),
extraArguments: node.extraArguments ? node.extraArguments.map(transformArguments) : void 0
});
}
}
];
})
);
}
// src/transformDefinedTypesIntoAccountsVisitor.ts
var import_nodes13 = require("@codama/nodes");
var import_visitors_core14 = require("@codama/visitors-core");
function transformDefinedTypesIntoAccountsVisitor(definedTypes) {
return (0, import_visitors_core14.pipe)(
(0, import_visitors_core14.nonNullableIdentityVisitor)({ keys: ["rootNode", "programNode"] }),
(v) => (0, import_visitors_core14.extendVisitor)(v, {
visitProgram(program) {
const typesToExtract = program.definedTypes.filter((node) => definedTypes.includes(node.name));
const newDefinedTypes = program.definedTypes.filter((node) => !definedTypes.includes(node.name));
const newAccounts = typesToExtract.map((node) => {
(0, import_nodes13.assertIsNode)(node.type, "structTypeNode");
return (0, import_nodes13.accountNode)({
...node,
data: node.type,
discriminators: [],
size: void 0
});
});
return (0, import_nodes13.programNode)({
...program,
accounts: [...program.accounts, ...newAccounts],
definedTypes: newDefinedTypes
});
}
})
);
}
// src/transformU8ArraysToBytesVisitor.ts
var import_nodes14 = require("@codama/nodes");
var import_visitors_core15 = require("@codama/visitors-core");
function transformU8ArraysToBytesVisitor(sizes = "*") {
const hasRequiredSize = (count) => {
if (!(0, import_nodes14.isNode)(count, "fixedCountNode")) return false;
return sizes === "*" || sizes.includes(count.value);
};
return (0, import_visitors_core15.pipe)(
(0, import_visitors_core15.nonNullableIdentityVisitor)(),
(v) => (0, import_visitors_core15.extendVisitor)(v, {
visitArrayType(node, { self }) {
const child = (0, import_visitors_core15.visit)(node.item, self);
(0, import_nodes14.assertIsNode)(child, import_nodes14.TYPE_NODES);
if ((0, import_nodes14.isNode)(child, "numberTypeNode") && child.format === "u8" && (0, import_nodes14.isNode)(node.count, "fixedCountNode") && hasRequiredSize(node.count)) {
return (0, import_nodes14.fixedSizeTypeNode)((0, import_nodes14.bytesTypeNode)(), node.count.value);
}
return (0, import_nodes14.arrayTypeNode)(child, node.count);
}
})
);
}
// src/unwrapDefinedTypesVisitor.ts
var import_nodes15 = require("@codama/nodes");
var import_visitors_core16 = require("@codama/visitors-core");
function unwrapDefinedTypesVisitor(typesToInline = "*") {
const linkables = new import_visitors_core16.LinkableDictionary();
const stack = new import_visitors_core16.NodeStack();
const typesToInlineCamelCased = (typesToInline === "*" ? [] : typesToInline).map((fullPath) => {
if (!fullPath.includes(".")) return (0, import_nodes15.camelCase)(fullPath);
const [programName, typeName] = fullPath.split(".");
return `${(0, import_nodes15.camelCase)(programName)}.${(0, import_nodes15.camelCase)(typeName)}`;
});
const shouldInline = (typeName, programName) => {
if (typesToInline === "*") return true;
const fullPath = `${programName}.${typeName}`;
if (!!programName && typesToInlineCamelCased.includes(fullPath)) return true;
return typesToInlineCamelCased.includes(typeName);
};
return (0, import_visitors_core16.pipe)(
(0, import_visitors_core16.nonNullableIdentityVisitor)(),
(v) => (0, import_visitors_core16.extendVisitor)(v, {
visitDefinedTypeLink(linkType, { self }) {
const programName = linkType.program?.name ?? (0, import_visitors_core16.findProgramNodeFromPath)(stack.getPath())?.name;
if (!shouldInline(linkType.name, programName)) {
return linkType;
}
const definedTypePath = linkables.getPathOrThrow(stack.getPath("definedTypeLinkNode"));
const definedType = (0, import_visitors_core16.getLastNodeFromPath)(definedTypePath);
stack.pushPath(definedTypePath);
const result = (0, import_visitors_core16.visit)(definedType.type, self);
stack.popPath();
return result;
},
visitProgram(program, { self }) {
return (0, import_nodes15.programNode)({
...program,
accounts: program.accounts.map((account) => (0, import_visitors_core16.visit)(account, self)).filter((0, import_nodes15.assertIsNodeFilter)("accountNode")),
definedTypes: program.definedTypes.filter((definedType) => !shouldInline(definedType.name, program.name)).map((type) => (0, import_visitors_core16.visit)(type, self)).filter((0, import_nodes15.assertIsNodeFilter)("definedTypeNode")),
instructions: program.instructions.map((instruction) => (0, import_visitors_core16.visit)(instruction, self)).filter((0, import_nodes15.assertIsNodeFilter)("instructionNode"))
});
}
}),
(v) => (0, import_visitors_core16.recordNodeStackVisitor)(v, stack),
(v) => (0, import_visitors_core16.recordLinkablesOnFirstVisitVisitor)(v, linkables)
);
}
// src/unwrapInstructionArgsDefinedTypesVisitor.ts
var import_nodes16 = require("@codama/nodes");
var import_visitors_core17 = require("@codama/visitors-core");
function unwrapInstructionArgsDefinedTypesVisitor() {
return (0, import_visitors_core17.rootNodeVisitor)((root) => {
const histogram = (0, import_visitors_core17.visit)(root, getDefinedTypeHistogramVisitor());
const linkables = new import_visitors_core17.LinkableDictionary();
(0, import_visitors_core17.visit)(root, (0, import_visitors_core17.getRecordLinkablesVisitor)(linkables));
const definedTypesToInline = Object.keys(histogram).filter((key) => (histogram[key].total ?? 0) === 1 && (histogram[key].directlyAsInstructionArgs ?? 0) === 1).filter((key) => {
const names = key.split(".");
const link = names.length == 2 ? (0, import_nodes16.definedTypeLinkNode)(names[1], names[0]) : (0, import_nodes16.definedTypeLinkNode)(key);
const found = linkables.get([link]);
return found && !(0, import_nodes16.isNode)(found.type, "enumTypeNode");
});
if (definedTypesToInline.length > 0) {
const inlineVisitor = unwrapDefinedTypesVisitor(definedTypesToInline);
const newRoot = (0, import_visitors_core17.visit)(root, inlineVisitor);
(0, import_nodes16.assertIsNode)(newRoot, "rootNode");
return newRoot;
}
return root;
});
}
// src/unwrapTupleEnumWithSingleStructVisitor.ts
var import_nodes17 = require("@codama/nodes");
var import_visitors_core18 = require("@codama/visitors-core");
function unwrapTupleEnumWithSingleStructVisitor(enumsOrVariantsToUnwrap = "*") {
const selectorFunctions = enumsOrVariantsToUnwrap === "*" ? [() => true] : enumsOrVariantsToUnwrap.map((selector) => (0, import_visitors_core18.getNodeSelectorFunction)(selector));
const shouldUnwrap = (stack) => selectorFunctions.some((selector) => selector(stack.getPath()));
return (0, import_visitors_core18.rootNodeVisitor)((root) => {
const typesToPotentiallyUnwrap = [];
const definedTypes = new Map(
(0, import_nodes17.getAllDefinedTypes)(root).map((definedType) => [definedType.name, definedType])
);
let newRoot = (0, import_visitors_core18.visit)(
root,
(0, import_visitors_core18.bottomUpTransformerVisitor)([
{
select: "[enumTupleVariantTypeNode]",
transform: (node, stack) => {
(0, import_nodes17.assertIsNode)(node, "enumTupleVariantTypeNode");
if (!shouldUnwrap(stack)) return node;
const tupleNode = (0, import_nodes17.resolveNestedTypeNode)(node.tuple);
if (tupleNode.items.length !== 1) return node;
let item = tupleNode.items[0];
if ((0, import_nodes17.isNode)(item, "definedTypeLinkNode")) {
const definedType = definedTypes.get(item.name);
if (!definedType) return node;
if (!(0, import_nodes17.isNode)(definedType.type, "structTypeNode")) return node;
typesToPotentiallyUnwrap.push(item.name);
item = definedType.type;
}
if (!(0, import_nodes17.isNode)(item, "structTypeNode")) return node;
const nestedStruct = (0, import_nodes17.transformNestedTypeNode)(node.tuple, () => item);
return (0, import_nodes17.enumStructVariantTypeNode)(node.name, nestedStruct);
}
}
])
);
(0, import_nodes17.assertIsNode)(newRoot, "rootNode");
const histogram = (0, import_visitors_core18.visit)(newRoot, getDefinedTypeHistogramVisitor());
const typesToUnwrap = typesToPotentiallyUnwrap.filter(
(type) => !histogram[type] || histogram[type].total === 0
);
newRoot = (0, import_visitors_core18.visit)(newRoot, unwrapDefinedTypesVisitor(typesToUnwrap));
(0, import_nodes17.assertIsNode)(newRoot, "rootNode");
return newRoot;
});
}
// src/unwrapTypeDefinedLinksVisitor.ts
var import_visitors_core19 = require("@codama/visitors-core");
function unwrapTypeDefinedLinksVisitor(definedLinksType) {
const linkables = new import_visitors_core19.LinkableDictionary();
const transformers = definedLinksType.map((selector) => ({
select: ["[definedTypeLinkNode]", selector],
transform: (_, stack) => {
const definedType = linkables.getOrThrow(stack.getPath("definedTypeLinkNode"));
return definedType.type;
}
}));
return (0, import_visitors_core19.pipe)((0, import_visitors_core19.bottomUpTransformerVisitor)(transformers), (v) => (0, import_visitors_core19.recordLinkablesOnFirstVisitVisitor)(v, linkables));
}
// src/updateAccountsVisitor.ts
var import_nodes19 = require("@codama/nodes");
var import_visitors_core20 = require("@codama/visitors-core");
// src/renameHelpers.ts
var import_nodes18 = require("@codama/nodes");
function renameStructNode(node, map) {
return (0, import_nodes18.structTypeNode)(
node.fields.map((field) => map[field.name] ? (0, import_nodes18.structFieldTypeNode)({ ...field, name: map[field.name] }) : field)
);
}
function renameEnumNode(node, map) {
return (0, import_nodes18.enumTypeNode)(
node.variants.map((variant) => map[variant.name] ? renameEnumVariant(variant, map[variant.name]) : variant),
{ ...node }
);
}
function renameEnumVariant(variant, newName) {
if ((0, import_nodes18.isNode)(variant, "enumStructVariantTypeNode")) {
return (0, import_nodes18.enumStructVariantTypeNode)(newName, variant.struct);
}
if ((0, import_nodes18.isNode)(variant, "enumTupleVariantTypeNode")) {
return (0, import_nodes18.enumTupleVariantTypeNode)(newName, variant.tuple);
}
return (0, import_nodes18.enumEmptyVariantTypeNode)(newName);
}
// src/updateAccountsVisitor.ts
function updateAccountsVisitor(map) {
return (0, import_visitors_core20.bottomUpTransformerVisitor)(
Object.entries(map).flatMap(([selector, updates]) => {
const newName = typeof updates === "object" && "name" in updates && updates.name ? (0, import_nodes19.camelCase)(updates.name) : void 0;
const pdasToUpsert = [];
const transformers = [
{
select: ["[accountNode]", selector],
transform: (node, stack) => {
(0, import_nodes19.assertIsNode)(node, "accountNode");
if ("delete" in updates) return null;
const programNode6 = (0, import_visitors_core20.findProgramNodeFromPath)(stack.getPath());
const { seeds, pda, ...assignableUpdates } = updates;
let newPda = node.pda;
if (pda && seeds !== void 0) {
newPda = pda;
pdasToUpsert.push({
pda: (0, import_nodes19.pdaNode)({ name: pda.name, seeds }),
program: programNode6.name
});
} else if (pda) {
newPda = pda;
} else if (seeds !== void 0 && node.pda) {
pdasToUpsert.push({
pda: (0, import_nodes19.pdaNode)({ name: node.pda.name, seeds }),
program: programNode6.name
});
} else if (seeds !== void 0) {
newPda = (0, import_nodes19.pdaLinkNode)(newName ?? node.name);
pdasToUpsert.push({
pda: (0, import_nodes19.pdaNode)({ name: newName ?? node.name, seeds }),
program: programNode6.name
});
}
return (0, import_nodes19.accountNode)({
...node,
...assignableUpdates,
data: (0, import_nodes19.transformNestedTypeNode)(
node.data,
(struct) => renameStructNode(struct, updates.data ?? {})
),
pda: newPda
});
}
},
{
select: `[programNode]`,
transform: (node) => {
(0, import_nodes19.assertIsNode)(node, "programNode");
const pdasToUpsertForProgram = pdasToUpsert.filter((p) => p.program === node.name).map((p) => p.pda);
if (pdasToUpsertForProgram.length === 0) return node;
const existingPdaNames = new Set(node.pdas.map((pda) => pda.name));
const pdasToCreate = pdasToUpsertForProgram.filter((p) => !existingPdaNames.has(p.name));
const pdasToUpdate = new Map(
pdasToUpsertForProgram.filter((p) => existingPdaNames.has(p.name)).map((p) => [p.name, p])
);
const newPdas = [...node.pdas.map((p) => pdasToUpdate.get(p.name) ?? p), ...pdasToCreate];
return (0, import_nodes19.programNode)({ ...node, pdas: newPdas });
}
}
];
if (newName) {
transformers.push(
{
select: ["[accountLinkNode]", selector],
transform: (node) => {
(0, import_nodes19.assertIsNode)(node, "accountLinkNode");
return (0, import_nodes19.accountLinkNode)(newName);
}
},
{
select: ["[pdaNode]", selector],
transform: (node) => {
(0, import_nodes19.assertIsNode)(node, "pdaNode");
return (0, import_nodes19.pdaNode)({ name: newName, seeds: node.seeds });
}
},
{
select: ["[pdaLinkNode]", selector],
transform: (node) => {
(0, import_nodes19.assertIsNode)(node, "pdaLinkNode");
return (0, import_nodes19.pdaLinkNode)(newName);
}
}
);
}
return transformers;
})
);
}
// src/updateDefinedTypesVisitor.ts
var import_nodes20 = require("@codama/nodes");
var import_visitors_core21 = require("@codama/visitors-core");
function updateDefinedTypesVisitor(map) {
return (0, import_visitors_core21.bottomUpTransformerVisitor)(
Object.entries(map).flatMap(([selector, updates]) => {
const newName = typeof updates === "object" && "name" in updates && updates.name ? (0, import_nodes20.camelCase)(updates.name) : void 0;
const transformers = [
{
select: ["[definedTypeNode]", selector],
transform: (node) => {
(0, import_nodes20.assertIsNode)(node, "definedTypeNode");
if ("delete" in updates) {
return null;
}
const { data: dataUpdates, ...otherUpdates } = updates;
let newType = node.type;
if ((0, import_nodes20.isNode)(node.type, "structTypeNode")) {
newType = renameStructNode(node.type, dataUpdates ?? {});
} else if ((0, import_nodes20.isNode)(node.type, "enumTypeNode")) {
newType = renameEnumNode(node.type, dataUpdates ?? {});
}
return (0, import_nodes20.definedTypeNode)({
...node,
...otherUpdates,
name: newName ?? node.name,
type: newType
});
}
}
];
if (newName) {
transformers.push({
select: ["[definedTypeLinkNode]", selector],
transform: (node) => {
(0, import_nodes20.assertIsNode)(node, "definedTypeLinkNode");
return (0, import_nodes20.definedTypeLinkNode)(newName);
}
});
}
return transformers;
})
);
}
// src/updateErrorsVisitor.ts
var import_nodes21 = require("@codama/nodes");
var import_visitors_core22 = require("@codama/visitors-core");
function updateErrorsVisitor(map) {
return (0, import_visitors_core22.bottomUpTransformerVisitor)(
Object.entries(map).map(
([name, updates]) => ({
select: `[errorNode]${name}`,
transform: (node) => {
(0, import_nodes21.assertIsNode)(node, "errorNode");
if ("delete" in updates) return null;
return (0, import_nodes21.errorNode)({ ...node, ...updates });
}
})
)
);
}
// src/updateInstructionsVisitor.ts
var import_nodes22 = require("@codama/nodes");
var import_visitors_core23 = require("@codama/visitors-core");
function updateInstructionsVisitor(map) {
const linkables = new import_visitors_core23.LinkableDictionary();
const stack = new import_visitors_core23.NodeStack();
const transformers = Object.entries(map).map(
([selector, updates]) => ({
select: ["[instructionNode]", selector],
transform: (node) => {
(0, import_nodes22.assertIsNode)(node, "instructionNode");
if ("delete" in updates) {
return null;
}
const instructionPath = stack.getPath("instructionNode");
const { accounts: accountUpdates, arguments: argumentUpdates, ...metadataUpdates } = updates;
const { newArguments, newExtraArguments } = handleInstructionArguments(node, argumentUpdates ?? {});
const newAccounts = node.accounts.map(
(account) => handleInstructionAccount(instructionPath, account, accountUpdates ?? {}, linkables)
);
return (0, import_nodes22.instructionNode)({
...node,
...metadataUpdates,
accounts: newAccounts,
arguments: newArguments,
extraArguments: newExtraArguments.length > 0 ? newExtraArguments : void 0
});
}
})
);
return (0, import_visitors_core23.pipe)(
(0, import_visitors_core23.bottomUpTransformerVisitor)(transformers),
(v) => (0, import_visitors_core23.recordNodeStackVisitor)(v, stack),
(v) => (0, import_visitors_core23.recordLinkablesOnFirstVisitVisitor)(v, linkables)
);
}
function handleInstructionAccount(instructionPath, account, accountUpdates, linkables) {
const accountUpdate = accountUpdates?.[account.name];
if (!accountUpdate) return account;
const { defaultValue, ...acountWithoutDefault } = {
...account,
...accountUpdate
};
if (!defaultValue) {
return (0, import_nodes22.instructionAccountNode)(acountWithoutDefault);
}
return (0, import_nodes22.instructionAccountNode)({
...acountWithoutDefault,
defaultValue: (0, import_visitors_core23.visit)(defaultValue, fillDefaultPdaSeedValuesVisitor(instructionPath, linkables))
});
}
function handleInstructionArguments(instruction, argUpdates) {
const usedArguments = /* @__PURE__ */ new Set();
const newArguments = instruction.arguments.map((node) => {
const argUpdate = argUpdates[node.name];
if (!argUpdate) return node;
usedArguments.add(node.name);
return (0, import_nodes22.instructionArgumentNode)({
...node,
defaultValue: argUpdate.defaultValue ?? node.defaultValue,
defaultValueStrategy: argUpdate.defaultValueStrategy ?? node.defaultValueStrategy,
docs: argUpdate.docs ?? node.docs,
name: argUpdate.name ?? node.name,
type: argUpdate.type ?? node.type
});
});
const updatedExtraArguments = (instruction.extraArguments ?? []).map((node) => {
if (usedArguments.has(node.name)) return node;
const argUpdate = argUpdates[node.name];
if (!argUpdate) return node;
usedArguments.add(node.name);
return (0, import_nodes22.instructionArgumentNode)({
...node,
defaultValue: argUpdate.defaultValue ?? node.defaultValue,
defaultValueStrategy: argUpdate.defaultValueStrategy ?? node.defaultValueStrategy,
docs: argUpdate.docs ?? node.docs,
name: argUpdate.name ?? node.name,
type: argUpdate.type ?? node.type
});
});
const newExtraArguments = [
...updatedExtraArguments,
...Object.entries(argUpdates).filter(([argName]) => !usedArguments.has(argName)).map(([argName, argUpdate]) => {
const { type } = argUpdate;
(0, import_nodes22.assertIsNode)(type, import_nodes22.TYPE_NODES);
return (0, import_nodes22.instructionArgumentNode)({
defaultValue: argUpdate.defaultValue ?? void 0,
defaultValueStrategy: argUpdate.defaultValueStrategy ?? void 0,
docs: argUpdate.docs ?? [],
name: argUpdate.name ?? argName,
type
});
})
];
return { newArguments, newExtraArguments };
}
// src/updateProgramsVisitor.ts
var import_nodes23 = require("@codama/nodes");
var import_visitors_core24 = require("@codama/visitors-core");
function updateProgramsVisitor(map) {
return (0, import_visitors_core24.bottomUpTransformerVisitor)(
Object.entries(map).flatMap(([name, updates]) => {
const newName = typeof updates === "object" && "name" in updates && updates.name ? (0, import_nodes23.camelCase)(updates.name) : void 0;
const transformers = [
{
select: `[programNode]${name}`,
transform: (node) => {
(0, import_nodes23.assertIsNode)(node, "programNode");
if ("delete" in updates) return null;
return (0, import_nodes23.programNode)({ ...node, ...updates });
}
}
];
if (newName) {
transformers.push({
select: `[programLinkNode]${name}`,
transform: (node) => {
(0, import_nodes23.assertIsNode)(node, "programLinkNode");
return (0, import_nodes23.programLinkNode)(newName);
}
});
}
return transformers;
})
);
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
addPdasVisitor,
createSubInstructionsFromEnumArgsVisitor,
deduplicateIdenticalDefinedTypesVisitor,
fillDefaultPdaSeedValuesVisitor,
flattenInstructionArguments,
flattenInstructionDataArgumentsVisitor,
flattenStruct,
flattenStructVisitor,
getCommonInstructionAccountDefaultRules,
getDefinedTypeHistogramVisitor,
setAccountDiscriminatorFromFieldVisitor,
setFixedAccountSizesVisitor,
setInstructionAccountDefaultValuesVisitor,
setInstructionDiscriminatorsVisitor,
setNumberWrappersVisitor,
setStructDefaultValuesVisitor,
transformDefinedTypesIntoAccountsVisitor,
transformU8ArraysToBytesVisitor,
unwrapDefinedTypesVisitor,
unwrapInstructionArgsDefinedTypesVisitor,
unwrapTupleEnumWithSingleStructVisitor,
unwrapTypeDefinedLinksVisitor,
updateAccountsVisitor,
updateDefinedTypesVisitor,
updateErrorsVisitor,
updateInstructionsVisitor,
updateProgramsVisitor,
...require("@codama/visitors-core")
});
//# sourceMappingURL=index.node.cjs.map