123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- 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: 'd' | 'D' | 'w' | 'W' | 's' | 'S';
- };
- 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"],
- IndexReference | NamedReference,
- IndexReference
- >;
- export function parse<F extends Features = {}>(
- str: string,
- flags: string,
- features?: F
- ): RootNode<F>;
|