/** * @typedef {import('unist').Parent} Parent * @typedef {import('hast').Element} Element */ /** * @typedef {null | undefined | string | TestFunctionAnything | Array} Test * Check for an arbitrary element, unaware of TypeScript inferral. * * @callback TestFunctionAnything * Check if an element passes a test, unaware of TypeScript inferral. * @param {Element} element * An element. * @param {number | null | undefined} [index] * The element’s position in its parent. * @param {Parent | null | undefined} [parent] * The element’s parent. * @returns {boolean | void} * Whether this element passes the test. */ /** * @template {Element} T * Element type. * @typedef {T['tagName'] | TestFunctionPredicate | Array>} PredicateTest * Check for an element that can be inferred by TypeScript. */ /** * Check if an element passes a certain node test. * * @template {Element} T * Element type. * @callback TestFunctionPredicate * Complex test function for an element that can be inferred by TypeScript. * @param {Element} element * An element. * @param {number | null | undefined} [index] * The element’s position in its parent. * @param {Parent | null | undefined} [parent] * The element’s parent. * @returns {element is T} * Whether this element passes the test. */ /** * @callback AssertAnything * Check that an arbitrary value is an element, unaware of TypeScript inferral. * @param {unknown} [node] * Anything (typically a node). * @param {number | null | undefined} [index] * The node’s position in its parent. * @param {Parent | null | undefined} [parent] * The node’s parent. * @returns {boolean} * Whether this is an element and passes a test. */ /** * Check if a node is an element and passes a certain node test * * @template {Element} T * Element type. * @callback AssertPredicate * Check that an arbitrary value is a specific element, aware of TypeScript. * @param {unknown} [node] * Anything (typically a node). * @param {number | null | undefined} [index] * The node’s position in its parent. * @param {Parent | null | undefined} [parent] * The node’s parent. * @returns {node is T} * Whether this is an element and passes a test. */ /** * Check if `node` is an `Element` and whether it passes the given test. * * @param node * Thing to check, typically `Node`. * @param test * A check for a specific element. * @param index * The node’s position in its parent. * @param parent * The node’s parent. * @returns * Whether `node` is an element and passes a test. */ export const isElement: (() => false) & (( node: unknown, test?: PredicateTest | undefined, index?: number, parent?: Parent, context?: unknown ) => node is T) & (( node: unknown, test: Test, index?: number, parent?: Parent, context?: unknown ) => boolean) /** * Generate an assertion from a test. * * Useful if you’re going to test many nodes, for example when creating a * utility where something else passes a compatible test. * * The created function is a bit faster because it expects valid input only: * a `node`, `index`, and `parent`. * * @param test * * When nullish, checks if `node` is an `Element`. * * When `string`, works like passing `(element) => element.tagName === test`. * * When `function` checks if function passed the element is true. * * When `array`, checks any one of the subtests pass. * @returns * An assertion. */ export const convertElement: (( test: T['tagName'] | TestFunctionPredicate ) => AssertPredicate) & ((test?: Test) => AssertAnything) export type Parent = import('unist').Parent export type Element = import('hast').Element /** * Check for an arbitrary element, unaware of TypeScript inferral. */ export type Test = | null | undefined | string | TestFunctionAnything | Array /** * Check if an element passes a test, unaware of TypeScript inferral. */ export type TestFunctionAnything = ( element: Element, index?: number | null | undefined, parent?: Parent | null | undefined ) => boolean | void /** * Check for an element that can be inferred by TypeScript. */ export type PredicateTest = | T['tagName'] | TestFunctionPredicate | Array> /** * Complex test function for an element that can be inferred by TypeScript. */ export type TestFunctionPredicate = ( element: Element, index?: number | null | undefined, parent?: Parent | null | undefined ) => element is T /** * Check that an arbitrary value is an element, unaware of TypeScript inferral. */ export type AssertAnything = ( node?: unknown, index?: number | null | undefined, parent?: Parent | null | undefined ) => boolean /** * Check that an arbitrary value is a specific element, aware of TypeScript. */ export type AssertPredicate = ( node?: unknown, index?: number | null | undefined, parent?: Parent | null | undefined ) => node is T