You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
6.8 KiB
219 lines
6.8 KiB
2 years ago
|
export = CSSselect;
|
||
|
|
||
|
/**
|
||
|
* Alias for CSSselect.selectAll(query, elems, options).
|
||
|
* @see [CSSselect.compile] for supported selector queries.
|
||
|
*/
|
||
|
declare function CSSselect<Node, ElementNode extends Node>(
|
||
|
query: CSSselect.Query,
|
||
|
elems: Array<ElementNode> | ElementNode,
|
||
|
options?: CSSselect.Options<Node, ElementNode>
|
||
|
): Array<ElementNode>;
|
||
|
|
||
|
declare namespace CSSselect {
|
||
|
type Predicate<Value> = (v: Value) => boolean;
|
||
|
interface Adapter<Node, ElementNode extends Node> {
|
||
|
/**
|
||
|
* is the node a tag?
|
||
|
*/
|
||
|
isTag(node: Node): node is ElementNode;
|
||
|
|
||
|
/**
|
||
|
* Does at least one of passed element nodes pass the test predicate?
|
||
|
*/
|
||
|
existsOne(test: Predicate<ElementNode>, elems: Array<ElementNode>): boolean;
|
||
|
|
||
|
/**
|
||
|
* get the attribute value.
|
||
|
*/
|
||
|
getAttributeValue(elem: ElementNode, name: string): string;
|
||
|
|
||
|
/**
|
||
|
* get the node's children
|
||
|
*/
|
||
|
getChildren(node: Node): Array<Node>;
|
||
|
|
||
|
/**
|
||
|
* get the name of the tag
|
||
|
*/
|
||
|
getName(elem: ElementNode): string;
|
||
|
|
||
|
/**
|
||
|
* get the parent of the node
|
||
|
*/
|
||
|
getParent(node: Node): Node;
|
||
|
|
||
|
/*
|
||
|
Get the siblings of the node. Note that unlike jQuery's `siblings` method,
|
||
|
this is expected to include the current node as well
|
||
|
*/
|
||
|
getSiblings(node: Node): Array<Node>;
|
||
|
|
||
|
/*
|
||
|
* Get the text content of the node, and its children if it has any.
|
||
|
*/
|
||
|
getText(node: Node): string;
|
||
|
|
||
|
/**
|
||
|
* Does the element have the named attribute?
|
||
|
*/
|
||
|
hasAttrib(elem: ElementNode, name: string): boolean;
|
||
|
|
||
|
/**
|
||
|
* takes an array of nodes, and removes any duplicates, as well as any
|
||
|
* nodes whose ancestors are also in the array.
|
||
|
*/
|
||
|
removeSubsets(nodes: Array<Node>): Array<Node>;
|
||
|
|
||
|
/**
|
||
|
* finds all of the element nodes in the array that match the test predicate,
|
||
|
* as well as any of their children that match it.
|
||
|
*/
|
||
|
findAll(test: Predicate<ElementNode>, nodes: Array<Node>): Array<ElementNode>;
|
||
|
|
||
|
/**
|
||
|
* finds the first node in the array that matches the test predicate, or one
|
||
|
* of its children.
|
||
|
*/
|
||
|
findOne(test: Predicate<ElementNode>, elems: Array<ElementNode>): ElementNode | undefined,
|
||
|
|
||
|
/**
|
||
|
The adapter can also optionally include an equals method, if your DOM
|
||
|
structure needs a custom equality test to compare two objects which refer
|
||
|
to the same underlying node. If not provided, `css-select` will fall back to
|
||
|
`a === b`.
|
||
|
*/
|
||
|
equals?: (a: Node, b: Node) => boolean;
|
||
|
|
||
|
/**
|
||
|
* is the element in hovered state?
|
||
|
*/
|
||
|
isHovered?: (elem: ElementNode) => boolean;
|
||
|
|
||
|
/**
|
||
|
* is the element in visited state?
|
||
|
*/
|
||
|
isVisited?: (elem: ElementNode) => boolean;
|
||
|
|
||
|
/**
|
||
|
* is the element in active state?
|
||
|
*/
|
||
|
isActive?: (elem: ElementNode) => boolean;
|
||
|
}
|
||
|
|
||
|
// TODO default types to the domutil/httpparser2 types
|
||
|
interface Options<Node, ElementNode extends Node> {
|
||
|
/**
|
||
|
* When enabled, tag names will be case-sensitive. Default: false.
|
||
|
*/
|
||
|
xmlMode?: boolean;
|
||
|
/**
|
||
|
* Limits the module to only use CSS3 selectors. Default: false.
|
||
|
*/
|
||
|
strict?: boolean;
|
||
|
/**
|
||
|
* The last function in the stack, will be called with the last element
|
||
|
* that's looked at. Should return true.
|
||
|
*/
|
||
|
rootFunc?: (element: ElementNode) => true;
|
||
|
/**
|
||
|
* The adapter to use when interacting with the backing DOM structure. By
|
||
|
* default it uses domutils.
|
||
|
*/
|
||
|
adapter?: Adapter<Node, ElementNode>;
|
||
|
}
|
||
|
|
||
|
type CompiledQuery = (node: any) => boolean;
|
||
|
type Query = string | CompiledQuery;
|
||
|
|
||
|
/**
|
||
|
* Compiles the query, returns a function.
|
||
|
*
|
||
|
* Supported simple selectors:
|
||
|
* * Universal (*)
|
||
|
* * Tag (<tagname>)
|
||
|
* * Attribute ([attr=foo]), with supported comparisons:
|
||
|
* * [attr] (existential)
|
||
|
* * =
|
||
|
* * ~=
|
||
|
* * |=
|
||
|
* * *=
|
||
|
* * ^=
|
||
|
* * $=
|
||
|
* * !=
|
||
|
* * Can be case insensitive (E.g. [attr=foo i])
|
||
|
* * Pseudos:
|
||
|
* * :not
|
||
|
* * :root
|
||
|
* * :empty
|
||
|
* * :[first|last]-child[-of-type]
|
||
|
* * :only-of-type, :only-child
|
||
|
* * :nth-[last-]child[-of-type]
|
||
|
* * :link, :visited (the latter doesn't match any elements)
|
||
|
* * :checked
|
||
|
* * :enabled, :disabled
|
||
|
* * :required, :optional
|
||
|
* * Nonstandard Pseudos (available when strict mode is not enabled):
|
||
|
* * `:contains`
|
||
|
* * `:icontains` (case-insensitive version of :contains)
|
||
|
* * `:has`
|
||
|
* * `:parent`
|
||
|
* * `:selected`
|
||
|
* * `:header, :button, :input, :text, :checkbox, :file, :password, :reset, :radio etc.
|
||
|
* * :matches
|
||
|
*
|
||
|
* Supported Combinators:
|
||
|
*
|
||
|
* * Descendant (` `)
|
||
|
* * Child (`>`)
|
||
|
* * Parent (`<`) (when strict mode is not enabled)
|
||
|
* * Sibling (`~`)
|
||
|
* * Adjacent (`+`)
|
||
|
*/
|
||
|
function compile(query: string): CompiledQuery;
|
||
|
/**
|
||
|
* @template Node The generic Node type for the DOM adapter being used.
|
||
|
* @template ElementNode The Node type for elements for the DOM adapter being used.
|
||
|
* @param elems Elements to query. If it is an element, its children will be queried..
|
||
|
* @param query can be either a CSS selector string or a compiled query function.
|
||
|
* @param [options] options for querying the document.
|
||
|
* @see CSSselect.compile for supported selector queries.
|
||
|
* @returns All matching elements.
|
||
|
*/
|
||
|
function selectAll<Node, ElementNode extends Node>(
|
||
|
query: Query,
|
||
|
elems: Array<ElementNode> | ElementNode,
|
||
|
options?: Options<Node, ElementNode>
|
||
|
): Array<ElementNode>;
|
||
|
/**
|
||
|
* @template Node The generic Node type for the DOM adapter being used.
|
||
|
* @template ElementNode The Node type for elements for the DOM adapter being used.
|
||
|
* @param elems Elements to query. If it is an element, its children will be queried..
|
||
|
* @param query can be either a CSS selector string or a compiled query function.
|
||
|
* @param [options] options for querying the document.
|
||
|
* @see CSSselect.compile for supported selector queries.
|
||
|
* @returns the first match, or null if there was no match.
|
||
|
*/
|
||
|
function selectOne<Node, ElementNode extends Node>(
|
||
|
query: Query,
|
||
|
elems: Array<ElementNode> | ElementNode,
|
||
|
options?: Options<Node, ElementNode>
|
||
|
): ElementNode | null;
|
||
|
|
||
|
/**
|
||
|
* Tests whether or not an element is matched by query.
|
||
|
*
|
||
|
* @template Node The generic Node type for the DOM adapter being used.
|
||
|
* @template ElementNode The Node type for elements for the DOM adapter being used.
|
||
|
* @param elem The element to test if it matches the query.
|
||
|
* @param query can be either a CSS selector string or a compiled query function.
|
||
|
* @param [options] options for querying the document.
|
||
|
* @see CSSselect.compile for supported selector queries.
|
||
|
* @returns
|
||
|
*/
|
||
|
function is<Node, ElementNode extends Node>(
|
||
|
elem: ElementNode,
|
||
|
query: Query,
|
||
|
options?: Options<Node, ElementNode>
|
||
|
): boolean;
|
||
|
}
|