Severian's picture
Upload 7464 files
c211499
raw
history blame
5.35 kB
/**
* @typedef {import('unist').Parent} Parent
* @typedef {import('hast').Element} Element
*/
/**
* @typedef {null | undefined | string | TestFunctionAnything | Array<string | TestFunctionAnything>} 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<T> | Array<T['tagName'] | TestFunctionPredicate<T>>} 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) &
(<T extends import('hast').Element = import('hast').Element>(
node: unknown,
test?: PredicateTest<T> | 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: (<T extends import('hast').Element>(
test: T['tagName'] | TestFunctionPredicate<T>
) => AssertPredicate<T>) &
((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<string | TestFunctionAnything>
/**
* 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 extends import('hast').Element> =
| T['tagName']
| TestFunctionPredicate<T>
| Array<T['tagName'] | TestFunctionPredicate<T>>
/**
* Complex test function for an element that can be inferred by TypeScript.
*/
export type TestFunctionPredicate<T extends import('hast').Element> = (
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<T extends import('hast').Element> = (
node?: unknown,
index?: number | null | undefined,
parent?: Parent | null | undefined
) => node is T