@devp0nt/route0 1.0.0-next.71 → 1.0.0-next.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +6 -14
- package/dist/esm/index.d.ts +6 -14
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\nimport { parse as parseSearchQuery, stringify as stringifySearchQuery } from '@devp0nt/flat0'\n\nexport type PathToken =\n | { kind: 'static'; value: string }\n | { kind: 'param'; name: string; optional: boolean }\n | { kind: 'wildcard'; prefix: string; optional: boolean }\n\nconst escapeRegex = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nconst getPathSegments = (definition: string): string[] => {\n if (definition === '' || definition === '/') return []\n return definition.split('/').filter(Boolean)\n}\n\nconst getPathTokens = (definition: string): PathToken[] => {\n const segments = getPathSegments(definition)\n return segments.map((segment): PathToken => {\n const param = segment.match(/^:([A-Za-z0-9_]+)(\\?)?$/)\n if (param) {\n return { kind: 'param', name: param[1], optional: param[2] === '?' }\n }\n if (segment === '*' || segment === '*?') {\n return { kind: 'wildcard', prefix: '', optional: segment.endsWith('?') }\n }\n const wildcard = segment.match(/^(.*)\\*(\\?)?$/)\n if (wildcard && !segment.includes('\\\\*')) {\n return { kind: 'wildcard', prefix: wildcard[1], optional: wildcard[2] === '?' }\n }\n return { kind: 'static', value: segment }\n })\n}\n\nconst getPathRegexBaseStrictString = (definition: string): string => {\n const tokens = getPathTokens(definition)\n if (tokens.length === 0) return ''\n let pattern = ''\n for (const token of tokens) {\n if (token.kind === 'static') {\n pattern += `/${escapeRegex(token.value)}`\n continue\n }\n if (token.kind === 'param') {\n pattern += token.optional ? '(?:/([^/]+))?' : '/([^/]+)'\n continue\n }\n if (token.prefix.length > 0) {\n pattern += `/${escapeRegex(token.prefix)}(.*)`\n } else {\n // Wouter-compatible splat: /orders/* matches /orders and /orders/...\n pattern += '(?:/(.*))?'\n }\n }\n return pattern\n}\n\nconst getPathCaptureKeys = (definition: string): string[] => {\n const keys: string[] = []\n for (const token of getPathTokens(definition)) {\n if (token.kind === 'param') keys.push(token.name)\n if (token.kind === 'wildcard') keys.push('*')\n }\n return keys\n}\n\nconst getPathParamsDefinition = (definition: string): Record<string, boolean> => {\n const entries = getPathTokens(definition)\n .filter((t) => t.kind !== 'static')\n .map((t): [string, boolean] => (t.kind === 'param' ? [t.name, !t.optional] : ['*', !t.optional]))\n return Object.fromEntries(entries)\n}\n\nconst validatePathDefinition = (definition: string): void => {\n const segments = getPathSegments(definition)\n const wildcardSegments = segments.filter((segment) => segment.includes('*'))\n if (wildcardSegments.length === 0) return\n if (wildcardSegments.length > 1) {\n throw new Error(`Invalid route definition \"${definition}\": only one wildcard segment is allowed`)\n }\n const wildcardSegmentIndex = segments.findIndex((segment) => segment.includes('*'))\n const wildcardSegment = segments[wildcardSegmentIndex]\n if (!wildcardSegment.match(/^(?:\\*|\\*\\?|[^*]+\\*|\\S+\\*\\?)$/)) {\n throw new Error(`Invalid route definition \"${definition}\": wildcard must be trailing in its segment`)\n }\n if (wildcardSegmentIndex !== segments.length - 1) {\n throw new Error(`Invalid route definition \"${definition}\": wildcard segment is allowed only at the end`)\n }\n}\n\nconst stripTrailingWildcard = (definition: string): string => definition.replace(/\\*\\??$/, '')\n\n/**\n * Strongly typed route descriptor and URL builder.\n *\n * A route definition uses:\n * - path params: `/users/:id`\n * - named search keys: `/users&tab&sort`\n * - loose search mode: trailing `&`, e.g. `/users&`\n *\n * Instances are callable (same as `.get()`), so `route(input)` and\n * `route.get(input)` are equivalent.\n */\nexport class Route0<TDefinition extends string, TSearchInput extends UnknownSearchInput = UnknownSearchInput> {\n readonly definition: TDefinition\n readonly params: _ParamsDefinition<TDefinition>\n private _origin: string | undefined\n private _callable: CallableRoute<TDefinition, TSearchInput>\n\n Infer: {\n ParamsDefinition: _ParamsDefinition<TDefinition>\n ParamsInput: _ParamsInput<TDefinition>\n ParamsInputStringOnly: _ParamsInputStringOnly<TDefinition>\n ParamsOutput: ParamsOutput<TDefinition>\n SearchInput: TSearchInput\n } = null as never\n\n /** Base URL used when generating absolute URLs (`abs: true`). */\n get origin(): string {\n if (!this._origin) {\n throw new Error(\n 'origin for route ' +\n this.definition +\n ' is not set, please provide it like Route0.create(route, {origin: \"https://example.com\"}) in config or set via clones like routes._.clone({origin: \"https://example.com\"})',\n )\n }\n return this._origin\n }\n set origin(origin: string) {\n this._origin = origin\n }\n\n private constructor(definition: TDefinition, config: RouteConfigInput = {}) {\n validatePathDefinition(definition)\n this.definition = definition\n this.params = Route0._getParamsDefinitionByDefinition(definition)\n\n const { origin } = config\n if (origin && typeof origin === 'string' && origin.length) {\n this._origin = origin\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } } | undefined\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this._origin = g.location.origin\n } else {\n this._origin = undefined\n }\n }\n const callable = this.get.bind(this)\n Object.setPrototypeOf(callable, this)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: this.definition,\n })\n this._callable = callable as CallableRoute<TDefinition, TSearchInput>\n }\n\n /**\n * Creates a callable route instance.\n *\n * If an existing route/callable route is provided, it is cloned.\n */\n static create<TDefinition extends string>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n config?: RouteConfigInput,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function' || typeof definition === 'object') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n const original = new Route0<TDefinition>(definition, config)\n return original._callable\n }\n\n /**\n * Normalizes a definition/route into a callable route.\n *\n * Unlike `create`, passing a callable route returns the same instance.\n */\n static from<TDefinition extends string, TSearchInput extends UnknownSearchInput>(\n definition: TDefinition | AnyRoute<TDefinition, TSearchInput> | CallableRoute<TDefinition, TSearchInput>,\n ): CallableRoute<TDefinition, TSearchInput> {\n if (typeof definition === 'function') {\n return definition\n }\n const original = typeof definition === 'object' ? definition : new Route0<TDefinition>(definition)\n return original._callable as CallableRoute<TDefinition, TSearchInput>\n }\n\n private static _getAbsPath(origin: string, url: string) {\n return new URL(url, origin).toString().replace(/\\/$/, '')\n }\n\n private static _getParamsDefinitionByDefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _ParamsDefinition<TDefinition> {\n return getPathParamsDefinition(definition) as _ParamsDefinition<TDefinition>\n }\n\n search<TNewSearchInput extends UnknownSearchInput>(): CallableRoute<TDefinition, TNewSearchInput> {\n return this._callable as CallableRoute<TDefinition, TNewSearchInput>\n }\n\n /** Extends the current route definition by appending a suffix route. */\n extend<TSuffixDefinition extends string>(\n suffixDefinition: TSuffixDefinition,\n ): CallableRoute<PathExtended<TDefinition, TSuffixDefinition>, TSearchInput> {\n const sourceDefinitionWithoutWildcard = stripTrailingWildcard(this.definition)\n const definition = `${sourceDefinitionWithoutWildcard}/${suffixDefinition}`.replace(/\\/{2,}/g, '/')\n return Route0.create<PathExtended<TDefinition, TSuffixDefinition>>(\n definition as PathExtended<TDefinition, TSuffixDefinition>,\n { origin: this._origin },\n )\n }\n\n get(...args: IsParamsOptional<TDefinition> extends true ? [abs: boolean | string | undefined] : never): string\n get(\n ...args: IsParamsOptional<TDefinition> extends true\n ? [\n input?:\n | (_ParamsInput<TDefinition> & {\n '?'?: TSearchInput\n '#'?: string | number\n })\n | undefined,\n abs?: boolean | string | undefined,\n ]\n : [\n input: _ParamsInput<TDefinition> & {\n '?'?: TSearchInput\n '#'?: string | number\n },\n abs?: boolean | string | undefined,\n ]\n ): string\n\n // implementation\n get(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, absOriginInput, hashInput } = ((): {\n searchInput: Record<string, unknown>\n paramsInput: Record<string, string | undefined>\n absInput: boolean\n absOriginInput: string | undefined\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n absOriginInput: undefined,\n hashInput: undefined,\n }\n }\n const [input, abs] = ((): [Record<string, unknown>, boolean | string | undefined] => {\n if (typeof args[0] === 'object' && args[0] !== null) {\n return [args[0], args[1]] as [Record<string, unknown>, boolean | string | undefined]\n }\n if (typeof args[1] === 'object' && args[1] !== null) {\n return [args[1], args[0]] as [Record<string, unknown>, boolean | string | undefined]\n }\n if (typeof args[0] === 'boolean' || typeof args[0] === 'string') {\n return [{}, args[0]]\n }\n if (typeof args[1] === 'boolean' || typeof args[1] === 'string') {\n return [{}, args[1]]\n }\n return [{}, undefined]\n })()\n let searchInput: Record<string, unknown> = {}\n let hashInput: string | undefined = undefined\n const paramsInput: Record<string, string | undefined> = {}\n for (const [key, value] of Object.entries(input)) {\n if (key === '?' && typeof value === 'object' && value !== null) {\n searchInput = value as Record<string, unknown>\n } else if (key === '#' && (typeof value === 'string' || typeof value === 'number')) {\n hashInput = String(value)\n } else if (key in this.params && (typeof value === 'string' || typeof value === 'number')) {\n Object.assign(paramsInput, { [key]: String(value) })\n }\n }\n const absOriginInput = typeof abs === 'string' && abs.length > 0 ? abs : undefined\n return {\n searchInput,\n paramsInput,\n absInput: absOriginInput !== undefined || abs === true,\n absOriginInput,\n hashInput,\n }\n })()\n\n // create url\n\n let url = this.definition as string\n // optional named params like /:id?\n url = url.replace(/\\/:([A-Za-z0-9_]+)\\?/g, (_m, k) => {\n const value = paramsInput[k]\n if (value === undefined) return ''\n return `/${encodeURIComponent(String(value))}`\n })\n // required named params\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n url = url.replace(/:([A-Za-z0-9_]+)(?!\\?)/g, (_m, k) => encodeURIComponent(String(paramsInput?.[k] ?? 'undefined')))\n // optional wildcard segment (/*?)\n url = url.replace(/\\/\\*\\?/g, () => {\n const value = paramsInput['*']\n if (value === undefined) return ''\n const stringValue = String(value)\n return stringValue.startsWith('/') ? stringValue : `/${stringValue}`\n })\n // required wildcard segment (/*)\n url = url.replace(/\\/\\*/g, () => {\n const value = String(paramsInput['*'] ?? '')\n return value.startsWith('/') ? value : `/${value}`\n })\n // optional wildcard inline (e.g. /app*?)\n url = url.replace(/\\*\\?/g, () => String(paramsInput['*'] ?? ''))\n // required wildcard inline (e.g. /app*)\n url = url.replace(/\\*/g, () => String(paramsInput['*'] ?? ''))\n // search params\n const searchString = stringifySearchQuery(searchInput)\n url = [url, searchString].filter(Boolean).join('?')\n // dedupe slashes\n url = url.replace(/\\/{2,}/g, '/')\n // absolute\n url = absInput ? Route0._getAbsPath(absOriginInput || this.origin, url) : url\n // hash\n if (hashInput !== undefined) {\n url = `${url}#${hashInput}`\n }\n\n return url\n }\n\n /** Returns path param keys extracted from route definition. */\n getParamsKeys(): string[] {\n return Object.keys(this.params)\n }\n\n getPathTokens(): PathToken[] {\n return getPathTokens(this.definition)\n }\n\n /** Clones route with optional config override. */\n clone(config?: RouteConfigInput): CallableRoute<TDefinition> {\n return Route0.create(this.definition, config)\n }\n\n getRegexBaseStrictString(): string {\n return getPathRegexBaseStrictString(this.definition)\n }\n\n getRegexBaseString(): string {\n return this.getRegexBaseStrictString().replace(/\\/+$/, '') + '/?' // remove trailing slashes and add optional slash\n }\n\n getRegexStrictString(): string {\n return `^${this.getRegexBaseStrictString()}$`\n }\n\n getRegexString(): string {\n return `^${this.getRegexBaseString()}$`\n }\n\n getRegexStrict(): RegExp {\n return new RegExp(this.getRegexStrictString())\n }\n\n getRegex(): RegExp {\n return new RegExp(this.getRegexString())\n }\n\n /** Creates a grouped strict regex pattern string from many routes. */\n static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a strict grouped regex from many routes. */\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Creates a grouped regex pattern string from many routes. */\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a grouped regex from many routes. */\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Converts any location shape to relative form (removes host/origin fields). */\n static toRelLocation<TLocation extends AnyLocation>(location: TLocation): TLocation {\n return {\n ...location,\n abs: false,\n origin: undefined,\n href: undefined,\n port: undefined,\n host: undefined,\n hostname: undefined,\n }\n }\n\n /** Converts a location to absolute form using provided origin URL. */\n static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, origin: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, origin)\n return {\n ...location,\n abs: true,\n origin: url.origin,\n href: url.href,\n port: url.port,\n host: url.host,\n hostname: url.hostname,\n }\n }\n\n /**\n * Parses a URL-like input into raw location object (without route knowledge).\n *\n * Result is always `UnknownLocation` because no route matching is applied.\n */\n static getLocation(href: `${string}://${string}`): UnknownLocation\n static getLocation(hrefRel: `/${string}`): UnknownLocation\n static getLocation(hrefOrHrefRel: string): UnknownLocation\n static getLocation(location: AnyLocation): UnknownLocation\n static getLocation(url: URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return Route0.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n // Check if it's an absolute URL (starts with scheme://)\n const abs = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(hrefOrHrefRelOrLocation)\n\n // Use dummy base only if relative\n const base = abs ? undefined : 'http://example.com'\n const url = new URL(hrefOrHrefRelOrLocation, base)\n\n // Parse search query to object form\n const search = parseSearchQuery(url.search)\n\n // Normalize pathname (remove trailing slash except for root)\n let pathname = url.pathname\n if (pathname.length > 1 && pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1)\n }\n\n // Common derived values\n const hrefRel = pathname + url.search + url.hash\n\n // Build the location object consistent with _GeneralLocation\n const location: UnknownLocation = {\n pathname,\n search,\n searchString: url.search,\n hash: url.hash,\n origin: abs ? url.origin : undefined,\n href: abs ? url.href : undefined,\n hrefRel,\n abs,\n\n // extra host-related fields (available even for relative with dummy base)\n host: abs ? url.host : undefined,\n hostname: abs ? url.hostname : undefined,\n port: abs ? url.port || undefined : undefined,\n\n // specific to UnknownLocation\n params: undefined,\n route: undefined,\n known: false,\n exact: false,\n ancestor: false,\n descendant: false,\n unmatched: false,\n }\n\n return location\n }\n\n /**\n * Parses input and matches it against this route definition.\n *\n * Result includes relation flags:\n * - `exact`\n * - `ancestor`\n * - `descendant`\n * - `unmatched`\n */\n getLocation(href: `${string}://${string}`): KnownLocation<TDefinition>\n getLocation(hrefRel: `/${string}`): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRel: string): KnownLocation<TDefinition>\n getLocation(location: AnyLocation): KnownLocation<TDefinition>\n getLocation(url: AnyLocation): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition> {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return this.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n const location = Route0.getLocation(hrefOrHrefRelOrLocation) as never as KnownLocation<TDefinition>\n location.route = this.definition as Definition<TDefinition>\n location.params = {}\n\n // Normalize pathname (no trailing slash except root)\n const pathname =\n location.pathname.length > 1 && location.pathname.endsWith('/')\n ? location.pathname.slice(0, -1)\n : location.pathname\n\n const paramNames = getPathCaptureKeys(this.definition)\n const def =\n this.definition.length > 1 && this.definition.endsWith('/') ? this.definition.slice(0, -1) : this.definition\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const ancestorRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n const ancestorMatch = pathname.match(ancestorRe)\n const exact = !!exactMatch\n const ancestor = !exact && !!ancestorMatch\n\n // Parse params for exact and ancestor matches.\n const paramsMatch = exactMatch || (ancestor ? ancestorMatch : null)\n if (paramsMatch) {\n const values = paramsMatch.slice(1, 1 + paramNames.length)\n const params = Object.fromEntries(\n paramNames.map((n, i) => {\n const value = values[i] as string | undefined\n return [n, value === undefined ? undefined : decodeURIComponent(value)]\n }),\n )\n location.params = params\n } else {\n location.params = {}\n }\n\n // \"descendant\": the URL is a prefix of the route definition (params match any single segment)\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n const defParts = getParts(def)\n const pathParts = getParts(pathname)\n\n let isPrefix = true\n if (pathParts.length > defParts.length) {\n isPrefix = false\n } else {\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart) {\n isPrefix = false\n break\n }\n if (defPart.startsWith(':')) continue\n if (defPart.includes('*')) {\n const prefix = defPart.replace(/\\*\\??$/, '')\n if (pathPart.startsWith(prefix)) continue\n isPrefix = false\n break\n }\n if (defPart !== pathPart) {\n isPrefix = false\n break\n }\n }\n }\n const descendant = !exact && isPrefix\n const unmatched = !exact && !ancestor && !descendant\n\n // For descendant matches, include only params that are already determined\n // by the current (shorter) pathname prefix.\n if (descendant) {\n const descendantParams: Record<string, string> = {}\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart || !pathPart) continue\n if (defPart.startsWith(':')) {\n descendantParams[defPart.replace(/^:/, '').replace(/\\?$/, '')] = decodeURIComponent(pathPart)\n } else if (defPart.includes('*')) {\n descendantParams['*'] = decodeURIComponent(pathPart)\n }\n }\n location.params = descendantParams\n }\n\n return {\n ...location,\n known: true,\n exact,\n ancestor,\n descendant,\n unmatched,\n } as KnownLocation<TDefinition>\n }\n\n private _validateParamsInput(input: unknown): StandardSchemaV1.Result<ParamsOutput<TDefinition>> {\n const paramsEntries = Object.entries(this.params) as Array<[string, boolean]>\n const paramsMap = this.params as Record<string, boolean>\n const requiredParamsKeys = paramsEntries.filter(([, required]) => required).map(([k]) => k)\n const paramsKeys = paramsEntries.map(([k]) => k)\n if (input === undefined) {\n if (requiredParamsKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${requiredParamsKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid route params: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const inputKeys = Object.keys(inputObj)\n const notDefinedKeys = requiredParamsKeys.filter((k) => !inputKeys.includes(k))\n if (notDefinedKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${notDefinedKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n const data: Record<string, string | undefined> = {}\n for (const k of paramsKeys) {\n const v = inputObj[k]\n const required = paramsMap[k]\n if (v === undefined && !required) {\n data[k] = undefined as never\n } else if (typeof v === 'string') {\n data[k] = v\n } else if (typeof v === 'number') {\n data[k] = String(v)\n } else {\n return {\n issues: [{ message: `Invalid route params: expected string, number, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as ParamsOutput<TDefinition>,\n }\n }\n\n private _safeParseSchemaResult<TOutput extends Record<string, unknown>>(\n result: StandardSchemaV1.Result<TOutput>,\n ): _SafeParseInputResult<TOutput> {\n if ('issues' in result) {\n return {\n success: false,\n data: undefined,\n error: new Error(result.issues?.[0]?.message ?? 'Invalid input'),\n }\n }\n return {\n success: true,\n data: result.value,\n error: undefined,\n }\n }\n\n private _parseSchemaResult<TOutput extends Record<string, unknown>>(\n result: StandardSchemaV1.Result<TOutput>,\n ): TOutput {\n const safeResult = this._safeParseSchemaResult(result)\n if (safeResult.error) {\n throw safeResult.error\n }\n return safeResult.data\n }\n\n /** Standard Schema for route params input. */\n readonly schema: SchemaRoute0<ParamsInput<TDefinition>, ParamsOutput<TDefinition>> = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateParamsInput(value),\n types: undefined as unknown as StandardSchemaV1.Types<ParamsInput<TDefinition>, ParamsOutput<TDefinition>>,\n },\n parse: (value) => this._parseSchemaResult(this._validateParamsInput(value)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateParamsInput(value)),\n }\n\n /** True when path structure is equal (param names are ignored). */\n isSame(other: AnyRoute): boolean {\n return (\n getPathTokens(this.definition)\n .map((t) => {\n if (t.kind === 'static') return `s:${t.value}`\n if (t.kind === 'param') return `p:${t.optional ? 'o' : 'r'}`\n return `w:${t.prefix}:${t.optional ? 'o' : 'r'}`\n })\n .join('/') ===\n getPathTokens(other.definition)\n .map((t) => {\n if (t.kind === 'static') return `s:${t.value}`\n if (t.kind === 'param') return `p:${t.optional ? 'o' : 'r'}`\n return `w:${t.prefix}:${t.optional ? 'o' : 'r'}`\n })\n .join('/')\n )\n }\n /** Static convenience wrapper for `isSame`. */\n static isSame(a: AnyRoute | string | undefined, b: AnyRoute | string | undefined): boolean {\n if (!a) {\n if (!b) return true\n return false\n }\n if (!b) {\n return false\n }\n return Route0.create(a).isSame(Route0.create(b))\n }\n\n /** True when current route is more specific/deeper than `other`. */\n isDescendant(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a descendant of other if:\n // - paths are not exactly the same\n // - other's path is a prefix of this path, matching params as wildcards\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n // Root is ancestor of any non-root; thus any non-root is a descendant of root\n if (other.definition === '/' && this.definition !== '/') {\n return true\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n\n // A descendant must be deeper\n if (thisParts.length <= otherParts.length) return false\n\n for (let i = 0; i < otherParts.length; i++) {\n const otherPart = otherParts[i]\n const thisPart = thisParts[i]\n if (otherPart.startsWith(':')) continue\n if (otherPart !== thisPart) return false\n }\n // Not equal (depth already ensures not equal)\n return true\n }\n\n /** True when current route is broader/shallower than `other`. */\n isAncestor(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is an ancestor of other if:\n // - paths are not exactly the same\n // - this path is a prefix of other path, matching params as wildcards\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n // Root is ancestor of any non-root path\n if (this.definition === '/' && other.definition !== '/') {\n return true\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n\n // An ancestor must be shallower\n if (thisParts.length >= otherParts.length) return false\n\n for (let i = 0; i < thisParts.length; i++) {\n const thisPart = thisParts[i]\n const otherPart = otherParts[i]\n if (thisPart.startsWith(':')) continue\n if (thisPart !== otherPart) return false\n }\n // Not equal (depth already ensures not equal)\n return true\n }\n\n /** True when two route patterns can match the same concrete URL. */\n isConflict(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n const thisRegex = this.getRegex()\n const otherRegex = other.getRegex()\n const makeCandidates = (definition: string): string[] => {\n const tokens = getPathTokens(definition)\n const values = (token: PathToken): string[] => {\n if (token.kind === 'static') return [token.value]\n if (token.kind === 'param') return token.optional ? ['', 'x'] : ['x']\n if (token.prefix.length > 0) return [token.prefix, `${token.prefix}-x`, `${token.prefix}/x/y`]\n return ['', 'x', 'x/y']\n }\n let acc: string[] = ['']\n for (const token of tokens) {\n const next: string[] = []\n for (const base of acc) {\n for (const value of values(token)) {\n if (value === '') {\n next.push(base)\n } else if (value.startsWith('/')) {\n next.push(`${base}${value}`)\n } else {\n next.push(`${base}/${value}`)\n }\n }\n }\n acc = next\n }\n if (acc.length === 0) return ['/']\n return Array.from(new Set(acc.map((x) => (x === '' ? '/' : x.replace(/\\/{2,}/g, '/')))))\n }\n const thisCandidates = makeCandidates(this.definition)\n const otherCandidates = makeCandidates(other.definition)\n if (thisCandidates.some((path) => otherRegex.test(path))) return true\n if (otherCandidates.some((path) => thisRegex.test(path))) return true\n return false\n }\n\n /** True when paths are same or can overlap when optional parts are omitted. */\n isMayBeSame(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n return this.isSame(other) || this.isConflict(other)\n }\n\n /** Specificity comparator used for deterministic route ordering. */\n isMoreSpecificThan(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n const rank = (part: string): number => {\n if (part.includes('*')) return -1\n if (part.startsWith(':') && part.endsWith('?')) return 0\n if (part.startsWith(':')) return 1\n return 2\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n for (let i = 0; i < Math.min(thisParts.length, otherParts.length); i++) {\n const thisRank = rank(thisParts[i])\n const otherRank = rank(otherParts[i])\n if (thisRank > otherRank) return true\n if (thisRank < otherRank) return false\n }\n return this.definition < other.definition\n }\n}\n\n/**\n * Typed route collection with deterministic matching order.\n *\n * `Routes.create()` accepts either plain string definitions or route objects\n * and returns a \"pretty\" object with direct route access + helper methods under `._`.\n */\n\nexport class Routes<const T extends RoutesRecord = any> {\n _routes: RoutesRecordHydrated<T>\n _pathsOrdering: string[]\n _keysOrdering: string[]\n _ordered: CallableRoute[]\n\n _: {\n routes: Routes<T>['_routes']\n getLocation: Routes<T>['_getLocation']\n clone: Routes<T>['_clone']\n pathsOrdering: Routes<T>['_pathsOrdering']\n keysOrdering: Routes<T>['_keysOrdering']\n ordered: Routes<T>['_ordered']\n }\n\n private constructor({\n routes,\n isHydrated = false,\n pathsOrdering,\n keysOrdering,\n ordered,\n }: {\n routes: RoutesRecordHydrated<T> | T\n isHydrated?: boolean\n pathsOrdering?: string[]\n keysOrdering?: string[]\n ordered?: CallableRoute[]\n }) {\n this._routes = (\n isHydrated ? (routes as RoutesRecordHydrated<T>) : Routes.hydrate(routes)\n ) as RoutesRecordHydrated<T>\n if (!pathsOrdering || !keysOrdering || !ordered) {\n const ordering = Routes.makeOrdering(this._routes)\n this._pathsOrdering = ordering.pathsOrdering\n this._keysOrdering = ordering.keysOrdering\n this._ordered = this._keysOrdering.map((key) => this._routes[key])\n } else {\n this._pathsOrdering = pathsOrdering\n this._keysOrdering = keysOrdering\n this._ordered = ordered\n }\n this._ = {\n routes: this._routes,\n getLocation: this._getLocation.bind(this),\n clone: this._clone.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n /** Creates and hydrates a typed routes collection. */\n static create<const T extends RoutesRecord>(routes: T, override?: RouteConfigInput): RoutesPretty<T> {\n const result = Routes.prettify(new Routes({ routes }))\n if (!override) {\n return result\n }\n return result._.clone(override)\n }\n\n private static prettify<const T extends RoutesRecord>(instance: Routes<T>): RoutesPretty<T> {\n Object.setPrototypeOf(instance, Routes.prototype)\n Object.defineProperty(instance, Symbol.toStringTag, {\n value: 'Routes',\n })\n Object.assign(instance, {\n clone: instance._clone.bind(instance),\n })\n Object.assign(instance, instance._routes)\n return instance as unknown as RoutesPretty<T>\n }\n\n private static hydrate<const T extends RoutesRecord>(routes: T): RoutesRecordHydrated<T> {\n const result = {} as RoutesRecordHydrated<T>\n for (const key in routes) {\n if (Object.hasOwn(routes, key)) {\n const value = routes[key]\n result[key] = (typeof value === 'string' ? Route0.create(value) : value) as CallableRoute<T[typeof key]>\n }\n }\n return result\n }\n\n /**\n * Matches an input URL against collection routes.\n *\n * Returns first exact match according to precomputed ordering,\n * otherwise returns `UnknownLocation`.\n */\n _getLocation(href: `${string}://${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefRel: `/${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRel: string): UnknownLocation | ExactLocation\n _getLocation(location: AnyLocation): UnknownLocation | ExactLocation\n _getLocation(url: URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation {\n // Find the route that exactly matches the given location\n const input = hrefOrHrefRelOrLocation\n for (const route of this._ordered) {\n const loc = route.getLocation(hrefOrHrefRelOrLocation)\n if (loc.exact) {\n return loc\n }\n }\n // No exact match found, return UnknownLocation\n return typeof input === 'string' ? Route0.getLocation(input) : Route0.getLocation(input)\n }\n\n private static makeOrdering(routes: RoutesRecord): {\n pathsOrdering: string[]\n keysOrdering: string[]\n } {\n const hydrated = Routes.hydrate(routes)\n const entries = Object.entries(hydrated)\n\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n // Sort: overlapping routes by specificity first, otherwise by path depth and alphabetically.\n entries.sort(([_keyA, routeA], [_keyB, routeB]) => {\n const partsA = getParts(routeA.definition)\n const partsB = getParts(routeB.definition)\n\n // 1. Overlapping routes: more specific first\n if (routeA.isMayBeSame(routeB)) {\n if (routeA.isMoreSpecificThan(routeB)) return -1\n if (routeB.isMoreSpecificThan(routeA)) return 1\n }\n\n // 2. Different non-overlapping depth: shorter first\n if (partsA.length !== partsB.length) {\n return partsA.length - partsB.length\n }\n\n // 3. Fallback: alphabetically for deterministic ordering\n return routeA.definition.localeCompare(routeB.definition)\n })\n\n const pathsOrdering = entries.map(([_key, route]) => route.definition)\n const keysOrdering = entries.map(([_key]) => _key)\n return { pathsOrdering, keysOrdering }\n }\n\n /** Returns a cloned routes collection with config applied to each route. */\n _clone(config: RouteConfigInput): RoutesPretty<T> {\n const newRoutes = {} as RoutesRecordHydrated<T>\n for (const key in this._routes) {\n if (Object.hasOwn(this._routes, key)) {\n newRoutes[key] = this._routes[key].clone(config) as CallableRoute<T[typeof key]>\n }\n }\n const instance = new Routes({\n routes: newRoutes,\n isHydrated: true,\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._keysOrdering.map((key) => newRoutes[key]),\n })\n return Routes.prettify(instance)\n }\n\n static _ = {\n prettify: Routes.prettify.bind(Routes),\n hydrate: Routes.hydrate.bind(Routes),\n makeOrdering: Routes.makeOrdering.bind(Routes),\n }\n}\n\n// main\n\n/** Any route instance shape, preserving literal path type when known. */\nexport type AnyRoute<\n T extends Route0<string> | string = string,\n TSearch extends UnknownSearchInput = UnknownSearchInput,\n> = T extends string ? Route0<T, TSearch> : T\n/** Callable route (`route(input)`) plus route instance methods/properties. */\nexport type CallableRoute<\n T extends Route0<string> | string = string,\n TSearch extends UnknownSearchInput = UnknownSearchInput,\n> = AnyRoute<T, TSearch> & AnyRoute<T, TSearch>['get']\n/** Route input accepted by most APIs: definition string or route object/callable. */\nexport type AnyRouteOrDefinition<T extends string = string> = AnyRoute<T> | CallableRoute<T> | T\n/** Route-level runtime configuration. */\nexport type RouteConfigInput = {\n origin?: string\n}\n\n// collection\n\n/** User-provided routes map (plain definitions or route instances). */\nexport type RoutesRecord = Record<string, AnyRoute | string>\n/** Same as `RoutesRecord` but all values normalized to callable routes. */\nexport type RoutesRecordHydrated<TRoutesRecord extends RoutesRecord = any> = {\n [K in keyof TRoutesRecord]: CallableRoute<TRoutesRecord[K]>\n}\n/** Public shape returned by `Routes.create()`. Default `any` so `satisfies RoutesPretty` accepts any created routes. */\nexport type RoutesPretty<TRoutesRecord extends RoutesRecord = any> = RoutesRecordHydrated<TRoutesRecord> &\n Omit<Routes<TRoutesRecord>, '_routes' | '_getLocation' | '_clone' | '_pathsOrdering' | '_keysOrdering' | '_ordered'>\nexport type ExtractRoutesKeys<TRoutes extends RoutesPretty | RoutesRecord> = TRoutes extends RoutesPretty\n ? Extract<keyof TRoutes['_']['routes'], string>\n : TRoutes extends RoutesRecord\n ? Extract<keyof TRoutes, string>\n : never\nexport type ExtractRoute<\n TRoutes extends RoutesPretty | RoutesRecord,\n TKey extends ExtractRoutesKeys<TRoutes>,\n> = TRoutes extends RoutesPretty ? TRoutes['_']['routes'][TKey] : TRoutes extends RoutesRecord ? TRoutes[TKey] : never\n\n// public utils\n\nexport type Definition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['definition']\n : T extends string\n ? T\n : never\nexport type ParamsDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['params']\n : T extends string\n ? _ParamsDefinition<T>\n : undefined\nexport type Extended<\n T extends AnyRoute | string | undefined,\n TSuffixDefinition extends string,\n TSearchInput extends UnknownSearchInput = UnknownSearchInput,\n> = T extends AnyRoute\n ? Route0<PathExtended<T['definition'], TSuffixDefinition>, TSearchInput>\n : T extends string\n ? Route0<PathExtended<T, TSuffixDefinition>, TSearchInput>\n : T extends undefined\n ? Route0<TSuffixDefinition, TSearchInput>\n : never\n\nexport type IsAncestor<T extends AnyRoute | string, TAncestor extends AnyRoute | string> = _IsAncestor<\n Definition<T>,\n Definition<TAncestor>\n>\nexport type IsDescendant<T extends AnyRoute | string, TDescendant extends AnyRoute | string> = _IsDescendant<\n Definition<T>,\n Definition<TDescendant>\n>\nexport type IsSame<T extends AnyRoute | string, TExact extends AnyRoute | string> = _IsSame<\n Definition<T>,\n Definition<TExact>\n>\nexport type IsSameParams<T1 extends AnyRoute | string, T2 extends AnyRoute | string> = _IsSameParams<\n ParamsDefinition<T1>,\n ParamsDefinition<T2>\n>\n\nexport type HasParams<T extends AnyRoute | string> = keyof _ParamsDefinition<Definition<T>> extends never ? false : true\nexport type HasWildcard<T extends AnyRoute | string> = Definition<T> extends `${string}*${string}` ? true : false\nexport type HasRequiredParams<T extends AnyRoute | string> =\n _RequiredParamKeys<Definition<T>> extends never ? false : true\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: ParamsDefinition<T>[K] extends true ? string : string | undefined\n}\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<Definition<T>>\nexport type IsParamsOptional<T extends AnyRoute | string> = HasRequiredParams<Definition<T>> extends true ? false : true\nexport type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<Definition<T>>\n\n// location\n\nexport type LocationParams<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: _ParamsDefinition<TDefinition>[K] extends true\n ? string\n : string | undefined\n}\n\n/**\n * URL location primitives independent from route-matching state.\n *\n * `hrefRel` is relative href and includes `pathname + search + hash`.\n */\nexport type _GeneralLocation = {\n /**\n * Path without search/hash (normalized for trailing slash).\n *\n * Example:\n * - input: `https://example.com/users/42?tab=posts#section`\n * - pathname: `/users/42`\n */\n pathname: string\n /**\n * Parsed query object.\n *\n * Example:\n * - `{ tab: \"posts\", sort: \"desc\" }`\n */\n search: UnknownSearchParsed\n /**\n * Raw query string with leading `?`, if present.\n *\n * Example:\n * - `?tab=posts&sort=desc`\n */\n searchString: string\n /**\n * Raw hash with leading `#`, if present.\n *\n * Example:\n * - `#section`\n */\n hash: string\n /**\n * URL origin for absolute inputs.\n *\n * Example:\n * - href: `https://example.com/users/42`\n * - origin: `https://example.com`\n */\n origin?: string\n /**\n * Full absolute href for absolute inputs.\n *\n * Example:\n * - `https://example.com/users/42?tab=posts#section`\n */\n href?: string\n /**\n * Relative href (`pathname + search + hash`).\n *\n * Example:\n * - pathname: `/users/42`\n * - search: `?tab=posts`\n * - hash: `#section`\n * - hrefRel: `/users/42?tab=posts#section`\n */\n hrefRel: string\n /**\n * Whether input was absolute URL.\n *\n * Examples:\n * - `https://example.com/users/42` -> `true`\n * - `/users/42` -> `false`\n */\n abs: boolean\n port?: string\n host?: string\n hostname?: string\n}\n/** Location state before matching against a concrete route. */\nexport type UnknownLocationState = {\n known: false\n route: undefined\n params: undefined\n exact: false\n ancestor: false\n descendant: false\n unmatched: false\n}\nexport type UnknownLocation = _GeneralLocation & UnknownLocationState\n\n/** Known route context, but no exact/ancestor/descendant relation matched. */\nexport type UnmatchedLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Record<never, never>\n exact: false\n ancestor: false\n descendant: false\n unmatched: true\n}\nexport type UnmatchedLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n UnmatchedLocationState<TRoute>\n\n/** Exact match state for a known route. */\nexport type ExactLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: true\n ancestor: false\n descendant: false\n unmatched: false\n}\nexport type ExactLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n ExactLocationState<TRoute>\n\n/** Input URL is a descendant of route definition (route is ancestor). */\nexport type AncestorLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: false\n ancestor: true\n descendant: false\n unmatched: false\n}\nexport type AncestorLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n AncestorLocationState<TRoute>\n\n/** It is when route not match at all, but params match. */\nexport type WeakAncestorLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: false\n ancestor: true\n descendant: false\n unmatched: false\n}\nexport type WeakAncestorLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n WeakAncestorLocationState<TRoute>\n\n/** Input URL is an ancestor prefix of route definition (route is descendant). */\nexport type DescendantLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Partial<ParamsOutput<TRoute>>\n exact: false\n ancestor: false\n descendant: true\n unmatched: false\n}\nexport type DescendantLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n DescendantLocationState<TRoute>\n\nexport type UnknownSearchParsedValue = string | UnknownSearchParsed | Array<UnknownSearchParsedValue>\nexport interface UnknownSearchParsed {\n [key: string]: UnknownSearchParsedValue\n}\n\nexport type UnknownSearchInputValue =\n | string\n | number\n | boolean\n | undefined\n | UnknownSearchInput\n | Array<UnknownSearchInputValue>\nexport interface UnknownSearchInput {\n [key: string]: UnknownSearchInputValue\n}\n\n/** It is when route not match at all, but params partially match. */\nexport type WeakDescendantLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Partial<ParamsOutput<TRoute>>\n exact: false\n ancestor: false\n descendant: true\n unmatched: false\n}\nexport type WeakDescendantLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n WeakDescendantLocationState<TRoute>\nexport type KnownLocation<TRoute extends AnyRoute | string = AnyRoute | string> =\n | UnmatchedLocation<TRoute>\n | ExactLocation<TRoute>\n | AncestorLocation<TRoute>\n | WeakAncestorLocation<TRoute>\n | DescendantLocation<TRoute>\n | WeakDescendantLocation<TRoute>\nexport type AnyLocation<TRoute extends AnyRoute | string = AnyRoute | string> = UnknownLocation | KnownLocation<TRoute>\n\n// internal utils\n\nexport type _ParamsDefinition<TDefinition extends string> = _ExtractParamsDefinitionBySegments<\n _SplitPathSegments<Definition<TDefinition>>\n>\n\nexport type _Simplify<T> = { [K in keyof T]: T[K] } & {}\nexport type _IfNoKeys<T extends object, TYes, TNo> = keyof T extends never ? TYes : TNo\n\nexport type _ParamsInput<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends infer TDef extends Record<string, boolean>\n ? _IfNoKeys<\n TDef,\n Record<never, never>,\n _Simplify<\n {\n [K in keyof TDef as TDef[K] extends true ? K : never]: string | number\n } & {\n [K in keyof TDef as TDef[K] extends false ? K : never]?: string | number | undefined\n }\n >\n >\n : Record<never, never>\n\nexport type _ParamsInputStringOnly<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends infer TDef extends Record<string, boolean>\n ? _IfNoKeys<\n TDef,\n Record<never, never>,\n _Simplify<\n {\n [K in keyof TDef as TDef[K] extends true ? K : never]: string\n } & {\n [K in keyof TDef as TDef[K] extends false ? K : never]?: string | undefined\n }\n >\n >\n : Record<never, never>\n\nexport type _SplitPathSegments<TPath extends string> = TPath extends ''\n ? []\n : TPath extends '/'\n ? []\n : TPath extends `/${infer Rest}`\n ? _SplitPathSegments<Rest>\n : TPath extends `${infer Segment}/${infer Rest}`\n ? Segment extends ''\n ? _SplitPathSegments<Rest>\n : [Segment, ..._SplitPathSegments<Rest>]\n : TPath extends ''\n ? []\n : [TPath]\n\nexport type _ParamDefinitionFromSegment<TSegment extends string> = TSegment extends `:${infer Name}?`\n ? { [K in Name]: false }\n : TSegment extends `:${infer Name}`\n ? { [K in Name]: true }\n : TSegment extends `${string}*?`\n ? { '*': false }\n : TSegment extends `${string}*`\n ? { '*': true }\n : Record<never, never>\n\nexport type _MergeParamDefinitions<A extends Record<string, boolean>, B extends Record<string, boolean>> = {\n [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never\n}\n\nexport type _ExtractParamsDefinitionBySegments<TSegments extends string[]> = TSegments extends [\n infer Segment extends string,\n ...infer Rest extends string[],\n]\n ? _MergeParamDefinitions<_ParamDefinitionFromSegment<Segment>, _ExtractParamsDefinitionBySegments<Rest>>\n : Record<never, never>\n\nexport type _RequiredParamKeys<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: _ParamsDefinition<TDefinition>[K] extends true ? K : never\n}[keyof _ParamsDefinition<TDefinition>]\nexport type ReplacePathParams<S extends string> = S extends `${infer Head}:${infer Tail}`\n ? // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Tail extends `${infer _Param}/${infer Rest}`\n ? ReplacePathParams<`${Head}${string}/${Rest}`>\n : `${Head}${string}`\n : S\nexport type DedupeSlashes<S extends string> = S extends `${infer A}//${infer B}` ? DedupeSlashes<`${A}/${B}`> : S\nexport type EmptyRecord = Record<never, never>\nexport type JoinPath<Parent extends string, Suffix extends string> = DedupeSlashes<\n Definition<Parent> extends infer A extends string\n ? Definition<Suffix> extends infer B extends string\n ? A extends ''\n ? B extends ''\n ? ''\n : B extends `/${string}`\n ? B\n : `/${B}`\n : B extends ''\n ? A\n : A extends `${string}/`\n ? `${A}${B}`\n : B extends `/${string}`\n ? `${A}${B}`\n : `${A}/${B}`\n : never\n : never\n>\n\nexport type OnlyIfNoParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends false ? Yes : No\nexport type OnlyIfHasParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends true ? Yes : No\n\nexport type PathExtended<\n TSourceDefinitionDefinition extends string,\n TSuffixDefinitionDefinition extends string,\n> = `${JoinPath<StripTrailingWildcard<TSourceDefinitionDefinition>, TSuffixDefinitionDefinition>}`\n\nexport type StripTrailingWildcard<TDefinition extends string> = TDefinition extends `${infer TPath}*?`\n ? TPath\n : TDefinition extends `${infer TPath}*`\n ? TPath\n : TDefinition\n\nexport type IsAny<T> = 0 extends 1 & T ? true : false\n\nexport type _IsSameParams<T1 extends object | undefined, T2 extends object | undefined> = T1 extends undefined\n ? T2 extends undefined\n ? true\n : false\n : T2 extends undefined\n ? false\n : T1 extends T2\n ? T2 extends T1\n ? true\n : false\n : false\n\nexport type _IsAncestor<T extends string, TAncestor extends string> = T extends TAncestor\n ? false\n : T extends `${TAncestor}${string}`\n ? true\n : false\nexport type _IsDescendant<T extends string, TDescendant extends string> = TDescendant extends T\n ? false\n : TDescendant extends `${T}${string}`\n ? true\n : false\nexport type _IsSame<T extends string, TExact extends string> = T extends TExact\n ? TExact extends T\n ? true\n : false\n : false\n\nexport type _SafeParseInputResult<TInputParsed extends Record<string, unknown>> =\n | {\n success: true\n data: TInputParsed\n error: undefined\n }\n | {\n success: false\n data: undefined\n error: Error\n }\n\nexport type SchemaRoute0<\n TInput extends Record<string, unknown>,\n TOutput extends Record<string, unknown>,\n> = StandardSchemaV1<TInput, TOutput> & {\n parse: (input: unknown) => TOutput\n safeParse: (input: unknown) => _SafeParseInputResult<TOutput>\n}\n"],"mappings":"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","names":["searchInput","hashInput","paramsInput","absOriginInput","stringifySearchQuery","parseSearchQuery"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\nimport { parse as parseSearchQuery, stringify as stringifySearchQuery } from '@devp0nt/flat0'\n\nexport type PathToken =\n | { kind: 'static'; value: string }\n | { kind: 'param'; name: string; optional: boolean }\n | { kind: 'wildcard'; prefix: string; optional: boolean }\n\nconst escapeRegex = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nconst getPathSegments = (definition: string): string[] => {\n if (definition === '' || definition === '/') return []\n return definition.split('/').filter(Boolean)\n}\n\nconst getPathTokens = (definition: string): PathToken[] => {\n const segments = getPathSegments(definition)\n return segments.map((segment): PathToken => {\n const param = segment.match(/^:([A-Za-z0-9_]+)(\\?)?$/)\n if (param) {\n return { kind: 'param', name: param[1], optional: param[2] === '?' }\n }\n if (segment === '*' || segment === '*?') {\n return { kind: 'wildcard', prefix: '', optional: segment.endsWith('?') }\n }\n const wildcard = segment.match(/^(.*)\\*(\\?)?$/)\n if (wildcard && !segment.includes('\\\\*')) {\n return { kind: 'wildcard', prefix: wildcard[1], optional: wildcard[2] === '?' }\n }\n return { kind: 'static', value: segment }\n })\n}\n\nconst getPathRegexBaseStrictString = (definition: string): string => {\n const tokens = getPathTokens(definition)\n if (tokens.length === 0) return ''\n let pattern = ''\n for (const token of tokens) {\n if (token.kind === 'static') {\n pattern += `/${escapeRegex(token.value)}`\n continue\n }\n if (token.kind === 'param') {\n pattern += token.optional ? '(?:/([^/]+))?' : '/([^/]+)'\n continue\n }\n if (token.prefix.length > 0) {\n pattern += `/${escapeRegex(token.prefix)}(.*)`\n } else {\n // Wouter-compatible splat: /orders/* matches /orders and /orders/...\n pattern += '(?:/(.*))?'\n }\n }\n return pattern\n}\n\nconst getPathCaptureKeys = (definition: string): string[] => {\n const keys: string[] = []\n for (const token of getPathTokens(definition)) {\n if (token.kind === 'param') keys.push(token.name)\n if (token.kind === 'wildcard') keys.push('*')\n }\n return keys\n}\n\nconst getPathParamsDefinition = (definition: string): Record<string, boolean> => {\n const entries = getPathTokens(definition)\n .filter((t) => t.kind !== 'static')\n .map((t): [string, boolean] => (t.kind === 'param' ? [t.name, !t.optional] : ['*', !t.optional]))\n return Object.fromEntries(entries)\n}\n\nconst validatePathDefinition = (definition: string): void => {\n const segments = getPathSegments(definition)\n const wildcardSegments = segments.filter((segment) => segment.includes('*'))\n if (wildcardSegments.length === 0) return\n if (wildcardSegments.length > 1) {\n throw new Error(`Invalid route definition \"${definition}\": only one wildcard segment is allowed`)\n }\n const wildcardSegmentIndex = segments.findIndex((segment) => segment.includes('*'))\n const wildcardSegment = segments[wildcardSegmentIndex]\n if (!wildcardSegment.match(/^(?:\\*|\\*\\?|[^*]+\\*|\\S+\\*\\?)$/)) {\n throw new Error(`Invalid route definition \"${definition}\": wildcard must be trailing in its segment`)\n }\n if (wildcardSegmentIndex !== segments.length - 1) {\n throw new Error(`Invalid route definition \"${definition}\": wildcard segment is allowed only at the end`)\n }\n}\n\nconst stripTrailingWildcard = (definition: string): string => definition.replace(/\\*\\??$/, '')\n\n/**\n * Strongly typed route descriptor and URL builder.\n *\n * A route definition uses:\n * - path params: `/users/:id`\n * - named search keys: `/users&tab&sort`\n * - loose search mode: trailing `&`, e.g. `/users&`\n *\n * Instances are callable (same as `.get()`), so `route(input)` and\n * `route.get(input)` are equivalent.\n */\nexport class Route0<TDefinition extends string, TSearchInput extends UnknownSearchInput = UnknownSearchInput> {\n readonly definition: TDefinition\n readonly params: _ParamsDefinition<TDefinition>\n private _origin: string | undefined\n private _callable: CallableRoute<TDefinition, TSearchInput>\n\n Infer: {\n ParamsDefinition: _ParamsDefinition<TDefinition>\n ParamsInput: _ParamsInput<TDefinition>\n ParamsInputStringOnly: _ParamsInputStringOnly<TDefinition>\n ParamsOutput: ParamsOutput<TDefinition>\n SearchInput: TSearchInput\n } = null as never\n\n /** Base URL used when generating absolute URLs (`abs: true`). */\n get origin(): string {\n if (!this._origin) {\n throw new Error(\n 'origin for route ' +\n this.definition +\n ' is not set, please provide it like Route0.create(route, {origin: \"https://example.com\"}) in config or set via clones like routes._.clone({origin: \"https://example.com\"})',\n )\n }\n return this._origin\n }\n set origin(origin: string) {\n this._origin = origin\n }\n\n private constructor(definition: TDefinition, config: RouteConfigInput = {}) {\n validatePathDefinition(definition)\n this.definition = definition\n this.params = Route0._getParamsDefinitionByDefinition(definition)\n\n const { origin } = config\n if (origin && typeof origin === 'string' && origin.length) {\n this._origin = origin\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } } | undefined\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this._origin = g.location.origin\n } else {\n this._origin = undefined\n }\n }\n const callable = this.get.bind(this)\n Object.setPrototypeOf(callable, this)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: this.definition,\n })\n this._callable = callable as CallableRoute<TDefinition, TSearchInput>\n }\n\n /**\n * Creates a callable route instance.\n *\n * If an existing route/callable route is provided, it is cloned.\n */\n static create<TDefinition extends string>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n config?: RouteConfigInput,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function' || typeof definition === 'object') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n const original = new Route0<TDefinition>(definition, config)\n return original._callable\n }\n\n /**\n * Normalizes a definition/route into a callable route.\n *\n * Unlike `create`, passing a callable route returns the same instance.\n */\n static from<TDefinition extends string, TSearchInput extends UnknownSearchInput>(\n definition: TDefinition | AnyRoute<TDefinition, TSearchInput> | CallableRoute<TDefinition, TSearchInput>,\n ): CallableRoute<TDefinition, TSearchInput> {\n if (typeof definition === 'function') {\n return definition\n }\n const original = typeof definition === 'object' ? definition : new Route0<TDefinition>(definition)\n return original._callable as CallableRoute<TDefinition, TSearchInput>\n }\n\n private static _getAbsPath(origin: string, url: string) {\n return new URL(url, origin).toString().replace(/\\/$/, '')\n }\n\n private static _getParamsDefinitionByDefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _ParamsDefinition<TDefinition> {\n return getPathParamsDefinition(definition) as _ParamsDefinition<TDefinition>\n }\n\n search<TNewSearchInput extends UnknownSearchInput>(): CallableRoute<TDefinition, TNewSearchInput> {\n return this._callable as CallableRoute<TDefinition, TNewSearchInput>\n }\n\n /** Extends the current route definition by appending a suffix route. */\n extend<TSuffixDefinition extends string>(\n suffixDefinition: TSuffixDefinition,\n ): CallableRoute<PathExtended<TDefinition, TSuffixDefinition>, TSearchInput> {\n const sourceDefinitionWithoutWildcard = stripTrailingWildcard(this.definition)\n const definition = `${sourceDefinitionWithoutWildcard}/${suffixDefinition}`.replace(/\\/{2,}/g, '/')\n return Route0.create<PathExtended<TDefinition, TSuffixDefinition>>(\n definition as PathExtended<TDefinition, TSuffixDefinition>,\n { origin: this._origin },\n )\n }\n\n get(...args: IsParamsOptional<TDefinition> extends true ? [abs: boolean | string | undefined] : never): string\n get(\n ...args: IsParamsOptional<TDefinition> extends true\n ? [input?: GetPathInput<TDefinition, TSearchInput> | undefined, abs?: boolean | string | undefined]\n : [input: GetPathInput<TDefinition, TSearchInput>, abs?: boolean | string | undefined]\n ): string\n\n // implementation\n get(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, absOriginInput, hashInput } = ((): {\n searchInput: Record<string, unknown>\n paramsInput: Record<string, string | undefined>\n absInput: boolean\n absOriginInput: string | undefined\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n absOriginInput: undefined,\n hashInput: undefined,\n }\n }\n const [input, abs] = ((): [Record<string, unknown>, boolean | string | undefined] => {\n if (typeof args[0] === 'object' && args[0] !== null) {\n return [args[0], args[1]] as [Record<string, unknown>, boolean | string | undefined]\n }\n if (typeof args[1] === 'object' && args[1] !== null) {\n return [args[1], args[0]] as [Record<string, unknown>, boolean | string | undefined]\n }\n if (typeof args[0] === 'boolean' || typeof args[0] === 'string') {\n return [{}, args[0]]\n }\n if (typeof args[1] === 'boolean' || typeof args[1] === 'string') {\n return [{}, args[1]]\n }\n return [{}, undefined]\n })()\n let searchInput: Record<string, unknown> = {}\n let hashInput: string | undefined = undefined\n const paramsInput: Record<string, string | undefined> = {}\n for (const [key, value] of Object.entries(input)) {\n if (key === '?' && typeof value === 'object' && value !== null) {\n searchInput = value as Record<string, unknown>\n } else if (key === '#' && (typeof value === 'string' || typeof value === 'number')) {\n hashInput = String(value)\n } else if (key in this.params && (typeof value === 'string' || typeof value === 'number')) {\n Object.assign(paramsInput, { [key]: String(value) })\n }\n }\n const absOriginInput = typeof abs === 'string' && abs.length > 0 ? abs : undefined\n return {\n searchInput,\n paramsInput,\n absInput: absOriginInput !== undefined || abs === true,\n absOriginInput,\n hashInput,\n }\n })()\n\n // create url\n\n let url = this.definition as string\n // optional named params like /:id?\n url = url.replace(/\\/:([A-Za-z0-9_]+)\\?/g, (_m, k) => {\n const value = paramsInput[k]\n if (value === undefined) return ''\n return `/${encodeURIComponent(String(value))}`\n })\n // required named params\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n url = url.replace(/:([A-Za-z0-9_]+)(?!\\?)/g, (_m, k) => encodeURIComponent(String(paramsInput?.[k] ?? 'undefined')))\n // optional wildcard segment (/*?)\n url = url.replace(/\\/\\*\\?/g, () => {\n const value = paramsInput['*']\n if (value === undefined) return ''\n const stringValue = String(value)\n return stringValue.startsWith('/') ? stringValue : `/${stringValue}`\n })\n // required wildcard segment (/*)\n url = url.replace(/\\/\\*/g, () => {\n const value = String(paramsInput['*'] ?? '')\n return value.startsWith('/') ? value : `/${value}`\n })\n // optional wildcard inline (e.g. /app*?)\n url = url.replace(/\\*\\?/g, () => String(paramsInput['*'] ?? ''))\n // required wildcard inline (e.g. /app*)\n url = url.replace(/\\*/g, () => String(paramsInput['*'] ?? ''))\n // search params\n const searchString = stringifySearchQuery(searchInput)\n url = [url, searchString].filter(Boolean).join('?')\n // dedupe slashes\n url = url.replace(/\\/{2,}/g, '/')\n // absolute\n url = absInput ? Route0._getAbsPath(absOriginInput || this.origin, url) : url\n // hash\n if (hashInput !== undefined) {\n url = `${url}#${hashInput}`\n }\n\n return url\n }\n\n /** Returns path param keys extracted from route definition. */\n getParamsKeys(): string[] {\n return Object.keys(this.params)\n }\n\n getPathTokens(): PathToken[] {\n return getPathTokens(this.definition)\n }\n\n /** Clones route with optional config override. */\n clone(config?: RouteConfigInput): CallableRoute<TDefinition> {\n return Route0.create(this.definition, config)\n }\n\n getRegexBaseStrictString(): string {\n return getPathRegexBaseStrictString(this.definition)\n }\n\n getRegexBaseString(): string {\n return this.getRegexBaseStrictString().replace(/\\/+$/, '') + '/?' // remove trailing slashes and add optional slash\n }\n\n getRegexStrictString(): string {\n return `^${this.getRegexBaseStrictString()}$`\n }\n\n getRegexString(): string {\n return `^${this.getRegexBaseString()}$`\n }\n\n getRegexStrict(): RegExp {\n return new RegExp(this.getRegexStrictString())\n }\n\n getRegex(): RegExp {\n return new RegExp(this.getRegexString())\n }\n\n /** Creates a grouped strict regex pattern string from many routes. */\n static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a strict grouped regex from many routes. */\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Creates a grouped regex pattern string from many routes. */\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a grouped regex from many routes. */\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Converts any location shape to relative form (removes host/origin fields). */\n static toRelLocation<TLocation extends AnyLocation>(location: TLocation): TLocation {\n return {\n ...location,\n abs: false,\n origin: undefined,\n href: undefined,\n port: undefined,\n host: undefined,\n hostname: undefined,\n }\n }\n\n /** Converts a location to absolute form using provided origin URL. */\n static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, origin: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, origin)\n return {\n ...location,\n abs: true,\n origin: url.origin,\n href: url.href,\n port: url.port,\n host: url.host,\n hostname: url.hostname,\n }\n }\n\n /**\n * Parses a URL-like input into raw location object (without route knowledge).\n *\n * Result is always `UnknownLocation` because no route matching is applied.\n */\n static getLocation(href: `${string}://${string}`): UnknownLocation\n static getLocation(hrefRel: `/${string}`): UnknownLocation\n static getLocation(hrefOrHrefRel: string): UnknownLocation\n static getLocation(location: AnyLocation): UnknownLocation\n static getLocation(url: URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return Route0.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n // Check if it's an absolute URL (starts with scheme://)\n const abs = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(hrefOrHrefRelOrLocation)\n\n // Use dummy base only if relative\n const base = abs ? undefined : 'http://example.com'\n const url = new URL(hrefOrHrefRelOrLocation, base)\n\n // Parse search query to object form\n const search = parseSearchQuery(url.search)\n\n // Normalize pathname (remove trailing slash except for root)\n let pathname = url.pathname\n if (pathname.length > 1 && pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1)\n }\n\n // Common derived values\n const hrefRel = pathname + url.search + url.hash\n\n // Build the location object consistent with _GeneralLocation\n const location: UnknownLocation = {\n pathname,\n search,\n searchString: url.search,\n hash: url.hash,\n origin: abs ? url.origin : undefined,\n href: abs ? url.href : undefined,\n hrefRel,\n abs,\n\n // extra host-related fields (available even for relative with dummy base)\n host: abs ? url.host : undefined,\n hostname: abs ? url.hostname : undefined,\n port: abs ? url.port || undefined : undefined,\n\n // specific to UnknownLocation\n params: undefined,\n route: undefined,\n known: false,\n exact: false,\n ancestor: false,\n descendant: false,\n unmatched: false,\n }\n\n return location\n }\n\n /**\n * Parses input and matches it against this route definition.\n *\n * Result includes relation flags:\n * - `exact`\n * - `ancestor`\n * - `descendant`\n * - `unmatched`\n */\n getLocation(href: `${string}://${string}`): KnownLocation<TDefinition>\n getLocation(hrefRel: `/${string}`): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRel: string): KnownLocation<TDefinition>\n getLocation(location: AnyLocation): KnownLocation<TDefinition>\n getLocation(url: AnyLocation): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition> {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return this.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n const location = Route0.getLocation(hrefOrHrefRelOrLocation) as never as KnownLocation<TDefinition>\n location.route = this.definition as Definition<TDefinition>\n location.params = {}\n\n // Normalize pathname (no trailing slash except root)\n const pathname =\n location.pathname.length > 1 && location.pathname.endsWith('/')\n ? location.pathname.slice(0, -1)\n : location.pathname\n\n const paramNames = getPathCaptureKeys(this.definition)\n const def =\n this.definition.length > 1 && this.definition.endsWith('/') ? this.definition.slice(0, -1) : this.definition\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const ancestorRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n const ancestorMatch = pathname.match(ancestorRe)\n const exact = !!exactMatch\n const ancestor = !exact && !!ancestorMatch\n\n // Parse params for exact and ancestor matches.\n const paramsMatch = exactMatch || (ancestor ? ancestorMatch : null)\n if (paramsMatch) {\n const values = paramsMatch.slice(1, 1 + paramNames.length)\n const params = Object.fromEntries(\n paramNames.map((n, i) => {\n const value = values[i] as string | undefined\n return [n, value === undefined ? undefined : decodeURIComponent(value)]\n }),\n )\n location.params = params\n } else {\n location.params = {}\n }\n\n // \"descendant\": the URL is a prefix of the route definition (params match any single segment)\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n const defParts = getParts(def)\n const pathParts = getParts(pathname)\n\n let isPrefix = true\n if (pathParts.length > defParts.length) {\n isPrefix = false\n } else {\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart) {\n isPrefix = false\n break\n }\n if (defPart.startsWith(':')) continue\n if (defPart.includes('*')) {\n const prefix = defPart.replace(/\\*\\??$/, '')\n if (pathPart.startsWith(prefix)) continue\n isPrefix = false\n break\n }\n if (defPart !== pathPart) {\n isPrefix = false\n break\n }\n }\n }\n const descendant = !exact && isPrefix\n const unmatched = !exact && !ancestor && !descendant\n\n // For descendant matches, include only params that are already determined\n // by the current (shorter) pathname prefix.\n if (descendant) {\n const descendantParams: Record<string, string> = {}\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart || !pathPart) continue\n if (defPart.startsWith(':')) {\n descendantParams[defPart.replace(/^:/, '').replace(/\\?$/, '')] = decodeURIComponent(pathPart)\n } else if (defPart.includes('*')) {\n descendantParams['*'] = decodeURIComponent(pathPart)\n }\n }\n location.params = descendantParams\n }\n\n return {\n ...location,\n known: true,\n exact,\n ancestor,\n descendant,\n unmatched,\n } as KnownLocation<TDefinition>\n }\n\n private _validateParamsInput(input: unknown): StandardSchemaV1.Result<ParamsOutput<TDefinition>> {\n const paramsEntries = Object.entries(this.params) as Array<[string, boolean]>\n const paramsMap = this.params as Record<string, boolean>\n const requiredParamsKeys = paramsEntries.filter(([, required]) => required).map(([k]) => k)\n const paramsKeys = paramsEntries.map(([k]) => k)\n if (input === undefined) {\n if (requiredParamsKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${requiredParamsKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid route params: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const inputKeys = Object.keys(inputObj)\n const notDefinedKeys = requiredParamsKeys.filter((k) => !inputKeys.includes(k))\n if (notDefinedKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${notDefinedKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n const data: Record<string, string | undefined> = {}\n for (const k of paramsKeys) {\n const v = inputObj[k]\n const required = paramsMap[k]\n if (v === undefined && !required) {\n data[k] = undefined as never\n } else if (typeof v === 'string') {\n data[k] = v\n } else if (typeof v === 'number') {\n data[k] = String(v)\n } else {\n return {\n issues: [{ message: `Invalid route params: expected string, number, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as ParamsOutput<TDefinition>,\n }\n }\n\n private _safeParseSchemaResult<TOutput extends Record<string, unknown>>(\n result: StandardSchemaV1.Result<TOutput>,\n ): _SafeParseInputResult<TOutput> {\n if ('issues' in result) {\n return {\n success: false,\n data: undefined,\n error: new Error(result.issues?.[0]?.message ?? 'Invalid input'),\n }\n }\n return {\n success: true,\n data: result.value,\n error: undefined,\n }\n }\n\n private _parseSchemaResult<TOutput extends Record<string, unknown>>(\n result: StandardSchemaV1.Result<TOutput>,\n ): TOutput {\n const safeResult = this._safeParseSchemaResult(result)\n if (safeResult.error) {\n throw safeResult.error\n }\n return safeResult.data\n }\n\n /** Standard Schema for route params input. */\n readonly schema: SchemaRoute0<ParamsInput<TDefinition>, ParamsOutput<TDefinition>> = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateParamsInput(value),\n types: undefined as unknown as StandardSchemaV1.Types<ParamsInput<TDefinition>, ParamsOutput<TDefinition>>,\n },\n parse: (value) => this._parseSchemaResult(this._validateParamsInput(value)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateParamsInput(value)),\n }\n\n /** True when path structure is equal (param names are ignored). */\n isSame(other: AnyRoute): boolean {\n return (\n getPathTokens(this.definition)\n .map((t) => {\n if (t.kind === 'static') return `s:${t.value}`\n if (t.kind === 'param') return `p:${t.optional ? 'o' : 'r'}`\n return `w:${t.prefix}:${t.optional ? 'o' : 'r'}`\n })\n .join('/') ===\n getPathTokens(other.definition)\n .map((t) => {\n if (t.kind === 'static') return `s:${t.value}`\n if (t.kind === 'param') return `p:${t.optional ? 'o' : 'r'}`\n return `w:${t.prefix}:${t.optional ? 'o' : 'r'}`\n })\n .join('/')\n )\n }\n /** Static convenience wrapper for `isSame`. */\n static isSame(a: AnyRoute | string | undefined, b: AnyRoute | string | undefined): boolean {\n if (!a) {\n if (!b) return true\n return false\n }\n if (!b) {\n return false\n }\n return Route0.create(a).isSame(Route0.create(b))\n }\n\n /** True when current route is more specific/deeper than `other`. */\n isDescendant(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a descendant of other if:\n // - paths are not exactly the same\n // - other's path is a prefix of this path, matching params as wildcards\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n // Root is ancestor of any non-root; thus any non-root is a descendant of root\n if (other.definition === '/' && this.definition !== '/') {\n return true\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n\n // A descendant must be deeper\n if (thisParts.length <= otherParts.length) return false\n\n for (let i = 0; i < otherParts.length; i++) {\n const otherPart = otherParts[i]\n const thisPart = thisParts[i]\n if (otherPart.startsWith(':')) continue\n if (otherPart !== thisPart) return false\n }\n // Not equal (depth already ensures not equal)\n return true\n }\n\n /** True when current route is broader/shallower than `other`. */\n isAncestor(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is an ancestor of other if:\n // - paths are not exactly the same\n // - this path is a prefix of other path, matching params as wildcards\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n // Root is ancestor of any non-root path\n if (this.definition === '/' && other.definition !== '/') {\n return true\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n\n // An ancestor must be shallower\n if (thisParts.length >= otherParts.length) return false\n\n for (let i = 0; i < thisParts.length; i++) {\n const thisPart = thisParts[i]\n const otherPart = otherParts[i]\n if (thisPart.startsWith(':')) continue\n if (thisPart !== otherPart) return false\n }\n // Not equal (depth already ensures not equal)\n return true\n }\n\n /** True when two route patterns can match the same concrete URL. */\n isConflict(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n const thisRegex = this.getRegex()\n const otherRegex = other.getRegex()\n const makeCandidates = (definition: string): string[] => {\n const tokens = getPathTokens(definition)\n const values = (token: PathToken): string[] => {\n if (token.kind === 'static') return [token.value]\n if (token.kind === 'param') return token.optional ? ['', 'x'] : ['x']\n if (token.prefix.length > 0) return [token.prefix, `${token.prefix}-x`, `${token.prefix}/x/y`]\n return ['', 'x', 'x/y']\n }\n let acc: string[] = ['']\n for (const token of tokens) {\n const next: string[] = []\n for (const base of acc) {\n for (const value of values(token)) {\n if (value === '') {\n next.push(base)\n } else if (value.startsWith('/')) {\n next.push(`${base}${value}`)\n } else {\n next.push(`${base}/${value}`)\n }\n }\n }\n acc = next\n }\n if (acc.length === 0) return ['/']\n return Array.from(new Set(acc.map((x) => (x === '' ? '/' : x.replace(/\\/{2,}/g, '/')))))\n }\n const thisCandidates = makeCandidates(this.definition)\n const otherCandidates = makeCandidates(other.definition)\n if (thisCandidates.some((path) => otherRegex.test(path))) return true\n if (otherCandidates.some((path) => thisRegex.test(path))) return true\n return false\n }\n\n /** True when paths are same or can overlap when optional parts are omitted. */\n isMayBeSame(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n return this.isSame(other) || this.isConflict(other)\n }\n\n /** Specificity comparator used for deterministic route ordering. */\n isMoreSpecificThan(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n const rank = (part: string): number => {\n if (part.includes('*')) return -1\n if (part.startsWith(':') && part.endsWith('?')) return 0\n if (part.startsWith(':')) return 1\n return 2\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n for (let i = 0; i < Math.min(thisParts.length, otherParts.length); i++) {\n const thisRank = rank(thisParts[i])\n const otherRank = rank(otherParts[i])\n if (thisRank > otherRank) return true\n if (thisRank < otherRank) return false\n }\n return this.definition < other.definition\n }\n}\n\n/**\n * Typed route collection with deterministic matching order.\n *\n * `Routes.create()` accepts either plain string definitions or route objects\n * and returns a \"pretty\" object with direct route access + helper methods under `._`.\n */\n\nexport class Routes<const T extends RoutesRecord = any> {\n _routes: RoutesRecordHydrated<T>\n _pathsOrdering: string[]\n _keysOrdering: string[]\n _ordered: CallableRoute[]\n\n _: {\n routes: Routes<T>['_routes']\n getLocation: Routes<T>['_getLocation']\n clone: Routes<T>['_clone']\n pathsOrdering: Routes<T>['_pathsOrdering']\n keysOrdering: Routes<T>['_keysOrdering']\n ordered: Routes<T>['_ordered']\n }\n\n private constructor({\n routes,\n isHydrated = false,\n pathsOrdering,\n keysOrdering,\n ordered,\n }: {\n routes: RoutesRecordHydrated<T> | T\n isHydrated?: boolean\n pathsOrdering?: string[]\n keysOrdering?: string[]\n ordered?: CallableRoute[]\n }) {\n this._routes = (\n isHydrated ? (routes as RoutesRecordHydrated<T>) : Routes.hydrate(routes)\n ) as RoutesRecordHydrated<T>\n if (!pathsOrdering || !keysOrdering || !ordered) {\n const ordering = Routes.makeOrdering(this._routes)\n this._pathsOrdering = ordering.pathsOrdering\n this._keysOrdering = ordering.keysOrdering\n this._ordered = this._keysOrdering.map((key) => this._routes[key])\n } else {\n this._pathsOrdering = pathsOrdering\n this._keysOrdering = keysOrdering\n this._ordered = ordered\n }\n this._ = {\n routes: this._routes,\n getLocation: this._getLocation.bind(this),\n clone: this._clone.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n /** Creates and hydrates a typed routes collection. */\n static create<const T extends RoutesRecord>(routes: T, override?: RouteConfigInput): RoutesPretty<T> {\n const result = Routes.prettify(new Routes({ routes }))\n if (!override) {\n return result\n }\n return result._.clone(override)\n }\n\n private static prettify<const T extends RoutesRecord>(instance: Routes<T>): RoutesPretty<T> {\n Object.setPrototypeOf(instance, Routes.prototype)\n Object.defineProperty(instance, Symbol.toStringTag, {\n value: 'Routes',\n })\n Object.assign(instance, {\n clone: instance._clone.bind(instance),\n })\n Object.assign(instance, instance._routes)\n return instance as unknown as RoutesPretty<T>\n }\n\n private static hydrate<const T extends RoutesRecord>(routes: T): RoutesRecordHydrated<T> {\n const result = {} as RoutesRecordHydrated<T>\n for (const key in routes) {\n if (Object.hasOwn(routes, key)) {\n const value = routes[key]\n result[key] = (typeof value === 'string' ? Route0.create(value) : value) as CallableRoute<T[typeof key]>\n }\n }\n return result\n }\n\n /**\n * Matches an input URL against collection routes.\n *\n * Returns first exact match according to precomputed ordering,\n * otherwise returns `UnknownLocation`.\n */\n _getLocation(href: `${string}://${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefRel: `/${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRel: string): UnknownLocation | ExactLocation\n _getLocation(location: AnyLocation): UnknownLocation | ExactLocation\n _getLocation(url: URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation {\n // Find the route that exactly matches the given location\n const input = hrefOrHrefRelOrLocation\n for (const route of this._ordered) {\n const loc = route.getLocation(hrefOrHrefRelOrLocation)\n if (loc.exact) {\n return loc\n }\n }\n // No exact match found, return UnknownLocation\n return typeof input === 'string' ? Route0.getLocation(input) : Route0.getLocation(input)\n }\n\n private static makeOrdering(routes: RoutesRecord): {\n pathsOrdering: string[]\n keysOrdering: string[]\n } {\n const hydrated = Routes.hydrate(routes)\n const entries = Object.entries(hydrated)\n\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n // Sort: overlapping routes by specificity first, otherwise by path depth and alphabetically.\n entries.sort(([_keyA, routeA], [_keyB, routeB]) => {\n const partsA = getParts(routeA.definition)\n const partsB = getParts(routeB.definition)\n\n // 1. Overlapping routes: more specific first\n if (routeA.isMayBeSame(routeB)) {\n if (routeA.isMoreSpecificThan(routeB)) return -1\n if (routeB.isMoreSpecificThan(routeA)) return 1\n }\n\n // 2. Different non-overlapping depth: shorter first\n if (partsA.length !== partsB.length) {\n return partsA.length - partsB.length\n }\n\n // 3. Fallback: alphabetically for deterministic ordering\n return routeA.definition.localeCompare(routeB.definition)\n })\n\n const pathsOrdering = entries.map(([_key, route]) => route.definition)\n const keysOrdering = entries.map(([_key]) => _key)\n return { pathsOrdering, keysOrdering }\n }\n\n /** Returns a cloned routes collection with config applied to each route. */\n _clone(config: RouteConfigInput): RoutesPretty<T> {\n const newRoutes = {} as RoutesRecordHydrated<T>\n for (const key in this._routes) {\n if (Object.hasOwn(this._routes, key)) {\n newRoutes[key] = this._routes[key].clone(config) as CallableRoute<T[typeof key]>\n }\n }\n const instance = new Routes({\n routes: newRoutes,\n isHydrated: true,\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._keysOrdering.map((key) => newRoutes[key]),\n })\n return Routes.prettify(instance)\n }\n\n static _ = {\n prettify: Routes.prettify.bind(Routes),\n hydrate: Routes.hydrate.bind(Routes),\n makeOrdering: Routes.makeOrdering.bind(Routes),\n }\n}\n\n// main\n\n/** Any route instance shape, preserving literal path type when known. */\nexport type AnyRoute<\n T extends Route0<string> | string = string,\n TSearch extends UnknownSearchInput = UnknownSearchInput,\n> = T extends string ? Route0<T, TSearch> : T\n/** Callable route (`route(input)`) plus route instance methods/properties. */\nexport type CallableRoute<\n T extends Route0<string> | string = string,\n TSearch extends UnknownSearchInput = UnknownSearchInput,\n> = AnyRoute<T, TSearch> & AnyRoute<T, TSearch>['get']\n/** Route input accepted by most APIs: definition string or route object/callable. */\nexport type AnyRouteOrDefinition<T extends string = string> = AnyRoute<T> | CallableRoute<T> | T\n/** Route-level runtime configuration. */\nexport type RouteConfigInput = {\n origin?: string\n}\n\n// collection\n\n/** User-provided routes map (plain definitions or route instances). */\nexport type RoutesRecord = Record<string, AnyRoute | string>\n/** Same as `RoutesRecord` but all values normalized to callable routes. */\nexport type RoutesRecordHydrated<TRoutesRecord extends RoutesRecord = any> = {\n [K in keyof TRoutesRecord]: CallableRoute<TRoutesRecord[K]>\n}\n/** Public shape returned by `Routes.create()`. Default `any` so `satisfies RoutesPretty` accepts any created routes. */\nexport type RoutesPretty<TRoutesRecord extends RoutesRecord = any> = RoutesRecordHydrated<TRoutesRecord> &\n Omit<Routes<TRoutesRecord>, '_routes' | '_getLocation' | '_clone' | '_pathsOrdering' | '_keysOrdering' | '_ordered'>\nexport type ExtractRoutesKeys<TRoutes extends RoutesPretty | RoutesRecord> = TRoutes extends RoutesPretty\n ? Extract<keyof TRoutes['_']['routes'], string>\n : TRoutes extends RoutesRecord\n ? Extract<keyof TRoutes, string>\n : never\nexport type ExtractRoute<\n TRoutes extends RoutesPretty | RoutesRecord,\n TKey extends ExtractRoutesKeys<TRoutes>,\n> = TRoutes extends RoutesPretty ? TRoutes['_']['routes'][TKey] : TRoutes extends RoutesRecord ? TRoutes[TKey] : never\n\n// public utils\n\nexport type Definition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['definition']\n : T extends string\n ? T\n : never\nexport type ParamsDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['params']\n : T extends string\n ? _ParamsDefinition<T>\n : undefined\nexport type Extended<\n T extends AnyRoute | string | undefined,\n TSuffixDefinition extends string,\n TSearchInput extends UnknownSearchInput = UnknownSearchInput,\n> = T extends AnyRoute\n ? Route0<PathExtended<T['definition'], TSuffixDefinition>, TSearchInput>\n : T extends string\n ? Route0<PathExtended<T, TSuffixDefinition>, TSearchInput>\n : T extends undefined\n ? Route0<TSuffixDefinition, TSearchInput>\n : never\n\nexport type IsAncestor<T extends AnyRoute | string, TAncestor extends AnyRoute | string> = _IsAncestor<\n Definition<T>,\n Definition<TAncestor>\n>\nexport type IsDescendant<T extends AnyRoute | string, TDescendant extends AnyRoute | string> = _IsDescendant<\n Definition<T>,\n Definition<TDescendant>\n>\nexport type IsSame<T extends AnyRoute | string, TExact extends AnyRoute | string> = _IsSame<\n Definition<T>,\n Definition<TExact>\n>\nexport type IsSameParams<T1 extends AnyRoute | string, T2 extends AnyRoute | string> = _IsSameParams<\n ParamsDefinition<T1>,\n ParamsDefinition<T2>\n>\n\nexport type HasParams<T extends AnyRoute | string> = keyof _ParamsDefinition<Definition<T>> extends never ? false : true\nexport type HasWildcard<T extends AnyRoute | string> = Definition<T> extends `${string}*${string}` ? true : false\nexport type HasRequiredParams<T extends AnyRoute | string> =\n _RequiredParamKeys<Definition<T>> extends never ? false : true\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: ParamsDefinition<T>[K] extends true ? string : string | undefined\n}\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<Definition<T>>\nexport type IsParamsOptional<T extends AnyRoute | string> = HasRequiredParams<Definition<T>> extends true ? false : true\nexport type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<Definition<T>>\n\n// location\n\nexport type LocationParams<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: _ParamsDefinition<TDefinition>[K] extends true\n ? string\n : string | undefined\n}\n\n/**\n * URL location primitives independent from route-matching state.\n *\n * `hrefRel` is relative href and includes `pathname + search + hash`.\n */\nexport type _GeneralLocation = {\n /**\n * Path without search/hash (normalized for trailing slash).\n *\n * Example:\n * - input: `https://example.com/users/42?tab=posts#section`\n * - pathname: `/users/42`\n */\n pathname: string\n /**\n * Parsed query object.\n *\n * Example:\n * - `{ tab: \"posts\", sort: \"desc\" }`\n */\n search: UnknownSearchParsed\n /**\n * Raw query string with leading `?`, if present.\n *\n * Example:\n * - `?tab=posts&sort=desc`\n */\n searchString: string\n /**\n * Raw hash with leading `#`, if present.\n *\n * Example:\n * - `#section`\n */\n hash: string\n /**\n * URL origin for absolute inputs.\n *\n * Example:\n * - href: `https://example.com/users/42`\n * - origin: `https://example.com`\n */\n origin?: string\n /**\n * Full absolute href for absolute inputs.\n *\n * Example:\n * - `https://example.com/users/42?tab=posts#section`\n */\n href?: string\n /**\n * Relative href (`pathname + search + hash`).\n *\n * Example:\n * - pathname: `/users/42`\n * - search: `?tab=posts`\n * - hash: `#section`\n * - hrefRel: `/users/42?tab=posts#section`\n */\n hrefRel: string\n /**\n * Whether input was absolute URL.\n *\n * Examples:\n * - `https://example.com/users/42` -> `true`\n * - `/users/42` -> `false`\n */\n abs: boolean\n port?: string\n host?: string\n hostname?: string\n}\n/** Location state before matching against a concrete route. */\nexport type UnknownLocationState = {\n known: false\n route: undefined\n params: undefined\n exact: false\n ancestor: false\n descendant: false\n unmatched: false\n}\nexport type UnknownLocation = _GeneralLocation & UnknownLocationState\n\n/** Known route context, but no exact/ancestor/descendant relation matched. */\nexport type UnmatchedLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Record<never, never>\n exact: false\n ancestor: false\n descendant: false\n unmatched: true\n}\nexport type UnmatchedLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n UnmatchedLocationState<TRoute>\n\n/** Exact match state for a known route. */\nexport type ExactLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: true\n ancestor: false\n descendant: false\n unmatched: false\n}\nexport type ExactLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n ExactLocationState<TRoute>\n\n/** Input URL is a descendant of route definition (route is ancestor). */\nexport type AncestorLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: false\n ancestor: true\n descendant: false\n unmatched: false\n}\nexport type AncestorLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n AncestorLocationState<TRoute>\n\n/** It is when route not match at all, but params match. */\nexport type WeakAncestorLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: false\n ancestor: true\n descendant: false\n unmatched: false\n}\nexport type WeakAncestorLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n WeakAncestorLocationState<TRoute>\n\n/** Input URL is an ancestor prefix of route definition (route is descendant). */\nexport type DescendantLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Partial<ParamsOutput<TRoute>>\n exact: false\n ancestor: false\n descendant: true\n unmatched: false\n}\nexport type DescendantLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n DescendantLocationState<TRoute>\n\nexport type UnknownSearchParsedValue = string | UnknownSearchParsed | Array<UnknownSearchParsedValue>\nexport interface UnknownSearchParsed {\n [key: string]: UnknownSearchParsedValue\n}\n\nexport type UnknownSearchInputValue =\n | string\n | number\n | boolean\n | undefined\n | UnknownSearchInput\n | Array<UnknownSearchInputValue>\nexport interface UnknownSearchInput {\n [key: string]: UnknownSearchInputValue\n}\n\n/** It is when route not match at all, but params partially match. */\nexport type WeakDescendantLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Partial<ParamsOutput<TRoute>>\n exact: false\n ancestor: false\n descendant: true\n unmatched: false\n}\nexport type WeakDescendantLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n WeakDescendantLocationState<TRoute>\nexport type KnownLocation<TRoute extends AnyRoute | string = AnyRoute | string> =\n | UnmatchedLocation<TRoute>\n | ExactLocation<TRoute>\n | AncestorLocation<TRoute>\n | WeakAncestorLocation<TRoute>\n | DescendantLocation<TRoute>\n | WeakDescendantLocation<TRoute>\nexport type AnyLocation<TRoute extends AnyRoute | string = AnyRoute | string> = UnknownLocation | KnownLocation<TRoute>\n\n// internal utils\n\nexport type _ParamsDefinition<TDefinition extends string> = _ExtractParamsDefinitionBySegments<\n _SplitPathSegments<Definition<TDefinition>>\n>\n\nexport type _Simplify<T> = { [K in keyof T]: T[K] } & {}\nexport type _IfNoKeys<T extends object, TYes, TNo> = keyof T extends never ? TYes : TNo\n\nexport type _ParamsInput<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends infer TDef extends Record<string, boolean>\n ? _IfNoKeys<\n TDef,\n Record<never, never>,\n _Simplify<\n {\n [K in keyof TDef as TDef[K] extends true ? K : never]: string | number\n } & {\n [K in keyof TDef as TDef[K] extends false ? K : never]?: string | number | undefined\n }\n >\n >\n : Record<never, never>\n\nexport type _ParamsInputStringOnly<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends infer TDef extends Record<string, boolean>\n ? _IfNoKeys<\n TDef,\n Record<never, never>,\n _Simplify<\n {\n [K in keyof TDef as TDef[K] extends true ? K : never]: string\n } & {\n [K in keyof TDef as TDef[K] extends false ? K : never]?: string | undefined\n }\n >\n >\n : Record<never, never>\n\nexport type _SplitPathSegments<TPath extends string> = TPath extends ''\n ? []\n : TPath extends '/'\n ? []\n : TPath extends `/${infer Rest}`\n ? _SplitPathSegments<Rest>\n : TPath extends `${infer Segment}/${infer Rest}`\n ? Segment extends ''\n ? _SplitPathSegments<Rest>\n : [Segment, ..._SplitPathSegments<Rest>]\n : TPath extends ''\n ? []\n : [TPath]\n\nexport type _ParamDefinitionFromSegment<TSegment extends string> = TSegment extends `:${infer Name}?`\n ? { [K in Name]: false }\n : TSegment extends `:${infer Name}`\n ? { [K in Name]: true }\n : TSegment extends `${string}*?`\n ? { '*': false }\n : TSegment extends `${string}*`\n ? { '*': true }\n : Record<never, never>\n\nexport type _MergeParamDefinitions<A extends Record<string, boolean>, B extends Record<string, boolean>> = {\n [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never\n}\n\nexport type _ExtractParamsDefinitionBySegments<TSegments extends string[]> = TSegments extends [\n infer Segment extends string,\n ...infer Rest extends string[],\n]\n ? _MergeParamDefinitions<_ParamDefinitionFromSegment<Segment>, _ExtractParamsDefinitionBySegments<Rest>>\n : Record<never, never>\n\nexport type _RequiredParamKeys<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: _ParamsDefinition<TDefinition>[K] extends true ? K : never\n}[keyof _ParamsDefinition<TDefinition>]\nexport type ReplacePathParams<S extends string> = S extends `${infer Head}:${infer Tail}`\n ? // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Tail extends `${infer _Param}/${infer Rest}`\n ? ReplacePathParams<`${Head}${string}/${Rest}`>\n : `${Head}${string}`\n : S\nexport type DedupeSlashes<S extends string> = S extends `${infer A}//${infer B}` ? DedupeSlashes<`${A}/${B}`> : S\nexport type EmptyRecord = Record<never, never>\nexport type JoinPath<Parent extends string, Suffix extends string> = DedupeSlashes<\n Definition<Parent> extends infer A extends string\n ? Definition<Suffix> extends infer B extends string\n ? A extends ''\n ? B extends ''\n ? ''\n : B extends `/${string}`\n ? B\n : `/${B}`\n : B extends ''\n ? A\n : A extends `${string}/`\n ? `${A}${B}`\n : B extends `/${string}`\n ? `${A}${B}`\n : `${A}/${B}`\n : never\n : never\n>\n\nexport type OnlyIfNoParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends false ? Yes : No\nexport type OnlyIfHasParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends true ? Yes : No\n\nexport type GetPathInput<\n TDefinition extends string,\n TSearchInput extends UnknownSearchInput,\n> = _ParamsInput<TDefinition> & {\n '?'?: TSearchInput\n '#'?: string | number\n}\n\nexport type PathExtended<\n TSourceDefinitionDefinition extends string,\n TSuffixDefinitionDefinition extends string,\n> = `${JoinPath<StripTrailingWildcard<TSourceDefinitionDefinition>, TSuffixDefinitionDefinition>}`\n\nexport type StripTrailingWildcard<TDefinition extends string> = TDefinition extends `${infer TPath}*?`\n ? TPath\n : TDefinition extends `${infer TPath}*`\n ? TPath\n : TDefinition\n\nexport type IsAny<T> = 0 extends 1 & T ? true : false\n\nexport type _IsSameParams<T1 extends object | undefined, T2 extends object | undefined> = T1 extends undefined\n ? T2 extends undefined\n ? true\n : false\n : T2 extends undefined\n ? false\n : T1 extends T2\n ? T2 extends T1\n ? true\n : false\n : false\n\nexport type _IsAncestor<T extends string, TAncestor extends string> = T extends TAncestor\n ? false\n : T extends `${TAncestor}${string}`\n ? true\n : false\nexport type _IsDescendant<T extends string, TDescendant extends string> = TDescendant extends T\n ? false\n : TDescendant extends `${T}${string}`\n ? true\n : false\nexport type _IsSame<T extends string, TExact extends string> = T extends TExact\n ? TExact extends T\n ? true\n : false\n : false\n\nexport type _SafeParseInputResult<TInputParsed extends Record<string, unknown>> =\n | {\n success: true\n data: TInputParsed\n error: undefined\n }\n | {\n success: false\n data: undefined\n error: Error\n }\n\nexport type SchemaRoute0<\n TInput extends Record<string, unknown>,\n TOutput extends Record<string, unknown>,\n> = StandardSchemaV1<TInput, TOutput> & {\n parse: (input: unknown) => TOutput\n safeParse: (input: unknown) => _SafeParseInputResult<TOutput>\n}\n"],"mappings":"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","names":["searchInput","hashInput","paramsInput","absOriginInput","stringifySearchQuery","parseSearchQuery"]}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -57,19 +57,7 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
|
|
|
57
57
|
/** Extends the current route definition by appending a suffix route. */
|
|
58
58
|
extend<TSuffixDefinition extends string>(suffixDefinition: TSuffixDefinition): CallableRoute<PathExtended<TDefinition, TSuffixDefinition>, TSearchInput>;
|
|
59
59
|
get(...args: IsParamsOptional<TDefinition> extends true ? [abs: boolean | string | undefined] : never): string;
|
|
60
|
-
get(...args: IsParamsOptional<TDefinition> extends true ? [
|
|
61
|
-
input?: (_ParamsInput<TDefinition> & {
|
|
62
|
-
'?'?: TSearchInput;
|
|
63
|
-
'#'?: string | number;
|
|
64
|
-
}) | undefined,
|
|
65
|
-
abs?: boolean | string | undefined
|
|
66
|
-
] : [
|
|
67
|
-
input: _ParamsInput<TDefinition> & {
|
|
68
|
-
'?'?: TSearchInput;
|
|
69
|
-
'#'?: string | number;
|
|
70
|
-
},
|
|
71
|
-
abs?: boolean | string | undefined
|
|
72
|
-
]): string;
|
|
60
|
+
get(...args: IsParamsOptional<TDefinition> extends true ? [input?: GetPathInput<TDefinition, TSearchInput> | undefined, abs?: boolean | string | undefined] : [input: GetPathInput<TDefinition, TSearchInput>, abs?: boolean | string | undefined]): string;
|
|
73
61
|
/** Returns path param keys extracted from route definition. */
|
|
74
62
|
getParamsKeys(): string[];
|
|
75
63
|
getPathTokens(): PathToken[];
|
|
@@ -423,6 +411,10 @@ type EmptyRecord = Record<never, never>;
|
|
|
423
411
|
type JoinPath<Parent extends string, Suffix extends string> = DedupeSlashes<Definition<Parent> extends infer A extends string ? Definition<Suffix> extends infer B extends string ? A extends '' ? B extends '' ? '' : B extends `/${string}` ? B : `/${B}` : B extends '' ? A : A extends `${string}/` ? `${A}${B}` : B extends `/${string}` ? `${A}${B}` : `${A}/${B}` : never : never>;
|
|
424
412
|
type OnlyIfNoParams<TRoute extends AnyRoute | string, Yes, No = never> = HasParams<TRoute> extends false ? Yes : No;
|
|
425
413
|
type OnlyIfHasParams<TRoute extends AnyRoute | string, Yes, No = never> = HasParams<TRoute> extends true ? Yes : No;
|
|
414
|
+
type GetPathInput<TDefinition extends string, TSearchInput extends UnknownSearchInput> = _ParamsInput<TDefinition> & {
|
|
415
|
+
'?'?: TSearchInput;
|
|
416
|
+
'#'?: string | number;
|
|
417
|
+
};
|
|
426
418
|
type PathExtended<TSourceDefinitionDefinition extends string, TSuffixDefinitionDefinition extends string> = `${JoinPath<StripTrailingWildcard<TSourceDefinitionDefinition>, TSuffixDefinitionDefinition>}`;
|
|
427
419
|
type StripTrailingWildcard<TDefinition extends string> = TDefinition extends `${infer TPath}*?` ? TPath : TDefinition extends `${infer TPath}*` ? TPath : TDefinition;
|
|
428
420
|
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
@@ -444,4 +436,4 @@ type SchemaRoute0<TInput extends Record<string, unknown>, TOutput extends Record
|
|
|
444
436
|
safeParse: (input: unknown) => _SafeParseInputResult<TOutput>;
|
|
445
437
|
};
|
|
446
438
|
|
|
447
|
-
export { type AncestorLocation, type AncestorLocationState, type AnyLocation, type AnyRoute, type AnyRouteOrDefinition, type CallableRoute, type DedupeSlashes, type Definition, type DescendantLocation, type DescendantLocationState, type EmptyRecord, type ExactLocation, type ExactLocationState, type Extended, type ExtractRoute, type ExtractRoutesKeys, type HasParams, type HasRequiredParams, type HasWildcard, type IsAncestor, type IsAny, type IsDescendant, type IsParamsOptional, type IsSame, type IsSameParams, type JoinPath, type KnownLocation, type LocationParams, type OnlyIfHasParams, type OnlyIfNoParams, type ParamsDefinition, type ParamsInput, type ParamsInputStringOnly, type ParamsOutput, type PathExtended, type PathToken, type ReplacePathParams, Route0, type RouteConfigInput, Routes, type RoutesPretty, type RoutesRecord, type RoutesRecordHydrated, type SchemaRoute0, type StripTrailingWildcard, type UnknownLocation, type UnknownLocationState, type UnknownSearchInput, type UnknownSearchInputValue, type UnknownSearchParsed, type UnknownSearchParsedValue, type UnmatchedLocation, type UnmatchedLocationState, type WeakAncestorLocation, type WeakAncestorLocationState, type WeakDescendantLocation, type WeakDescendantLocationState, type _ExtractParamsDefinitionBySegments, type _GeneralLocation, type _IfNoKeys, type _IsAncestor, type _IsDescendant, type _IsSame, type _IsSameParams, type _MergeParamDefinitions, type _ParamDefinitionFromSegment, type _ParamsDefinition, type _ParamsInput, type _ParamsInputStringOnly, type _RequiredParamKeys, type _SafeParseInputResult, type _Simplify, type _SplitPathSegments };
|
|
439
|
+
export { type AncestorLocation, type AncestorLocationState, type AnyLocation, type AnyRoute, type AnyRouteOrDefinition, type CallableRoute, type DedupeSlashes, type Definition, type DescendantLocation, type DescendantLocationState, type EmptyRecord, type ExactLocation, type ExactLocationState, type Extended, type ExtractRoute, type ExtractRoutesKeys, type GetPathInput, type HasParams, type HasRequiredParams, type HasWildcard, type IsAncestor, type IsAny, type IsDescendant, type IsParamsOptional, type IsSame, type IsSameParams, type JoinPath, type KnownLocation, type LocationParams, type OnlyIfHasParams, type OnlyIfNoParams, type ParamsDefinition, type ParamsInput, type ParamsInputStringOnly, type ParamsOutput, type PathExtended, type PathToken, type ReplacePathParams, Route0, type RouteConfigInput, Routes, type RoutesPretty, type RoutesRecord, type RoutesRecordHydrated, type SchemaRoute0, type StripTrailingWildcard, type UnknownLocation, type UnknownLocationState, type UnknownSearchInput, type UnknownSearchInputValue, type UnknownSearchParsed, type UnknownSearchParsedValue, type UnmatchedLocation, type UnmatchedLocationState, type WeakAncestorLocation, type WeakAncestorLocationState, type WeakDescendantLocation, type WeakDescendantLocationState, type _ExtractParamsDefinitionBySegments, type _GeneralLocation, type _IfNoKeys, type _IsAncestor, type _IsDescendant, type _IsSame, type _IsSameParams, type _MergeParamDefinitions, type _ParamDefinitionFromSegment, type _ParamsDefinition, type _ParamsInput, type _ParamsInputStringOnly, type _RequiredParamKeys, type _SafeParseInputResult, type _Simplify, type _SplitPathSegments };
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -57,19 +57,7 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
|
|
|
57
57
|
/** Extends the current route definition by appending a suffix route. */
|
|
58
58
|
extend<TSuffixDefinition extends string>(suffixDefinition: TSuffixDefinition): CallableRoute<PathExtended<TDefinition, TSuffixDefinition>, TSearchInput>;
|
|
59
59
|
get(...args: IsParamsOptional<TDefinition> extends true ? [abs: boolean | string | undefined] : never): string;
|
|
60
|
-
get(...args: IsParamsOptional<TDefinition> extends true ? [
|
|
61
|
-
input?: (_ParamsInput<TDefinition> & {
|
|
62
|
-
'?'?: TSearchInput;
|
|
63
|
-
'#'?: string | number;
|
|
64
|
-
}) | undefined,
|
|
65
|
-
abs?: boolean | string | undefined
|
|
66
|
-
] : [
|
|
67
|
-
input: _ParamsInput<TDefinition> & {
|
|
68
|
-
'?'?: TSearchInput;
|
|
69
|
-
'#'?: string | number;
|
|
70
|
-
},
|
|
71
|
-
abs?: boolean | string | undefined
|
|
72
|
-
]): string;
|
|
60
|
+
get(...args: IsParamsOptional<TDefinition> extends true ? [input?: GetPathInput<TDefinition, TSearchInput> | undefined, abs?: boolean | string | undefined] : [input: GetPathInput<TDefinition, TSearchInput>, abs?: boolean | string | undefined]): string;
|
|
73
61
|
/** Returns path param keys extracted from route definition. */
|
|
74
62
|
getParamsKeys(): string[];
|
|
75
63
|
getPathTokens(): PathToken[];
|
|
@@ -423,6 +411,10 @@ type EmptyRecord = Record<never, never>;
|
|
|
423
411
|
type JoinPath<Parent extends string, Suffix extends string> = DedupeSlashes<Definition<Parent> extends infer A extends string ? Definition<Suffix> extends infer B extends string ? A extends '' ? B extends '' ? '' : B extends `/${string}` ? B : `/${B}` : B extends '' ? A : A extends `${string}/` ? `${A}${B}` : B extends `/${string}` ? `${A}${B}` : `${A}/${B}` : never : never>;
|
|
424
412
|
type OnlyIfNoParams<TRoute extends AnyRoute | string, Yes, No = never> = HasParams<TRoute> extends false ? Yes : No;
|
|
425
413
|
type OnlyIfHasParams<TRoute extends AnyRoute | string, Yes, No = never> = HasParams<TRoute> extends true ? Yes : No;
|
|
414
|
+
type GetPathInput<TDefinition extends string, TSearchInput extends UnknownSearchInput> = _ParamsInput<TDefinition> & {
|
|
415
|
+
'?'?: TSearchInput;
|
|
416
|
+
'#'?: string | number;
|
|
417
|
+
};
|
|
426
418
|
type PathExtended<TSourceDefinitionDefinition extends string, TSuffixDefinitionDefinition extends string> = `${JoinPath<StripTrailingWildcard<TSourceDefinitionDefinition>, TSuffixDefinitionDefinition>}`;
|
|
427
419
|
type StripTrailingWildcard<TDefinition extends string> = TDefinition extends `${infer TPath}*?` ? TPath : TDefinition extends `${infer TPath}*` ? TPath : TDefinition;
|
|
428
420
|
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
@@ -444,4 +436,4 @@ type SchemaRoute0<TInput extends Record<string, unknown>, TOutput extends Record
|
|
|
444
436
|
safeParse: (input: unknown) => _SafeParseInputResult<TOutput>;
|
|
445
437
|
};
|
|
446
438
|
|
|
447
|
-
export { type AncestorLocation, type AncestorLocationState, type AnyLocation, type AnyRoute, type AnyRouteOrDefinition, type CallableRoute, type DedupeSlashes, type Definition, type DescendantLocation, type DescendantLocationState, type EmptyRecord, type ExactLocation, type ExactLocationState, type Extended, type ExtractRoute, type ExtractRoutesKeys, type HasParams, type HasRequiredParams, type HasWildcard, type IsAncestor, type IsAny, type IsDescendant, type IsParamsOptional, type IsSame, type IsSameParams, type JoinPath, type KnownLocation, type LocationParams, type OnlyIfHasParams, type OnlyIfNoParams, type ParamsDefinition, type ParamsInput, type ParamsInputStringOnly, type ParamsOutput, type PathExtended, type PathToken, type ReplacePathParams, Route0, type RouteConfigInput, Routes, type RoutesPretty, type RoutesRecord, type RoutesRecordHydrated, type SchemaRoute0, type StripTrailingWildcard, type UnknownLocation, type UnknownLocationState, type UnknownSearchInput, type UnknownSearchInputValue, type UnknownSearchParsed, type UnknownSearchParsedValue, type UnmatchedLocation, type UnmatchedLocationState, type WeakAncestorLocation, type WeakAncestorLocationState, type WeakDescendantLocation, type WeakDescendantLocationState, type _ExtractParamsDefinitionBySegments, type _GeneralLocation, type _IfNoKeys, type _IsAncestor, type _IsDescendant, type _IsSame, type _IsSameParams, type _MergeParamDefinitions, type _ParamDefinitionFromSegment, type _ParamsDefinition, type _ParamsInput, type _ParamsInputStringOnly, type _RequiredParamKeys, type _SafeParseInputResult, type _Simplify, type _SplitPathSegments };
|
|
439
|
+
export { type AncestorLocation, type AncestorLocationState, type AnyLocation, type AnyRoute, type AnyRouteOrDefinition, type CallableRoute, type DedupeSlashes, type Definition, type DescendantLocation, type DescendantLocationState, type EmptyRecord, type ExactLocation, type ExactLocationState, type Extended, type ExtractRoute, type ExtractRoutesKeys, type GetPathInput, type HasParams, type HasRequiredParams, type HasWildcard, type IsAncestor, type IsAny, type IsDescendant, type IsParamsOptional, type IsSame, type IsSameParams, type JoinPath, type KnownLocation, type LocationParams, type OnlyIfHasParams, type OnlyIfNoParams, type ParamsDefinition, type ParamsInput, type ParamsInputStringOnly, type ParamsOutput, type PathExtended, type PathToken, type ReplacePathParams, Route0, type RouteConfigInput, Routes, type RoutesPretty, type RoutesRecord, type RoutesRecordHydrated, type SchemaRoute0, type StripTrailingWildcard, type UnknownLocation, type UnknownLocationState, type UnknownSearchInput, type UnknownSearchInputValue, type UnknownSearchParsed, type UnknownSearchParsedValue, type UnmatchedLocation, type UnmatchedLocationState, type WeakAncestorLocation, type WeakAncestorLocationState, type WeakDescendantLocation, type WeakDescendantLocationState, type _ExtractParamsDefinitionBySegments, type _GeneralLocation, type _IfNoKeys, type _IsAncestor, type _IsDescendant, type _IsSame, type _IsSameParams, type _MergeParamDefinitions, type _ParamDefinitionFromSegment, type _ParamsDefinition, type _ParamsInput, type _ParamsInputStringOnly, type _RequiredParamKeys, type _SafeParseInputResult, type _Simplify, type _SplitPathSegments };
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\nimport { parse as parseSearchQuery, stringify as stringifySearchQuery } from '@devp0nt/flat0'\n\nexport type PathToken =\n | { kind: 'static'; value: string }\n | { kind: 'param'; name: string; optional: boolean }\n | { kind: 'wildcard'; prefix: string; optional: boolean }\n\nconst escapeRegex = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nconst getPathSegments = (definition: string): string[] => {\n if (definition === '' || definition === '/') return []\n return definition.split('/').filter(Boolean)\n}\n\nconst getPathTokens = (definition: string): PathToken[] => {\n const segments = getPathSegments(definition)\n return segments.map((segment): PathToken => {\n const param = segment.match(/^:([A-Za-z0-9_]+)(\\?)?$/)\n if (param) {\n return { kind: 'param', name: param[1], optional: param[2] === '?' }\n }\n if (segment === '*' || segment === '*?') {\n return { kind: 'wildcard', prefix: '', optional: segment.endsWith('?') }\n }\n const wildcard = segment.match(/^(.*)\\*(\\?)?$/)\n if (wildcard && !segment.includes('\\\\*')) {\n return { kind: 'wildcard', prefix: wildcard[1], optional: wildcard[2] === '?' }\n }\n return { kind: 'static', value: segment }\n })\n}\n\nconst getPathRegexBaseStrictString = (definition: string): string => {\n const tokens = getPathTokens(definition)\n if (tokens.length === 0) return ''\n let pattern = ''\n for (const token of tokens) {\n if (token.kind === 'static') {\n pattern += `/${escapeRegex(token.value)}`\n continue\n }\n if (token.kind === 'param') {\n pattern += token.optional ? '(?:/([^/]+))?' : '/([^/]+)'\n continue\n }\n if (token.prefix.length > 0) {\n pattern += `/${escapeRegex(token.prefix)}(.*)`\n } else {\n // Wouter-compatible splat: /orders/* matches /orders and /orders/...\n pattern += '(?:/(.*))?'\n }\n }\n return pattern\n}\n\nconst getPathCaptureKeys = (definition: string): string[] => {\n const keys: string[] = []\n for (const token of getPathTokens(definition)) {\n if (token.kind === 'param') keys.push(token.name)\n if (token.kind === 'wildcard') keys.push('*')\n }\n return keys\n}\n\nconst getPathParamsDefinition = (definition: string): Record<string, boolean> => {\n const entries = getPathTokens(definition)\n .filter((t) => t.kind !== 'static')\n .map((t): [string, boolean] => (t.kind === 'param' ? [t.name, !t.optional] : ['*', !t.optional]))\n return Object.fromEntries(entries)\n}\n\nconst validatePathDefinition = (definition: string): void => {\n const segments = getPathSegments(definition)\n const wildcardSegments = segments.filter((segment) => segment.includes('*'))\n if (wildcardSegments.length === 0) return\n if (wildcardSegments.length > 1) {\n throw new Error(`Invalid route definition \"${definition}\": only one wildcard segment is allowed`)\n }\n const wildcardSegmentIndex = segments.findIndex((segment) => segment.includes('*'))\n const wildcardSegment = segments[wildcardSegmentIndex]\n if (!wildcardSegment.match(/^(?:\\*|\\*\\?|[^*]+\\*|\\S+\\*\\?)$/)) {\n throw new Error(`Invalid route definition \"${definition}\": wildcard must be trailing in its segment`)\n }\n if (wildcardSegmentIndex !== segments.length - 1) {\n throw new Error(`Invalid route definition \"${definition}\": wildcard segment is allowed only at the end`)\n }\n}\n\nconst stripTrailingWildcard = (definition: string): string => definition.replace(/\\*\\??$/, '')\n\n/**\n * Strongly typed route descriptor and URL builder.\n *\n * A route definition uses:\n * - path params: `/users/:id`\n * - named search keys: `/users&tab&sort`\n * - loose search mode: trailing `&`, e.g. `/users&`\n *\n * Instances are callable (same as `.get()`), so `route(input)` and\n * `route.get(input)` are equivalent.\n */\nexport class Route0<TDefinition extends string, TSearchInput extends UnknownSearchInput = UnknownSearchInput> {\n readonly definition: TDefinition\n readonly params: _ParamsDefinition<TDefinition>\n private _origin: string | undefined\n private _callable: CallableRoute<TDefinition, TSearchInput>\n\n Infer: {\n ParamsDefinition: _ParamsDefinition<TDefinition>\n ParamsInput: _ParamsInput<TDefinition>\n ParamsInputStringOnly: _ParamsInputStringOnly<TDefinition>\n ParamsOutput: ParamsOutput<TDefinition>\n SearchInput: TSearchInput\n } = null as never\n\n /** Base URL used when generating absolute URLs (`abs: true`). */\n get origin(): string {\n if (!this._origin) {\n throw new Error(\n 'origin for route ' +\n this.definition +\n ' is not set, please provide it like Route0.create(route, {origin: \"https://example.com\"}) in config or set via clones like routes._.clone({origin: \"https://example.com\"})',\n )\n }\n return this._origin\n }\n set origin(origin: string) {\n this._origin = origin\n }\n\n private constructor(definition: TDefinition, config: RouteConfigInput = {}) {\n validatePathDefinition(definition)\n this.definition = definition\n this.params = Route0._getParamsDefinitionByDefinition(definition)\n\n const { origin } = config\n if (origin && typeof origin === 'string' && origin.length) {\n this._origin = origin\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } } | undefined\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this._origin = g.location.origin\n } else {\n this._origin = undefined\n }\n }\n const callable = this.get.bind(this)\n Object.setPrototypeOf(callable, this)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: this.definition,\n })\n this._callable = callable as CallableRoute<TDefinition, TSearchInput>\n }\n\n /**\n * Creates a callable route instance.\n *\n * If an existing route/callable route is provided, it is cloned.\n */\n static create<TDefinition extends string>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n config?: RouteConfigInput,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function' || typeof definition === 'object') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n const original = new Route0<TDefinition>(definition, config)\n return original._callable\n }\n\n /**\n * Normalizes a definition/route into a callable route.\n *\n * Unlike `create`, passing a callable route returns the same instance.\n */\n static from<TDefinition extends string, TSearchInput extends UnknownSearchInput>(\n definition: TDefinition | AnyRoute<TDefinition, TSearchInput> | CallableRoute<TDefinition, TSearchInput>,\n ): CallableRoute<TDefinition, TSearchInput> {\n if (typeof definition === 'function') {\n return definition\n }\n const original = typeof definition === 'object' ? definition : new Route0<TDefinition>(definition)\n return original._callable as CallableRoute<TDefinition, TSearchInput>\n }\n\n private static _getAbsPath(origin: string, url: string) {\n return new URL(url, origin).toString().replace(/\\/$/, '')\n }\n\n private static _getParamsDefinitionByDefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _ParamsDefinition<TDefinition> {\n return getPathParamsDefinition(definition) as _ParamsDefinition<TDefinition>\n }\n\n search<TNewSearchInput extends UnknownSearchInput>(): CallableRoute<TDefinition, TNewSearchInput> {\n return this._callable as CallableRoute<TDefinition, TNewSearchInput>\n }\n\n /** Extends the current route definition by appending a suffix route. */\n extend<TSuffixDefinition extends string>(\n suffixDefinition: TSuffixDefinition,\n ): CallableRoute<PathExtended<TDefinition, TSuffixDefinition>, TSearchInput> {\n const sourceDefinitionWithoutWildcard = stripTrailingWildcard(this.definition)\n const definition = `${sourceDefinitionWithoutWildcard}/${suffixDefinition}`.replace(/\\/{2,}/g, '/')\n return Route0.create<PathExtended<TDefinition, TSuffixDefinition>>(\n definition as PathExtended<TDefinition, TSuffixDefinition>,\n { origin: this._origin },\n )\n }\n\n get(...args: IsParamsOptional<TDefinition> extends true ? [abs: boolean | string | undefined] : never): string\n get(\n ...args: IsParamsOptional<TDefinition> extends true\n ? [\n input?:\n | (_ParamsInput<TDefinition> & {\n '?'?: TSearchInput\n '#'?: string | number\n })\n | undefined,\n abs?: boolean | string | undefined,\n ]\n : [\n input: _ParamsInput<TDefinition> & {\n '?'?: TSearchInput\n '#'?: string | number\n },\n abs?: boolean | string | undefined,\n ]\n ): string\n\n // implementation\n get(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, absOriginInput, hashInput } = ((): {\n searchInput: Record<string, unknown>\n paramsInput: Record<string, string | undefined>\n absInput: boolean\n absOriginInput: string | undefined\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n absOriginInput: undefined,\n hashInput: undefined,\n }\n }\n const [input, abs] = ((): [Record<string, unknown>, boolean | string | undefined] => {\n if (typeof args[0] === 'object' && args[0] !== null) {\n return [args[0], args[1]] as [Record<string, unknown>, boolean | string | undefined]\n }\n if (typeof args[1] === 'object' && args[1] !== null) {\n return [args[1], args[0]] as [Record<string, unknown>, boolean | string | undefined]\n }\n if (typeof args[0] === 'boolean' || typeof args[0] === 'string') {\n return [{}, args[0]]\n }\n if (typeof args[1] === 'boolean' || typeof args[1] === 'string') {\n return [{}, args[1]]\n }\n return [{}, undefined]\n })()\n let searchInput: Record<string, unknown> = {}\n let hashInput: string | undefined = undefined\n const paramsInput: Record<string, string | undefined> = {}\n for (const [key, value] of Object.entries(input)) {\n if (key === '?' && typeof value === 'object' && value !== null) {\n searchInput = value as Record<string, unknown>\n } else if (key === '#' && (typeof value === 'string' || typeof value === 'number')) {\n hashInput = String(value)\n } else if (key in this.params && (typeof value === 'string' || typeof value === 'number')) {\n Object.assign(paramsInput, { [key]: String(value) })\n }\n }\n const absOriginInput = typeof abs === 'string' && abs.length > 0 ? abs : undefined\n return {\n searchInput,\n paramsInput,\n absInput: absOriginInput !== undefined || abs === true,\n absOriginInput,\n hashInput,\n }\n })()\n\n // create url\n\n let url = this.definition as string\n // optional named params like /:id?\n url = url.replace(/\\/:([A-Za-z0-9_]+)\\?/g, (_m, k) => {\n const value = paramsInput[k]\n if (value === undefined) return ''\n return `/${encodeURIComponent(String(value))}`\n })\n // required named params\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n url = url.replace(/:([A-Za-z0-9_]+)(?!\\?)/g, (_m, k) => encodeURIComponent(String(paramsInput?.[k] ?? 'undefined')))\n // optional wildcard segment (/*?)\n url = url.replace(/\\/\\*\\?/g, () => {\n const value = paramsInput['*']\n if (value === undefined) return ''\n const stringValue = String(value)\n return stringValue.startsWith('/') ? stringValue : `/${stringValue}`\n })\n // required wildcard segment (/*)\n url = url.replace(/\\/\\*/g, () => {\n const value = String(paramsInput['*'] ?? '')\n return value.startsWith('/') ? value : `/${value}`\n })\n // optional wildcard inline (e.g. /app*?)\n url = url.replace(/\\*\\?/g, () => String(paramsInput['*'] ?? ''))\n // required wildcard inline (e.g. /app*)\n url = url.replace(/\\*/g, () => String(paramsInput['*'] ?? ''))\n // search params\n const searchString = stringifySearchQuery(searchInput)\n url = [url, searchString].filter(Boolean).join('?')\n // dedupe slashes\n url = url.replace(/\\/{2,}/g, '/')\n // absolute\n url = absInput ? Route0._getAbsPath(absOriginInput || this.origin, url) : url\n // hash\n if (hashInput !== undefined) {\n url = `${url}#${hashInput}`\n }\n\n return url\n }\n\n /** Returns path param keys extracted from route definition. */\n getParamsKeys(): string[] {\n return Object.keys(this.params)\n }\n\n getPathTokens(): PathToken[] {\n return getPathTokens(this.definition)\n }\n\n /** Clones route with optional config override. */\n clone(config?: RouteConfigInput): CallableRoute<TDefinition> {\n return Route0.create(this.definition, config)\n }\n\n getRegexBaseStrictString(): string {\n return getPathRegexBaseStrictString(this.definition)\n }\n\n getRegexBaseString(): string {\n return this.getRegexBaseStrictString().replace(/\\/+$/, '') + '/?' // remove trailing slashes and add optional slash\n }\n\n getRegexStrictString(): string {\n return `^${this.getRegexBaseStrictString()}$`\n }\n\n getRegexString(): string {\n return `^${this.getRegexBaseString()}$`\n }\n\n getRegexStrict(): RegExp {\n return new RegExp(this.getRegexStrictString())\n }\n\n getRegex(): RegExp {\n return new RegExp(this.getRegexString())\n }\n\n /** Creates a grouped strict regex pattern string from many routes. */\n static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a strict grouped regex from many routes. */\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Creates a grouped regex pattern string from many routes. */\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a grouped regex from many routes. */\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Converts any location shape to relative form (removes host/origin fields). */\n static toRelLocation<TLocation extends AnyLocation>(location: TLocation): TLocation {\n return {\n ...location,\n abs: false,\n origin: undefined,\n href: undefined,\n port: undefined,\n host: undefined,\n hostname: undefined,\n }\n }\n\n /** Converts a location to absolute form using provided origin URL. */\n static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, origin: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, origin)\n return {\n ...location,\n abs: true,\n origin: url.origin,\n href: url.href,\n port: url.port,\n host: url.host,\n hostname: url.hostname,\n }\n }\n\n /**\n * Parses a URL-like input into raw location object (without route knowledge).\n *\n * Result is always `UnknownLocation` because no route matching is applied.\n */\n static getLocation(href: `${string}://${string}`): UnknownLocation\n static getLocation(hrefRel: `/${string}`): UnknownLocation\n static getLocation(hrefOrHrefRel: string): UnknownLocation\n static getLocation(location: AnyLocation): UnknownLocation\n static getLocation(url: URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return Route0.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n // Check if it's an absolute URL (starts with scheme://)\n const abs = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(hrefOrHrefRelOrLocation)\n\n // Use dummy base only if relative\n const base = abs ? undefined : 'http://example.com'\n const url = new URL(hrefOrHrefRelOrLocation, base)\n\n // Parse search query to object form\n const search = parseSearchQuery(url.search)\n\n // Normalize pathname (remove trailing slash except for root)\n let pathname = url.pathname\n if (pathname.length > 1 && pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1)\n }\n\n // Common derived values\n const hrefRel = pathname + url.search + url.hash\n\n // Build the location object consistent with _GeneralLocation\n const location: UnknownLocation = {\n pathname,\n search,\n searchString: url.search,\n hash: url.hash,\n origin: abs ? url.origin : undefined,\n href: abs ? url.href : undefined,\n hrefRel,\n abs,\n\n // extra host-related fields (available even for relative with dummy base)\n host: abs ? url.host : undefined,\n hostname: abs ? url.hostname : undefined,\n port: abs ? url.port || undefined : undefined,\n\n // specific to UnknownLocation\n params: undefined,\n route: undefined,\n known: false,\n exact: false,\n ancestor: false,\n descendant: false,\n unmatched: false,\n }\n\n return location\n }\n\n /**\n * Parses input and matches it against this route definition.\n *\n * Result includes relation flags:\n * - `exact`\n * - `ancestor`\n * - `descendant`\n * - `unmatched`\n */\n getLocation(href: `${string}://${string}`): KnownLocation<TDefinition>\n getLocation(hrefRel: `/${string}`): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRel: string): KnownLocation<TDefinition>\n getLocation(location: AnyLocation): KnownLocation<TDefinition>\n getLocation(url: AnyLocation): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition> {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return this.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n const location = Route0.getLocation(hrefOrHrefRelOrLocation) as never as KnownLocation<TDefinition>\n location.route = this.definition as Definition<TDefinition>\n location.params = {}\n\n // Normalize pathname (no trailing slash except root)\n const pathname =\n location.pathname.length > 1 && location.pathname.endsWith('/')\n ? location.pathname.slice(0, -1)\n : location.pathname\n\n const paramNames = getPathCaptureKeys(this.definition)\n const def =\n this.definition.length > 1 && this.definition.endsWith('/') ? this.definition.slice(0, -1) : this.definition\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const ancestorRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n const ancestorMatch = pathname.match(ancestorRe)\n const exact = !!exactMatch\n const ancestor = !exact && !!ancestorMatch\n\n // Parse params for exact and ancestor matches.\n const paramsMatch = exactMatch || (ancestor ? ancestorMatch : null)\n if (paramsMatch) {\n const values = paramsMatch.slice(1, 1 + paramNames.length)\n const params = Object.fromEntries(\n paramNames.map((n, i) => {\n const value = values[i] as string | undefined\n return [n, value === undefined ? undefined : decodeURIComponent(value)]\n }),\n )\n location.params = params\n } else {\n location.params = {}\n }\n\n // \"descendant\": the URL is a prefix of the route definition (params match any single segment)\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n const defParts = getParts(def)\n const pathParts = getParts(pathname)\n\n let isPrefix = true\n if (pathParts.length > defParts.length) {\n isPrefix = false\n } else {\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart) {\n isPrefix = false\n break\n }\n if (defPart.startsWith(':')) continue\n if (defPart.includes('*')) {\n const prefix = defPart.replace(/\\*\\??$/, '')\n if (pathPart.startsWith(prefix)) continue\n isPrefix = false\n break\n }\n if (defPart !== pathPart) {\n isPrefix = false\n break\n }\n }\n }\n const descendant = !exact && isPrefix\n const unmatched = !exact && !ancestor && !descendant\n\n // For descendant matches, include only params that are already determined\n // by the current (shorter) pathname prefix.\n if (descendant) {\n const descendantParams: Record<string, string> = {}\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart || !pathPart) continue\n if (defPart.startsWith(':')) {\n descendantParams[defPart.replace(/^:/, '').replace(/\\?$/, '')] = decodeURIComponent(pathPart)\n } else if (defPart.includes('*')) {\n descendantParams['*'] = decodeURIComponent(pathPart)\n }\n }\n location.params = descendantParams\n }\n\n return {\n ...location,\n known: true,\n exact,\n ancestor,\n descendant,\n unmatched,\n } as KnownLocation<TDefinition>\n }\n\n private _validateParamsInput(input: unknown): StandardSchemaV1.Result<ParamsOutput<TDefinition>> {\n const paramsEntries = Object.entries(this.params) as Array<[string, boolean]>\n const paramsMap = this.params as Record<string, boolean>\n const requiredParamsKeys = paramsEntries.filter(([, required]) => required).map(([k]) => k)\n const paramsKeys = paramsEntries.map(([k]) => k)\n if (input === undefined) {\n if (requiredParamsKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${requiredParamsKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid route params: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const inputKeys = Object.keys(inputObj)\n const notDefinedKeys = requiredParamsKeys.filter((k) => !inputKeys.includes(k))\n if (notDefinedKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${notDefinedKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n const data: Record<string, string | undefined> = {}\n for (const k of paramsKeys) {\n const v = inputObj[k]\n const required = paramsMap[k]\n if (v === undefined && !required) {\n data[k] = undefined as never\n } else if (typeof v === 'string') {\n data[k] = v\n } else if (typeof v === 'number') {\n data[k] = String(v)\n } else {\n return {\n issues: [{ message: `Invalid route params: expected string, number, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as ParamsOutput<TDefinition>,\n }\n }\n\n private _safeParseSchemaResult<TOutput extends Record<string, unknown>>(\n result: StandardSchemaV1.Result<TOutput>,\n ): _SafeParseInputResult<TOutput> {\n if ('issues' in result) {\n return {\n success: false,\n data: undefined,\n error: new Error(result.issues?.[0]?.message ?? 'Invalid input'),\n }\n }\n return {\n success: true,\n data: result.value,\n error: undefined,\n }\n }\n\n private _parseSchemaResult<TOutput extends Record<string, unknown>>(\n result: StandardSchemaV1.Result<TOutput>,\n ): TOutput {\n const safeResult = this._safeParseSchemaResult(result)\n if (safeResult.error) {\n throw safeResult.error\n }\n return safeResult.data\n }\n\n /** Standard Schema for route params input. */\n readonly schema: SchemaRoute0<ParamsInput<TDefinition>, ParamsOutput<TDefinition>> = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateParamsInput(value),\n types: undefined as unknown as StandardSchemaV1.Types<ParamsInput<TDefinition>, ParamsOutput<TDefinition>>,\n },\n parse: (value) => this._parseSchemaResult(this._validateParamsInput(value)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateParamsInput(value)),\n }\n\n /** True when path structure is equal (param names are ignored). */\n isSame(other: AnyRoute): boolean {\n return (\n getPathTokens(this.definition)\n .map((t) => {\n if (t.kind === 'static') return `s:${t.value}`\n if (t.kind === 'param') return `p:${t.optional ? 'o' : 'r'}`\n return `w:${t.prefix}:${t.optional ? 'o' : 'r'}`\n })\n .join('/') ===\n getPathTokens(other.definition)\n .map((t) => {\n if (t.kind === 'static') return `s:${t.value}`\n if (t.kind === 'param') return `p:${t.optional ? 'o' : 'r'}`\n return `w:${t.prefix}:${t.optional ? 'o' : 'r'}`\n })\n .join('/')\n )\n }\n /** Static convenience wrapper for `isSame`. */\n static isSame(a: AnyRoute | string | undefined, b: AnyRoute | string | undefined): boolean {\n if (!a) {\n if (!b) return true\n return false\n }\n if (!b) {\n return false\n }\n return Route0.create(a).isSame(Route0.create(b))\n }\n\n /** True when current route is more specific/deeper than `other`. */\n isDescendant(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a descendant of other if:\n // - paths are not exactly the same\n // - other's path is a prefix of this path, matching params as wildcards\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n // Root is ancestor of any non-root; thus any non-root is a descendant of root\n if (other.definition === '/' && this.definition !== '/') {\n return true\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n\n // A descendant must be deeper\n if (thisParts.length <= otherParts.length) return false\n\n for (let i = 0; i < otherParts.length; i++) {\n const otherPart = otherParts[i]\n const thisPart = thisParts[i]\n if (otherPart.startsWith(':')) continue\n if (otherPart !== thisPart) return false\n }\n // Not equal (depth already ensures not equal)\n return true\n }\n\n /** True when current route is broader/shallower than `other`. */\n isAncestor(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is an ancestor of other if:\n // - paths are not exactly the same\n // - this path is a prefix of other path, matching params as wildcards\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n // Root is ancestor of any non-root path\n if (this.definition === '/' && other.definition !== '/') {\n return true\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n\n // An ancestor must be shallower\n if (thisParts.length >= otherParts.length) return false\n\n for (let i = 0; i < thisParts.length; i++) {\n const thisPart = thisParts[i]\n const otherPart = otherParts[i]\n if (thisPart.startsWith(':')) continue\n if (thisPart !== otherPart) return false\n }\n // Not equal (depth already ensures not equal)\n return true\n }\n\n /** True when two route patterns can match the same concrete URL. */\n isConflict(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n const thisRegex = this.getRegex()\n const otherRegex = other.getRegex()\n const makeCandidates = (definition: string): string[] => {\n const tokens = getPathTokens(definition)\n const values = (token: PathToken): string[] => {\n if (token.kind === 'static') return [token.value]\n if (token.kind === 'param') return token.optional ? ['', 'x'] : ['x']\n if (token.prefix.length > 0) return [token.prefix, `${token.prefix}-x`, `${token.prefix}/x/y`]\n return ['', 'x', 'x/y']\n }\n let acc: string[] = ['']\n for (const token of tokens) {\n const next: string[] = []\n for (const base of acc) {\n for (const value of values(token)) {\n if (value === '') {\n next.push(base)\n } else if (value.startsWith('/')) {\n next.push(`${base}${value}`)\n } else {\n next.push(`${base}/${value}`)\n }\n }\n }\n acc = next\n }\n if (acc.length === 0) return ['/']\n return Array.from(new Set(acc.map((x) => (x === '' ? '/' : x.replace(/\\/{2,}/g, '/')))))\n }\n const thisCandidates = makeCandidates(this.definition)\n const otherCandidates = makeCandidates(other.definition)\n if (thisCandidates.some((path) => otherRegex.test(path))) return true\n if (otherCandidates.some((path) => thisRegex.test(path))) return true\n return false\n }\n\n /** True when paths are same or can overlap when optional parts are omitted. */\n isMayBeSame(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n return this.isSame(other) || this.isConflict(other)\n }\n\n /** Specificity comparator used for deterministic route ordering. */\n isMoreSpecificThan(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n const rank = (part: string): number => {\n if (part.includes('*')) return -1\n if (part.startsWith(':') && part.endsWith('?')) return 0\n if (part.startsWith(':')) return 1\n return 2\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n for (let i = 0; i < Math.min(thisParts.length, otherParts.length); i++) {\n const thisRank = rank(thisParts[i])\n const otherRank = rank(otherParts[i])\n if (thisRank > otherRank) return true\n if (thisRank < otherRank) return false\n }\n return this.definition < other.definition\n }\n}\n\n/**\n * Typed route collection with deterministic matching order.\n *\n * `Routes.create()` accepts either plain string definitions or route objects\n * and returns a \"pretty\" object with direct route access + helper methods under `._`.\n */\n\nexport class Routes<const T extends RoutesRecord = any> {\n _routes: RoutesRecordHydrated<T>\n _pathsOrdering: string[]\n _keysOrdering: string[]\n _ordered: CallableRoute[]\n\n _: {\n routes: Routes<T>['_routes']\n getLocation: Routes<T>['_getLocation']\n clone: Routes<T>['_clone']\n pathsOrdering: Routes<T>['_pathsOrdering']\n keysOrdering: Routes<T>['_keysOrdering']\n ordered: Routes<T>['_ordered']\n }\n\n private constructor({\n routes,\n isHydrated = false,\n pathsOrdering,\n keysOrdering,\n ordered,\n }: {\n routes: RoutesRecordHydrated<T> | T\n isHydrated?: boolean\n pathsOrdering?: string[]\n keysOrdering?: string[]\n ordered?: CallableRoute[]\n }) {\n this._routes = (\n isHydrated ? (routes as RoutesRecordHydrated<T>) : Routes.hydrate(routes)\n ) as RoutesRecordHydrated<T>\n if (!pathsOrdering || !keysOrdering || !ordered) {\n const ordering = Routes.makeOrdering(this._routes)\n this._pathsOrdering = ordering.pathsOrdering\n this._keysOrdering = ordering.keysOrdering\n this._ordered = this._keysOrdering.map((key) => this._routes[key])\n } else {\n this._pathsOrdering = pathsOrdering\n this._keysOrdering = keysOrdering\n this._ordered = ordered\n }\n this._ = {\n routes: this._routes,\n getLocation: this._getLocation.bind(this),\n clone: this._clone.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n /** Creates and hydrates a typed routes collection. */\n static create<const T extends RoutesRecord>(routes: T, override?: RouteConfigInput): RoutesPretty<T> {\n const result = Routes.prettify(new Routes({ routes }))\n if (!override) {\n return result\n }\n return result._.clone(override)\n }\n\n private static prettify<const T extends RoutesRecord>(instance: Routes<T>): RoutesPretty<T> {\n Object.setPrototypeOf(instance, Routes.prototype)\n Object.defineProperty(instance, Symbol.toStringTag, {\n value: 'Routes',\n })\n Object.assign(instance, {\n clone: instance._clone.bind(instance),\n })\n Object.assign(instance, instance._routes)\n return instance as unknown as RoutesPretty<T>\n }\n\n private static hydrate<const T extends RoutesRecord>(routes: T): RoutesRecordHydrated<T> {\n const result = {} as RoutesRecordHydrated<T>\n for (const key in routes) {\n if (Object.hasOwn(routes, key)) {\n const value = routes[key]\n result[key] = (typeof value === 'string' ? Route0.create(value) : value) as CallableRoute<T[typeof key]>\n }\n }\n return result\n }\n\n /**\n * Matches an input URL against collection routes.\n *\n * Returns first exact match according to precomputed ordering,\n * otherwise returns `UnknownLocation`.\n */\n _getLocation(href: `${string}://${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefRel: `/${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRel: string): UnknownLocation | ExactLocation\n _getLocation(location: AnyLocation): UnknownLocation | ExactLocation\n _getLocation(url: URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation {\n // Find the route that exactly matches the given location\n const input = hrefOrHrefRelOrLocation\n for (const route of this._ordered) {\n const loc = route.getLocation(hrefOrHrefRelOrLocation)\n if (loc.exact) {\n return loc\n }\n }\n // No exact match found, return UnknownLocation\n return typeof input === 'string' ? Route0.getLocation(input) : Route0.getLocation(input)\n }\n\n private static makeOrdering(routes: RoutesRecord): {\n pathsOrdering: string[]\n keysOrdering: string[]\n } {\n const hydrated = Routes.hydrate(routes)\n const entries = Object.entries(hydrated)\n\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n // Sort: overlapping routes by specificity first, otherwise by path depth and alphabetically.\n entries.sort(([_keyA, routeA], [_keyB, routeB]) => {\n const partsA = getParts(routeA.definition)\n const partsB = getParts(routeB.definition)\n\n // 1. Overlapping routes: more specific first\n if (routeA.isMayBeSame(routeB)) {\n if (routeA.isMoreSpecificThan(routeB)) return -1\n if (routeB.isMoreSpecificThan(routeA)) return 1\n }\n\n // 2. Different non-overlapping depth: shorter first\n if (partsA.length !== partsB.length) {\n return partsA.length - partsB.length\n }\n\n // 3. Fallback: alphabetically for deterministic ordering\n return routeA.definition.localeCompare(routeB.definition)\n })\n\n const pathsOrdering = entries.map(([_key, route]) => route.definition)\n const keysOrdering = entries.map(([_key]) => _key)\n return { pathsOrdering, keysOrdering }\n }\n\n /** Returns a cloned routes collection with config applied to each route. */\n _clone(config: RouteConfigInput): RoutesPretty<T> {\n const newRoutes = {} as RoutesRecordHydrated<T>\n for (const key in this._routes) {\n if (Object.hasOwn(this._routes, key)) {\n newRoutes[key] = this._routes[key].clone(config) as CallableRoute<T[typeof key]>\n }\n }\n const instance = new Routes({\n routes: newRoutes,\n isHydrated: true,\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._keysOrdering.map((key) => newRoutes[key]),\n })\n return Routes.prettify(instance)\n }\n\n static _ = {\n prettify: Routes.prettify.bind(Routes),\n hydrate: Routes.hydrate.bind(Routes),\n makeOrdering: Routes.makeOrdering.bind(Routes),\n }\n}\n\n// main\n\n/** Any route instance shape, preserving literal path type when known. */\nexport type AnyRoute<\n T extends Route0<string> | string = string,\n TSearch extends UnknownSearchInput = UnknownSearchInput,\n> = T extends string ? Route0<T, TSearch> : T\n/** Callable route (`route(input)`) plus route instance methods/properties. */\nexport type CallableRoute<\n T extends Route0<string> | string = string,\n TSearch extends UnknownSearchInput = UnknownSearchInput,\n> = AnyRoute<T, TSearch> & AnyRoute<T, TSearch>['get']\n/** Route input accepted by most APIs: definition string or route object/callable. */\nexport type AnyRouteOrDefinition<T extends string = string> = AnyRoute<T> | CallableRoute<T> | T\n/** Route-level runtime configuration. */\nexport type RouteConfigInput = {\n origin?: string\n}\n\n// collection\n\n/** User-provided routes map (plain definitions or route instances). */\nexport type RoutesRecord = Record<string, AnyRoute | string>\n/** Same as `RoutesRecord` but all values normalized to callable routes. */\nexport type RoutesRecordHydrated<TRoutesRecord extends RoutesRecord = any> = {\n [K in keyof TRoutesRecord]: CallableRoute<TRoutesRecord[K]>\n}\n/** Public shape returned by `Routes.create()`. Default `any` so `satisfies RoutesPretty` accepts any created routes. */\nexport type RoutesPretty<TRoutesRecord extends RoutesRecord = any> = RoutesRecordHydrated<TRoutesRecord> &\n Omit<Routes<TRoutesRecord>, '_routes' | '_getLocation' | '_clone' | '_pathsOrdering' | '_keysOrdering' | '_ordered'>\nexport type ExtractRoutesKeys<TRoutes extends RoutesPretty | RoutesRecord> = TRoutes extends RoutesPretty\n ? Extract<keyof TRoutes['_']['routes'], string>\n : TRoutes extends RoutesRecord\n ? Extract<keyof TRoutes, string>\n : never\nexport type ExtractRoute<\n TRoutes extends RoutesPretty | RoutesRecord,\n TKey extends ExtractRoutesKeys<TRoutes>,\n> = TRoutes extends RoutesPretty ? TRoutes['_']['routes'][TKey] : TRoutes extends RoutesRecord ? TRoutes[TKey] : never\n\n// public utils\n\nexport type Definition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['definition']\n : T extends string\n ? T\n : never\nexport type ParamsDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['params']\n : T extends string\n ? _ParamsDefinition<T>\n : undefined\nexport type Extended<\n T extends AnyRoute | string | undefined,\n TSuffixDefinition extends string,\n TSearchInput extends UnknownSearchInput = UnknownSearchInput,\n> = T extends AnyRoute\n ? Route0<PathExtended<T['definition'], TSuffixDefinition>, TSearchInput>\n : T extends string\n ? Route0<PathExtended<T, TSuffixDefinition>, TSearchInput>\n : T extends undefined\n ? Route0<TSuffixDefinition, TSearchInput>\n : never\n\nexport type IsAncestor<T extends AnyRoute | string, TAncestor extends AnyRoute | string> = _IsAncestor<\n Definition<T>,\n Definition<TAncestor>\n>\nexport type IsDescendant<T extends AnyRoute | string, TDescendant extends AnyRoute | string> = _IsDescendant<\n Definition<T>,\n Definition<TDescendant>\n>\nexport type IsSame<T extends AnyRoute | string, TExact extends AnyRoute | string> = _IsSame<\n Definition<T>,\n Definition<TExact>\n>\nexport type IsSameParams<T1 extends AnyRoute | string, T2 extends AnyRoute | string> = _IsSameParams<\n ParamsDefinition<T1>,\n ParamsDefinition<T2>\n>\n\nexport type HasParams<T extends AnyRoute | string> = keyof _ParamsDefinition<Definition<T>> extends never ? false : true\nexport type HasWildcard<T extends AnyRoute | string> = Definition<T> extends `${string}*${string}` ? true : false\nexport type HasRequiredParams<T extends AnyRoute | string> =\n _RequiredParamKeys<Definition<T>> extends never ? false : true\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: ParamsDefinition<T>[K] extends true ? string : string | undefined\n}\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<Definition<T>>\nexport type IsParamsOptional<T extends AnyRoute | string> = HasRequiredParams<Definition<T>> extends true ? false : true\nexport type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<Definition<T>>\n\n// location\n\nexport type LocationParams<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: _ParamsDefinition<TDefinition>[K] extends true\n ? string\n : string | undefined\n}\n\n/**\n * URL location primitives independent from route-matching state.\n *\n * `hrefRel` is relative href and includes `pathname + search + hash`.\n */\nexport type _GeneralLocation = {\n /**\n * Path without search/hash (normalized for trailing slash).\n *\n * Example:\n * - input: `https://example.com/users/42?tab=posts#section`\n * - pathname: `/users/42`\n */\n pathname: string\n /**\n * Parsed query object.\n *\n * Example:\n * - `{ tab: \"posts\", sort: \"desc\" }`\n */\n search: UnknownSearchParsed\n /**\n * Raw query string with leading `?`, if present.\n *\n * Example:\n * - `?tab=posts&sort=desc`\n */\n searchString: string\n /**\n * Raw hash with leading `#`, if present.\n *\n * Example:\n * - `#section`\n */\n hash: string\n /**\n * URL origin for absolute inputs.\n *\n * Example:\n * - href: `https://example.com/users/42`\n * - origin: `https://example.com`\n */\n origin?: string\n /**\n * Full absolute href for absolute inputs.\n *\n * Example:\n * - `https://example.com/users/42?tab=posts#section`\n */\n href?: string\n /**\n * Relative href (`pathname + search + hash`).\n *\n * Example:\n * - pathname: `/users/42`\n * - search: `?tab=posts`\n * - hash: `#section`\n * - hrefRel: `/users/42?tab=posts#section`\n */\n hrefRel: string\n /**\n * Whether input was absolute URL.\n *\n * Examples:\n * - `https://example.com/users/42` -> `true`\n * - `/users/42` -> `false`\n */\n abs: boolean\n port?: string\n host?: string\n hostname?: string\n}\n/** Location state before matching against a concrete route. */\nexport type UnknownLocationState = {\n known: false\n route: undefined\n params: undefined\n exact: false\n ancestor: false\n descendant: false\n unmatched: false\n}\nexport type UnknownLocation = _GeneralLocation & UnknownLocationState\n\n/** Known route context, but no exact/ancestor/descendant relation matched. */\nexport type UnmatchedLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Record<never, never>\n exact: false\n ancestor: false\n descendant: false\n unmatched: true\n}\nexport type UnmatchedLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n UnmatchedLocationState<TRoute>\n\n/** Exact match state for a known route. */\nexport type ExactLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: true\n ancestor: false\n descendant: false\n unmatched: false\n}\nexport type ExactLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n ExactLocationState<TRoute>\n\n/** Input URL is a descendant of route definition (route is ancestor). */\nexport type AncestorLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: false\n ancestor: true\n descendant: false\n unmatched: false\n}\nexport type AncestorLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n AncestorLocationState<TRoute>\n\n/** It is when route not match at all, but params match. */\nexport type WeakAncestorLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: false\n ancestor: true\n descendant: false\n unmatched: false\n}\nexport type WeakAncestorLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n WeakAncestorLocationState<TRoute>\n\n/** Input URL is an ancestor prefix of route definition (route is descendant). */\nexport type DescendantLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Partial<ParamsOutput<TRoute>>\n exact: false\n ancestor: false\n descendant: true\n unmatched: false\n}\nexport type DescendantLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n DescendantLocationState<TRoute>\n\nexport type UnknownSearchParsedValue = string | UnknownSearchParsed | Array<UnknownSearchParsedValue>\nexport interface UnknownSearchParsed {\n [key: string]: UnknownSearchParsedValue\n}\n\nexport type UnknownSearchInputValue =\n | string\n | number\n | boolean\n | undefined\n | UnknownSearchInput\n | Array<UnknownSearchInputValue>\nexport interface UnknownSearchInput {\n [key: string]: UnknownSearchInputValue\n}\n\n/** It is when route not match at all, but params partially match. */\nexport type WeakDescendantLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Partial<ParamsOutput<TRoute>>\n exact: false\n ancestor: false\n descendant: true\n unmatched: false\n}\nexport type WeakDescendantLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n WeakDescendantLocationState<TRoute>\nexport type KnownLocation<TRoute extends AnyRoute | string = AnyRoute | string> =\n | UnmatchedLocation<TRoute>\n | ExactLocation<TRoute>\n | AncestorLocation<TRoute>\n | WeakAncestorLocation<TRoute>\n | DescendantLocation<TRoute>\n | WeakDescendantLocation<TRoute>\nexport type AnyLocation<TRoute extends AnyRoute | string = AnyRoute | string> = UnknownLocation | KnownLocation<TRoute>\n\n// internal utils\n\nexport type _ParamsDefinition<TDefinition extends string> = _ExtractParamsDefinitionBySegments<\n _SplitPathSegments<Definition<TDefinition>>\n>\n\nexport type _Simplify<T> = { [K in keyof T]: T[K] } & {}\nexport type _IfNoKeys<T extends object, TYes, TNo> = keyof T extends never ? TYes : TNo\n\nexport type _ParamsInput<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends infer TDef extends Record<string, boolean>\n ? _IfNoKeys<\n TDef,\n Record<never, never>,\n _Simplify<\n {\n [K in keyof TDef as TDef[K] extends true ? K : never]: string | number\n } & {\n [K in keyof TDef as TDef[K] extends false ? K : never]?: string | number | undefined\n }\n >\n >\n : Record<never, never>\n\nexport type _ParamsInputStringOnly<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends infer TDef extends Record<string, boolean>\n ? _IfNoKeys<\n TDef,\n Record<never, never>,\n _Simplify<\n {\n [K in keyof TDef as TDef[K] extends true ? K : never]: string\n } & {\n [K in keyof TDef as TDef[K] extends false ? K : never]?: string | undefined\n }\n >\n >\n : Record<never, never>\n\nexport type _SplitPathSegments<TPath extends string> = TPath extends ''\n ? []\n : TPath extends '/'\n ? []\n : TPath extends `/${infer Rest}`\n ? _SplitPathSegments<Rest>\n : TPath extends `${infer Segment}/${infer Rest}`\n ? Segment extends ''\n ? _SplitPathSegments<Rest>\n : [Segment, ..._SplitPathSegments<Rest>]\n : TPath extends ''\n ? []\n : [TPath]\n\nexport type _ParamDefinitionFromSegment<TSegment extends string> = TSegment extends `:${infer Name}?`\n ? { [K in Name]: false }\n : TSegment extends `:${infer Name}`\n ? { [K in Name]: true }\n : TSegment extends `${string}*?`\n ? { '*': false }\n : TSegment extends `${string}*`\n ? { '*': true }\n : Record<never, never>\n\nexport type _MergeParamDefinitions<A extends Record<string, boolean>, B extends Record<string, boolean>> = {\n [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never\n}\n\nexport type _ExtractParamsDefinitionBySegments<TSegments extends string[]> = TSegments extends [\n infer Segment extends string,\n ...infer Rest extends string[],\n]\n ? _MergeParamDefinitions<_ParamDefinitionFromSegment<Segment>, _ExtractParamsDefinitionBySegments<Rest>>\n : Record<never, never>\n\nexport type _RequiredParamKeys<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: _ParamsDefinition<TDefinition>[K] extends true ? K : never\n}[keyof _ParamsDefinition<TDefinition>]\nexport type ReplacePathParams<S extends string> = S extends `${infer Head}:${infer Tail}`\n ? // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Tail extends `${infer _Param}/${infer Rest}`\n ? ReplacePathParams<`${Head}${string}/${Rest}`>\n : `${Head}${string}`\n : S\nexport type DedupeSlashes<S extends string> = S extends `${infer A}//${infer B}` ? DedupeSlashes<`${A}/${B}`> : S\nexport type EmptyRecord = Record<never, never>\nexport type JoinPath<Parent extends string, Suffix extends string> = DedupeSlashes<\n Definition<Parent> extends infer A extends string\n ? Definition<Suffix> extends infer B extends string\n ? A extends ''\n ? B extends ''\n ? ''\n : B extends `/${string}`\n ? B\n : `/${B}`\n : B extends ''\n ? A\n : A extends `${string}/`\n ? `${A}${B}`\n : B extends `/${string}`\n ? `${A}${B}`\n : `${A}/${B}`\n : never\n : never\n>\n\nexport type OnlyIfNoParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends false ? Yes : No\nexport type OnlyIfHasParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends true ? Yes : No\n\nexport type PathExtended<\n TSourceDefinitionDefinition extends string,\n TSuffixDefinitionDefinition extends string,\n> = `${JoinPath<StripTrailingWildcard<TSourceDefinitionDefinition>, TSuffixDefinitionDefinition>}`\n\nexport type StripTrailingWildcard<TDefinition extends string> = TDefinition extends `${infer TPath}*?`\n ? TPath\n : TDefinition extends `${infer TPath}*`\n ? TPath\n : TDefinition\n\nexport type IsAny<T> = 0 extends 1 & T ? true : false\n\nexport type _IsSameParams<T1 extends object | undefined, T2 extends object | undefined> = T1 extends undefined\n ? T2 extends undefined\n ? true\n : false\n : T2 extends undefined\n ? false\n : T1 extends T2\n ? T2 extends T1\n ? true\n : false\n : false\n\nexport type _IsAncestor<T extends string, TAncestor extends string> = T extends TAncestor\n ? false\n : T extends `${TAncestor}${string}`\n ? true\n : false\nexport type _IsDescendant<T extends string, TDescendant extends string> = TDescendant extends T\n ? false\n : TDescendant extends `${T}${string}`\n ? true\n : false\nexport type _IsSame<T extends string, TExact extends string> = T extends TExact\n ? TExact extends T\n ? true\n : false\n : false\n\nexport type _SafeParseInputResult<TInputParsed extends Record<string, unknown>> =\n | {\n success: true\n data: TInputParsed\n error: undefined\n }\n | {\n success: false\n data: undefined\n error: Error\n }\n\nexport type SchemaRoute0<\n TInput extends Record<string, unknown>,\n TOutput extends Record<string, unknown>,\n> = StandardSchemaV1<TInput, TOutput> & {\n parse: (input: unknown) => TOutput\n safeParse: (input: unknown) => _SafeParseInputResult<TOutput>\n}\n"],"mappings":"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","names":["searchInput","hashInput","paramsInput","absOriginInput"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\nimport { parse as parseSearchQuery, stringify as stringifySearchQuery } from '@devp0nt/flat0'\n\nexport type PathToken =\n | { kind: 'static'; value: string }\n | { kind: 'param'; name: string; optional: boolean }\n | { kind: 'wildcard'; prefix: string; optional: boolean }\n\nconst escapeRegex = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nconst getPathSegments = (definition: string): string[] => {\n if (definition === '' || definition === '/') return []\n return definition.split('/').filter(Boolean)\n}\n\nconst getPathTokens = (definition: string): PathToken[] => {\n const segments = getPathSegments(definition)\n return segments.map((segment): PathToken => {\n const param = segment.match(/^:([A-Za-z0-9_]+)(\\?)?$/)\n if (param) {\n return { kind: 'param', name: param[1], optional: param[2] === '?' }\n }\n if (segment === '*' || segment === '*?') {\n return { kind: 'wildcard', prefix: '', optional: segment.endsWith('?') }\n }\n const wildcard = segment.match(/^(.*)\\*(\\?)?$/)\n if (wildcard && !segment.includes('\\\\*')) {\n return { kind: 'wildcard', prefix: wildcard[1], optional: wildcard[2] === '?' }\n }\n return { kind: 'static', value: segment }\n })\n}\n\nconst getPathRegexBaseStrictString = (definition: string): string => {\n const tokens = getPathTokens(definition)\n if (tokens.length === 0) return ''\n let pattern = ''\n for (const token of tokens) {\n if (token.kind === 'static') {\n pattern += `/${escapeRegex(token.value)}`\n continue\n }\n if (token.kind === 'param') {\n pattern += token.optional ? '(?:/([^/]+))?' : '/([^/]+)'\n continue\n }\n if (token.prefix.length > 0) {\n pattern += `/${escapeRegex(token.prefix)}(.*)`\n } else {\n // Wouter-compatible splat: /orders/* matches /orders and /orders/...\n pattern += '(?:/(.*))?'\n }\n }\n return pattern\n}\n\nconst getPathCaptureKeys = (definition: string): string[] => {\n const keys: string[] = []\n for (const token of getPathTokens(definition)) {\n if (token.kind === 'param') keys.push(token.name)\n if (token.kind === 'wildcard') keys.push('*')\n }\n return keys\n}\n\nconst getPathParamsDefinition = (definition: string): Record<string, boolean> => {\n const entries = getPathTokens(definition)\n .filter((t) => t.kind !== 'static')\n .map((t): [string, boolean] => (t.kind === 'param' ? [t.name, !t.optional] : ['*', !t.optional]))\n return Object.fromEntries(entries)\n}\n\nconst validatePathDefinition = (definition: string): void => {\n const segments = getPathSegments(definition)\n const wildcardSegments = segments.filter((segment) => segment.includes('*'))\n if (wildcardSegments.length === 0) return\n if (wildcardSegments.length > 1) {\n throw new Error(`Invalid route definition \"${definition}\": only one wildcard segment is allowed`)\n }\n const wildcardSegmentIndex = segments.findIndex((segment) => segment.includes('*'))\n const wildcardSegment = segments[wildcardSegmentIndex]\n if (!wildcardSegment.match(/^(?:\\*|\\*\\?|[^*]+\\*|\\S+\\*\\?)$/)) {\n throw new Error(`Invalid route definition \"${definition}\": wildcard must be trailing in its segment`)\n }\n if (wildcardSegmentIndex !== segments.length - 1) {\n throw new Error(`Invalid route definition \"${definition}\": wildcard segment is allowed only at the end`)\n }\n}\n\nconst stripTrailingWildcard = (definition: string): string => definition.replace(/\\*\\??$/, '')\n\n/**\n * Strongly typed route descriptor and URL builder.\n *\n * A route definition uses:\n * - path params: `/users/:id`\n * - named search keys: `/users&tab&sort`\n * - loose search mode: trailing `&`, e.g. `/users&`\n *\n * Instances are callable (same as `.get()`), so `route(input)` and\n * `route.get(input)` are equivalent.\n */\nexport class Route0<TDefinition extends string, TSearchInput extends UnknownSearchInput = UnknownSearchInput> {\n readonly definition: TDefinition\n readonly params: _ParamsDefinition<TDefinition>\n private _origin: string | undefined\n private _callable: CallableRoute<TDefinition, TSearchInput>\n\n Infer: {\n ParamsDefinition: _ParamsDefinition<TDefinition>\n ParamsInput: _ParamsInput<TDefinition>\n ParamsInputStringOnly: _ParamsInputStringOnly<TDefinition>\n ParamsOutput: ParamsOutput<TDefinition>\n SearchInput: TSearchInput\n } = null as never\n\n /** Base URL used when generating absolute URLs (`abs: true`). */\n get origin(): string {\n if (!this._origin) {\n throw new Error(\n 'origin for route ' +\n this.definition +\n ' is not set, please provide it like Route0.create(route, {origin: \"https://example.com\"}) in config or set via clones like routes._.clone({origin: \"https://example.com\"})',\n )\n }\n return this._origin\n }\n set origin(origin: string) {\n this._origin = origin\n }\n\n private constructor(definition: TDefinition, config: RouteConfigInput = {}) {\n validatePathDefinition(definition)\n this.definition = definition\n this.params = Route0._getParamsDefinitionByDefinition(definition)\n\n const { origin } = config\n if (origin && typeof origin === 'string' && origin.length) {\n this._origin = origin\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } } | undefined\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this._origin = g.location.origin\n } else {\n this._origin = undefined\n }\n }\n const callable = this.get.bind(this)\n Object.setPrototypeOf(callable, this)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: this.definition,\n })\n this._callable = callable as CallableRoute<TDefinition, TSearchInput>\n }\n\n /**\n * Creates a callable route instance.\n *\n * If an existing route/callable route is provided, it is cloned.\n */\n static create<TDefinition extends string>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n config?: RouteConfigInput,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function' || typeof definition === 'object') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n const original = new Route0<TDefinition>(definition, config)\n return original._callable\n }\n\n /**\n * Normalizes a definition/route into a callable route.\n *\n * Unlike `create`, passing a callable route returns the same instance.\n */\n static from<TDefinition extends string, TSearchInput extends UnknownSearchInput>(\n definition: TDefinition | AnyRoute<TDefinition, TSearchInput> | CallableRoute<TDefinition, TSearchInput>,\n ): CallableRoute<TDefinition, TSearchInput> {\n if (typeof definition === 'function') {\n return definition\n }\n const original = typeof definition === 'object' ? definition : new Route0<TDefinition>(definition)\n return original._callable as CallableRoute<TDefinition, TSearchInput>\n }\n\n private static _getAbsPath(origin: string, url: string) {\n return new URL(url, origin).toString().replace(/\\/$/, '')\n }\n\n private static _getParamsDefinitionByDefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _ParamsDefinition<TDefinition> {\n return getPathParamsDefinition(definition) as _ParamsDefinition<TDefinition>\n }\n\n search<TNewSearchInput extends UnknownSearchInput>(): CallableRoute<TDefinition, TNewSearchInput> {\n return this._callable as CallableRoute<TDefinition, TNewSearchInput>\n }\n\n /** Extends the current route definition by appending a suffix route. */\n extend<TSuffixDefinition extends string>(\n suffixDefinition: TSuffixDefinition,\n ): CallableRoute<PathExtended<TDefinition, TSuffixDefinition>, TSearchInput> {\n const sourceDefinitionWithoutWildcard = stripTrailingWildcard(this.definition)\n const definition = `${sourceDefinitionWithoutWildcard}/${suffixDefinition}`.replace(/\\/{2,}/g, '/')\n return Route0.create<PathExtended<TDefinition, TSuffixDefinition>>(\n definition as PathExtended<TDefinition, TSuffixDefinition>,\n { origin: this._origin },\n )\n }\n\n get(...args: IsParamsOptional<TDefinition> extends true ? [abs: boolean | string | undefined] : never): string\n get(\n ...args: IsParamsOptional<TDefinition> extends true\n ? [input?: GetPathInput<TDefinition, TSearchInput> | undefined, abs?: boolean | string | undefined]\n : [input: GetPathInput<TDefinition, TSearchInput>, abs?: boolean | string | undefined]\n ): string\n\n // implementation\n get(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, absOriginInput, hashInput } = ((): {\n searchInput: Record<string, unknown>\n paramsInput: Record<string, string | undefined>\n absInput: boolean\n absOriginInput: string | undefined\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n absOriginInput: undefined,\n hashInput: undefined,\n }\n }\n const [input, abs] = ((): [Record<string, unknown>, boolean | string | undefined] => {\n if (typeof args[0] === 'object' && args[0] !== null) {\n return [args[0], args[1]] as [Record<string, unknown>, boolean | string | undefined]\n }\n if (typeof args[1] === 'object' && args[1] !== null) {\n return [args[1], args[0]] as [Record<string, unknown>, boolean | string | undefined]\n }\n if (typeof args[0] === 'boolean' || typeof args[0] === 'string') {\n return [{}, args[0]]\n }\n if (typeof args[1] === 'boolean' || typeof args[1] === 'string') {\n return [{}, args[1]]\n }\n return [{}, undefined]\n })()\n let searchInput: Record<string, unknown> = {}\n let hashInput: string | undefined = undefined\n const paramsInput: Record<string, string | undefined> = {}\n for (const [key, value] of Object.entries(input)) {\n if (key === '?' && typeof value === 'object' && value !== null) {\n searchInput = value as Record<string, unknown>\n } else if (key === '#' && (typeof value === 'string' || typeof value === 'number')) {\n hashInput = String(value)\n } else if (key in this.params && (typeof value === 'string' || typeof value === 'number')) {\n Object.assign(paramsInput, { [key]: String(value) })\n }\n }\n const absOriginInput = typeof abs === 'string' && abs.length > 0 ? abs : undefined\n return {\n searchInput,\n paramsInput,\n absInput: absOriginInput !== undefined || abs === true,\n absOriginInput,\n hashInput,\n }\n })()\n\n // create url\n\n let url = this.definition as string\n // optional named params like /:id?\n url = url.replace(/\\/:([A-Za-z0-9_]+)\\?/g, (_m, k) => {\n const value = paramsInput[k]\n if (value === undefined) return ''\n return `/${encodeURIComponent(String(value))}`\n })\n // required named params\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n url = url.replace(/:([A-Za-z0-9_]+)(?!\\?)/g, (_m, k) => encodeURIComponent(String(paramsInput?.[k] ?? 'undefined')))\n // optional wildcard segment (/*?)\n url = url.replace(/\\/\\*\\?/g, () => {\n const value = paramsInput['*']\n if (value === undefined) return ''\n const stringValue = String(value)\n return stringValue.startsWith('/') ? stringValue : `/${stringValue}`\n })\n // required wildcard segment (/*)\n url = url.replace(/\\/\\*/g, () => {\n const value = String(paramsInput['*'] ?? '')\n return value.startsWith('/') ? value : `/${value}`\n })\n // optional wildcard inline (e.g. /app*?)\n url = url.replace(/\\*\\?/g, () => String(paramsInput['*'] ?? ''))\n // required wildcard inline (e.g. /app*)\n url = url.replace(/\\*/g, () => String(paramsInput['*'] ?? ''))\n // search params\n const searchString = stringifySearchQuery(searchInput)\n url = [url, searchString].filter(Boolean).join('?')\n // dedupe slashes\n url = url.replace(/\\/{2,}/g, '/')\n // absolute\n url = absInput ? Route0._getAbsPath(absOriginInput || this.origin, url) : url\n // hash\n if (hashInput !== undefined) {\n url = `${url}#${hashInput}`\n }\n\n return url\n }\n\n /** Returns path param keys extracted from route definition. */\n getParamsKeys(): string[] {\n return Object.keys(this.params)\n }\n\n getPathTokens(): PathToken[] {\n return getPathTokens(this.definition)\n }\n\n /** Clones route with optional config override. */\n clone(config?: RouteConfigInput): CallableRoute<TDefinition> {\n return Route0.create(this.definition, config)\n }\n\n getRegexBaseStrictString(): string {\n return getPathRegexBaseStrictString(this.definition)\n }\n\n getRegexBaseString(): string {\n return this.getRegexBaseStrictString().replace(/\\/+$/, '') + '/?' // remove trailing slashes and add optional slash\n }\n\n getRegexStrictString(): string {\n return `^${this.getRegexBaseStrictString()}$`\n }\n\n getRegexString(): string {\n return `^${this.getRegexBaseString()}$`\n }\n\n getRegexStrict(): RegExp {\n return new RegExp(this.getRegexStrictString())\n }\n\n getRegex(): RegExp {\n return new RegExp(this.getRegexString())\n }\n\n /** Creates a grouped strict regex pattern string from many routes. */\n static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a strict grouped regex from many routes. */\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Creates a grouped regex pattern string from many routes. */\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a grouped regex from many routes. */\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Converts any location shape to relative form (removes host/origin fields). */\n static toRelLocation<TLocation extends AnyLocation>(location: TLocation): TLocation {\n return {\n ...location,\n abs: false,\n origin: undefined,\n href: undefined,\n port: undefined,\n host: undefined,\n hostname: undefined,\n }\n }\n\n /** Converts a location to absolute form using provided origin URL. */\n static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, origin: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, origin)\n return {\n ...location,\n abs: true,\n origin: url.origin,\n href: url.href,\n port: url.port,\n host: url.host,\n hostname: url.hostname,\n }\n }\n\n /**\n * Parses a URL-like input into raw location object (without route knowledge).\n *\n * Result is always `UnknownLocation` because no route matching is applied.\n */\n static getLocation(href: `${string}://${string}`): UnknownLocation\n static getLocation(hrefRel: `/${string}`): UnknownLocation\n static getLocation(hrefOrHrefRel: string): UnknownLocation\n static getLocation(location: AnyLocation): UnknownLocation\n static getLocation(url: URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return Route0.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n // Check if it's an absolute URL (starts with scheme://)\n const abs = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(hrefOrHrefRelOrLocation)\n\n // Use dummy base only if relative\n const base = abs ? undefined : 'http://example.com'\n const url = new URL(hrefOrHrefRelOrLocation, base)\n\n // Parse search query to object form\n const search = parseSearchQuery(url.search)\n\n // Normalize pathname (remove trailing slash except for root)\n let pathname = url.pathname\n if (pathname.length > 1 && pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1)\n }\n\n // Common derived values\n const hrefRel = pathname + url.search + url.hash\n\n // Build the location object consistent with _GeneralLocation\n const location: UnknownLocation = {\n pathname,\n search,\n searchString: url.search,\n hash: url.hash,\n origin: abs ? url.origin : undefined,\n href: abs ? url.href : undefined,\n hrefRel,\n abs,\n\n // extra host-related fields (available even for relative with dummy base)\n host: abs ? url.host : undefined,\n hostname: abs ? url.hostname : undefined,\n port: abs ? url.port || undefined : undefined,\n\n // specific to UnknownLocation\n params: undefined,\n route: undefined,\n known: false,\n exact: false,\n ancestor: false,\n descendant: false,\n unmatched: false,\n }\n\n return location\n }\n\n /**\n * Parses input and matches it against this route definition.\n *\n * Result includes relation flags:\n * - `exact`\n * - `ancestor`\n * - `descendant`\n * - `unmatched`\n */\n getLocation(href: `${string}://${string}`): KnownLocation<TDefinition>\n getLocation(hrefRel: `/${string}`): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRel: string): KnownLocation<TDefinition>\n getLocation(location: AnyLocation): KnownLocation<TDefinition>\n getLocation(url: AnyLocation): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition> {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return this.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n const location = Route0.getLocation(hrefOrHrefRelOrLocation) as never as KnownLocation<TDefinition>\n location.route = this.definition as Definition<TDefinition>\n location.params = {}\n\n // Normalize pathname (no trailing slash except root)\n const pathname =\n location.pathname.length > 1 && location.pathname.endsWith('/')\n ? location.pathname.slice(0, -1)\n : location.pathname\n\n const paramNames = getPathCaptureKeys(this.definition)\n const def =\n this.definition.length > 1 && this.definition.endsWith('/') ? this.definition.slice(0, -1) : this.definition\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const ancestorRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n const ancestorMatch = pathname.match(ancestorRe)\n const exact = !!exactMatch\n const ancestor = !exact && !!ancestorMatch\n\n // Parse params for exact and ancestor matches.\n const paramsMatch = exactMatch || (ancestor ? ancestorMatch : null)\n if (paramsMatch) {\n const values = paramsMatch.slice(1, 1 + paramNames.length)\n const params = Object.fromEntries(\n paramNames.map((n, i) => {\n const value = values[i] as string | undefined\n return [n, value === undefined ? undefined : decodeURIComponent(value)]\n }),\n )\n location.params = params\n } else {\n location.params = {}\n }\n\n // \"descendant\": the URL is a prefix of the route definition (params match any single segment)\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n const defParts = getParts(def)\n const pathParts = getParts(pathname)\n\n let isPrefix = true\n if (pathParts.length > defParts.length) {\n isPrefix = false\n } else {\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart) {\n isPrefix = false\n break\n }\n if (defPart.startsWith(':')) continue\n if (defPart.includes('*')) {\n const prefix = defPart.replace(/\\*\\??$/, '')\n if (pathPart.startsWith(prefix)) continue\n isPrefix = false\n break\n }\n if (defPart !== pathPart) {\n isPrefix = false\n break\n }\n }\n }\n const descendant = !exact && isPrefix\n const unmatched = !exact && !ancestor && !descendant\n\n // For descendant matches, include only params that are already determined\n // by the current (shorter) pathname prefix.\n if (descendant) {\n const descendantParams: Record<string, string> = {}\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart || !pathPart) continue\n if (defPart.startsWith(':')) {\n descendantParams[defPart.replace(/^:/, '').replace(/\\?$/, '')] = decodeURIComponent(pathPart)\n } else if (defPart.includes('*')) {\n descendantParams['*'] = decodeURIComponent(pathPart)\n }\n }\n location.params = descendantParams\n }\n\n return {\n ...location,\n known: true,\n exact,\n ancestor,\n descendant,\n unmatched,\n } as KnownLocation<TDefinition>\n }\n\n private _validateParamsInput(input: unknown): StandardSchemaV1.Result<ParamsOutput<TDefinition>> {\n const paramsEntries = Object.entries(this.params) as Array<[string, boolean]>\n const paramsMap = this.params as Record<string, boolean>\n const requiredParamsKeys = paramsEntries.filter(([, required]) => required).map(([k]) => k)\n const paramsKeys = paramsEntries.map(([k]) => k)\n if (input === undefined) {\n if (requiredParamsKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${requiredParamsKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid route params: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const inputKeys = Object.keys(inputObj)\n const notDefinedKeys = requiredParamsKeys.filter((k) => !inputKeys.includes(k))\n if (notDefinedKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${notDefinedKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n const data: Record<string, string | undefined> = {}\n for (const k of paramsKeys) {\n const v = inputObj[k]\n const required = paramsMap[k]\n if (v === undefined && !required) {\n data[k] = undefined as never\n } else if (typeof v === 'string') {\n data[k] = v\n } else if (typeof v === 'number') {\n data[k] = String(v)\n } else {\n return {\n issues: [{ message: `Invalid route params: expected string, number, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as ParamsOutput<TDefinition>,\n }\n }\n\n private _safeParseSchemaResult<TOutput extends Record<string, unknown>>(\n result: StandardSchemaV1.Result<TOutput>,\n ): _SafeParseInputResult<TOutput> {\n if ('issues' in result) {\n return {\n success: false,\n data: undefined,\n error: new Error(result.issues?.[0]?.message ?? 'Invalid input'),\n }\n }\n return {\n success: true,\n data: result.value,\n error: undefined,\n }\n }\n\n private _parseSchemaResult<TOutput extends Record<string, unknown>>(\n result: StandardSchemaV1.Result<TOutput>,\n ): TOutput {\n const safeResult = this._safeParseSchemaResult(result)\n if (safeResult.error) {\n throw safeResult.error\n }\n return safeResult.data\n }\n\n /** Standard Schema for route params input. */\n readonly schema: SchemaRoute0<ParamsInput<TDefinition>, ParamsOutput<TDefinition>> = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateParamsInput(value),\n types: undefined as unknown as StandardSchemaV1.Types<ParamsInput<TDefinition>, ParamsOutput<TDefinition>>,\n },\n parse: (value) => this._parseSchemaResult(this._validateParamsInput(value)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateParamsInput(value)),\n }\n\n /** True when path structure is equal (param names are ignored). */\n isSame(other: AnyRoute): boolean {\n return (\n getPathTokens(this.definition)\n .map((t) => {\n if (t.kind === 'static') return `s:${t.value}`\n if (t.kind === 'param') return `p:${t.optional ? 'o' : 'r'}`\n return `w:${t.prefix}:${t.optional ? 'o' : 'r'}`\n })\n .join('/') ===\n getPathTokens(other.definition)\n .map((t) => {\n if (t.kind === 'static') return `s:${t.value}`\n if (t.kind === 'param') return `p:${t.optional ? 'o' : 'r'}`\n return `w:${t.prefix}:${t.optional ? 'o' : 'r'}`\n })\n .join('/')\n )\n }\n /** Static convenience wrapper for `isSame`. */\n static isSame(a: AnyRoute | string | undefined, b: AnyRoute | string | undefined): boolean {\n if (!a) {\n if (!b) return true\n return false\n }\n if (!b) {\n return false\n }\n return Route0.create(a).isSame(Route0.create(b))\n }\n\n /** True when current route is more specific/deeper than `other`. */\n isDescendant(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a descendant of other if:\n // - paths are not exactly the same\n // - other's path is a prefix of this path, matching params as wildcards\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n // Root is ancestor of any non-root; thus any non-root is a descendant of root\n if (other.definition === '/' && this.definition !== '/') {\n return true\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n\n // A descendant must be deeper\n if (thisParts.length <= otherParts.length) return false\n\n for (let i = 0; i < otherParts.length; i++) {\n const otherPart = otherParts[i]\n const thisPart = thisParts[i]\n if (otherPart.startsWith(':')) continue\n if (otherPart !== thisPart) return false\n }\n // Not equal (depth already ensures not equal)\n return true\n }\n\n /** True when current route is broader/shallower than `other`. */\n isAncestor(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is an ancestor of other if:\n // - paths are not exactly the same\n // - this path is a prefix of other path, matching params as wildcards\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n // Root is ancestor of any non-root path\n if (this.definition === '/' && other.definition !== '/') {\n return true\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n\n // An ancestor must be shallower\n if (thisParts.length >= otherParts.length) return false\n\n for (let i = 0; i < thisParts.length; i++) {\n const thisPart = thisParts[i]\n const otherPart = otherParts[i]\n if (thisPart.startsWith(':')) continue\n if (thisPart !== otherPart) return false\n }\n // Not equal (depth already ensures not equal)\n return true\n }\n\n /** True when two route patterns can match the same concrete URL. */\n isConflict(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n const thisRegex = this.getRegex()\n const otherRegex = other.getRegex()\n const makeCandidates = (definition: string): string[] => {\n const tokens = getPathTokens(definition)\n const values = (token: PathToken): string[] => {\n if (token.kind === 'static') return [token.value]\n if (token.kind === 'param') return token.optional ? ['', 'x'] : ['x']\n if (token.prefix.length > 0) return [token.prefix, `${token.prefix}-x`, `${token.prefix}/x/y`]\n return ['', 'x', 'x/y']\n }\n let acc: string[] = ['']\n for (const token of tokens) {\n const next: string[] = []\n for (const base of acc) {\n for (const value of values(token)) {\n if (value === '') {\n next.push(base)\n } else if (value.startsWith('/')) {\n next.push(`${base}${value}`)\n } else {\n next.push(`${base}/${value}`)\n }\n }\n }\n acc = next\n }\n if (acc.length === 0) return ['/']\n return Array.from(new Set(acc.map((x) => (x === '' ? '/' : x.replace(/\\/{2,}/g, '/')))))\n }\n const thisCandidates = makeCandidates(this.definition)\n const otherCandidates = makeCandidates(other.definition)\n if (thisCandidates.some((path) => otherRegex.test(path))) return true\n if (otherCandidates.some((path) => thisRegex.test(path))) return true\n return false\n }\n\n /** True when paths are same or can overlap when optional parts are omitted. */\n isMayBeSame(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n return this.isSame(other) || this.isConflict(other)\n }\n\n /** Specificity comparator used for deterministic route ordering. */\n isMoreSpecificThan(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n const rank = (part: string): number => {\n if (part.includes('*')) return -1\n if (part.startsWith(':') && part.endsWith('?')) return 0\n if (part.startsWith(':')) return 1\n return 2\n }\n const thisParts = getParts(this.definition)\n const otherParts = getParts(other.definition)\n for (let i = 0; i < Math.min(thisParts.length, otherParts.length); i++) {\n const thisRank = rank(thisParts[i])\n const otherRank = rank(otherParts[i])\n if (thisRank > otherRank) return true\n if (thisRank < otherRank) return false\n }\n return this.definition < other.definition\n }\n}\n\n/**\n * Typed route collection with deterministic matching order.\n *\n * `Routes.create()` accepts either plain string definitions or route objects\n * and returns a \"pretty\" object with direct route access + helper methods under `._`.\n */\n\nexport class Routes<const T extends RoutesRecord = any> {\n _routes: RoutesRecordHydrated<T>\n _pathsOrdering: string[]\n _keysOrdering: string[]\n _ordered: CallableRoute[]\n\n _: {\n routes: Routes<T>['_routes']\n getLocation: Routes<T>['_getLocation']\n clone: Routes<T>['_clone']\n pathsOrdering: Routes<T>['_pathsOrdering']\n keysOrdering: Routes<T>['_keysOrdering']\n ordered: Routes<T>['_ordered']\n }\n\n private constructor({\n routes,\n isHydrated = false,\n pathsOrdering,\n keysOrdering,\n ordered,\n }: {\n routes: RoutesRecordHydrated<T> | T\n isHydrated?: boolean\n pathsOrdering?: string[]\n keysOrdering?: string[]\n ordered?: CallableRoute[]\n }) {\n this._routes = (\n isHydrated ? (routes as RoutesRecordHydrated<T>) : Routes.hydrate(routes)\n ) as RoutesRecordHydrated<T>\n if (!pathsOrdering || !keysOrdering || !ordered) {\n const ordering = Routes.makeOrdering(this._routes)\n this._pathsOrdering = ordering.pathsOrdering\n this._keysOrdering = ordering.keysOrdering\n this._ordered = this._keysOrdering.map((key) => this._routes[key])\n } else {\n this._pathsOrdering = pathsOrdering\n this._keysOrdering = keysOrdering\n this._ordered = ordered\n }\n this._ = {\n routes: this._routes,\n getLocation: this._getLocation.bind(this),\n clone: this._clone.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n /** Creates and hydrates a typed routes collection. */\n static create<const T extends RoutesRecord>(routes: T, override?: RouteConfigInput): RoutesPretty<T> {\n const result = Routes.prettify(new Routes({ routes }))\n if (!override) {\n return result\n }\n return result._.clone(override)\n }\n\n private static prettify<const T extends RoutesRecord>(instance: Routes<T>): RoutesPretty<T> {\n Object.setPrototypeOf(instance, Routes.prototype)\n Object.defineProperty(instance, Symbol.toStringTag, {\n value: 'Routes',\n })\n Object.assign(instance, {\n clone: instance._clone.bind(instance),\n })\n Object.assign(instance, instance._routes)\n return instance as unknown as RoutesPretty<T>\n }\n\n private static hydrate<const T extends RoutesRecord>(routes: T): RoutesRecordHydrated<T> {\n const result = {} as RoutesRecordHydrated<T>\n for (const key in routes) {\n if (Object.hasOwn(routes, key)) {\n const value = routes[key]\n result[key] = (typeof value === 'string' ? Route0.create(value) : value) as CallableRoute<T[typeof key]>\n }\n }\n return result\n }\n\n /**\n * Matches an input URL against collection routes.\n *\n * Returns first exact match according to precomputed ordering,\n * otherwise returns `UnknownLocation`.\n */\n _getLocation(href: `${string}://${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefRel: `/${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRel: string): UnknownLocation | ExactLocation\n _getLocation(location: AnyLocation): UnknownLocation | ExactLocation\n _getLocation(url: URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation {\n // Find the route that exactly matches the given location\n const input = hrefOrHrefRelOrLocation\n for (const route of this._ordered) {\n const loc = route.getLocation(hrefOrHrefRelOrLocation)\n if (loc.exact) {\n return loc\n }\n }\n // No exact match found, return UnknownLocation\n return typeof input === 'string' ? Route0.getLocation(input) : Route0.getLocation(input)\n }\n\n private static makeOrdering(routes: RoutesRecord): {\n pathsOrdering: string[]\n keysOrdering: string[]\n } {\n const hydrated = Routes.hydrate(routes)\n const entries = Object.entries(hydrated)\n\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n // Sort: overlapping routes by specificity first, otherwise by path depth and alphabetically.\n entries.sort(([_keyA, routeA], [_keyB, routeB]) => {\n const partsA = getParts(routeA.definition)\n const partsB = getParts(routeB.definition)\n\n // 1. Overlapping routes: more specific first\n if (routeA.isMayBeSame(routeB)) {\n if (routeA.isMoreSpecificThan(routeB)) return -1\n if (routeB.isMoreSpecificThan(routeA)) return 1\n }\n\n // 2. Different non-overlapping depth: shorter first\n if (partsA.length !== partsB.length) {\n return partsA.length - partsB.length\n }\n\n // 3. Fallback: alphabetically for deterministic ordering\n return routeA.definition.localeCompare(routeB.definition)\n })\n\n const pathsOrdering = entries.map(([_key, route]) => route.definition)\n const keysOrdering = entries.map(([_key]) => _key)\n return { pathsOrdering, keysOrdering }\n }\n\n /** Returns a cloned routes collection with config applied to each route. */\n _clone(config: RouteConfigInput): RoutesPretty<T> {\n const newRoutes = {} as RoutesRecordHydrated<T>\n for (const key in this._routes) {\n if (Object.hasOwn(this._routes, key)) {\n newRoutes[key] = this._routes[key].clone(config) as CallableRoute<T[typeof key]>\n }\n }\n const instance = new Routes({\n routes: newRoutes,\n isHydrated: true,\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._keysOrdering.map((key) => newRoutes[key]),\n })\n return Routes.prettify(instance)\n }\n\n static _ = {\n prettify: Routes.prettify.bind(Routes),\n hydrate: Routes.hydrate.bind(Routes),\n makeOrdering: Routes.makeOrdering.bind(Routes),\n }\n}\n\n// main\n\n/** Any route instance shape, preserving literal path type when known. */\nexport type AnyRoute<\n T extends Route0<string> | string = string,\n TSearch extends UnknownSearchInput = UnknownSearchInput,\n> = T extends string ? Route0<T, TSearch> : T\n/** Callable route (`route(input)`) plus route instance methods/properties. */\nexport type CallableRoute<\n T extends Route0<string> | string = string,\n TSearch extends UnknownSearchInput = UnknownSearchInput,\n> = AnyRoute<T, TSearch> & AnyRoute<T, TSearch>['get']\n/** Route input accepted by most APIs: definition string or route object/callable. */\nexport type AnyRouteOrDefinition<T extends string = string> = AnyRoute<T> | CallableRoute<T> | T\n/** Route-level runtime configuration. */\nexport type RouteConfigInput = {\n origin?: string\n}\n\n// collection\n\n/** User-provided routes map (plain definitions or route instances). */\nexport type RoutesRecord = Record<string, AnyRoute | string>\n/** Same as `RoutesRecord` but all values normalized to callable routes. */\nexport type RoutesRecordHydrated<TRoutesRecord extends RoutesRecord = any> = {\n [K in keyof TRoutesRecord]: CallableRoute<TRoutesRecord[K]>\n}\n/** Public shape returned by `Routes.create()`. Default `any` so `satisfies RoutesPretty` accepts any created routes. */\nexport type RoutesPretty<TRoutesRecord extends RoutesRecord = any> = RoutesRecordHydrated<TRoutesRecord> &\n Omit<Routes<TRoutesRecord>, '_routes' | '_getLocation' | '_clone' | '_pathsOrdering' | '_keysOrdering' | '_ordered'>\nexport type ExtractRoutesKeys<TRoutes extends RoutesPretty | RoutesRecord> = TRoutes extends RoutesPretty\n ? Extract<keyof TRoutes['_']['routes'], string>\n : TRoutes extends RoutesRecord\n ? Extract<keyof TRoutes, string>\n : never\nexport type ExtractRoute<\n TRoutes extends RoutesPretty | RoutesRecord,\n TKey extends ExtractRoutesKeys<TRoutes>,\n> = TRoutes extends RoutesPretty ? TRoutes['_']['routes'][TKey] : TRoutes extends RoutesRecord ? TRoutes[TKey] : never\n\n// public utils\n\nexport type Definition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['definition']\n : T extends string\n ? T\n : never\nexport type ParamsDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['params']\n : T extends string\n ? _ParamsDefinition<T>\n : undefined\nexport type Extended<\n T extends AnyRoute | string | undefined,\n TSuffixDefinition extends string,\n TSearchInput extends UnknownSearchInput = UnknownSearchInput,\n> = T extends AnyRoute\n ? Route0<PathExtended<T['definition'], TSuffixDefinition>, TSearchInput>\n : T extends string\n ? Route0<PathExtended<T, TSuffixDefinition>, TSearchInput>\n : T extends undefined\n ? Route0<TSuffixDefinition, TSearchInput>\n : never\n\nexport type IsAncestor<T extends AnyRoute | string, TAncestor extends AnyRoute | string> = _IsAncestor<\n Definition<T>,\n Definition<TAncestor>\n>\nexport type IsDescendant<T extends AnyRoute | string, TDescendant extends AnyRoute | string> = _IsDescendant<\n Definition<T>,\n Definition<TDescendant>\n>\nexport type IsSame<T extends AnyRoute | string, TExact extends AnyRoute | string> = _IsSame<\n Definition<T>,\n Definition<TExact>\n>\nexport type IsSameParams<T1 extends AnyRoute | string, T2 extends AnyRoute | string> = _IsSameParams<\n ParamsDefinition<T1>,\n ParamsDefinition<T2>\n>\n\nexport type HasParams<T extends AnyRoute | string> = keyof _ParamsDefinition<Definition<T>> extends never ? false : true\nexport type HasWildcard<T extends AnyRoute | string> = Definition<T> extends `${string}*${string}` ? true : false\nexport type HasRequiredParams<T extends AnyRoute | string> =\n _RequiredParamKeys<Definition<T>> extends never ? false : true\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: ParamsDefinition<T>[K] extends true ? string : string | undefined\n}\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<Definition<T>>\nexport type IsParamsOptional<T extends AnyRoute | string> = HasRequiredParams<Definition<T>> extends true ? false : true\nexport type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<Definition<T>>\n\n// location\n\nexport type LocationParams<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: _ParamsDefinition<TDefinition>[K] extends true\n ? string\n : string | undefined\n}\n\n/**\n * URL location primitives independent from route-matching state.\n *\n * `hrefRel` is relative href and includes `pathname + search + hash`.\n */\nexport type _GeneralLocation = {\n /**\n * Path without search/hash (normalized for trailing slash).\n *\n * Example:\n * - input: `https://example.com/users/42?tab=posts#section`\n * - pathname: `/users/42`\n */\n pathname: string\n /**\n * Parsed query object.\n *\n * Example:\n * - `{ tab: \"posts\", sort: \"desc\" }`\n */\n search: UnknownSearchParsed\n /**\n * Raw query string with leading `?`, if present.\n *\n * Example:\n * - `?tab=posts&sort=desc`\n */\n searchString: string\n /**\n * Raw hash with leading `#`, if present.\n *\n * Example:\n * - `#section`\n */\n hash: string\n /**\n * URL origin for absolute inputs.\n *\n * Example:\n * - href: `https://example.com/users/42`\n * - origin: `https://example.com`\n */\n origin?: string\n /**\n * Full absolute href for absolute inputs.\n *\n * Example:\n * - `https://example.com/users/42?tab=posts#section`\n */\n href?: string\n /**\n * Relative href (`pathname + search + hash`).\n *\n * Example:\n * - pathname: `/users/42`\n * - search: `?tab=posts`\n * - hash: `#section`\n * - hrefRel: `/users/42?tab=posts#section`\n */\n hrefRel: string\n /**\n * Whether input was absolute URL.\n *\n * Examples:\n * - `https://example.com/users/42` -> `true`\n * - `/users/42` -> `false`\n */\n abs: boolean\n port?: string\n host?: string\n hostname?: string\n}\n/** Location state before matching against a concrete route. */\nexport type UnknownLocationState = {\n known: false\n route: undefined\n params: undefined\n exact: false\n ancestor: false\n descendant: false\n unmatched: false\n}\nexport type UnknownLocation = _GeneralLocation & UnknownLocationState\n\n/** Known route context, but no exact/ancestor/descendant relation matched. */\nexport type UnmatchedLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Record<never, never>\n exact: false\n ancestor: false\n descendant: false\n unmatched: true\n}\nexport type UnmatchedLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n UnmatchedLocationState<TRoute>\n\n/** Exact match state for a known route. */\nexport type ExactLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: true\n ancestor: false\n descendant: false\n unmatched: false\n}\nexport type ExactLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n ExactLocationState<TRoute>\n\n/** Input URL is a descendant of route definition (route is ancestor). */\nexport type AncestorLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: false\n ancestor: true\n descendant: false\n unmatched: false\n}\nexport type AncestorLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n AncestorLocationState<TRoute>\n\n/** It is when route not match at all, but params match. */\nexport type WeakAncestorLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: ParamsOutput<TRoute>\n exact: false\n ancestor: true\n descendant: false\n unmatched: false\n}\nexport type WeakAncestorLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n WeakAncestorLocationState<TRoute>\n\n/** Input URL is an ancestor prefix of route definition (route is descendant). */\nexport type DescendantLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Partial<ParamsOutput<TRoute>>\n exact: false\n ancestor: false\n descendant: true\n unmatched: false\n}\nexport type DescendantLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n DescendantLocationState<TRoute>\n\nexport type UnknownSearchParsedValue = string | UnknownSearchParsed | Array<UnknownSearchParsedValue>\nexport interface UnknownSearchParsed {\n [key: string]: UnknownSearchParsedValue\n}\n\nexport type UnknownSearchInputValue =\n | string\n | number\n | boolean\n | undefined\n | UnknownSearchInput\n | Array<UnknownSearchInputValue>\nexport interface UnknownSearchInput {\n [key: string]: UnknownSearchInputValue\n}\n\n/** It is when route not match at all, but params partially match. */\nexport type WeakDescendantLocationState<TRoute extends AnyRoute | string = AnyRoute | string> = {\n known: true\n route: Definition<TRoute>\n params: Partial<ParamsOutput<TRoute>>\n exact: false\n ancestor: false\n descendant: true\n unmatched: false\n}\nexport type WeakDescendantLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation &\n WeakDescendantLocationState<TRoute>\nexport type KnownLocation<TRoute extends AnyRoute | string = AnyRoute | string> =\n | UnmatchedLocation<TRoute>\n | ExactLocation<TRoute>\n | AncestorLocation<TRoute>\n | WeakAncestorLocation<TRoute>\n | DescendantLocation<TRoute>\n | WeakDescendantLocation<TRoute>\nexport type AnyLocation<TRoute extends AnyRoute | string = AnyRoute | string> = UnknownLocation | KnownLocation<TRoute>\n\n// internal utils\n\nexport type _ParamsDefinition<TDefinition extends string> = _ExtractParamsDefinitionBySegments<\n _SplitPathSegments<Definition<TDefinition>>\n>\n\nexport type _Simplify<T> = { [K in keyof T]: T[K] } & {}\nexport type _IfNoKeys<T extends object, TYes, TNo> = keyof T extends never ? TYes : TNo\n\nexport type _ParamsInput<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends infer TDef extends Record<string, boolean>\n ? _IfNoKeys<\n TDef,\n Record<never, never>,\n _Simplify<\n {\n [K in keyof TDef as TDef[K] extends true ? K : never]: string | number\n } & {\n [K in keyof TDef as TDef[K] extends false ? K : never]?: string | number | undefined\n }\n >\n >\n : Record<never, never>\n\nexport type _ParamsInputStringOnly<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends infer TDef extends Record<string, boolean>\n ? _IfNoKeys<\n TDef,\n Record<never, never>,\n _Simplify<\n {\n [K in keyof TDef as TDef[K] extends true ? K : never]: string\n } & {\n [K in keyof TDef as TDef[K] extends false ? K : never]?: string | undefined\n }\n >\n >\n : Record<never, never>\n\nexport type _SplitPathSegments<TPath extends string> = TPath extends ''\n ? []\n : TPath extends '/'\n ? []\n : TPath extends `/${infer Rest}`\n ? _SplitPathSegments<Rest>\n : TPath extends `${infer Segment}/${infer Rest}`\n ? Segment extends ''\n ? _SplitPathSegments<Rest>\n : [Segment, ..._SplitPathSegments<Rest>]\n : TPath extends ''\n ? []\n : [TPath]\n\nexport type _ParamDefinitionFromSegment<TSegment extends string> = TSegment extends `:${infer Name}?`\n ? { [K in Name]: false }\n : TSegment extends `:${infer Name}`\n ? { [K in Name]: true }\n : TSegment extends `${string}*?`\n ? { '*': false }\n : TSegment extends `${string}*`\n ? { '*': true }\n : Record<never, never>\n\nexport type _MergeParamDefinitions<A extends Record<string, boolean>, B extends Record<string, boolean>> = {\n [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never\n}\n\nexport type _ExtractParamsDefinitionBySegments<TSegments extends string[]> = TSegments extends [\n infer Segment extends string,\n ...infer Rest extends string[],\n]\n ? _MergeParamDefinitions<_ParamDefinitionFromSegment<Segment>, _ExtractParamsDefinitionBySegments<Rest>>\n : Record<never, never>\n\nexport type _RequiredParamKeys<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: _ParamsDefinition<TDefinition>[K] extends true ? K : never\n}[keyof _ParamsDefinition<TDefinition>]\nexport type ReplacePathParams<S extends string> = S extends `${infer Head}:${infer Tail}`\n ? // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Tail extends `${infer _Param}/${infer Rest}`\n ? ReplacePathParams<`${Head}${string}/${Rest}`>\n : `${Head}${string}`\n : S\nexport type DedupeSlashes<S extends string> = S extends `${infer A}//${infer B}` ? DedupeSlashes<`${A}/${B}`> : S\nexport type EmptyRecord = Record<never, never>\nexport type JoinPath<Parent extends string, Suffix extends string> = DedupeSlashes<\n Definition<Parent> extends infer A extends string\n ? Definition<Suffix> extends infer B extends string\n ? A extends ''\n ? B extends ''\n ? ''\n : B extends `/${string}`\n ? B\n : `/${B}`\n : B extends ''\n ? A\n : A extends `${string}/`\n ? `${A}${B}`\n : B extends `/${string}`\n ? `${A}${B}`\n : `${A}/${B}`\n : never\n : never\n>\n\nexport type OnlyIfNoParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends false ? Yes : No\nexport type OnlyIfHasParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends true ? Yes : No\n\nexport type GetPathInput<\n TDefinition extends string,\n TSearchInput extends UnknownSearchInput,\n> = _ParamsInput<TDefinition> & {\n '?'?: TSearchInput\n '#'?: string | number\n}\n\nexport type PathExtended<\n TSourceDefinitionDefinition extends string,\n TSuffixDefinitionDefinition extends string,\n> = `${JoinPath<StripTrailingWildcard<TSourceDefinitionDefinition>, TSuffixDefinitionDefinition>}`\n\nexport type StripTrailingWildcard<TDefinition extends string> = TDefinition extends `${infer TPath}*?`\n ? TPath\n : TDefinition extends `${infer TPath}*`\n ? TPath\n : TDefinition\n\nexport type IsAny<T> = 0 extends 1 & T ? true : false\n\nexport type _IsSameParams<T1 extends object | undefined, T2 extends object | undefined> = T1 extends undefined\n ? T2 extends undefined\n ? true\n : false\n : T2 extends undefined\n ? false\n : T1 extends T2\n ? T2 extends T1\n ? true\n : false\n : false\n\nexport type _IsAncestor<T extends string, TAncestor extends string> = T extends TAncestor\n ? false\n : T extends `${TAncestor}${string}`\n ? true\n : false\nexport type _IsDescendant<T extends string, TDescendant extends string> = TDescendant extends T\n ? false\n : TDescendant extends `${T}${string}`\n ? true\n : false\nexport type _IsSame<T extends string, TExact extends string> = T extends TExact\n ? TExact extends T\n ? true\n : false\n : false\n\nexport type _SafeParseInputResult<TInputParsed extends Record<string, unknown>> =\n | {\n success: true\n data: TInputParsed\n error: undefined\n }\n | {\n success: false\n data: undefined\n error: Error\n }\n\nexport type SchemaRoute0<\n TInput extends Record<string, unknown>,\n TOutput extends Record<string, unknown>,\n> = StandardSchemaV1<TInput, TOutput> & {\n parse: (input: unknown) => TOutput\n safeParse: (input: unknown) => _SafeParseInputResult<TOutput>\n}\n"],"mappings":"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","names":["searchInput","hashInput","paramsInput","absOriginInput"]}
|