{"version":3,"sources":["../src/ValidationItem.ts","../src/getValidationItemsVisitor.ts","../src/throwValidatorItemsVisitor.ts"],"names":["LinkableDictionary","NodeStack","pipe","mergeVisitor","recordLinkablesVisitor","recordNodeStackVisitor","extendVisitor","getResolvedInstructionInputsVisitor","visit","getAllInstructionArguments","camelCase","isNode","mapVisitor","KinobiError","KINOBI_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE"],"mappings":"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","file":"index.node.cjs","sourcesContent":["import { Node } from '@kinobi-so/nodes';\nimport { NodeStack } from '@kinobi-so/visitors-core';\n\nexport const LOG_LEVELS = ['debug', 'trace', 'info', 'warn', 'error'] as const;\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\nexport type ValidationItem = {\n    level: LogLevel;\n    message: string;\n    node: Node;\n    stack: readonly Node[];\n};\n\nexport function validationItem(\n    level: LogLevel,\n    message: string,\n    node: Node,\n    stack: Node[] | NodeStack,\n): ValidationItem {\n    return {\n        level,\n        message,\n        node,\n        stack: Array.isArray(stack) ? [...stack] : stack.all(),\n    };\n}\n\nexport const getLevelIndex = (level: LogLevel): number => LOG_LEVELS.indexOf(level);\n","import { camelCase, getAllInstructionArguments, isNode } from '@kinobi-so/nodes';\nimport {\n    extendVisitor,\n    getResolvedInstructionInputsVisitor,\n    LinkableDictionary,\n    mergeVisitor,\n    NodeStack,\n    pipe,\n    recordLinkablesVisitor,\n    recordNodeStackVisitor,\n    visit,\n    Visitor,\n} from '@kinobi-so/visitors-core';\n\nimport { ValidationItem, validationItem } from './ValidationItem';\n\nexport function getValidationItemsVisitor(): Visitor<readonly ValidationItem[]> {\n    const linkables = new LinkableDictionary();\n    const stack = new NodeStack();\n\n    return pipe(\n        mergeVisitor(\n            () => [] as readonly ValidationItem[],\n            (_, items) => items.flat(),\n        ),\n        v => recordLinkablesVisitor(v, linkables),\n        v => recordNodeStackVisitor(v, stack),\n        v =>\n            extendVisitor(v, {\n                visitAccount(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Account has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitDefinedType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Defined type has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitDefinedTypeLink(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Pointing to a defined type with no name.', node, stack));\n                    } else if (!linkables.has(node)) {\n                        items.push(\n                            validationItem(\n                                'error',\n                                `Pointing to a missing defined type named \"${node.name}\"`,\n                                node,\n                                stack,\n                            ),\n                        );\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitEnumEmptyVariantType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Enum variant has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitEnumStructVariantType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Enum variant has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitEnumTupleVariantType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Enum variant has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitEnumType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (node.variants.length === 0) {\n                        items.push(validationItem('warn', 'Enum has no variants.', node, stack));\n                    }\n                    node.variants.forEach(variant => {\n                        if (!variant.name) {\n                            items.push(validationItem('error', 'Enum variant has no name.', node, stack));\n                        }\n                    });\n                    return [...items, ...next(node)];\n                },\n\n                visitError(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Error has no name.', node, stack));\n                    }\n                    if (typeof node.code !== 'number') {\n                        items.push(validationItem('error', 'Error has no code.', node, stack));\n                    }\n                    if (!node.message) {\n                        items.push(validationItem('warn', 'Error has no message.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitInstruction(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Instruction has no name.', node, stack));\n                    }\n\n                    // Check for duplicate account names.\n                    const accountNameHistogram = new Map<string, number>();\n                    node.accounts.forEach(account => {\n                        if (!account.name) {\n                            items.push(validationItem('error', 'Instruction account has no name.', node, stack));\n                            return;\n                        }\n                        const count = (accountNameHistogram.get(account.name) ?? 0) + 1;\n                        accountNameHistogram.set(account.name, count);\n                        // Only throw an error once per duplicated names.\n                        if (count === 2) {\n                            items.push(\n                                validationItem(\n                                    'error',\n                                    `Account name \"${account.name}\" is not unique in instruction \"${node.name}\".`,\n                                    node,\n                                    stack,\n                                ),\n                            );\n                        }\n                    });\n\n                    // Check for cyclic dependencies in account defaults.\n                    const cyclicCheckVisitor = getResolvedInstructionInputsVisitor();\n                    try {\n                        visit(node, cyclicCheckVisitor);\n                    } catch (error) {\n                        items.push(validationItem('error', (error as Error).message, node, stack));\n                    }\n\n                    // Check args.\n                    const names = getAllInstructionArguments(node).map(({ name }) => camelCase(name));\n                    const duplicates = names.filter((e, i, a) => a.indexOf(e) !== i);\n                    const uniqueDuplicates = [...new Set(duplicates)];\n                    const hasConflictingNames = uniqueDuplicates.length > 0;\n                    if (hasConflictingNames) {\n                        items.push(\n                            validationItem(\n                                'error',\n                                `The names of the following instruction arguments are conflicting: ` +\n                                    `[${uniqueDuplicates.join(', ')}].`,\n                                node,\n                                stack,\n                            ),\n                        );\n                    }\n\n                    // Check arg defaults.\n                    getAllInstructionArguments(node).forEach(argument => {\n                        const { defaultValue } = argument;\n                        if (isNode(defaultValue, 'accountBumpValueNode')) {\n                            const defaultAccount = node.accounts.find(account => account.name === defaultValue.name);\n                            if (defaultAccount && defaultAccount.isSigner !== false) {\n                                items.push(\n                                    validationItem(\n                                        'error',\n                                        `Argument ${argument.name} cannot default to the bump attribute of ` +\n                                            `the [${defaultValue.name}] account as it may be a Signer.`,\n                                        node,\n                                        stack,\n                                    ),\n                                );\n                            }\n                        }\n                    });\n\n                    return [...items, ...next(node)];\n                },\n\n                visitProgram(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Program has no name.', node, stack));\n                    }\n                    if (!node.publicKey) {\n                        items.push(validationItem('error', 'Program has no public key.', node, stack));\n                    }\n                    if (!node.version) {\n                        items.push(validationItem('warn', 'Program has no version.', node, stack));\n                    }\n                    if (!node.origin) {\n                        items.push(validationItem('info', 'Program has no origin.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitStructFieldType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Struct field has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitStructType(node, { next }) {\n                    const items = [] as ValidationItem[];\n\n                    // Check for duplicate field names.\n                    const fieldNameHistogram = new Map<string, number>();\n                    node.fields.forEach(field => {\n                        if (!field.name) return; // Handled by TypeStructField\n                        const count = (fieldNameHistogram.get(field.name) ?? 0) + 1;\n                        fieldNameHistogram.set(field.name, count);\n                        // Only throw an error once per duplicated names.\n                        if (count === 2) {\n                            items.push(\n                                validationItem(\n                                    'error',\n                                    `Struct field name \"${field.name}\" is not unique.`,\n                                    field,\n                                    stack,\n                                ),\n                            );\n                        }\n                    });\n                    return [...items, ...next(node)];\n                },\n\n                visitTupleType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (node.items.length === 0) {\n                        items.push(validationItem('warn', 'Tuple has no items.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n            }),\n    );\n}\n","import { KINOBI_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE, KinobiError } from '@kinobi-so/errors';\nimport { NodeKind } from '@kinobi-so/nodes';\nimport { mapVisitor, Visitor } from '@kinobi-so/visitors-core';\n\nimport { getLevelIndex, LogLevel, ValidationItem } from './ValidationItem';\n\nexport function throwValidatorItemsVisitor<TNodeKind extends NodeKind = NodeKind>(\n    visitor: Visitor<readonly ValidationItem[], TNodeKind>,\n    throwLevel: LogLevel = 'error',\n): Visitor<void, TNodeKind> {\n    return mapVisitor(visitor, validationItems => {\n        const levelHistogram = [...validationItems]\n            .sort((a, b) => getLevelIndex(b.level) - getLevelIndex(a.level))\n            .reduce(\n                (acc, item) => {\n                    acc[item.level] = (acc[item.level] ?? 0) + 1;\n                    return acc;\n                },\n                {} as Record<LogLevel, number>,\n            );\n        const maxLevel = Object.keys(levelHistogram)\n            .map(level => getLevelIndex(level as LogLevel))\n            .sort((a, b) => b - a)[0];\n\n        if (maxLevel >= getLevelIndex(throwLevel)) {\n            const formattedHistogram = Object.keys(levelHistogram)\n                .map(level => `${level}s: ${levelHistogram[level as LogLevel]}`)\n                .join(', ');\n            throw new KinobiError(KINOBI_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE, {\n                formattedHistogram,\n                validationItems,\n            });\n        }\n    });\n}\n"]}