 c177363a19
			
		
	
	c177363a19
	
	
	
		
			
			🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			556 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			556 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| // 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 | 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<Node>;
 | |
|     }
 | |
|     interface Container<
 | |
|         Value extends string | undefined = string,
 | |
|         Child extends Node = Node
 | |
|     > extends Base<Value> {
 | |
|         nodes: Array<Child>;
 | |
|         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<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 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): Identifier;
 | |
|     function isIdentifier(node: any): node is Identifier;
 | |
| 
 | |
|     interface Nesting extends Base {
 | |
|         type: "nesting";
 | |
|     }
 | |
|     function nesting(opts?: any): Nesting;
 | |
|     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): Universal;
 | |
|     function isUniversal(node: any): node is Universal;
 | |
| }
 |