/** * @typedef {import('unist').Node} Node * @typedef {import('unist').Parent} Parent * @typedef {import('unist-util-is').Test} Test * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult * @typedef {import('./complex-types').Visitor} Visitor */ import {visitParents, CONTINUE, SKIP, EXIT} from 'unist-util-visit-parents' export {CONTINUE, SKIP, EXIT} /** * Visit children of tree which pass a test * * @param tree Abstract syntax tree to walk * @param test Test, optional * @param visitor Function to run for each node * @param reverse Fisit the tree in reverse, defaults to false */ export const visit = /** * @type {( * ((tree: Tree, test: Check, visitor: import('./complex-types').BuildVisitor, reverse?: boolean) => void) & * ((tree: Tree, visitor: import('./complex-types').BuildVisitor, reverse?: boolean) => void) * )} */ ( /** * @param {Node} tree * @param {Test} test * @param {import('./complex-types').Visitor} visitor * @param {boolean} [reverse] */ function (tree, test, visitor, reverse) { if (typeof test === 'function' && typeof visitor !== 'function') { reverse = visitor visitor = test test = null } visitParents(tree, test, overload, reverse) /** * @param {Node} node * @param {Array.} parents */ function overload(node, parents) { const parent = parents[parents.length - 1] return visitor( node, parent ? parent.children.indexOf(node) : null, parent ) } } )