75 lines
2 KiB
TypeScript
75 lines
2 KiB
TypeScript
/**
|
||
* Find the first node in `parent` after another `node` or after an index,
|
||
* that passes `test`.
|
||
*
|
||
* @param parent
|
||
* Parent node.
|
||
* @param index
|
||
* Child node or index.
|
||
* @param [test=undefined]
|
||
* Test for child to look for (optional).
|
||
* @returns
|
||
* A child (matching `test`, if given) or `undefined`.
|
||
*/
|
||
export const findAfter: (<
|
||
Kind extends import('unist').Parent,
|
||
Check extends Test
|
||
>(
|
||
parent: Kind,
|
||
index: number | Child<Kind>,
|
||
test: Check
|
||
) => Matches<Child<Kind>, Check> | undefined) &
|
||
(<Kind_1 extends import('unist').Parent>(
|
||
parent: Kind_1,
|
||
index: number | Child<Kind_1>,
|
||
test?: null | undefined
|
||
) => Child<Kind_1> | undefined)
|
||
export type UnistNode = import('unist').Node
|
||
export type UnistParent = import('unist').Parent
|
||
/**
|
||
* Test from `unist-util-is`.
|
||
*
|
||
* Note: we have remove and add `undefined`, because otherwise when generating
|
||
* automatic `.d.ts` files, TS tries to flatten paths from a local perspective,
|
||
* which doesn’t work when publishing on npm.
|
||
*/
|
||
export type Test = Exclude<import('unist-util-is').Test, undefined> | undefined
|
||
/**
|
||
* Get the value of a type guard `Fn`.
|
||
*/
|
||
export type Predicate<Fn, Fallback> = Fn extends (
|
||
value: any
|
||
) => value is infer Thing
|
||
? Thing
|
||
: Fallback
|
||
/**
|
||
* Check whether a node matches a primitive check in the type system.
|
||
*/
|
||
export type MatchesOne<Value, Check> = Check extends null | undefined
|
||
? Value
|
||
: Value extends {
|
||
type: Check
|
||
}
|
||
? Value
|
||
: Value extends Check
|
||
? Value
|
||
: Check extends Function
|
||
? Predicate<Check, Value> extends Value
|
||
? Predicate<Check, Value>
|
||
: never
|
||
: never
|
||
/**
|
||
* Check whether a node matches a check in the type system.
|
||
*/
|
||
export type Matches<Value, Check> = Check extends Array<any>
|
||
? MatchesOne<Value, Check[keyof Check]>
|
||
: MatchesOne<Value, Check>
|
||
/**
|
||
* Collect nodes that can be parents of `Child`.
|
||
*/
|
||
export type Child<Kind extends import('unist').Node> = Kind extends {
|
||
children: (infer Child_1)[]
|
||
}
|
||
? Child_1
|
||
: never
|