| // Type definitions for postcss-selector-parser 2.2.3 | 
| // Definitions by: Chris Eppstein <chris@eppsteins.net> | 
|   | 
| /*~ 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, U> = T extends U ? never : T; | 
|   | 
| // TODO: Conditional types in TS 1.8 will really clean this up. | 
| declare function parser(): parser.Processor<never>; | 
| declare function parser<Transform>(processor: parser.AsyncProcessor<Transform>): parser.Processor<Transform, never>; | 
| declare function parser(processor: parser.AsyncProcessor<void>): parser.Processor<never, never>; | 
| declare function parser<Transform>(processor: parser.SyncProcessor<Transform>): parser.Processor<Transform>; | 
| declare function parser(processor: parser.SyncProcessor<void>): parser.Processor<never>; | 
| declare function parser<Transform>(processor?: parser.SyncProcessor<Transform> | parser.AsyncProcessor<Transform>): parser.Processor<Transform>; | 
|   | 
| /*~ 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<ReturnType = void> = (root: parser.Root) => ReturnType; | 
|     type SyncProcessor<Transform = void> = ProcessorFn<Transform>; | 
|     type AsyncProcessor<Transform = void> = ProcessorFn<PromiseLike<Transform>>; | 
|   | 
|     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<Options>): Promise<Root>; | 
|         astSync(selectors: SyncSelectorsType, options?: Partial<Options>): Root; | 
|         transform(selectors: Selectors, options?: Partial<Options>): Promise<TransformType>; | 
|         transformSync(selectors: SyncSelectorsType, options?: Partial<Options>): TransformType; | 
|         process(selectors: Selectors, options?: Partial<Options>): Promise<string>; | 
|         processSync(selectors: SyncSelectorsType, options?: Partial<Options>): 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<SpaceAround> | undefined; | 
|     } | 
|     interface NodeOptions<Value = string> { | 
|         value: Value; | 
|         spaces?: Partial<Spaces>; | 
|         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; | 
|         prev(): Node; | 
|         clone(opts: {[override: string]:any}): Node; | 
|         /** | 
|          * 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<Node>; | 
|     } | 
|     interface Container< | 
|         Value extends string | undefined = string, | 
|         Child extends Node = Node | 
|     > extends Base<Value> { | 
|         nodes: Array<Child>; | 
|         append(selector: Selector): this; | 
|         prepend(selector: Selector): 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(): Container; | 
|         empty(): Container; | 
|         insertAfter(oldNode: Child, newNode: Child): this; | 
|         insertBefore(oldNode: Child, newNode: Child): this; | 
|         each(callback: (node: Child) => boolean | void): boolean | undefined; | 
|         walk( | 
|             callback: (node: Node) => 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<T>(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<T>( | 
|             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<Value extends string | undefined = string> extends NodeOptions<Value> { | 
|         namespace?: string | true; | 
|     } | 
|     interface Namespace<Value extends string | undefined = string> extends Base<Value> { | 
|         /** 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<undefined, Selector> { | 
|         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<S> extends Container<string, Diff<Node, S>> { | 
|         type: "selector"; | 
|     } | 
|     type Selector = _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<string | undefined> { | 
|         attribute: string; | 
|         operator?: AttributeOperator; | 
|         insensitive?: boolean; | 
|         quoteMark?: QuoteMark; | 
|         /** @deprecated Use quoteMark instead. */ | 
|         quoted?: boolean; | 
|         spaces?: { | 
|             before?: string; | 
|             after?: string; | 
|             attribute?: Partial<SpaceAround>; | 
|             operator?: Partial<SpaceAround>; | 
|             value?: Partial<SpaceAround>; | 
|             insensitive?: Partial<SpaceAround>; | 
|         } | 
|         raws: { | 
|             unquoted?: string; | 
|             attribute?: string; | 
|             operator?: string; | 
|             value?: string; | 
|             insensitive?: string; | 
|             spaces?: { | 
|                 attribute?: Partial<Spaces>; | 
|                 operator?: Partial<Spaces>; | 
|                 value?: Partial<Spaces>; | 
|                 insensitive?: Partial<Spaces>; | 
|             } | 
|         }; | 
|     } | 
|     interface Attribute extends Namespace<string | undefined> { | 
|         type: "attribute"; | 
|         attribute: string; | 
|         operator?: AttributeOperator; | 
|         insensitive?: boolean; | 
|         quoteMark: QuoteMark; | 
|         quoted?: boolean; | 
|         spaces: { | 
|             before: string; | 
|             after: string; | 
|             attribute?: Partial<Spaces>; | 
|             operator?: Partial<Spaces>; | 
|             value?: Partial<Spaces>; | 
|             insensitive?: Partial<Spaces>; | 
|         } | 
|         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<Spaces>; | 
|                 operator?: Partial<Spaces>; | 
|                 value?: Partial<Spaces>; | 
|                 insensitive?: Partial<Spaces>; | 
|             } | 
|         }; | 
|         /** | 
|          * 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<string, Selector> { | 
|         type: "pseudo"; | 
|     } | 
|     function pseudo(opts: ContainerOptions): Pseudo; | 
|     /** | 
|      * Checks wether the node is the Psuedo subtype of node. | 
|      */ | 
|     function isPseudo(node: any): node is Pseudo; | 
|   | 
|     /** | 
|      * Checks wether the node is, specifically, a pseudo element instead of | 
|      * pseudo class. | 
|      */ | 
|     function isPseudoElement(node: any): node is Pseudo; | 
|   | 
|     /** | 
|      * Checks wether 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; | 
| } |