import type { ErrorMessage, inferred } from "@ark/util"; import type { RegexExecArray } from "./execArray.ts"; import type { parseState } from "./parse.ts"; import type { State } from "./state.ts"; export type IndexedCaptures = Array; export type NamedCaptures = Record; export type UnicodeFlag = "v" | "u"; export type Flags = `${"d" | ""}${"g" | ""}${"i" | ""}${"m" | ""}${"s" | ""}${UnicodeFlag | ""}${"y" | ""}`; export type RegexContext = { flags?: Flags; captures?: IndexedCaptures; names?: NamedCaptures; }; export interface Regex extends RegExp { [inferred]: pattern; infer: pattern; inferCaptures: ctx["captures"] extends IndexedCaptures ? ctx["captures"] : []; inferNamedCaptures: ctx["names"] extends NamedCaptures ? ctx["names"] : {}; inferExecArray: RegexExecArray<[ pattern, ...this["inferCaptures"] ], this["inferNamedCaptures"], this["flags"]>; flags: ctx["flags"] extends Flags ? ctx["flags"] : ""; test(s: string): s is pattern; exec(s: string): this["inferExecArray"] | null; exec(s: string): never; } export interface RegexParser { (src: regex.validate, flags?: flags): regex.parse; as: (src: string, flags?: Flags) => Regex; } export declare const regex: RegexParser; export type regex = Regex; export declare namespace regex { type infer = parse extends Regex ? pattern : never; type validate = parse extends infer e extends ErrorMessage ? e : src; type parse = parseState>; }