// Type definitions for postcss-selector-parser 2.2.3 // Definitions by: Chris Eppstein /*~ Note that ES6 modules cannot directly export callable functions. *~ This file should be imported using the CommonJS-style: *~ import x = require('someLibrary'); *~ *~ Refer to the documentation to understand common *~ workarounds for this limitation of ES6 modules. */ /*~ This declaration specifies that the function *~ is the exported object from the file */ export = parser; // A type that's T but not U. type Diff = T extends U ? never : T; // TODO: Conditional types in TS 1.8 will really clean this up. declare function parser(): parser.Processor; declare function parser(processor: parser.AsyncProcessor): parser.Processor; declare function parser(processor: parser.AsyncProcessor): parser.Processor; declare function parser(processor: parser.SyncProcessor): parser.Processor; declare function parser(processor: parser.SyncProcessor): parser.Processor; declare function parser(processor?: parser.SyncProcessor | parser.AsyncProcessor): parser.Processor; /*~ If you want to expose types from your module as well, you can *~ place them in this block. Often you will want to describe the *~ shape of the return type of the function; that type should *~ be declared in here, as this example shows. */ declare namespace parser { /* copied from postcss -- so we don't need to add a dependency */ type ErrorOptions = { plugin?: string; word?: string; index?: number }; /* the bits we use of postcss.Rule, copied from postcss -- so we don't need to add a dependency */ type PostCSSRuleNode = { selector: string /** * @returns postcss.CssSyntaxError but it's a complex object, caller * should cast to it if they have a dependency on postcss. */ error(message: string, options?: ErrorOptions): Error; }; /** Accepts a string */ type Selectors = string | PostCSSRuleNode type ProcessorFn = (root: parser.Root) => ReturnType; type SyncProcessor = ProcessorFn; type AsyncProcessor = ProcessorFn>; const TAG: "tag"; const STRING: "string"; const SELECTOR: "selector"; const ROOT: "root"; const PSEUDO: "pseudo"; const NESTING: "nesting"; const ID: "id"; const COMMENT: "comment"; const COMBINATOR: "combinator"; const CLASS: "class"; const ATTRIBUTE: "attribute"; const UNIVERSAL: "universal"; interface NodeTypes { tag: Tag, string: String, selector: Selector, root: Root, pseudo: Pseudo, nesting: Nesting, id: Identifier, comment: Comment, combinator: Combinator, class: ClassName, attribute: Attribute, universal: Universal } type Node = NodeTypes[keyof NodeTypes]; function isNode(node: any): node is Node; interface Options { /** * Preserve whitespace when true. Default: false; */ lossless: boolean; /** * When true and a postcss.Rule is passed, set the result of * processing back onto the rule when done. Default: false. */ updateSelector: boolean; } class Processor< TransformType = never, SyncSelectorsType extends Selectors | never = Selectors > { res: Root; readonly result: String; ast(selectors: Selectors, options?: Partial): Promise; astSync(selectors: SyncSelectorsType, options?: Partial): Root; transform(selectors: Selectors, options?: Partial): Promise; transformSync(selectors: SyncSelectorsType, options?: Partial): TransformType; process(selectors: Selectors, options?: Partial): Promise; processSync(selectors: SyncSelectorsType, options?: Partial): string; } interface ParserOptions { css: string; error: (message: string, options: ErrorOptions) => Error; options: Options; } class Parser { input: ParserOptions; lossy: boolean; position: number; root: Root; selectors: string; current: Selector; constructor(input: ParserOptions); /** * Raises an error, if the processor is invoked on * a postcss Rule node, a better error message is raised. */ error(message: string, options?: ErrorOptions): void; } interface NodeSource { start?: { line: number, column: number }, end?: { line: number, column: number } } interface SpaceAround { before: string; after: string; } interface Spaces extends SpaceAround { [spaceType: string]: string | Partial | undefined; } interface NodeOptions { value: Value; spaces?: Partial; source?: NodeSource; sourceIndex?: number; } interface Base< Value extends string | undefined = string, ParentType extends Container | undefined = Container | undefined > { type: keyof NodeTypes; parent: ParentType; value: Value; spaces: Spaces; source?: NodeSource; sourceIndex: number; rawSpaceBefore: string; rawSpaceAfter: string; remove(): Node; replaceWith(...nodes: Node[]): Node; next(): Node | undefined; prev(): Node | undefined; clone(opts?: {[override: string]:any}): this; /** * Return whether this node includes the character at the position of the given line and column. * Returns undefined if the nodes lack sufficient source metadata to determine the position. * @param line 1-index based line number relative to the start of the selector. * @param column 1-index based column number relative to the start of the selector. */ isAtPosition(line: number, column: number): boolean | undefined; /** * Some non-standard syntax doesn't follow normal escaping rules for css, * this allows the escaped value to be specified directly, allowing illegal characters to be * directly inserted into css output. * @param name the property to set * @param value the unescaped value of the property * @param valueEscaped optional. the escaped value of the property. */ setPropertyAndEscape(name: string, value: any, valueEscaped: string): void; /** * When you want a value to passed through to CSS directly. This method * deletes the corresponding raw value causing the stringifier to fallback * to the unescaped value. * @param name the property to set. * @param value The value that is both escaped and unescaped. */ setPropertyWithoutEscape(name: string, value: any): void; /** * Some non-standard syntax doesn't follow normal escaping rules for css. * This allows non standard syntax to be appended to an existing property * by specifying the escaped value. By specifying the escaped value, * illegal characters are allowed to be directly inserted into css output. * @param {string} name the property to set * @param {any} value the unescaped value of the property * @param {string} valueEscaped optional. the escaped value of the property. */ appendToPropertyAndEscape(name: string, value: any, valueEscaped: string): void; toString(): string; } interface ContainerOptions extends NodeOptions { nodes?: Array; } interface Container< Value extends string | undefined = string, Child extends Node = Node > extends Base { nodes: Array; append(selector: Child): this; prepend(selector: Child): this; at(index: number): Child; /** * Return the most specific node at the line and column number given. * The source location is based on the original parsed location, locations aren't * updated as selector nodes are mutated. * * Note that this location is relative to the location of the first character * of the selector, and not the location of the selector in the overall document * when used in conjunction with postcss. * * If not found, returns undefined. * @param line The line number of the node to find. (1-based index) * @param col The column number of the node to find. (1-based index) */ atPosition(line: number, column: number): Child; index(child: Child): number; readonly first: Child; readonly last: Child; readonly length: number; removeChild(child: Child): this; removeAll(): this; empty(): this; insertAfter(oldNode: Child, newNode: Child): this; insertBefore(oldNode: Child, newNode: Child): this; each(callback: (node: Child, index: number) => boolean | void): boolean | undefined; walk( callback: (node: Node, index: number) => boolean | void ): boolean | undefined; walkAttributes( callback: (node: Attribute) => boolean | void ): boolean | undefined; walkClasses( callback: (node: ClassName) => boolean | void ): boolean | undefined; walkCombinators( callback: (node: Combinator) => boolean | void ): boolean | undefined; walkComments( callback: (node: Comment) => boolean | void ): boolean | undefined; walkIds( callback: (node: Identifier) => boolean | void ): boolean | undefined; walkNesting( callback: (node: Nesting) => boolean | void ): boolean | undefined; walkPseudos( callback: (node: Pseudo) => boolean | void ): boolean | undefined; walkTags(callback: (node: Tag) => boolean | void): boolean | undefined; split(callback: (node: Child) => boolean): [Child[], Child[]]; map(callback: (node: Child) => T): T[]; reduce( callback: ( previousValue: Child, currentValue: Child, currentIndex: number, array: readonly Child[] ) => Child ): Child; reduce( callback: ( previousValue: Child, currentValue: Child, currentIndex: number, array: readonly Child[] ) => Child, initialValue: Child ): Child; reduce( callback: ( previousValue: T, currentValue: Child, currentIndex: number, array: readonly Child[] ) => T, initialValue: T ): T; every(callback: (node: Child) => boolean): boolean; some(callback: (node: Child) => boolean): boolean; filter(callback: (node: Child) => boolean): Child[]; sort(callback: (nodeA: Child, nodeB: Child) => number): Child[]; toString(): string; } function isContainer(node: any): node is Root | Selector | Pseudo; interface NamespaceOptions extends NodeOptions { namespace?: string | true; } interface Namespace extends Base { /** alias for namespace */ ns: string | true; /** * namespace prefix. */ namespace: string | true; /** * If a namespace exists, prefix the value provided with it, separated by |. */ qualifiedName(value: string): string; /** * A string representing the namespace suitable for output. */ readonly namespaceString: string; } function isNamespace(node: any): node is Attribute | Tag; interface Root extends Container { type: "root"; /** * Raises an error, if the processor is invoked on * a postcss Rule node, a better error message is raised. */ error(message: string, options?: ErrorOptions): Error; nodeAt(line: number, column: number): Node } function root(opts: ContainerOptions): Root; function isRoot(node: any): node is Root; interface _Selector extends Container> { type: "selector"; } type Selector = _Selector; function selector(opts: ContainerOptions): Selector; function isSelector(node: any): node is Selector; interface CombinatorRaws { value?: string; spaces?: { before?: string; after?: string; }; } interface Combinator extends Base { type: "combinator"; raws?: CombinatorRaws; } function combinator(opts: NodeOptions): Combinator; function isCombinator(node: any): node is Combinator; interface ClassName extends Base { type: "class"; } function className(opts: NamespaceOptions): ClassName; function isClassName(node: any): node is ClassName; type AttributeOperator = "=" | "~=" | "|=" | "^=" | "$=" | "*="; type QuoteMark = '"' | "'" | null; interface PreferredQuoteMarkOptions { quoteMark?: QuoteMark; preferCurrentQuoteMark?: boolean; } interface SmartQuoteMarkOptions extends PreferredQuoteMarkOptions { smart?: boolean; } interface AttributeOptions extends NamespaceOptions { attribute: string; operator?: AttributeOperator; insensitive?: boolean; quoteMark?: QuoteMark; /** @deprecated Use quoteMark instead. */ quoted?: boolean; spaces?: { before?: string; after?: string; attribute?: Partial; operator?: Partial; value?: Partial; insensitive?: Partial; } raws: { unquoted?: string; attribute?: string; operator?: string; value?: string; insensitive?: string; spaces?: { attribute?: Partial; operator?: Partial; value?: Partial; insensitive?: Partial; } }; } interface Attribute extends Namespace { type: "attribute"; attribute: string; operator?: AttributeOperator; insensitive?: boolean; quoteMark: QuoteMark; quoted?: boolean; spaces: { before: string; after: string; attribute?: Partial; operator?: Partial; value?: Partial; insensitive?: Partial; } raws: { /** @deprecated The attribute value is unquoted, use that instead.. */ unquoted?: string; attribute?: string; operator?: string; /** The value of the attribute with quotes and escapes. */ value?: string; insensitive?: string; spaces?: { attribute?: Partial; operator?: Partial; value?: Partial; insensitive?: Partial; } }; /** * The attribute name after having been qualified with a namespace. */ readonly qualifiedAttribute: string; /** * The case insensitivity flag or an empty string depending on whether this * attribute is case insensitive. */ readonly insensitiveFlag : 'i' | ''; /** * Returns the attribute's value quoted such that it would be legal to use * in the value of a css file. The original value's quotation setting * used for stringification is left unchanged. See `setValue(value, options)` * if you want to control the quote settings of a new value for the attribute or * `set quoteMark(mark)` if you want to change the quote settings of the current * value. * * You can also change the quotation used for the current value by setting quoteMark. **/ getQuotedValue(options?: SmartQuoteMarkOptions): string; /** * Set the unescaped value with the specified quotation options. The value * provided must not include any wrapping quote marks -- those quotes will * be interpreted as part of the value and escaped accordingly. * @param value */ setValue(value: string, options?: SmartQuoteMarkOptions): void; /** * Intelligently select a quoteMark value based on the value's contents. If * the value is a legal CSS ident, it will not be quoted. Otherwise a quote * mark will be picked that minimizes the number of escapes. * * If there's no clear winner, the quote mark from these options is used, * then the source quote mark (this is inverted if `preferCurrentQuoteMark` is * true). If the quoteMark is unspecified, a double quote is used. **/ smartQuoteMark(options: PreferredQuoteMarkOptions): QuoteMark; /** * Selects the preferred quote mark based on the options and the current quote mark value. * If you want the quote mark to depend on the attribute value, call `smartQuoteMark(opts)` * instead. */ preferredQuoteMark(options: PreferredQuoteMarkOptions): QuoteMark /** * returns the offset of the attribute part specified relative to the * start of the node of the output string. * * * "ns" - alias for "namespace" * * "namespace" - the namespace if it exists. * * "attribute" - the attribute name * * "attributeNS" - the start of the attribute or its namespace * * "operator" - the match operator of the attribute * * "value" - The value (string or identifier) * * "insensitive" - the case insensitivity flag; * @param part One of the possible values inside an attribute. * @returns -1 if the name is invalid or the value doesn't exist in this attribute. */ offsetOf(part: "ns" | "namespace" | "attribute" | "attributeNS" | "operator" | "value" | "insensitive"): number; } function attribute(opts: AttributeOptions): Attribute; function isAttribute(node: any): node is Attribute; interface Pseudo extends Container { type: "pseudo"; } function pseudo(opts: ContainerOptions): Pseudo; /** * Checks whether the node is the Pseudo subtype of node. */ function isPseudo(node: any): node is Pseudo; /** * Checks whether the node is, specifically, a pseudo element instead of * pseudo class. */ function isPseudoElement(node: any): node is Pseudo; /** * Checks whether the node is, specifically, a pseudo class instead of * pseudo element. */ function isPseudoClass(node: any): node is Pseudo; interface Tag extends Namespace { type: "tag"; } function tag(opts: NamespaceOptions): Tag; function isTag(node: any): node is Tag; interface Comment extends Base { type: "comment"; } function comment(opts: NodeOptions): Comment; function isComment(node: any): node is Comment; interface Identifier extends Base { type: "id"; } function id(opts: any): any; function isIdentifier(node: any): node is Identifier; interface Nesting extends Base { type: "nesting"; } function nesting(opts: any): any; function isNesting(node: any): node is Nesting; interface String extends Base { type: "string"; } function string(opts: NodeOptions): String; function isString(node: any): node is String; interface Universal extends Base { type: "universal"; } function universal(opts?: NamespaceOptions): any; function isUniversal(node: any): node is Universal; }