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
			| 
											3 years ago
										 | 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>; |