magic-regexp
Advanced tools
Comparing version 0.1.0 to 0.2.0
@@ -17,77 +17,91 @@ declare type Flag = 'd' | 'g' | 'i' | 'm' | 's' | 'u' | 'y'; | ||
interface Input<T extends string = never> { | ||
declare type InputSource<S extends string = never, T extends string = never> = S | Input<S, T>; | ||
declare type MapToValues<T extends InputSource<any, any>[]> = T extends [infer First, ...infer Rest] ? First extends InputSource<infer K> ? [K, ...MapToValues<Rest>] : [] : []; | ||
declare type MapToGroups<T extends InputSource<any, string>[]> = T extends [ | ||
infer First, | ||
...infer Rest | ||
] ? First extends Input<any, infer K> ? K | MapToGroups<Rest> : MapToGroups<Rest> : never; | ||
declare type ExactEscapeChar = '.' | '*' | '+' | '?' | '^' | '$' | '{' | '}' | '(' | ')' | '|' | '[' | ']' | '/'; | ||
declare type Escape<T extends string, EscapeChar extends string> = T extends `${infer Start}${EscapeChar}${string}` ? Start extends `${string}${EscapeChar}${string}` ? never : T extends `${Start}${infer Char}${string}` ? Char extends EscapeChar ? T extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Escape<Rest, EscapeChar>}` : never : never : never : T; | ||
declare type GetValue<T extends InputSource<string>> = T extends string ? Escape<T, ExactEscapeChar> : T extends Input<infer R> ? R : never; | ||
interface Input<V extends string, G extends string = never> { | ||
/** this adds a new pattern to the current input */ | ||
and: <X extends string = never>(input: string | Input<X>) => Input<T | X>; | ||
and: <I extends InputSource<string, G>, Groups extends string = never>(input: I) => Input<`${V}${GetValue<I>}`, G | Groups>; | ||
/** this provides an alternative to the current input */ | ||
or: <X extends string = never>(input: string | Input<X>) => Input<T | X>; | ||
or: <I extends InputSource<string, G>, Groups extends string = never>(input: I) => Input<`(${V}|${GetValue<I>})`, G | Groups>; | ||
/** this is a positive lookbehind. Make sure to check [browser support](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#browser_compatibility) as not all browsers support lookbehinds (notably Safari) */ | ||
after: (input: string | Input) => Input<T>; | ||
after: <I extends InputSource<string>>(input: I) => Input<`(?<=${GetValue<I>})${V}`, G>; | ||
/** this is a positive lookahead */ | ||
before: (input: string | Input) => Input<T>; | ||
before: <I extends InputSource<string>>(input: I) => Input<`${V}(?=${GetValue<I>})`, G>; | ||
/** these is a negative lookbehind. Make sure to check [browser support](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#browser_compatibility) as not all browsers support lookbehinds (notably Safari) */ | ||
notAfter: (input: string | Input) => Input<T>; | ||
notAfter: <I extends InputSource<string>>(input: I) => Input<`(?<!${GetValue<I>})${V}`, G>; | ||
/** this is a negative lookahead */ | ||
notBefore: (input: string | Input) => Input<T>; | ||
notBefore: <I extends InputSource<string>>(input: I) => Input<`${V}(?!${GetValue<I>})`, G>; | ||
times: { | ||
/** repeat the previous pattern an exact number of times */ | ||
(number: number): Input<T>; | ||
<N extends number>(number: N): Input<`(${V}){${N}}`, G>; | ||
/** specify that the expression can repeat any number of times, _including none_ */ | ||
any: () => Input<`(${V})*`, G>; | ||
/** specify a range of times to repeat the previous pattern */ | ||
between: (min: number, max: number) => Input<T>; | ||
/** specify that the expression can repeat any number of times, _including none_ */ | ||
any: () => Input<T>; | ||
between: <Min extends number, Max extends number>(min: Min, max: Max) => Input<`(${V}){${Min},${Max}}`, G>; | ||
/** specify that the expression must occur at least x times */ | ||
atLeast: (min: number) => Input<T>; | ||
atLeast: <N extends number>(number: N) => Input<`(${V}){${N},}`, G>; | ||
}; | ||
/** this defines the entire input so far as a named capture group. You will get type safety when using the resulting RegExp with `String.match()` */ | ||
as: <K extends string>(key: K) => Input<T | K>; | ||
as: <K extends string>(key: K) => Input<`(?<${K}>${V})`, G | K>; | ||
/** this allows you to match beginning/ends of lines with `at.lineStart()` and `at.lineEnd()` */ | ||
at: { | ||
lineStart: () => Input<T>; | ||
lineEnd: () => Input<T>; | ||
lineStart: () => Input<`^${V}`, G>; | ||
lineEnd: () => Input<`${V}$`, G>; | ||
}; | ||
/** this allows you to mark the input so far as optional */ | ||
optionally: () => Input<T>; | ||
optionally: () => Input<`(${V})?`, G>; | ||
toString: () => string; | ||
} | ||
declare type Join<T extends string[], Prefix extends string = '', Joiner extends string = '|'> = T extends [infer F, ...infer R] ? F extends string ? `${Prefix}${F}${R extends string[] ? Join<R, Joiner, Joiner> : ''}` : '' : ''; | ||
/** This matches any character in the string provided */ | ||
declare const charIn: (chars: string) => Input<never>; | ||
declare const charIn: <T extends string>(chars: T) => Input<`[${T extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : T extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? T extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${any}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : T}]`, never>; | ||
/** This matches any character that is not in the string provided */ | ||
declare const charNotIn: (chars: string) => Input<never>; | ||
declare const charNotIn: <T extends string>(chars: T) => Input<`[^${T extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : T extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? T extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${Rest extends `${infer Start}^${string}` | `${infer Start}]${string}` | `${infer Start}\\${string}` | `${infer Start}-${string}` ? Start extends `${string}^${string}` | `${string}]${string}` | `${string}\\${string}` | `${string}-${string}` ? never : Rest extends `${Start}${infer Char}${string}` ? Char extends "^" | "]" | "\\" | "-" ? Rest extends `${Start}${Char}${infer Rest}` ? `${Start}\\${Char}${any}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : Rest}` : never : never : never : T}]`, never>; | ||
/** This takes an array of inputs and matches any of them. */ | ||
declare const anyOf: <T extends string = never>(...args: (string | Input<T>)[]) => Input<T>; | ||
declare const char: Input<never>; | ||
declare const word: Input<never>; | ||
declare const digit: Input<never>; | ||
declare const whitespace: Input<never>; | ||
declare const letter: Input<never>; | ||
declare const tab: Input<never>; | ||
declare const linefeed: Input<never>; | ||
declare const carriageReturn: Input<never>; | ||
declare const anyOf: <New extends InputSource<V, T>[], V extends string, T extends string>(...args: New) => Input<`(${Join<MapToValues<New>, "", "|">})`, MapToGroups<New>>; | ||
declare const char: Input<".", never>; | ||
declare const word: Input<"\\w", never>; | ||
declare const digit: Input<"\\d", never>; | ||
declare const whitespace: Input<"\\s", never>; | ||
declare const letter: Input<"[a-zA-Z]", never>; | ||
declare const tab: Input<"\\t", never>; | ||
declare const linefeed: Input<"\\n", never>; | ||
declare const carriageReturn: Input<"\\r", never>; | ||
declare const not: { | ||
word: Input<never>; | ||
digit: Input<never>; | ||
whitespace: Input<never>; | ||
letter: Input<never>; | ||
tab: Input<never>; | ||
linefeed: Input<never>; | ||
carriageReturn: Input<never>; | ||
word: Input<"\\W", never>; | ||
digit: Input<"\\D", never>; | ||
whitespace: Input<"\\S", never>; | ||
letter: Input<"[^a-zA-Z]", never>; | ||
tab: Input<"[^\\t]", never>; | ||
linefeed: Input<"[^\\n]", never>; | ||
carriageReturn: Input<"[^\\r]", never>; | ||
}; | ||
/** Equivalent to `?` - this marks the input as optional */ | ||
declare const maybe: (str: string | Input) => Input<never>; | ||
declare const maybe: <New extends InputSource<string, never>>(str: New) => Input<`(${GetValue<New>})?`, never>; | ||
/** This escapes a string input to match it exactly */ | ||
declare const exactly: (str: string | Input) => Input<never>; | ||
declare const oneOrMore: (str: string | Input) => Input<never>; | ||
declare const exactly: <New extends InputSource<string, never>>(input: New) => Input<GetValue<New>, never>; | ||
declare const oneOrMore: <New extends InputSource<string, never>>(str: New) => Input<`(${GetValue<New>})+`, never>; | ||
declare const MagicRegExpSymbol: unique symbol; | ||
declare type MagicRegExp<T = never> = RegExp & { | ||
[MagicRegExpSymbol]: T; | ||
declare type MagicRegExp<Value extends string, T = never> = RegExp & { | ||
[MagicRegExpSymbol]: T & Value; | ||
}; | ||
declare const createRegExp: <T extends string = never>(raw: string | Input<T>, flags?: Flag[]) => MagicRegExp<T>; | ||
declare const createRegExp: <Value extends string, NamedGroups extends string = never>(raw: Value | Input<Value, NamedGroups>, flags?: Flag[]) => MagicRegExp<`/${Value}/`, NamedGroups>; | ||
declare global { | ||
interface String { | ||
match<T extends string>(regexp: MagicRegExp<T>): (Omit<RegExpMatchArray, 'groups'> & { | ||
match<T extends string>(regexp: MagicRegExp<any, T>): (Omit<RegExpMatchArray, 'groups'> & { | ||
groups: Record<T, string | undefined>; | ||
}) | null; | ||
matchAll<T extends string>(regexp: MagicRegExp<T>): IterableIterator<Omit<RegExpMatchArray, 'groups'> & { | ||
matchAll<T extends string>(regexp: MagicRegExp<any, T>): IterableIterator<Omit<RegExpMatchArray, 'groups'> & { | ||
groups: Record<T, string | undefined>; | ||
@@ -94,0 +108,0 @@ }>; |
{ | ||
"name": "magic-regexp", | ||
"version": "0.1.0", | ||
"version": "0.2.0", | ||
"description": "", | ||
@@ -5,0 +5,0 @@ "repository": "danielroe/magic-regexp", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
33440
290