type Maybe = void | T; type MaybeArray = T | T[]; declare namespace PostHTML { type StringMatcher = string | RegExp; type AttrMatcher = Record; type ContentMatcher = | StringMatcher[] | { tag?: StringMatcher; attrs?: AttrMatcher; content?: ContentMatcher[]; }; export type Matcher< TTag extends StringMatcher, TAttrs extends Maybe > = | StringMatcher | { tag?: TTag; attrs?: TAttrs; content?: ContentMatcher[]; }; export type Expression< TTag extends StringMatcher, TAttrs extends Maybe > = MaybeArray>; export type NodeCallback< TTag extends Maybe = Maybe, TAttrs extends Maybe = Maybe > = (node: Node) => MaybeArray; export type NodeAttributes = Record>; interface NodeAPI { walk: (cb: NodeCallback) => Node; match: < TTag extends StringMatcher, TAttrs extends Maybe, TTagResult extends Maybe = TTag extends string ? TTag : TTag extends void ? Maybe : string, TAttrResult extends Maybe = TAttrs extends void ? Maybe : { [P in keyof TAttrs]: string; } & NodeAttributes >( expression: Expression, cb: NodeCallback ) => Node[]; } export interface RawNode< TTag extends Maybe = Maybe, TAttrs extends Maybe = Maybe > { tag: TTag; attrs: TAttrs; content?: Array; } export interface Node< TTag extends Maybe = Maybe, TAttrs extends Maybe = Maybe > extends NodeAPI, RawNode { content?: Array; options?: Options; } export interface Options { sync?: boolean; parser?: Function; render?: Function; skipParse?: boolean; } export type Plugin = ( tree: Node ) => void | Node | RawNode | ThisType; export interface Result { html: string; tree: Node; messages: TMessage[]; } export interface PostHTML { version: string; name: ""; plugins: Plugin[]; messages: TMessage[]; use(plugins: MaybeArray>): this; process(html: string, options?: Options): Promise>; } } declare function PostHTML( plugins?: PostHTML.Plugin[] ): PostHTML.PostHTML; export = PostHTML;