UNPKG

@macalinao/codama-instruction-accounts-dedupe-visitor

Version:

Codama visitor for deduplicating instruction accounts from Anchor IDL

53 lines 2.47 kB
import { assertIsNode, bottomUpTransformerVisitor, camelCase, visit, } from "codama"; import { instructionAccountNodesFromAnchorV01 } from "./instruction-account-nodes-from-anchor-v01.js"; /** * Creates a Codama program visitor that deduplicates and flattens nested instruction accounts from an Anchor IDL. * * This is a program-level visitor that can be composed with other visitors. It transforms * instruction nodes to have flattened account structures, removing nested account groups. * * @param idl - The Anchor IDL containing the instruction definitions with potentially nested accounts * @returns A visitor that transforms all instruction nodes to have flattened account structures * * @example * ```typescript * // Use with a single program * const programNode = programNodeFromAnchor(idl); * const visitor = instructionAccountsDedupeProgramVisitor(idl); * const transformedProgram = visit(programNode, visitor); * * // Or compose with other visitors * const composedVisitor = mergeVisitor( * instructionAccountsDedupeProgramVisitor(idl), * otherProgramVisitor(), * ); * ``` * * @remarks * - This visitor operates at the program level, not the root level * - Account names are joined with underscores to maintain parent-child relationships * - PDA seed paths are automatically updated to match the flattened structure * - All account metadata and constraints are preserved during flattening */ export function instructionAccountsDedupeProgramVisitor(idl, programNode) { const accountNodes = programNode.accounts; const instructionVisitor = bottomUpTransformerVisitor([ { select: "[instructionNode]", transform: (instructionNode) => { assertIsNode(instructionNode, "instructionNode"); const idlIx = idl.instructions.find((ix) => camelCase(ix.name) === instructionNode.name); if (!idlIx) { throw new Error(`Instruction ${instructionNode.name} not found in IDL`); } // Always use the flattening visitor to handle nested accounts return { ...instructionNode, accounts: instructionAccountNodesFromAnchorV01(accountNodes, instructionNode.arguments, idlIx.accounts), }; }, }, ]); return visit(programNode, instructionVisitor); } //# sourceMappingURL=instruction-accounts-dedupe-program-visitor.js.map