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.
		
		
		
		
		
			
		
			
				
					
					
						
							184 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							184 lines
						
					
					
						
							3.7 KiB
						
					
					
				type _If<Test, Then, Else> = Test extends true ? Then : Else;
 | 
						|
 | 
						|
export type Features = {
 | 
						|
  lookbehind?: boolean;
 | 
						|
  namedGroups?: boolean;
 | 
						|
  unicodePropertyEscape?: boolean;
 | 
						|
  unicodeSet?: boolean;
 | 
						|
  modifiers?: boolean;
 | 
						|
};
 | 
						|
 | 
						|
export type AstNodeType =
 | 
						|
  | "alternative"
 | 
						|
  | "anchor"
 | 
						|
  | "characterClass"
 | 
						|
  | "characterClassEscape"
 | 
						|
  | "characterClassRange"
 | 
						|
  | "disjunction"
 | 
						|
  | "dot"
 | 
						|
  | "group"
 | 
						|
  | "quantifier"
 | 
						|
  | "reference"
 | 
						|
  | "unicodePropertyEscape"
 | 
						|
  | "value";
 | 
						|
 | 
						|
export type Base<T extends AstNodeType> = {
 | 
						|
  range: [number, number];
 | 
						|
  raw: string;
 | 
						|
  type: T;
 | 
						|
};
 | 
						|
 | 
						|
export type AstNode<F extends Features = {}> =
 | 
						|
  | Alternative<F>
 | 
						|
  | Anchor
 | 
						|
  | CharacterClass<F>
 | 
						|
  | CharacterClassEscape
 | 
						|
  | CharacterClassRange
 | 
						|
  | Disjunction<F>
 | 
						|
  | Dot
 | 
						|
  | Group<F>
 | 
						|
  | Quantifier<F>
 | 
						|
  | Reference<F>
 | 
						|
  | _If<F["unicodePropertyEscape"], UnicodePropertyEscape, never>
 | 
						|
  | Value;
 | 
						|
 | 
						|
export type RootNode<F extends Features = {}> = Exclude<
 | 
						|
  AstNode<F>,
 | 
						|
  CharacterClassRange
 | 
						|
>;
 | 
						|
 | 
						|
export type Anchor = Base<"anchor"> & {
 | 
						|
  kind: "boundary" | "end" | "not-boundary" | "start";
 | 
						|
};
 | 
						|
 | 
						|
export type CharacterClassEscape = Base<"characterClassEscape"> & {
 | 
						|
  value: string;
 | 
						|
};
 | 
						|
 | 
						|
export type Value = Base<"value"> & {
 | 
						|
  codePoint: number;
 | 
						|
  kind:
 | 
						|
    | "controlLetter"
 | 
						|
    | "hexadecimalEscape"
 | 
						|
    | "identifier"
 | 
						|
    | "null"
 | 
						|
    | "octal"
 | 
						|
    | "singleEscape"
 | 
						|
    | "symbol"
 | 
						|
    | "unicodeCodePointEscape"
 | 
						|
    | "unicodeEscape";
 | 
						|
};
 | 
						|
 | 
						|
export type Identifier = Base<"value"> & {
 | 
						|
  value: string;
 | 
						|
};
 | 
						|
 | 
						|
export type Alternative<F extends Features = {}> = Base<"alternative"> & {
 | 
						|
  body: RootNode<F>[];
 | 
						|
};
 | 
						|
 | 
						|
export type CharacterClassRange = Base<"characterClassRange"> & {
 | 
						|
  max: Value;
 | 
						|
  min: Value;
 | 
						|
};
 | 
						|
 | 
						|
export type UnicodePropertyEscape = Base<"unicodePropertyEscape"> & {
 | 
						|
  negative: boolean;
 | 
						|
  value: string;
 | 
						|
};
 | 
						|
 | 
						|
export type CharacterClassBody =
 | 
						|
  | CharacterClassEscape
 | 
						|
  | CharacterClassRange
 | 
						|
  | UnicodePropertyEscape
 | 
						|
  | Value;
 | 
						|
 | 
						|
export type CharacterClass<F extends Features = {}> = Base<"characterClass"> & {
 | 
						|
  body: CharacterClassBody[];
 | 
						|
  negative: boolean;
 | 
						|
  kind: "union" | _If<F["unicodeSet"], "intersection" | "subtraction", never>;
 | 
						|
};
 | 
						|
 | 
						|
export type ModifierFlags = {
 | 
						|
  enabling: string,
 | 
						|
  disabling: string
 | 
						|
}
 | 
						|
 | 
						|
export type NonCapturingGroup<F extends Features = {}> = Base<"group"> &
 | 
						|
  (
 | 
						|
    | {
 | 
						|
        behavior:
 | 
						|
          | "lookahead"
 | 
						|
          | "lookbehind"
 | 
						|
          | "negativeLookahead"
 | 
						|
          | "negativeLookbehind";
 | 
						|
        body: RootNode<F>[];
 | 
						|
      }
 | 
						|
    | ({
 | 
						|
        behavior: "ignore";
 | 
						|
        body: RootNode<F>[];
 | 
						|
      } & _If<
 | 
						|
        F["modifiers"],
 | 
						|
        {
 | 
						|
          modifierFlags?: ModifierFlags;
 | 
						|
        },
 | 
						|
        {
 | 
						|
          modifierFlags: undefined;
 | 
						|
        }
 | 
						|
      >)
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
export type CapturingGroup<F extends Features = {}> = Base<"group"> & {
 | 
						|
  behavior: "normal";
 | 
						|
  body: RootNode<F>[];
 | 
						|
} & _If<
 | 
						|
    F["namedGroups"],
 | 
						|
    {
 | 
						|
      name?: Identifier;
 | 
						|
    },
 | 
						|
    {
 | 
						|
      name: undefined;
 | 
						|
    }
 | 
						|
  >;
 | 
						|
 | 
						|
export type Group<F extends Features = {}> =
 | 
						|
  | CapturingGroup<F>
 | 
						|
  | NonCapturingGroup<F>;
 | 
						|
 | 
						|
export type Quantifier<F extends Features = {}> = Base<"quantifier"> & {
 | 
						|
  body: [RootNode<F>];
 | 
						|
  greedy: boolean;
 | 
						|
  max?: number;
 | 
						|
  min: number;
 | 
						|
  symbol?: '?' | '*' | '+';
 | 
						|
};
 | 
						|
 | 
						|
export type Disjunction<F extends Features = {}> = Base<"disjunction"> & {
 | 
						|
  body: [RootNode<F>, RootNode<F>, ...RootNode<F>[]];
 | 
						|
};
 | 
						|
 | 
						|
export type Dot = Base<"dot">;
 | 
						|
 | 
						|
export type NamedReference = Base<"reference"> & {
 | 
						|
  matchIndex: undefined;
 | 
						|
  name: Identifier;
 | 
						|
};
 | 
						|
 | 
						|
export type IndexReference = Base<"reference"> & {
 | 
						|
  matchIndex: number;
 | 
						|
  name: undefined;
 | 
						|
};
 | 
						|
 | 
						|
export type Reference<F extends Features = {}> = _If<
 | 
						|
  F["namedGroups"],
 | 
						|
  NamedReference,
 | 
						|
  IndexReference
 | 
						|
>;
 | 
						|
 | 
						|
export function parse<F extends Features = {}>(
 | 
						|
  str: string,
 | 
						|
  flags: string,
 | 
						|
  features?: F
 | 
						|
): RootNode<F>;
 |