@devp0nt/route0 1.0.0-next.77 → 1.0.0-next.78

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.
@@ -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 RouteToken =\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 getRouteSegments = (definition: string): string[] => {\n if (definition === '' || definition === '/') return []\n return definition.split('/').filter(Boolean)\n}\n\nconst getRouteTokens = (definition: string): RouteToken[] => {\n const segments = getRouteSegments(definition)\n return segments.map((segment): RouteToken => {\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 getRouteRegexBaseString = (definition: string): string => {\n const tokens = getRouteTokens(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 getRouteCaptureKeys = (definition: string): string[] => {\n const keys: string[] = []\n for (const token of getRouteTokens(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 = getRouteTokens(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 validateRouteDefinition = (definition: string): void => {\n const segments = getRouteSegments(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\nconst normalizeRouteDefinition = (definition: string): string => {\n const value = definition.replace(/\\/{2,}/g, '/')\n if (value === '' || value === '/') return '/'\n const withLeadingSlash = value.startsWith('/') ? value : `/${value}`\n return withLeadingSlash.length > 1 && withLeadingSlash.endsWith('/')\n ? withLeadingSlash.slice(0, -1)\n : withLeadingSlash\n}\n\nconst normalizePathname = (pathname: string): string => {\n return normalizeRouteDefinition(pathname)\n}\n\nconst getNormalizedPathnameFromInput = (hrefOrHrefRelOrLocation: string | AnyLocation | URL): string => {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return normalizePathname(hrefOrHrefRelOrLocation.pathname)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n if (typeof hrefOrHrefRelOrLocation.pathname === 'string') {\n return normalizePathname(hrefOrHrefRelOrLocation.pathname)\n }\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n const abs = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(hrefOrHrefRelOrLocation)\n const base = abs ? undefined : 'http://example.com'\n const url = new URL(hrefOrHrefRelOrLocation, base)\n return normalizePathname(url.pathname)\n}\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 private _regexBaseString?: string\n private _regexString?: string\n private _regex?: RegExp\n private _regexAncestor?: RegExp\n private _captureKeys?: string[]\n private _normalizedDefinition?: string\n private _definitionParts?: string[]\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 const normalizedDefinition = normalizeRouteDefinition(definition) as TDefinition\n validateRouteDefinition(normalizedDefinition)\n this.definition = normalizedDefinition\n this.params = Route0._getParamsDefinitionByDefinition(normalizedDefinition)\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<NormalizeRouteDefinition<TDefinition>> {\n if (typeof definition === 'function' || typeof definition === 'object') {\n return definition.clone(config) as CallableRoute<NormalizeRouteDefinition<TDefinition>>\n }\n const original = new Route0<NormalizeRouteDefinition<TDefinition>>(\n normalizeRouteDefinition(definition) as NormalizeRouteDefinition<TDefinition>,\n config,\n )\n return original._callable as CallableRoute<NormalizeRouteDefinition<TDefinition>>\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<NormalizeRouteDefinition<TDefinition>, TSearchInput> {\n if (typeof definition === 'function') {\n return definition as CallableRoute<NormalizeRouteDefinition<TDefinition>, TSearchInput>\n }\n const original =\n typeof definition === 'object'\n ? definition\n : new Route0<NormalizeRouteDefinition<TDefinition>>(\n normalizeRouteDefinition(definition) as NormalizeRouteDefinition<TDefinition>,\n )\n return original._callable as CallableRoute<NormalizeRouteDefinition<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 = normalizeRouteDefinition(`${sourceDefinitionWithoutWildcard}/${suffixDefinition}`)\n return Route0.create<PathExtended<TDefinition, TSuffixDefinition>>(\n definition as PathExtended<TDefinition, TSuffixDefinition>,\n {\n origin: this._origin,\n },\n ) as CallableRoute<PathExtended<TDefinition, TSuffixDefinition>, TSearchInput>\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 getTokens(): RouteToken[] {\n return getRouteTokens(this.definition)\n }\n\n /** Clones route with optional config override. */\n clone(config?: RouteConfigInput): CallableRoute<TDefinition> {\n return Route0.create(this.definition, config) as CallableRoute<TDefinition>\n }\n\n get regexBaseString(): string {\n if (this._regexBaseString === undefined) {\n this._regexBaseString = getRouteRegexBaseString(this.definition).replace(/\\/+$/, '') + '/?' // remove trailing slashes and add optional slash\n }\n return this._regexBaseString\n }\n\n get regexString(): string {\n if (this._regexString === undefined) {\n this._regexString = `^${this.regexBaseString}$`\n }\n return this._regexString\n }\n\n get regex(): RegExp {\n if (this._regex === undefined) {\n this._regex = new RegExp(this.regexString)\n }\n return this._regex\n }\n\n get regexAncestor(): RegExp {\n if (this._regexAncestor === undefined) {\n this._regexAncestor = new RegExp(`^${this.regexBaseString}(?:/.*)?$`)\n }\n return this._regexAncestor\n }\n\n private get captureKeys(): string[] {\n if (this._captureKeys === undefined) {\n this._captureKeys = getRouteCaptureKeys(this.definition)\n }\n return this._captureKeys\n }\n\n private get normalizedDefinition(): string {\n if (this._normalizedDefinition === undefined) {\n this._normalizedDefinition =\n this.definition.length > 1 && this.definition.endsWith('/') ? this.definition.slice(0, -1) : this.definition\n }\n return this._normalizedDefinition\n }\n\n private get definitionParts(): string[] {\n if (this._definitionParts === undefined) {\n this._definitionParts =\n this.normalizedDefinition === '/' ? ['/'] : this.normalizedDefinition.split('/').filter(Boolean)\n }\n return this._definitionParts\n }\n\n /** Fast pathname exact match check without building a full location object. */\n isExactPathnameMatch(pathname: string): boolean {\n return this.regex.test(normalizePathname(pathname))\n }\n\n /** Fast pathname exact or ancestor match check without building a full location object. */\n isExactOrAncestorPathnameMatch(pathname: string): boolean {\n const normalizedPathname = normalizePathname(pathname)\n return this.regex.test(normalizedPathname) || this.regexAncestor.test(normalizedPathname)\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.regexString).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 const pathname = normalizePathname(url.pathname)\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 = normalizePathname(location.pathname)\n\n const paramNames = this.captureKeys\n const defParts = this.definitionParts\n\n const exactRe = this.regex\n const ancestorRe = this.regexAncestor // 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 pathParts = pathname === '/' ? ['/'] : pathname.split('/').filter(Boolean)\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 getRouteTokens(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 getRouteTokens(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.regex\n const otherRegex = other.regex\n const makeCandidates = (definition: string): string[] => {\n const tokens = getRouteTokens(definition)\n const values = (token: RouteToken): 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 const input = hrefOrHrefRelOrLocation\n const pathname = getNormalizedPathnameFromInput(input)\n // Find exact match using a fast pathname pre-check first.\n for (const route of this._ordered) {\n if (!route.isExactPathnameMatch(pathname)) {\n continue\n }\n const loc = route.getLocation(input)\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 UnknownSearchInput = Record<string, unknown>\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 EnsureLeadingSlash<S extends string> = S extends '' ? '/' : S extends `/${string}` ? S : `/${S}`\nexport type TrimTrailingSlash<S extends string> = S extends '/'\n ? '/'\n : S extends `${infer V}/`\n ? TrimTrailingSlash<V>\n : S\nexport type NormalizeRouteDefinition<S extends string> = TrimTrailingSlash<EnsureLeadingSlash<DedupeSlashes<S>>>\nexport type EmptyRecord = Record<never, never>\nexport type JoinPath<Parent extends string, Suffix extends string> = NormalizeRouteDefinition<\n Definition<Parent> extends infer A extends string\n ? Definition<Suffix> extends infer B extends string\n ? NormalizeRouteDefinition<A> extends infer ANormalized extends string\n ? NormalizeRouteDefinition<B> extends infer BNormalized extends string\n ? BNormalized extends '/'\n ? ANormalized\n : ANormalized extends '/'\n ? BNormalized\n : `${ANormalized}/${BNormalized}`\n : never\n : never\n : never\n : never\n>\nexport type PathExtended<\n TSourceDefinitionDefinition extends string,\n TSuffixDefinitionDefinition extends string,\n> = `${NormalizeRouteDefinition<JoinPath<StripTrailingWildcard<TSourceDefinitionDefinition>, TSuffixDefinitionDefinition>>}`\n\nexport type StripTrailingWildcard<TDefinition extends string> = TDefinition extends `${infer TPath}*?`\n ? NormalizeRouteDefinition<TPath>\n : TDefinition extends `${infer TPath}*`\n ? NormalizeRouteDefinition<TPath>\n : NormalizeRouteDefinition<TDefinition>\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}\nexport type GetPathInputByRoute<TRoute extends AnyRoute | CallableRoute | string> =\n TRoute extends AnyRoute<any, infer TSearchInput>\n ? GetPathInput<Definition<TRoute>, TSearchInput>\n : TRoute extends string\n ? GetPathInput<TRoute, UnknownSearchInput>\n : never\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 RouteToken =\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 collapseDuplicateSlashes = (value: string): string => value.replace(/\\/{2,}/g, '/')\n\nconst normalizeSlashPath = (value: string): string => {\n const collapsed = collapseDuplicateSlashes(value)\n if (collapsed === '' || collapsed === '/') return '/'\n const withLeadingSlash = collapsed.startsWith('/') ? collapsed : `/${collapsed}`\n return withLeadingSlash.length > 1 && withLeadingSlash.endsWith('/')\n ? withLeadingSlash.slice(0, -1)\n : withLeadingSlash\n}\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 private _routeSegments?: string[]\n private _routeTokens?: RouteToken[]\n private _routePatternCandidates?: string[]\n private _pathParamsDefinition?: Record<string, boolean>\n private _definitionWithoutTrailingWildcard?: string\n private _routeRegexBaseStringRaw?: string\n private _regexBaseString?: string\n private _regexString?: string\n private _regex?: RegExp\n private _regexAncestor?: RegExp\n private _regexDescendantMatchers?: Array<{ regex: RegExp; captureKeys: string[] }>\n private _captureKeys?: string[]\n private _normalizedDefinition?: string\n private _definitionParts?: string[]\n\n private static _getRouteSegments(definition: string): string[] {\n if (definition === '' || definition === '/') return []\n return definition.split('/').filter(Boolean)\n }\n\n private static _normalizeRouteDefinition(definition: string): string {\n return normalizeSlashPath(definition)\n }\n\n private static _normalizePathname(pathname: string): string {\n return Route0._normalizeRouteDefinition(pathname)\n }\n\n private static _validateRouteDefinition(definition: string): void {\n const segments = Route0._getRouteSegments(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\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 const normalizedDefinition = Route0._normalizeRouteDefinition(definition) as TDefinition\n Route0._validateRouteDefinition(normalizedDefinition)\n this.definition = normalizedDefinition\n this.params = this.pathParamsDefinition as _ParamsDefinition<TDefinition>\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<NormalizeRouteDefinition<TDefinition>> {\n if (typeof definition === 'function' || typeof definition === 'object') {\n return definition.clone(config) as CallableRoute<NormalizeRouteDefinition<TDefinition>>\n }\n const original = new Route0<NormalizeRouteDefinition<TDefinition>>(\n Route0._normalizeRouteDefinition(definition) as NormalizeRouteDefinition<TDefinition>,\n config,\n )\n return original._callable as CallableRoute<NormalizeRouteDefinition<TDefinition>>\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<NormalizeRouteDefinition<TDefinition>, TSearchInput> {\n if (typeof definition === 'function') {\n return definition as CallableRoute<NormalizeRouteDefinition<TDefinition>, TSearchInput>\n }\n const original =\n typeof definition === 'object'\n ? definition\n : new Route0<NormalizeRouteDefinition<TDefinition>>(\n Route0._normalizeRouteDefinition(definition) as NormalizeRouteDefinition<TDefinition>,\n )\n return original._callable as CallableRoute<NormalizeRouteDefinition<TDefinition>, TSearchInput>\n }\n\n private static _getAbsPath(origin: string, url: string) {\n return new URL(url, origin).toString().replace(/\\/$/, '')\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 definition = Route0._normalizeRouteDefinition(`${this.definitionWithoutTrailingWildcard}/${suffixDefinition}`)\n return Route0.create<PathExtended<TDefinition, TSuffixDefinition>>(\n definition as PathExtended<TDefinition, TSuffixDefinition>,\n {\n origin: this._origin,\n },\n ) as CallableRoute<PathExtended<TDefinition, TSuffixDefinition>, TSearchInput>\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 = collapseDuplicateSlashes(url)\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 getTokens(): RouteToken[] {\n return this.routeTokens.map((token): RouteToken => ({ ...token }))\n }\n\n /** Clones route with optional config override. */\n clone(config?: RouteConfigInput): CallableRoute<TDefinition> {\n return Route0.create(this.definition, config) as CallableRoute<TDefinition>\n }\n\n get regexBaseString(): string {\n if (this._regexBaseString === undefined) {\n this._regexBaseString = this.routeRegexBaseStringRaw.replace(/\\/+$/, '') + '/?' // remove trailing slashes and add optional slash\n }\n return this._regexBaseString\n }\n\n get regexString(): string {\n if (this._regexString === undefined) {\n this._regexString = `^${this.regexBaseString}$`\n }\n return this._regexString\n }\n\n get regex(): RegExp {\n if (this._regex === undefined) {\n this._regex = new RegExp(this.regexString)\n }\n return this._regex\n }\n\n get regexAncestor(): RegExp {\n if (this._regexAncestor === undefined) {\n this._regexAncestor = new RegExp(`^${this.regexBaseString}(?:/.*)?$`)\n }\n return this._regexAncestor\n }\n\n private get regexDescendantMatchers(): Array<{ regex: RegExp; captureKeys: string[] }> {\n if (this._regexDescendantMatchers === undefined) {\n const matchers: Array<{ regex: RegExp; captureKeys: string[] }> = []\n if (this.definitionParts[0] !== '/') {\n let pattern = ''\n const captureKeys: string[] = []\n for (const part of this.definitionParts) {\n if (part.startsWith(':')) {\n pattern += '/([^/]+)'\n captureKeys.push(part.replace(/^:/, '').replace(/\\?$/, ''))\n } else if (part.includes('*')) {\n const prefix = part.replace(/\\*\\??$/, '')\n pattern += `/${escapeRegex(prefix)}[^/]*`\n captureKeys.push('*')\n } else {\n pattern += `/${escapeRegex(part)}`\n }\n matchers.push({\n regex: new RegExp(`^${pattern}/?$`),\n captureKeys: [...captureKeys],\n })\n }\n }\n this._regexDescendantMatchers = matchers\n }\n return this._regexDescendantMatchers\n }\n\n private get captureKeys(): string[] {\n if (this._captureKeys === undefined) {\n this._captureKeys = this.routeTokens\n .filter((token): token is Extract<RouteToken, { kind: 'param' | 'wildcard' }> => token.kind !== 'static')\n .map((token) => (token.kind === 'param' ? token.name : '*'))\n }\n return this._captureKeys\n }\n\n private get routeSegments(): string[] {\n if (this._routeSegments === undefined) {\n this._routeSegments = Route0._getRouteSegments(this.definition)\n }\n return this._routeSegments\n }\n\n private get routeTokens(): RouteToken[] {\n if (this._routeTokens === undefined) {\n this._routeTokens = this.routeSegments.map((segment): RouteToken => {\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 return this._routeTokens\n }\n\n private get routePatternCandidates(): string[] {\n if (this._routePatternCandidates === undefined) {\n const values = (token: RouteToken): string[] => {\n if (token.kind === 'static') return [token.value]\n if (token.kind === 'param') return token.optional ? ['', 'x', 'y'] : ['x', 'y']\n if (token.prefix.length > 0)\n return [token.prefix, `${token.prefix}-x`, `${token.prefix}/x`, `${token.prefix}/y/z`]\n return ['', 'x', 'y', 'x/y']\n }\n let acc: string[] = ['']\n for (const token of this.routeTokens) {\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 // Keep candidate space bounded for large route definitions.\n acc = next.length > 512 ? next.slice(0, 512) : next\n }\n this._routePatternCandidates =\n acc.length === 0 ? ['/'] : Array.from(new Set(acc.map((x) => (x === '' ? '/' : collapseDuplicateSlashes(x)))))\n }\n return this._routePatternCandidates\n }\n\n private get pathParamsDefinition(): Record<string, boolean> {\n if (this._pathParamsDefinition === undefined) {\n const entries = this.routeTokens\n .filter((t) => t.kind !== 'static')\n .map((t): [string, boolean] => (t.kind === 'param' ? [t.name, !t.optional] : ['*', !t.optional]))\n this._pathParamsDefinition = Object.fromEntries(entries)\n }\n return this._pathParamsDefinition\n }\n\n private get definitionWithoutTrailingWildcard(): string {\n if (this._definitionWithoutTrailingWildcard === undefined) {\n this._definitionWithoutTrailingWildcard = this.definition.replace(/\\*\\??$/, '')\n }\n return this._definitionWithoutTrailingWildcard\n }\n\n private get routeRegexBaseStringRaw(): string {\n if (this._routeRegexBaseStringRaw === undefined) {\n if (this.routeTokens.length === 0) {\n this._routeRegexBaseStringRaw = ''\n } else {\n let pattern = ''\n for (const token of this.routeTokens) {\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 this._routeRegexBaseStringRaw = pattern\n }\n }\n return this._routeRegexBaseStringRaw\n }\n\n private get normalizedDefinition(): string {\n if (this._normalizedDefinition === undefined) {\n this._normalizedDefinition =\n this.definition.length > 1 && this.definition.endsWith('/') ? this.definition.slice(0, -1) : this.definition\n }\n return this._normalizedDefinition\n }\n\n private get definitionParts(): string[] {\n if (this._definitionParts === undefined) {\n this._definitionParts =\n this.normalizedDefinition === '/' ? ['/'] : this.normalizedDefinition.split('/').filter(Boolean)\n }\n return this._definitionParts\n }\n\n /** Fast pathname exact match check without building a full location object. */\n isExactPathnameMatch(pathname: string): boolean {\n return this.regex.test(Route0._normalizePathname(pathname))\n }\n\n /** Fast pathname exact or ancestor match check without building a full location object. */\n isExactOrAncestorPathnameMatch(pathname: string): boolean {\n const normalizedPathname = Route0._normalizePathname(pathname)\n return this.regex.test(normalizedPathname) || this.regexAncestor.test(normalizedPathname)\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.regexString).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 // Common derived values\n const hrefRel = url.pathname + url.search + url.hash\n\n // Build the location object consistent with _GeneralLocation\n const location: UnknownLocation = {\n pathname: url.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 = Route0._normalizePathname(location.pathname)\n\n const paramNames = this.captureKeys\n const exactRe = this.regex\n const ancestorRe = this.regexAncestor // 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 let descendant = false\n let descendantMatch: RegExpMatchArray | null = null\n let descendantCaptureKeys: string[] = []\n if (!exact && !ancestor) {\n for (const matcher of this.regexDescendantMatchers) {\n const match = pathname.match(matcher.regex)\n if (!match) continue\n descendant = true\n descendantMatch = match\n descendantCaptureKeys = matcher.captureKeys\n break\n }\n }\n const unmatched = !exact && !ancestor && !descendant\n\n if (descendant && descendantMatch) {\n const values = descendantMatch.slice(1, 1 + descendantCaptureKeys.length)\n location.params = Object.fromEntries(\n descendantCaptureKeys.map((key, index) => [key, decodeURIComponent(values[index] as string)]),\n )\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 const thisShape = this.routeTokens\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 const otherRoute = Route0.from(other) as Route0<string, UnknownSearchInput>\n const otherShape = otherRoute.routeTokens\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 return thisShape === otherShape\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 const matchesPatternPart = (patternPart: string, valuePart: string): { match: boolean; wildcard: boolean } => {\n if (patternPart.startsWith(':')) return { match: true, wildcard: false }\n const wildcardIndex = patternPart.indexOf('*')\n if (wildcardIndex >= 0) {\n const prefix = patternPart.slice(0, wildcardIndex)\n return { match: prefix.length === 0 || valuePart.startsWith(prefix), wildcard: true }\n }\n return { match: patternPart === valuePart, wildcard: false }\n }\n\n for (let i = 0; i < otherParts.length; i++) {\n const otherPart = otherParts[i]\n const thisPart = thisParts[i]\n const result = matchesPatternPart(otherPart, thisPart)\n if (!result.match) return false\n if (result.wildcard) return true\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 const matchesPatternPart = (patternPart: string, valuePart: string): { match: boolean; wildcard: boolean } => {\n if (patternPart.startsWith(':')) return { match: true, wildcard: false }\n const wildcardIndex = patternPart.indexOf('*')\n if (wildcardIndex >= 0) {\n const prefix = patternPart.slice(0, wildcardIndex)\n return { match: prefix.length === 0 || valuePart.startsWith(prefix), wildcard: true }\n }\n return { match: patternPart === valuePart, wildcard: false }\n }\n\n for (let i = 0; i < thisParts.length; i++) {\n const thisPart = thisParts[i]\n const otherPart = otherParts[i]\n const result = matchesPatternPart(thisPart, otherPart)\n if (!result.match) return false\n if (result.wildcard) return true\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 isOverlap(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n const otherRoute = Route0.from(other) as Route0<string, UnknownSearchInput>\n const thisRegex = this.regex\n const otherRegex = otherRoute.regex\n const thisCandidates = this.routePatternCandidates\n const otherCandidates = otherRoute.routePatternCandidates\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 /**\n * True when overlap is not resolvable by route ordering inside one route set.\n *\n * Non-conflicting overlap means one route is a strict subset of another\n * (e.g. `/x/y` is a strict subset of `/x/:id`) and can be safely ordered first.\n */\n isConflict(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n const otherRoute = Route0.from(other) as Route0<string, UnknownSearchInput>\n if (!this.isOverlap(otherRoute)) return false\n const thisRegex = this.regex\n const otherRegex = otherRoute.regex\n const thisCandidates = this.routePatternCandidates\n const otherCandidates = otherRoute.routePatternCandidates\n const thisExclusive = thisCandidates.some((path) => thisRegex.test(path) && !otherRegex.test(path))\n const otherExclusive = otherCandidates.some((path) => otherRegex.test(path) && !thisRegex.test(path))\n // Exactly one side has exclusive matches => strict subset => resolvable by ordering.\n if (thisExclusive !== otherExclusive) return false\n // Both exclusive (partial overlap) OR none exclusive (equal languages) => real conflict.\n return true\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 private static _getNormalizedPathnameFromInput(hrefOrHrefRelOrLocation: string | AnyLocation | URL): string {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return normalizeSlashPath(hrefOrHrefRelOrLocation.pathname)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n if (typeof hrefOrHrefRelOrLocation.pathname === 'string') {\n return normalizeSlashPath(hrefOrHrefRelOrLocation.pathname)\n }\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n const abs = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(hrefOrHrefRelOrLocation)\n const base = abs ? undefined : 'http://example.com'\n const url = new URL(hrefOrHrefRelOrLocation, base)\n return normalizeSlashPath(url.pathname)\n }\n\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 const input = hrefOrHrefRelOrLocation\n const pathname = Routes._getNormalizedPathnameFromInput(input)\n // Find exact match using a fast pathname pre-check first.\n for (const route of this._ordered) {\n if (!route.isExactPathnameMatch(pathname)) {\n continue\n }\n const loc = route.getLocation(input)\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.isOverlap(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 UnknownSearchInput = Record<string, unknown>\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 EnsureLeadingSlash<S extends string> = S extends '' ? '/' : S extends `/${string}` ? S : `/${S}`\nexport type TrimTrailingSlash<S extends string> = S extends '/'\n ? '/'\n : S extends `${infer V}/`\n ? TrimTrailingSlash<V>\n : S\nexport type NormalizeRouteDefinition<S extends string> = TrimTrailingSlash<EnsureLeadingSlash<DedupeSlashes<S>>>\nexport type EmptyRecord = Record<never, never>\nexport type JoinPath<Parent extends string, Suffix extends string> = NormalizeRouteDefinition<\n Definition<Parent> extends infer A extends string\n ? Definition<Suffix> extends infer B extends string\n ? NormalizeRouteDefinition<A> extends infer ANormalized extends string\n ? NormalizeRouteDefinition<B> extends infer BNormalized extends string\n ? BNormalized extends '/'\n ? ANormalized\n : ANormalized extends '/'\n ? BNormalized\n : `${ANormalized}/${BNormalized}`\n : never\n : never\n : never\n : never\n>\nexport type PathExtended<\n TSourceDefinitionDefinition extends string,\n TSuffixDefinitionDefinition extends string,\n> = `${NormalizeRouteDefinition<JoinPath<StripTrailingWildcard<TSourceDefinitionDefinition>, TSuffixDefinitionDefinition>>}`\n\nexport type StripTrailingWildcard<TDefinition extends string> = TDefinition extends `${infer TPath}*?`\n ? NormalizeRouteDefinition<TPath>\n : TDefinition extends `${infer TPath}*`\n ? NormalizeRouteDefinition<TPath>\n : NormalizeRouteDefinition<TDefinition>\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}\nexport type GetPathInputByRoute<TRoute extends AnyRoute | CallableRoute | string> =\n TRoute extends AnyRoute<any, infer TSearchInput>\n ? GetPathInput<Definition<TRoute>, TSearchInput>\n : TRoute extends string\n ? GetPathInput<TRoute, UnknownSearchInput>\n : never\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"]}
@@ -28,13 +28,24 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
28
28
  readonly params: _ParamsDefinition<TDefinition>;
29
29
  private _origin;
30
30
  private _callable;
31
+ private _routeSegments?;
32
+ private _routeTokens?;
33
+ private _routePatternCandidates?;
34
+ private _pathParamsDefinition?;
35
+ private _definitionWithoutTrailingWildcard?;
36
+ private _routeRegexBaseStringRaw?;
31
37
  private _regexBaseString?;
32
38
  private _regexString?;
33
39
  private _regex?;
34
40
  private _regexAncestor?;
41
+ private _regexDescendantMatchers?;
35
42
  private _captureKeys?;
36
43
  private _normalizedDefinition?;
37
44
  private _definitionParts?;
45
+ private static _getRouteSegments;
46
+ private static _normalizeRouteDefinition;
47
+ private static _normalizePathname;
48
+ private static _validateRouteDefinition;
38
49
  Infer: {
39
50
  ParamsDefinition: _ParamsDefinition<TDefinition>;
40
51
  ParamsInput: _ParamsInput<TDefinition>;
@@ -59,7 +70,6 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
59
70
  */
60
71
  static from<TDefinition extends string, TSearchInput extends UnknownSearchInput>(definition: TDefinition | AnyRoute<TDefinition, TSearchInput> | CallableRoute<TDefinition, TSearchInput>): CallableRoute<NormalizeRouteDefinition<TDefinition>, TSearchInput>;
61
72
  private static _getAbsPath;
62
- private static _getParamsDefinitionByDefinition;
63
73
  search<TNewSearchInput extends UnknownSearchInput>(): CallableRoute<TDefinition, TNewSearchInput>;
64
74
  /** Extends the current route definition by appending a suffix route. */
65
75
  extend<TSuffixDefinition extends string>(suffixDefinition: TSuffixDefinition): CallableRoute<PathExtended<TDefinition, TSuffixDefinition>, TSearchInput>;
@@ -74,7 +84,14 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
74
84
  get regexString(): string;
75
85
  get regex(): RegExp;
76
86
  get regexAncestor(): RegExp;
87
+ private get regexDescendantMatchers();
77
88
  private get captureKeys();
89
+ private get routeSegments();
90
+ private get routeTokens();
91
+ private get routePatternCandidates();
92
+ private get pathParamsDefinition();
93
+ private get definitionWithoutTrailingWildcard();
94
+ private get routeRegexBaseStringRaw();
78
95
  private get normalizedDefinition();
79
96
  private get definitionParts();
80
97
  /** Fast pathname exact match check without building a full location object. */
@@ -129,9 +146,14 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
129
146
  /** True when current route is broader/shallower than `other`. */
130
147
  isAncestor(other: AnyRoute | string | undefined): boolean;
131
148
  /** True when two route patterns can match the same concrete URL. */
149
+ isOverlap(other: AnyRoute | string | undefined): boolean;
150
+ /**
151
+ * True when overlap is not resolvable by route ordering inside one route set.
152
+ *
153
+ * Non-conflicting overlap means one route is a strict subset of another
154
+ * (e.g. `/x/y` is a strict subset of `/x/:id`) and can be safely ordered first.
155
+ */
132
156
  isConflict(other: AnyRoute | string | undefined): boolean;
133
- /** True when paths are same or can overlap when optional parts are omitted. */
134
- isMayBeSame(other: AnyRoute | string | undefined): boolean;
135
157
  /** Specificity comparator used for deterministic route ordering. */
136
158
  isMoreSpecificThan(other: AnyRoute | string | undefined): boolean;
137
159
  }
@@ -142,6 +164,7 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
142
164
  * and returns a "pretty" object with direct route access + helper methods under `._`.
143
165
  */
144
166
  declare class Routes<const T extends RoutesRecord = any> {
167
+ private static _getNormalizedPathnameFromInput;
145
168
  _routes: RoutesRecordHydrated<T>;
146
169
  _pathsOrdering: string[];
147
170
  _keysOrdering: string[];
@@ -28,13 +28,24 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
28
28
  readonly params: _ParamsDefinition<TDefinition>;
29
29
  private _origin;
30
30
  private _callable;
31
+ private _routeSegments?;
32
+ private _routeTokens?;
33
+ private _routePatternCandidates?;
34
+ private _pathParamsDefinition?;
35
+ private _definitionWithoutTrailingWildcard?;
36
+ private _routeRegexBaseStringRaw?;
31
37
  private _regexBaseString?;
32
38
  private _regexString?;
33
39
  private _regex?;
34
40
  private _regexAncestor?;
41
+ private _regexDescendantMatchers?;
35
42
  private _captureKeys?;
36
43
  private _normalizedDefinition?;
37
44
  private _definitionParts?;
45
+ private static _getRouteSegments;
46
+ private static _normalizeRouteDefinition;
47
+ private static _normalizePathname;
48
+ private static _validateRouteDefinition;
38
49
  Infer: {
39
50
  ParamsDefinition: _ParamsDefinition<TDefinition>;
40
51
  ParamsInput: _ParamsInput<TDefinition>;
@@ -59,7 +70,6 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
59
70
  */
60
71
  static from<TDefinition extends string, TSearchInput extends UnknownSearchInput>(definition: TDefinition | AnyRoute<TDefinition, TSearchInput> | CallableRoute<TDefinition, TSearchInput>): CallableRoute<NormalizeRouteDefinition<TDefinition>, TSearchInput>;
61
72
  private static _getAbsPath;
62
- private static _getParamsDefinitionByDefinition;
63
73
  search<TNewSearchInput extends UnknownSearchInput>(): CallableRoute<TDefinition, TNewSearchInput>;
64
74
  /** Extends the current route definition by appending a suffix route. */
65
75
  extend<TSuffixDefinition extends string>(suffixDefinition: TSuffixDefinition): CallableRoute<PathExtended<TDefinition, TSuffixDefinition>, TSearchInput>;
@@ -74,7 +84,14 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
74
84
  get regexString(): string;
75
85
  get regex(): RegExp;
76
86
  get regexAncestor(): RegExp;
87
+ private get regexDescendantMatchers();
77
88
  private get captureKeys();
89
+ private get routeSegments();
90
+ private get routeTokens();
91
+ private get routePatternCandidates();
92
+ private get pathParamsDefinition();
93
+ private get definitionWithoutTrailingWildcard();
94
+ private get routeRegexBaseStringRaw();
78
95
  private get normalizedDefinition();
79
96
  private get definitionParts();
80
97
  /** Fast pathname exact match check without building a full location object. */
@@ -129,9 +146,14 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
129
146
  /** True when current route is broader/shallower than `other`. */
130
147
  isAncestor(other: AnyRoute | string | undefined): boolean;
131
148
  /** True when two route patterns can match the same concrete URL. */
149
+ isOverlap(other: AnyRoute | string | undefined): boolean;
150
+ /**
151
+ * True when overlap is not resolvable by route ordering inside one route set.
152
+ *
153
+ * Non-conflicting overlap means one route is a strict subset of another
154
+ * (e.g. `/x/y` is a strict subset of `/x/:id`) and can be safely ordered first.
155
+ */
132
156
  isConflict(other: AnyRoute | string | undefined): boolean;
133
- /** True when paths are same or can overlap when optional parts are omitted. */
134
- isMayBeSame(other: AnyRoute | string | undefined): boolean;
135
157
  /** Specificity comparator used for deterministic route ordering. */
136
158
  isMoreSpecificThan(other: AnyRoute | string | undefined): boolean;
137
159
  }
@@ -142,6 +164,7 @@ declare class Route0<TDefinition extends string, TSearchInput extends UnknownSea
142
164
  * and returns a "pretty" object with direct route access + helper methods under `._`.
143
165
  */
144
166
  declare class Routes<const T extends RoutesRecord = any> {
167
+ private static _getNormalizedPathnameFromInput;
145
168
  _routes: RoutesRecordHydrated<T>;
146
169
  _pathsOrdering: string[];
147
170
  _keysOrdering: string[];