import { RemoveSpaces } from "@re-do/utils" import { typeDefProxy, createParser, ParseConfig } from "./common.js" import { Fragment } from "./fragment.js" import { Optional } from "./optional.js" import { Shallow } from "./shallow.js" export namespace Str { export type Definition = Def export type Validate< Def extends string, TypeSet, ParsableDefinition extends string = RemoveSpaces > = Fragment.Validate< ParsableDefinition extends Optional.Definition ? OptionalDef : ParsableDefinition, Def, TypeSet > export type Parse< Def extends string, TypeSet, Options extends ParseConfig, ParsableDefinition extends string = RemoveSpaces > = ParsableDefinition extends Optional.Definition ? Fragment.Parse | undefined : Fragment.Parse export const type = typeDefProxy as Definition export const parse = createParser({ type, parent: () => Shallow.parse, matches: (definition) => typeof definition === "string", children: () => [Optional.delegate, Fragment.delegate] }) export const delegate = parse as any as Definition }