@devp0nt/route0 1.0.0-next.66 → 1.0.0-next.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +5 -5
- package/dist/esm/index.d.ts +5 -5
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.test.ts +4 -4
- package/src/index.ts +9 -18
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\n\n// TODO: asterisk\n// TODO: when asterisk then query params will be extended also after extend\n// TODO: optional params\n// TODO: required search\n\n// TODO: .extension('.json') to not add additional / but just add some extension\n// TODO: search input can be boolean, or even object with qs\n// TODO: route0 if ens with \"...&\" then can be any query, else only provided type of queries\n// TODO: Роут0 три мод, тогда там все ноуты кончаются на .селф\n// TODO: use splats in param definition \"*\"\n// TODO: ? check extend for search only .extend('&x&z')\n// TODO: .create(route, {useSearch, useParams})\n// TODO: Из пас экзакт, из пасвизквери экзает, из чилдрен, из парент, из экзактОр\n// TODO: isEqual, isDescendant, isAncestor\n// TODO: extractParams, extractSearch\n// TODO: getPathDefinition respecting definitionParamPrefix, definitionSearchPrefix\n// TODO: prepend\n// TODO: ?? Route0.createTree({base:{self: x, children: ...})\n// TODO: ? Routes.create({base:{self: x, children: ...}).attach('section', Routes.create({...}))\n// TODO: overrideTree\n// TODO: .create(route, {origin, useLocation})\n// TODO: ? optional path params as @\n// TODO: prependMany, extendMany, overrideMany, with types\n// TODO: optional route params /x/:id?\n// TODO: fix CallableRoute<CallableRoute<>> in RoutesPretty type, it should be just CallableRoute<>\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> {\n readonly definition: TDefinition\n readonly pathDefinition: _PathDefinition<TDefinition>\n readonly paramsDefinition: _ParamsDefinition<TDefinition>\n readonly searchDefinition: _SearchDefinition<TDefinition>\n readonly hasLooseSearch: HasLooseSearch<TDefinition>\n private _origin: string | undefined\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 this.definition = definition\n this.pathDefinition = Route0._getPathDefinitionBydefinition(definition)\n this.paramsDefinition = Route0._getParamsDefinitionBydefinition(definition)\n this.searchDefinition = Route0._getSearchDefinitionBydefinition(definition)\n this.hasLooseSearch = Route0._hasLooseSearch(definition)\n\n const { origin } = config\n if (origin && typeof origin === 'string' && origin.length) {\n this._origin = origin\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } } | undefined\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this._origin = g.location.origin\n } else {\n this._origin = undefined\n }\n }\n }\n\n /**\n * Creates a callable route instance.\n *\n * If an existing route/callable route is provided, it is cloned.\n */\n static create<TDefinition extends string>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n config?: RouteConfigInput,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n if (typeof definition === 'object') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n const original = new Route0<TDefinition>(definition, config)\n const callable = original.get.bind(original)\n Object.setPrototypeOf(callable, original)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: original.definition,\n })\n return callable as never\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>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function') {\n return definition\n }\n const original = typeof definition === 'object' ? definition : new Route0<TDefinition>(definition)\n const callable = original.get.bind(original)\n Object.setPrototypeOf(callable, original)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: original.definition,\n })\n return callable as never\n }\n\n private static _splitPathDefinitionAndSearchTailDefinition(definition: string) {\n const i = definition.indexOf('&')\n if (i === -1) return { pathDefinition: definition, searchTailDefinition: '' }\n return {\n pathDefinition: definition.slice(0, i),\n searchTailDefinition: definition.slice(i),\n }\n }\n\n private static _getAbsPath(origin: string, pathWithSearch: string) {\n return new URL(pathWithSearch, origin).toString().replace(/\\/$/, '')\n }\n\n private static _getPathDefinitionBydefinition<TDefinition extends string>(definition: TDefinition) {\n const { pathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n return pathDefinition as _PathDefinition<TDefinition>\n }\n\n private static _getParamsDefinitionBydefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _ParamsDefinition<TDefinition> {\n const { pathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n const matches = Array.from(pathDefinition.matchAll(/:([A-Za-z0-9_]+)/g))\n const paramsDefinition = Object.fromEntries(matches.map((m) => [m[1], true]))\n const keysCount = Object.keys(paramsDefinition).length\n if (keysCount === 0) {\n return undefined as _ParamsDefinition<TDefinition>\n }\n return paramsDefinition as _ParamsDefinition<TDefinition>\n }\n\n private static _getSearchDefinitionBydefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _SearchDefinition<TDefinition> {\n const { searchTailDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n if (!searchTailDefinition) {\n return undefined as _SearchDefinition<TDefinition>\n }\n const keys = searchTailDefinition.split('&').filter(Boolean)\n const searchDefinition = Object.fromEntries(keys.map((k) => [k, true]))\n const keysCount = Object.keys(searchDefinition).length\n if (keysCount === 0) {\n return undefined as _SearchDefinition<TDefinition>\n }\n return searchDefinition as _SearchDefinition<TDefinition>\n }\n\n private static _hasLooseSearch<TDefinition extends string>(definition: TDefinition): HasLooseSearch<TDefinition> {\n // ends with &\n return definition.endsWith('&') as HasLooseSearch<TDefinition>\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>> {\n const { pathDefinition: parentPathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(this.definition)\n const { pathDefinition: suffixPathDefinition, searchTailDefinition: suffixSearchTailDefinition } =\n Route0._splitPathDefinitionAndSearchTailDefinition(suffixDefinition)\n const pathDefinition = `${parentPathDefinition}/${suffixPathDefinition}`.replace(/\\/{2,}/g, '/')\n const definition = `${pathDefinition}${suffixSearchTailDefinition}` as PathExtended<TDefinition, TSuffixDefinition>\n return Route0.create<PathExtended<TDefinition, TSuffixDefinition>>(definition, { origin: this._origin })\n }\n\n // has params\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n /**\n * Builds a URL string from typed params/search input.\n *\n * - `abs: true` returns absolute URL using `origin`\n * - `hash` appends URL fragment\n * - `search` accepts named/loose search input based on definition\n */\n get(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<\n TDefinition,\n {\n search?: _LooseSearchInput<TDefinition>\n abs?: boolean | string\n hash?: string | number\n }\n >\n >,\n ): OnlyIfHasParams<TDefinition, string>\n\n // no params\n // get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>\n // get(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs?: false; hash?: string | number }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs?: false; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs: true; hash?: string | number }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathRouteValue<TDefinition>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search?: _SearchInput<TDefinition>; abs?: false; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search?: _SearchInput<TDefinition>; abs: true; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n get(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n get(\n input: OnlyIfNoParams<\n TDefinition,\n {\n search?: _LooseSearchInput<TDefinition>\n abs?: boolean | string\n hash?: string | number\n }\n >,\n ): OnlyIfNoParams<TDefinition, string>\n\n // implementation\n get(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, absOriginInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\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 = args[0]\n if (typeof input !== 'object' || input === null) {\n // throw new Error(\"Invalid get route input: expected object\")\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n absOriginInput: undefined,\n hashInput: undefined,\n }\n }\n const { search, abs, hash, ...params } = input as Record<string, string | number> & {\n search: Record<string, string | number>\n abs: boolean | string\n hash: string | undefined\n [key: string]: unknown\n }\n const absOriginInput = typeof abs === 'string' && abs.length > 0 ? abs : undefined\n return {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n searchInput: search || {},\n paramsInput: params,\n absInput: absOriginInput !== undefined || abs === true,\n absOriginInput,\n hashInput: hash,\n }\n })()\n\n // validate params\n const neededParamsKeys = this.paramsDefinition ? Object.keys(this.paramsDefinition) : []\n const providedParamsKeys = Object.keys(paramsInput)\n const notProvidedKeys = neededParamsKeys.filter((k) => !providedParamsKeys.includes(k))\n if (notProvidedKeys.length) {\n // throw new Error(`Missing params: not defined keys ${notProvidedKeys.map((k) => `\"${k}\"`).join(\", \")}.`)\n Object.assign(paramsInput, Object.fromEntries(notProvidedKeys.map((k) => [k, 'undefined'])))\n }\n\n // create url\n\n let url = this.pathDefinition as string\n // replace 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] ?? '')))\n // search params\n const searchInputStringified = Object.fromEntries(Object.entries(searchInput).map(([k, v]) => [k, String(v)]))\n url = [url, new URLSearchParams(searchInputStringified).toString()].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 // has params\n // flat(\n // input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string | number }>>,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string | number }>>,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n /**\n * Flat input variant of `get()`, where path params + search keys\n * are provided in a single object.\n */\n flat<TLoose extends boolean = HasLooseSearch<TDefinition>>(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, FlatInput<TDefinition, TLoose> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n loose?: TLoose,\n ): OnlyIfHasParams<TDefinition, string>\n\n // no params\n // flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathRouteValue<TDefinition>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n flat(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flat<TLoose extends boolean = HasLooseSearch<TDefinition>>(\n input: OnlyIfNoParams<TDefinition, FlatInput<TDefinition, TLoose> & { hash?: string | number }>,\n abs?: boolean | string,\n loose?: TLoose,\n ): OnlyIfNoParams<TDefinition, string>\n\n // implementation\n flat(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean | string\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n hashInput: undefined,\n }\n }\n const input = args[0] as Record<string, string | number> | undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof input !== 'object' || input === null) {\n // throw new Error(\"Invalid get route input: expected object\")\n return {\n searchInput: {},\n paramsInput: {},\n absInput: (args[1] as boolean | string | undefined) ?? false,\n hashInput: undefined,\n }\n }\n const loose = (args[2] as boolean | undefined) ?? this.hasLooseSearch\n const paramsKeys = this.getParamsKeys()\n const paramsInput = paramsKeys.reduce<Record<string, string | number>>((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (input[key] !== undefined) {\n acc[key] = input[key]\n }\n return acc\n }, {})\n const searchKeys = this.getSearchKeys()\n const searchInput = Object.keys(input)\n .filter((k) => {\n if (k === 'hash') {\n return false\n }\n if (searchKeys.includes(k)) {\n return true\n }\n if (paramsKeys.includes(k)) {\n return false\n }\n return loose\n })\n .reduce<Record<string, string | number>>((acc, key) => {\n acc[key] = input[key]\n return acc\n }, {})\n const hashInput = input.hash\n return {\n searchInput,\n paramsInput,\n absInput: (args[1] as boolean | string | undefined) ?? false,\n hashInput: hashInput as string | undefined,\n }\n })()\n\n return this.get({\n ...paramsInput,\n search: searchInput,\n abs: absInput,\n hash: hashInput,\n } as never)\n }\n\n /** Same as `flat()`, but always accepts loose search keys. */\n flatLoose(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, LooseFlatInput<TDefinition> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n ): OnlyIfHasParams<TDefinition, string>\n flatLoose(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flatLoose(\n input: OnlyIfNoParams<TDefinition, LooseFlatInput<TDefinition> & { hash?: string | number }>,\n abs?: boolean | string,\n ): OnlyIfNoParams<TDefinition, string>\n flatLoose(...args: unknown[]): string {\n return this.flat(args[0] as never, args[1] as never, true)\n }\n\n /** Same as `flat()`, but only allows declared search keys. */\n flatStrict(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, StrictFlatInput<TDefinition> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n ): OnlyIfHasParams<TDefinition, string>\n flatStrict(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flatStrict(\n input: OnlyIfNoParams<TDefinition, StrictFlatInput<TDefinition> & { hash?: string | number }>,\n abs?: boolean | string,\n ): OnlyIfNoParams<TDefinition, string>\n flatStrict(...args: unknown[]): string {\n return this.flat(args[0] as never, args[1] as never, false)\n }\n\n /** Returns path param keys extracted from route definition. */\n getParamsKeys(): string[] {\n return Object.keys(this.paramsDefinition || {})\n }\n /** Returns named search keys extracted from route definition. */\n getSearchKeys(): string[] {\n return Object.keys(this.searchDefinition || {})\n }\n /** Returns all flat input keys (`search + params`). */\n getFlatKeys(): string[] {\n return [...this.getSearchKeys(), ...this.getParamsKeys()]\n }\n\n getDefinition(): string {\n return this.pathDefinition\n }\n\n /** Clones route with optional config override. */\n clone(config?: RouteConfigInput): CallableRoute<TDefinition> {\n return Route0.create(this.definition, config)\n }\n\n getRegexBaseStrictString(): string {\n return this.pathDefinition\n .replace(/:(\\w+)/g, '___PARAM___') // temporarily replace params with placeholder\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // escape regex special chars\n .replace(/___PARAM___/g, '([^/]+)')\n }\n\n getRegexBaseString(): string {\n return this.getRegexBaseStrictString().replace(/\\/+$/, '') + '/?' // remove trailing slashes and add optional slash\n }\n\n getRegexStrictString(): string {\n return `^${this.getRegexBaseStrictString()}$`\n }\n\n getRegexString(): string {\n return `^${this.getRegexBaseString()}$`\n }\n\n getRegexStrict(): RegExp {\n return new RegExp(this.getRegexStrictString())\n }\n\n getRegex(): RegExp {\n return new RegExp(this.getRegexString())\n }\n\n /** Creates a grouped strict regex pattern string from many routes. */\n static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a strict grouped regex from many routes. */\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Creates a grouped regex pattern string from many routes. */\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a grouped regex from many routes. */\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Converts any location shape to relative form (removes host/origin fields). */\n static toRelLocation<TLocation extends AnyLocation>(location: TLocation): TLocation {\n return {\n ...location,\n abs: false,\n origin: undefined,\n href: undefined,\n port: undefined,\n host: undefined,\n hostname: undefined,\n }\n }\n\n /** Converts a location to absolute form using provided origin URL. */\n static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, origin: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, origin)\n return {\n ...location,\n abs: true,\n origin: url.origin,\n href: url.href,\n port: url.port,\n host: url.host,\n hostname: url.hostname,\n }\n }\n\n /**\n * Parses a URL-like input into raw location object (without route knowledge).\n *\n * Result is always `UnknownLocation` because no route matching is applied.\n */\n static getLocation(href: `${string}://${string}`): UnknownLocation\n static getLocation(hrefRel: `/${string}`): UnknownLocation\n static getLocation(hrefOrHrefRel: string): UnknownLocation\n static getLocation(location: AnyLocation): UnknownLocation\n static getLocation(url: URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return Route0.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n // Check if it's an absolute URL (starts with scheme://)\n const abs = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(hrefOrHrefRelOrLocation)\n\n // Use dummy base only if relative\n const base = abs ? undefined : 'http://example.com'\n const url = new URL(hrefOrHrefRelOrLocation, base)\n\n // Extract search params\n const searchParams = Object.fromEntries(url.searchParams.entries())\n\n // Normalize pathname (remove trailing slash except for root)\n let pathname = url.pathname\n if (pathname.length > 1 && pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1)\n }\n\n // Common derived values\n const hrefRel = pathname + url.search + url.hash\n\n // Build the location object consistent with _GeneralLocation\n const location: UnknownLocation = {\n pathname,\n search: 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 searchParams,\n params: undefined,\n route: undefined,\n known: false,\n exact: false,\n ancestor: false,\n descendant: false,\n unmatched: false,\n }\n\n return location\n }\n\n /**\n * Parses input and matches it against this route definition.\n *\n * Result includes relation flags:\n * - `exact`\n * - `ancestor`\n * - `descendant`\n * - `unmatched`\n */\n getLocation(href: `${string}://${string}`): KnownLocation<TDefinition>\n getLocation(hrefRel: `/${string}`): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRel: string): KnownLocation<TDefinition>\n getLocation(location: AnyLocation): KnownLocation<TDefinition>\n getLocation(url: AnyLocation): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition> {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return this.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n const location = Route0.getLocation(hrefOrHrefRelOrLocation) as never as KnownLocation<TDefinition>\n location.route = this.definition as Definition<TDefinition>\n location.params = {}\n\n // Normalize pathname (no trailing slash except root)\n const pathname =\n location.pathname.length > 1 && location.pathname.endsWith('/')\n ? location.pathname.slice(0, -1)\n : location.pathname\n\n // Extract param names from the definition\n const paramNames: string[] = []\n const def =\n this.pathDefinition.length > 1 && this.pathDefinition.endsWith('/')\n ? this.pathDefinition.slice(0, -1)\n : this.pathDefinition\n def.replace(/:([A-Za-z0-9_]+)/g, (_m: string, name: string) => {\n paramNames.push(String(name))\n return ''\n })\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const ancestorRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n const ancestorMatch = pathname.match(ancestorRe)\n const exact = !!exactMatch\n const ancestor = !exact && !!ancestorMatch\n\n // Parse params for exact and ancestor matches.\n const paramsMatch = exactMatch || (ancestor ? ancestorMatch : null)\n if (paramsMatch) {\n const values = paramsMatch.slice(1, 1 + paramNames.length)\n const params = Object.fromEntries(paramNames.map((n, i) => [n, decodeURIComponent(values[i] ?? '')]))\n location.params = params\n } else {\n location.params = {}\n }\n\n // \"descendant\": the URL is a prefix of the route definition (params match any single segment)\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n const defParts = getParts(def)\n const pathParts = getParts(pathname)\n\n let isPrefix = true\n if (pathParts.length > defParts.length) {\n isPrefix = false\n } else {\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart) {\n isPrefix = false\n break\n }\n if (defPart.startsWith(':')) continue\n if (defPart !== 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.slice(1)] = 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 paramsKeys = this.getParamsKeys()\n if (input === undefined) {\n if (paramsKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${paramsKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid input: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const inputKeys = Object.keys(inputObj)\n const notDefinedKeys = paramsKeys.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> = {}\n for (const k of paramsKeys) {\n const v = inputObj[k]\n 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 input: expected string, number, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as ParamsOutput<TDefinition>,\n }\n }\n\n private _validateSearchInput<TLoose extends boolean>(\n input: unknown,\n loose: TLoose,\n ): StandardSchemaV1.Result<TLoose extends true ? LooseSearchOutput<TDefinition> : StrictSearchOutput<TDefinition>> {\n if (input === undefined) {\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid input: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const paramsKeys = this.getParamsKeys()\n const searchKeys = this.getSearchKeys()\n const data: Record<string, string> = {}\n for (const [k, v] of Object.entries(inputObj)) {\n if (k === 'hash') continue\n if (paramsKeys.includes(k)) continue\n if (!loose && !searchKeys.includes(k)) continue\n if (v === undefined) continue\n 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 input: expected string, number, or undefined, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as TLoose extends true ? LooseSearchOutput<TDefinition> : StrictSearchOutput<TDefinition>,\n }\n }\n\n private _validateFlatInput<TLoose extends boolean>(\n input: unknown,\n loose: TLoose,\n ): StandardSchemaV1.Result<TLoose extends true ? LooseFlatOutput<TDefinition> : StrictFlatOutput<TDefinition>> {\n const paramsResult = this._validateParamsInput(input)\n if ('issues' in paramsResult) {\n return {\n issues: paramsResult.issues ?? [],\n }\n }\n\n const searchResult = this._validateSearchInput(input, loose)\n if ('issues' in searchResult) {\n return {\n issues: searchResult.issues ?? [],\n }\n }\n\n return {\n value: {\n ...(searchResult.value as Record<string, string>),\n ...(paramsResult.value as Record<string, string>),\n } as TLoose extends true ? LooseFlatOutput<TDefinition> : StrictFlatOutput<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 paramsInputSchema: Route0Schema<ParamsInput<TDefinition> | undefined, ParamsOutput<TDefinition>> = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateParamsInput(value),\n types: undefined as unknown as StandardSchemaV1.Types<\n ParamsInput<TDefinition> | undefined,\n ParamsOutput<TDefinition>\n >,\n },\n parse: (value) => this._parseSchemaResult(this._validateParamsInput(value)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateParamsInput(value)),\n }\n\n /** Standard Schema for strict search input. */\n readonly strictSearchInputSchema: Route0Schema<\n StrictSearchInput<TDefinition> | undefined,\n StrictSearchOutput<TDefinition>\n > = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateSearchInput(value, false),\n types: undefined as unknown as StandardSchemaV1.Types<\n StrictSearchInput<TDefinition> | undefined,\n StrictSearchOutput<TDefinition>\n >,\n },\n parse: (value) => this._parseSchemaResult(this._validateSearchInput(value, false)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateSearchInput(value, false)),\n }\n\n /** Standard Schema for loose search input. */\n readonly looseSearchInputSchema: Route0Schema<\n LooseSearchInput<TDefinition> | undefined,\n LooseSearchOutput<TDefinition>\n > = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateSearchInput(value, true),\n types: undefined as unknown as StandardSchemaV1.Types<\n LooseSearchInput<TDefinition> | undefined,\n LooseSearchOutput<TDefinition>\n >,\n },\n parse: (value) => this._parseSchemaResult(this._validateSearchInput(value, true)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateSearchInput(value, true)),\n }\n\n /** Standard Schema for route flat input (uses route default strict/loose mode). */\n readonly flatInputSchema: Route0Schema<\n FlatInput<TDefinition, HasLooseSearch<TDefinition>> | undefined,\n FlatOutput<TDefinition, HasLooseSearch<TDefinition>>\n > = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>),\n types: undefined as unknown as StandardSchemaV1.Types<\n FlatInput<TDefinition, HasLooseSearch<TDefinition>> | undefined,\n FlatOutput<TDefinition, HasLooseSearch<TDefinition>>\n >,\n },\n parse: (value) =>\n this._parseSchemaResult(this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>)),\n safeParse: (value) =>\n this._safeParseSchemaResult(this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>)),\n }\n\n /** True when path structure is equal (param names are ignored). */\n isSame(other: AnyRoute): boolean {\n return (\n this.pathDefinition.replace(/:([A-Za-z0-9_]+)/g, '__PARAM__') ===\n other.pathDefinition.replace(/:([A-Za-z0-9_]+)/g, '__PARAM__')\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.pathDefinition === '/' && this.pathDefinition !== '/') {\n return true\n }\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\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.pathDefinition === '/' && other.pathDefinition !== '/') {\n return true\n }\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\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 getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\n\n // Different lengths = no conflict (one is deeper than the other)\n if (thisParts.length !== otherParts.length) {\n return false\n }\n\n // Check if all segments could match\n for (let i = 0; i < thisParts.length; i++) {\n const thisPart = thisParts[i]\n const otherPart = otherParts[i]\n\n // Both params = always match\n if (thisPart.startsWith(':') && otherPart.startsWith(':')) {\n continue\n }\n\n // One is param = can match\n if (thisPart.startsWith(':') || otherPart.startsWith(':')) {\n continue\n }\n\n // Both static = must be same\n if (thisPart !== otherPart) {\n return false\n }\n }\n\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 // More specific = should come earlier when conflicted\n // Static segments beat param segments at the same position\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\n\n // Compare segment by segment\n for (let i = 0; i < Math.min(thisParts.length, otherParts.length); i++) {\n const thisIsStatic = !thisParts[i].startsWith(':')\n const otherIsStatic = !otherParts[i].startsWith(':')\n\n if (thisIsStatic && !otherIsStatic) return true\n if (!thisIsStatic && otherIsStatic) return false\n }\n\n // All equal, use lexicographic\n return this.pathDefinition < other.pathDefinition\n }\n}\n\n/**\n * Typed route collection with deterministic matching order.\n *\n * `Routes.create()` accepts either plain string definitions or route objects\n * and returns a \"pretty\" object with direct route access + helper methods under `._`.\n */\n\nexport class Routes<const T extends RoutesRecord = any> {\n _routes: RoutesRecordHydrated<T>\n _pathsOrdering: string[]\n _keysOrdering: string[]\n _ordered: CallableRoute[]\n\n _: {\n routes: Routes<T>['_routes']\n getLocation: Routes<T>['_getLocation']\n clone: Routes<T>['_clone']\n pathsOrdering: Routes<T>['_pathsOrdering']\n keysOrdering: Routes<T>['_keysOrdering']\n ordered: Routes<T>['_ordered']\n }\n\n private constructor({\n routes,\n isHydrated = false,\n pathsOrdering,\n keysOrdering,\n ordered,\n }: {\n routes: RoutesRecordHydrated<T> | T\n isHydrated?: boolean\n pathsOrdering?: string[]\n keysOrdering?: string[]\n ordered?: CallableRoute[]\n }) {\n this._routes = (\n isHydrated ? (routes as RoutesRecordHydrated<T>) : Routes.hydrate(routes)\n ) as RoutesRecordHydrated<T>\n if (!pathsOrdering || !keysOrdering || !ordered) {\n const ordering = Routes.makeOrdering(this._routes)\n this._pathsOrdering = ordering.pathsOrdering\n this._keysOrdering = ordering.keysOrdering\n this._ordered = this._keysOrdering.map((key) => this._routes[key])\n } else {\n this._pathsOrdering = pathsOrdering\n this._keysOrdering = keysOrdering\n this._ordered = ordered\n }\n this._ = {\n routes: this._routes,\n getLocation: this._getLocation.bind(this),\n clone: this._clone.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n /** Creates and hydrates a typed routes collection. */\n static create<const T extends RoutesRecord>(routes: T, override?: RouteConfigInput): RoutesPretty<T> {\n const result = Routes.prettify(new Routes({ routes }))\n if (!override) {\n return result\n }\n return result._.clone(override)\n }\n\n private static prettify<const T extends RoutesRecord>(instance: Routes<T>): RoutesPretty<T> {\n Object.setPrototypeOf(instance, Routes.prototype)\n Object.defineProperty(instance, Symbol.toStringTag, {\n value: 'Routes',\n })\n Object.assign(instance, {\n clone: instance._clone.bind(instance),\n })\n Object.assign(instance, instance._routes)\n return instance as unknown as RoutesPretty<T>\n }\n\n private static hydrate<const T extends RoutesRecord>(routes: T): RoutesRecordHydrated<T> {\n const result = {} as RoutesRecordHydrated<T>\n for (const key in routes) {\n if (Object.hasOwn(routes, key)) {\n const value = routes[key]\n result[key] = (typeof value === 'string' ? Route0.create(value) : value) as CallableRoute<T[typeof key]>\n }\n }\n return result\n }\n\n /**\n * Matches an input URL against collection routes.\n *\n * Returns first exact match according to precomputed ordering,\n * otherwise returns `UnknownLocation`.\n */\n _getLocation(href: `${string}://${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefRel: `/${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRel: string): UnknownLocation | ExactLocation\n _getLocation(location: AnyLocation): UnknownLocation | ExactLocation\n _getLocation(url: URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation {\n // Find the route that exactly matches the given location\n const input = hrefOrHrefRelOrLocation\n for (const route of this._ordered) {\n const loc = route.getLocation(hrefOrHrefRelOrLocation)\n if (loc.exact) {\n return loc\n }\n }\n // No exact match found, return UnknownLocation\n return typeof input === 'string' ? Route0.getLocation(input) : Route0.getLocation(input)\n }\n\n private static makeOrdering(routes: RoutesRecord): {\n pathsOrdering: string[]\n keysOrdering: string[]\n } {\n const hydrated = Routes.hydrate(routes)\n const entries = Object.entries(hydrated)\n\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n // Sort: shorter paths first, then by specificity, then alphabetically\n entries.sort(([_keyA, routeA], [_keyB, routeB]) => {\n const partsA = getParts(routeA.pathDefinition)\n const partsB = getParts(routeB.pathDefinition)\n\n // 1. Shorter paths first (by segment count)\n if (partsA.length !== partsB.length) {\n return partsA.length - partsB.length\n }\n\n // 2. Same length: check if they conflict\n if (routeA.isConflict(routeB)) {\n // Conflicting routes: more specific first\n if (routeA.isMoreSpecificThan(routeB)) return -1\n if (routeB.isMoreSpecificThan(routeA)) return 1\n }\n\n // 3. Same length, not conflicting or equal specificity: alphabetically\n return routeA.pathDefinition.localeCompare(routeB.pathDefinition)\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<T extends Route0<string> | string = string> = T extends string ? Route0<T> : T\n/** Callable route (`route(input)`) plus route instance methods/properties. */\nexport type CallableRoute<T extends Route0<string> | string = string> = AnyRoute<T> & AnyRoute<T>['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 PathDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['pathDefinition']\n : T extends string\n ? _PathDefinition<T>\n : never\nexport type ParamsDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['paramsDefinition']\n : T extends string\n ? _ParamsDefinition<T>\n : undefined\nexport type SearchDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['searchDefinition']\n : T extends string\n ? _SearchDefinition<T>\n : undefined\n\nexport type Extended<T extends AnyRoute | string | undefined, TSuffixDefinition extends string> = T extends AnyRoute\n ? Route0<PathExtended<T['definition'], TSuffixDefinition>>\n : T extends string\n ? Route0<PathExtended<T, TSuffixDefinition>>\n : T extends undefined\n ? Route0<TSuffixDefinition>\n : never\n\nexport type IsAncestor<T extends AnyRoute | string, TAncestor extends AnyRoute | string> = _IsAncestor<\n PathDefinition<T>,\n PathDefinition<TAncestor>\n>\nexport type IsDescendant<T extends AnyRoute | string, TDescendant extends AnyRoute | string> = _IsDescendant<\n PathDefinition<T>,\n PathDefinition<TDescendant>\n>\nexport type IsSame<T extends AnyRoute | string, TExact extends AnyRoute | string> = _IsSame<\n PathDefinition<T>,\n PathDefinition<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> =\n ExtractPathParams<PathDefinition<T>> extends infer U ? ([U] extends [never] ? false : true) : false\nexport type HasSearch<T extends AnyRoute | string> = Definition<T> extends `${string}&${string}` ? true : false\nexport type HasNamedSearch<T extends AnyRoute | string> = // Definition<T> extends `${string}&${string}` ? true : false\n SearchTailDefinitionWithoutFirstAndLastAmp<Definition<T>> extends '' ? false : true\nexport type HasLooseSearch<T extends AnyRoute | string> = Definition<T> extends `${string}&` ? true : false\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: string\n}\nexport type LooseSearchOutput<T extends AnyRoute | string = string> = Partial<\n {\n [K in keyof SearchDefinition<T>]?: string\n } & Record<string, string | undefined>\n>\nexport type StrictSearchOutput<T extends AnyRoute | string> = Partial<{\n [K in keyof SearchDefinition<T>]?: string | undefined\n}>\nexport type LooseFlatOutput<T extends AnyRoute | string = string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & LooseSearchOutput<T> : LooseSearchOutput<T>\nexport type StrictFlatOutput<T extends AnyRoute | string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>\nexport type FlatOutput<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = TLoose extends true\n ? LooseFlatOutput<T>\n : StrictFlatOutput<T>\nexport type LooseFlatOutputWithHash<T extends AnyRoute | string = string> = LooseFlatOutput<T> & {\n hash?: string | undefined\n}\nexport type StrictFlatOutputWithHash<T extends AnyRoute | string> = StrictFlatOutput<T> & { hash?: string | undefined }\nexport type FlatOutputWithHash<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = FlatOutput<\n T,\n TLoose\n> & { hash?: string | undefined }\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>\nexport type LooseSearchInput<T extends AnyRoute | string = string> = _LooseSearchInput<Definition<T>>\nexport type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>\nexport type LooseFlatInput<T extends AnyRoute | string> = _LooseFlatInput<Definition<T>>\nexport type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>\nexport type FlatInput<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = TLoose extends true\n ? LooseFlatInput<T>\n : StrictFlatInput<T>\nexport type LooseFlatInputWithHash<T extends AnyRoute | string> = LooseFlatInput<T> & {\n hash?: string | number\n}\nexport type StrictFlatInputWithHash<T extends AnyRoute | string> = StrictFlatInput<T> & {\n hash?: string | number\n}\nexport type FlatInputWithHash<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = FlatInput<\n T,\n TLoose\n> & { hash?: string | number }\nexport type CanInputBeEmpty<T extends AnyRoute | string> = HasParams<Definition<T>> extends true ? false : true\n\nexport type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<PathDefinition<T>>\nexport type LooseSearchInputStringOnly<T extends AnyRoute | string = string> = _LooseSearchInputStringOnly<\n Definition<T>\n>\nexport type StrictSearchInputStringOnly<T extends AnyRoute | string> = _StrictSearchInputStringOnly<Definition<T>>\nexport type LooseFlatInputStringOnly<T extends AnyRoute | string> = _LooseFlatInputStringOnly<Definition<T>>\nexport type StrictFlatInputStringOnly<T extends AnyRoute | string> = _StrictFlatInputStringOnly<Definition<T>>\nexport type FlatInputStringOnly<\n T extends AnyRoute | string,\n TLoose extends boolean = HasLooseSearch<T>,\n> = TLoose extends true ? LooseFlatInputStringOnly<T> : StrictFlatInputStringOnly<T>\n\n// location\n\nexport type LocationParams<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: string\n}\nexport type LocationSearch<TDefinition extends string = string> = {\n [K in keyof _SearchDefinition<TDefinition>]: string | undefined\n} & Record<string, string | undefined>\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 * Raw query string with leading `?`, if present.\n *\n * Example:\n * - `?tab=posts&sort=desc`\n */\n search: string\n /**\n * Parsed query map (first value per key).\n *\n * Example:\n * - search: `?tab=posts&sort=desc`\n * - searchParams: `{ tab: 'posts', sort: 'desc' }`\n */\n searchParams: Record<string, string | undefined>\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 searchParams: LooseSearchOutput\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 searchParams: Record<string, string | undefined>\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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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\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 searchParams: LooseSearchOutput<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 _PathDefinition<T extends string> = T extends string ? TrimSearchTailDefinition<T> : never\nexport type _ParamsDefinition<TDefinition extends string> =\n ExtractPathParams<PathDefinition<TDefinition>> extends infer U\n ? [U] extends [never]\n ? undefined\n : { [K in Extract<U, string>]: true }\n : undefined\nexport type _SearchDefinition<TDefinition extends string> =\n NonEmpty<SearchTailDefinitionWithoutFirstAndLastAmp<TDefinition>> extends infer Tail extends string\n ? AmpSplit<Tail> extends infer U\n ? [U] extends [never]\n ? undefined\n : { [K in Extract<U, string>]: true }\n : undefined\n : undefined\n\nexport type _ParamsInput<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends undefined\n ? Record<never, never>\n : {\n [K in keyof _ParamsDefinition<TDefinition>]: string | number\n }\nexport type _LooseSearchInput<TDefinition extends string> =\n _SearchDefinition<TDefinition> extends undefined\n ? Record<string, string | number>\n : Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string | number\n }> &\n Record<string, string | number>\nexport type _StrictSearchInput<TDefinition extends string> = Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string | number\n}>\nexport type _LooseFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInput<TDefinition> & _LooseSearchInput<TDefinition>\n : _LooseSearchInput<TDefinition>\nexport type _StrictFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition> & _ParamsInput<TDefinition>\n : _ParamsInput<TDefinition>\n : HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition>\n : Record<never, never>\n\nexport type _ParamsInputStringOnly<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends undefined\n ? Record<never, never>\n : {\n [K in keyof _ParamsDefinition<TDefinition>]: string\n }\nexport type _LooseSearchInputStringOnly<TDefinition extends string> =\n _SearchDefinition<TDefinition> extends undefined\n ? Record<string, string>\n : Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string\n }> &\n Record<string, string>\nexport type _StrictSearchInputStringOnly<TDefinition extends string> = Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string\n}>\nexport type _LooseFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInputStringOnly<TDefinition> & _LooseSearchInputStringOnly<TDefinition>\n : _LooseSearchInputStringOnly<TDefinition>\nexport type _StrictFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition> & _ParamsInputStringOnly<TDefinition>\n : _ParamsInputStringOnly<TDefinition>\n : HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition>\n : Record<never, never>\n\nexport type TrimSearchTailDefinition<S extends string> = S extends `${infer P}&${string}` ? P : S\nexport type SearchTailDefinitionWithoutFirstAmp<S extends string> = S extends `${string}&${infer T}` ? T : ''\nexport type SearchTailDefinitionWithoutFirstAndLastAmp<S extends string> = S extends `${string}&${infer T}&`\n ? T\n : S extends `${string}&${infer T}`\n ? T\n : ''\nexport type SearchTailDefinitionWithFirstAmp<S extends string> = S extends `${string}&${infer T}` ? `&${T}` : ''\nexport type AmpSplit<S extends string> = S extends `${infer A}&${infer B}` ? A | AmpSplit<B> : S\nexport type NonEmpty<T> = [T] extends ['' | never] ? never : T\nexport type ExtractPathParams<S extends string> = S extends `${string}:${infer After}`\n ? After extends `${infer Name}/${infer Rest}`\n ? Name | ExtractPathParams<`/${Rest}`>\n : After\n : never\nexport type ReplacePathParams<S extends string> = S extends `${infer Head}:${infer Tail}`\n ? // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Tail extends `${infer _Param}/${infer Rest}`\n ? ReplacePathParams<`${Head}${string}/${Rest}`>\n : `${Head}${string}`\n : S\nexport type DedupeSlashes<S extends string> = S extends `${infer A}//${infer B}` ? DedupeSlashes<`${A}/${B}`> : S\nexport type EmptyRecord = Record<never, never>\nexport type JoinPath<Parent extends string, Suffix extends string> = DedupeSlashes<\n PathDefinition<Parent> extends infer A extends string\n ? PathDefinition<Suffix> extends infer B extends string\n ? A extends ''\n ? B extends ''\n ? ''\n : B extends `/${string}`\n ? B\n : `/${B}`\n : B extends ''\n ? A\n : A extends `${string}/`\n ? `${A}${B}`\n : B extends `/${string}`\n ? `${A}${B}`\n : `${A}/${B}`\n : never\n : never\n>\n\nexport type OnlyIfNoParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends false ? Yes : No\nexport type OnlyIfHasParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends true ? Yes : No\n\n// export type PathRouteValue<TDefinition extends string> = `${ReplacePathParams<PathDefinition<TDefinition>>}`\n// export type PathOnlyRouteValue<TDefinition extends string> = `${ReplacePathParams<PathDefinition<TDefinition>>}`\n// export type WithSearchRouteValue<TDefinition extends string> =\n// `${ReplacePathParams<PathDefinition<TDefinition>>}?${string}`\n// export type AbsolutePathRouteValue<TDefinition extends string> =\n// PathRouteValue<TDefinition> extends '/' ? string : `${string}${PathRouteValue<TDefinition>}`\n// export type AbsolutePathOnlyRouteValue<TDefinition extends string> =\n// PathOnlyRouteValue<TDefinition> extends '/' ? string : `${string}${PathOnlyRouteValue<TDefinition>}`\n// export type AbsoluteWithSearchRouteValue<TDefinition extends string> = `${string}${WithSearchRouteValue<TDefinition>}`\n\nexport type PathExtended<\n TSourcedefinitionDefinition extends string,\n TSuffixdefinitionDefinition extends string,\n> = `${JoinPath<TSourcedefinitionDefinition, TSuffixdefinitionDefinition>}${SearchTailDefinitionWithFirstAmp<TSuffixdefinitionDefinition>}`\n\nexport type WithParamsInput<\n TDefinition extends string,\n T extends\n | {\n search?: _LooseSearchInput<any>\n abs?: boolean | string\n hash?: string | number\n }\n | undefined = undefined,\n> = _ParamsInput<TDefinition> & (T extends undefined ? Record<never, never> : T)\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 }\nexport type SafeParseInputStrictResult<TDefinition extends string> = _SafeParseInputResult<\n StrictFlatOutput<TDefinition>\n>\nexport type SafeParseInputLooseResult<TDefinition extends string> = _SafeParseInputResult<LooseFlatOutput<TDefinition>>\nexport type Route0Schema<\n TInput extends Record<string, unknown> | undefined,\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":["absOriginInput","paramsInput","searchInput","hashInput"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\n\n// TODO: asterisk\n// TODO: when asterisk then query params will be extended also after extend\n// TODO: optional params\n// TODO: required search\n\n// TODO: .extension('.json') to not add additional / but just add some extension\n// TODO: search input can be boolean, or even object with qs\n// TODO: route0 if ens with \"...&\" then can be any query, else only provided type of queries\n// TODO: Роут0 три мод, тогда там все ноуты кончаются на .селф\n// TODO: use splats in param definition \"*\"\n// TODO: ? check extend for search only .extend('&x&z')\n// TODO: .create(route, {useSearch, useParams})\n// TODO: Из пас экзакт, из пасвизквери экзает, из чилдрен, из парент, из экзактОр\n// TODO: isEqual, isDescendant, isAncestor\n// TODO: extractParams, extractSearch\n// TODO: getPathDefinition respecting definitionParamPrefix, definitionSearchPrefix\n// TODO: prepend\n// TODO: ?? Route0.createTree({base:{self: x, children: ...})\n// TODO: ? Routes.create({base:{self: x, children: ...}).attach('section', Routes.create({...}))\n// TODO: overrideTree\n// TODO: .create(route, {origin, useLocation})\n// TODO: ? optional path params as @\n// TODO: prependMany, extendMany, overrideMany, with types\n// TODO: optional route params /x/:id?\n// TODO: fix CallableRoute<CallableRoute<>> in RoutesPretty type, it should be just CallableRoute<>\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> {\n readonly definition: TDefinition\n readonly pathDefinition: _PathDefinition<TDefinition>\n readonly paramsDefinition: _ParamsDefinition<TDefinition>\n readonly searchDefinition: _SearchDefinition<TDefinition>\n readonly hasLooseSearch: HasLooseSearch<TDefinition>\n private _origin: string | undefined\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 this.definition = definition\n this.pathDefinition = Route0._getPathDefinitionBydefinition(definition)\n this.paramsDefinition = Route0._getParamsDefinitionBydefinition(definition)\n this.searchDefinition = Route0._getSearchDefinitionBydefinition(definition)\n this.hasLooseSearch = Route0._hasLooseSearch(definition)\n\n const { origin } = config\n if (origin && typeof origin === 'string' && origin.length) {\n this._origin = origin\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } } | undefined\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this._origin = g.location.origin\n } else {\n this._origin = undefined\n }\n }\n }\n\n /**\n * Creates a callable route instance.\n *\n * If an existing route/callable route is provided, it is cloned.\n */\n static create<TDefinition extends string>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n config?: RouteConfigInput,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n if (typeof definition === 'object') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n const original = new Route0<TDefinition>(definition, config)\n const callable = original.get.bind(original)\n Object.setPrototypeOf(callable, original)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: original.definition,\n })\n return callable as never\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>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function') {\n return definition\n }\n const original = typeof definition === 'object' ? definition : new Route0<TDefinition>(definition)\n const callable = original.get.bind(original)\n Object.setPrototypeOf(callable, original)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: original.definition,\n })\n return callable as never\n }\n\n private static _splitPathDefinitionAndSearchTailDefinition(definition: string) {\n const i = definition.indexOf('&')\n if (i === -1) return { pathDefinition: definition, searchTailDefinition: '' }\n return {\n pathDefinition: definition.slice(0, i),\n searchTailDefinition: definition.slice(i),\n }\n }\n\n private static _getAbsPath(origin: string, pathWithSearch: string) {\n return new URL(pathWithSearch, origin).toString().replace(/\\/$/, '')\n }\n\n private static _getPathDefinitionBydefinition<TDefinition extends string>(definition: TDefinition) {\n const { pathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n return pathDefinition as _PathDefinition<TDefinition>\n }\n\n private static _getParamsDefinitionBydefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _ParamsDefinition<TDefinition> {\n const { pathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n const matches = Array.from(pathDefinition.matchAll(/:([A-Za-z0-9_]+)/g))\n const paramsDefinition = Object.fromEntries(matches.map((m) => [m[1], true]))\n const keysCount = Object.keys(paramsDefinition).length\n if (keysCount === 0) {\n return undefined as _ParamsDefinition<TDefinition>\n }\n return paramsDefinition as _ParamsDefinition<TDefinition>\n }\n\n private static _getSearchDefinitionBydefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _SearchDefinition<TDefinition> {\n const { searchTailDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n if (!searchTailDefinition) {\n return undefined as _SearchDefinition<TDefinition>\n }\n const keys = searchTailDefinition.split('&').filter(Boolean)\n const searchDefinition = Object.fromEntries(keys.map((k) => [k, true]))\n const keysCount = Object.keys(searchDefinition).length\n if (keysCount === 0) {\n return undefined as _SearchDefinition<TDefinition>\n }\n return searchDefinition as _SearchDefinition<TDefinition>\n }\n\n private static _hasLooseSearch<TDefinition extends string>(definition: TDefinition): HasLooseSearch<TDefinition> {\n // ends with &\n return definition.endsWith('&') as HasLooseSearch<TDefinition>\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>> {\n const { pathDefinition: parentPathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(this.definition)\n const { pathDefinition: suffixPathDefinition, searchTailDefinition: suffixSearchTailDefinition } =\n Route0._splitPathDefinitionAndSearchTailDefinition(suffixDefinition)\n const pathDefinition = `${parentPathDefinition}/${suffixPathDefinition}`.replace(/\\/{2,}/g, '/')\n const definition = `${pathDefinition}${suffixSearchTailDefinition}` as PathExtended<TDefinition, TSuffixDefinition>\n return Route0.create<PathExtended<TDefinition, TSuffixDefinition>>(definition, { origin: this._origin })\n }\n\n // has params\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n /**\n * Builds a URL string from typed params/search input.\n *\n * - `abs: true` returns absolute URL using `origin`\n * - `hash` appends URL fragment\n * - `search` accepts named/loose search input based on definition\n */\n get(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<\n TDefinition,\n {\n search?: _LooseSearchInput<TDefinition>\n abs?: boolean | string\n hash?: string | number\n }\n >\n >,\n ): OnlyIfHasParams<TDefinition, string>\n\n // no params\n // get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>\n // get(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs?: false; hash?: string | number }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs?: false; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs: true; hash?: string | number }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathRouteValue<TDefinition>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search?: _SearchInput<TDefinition>; abs?: false; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search?: _SearchInput<TDefinition>; abs: true; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n get(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n get(\n input: OnlyIfNoParams<\n TDefinition,\n {\n search?: _LooseSearchInput<TDefinition>\n abs?: boolean | string\n hash?: string | number\n }\n >,\n ): OnlyIfNoParams<TDefinition, string>\n\n // implementation\n get(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, absOriginInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\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 = args[0]\n if (typeof input !== 'object' || input === null) {\n // throw new Error(\"Invalid get route input: expected object\")\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n absOriginInput: undefined,\n hashInput: undefined,\n }\n }\n const { search, abs, hash, ...params } = input as Record<string, string | number> & {\n search: Record<string, string | number>\n abs: boolean | string\n hash: string | undefined\n [key: string]: unknown\n }\n const absOriginInput = typeof abs === 'string' && abs.length > 0 ? abs : undefined\n return {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n searchInput: search || {},\n paramsInput: params,\n absInput: absOriginInput !== undefined || abs === true,\n absOriginInput,\n hashInput: hash,\n }\n })()\n\n // validate params\n const neededParamsKeys = this.paramsDefinition ? Object.keys(this.paramsDefinition) : []\n const providedParamsKeys = Object.keys(paramsInput)\n const notProvidedKeys = neededParamsKeys.filter((k) => !providedParamsKeys.includes(k))\n if (notProvidedKeys.length) {\n // throw new Error(`Missing params: not defined keys ${notProvidedKeys.map((k) => `\"${k}\"`).join(\", \")}.`)\n Object.assign(paramsInput, Object.fromEntries(notProvidedKeys.map((k) => [k, 'undefined'])))\n }\n\n // create url\n\n let url = this.pathDefinition as string\n // replace 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] ?? '')))\n // search params\n const searchInputStringified = Object.fromEntries(Object.entries(searchInput).map(([k, v]) => [k, String(v)]))\n url = [url, new URLSearchParams(searchInputStringified).toString()].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 // has params\n // flat(\n // input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string | number }>>,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string | number }>>,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n /**\n * Flat input variant of `get()`, where path params + search keys\n * are provided in a single object.\n */\n flat<TLoose extends boolean = HasLooseSearch<TDefinition>>(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, FlatInput<TDefinition, TLoose> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n loose?: TLoose,\n ): OnlyIfHasParams<TDefinition, string>\n\n // no params\n // flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathRouteValue<TDefinition>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n flat(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flat<TLoose extends boolean = HasLooseSearch<TDefinition>>(\n input: OnlyIfNoParams<TDefinition, FlatInput<TDefinition, TLoose> & { hash?: string | number }>,\n abs?: boolean | string,\n loose?: TLoose,\n ): OnlyIfNoParams<TDefinition, string>\n\n // implementation\n flat(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean | string\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n hashInput: undefined,\n }\n }\n const input = args[0] as Record<string, string | number> | undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof input !== 'object' || input === null) {\n // throw new Error(\"Invalid get route input: expected object\")\n return {\n searchInput: {},\n paramsInput: {},\n absInput: (args[1] as boolean | string | undefined) ?? false,\n hashInput: undefined,\n }\n }\n const loose = (args[2] as boolean | undefined) ?? this.hasLooseSearch\n const paramsKeys = this.getParamsKeys()\n const paramsInput = paramsKeys.reduce<Record<string, string | number>>((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (input[key] !== undefined) {\n acc[key] = input[key]\n }\n return acc\n }, {})\n const searchKeys = this.getSearchKeys()\n const searchInput = Object.keys(input)\n .filter((k) => {\n if (k === 'hash') {\n return false\n }\n if (searchKeys.includes(k)) {\n return true\n }\n if (paramsKeys.includes(k)) {\n return false\n }\n return loose\n })\n .reduce<Record<string, string | number>>((acc, key) => {\n acc[key] = input[key]\n return acc\n }, {})\n const hashInput = input.hash\n return {\n searchInput,\n paramsInput,\n absInput: (args[1] as boolean | string | undefined) ?? false,\n hashInput: hashInput as string | undefined,\n }\n })()\n\n return this.get({\n ...paramsInput,\n search: searchInput,\n abs: absInput,\n hash: hashInput,\n } as never)\n }\n\n /** Same as `flat()`, but always accepts loose search keys. */\n flatLoose(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, LooseFlatInput<TDefinition> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n ): OnlyIfHasParams<TDefinition, string>\n flatLoose(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flatLoose(\n input: OnlyIfNoParams<TDefinition, LooseFlatInput<TDefinition> & { hash?: string | number }>,\n abs?: boolean | string,\n ): OnlyIfNoParams<TDefinition, string>\n flatLoose(...args: unknown[]): string {\n return this.flat(args[0] as never, args[1] as never, true)\n }\n\n /** Same as `flat()`, but only allows declared search keys. */\n flatStrict(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, StrictFlatInput<TDefinition> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n ): OnlyIfHasParams<TDefinition, string>\n flatStrict(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flatStrict(\n input: OnlyIfNoParams<TDefinition, StrictFlatInput<TDefinition> & { hash?: string | number }>,\n abs?: boolean | string,\n ): OnlyIfNoParams<TDefinition, string>\n flatStrict(...args: unknown[]): string {\n return this.flat(args[0] as never, args[1] as never, false)\n }\n\n /** Returns path param keys extracted from route definition. */\n getParamsKeys(): string[] {\n return Object.keys(this.paramsDefinition || {})\n }\n /** Returns named search keys extracted from route definition. */\n getSearchKeys(): string[] {\n return Object.keys(this.searchDefinition || {})\n }\n /** Returns all flat input keys (`search + params`). */\n getFlatKeys(): string[] {\n return [...this.getSearchKeys(), ...this.getParamsKeys()]\n }\n\n getDefinition(): string {\n return this.pathDefinition\n }\n\n /** Clones route with optional config override. */\n clone(config?: RouteConfigInput): CallableRoute<TDefinition> {\n return Route0.create(this.definition, config)\n }\n\n getRegexBaseStrictString(): string {\n return this.pathDefinition\n .replace(/:(\\w+)/g, '___PARAM___') // temporarily replace params with placeholder\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // escape regex special chars\n .replace(/___PARAM___/g, '([^/]+)')\n }\n\n getRegexBaseString(): string {\n return this.getRegexBaseStrictString().replace(/\\/+$/, '') + '/?' // remove trailing slashes and add optional slash\n }\n\n getRegexStrictString(): string {\n return `^${this.getRegexBaseStrictString()}$`\n }\n\n getRegexString(): string {\n return `^${this.getRegexBaseString()}$`\n }\n\n getRegexStrict(): RegExp {\n return new RegExp(this.getRegexStrictString())\n }\n\n getRegex(): RegExp {\n return new RegExp(this.getRegexString())\n }\n\n /** Creates a grouped strict regex pattern string from many routes. */\n static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a strict grouped regex from many routes. */\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Creates a grouped regex pattern string from many routes. */\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a grouped regex from many routes. */\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Converts any location shape to relative form (removes host/origin fields). */\n static toRelLocation<TLocation extends AnyLocation>(location: TLocation): TLocation {\n return {\n ...location,\n abs: false,\n origin: undefined,\n href: undefined,\n port: undefined,\n host: undefined,\n hostname: undefined,\n }\n }\n\n /** Converts a location to absolute form using provided origin URL. */\n static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, origin: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, origin)\n return {\n ...location,\n abs: true,\n origin: url.origin,\n href: url.href,\n port: url.port,\n host: url.host,\n hostname: url.hostname,\n }\n }\n\n /**\n * Parses a URL-like input into raw location object (without route knowledge).\n *\n * Result is always `UnknownLocation` because no route matching is applied.\n */\n static getLocation(href: `${string}://${string}`): UnknownLocation\n static getLocation(hrefRel: `/${string}`): UnknownLocation\n static getLocation(hrefOrHrefRel: string): UnknownLocation\n static getLocation(location: AnyLocation): UnknownLocation\n static getLocation(url: URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return Route0.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n // Check if it's an absolute URL (starts with scheme://)\n const abs = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(hrefOrHrefRelOrLocation)\n\n // Use dummy base only if relative\n const base = abs ? undefined : 'http://example.com'\n const url = new URL(hrefOrHrefRelOrLocation, base)\n\n // Extract search params\n const searchParams = Object.fromEntries(url.searchParams.entries())\n\n // Normalize pathname (remove trailing slash except for root)\n let pathname = url.pathname\n if (pathname.length > 1 && pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1)\n }\n\n // Common derived values\n const hrefRel = pathname + url.search + url.hash\n\n // Build the location object consistent with _GeneralLocation\n const location: UnknownLocation = {\n pathname,\n search: 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 searchParams,\n params: undefined,\n route: undefined,\n known: false,\n exact: false,\n ancestor: false,\n descendant: false,\n unmatched: false,\n }\n\n return location\n }\n\n /**\n * Parses input and matches it against this route definition.\n *\n * Result includes relation flags:\n * - `exact`\n * - `ancestor`\n * - `descendant`\n * - `unmatched`\n */\n getLocation(href: `${string}://${string}`): KnownLocation<TDefinition>\n getLocation(hrefRel: `/${string}`): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRel: string): KnownLocation<TDefinition>\n getLocation(location: AnyLocation): KnownLocation<TDefinition>\n getLocation(url: AnyLocation): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition> {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return this.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n const location = Route0.getLocation(hrefOrHrefRelOrLocation) as never as KnownLocation<TDefinition>\n location.route = this.definition as Definition<TDefinition>\n location.params = {}\n\n // Normalize pathname (no trailing slash except root)\n const pathname =\n location.pathname.length > 1 && location.pathname.endsWith('/')\n ? location.pathname.slice(0, -1)\n : location.pathname\n\n // Extract param names from the definition\n const paramNames: string[] = []\n const def =\n this.pathDefinition.length > 1 && this.pathDefinition.endsWith('/')\n ? this.pathDefinition.slice(0, -1)\n : this.pathDefinition\n def.replace(/:([A-Za-z0-9_]+)/g, (_m: string, name: string) => {\n paramNames.push(String(name))\n return ''\n })\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const ancestorRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n const ancestorMatch = pathname.match(ancestorRe)\n const exact = !!exactMatch\n const ancestor = !exact && !!ancestorMatch\n\n // Parse params for exact and ancestor matches.\n const paramsMatch = exactMatch || (ancestor ? ancestorMatch : null)\n if (paramsMatch) {\n const values = paramsMatch.slice(1, 1 + paramNames.length)\n const params = Object.fromEntries(paramNames.map((n, i) => [n, decodeURIComponent(values[i] ?? '')]))\n location.params = params\n } else {\n location.params = {}\n }\n\n // \"descendant\": the URL is a prefix of the route definition (params match any single segment)\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n const defParts = getParts(def)\n const pathParts = getParts(pathname)\n\n let isPrefix = true\n if (pathParts.length > defParts.length) {\n isPrefix = false\n } else {\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart) {\n isPrefix = false\n break\n }\n if (defPart.startsWith(':')) continue\n if (defPart !== 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.slice(1)] = 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 paramsKeys = this.getParamsKeys()\n if (input === undefined) {\n if (paramsKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${paramsKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid input: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const inputKeys = Object.keys(inputObj)\n const notDefinedKeys = paramsKeys.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> = {}\n for (const k of paramsKeys) {\n const v = inputObj[k]\n 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 input: expected string, number, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as ParamsOutput<TDefinition>,\n }\n }\n\n private _validateSearchInput<TLoose extends boolean>(\n input: unknown,\n loose: TLoose,\n ): StandardSchemaV1.Result<TLoose extends true ? LooseSearchOutput<TDefinition> : StrictSearchOutput<TDefinition>> {\n if (input === undefined) {\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid input: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const paramsKeys = this.getParamsKeys()\n const searchKeys = this.getSearchKeys()\n const data: Record<string, string> = {}\n for (const [k, v] of Object.entries(inputObj)) {\n if (k === 'hash') continue\n if (paramsKeys.includes(k)) continue\n if (!loose && !searchKeys.includes(k)) continue\n if (v === undefined) continue\n 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 input: expected string, number, or undefined, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as TLoose extends true ? LooseSearchOutput<TDefinition> : StrictSearchOutput<TDefinition>,\n }\n }\n\n private _validateFlatInput<TLoose extends boolean>(\n input: unknown,\n loose: TLoose,\n ): StandardSchemaV1.Result<TLoose extends true ? LooseFlatOutput<TDefinition> : StrictFlatOutput<TDefinition>> {\n const paramsResult = this._validateParamsInput(input)\n if ('issues' in paramsResult) {\n return {\n issues: paramsResult.issues ?? [],\n }\n }\n\n const searchResult = this._validateSearchInput(input, loose)\n if ('issues' in searchResult) {\n return {\n issues: searchResult.issues ?? [],\n }\n }\n\n return {\n value: {\n ...(searchResult.value as Record<string, string>),\n ...(paramsResult.value as Record<string, string>),\n } as TLoose extends true ? LooseFlatOutput<TDefinition> : StrictFlatOutput<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 paramsInputSchema: Route0Schema<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 /** Standard Schema for strict search input. */\n readonly strictSearchInputSchema: Route0Schema<StrictSearchInput<TDefinition>, StrictSearchOutput<TDefinition>> = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateSearchInput(value, false),\n types: undefined as unknown as StandardSchemaV1.Types<\n StrictSearchInput<TDefinition>,\n StrictSearchOutput<TDefinition>\n >,\n },\n parse: (value) => this._parseSchemaResult(this._validateSearchInput(value, false)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateSearchInput(value, false)),\n }\n\n /** Standard Schema for loose search input. */\n readonly looseSearchInputSchema: Route0Schema<LooseSearchInput<TDefinition>, LooseSearchOutput<TDefinition>> = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateSearchInput(value, true),\n types: undefined as unknown as StandardSchemaV1.Types<\n LooseSearchInput<TDefinition>,\n LooseSearchOutput<TDefinition>\n >,\n },\n parse: (value) => this._parseSchemaResult(this._validateSearchInput(value, true)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateSearchInput(value, true)),\n }\n\n /** Standard Schema for route flat input (uses route default strict/loose mode). */\n readonly flatInputSchema: Route0Schema<\n FlatInput<TDefinition, HasLooseSearch<TDefinition>>,\n FlatOutput<TDefinition, HasLooseSearch<TDefinition>>\n > = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>),\n types: undefined as unknown as StandardSchemaV1.Types<\n FlatInput<TDefinition, HasLooseSearch<TDefinition>>,\n FlatOutput<TDefinition, HasLooseSearch<TDefinition>>\n >,\n },\n parse: (value) =>\n this._parseSchemaResult(this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>)),\n safeParse: (value) =>\n this._safeParseSchemaResult(this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>)),\n }\n\n /** True when path structure is equal (param names are ignored). */\n isSame(other: AnyRoute): boolean {\n return (\n this.pathDefinition.replace(/:([A-Za-z0-9_]+)/g, '__PARAM__') ===\n other.pathDefinition.replace(/:([A-Za-z0-9_]+)/g, '__PARAM__')\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.pathDefinition === '/' && this.pathDefinition !== '/') {\n return true\n }\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\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.pathDefinition === '/' && other.pathDefinition !== '/') {\n return true\n }\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\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 getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\n\n // Different lengths = no conflict (one is deeper than the other)\n if (thisParts.length !== otherParts.length) {\n return false\n }\n\n // Check if all segments could match\n for (let i = 0; i < thisParts.length; i++) {\n const thisPart = thisParts[i]\n const otherPart = otherParts[i]\n\n // Both params = always match\n if (thisPart.startsWith(':') && otherPart.startsWith(':')) {\n continue\n }\n\n // One is param = can match\n if (thisPart.startsWith(':') || otherPart.startsWith(':')) {\n continue\n }\n\n // Both static = must be same\n if (thisPart !== otherPart) {\n return false\n }\n }\n\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 // More specific = should come earlier when conflicted\n // Static segments beat param segments at the same position\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\n\n // Compare segment by segment\n for (let i = 0; i < Math.min(thisParts.length, otherParts.length); i++) {\n const thisIsStatic = !thisParts[i].startsWith(':')\n const otherIsStatic = !otherParts[i].startsWith(':')\n\n if (thisIsStatic && !otherIsStatic) return true\n if (!thisIsStatic && otherIsStatic) return false\n }\n\n // All equal, use lexicographic\n return this.pathDefinition < other.pathDefinition\n }\n}\n\n/**\n * Typed route collection with deterministic matching order.\n *\n * `Routes.create()` accepts either plain string definitions or route objects\n * and returns a \"pretty\" object with direct route access + helper methods under `._`.\n */\n\nexport class Routes<const T extends RoutesRecord = any> {\n _routes: RoutesRecordHydrated<T>\n _pathsOrdering: string[]\n _keysOrdering: string[]\n _ordered: CallableRoute[]\n\n _: {\n routes: Routes<T>['_routes']\n getLocation: Routes<T>['_getLocation']\n clone: Routes<T>['_clone']\n pathsOrdering: Routes<T>['_pathsOrdering']\n keysOrdering: Routes<T>['_keysOrdering']\n ordered: Routes<T>['_ordered']\n }\n\n private constructor({\n routes,\n isHydrated = false,\n pathsOrdering,\n keysOrdering,\n ordered,\n }: {\n routes: RoutesRecordHydrated<T> | T\n isHydrated?: boolean\n pathsOrdering?: string[]\n keysOrdering?: string[]\n ordered?: CallableRoute[]\n }) {\n this._routes = (\n isHydrated ? (routes as RoutesRecordHydrated<T>) : Routes.hydrate(routes)\n ) as RoutesRecordHydrated<T>\n if (!pathsOrdering || !keysOrdering || !ordered) {\n const ordering = Routes.makeOrdering(this._routes)\n this._pathsOrdering = ordering.pathsOrdering\n this._keysOrdering = ordering.keysOrdering\n this._ordered = this._keysOrdering.map((key) => this._routes[key])\n } else {\n this._pathsOrdering = pathsOrdering\n this._keysOrdering = keysOrdering\n this._ordered = ordered\n }\n this._ = {\n routes: this._routes,\n getLocation: this._getLocation.bind(this),\n clone: this._clone.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n /** Creates and hydrates a typed routes collection. */\n static create<const T extends RoutesRecord>(routes: T, override?: RouteConfigInput): RoutesPretty<T> {\n const result = Routes.prettify(new Routes({ routes }))\n if (!override) {\n return result\n }\n return result._.clone(override)\n }\n\n private static prettify<const T extends RoutesRecord>(instance: Routes<T>): RoutesPretty<T> {\n Object.setPrototypeOf(instance, Routes.prototype)\n Object.defineProperty(instance, Symbol.toStringTag, {\n value: 'Routes',\n })\n Object.assign(instance, {\n clone: instance._clone.bind(instance),\n })\n Object.assign(instance, instance._routes)\n return instance as unknown as RoutesPretty<T>\n }\n\n private static hydrate<const T extends RoutesRecord>(routes: T): RoutesRecordHydrated<T> {\n const result = {} as RoutesRecordHydrated<T>\n for (const key in routes) {\n if (Object.hasOwn(routes, key)) {\n const value = routes[key]\n result[key] = (typeof value === 'string' ? Route0.create(value) : value) as CallableRoute<T[typeof key]>\n }\n }\n return result\n }\n\n /**\n * Matches an input URL against collection routes.\n *\n * Returns first exact match according to precomputed ordering,\n * otherwise returns `UnknownLocation`.\n */\n _getLocation(href: `${string}://${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefRel: `/${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRel: string): UnknownLocation | ExactLocation\n _getLocation(location: AnyLocation): UnknownLocation | ExactLocation\n _getLocation(url: URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation {\n // Find the route that exactly matches the given location\n const input = hrefOrHrefRelOrLocation\n for (const route of this._ordered) {\n const loc = route.getLocation(hrefOrHrefRelOrLocation)\n if (loc.exact) {\n return loc\n }\n }\n // No exact match found, return UnknownLocation\n return typeof input === 'string' ? Route0.getLocation(input) : Route0.getLocation(input)\n }\n\n private static makeOrdering(routes: RoutesRecord): {\n pathsOrdering: string[]\n keysOrdering: string[]\n } {\n const hydrated = Routes.hydrate(routes)\n const entries = Object.entries(hydrated)\n\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n // Sort: shorter paths first, then by specificity, then alphabetically\n entries.sort(([_keyA, routeA], [_keyB, routeB]) => {\n const partsA = getParts(routeA.pathDefinition)\n const partsB = getParts(routeB.pathDefinition)\n\n // 1. Shorter paths first (by segment count)\n if (partsA.length !== partsB.length) {\n return partsA.length - partsB.length\n }\n\n // 2. Same length: check if they conflict\n if (routeA.isConflict(routeB)) {\n // Conflicting routes: more specific first\n if (routeA.isMoreSpecificThan(routeB)) return -1\n if (routeB.isMoreSpecificThan(routeA)) return 1\n }\n\n // 3. Same length, not conflicting or equal specificity: alphabetically\n return routeA.pathDefinition.localeCompare(routeB.pathDefinition)\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<T extends Route0<string> | string = string> = T extends string ? Route0<T> : T\n/** Callable route (`route(input)`) plus route instance methods/properties. */\nexport type CallableRoute<T extends Route0<string> | string = string> = AnyRoute<T> & AnyRoute<T>['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 PathDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['pathDefinition']\n : T extends string\n ? _PathDefinition<T>\n : never\nexport type ParamsDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['paramsDefinition']\n : T extends string\n ? _ParamsDefinition<T>\n : undefined\nexport type SearchDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['searchDefinition']\n : T extends string\n ? _SearchDefinition<T>\n : undefined\n\nexport type Extended<T extends AnyRoute | string | undefined, TSuffixDefinition extends string> = T extends AnyRoute\n ? Route0<PathExtended<T['definition'], TSuffixDefinition>>\n : T extends string\n ? Route0<PathExtended<T, TSuffixDefinition>>\n : T extends undefined\n ? Route0<TSuffixDefinition>\n : never\n\nexport type IsAncestor<T extends AnyRoute | string, TAncestor extends AnyRoute | string> = _IsAncestor<\n PathDefinition<T>,\n PathDefinition<TAncestor>\n>\nexport type IsDescendant<T extends AnyRoute | string, TDescendant extends AnyRoute | string> = _IsDescendant<\n PathDefinition<T>,\n PathDefinition<TDescendant>\n>\nexport type IsSame<T extends AnyRoute | string, TExact extends AnyRoute | string> = _IsSame<\n PathDefinition<T>,\n PathDefinition<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> =\n ExtractPathParams<PathDefinition<T>> extends infer U ? ([U] extends [never] ? false : true) : false\nexport type HasSearch<T extends AnyRoute | string> = Definition<T> extends `${string}&${string}` ? true : false\nexport type HasNamedSearch<T extends AnyRoute | string> = // Definition<T> extends `${string}&${string}` ? true : false\n SearchTailDefinitionWithoutFirstAndLastAmp<Definition<T>> extends '' ? false : true\nexport type HasLooseSearch<T extends AnyRoute | string> = Definition<T> extends `${string}&` ? true : false\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: string\n}\nexport type LooseSearchOutput<T extends AnyRoute | string = string> = Partial<\n {\n [K in keyof SearchDefinition<T>]?: string\n } & Record<string, string | undefined>\n>\nexport type StrictSearchOutput<T extends AnyRoute | string> = Partial<{\n [K in keyof SearchDefinition<T>]?: string | undefined\n}>\nexport type LooseFlatOutput<T extends AnyRoute | string = string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & LooseSearchOutput<T> : LooseSearchOutput<T>\nexport type StrictFlatOutput<T extends AnyRoute | string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>\nexport type FlatOutput<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = TLoose extends true\n ? LooseFlatOutput<T>\n : StrictFlatOutput<T>\nexport type LooseFlatOutputWithHash<T extends AnyRoute | string = string> = LooseFlatOutput<T> & {\n hash?: string | undefined\n}\nexport type StrictFlatOutputWithHash<T extends AnyRoute | string> = StrictFlatOutput<T> & { hash?: string | undefined }\nexport type FlatOutputWithHash<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = FlatOutput<\n T,\n TLoose\n> & { hash?: string | undefined }\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>\nexport type LooseSearchInput<T extends AnyRoute | string = string> = _LooseSearchInput<Definition<T>>\nexport type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>\nexport type LooseFlatInput<T extends AnyRoute | string> = _LooseFlatInput<Definition<T>>\nexport type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>\nexport type FlatInput<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = TLoose extends true\n ? LooseFlatInput<T>\n : StrictFlatInput<T>\nexport type LooseFlatInputWithHash<T extends AnyRoute | string> = LooseFlatInput<T> & {\n hash?: string | number\n}\nexport type StrictFlatInputWithHash<T extends AnyRoute | string> = StrictFlatInput<T> & {\n hash?: string | number\n}\nexport type FlatInputWithHash<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = FlatInput<\n T,\n TLoose\n> & { hash?: string | number }\nexport type CanInputBeEmpty<T extends AnyRoute | string> = HasParams<Definition<T>> extends true ? false : true\n\nexport type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<PathDefinition<T>>\nexport type LooseSearchInputStringOnly<T extends AnyRoute | string = string> = _LooseSearchInputStringOnly<\n Definition<T>\n>\nexport type StrictSearchInputStringOnly<T extends AnyRoute | string> = _StrictSearchInputStringOnly<Definition<T>>\nexport type LooseFlatInputStringOnly<T extends AnyRoute | string> = _LooseFlatInputStringOnly<Definition<T>>\nexport type StrictFlatInputStringOnly<T extends AnyRoute | string> = _StrictFlatInputStringOnly<Definition<T>>\nexport type FlatInputStringOnly<\n T extends AnyRoute | string,\n TLoose extends boolean = HasLooseSearch<T>,\n> = TLoose extends true ? LooseFlatInputStringOnly<T> : StrictFlatInputStringOnly<T>\n\n// location\n\nexport type LocationParams<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: string\n}\nexport type LocationSearch<TDefinition extends string = string> = {\n [K in keyof _SearchDefinition<TDefinition>]: string | undefined\n} & Record<string, string | undefined>\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 * Raw query string with leading `?`, if present.\n *\n * Example:\n * - `?tab=posts&sort=desc`\n */\n search: string\n /**\n * Parsed query map (first value per key).\n *\n * Example:\n * - search: `?tab=posts&sort=desc`\n * - searchParams: `{ tab: 'posts', sort: 'desc' }`\n */\n searchParams: Record<string, string | undefined>\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 searchParams: LooseSearchOutput\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 searchParams: Record<string, string | undefined>\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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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\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 searchParams: LooseSearchOutput<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 _PathDefinition<T extends string> = T extends string ? TrimSearchTailDefinition<T> : never\nexport type _ParamsDefinition<TDefinition extends string> =\n ExtractPathParams<PathDefinition<TDefinition>> extends infer U\n ? [U] extends [never]\n ? undefined\n : { [K in Extract<U, string>]: true }\n : undefined\nexport type _SearchDefinition<TDefinition extends string> =\n NonEmpty<SearchTailDefinitionWithoutFirstAndLastAmp<TDefinition>> extends infer Tail extends string\n ? AmpSplit<Tail> extends infer U\n ? [U] extends [never]\n ? undefined\n : { [K in Extract<U, string>]: true }\n : undefined\n : undefined\n\nexport type _ParamsInput<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends undefined\n ? Record<never, never>\n : {\n [K in keyof _ParamsDefinition<TDefinition>]: string | number\n }\nexport type _LooseSearchInput<TDefinition extends string> =\n _SearchDefinition<TDefinition> extends undefined\n ? Record<string, string | number>\n : Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string | number\n }> &\n Record<string, string | number>\nexport type _StrictSearchInput<TDefinition extends string> = Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string | number\n}>\nexport type _LooseFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInput<TDefinition> & _LooseSearchInput<TDefinition>\n : _LooseSearchInput<TDefinition>\nexport type _StrictFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition> & _ParamsInput<TDefinition>\n : _ParamsInput<TDefinition>\n : HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition>\n : Record<never, never>\n\nexport type _ParamsInputStringOnly<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends undefined\n ? Record<never, never>\n : {\n [K in keyof _ParamsDefinition<TDefinition>]: string\n }\nexport type _LooseSearchInputStringOnly<TDefinition extends string> =\n _SearchDefinition<TDefinition> extends undefined\n ? Record<string, string>\n : Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string\n }> &\n Record<string, string>\nexport type _StrictSearchInputStringOnly<TDefinition extends string> = Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string\n}>\nexport type _LooseFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInputStringOnly<TDefinition> & _LooseSearchInputStringOnly<TDefinition>\n : _LooseSearchInputStringOnly<TDefinition>\nexport type _StrictFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition> & _ParamsInputStringOnly<TDefinition>\n : _ParamsInputStringOnly<TDefinition>\n : HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition>\n : Record<never, never>\n\nexport type TrimSearchTailDefinition<S extends string> = S extends `${infer P}&${string}` ? P : S\nexport type SearchTailDefinitionWithoutFirstAmp<S extends string> = S extends `${string}&${infer T}` ? T : ''\nexport type SearchTailDefinitionWithoutFirstAndLastAmp<S extends string> = S extends `${string}&${infer T}&`\n ? T\n : S extends `${string}&${infer T}`\n ? T\n : ''\nexport type SearchTailDefinitionWithFirstAmp<S extends string> = S extends `${string}&${infer T}` ? `&${T}` : ''\nexport type AmpSplit<S extends string> = S extends `${infer A}&${infer B}` ? A | AmpSplit<B> : S\nexport type NonEmpty<T> = [T] extends ['' | never] ? never : T\nexport type ExtractPathParams<S extends string> = S extends `${string}:${infer After}`\n ? After extends `${infer Name}/${infer Rest}`\n ? Name | ExtractPathParams<`/${Rest}`>\n : After\n : never\nexport type ReplacePathParams<S extends string> = S extends `${infer Head}:${infer Tail}`\n ? // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Tail extends `${infer _Param}/${infer Rest}`\n ? ReplacePathParams<`${Head}${string}/${Rest}`>\n : `${Head}${string}`\n : S\nexport type DedupeSlashes<S extends string> = S extends `${infer A}//${infer B}` ? DedupeSlashes<`${A}/${B}`> : S\nexport type EmptyRecord = Record<never, never>\nexport type JoinPath<Parent extends string, Suffix extends string> = DedupeSlashes<\n PathDefinition<Parent> extends infer A extends string\n ? PathDefinition<Suffix> extends infer B extends string\n ? A extends ''\n ? B extends ''\n ? ''\n : B extends `/${string}`\n ? B\n : `/${B}`\n : B extends ''\n ? A\n : A extends `${string}/`\n ? `${A}${B}`\n : B extends `/${string}`\n ? `${A}${B}`\n : `${A}/${B}`\n : never\n : never\n>\n\nexport type OnlyIfNoParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends false ? Yes : No\nexport type OnlyIfHasParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends true ? Yes : No\n\n// export type PathRouteValue<TDefinition extends string> = `${ReplacePathParams<PathDefinition<TDefinition>>}`\n// export type PathOnlyRouteValue<TDefinition extends string> = `${ReplacePathParams<PathDefinition<TDefinition>>}`\n// export type WithSearchRouteValue<TDefinition extends string> =\n// `${ReplacePathParams<PathDefinition<TDefinition>>}?${string}`\n// export type AbsolutePathRouteValue<TDefinition extends string> =\n// PathRouteValue<TDefinition> extends '/' ? string : `${string}${PathRouteValue<TDefinition>}`\n// export type AbsolutePathOnlyRouteValue<TDefinition extends string> =\n// PathOnlyRouteValue<TDefinition> extends '/' ? string : `${string}${PathOnlyRouteValue<TDefinition>}`\n// export type AbsoluteWithSearchRouteValue<TDefinition extends string> = `${string}${WithSearchRouteValue<TDefinition>}`\n\nexport type PathExtended<\n TSourcedefinitionDefinition extends string,\n TSuffixdefinitionDefinition extends string,\n> = `${JoinPath<TSourcedefinitionDefinition, TSuffixdefinitionDefinition>}${SearchTailDefinitionWithFirstAmp<TSuffixdefinitionDefinition>}`\n\nexport type WithParamsInput<\n TDefinition extends string,\n T extends\n | {\n search?: _LooseSearchInput<any>\n abs?: boolean | string\n hash?: string | number\n }\n | undefined = undefined,\n> = _ParamsInput<TDefinition> & (T extends undefined ? Record<never, never> : T)\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 }\nexport type SafeParseInputStrictResult<TDefinition extends string> = _SafeParseInputResult<\n StrictFlatOutput<TDefinition>\n>\nexport type SafeParseInputLooseResult<TDefinition extends string> = _SafeParseInputResult<LooseFlatOutput<TDefinition>>\nexport type Route0Schema<\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":["absOriginInput","paramsInput","searchInput","hashInput"]}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -146,13 +146,13 @@ declare class Route0<TDefinition extends string> {
|
|
|
146
146
|
private _safeParseSchemaResult;
|
|
147
147
|
private _parseSchemaResult;
|
|
148
148
|
/** Standard Schema for route params input. */
|
|
149
|
-
readonly paramsInputSchema: Route0Schema<ParamsInput<TDefinition
|
|
149
|
+
readonly paramsInputSchema: Route0Schema<ParamsInput<TDefinition>, ParamsOutput<TDefinition>>;
|
|
150
150
|
/** Standard Schema for strict search input. */
|
|
151
|
-
readonly strictSearchInputSchema: Route0Schema<StrictSearchInput<TDefinition
|
|
151
|
+
readonly strictSearchInputSchema: Route0Schema<StrictSearchInput<TDefinition>, StrictSearchOutput<TDefinition>>;
|
|
152
152
|
/** Standard Schema for loose search input. */
|
|
153
|
-
readonly looseSearchInputSchema: Route0Schema<LooseSearchInput<TDefinition
|
|
153
|
+
readonly looseSearchInputSchema: Route0Schema<LooseSearchInput<TDefinition>, LooseSearchOutput<TDefinition>>;
|
|
154
154
|
/** Standard Schema for route flat input (uses route default strict/loose mode). */
|
|
155
|
-
readonly flatInputSchema: Route0Schema<FlatInput<TDefinition, HasLooseSearch<TDefinition
|
|
155
|
+
readonly flatInputSchema: Route0Schema<FlatInput<TDefinition, HasLooseSearch<TDefinition>>, FlatOutput<TDefinition, HasLooseSearch<TDefinition>>>;
|
|
156
156
|
/** True when path structure is equal (param names are ignored). */
|
|
157
157
|
isSame(other: AnyRoute): boolean;
|
|
158
158
|
/** Static convenience wrapper for `isSame`. */
|
|
@@ -515,7 +515,7 @@ type _SafeParseInputResult<TInputParsed extends Record<string, unknown>> = {
|
|
|
515
515
|
};
|
|
516
516
|
type SafeParseInputStrictResult<TDefinition extends string> = _SafeParseInputResult<StrictFlatOutput<TDefinition>>;
|
|
517
517
|
type SafeParseInputLooseResult<TDefinition extends string> = _SafeParseInputResult<LooseFlatOutput<TDefinition>>;
|
|
518
|
-
type Route0Schema<TInput extends Record<string, unknown
|
|
518
|
+
type Route0Schema<TInput extends Record<string, unknown>, TOutput extends Record<string, unknown>> = StandardSchemaV1<TInput, TOutput> & {
|
|
519
519
|
parse: (input: unknown) => TOutput;
|
|
520
520
|
safeParse: (input: unknown) => _SafeParseInputResult<TOutput>;
|
|
521
521
|
};
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -146,13 +146,13 @@ declare class Route0<TDefinition extends string> {
|
|
|
146
146
|
private _safeParseSchemaResult;
|
|
147
147
|
private _parseSchemaResult;
|
|
148
148
|
/** Standard Schema for route params input. */
|
|
149
|
-
readonly paramsInputSchema: Route0Schema<ParamsInput<TDefinition
|
|
149
|
+
readonly paramsInputSchema: Route0Schema<ParamsInput<TDefinition>, ParamsOutput<TDefinition>>;
|
|
150
150
|
/** Standard Schema for strict search input. */
|
|
151
|
-
readonly strictSearchInputSchema: Route0Schema<StrictSearchInput<TDefinition
|
|
151
|
+
readonly strictSearchInputSchema: Route0Schema<StrictSearchInput<TDefinition>, StrictSearchOutput<TDefinition>>;
|
|
152
152
|
/** Standard Schema for loose search input. */
|
|
153
|
-
readonly looseSearchInputSchema: Route0Schema<LooseSearchInput<TDefinition
|
|
153
|
+
readonly looseSearchInputSchema: Route0Schema<LooseSearchInput<TDefinition>, LooseSearchOutput<TDefinition>>;
|
|
154
154
|
/** Standard Schema for route flat input (uses route default strict/loose mode). */
|
|
155
|
-
readonly flatInputSchema: Route0Schema<FlatInput<TDefinition, HasLooseSearch<TDefinition
|
|
155
|
+
readonly flatInputSchema: Route0Schema<FlatInput<TDefinition, HasLooseSearch<TDefinition>>, FlatOutput<TDefinition, HasLooseSearch<TDefinition>>>;
|
|
156
156
|
/** True when path structure is equal (param names are ignored). */
|
|
157
157
|
isSame(other: AnyRoute): boolean;
|
|
158
158
|
/** Static convenience wrapper for `isSame`. */
|
|
@@ -515,7 +515,7 @@ type _SafeParseInputResult<TInputParsed extends Record<string, unknown>> = {
|
|
|
515
515
|
};
|
|
516
516
|
type SafeParseInputStrictResult<TDefinition extends string> = _SafeParseInputResult<StrictFlatOutput<TDefinition>>;
|
|
517
517
|
type SafeParseInputLooseResult<TDefinition extends string> = _SafeParseInputResult<LooseFlatOutput<TDefinition>>;
|
|
518
|
-
type Route0Schema<TInput extends Record<string, unknown
|
|
518
|
+
type Route0Schema<TInput extends Record<string, unknown>, TOutput extends Record<string, unknown>> = StandardSchemaV1<TInput, TOutput> & {
|
|
519
519
|
parse: (input: unknown) => TOutput;
|
|
520
520
|
safeParse: (input: unknown) => _SafeParseInputResult<TOutput>;
|
|
521
521
|
};
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\n\n// TODO: asterisk\n// TODO: when asterisk then query params will be extended also after extend\n// TODO: optional params\n// TODO: required search\n\n// TODO: .extension('.json') to not add additional / but just add some extension\n// TODO: search input can be boolean, or even object with qs\n// TODO: route0 if ens with \"...&\" then can be any query, else only provided type of queries\n// TODO: Роут0 три мод, тогда там все ноуты кончаются на .селф\n// TODO: use splats in param definition \"*\"\n// TODO: ? check extend for search only .extend('&x&z')\n// TODO: .create(route, {useSearch, useParams})\n// TODO: Из пас экзакт, из пасвизквери экзает, из чилдрен, из парент, из экзактОр\n// TODO: isEqual, isDescendant, isAncestor\n// TODO: extractParams, extractSearch\n// TODO: getPathDefinition respecting definitionParamPrefix, definitionSearchPrefix\n// TODO: prepend\n// TODO: ?? Route0.createTree({base:{self: x, children: ...})\n// TODO: ? Routes.create({base:{self: x, children: ...}).attach('section', Routes.create({...}))\n// TODO: overrideTree\n// TODO: .create(route, {origin, useLocation})\n// TODO: ? optional path params as @\n// TODO: prependMany, extendMany, overrideMany, with types\n// TODO: optional route params /x/:id?\n// TODO: fix CallableRoute<CallableRoute<>> in RoutesPretty type, it should be just CallableRoute<>\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> {\n readonly definition: TDefinition\n readonly pathDefinition: _PathDefinition<TDefinition>\n readonly paramsDefinition: _ParamsDefinition<TDefinition>\n readonly searchDefinition: _SearchDefinition<TDefinition>\n readonly hasLooseSearch: HasLooseSearch<TDefinition>\n private _origin: string | undefined\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 this.definition = definition\n this.pathDefinition = Route0._getPathDefinitionBydefinition(definition)\n this.paramsDefinition = Route0._getParamsDefinitionBydefinition(definition)\n this.searchDefinition = Route0._getSearchDefinitionBydefinition(definition)\n this.hasLooseSearch = Route0._hasLooseSearch(definition)\n\n const { origin } = config\n if (origin && typeof origin === 'string' && origin.length) {\n this._origin = origin\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } } | undefined\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this._origin = g.location.origin\n } else {\n this._origin = undefined\n }\n }\n }\n\n /**\n * Creates a callable route instance.\n *\n * If an existing route/callable route is provided, it is cloned.\n */\n static create<TDefinition extends string>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n config?: RouteConfigInput,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n if (typeof definition === 'object') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n const original = new Route0<TDefinition>(definition, config)\n const callable = original.get.bind(original)\n Object.setPrototypeOf(callable, original)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: original.definition,\n })\n return callable as never\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>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function') {\n return definition\n }\n const original = typeof definition === 'object' ? definition : new Route0<TDefinition>(definition)\n const callable = original.get.bind(original)\n Object.setPrototypeOf(callable, original)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: original.definition,\n })\n return callable as never\n }\n\n private static _splitPathDefinitionAndSearchTailDefinition(definition: string) {\n const i = definition.indexOf('&')\n if (i === -1) return { pathDefinition: definition, searchTailDefinition: '' }\n return {\n pathDefinition: definition.slice(0, i),\n searchTailDefinition: definition.slice(i),\n }\n }\n\n private static _getAbsPath(origin: string, pathWithSearch: string) {\n return new URL(pathWithSearch, origin).toString().replace(/\\/$/, '')\n }\n\n private static _getPathDefinitionBydefinition<TDefinition extends string>(definition: TDefinition) {\n const { pathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n return pathDefinition as _PathDefinition<TDefinition>\n }\n\n private static _getParamsDefinitionBydefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _ParamsDefinition<TDefinition> {\n const { pathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n const matches = Array.from(pathDefinition.matchAll(/:([A-Za-z0-9_]+)/g))\n const paramsDefinition = Object.fromEntries(matches.map((m) => [m[1], true]))\n const keysCount = Object.keys(paramsDefinition).length\n if (keysCount === 0) {\n return undefined as _ParamsDefinition<TDefinition>\n }\n return paramsDefinition as _ParamsDefinition<TDefinition>\n }\n\n private static _getSearchDefinitionBydefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _SearchDefinition<TDefinition> {\n const { searchTailDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n if (!searchTailDefinition) {\n return undefined as _SearchDefinition<TDefinition>\n }\n const keys = searchTailDefinition.split('&').filter(Boolean)\n const searchDefinition = Object.fromEntries(keys.map((k) => [k, true]))\n const keysCount = Object.keys(searchDefinition).length\n if (keysCount === 0) {\n return undefined as _SearchDefinition<TDefinition>\n }\n return searchDefinition as _SearchDefinition<TDefinition>\n }\n\n private static _hasLooseSearch<TDefinition extends string>(definition: TDefinition): HasLooseSearch<TDefinition> {\n // ends with &\n return definition.endsWith('&') as HasLooseSearch<TDefinition>\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>> {\n const { pathDefinition: parentPathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(this.definition)\n const { pathDefinition: suffixPathDefinition, searchTailDefinition: suffixSearchTailDefinition } =\n Route0._splitPathDefinitionAndSearchTailDefinition(suffixDefinition)\n const pathDefinition = `${parentPathDefinition}/${suffixPathDefinition}`.replace(/\\/{2,}/g, '/')\n const definition = `${pathDefinition}${suffixSearchTailDefinition}` as PathExtended<TDefinition, TSuffixDefinition>\n return Route0.create<PathExtended<TDefinition, TSuffixDefinition>>(definition, { origin: this._origin })\n }\n\n // has params\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n /**\n * Builds a URL string from typed params/search input.\n *\n * - `abs: true` returns absolute URL using `origin`\n * - `hash` appends URL fragment\n * - `search` accepts named/loose search input based on definition\n */\n get(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<\n TDefinition,\n {\n search?: _LooseSearchInput<TDefinition>\n abs?: boolean | string\n hash?: string | number\n }\n >\n >,\n ): OnlyIfHasParams<TDefinition, string>\n\n // no params\n // get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>\n // get(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs?: false; hash?: string | number }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs?: false; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs: true; hash?: string | number }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathRouteValue<TDefinition>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search?: _SearchInput<TDefinition>; abs?: false; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search?: _SearchInput<TDefinition>; abs: true; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n get(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n get(\n input: OnlyIfNoParams<\n TDefinition,\n {\n search?: _LooseSearchInput<TDefinition>\n abs?: boolean | string\n hash?: string | number\n }\n >,\n ): OnlyIfNoParams<TDefinition, string>\n\n // implementation\n get(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, absOriginInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\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 = args[0]\n if (typeof input !== 'object' || input === null) {\n // throw new Error(\"Invalid get route input: expected object\")\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n absOriginInput: undefined,\n hashInput: undefined,\n }\n }\n const { search, abs, hash, ...params } = input as Record<string, string | number> & {\n search: Record<string, string | number>\n abs: boolean | string\n hash: string | undefined\n [key: string]: unknown\n }\n const absOriginInput = typeof abs === 'string' && abs.length > 0 ? abs : undefined\n return {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n searchInput: search || {},\n paramsInput: params,\n absInput: absOriginInput !== undefined || abs === true,\n absOriginInput,\n hashInput: hash,\n }\n })()\n\n // validate params\n const neededParamsKeys = this.paramsDefinition ? Object.keys(this.paramsDefinition) : []\n const providedParamsKeys = Object.keys(paramsInput)\n const notProvidedKeys = neededParamsKeys.filter((k) => !providedParamsKeys.includes(k))\n if (notProvidedKeys.length) {\n // throw new Error(`Missing params: not defined keys ${notProvidedKeys.map((k) => `\"${k}\"`).join(\", \")}.`)\n Object.assign(paramsInput, Object.fromEntries(notProvidedKeys.map((k) => [k, 'undefined'])))\n }\n\n // create url\n\n let url = this.pathDefinition as string\n // replace 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] ?? '')))\n // search params\n const searchInputStringified = Object.fromEntries(Object.entries(searchInput).map(([k, v]) => [k, String(v)]))\n url = [url, new URLSearchParams(searchInputStringified).toString()].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 // has params\n // flat(\n // input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string | number }>>,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string | number }>>,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n /**\n * Flat input variant of `get()`, where path params + search keys\n * are provided in a single object.\n */\n flat<TLoose extends boolean = HasLooseSearch<TDefinition>>(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, FlatInput<TDefinition, TLoose> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n loose?: TLoose,\n ): OnlyIfHasParams<TDefinition, string>\n\n // no params\n // flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathRouteValue<TDefinition>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n flat(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flat<TLoose extends boolean = HasLooseSearch<TDefinition>>(\n input: OnlyIfNoParams<TDefinition, FlatInput<TDefinition, TLoose> & { hash?: string | number }>,\n abs?: boolean | string,\n loose?: TLoose,\n ): OnlyIfNoParams<TDefinition, string>\n\n // implementation\n flat(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean | string\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n hashInput: undefined,\n }\n }\n const input = args[0] as Record<string, string | number> | undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof input !== 'object' || input === null) {\n // throw new Error(\"Invalid get route input: expected object\")\n return {\n searchInput: {},\n paramsInput: {},\n absInput: (args[1] as boolean | string | undefined) ?? false,\n hashInput: undefined,\n }\n }\n const loose = (args[2] as boolean | undefined) ?? this.hasLooseSearch\n const paramsKeys = this.getParamsKeys()\n const paramsInput = paramsKeys.reduce<Record<string, string | number>>((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (input[key] !== undefined) {\n acc[key] = input[key]\n }\n return acc\n }, {})\n const searchKeys = this.getSearchKeys()\n const searchInput = Object.keys(input)\n .filter((k) => {\n if (k === 'hash') {\n return false\n }\n if (searchKeys.includes(k)) {\n return true\n }\n if (paramsKeys.includes(k)) {\n return false\n }\n return loose\n })\n .reduce<Record<string, string | number>>((acc, key) => {\n acc[key] = input[key]\n return acc\n }, {})\n const hashInput = input.hash\n return {\n searchInput,\n paramsInput,\n absInput: (args[1] as boolean | string | undefined) ?? false,\n hashInput: hashInput as string | undefined,\n }\n })()\n\n return this.get({\n ...paramsInput,\n search: searchInput,\n abs: absInput,\n hash: hashInput,\n } as never)\n }\n\n /** Same as `flat()`, but always accepts loose search keys. */\n flatLoose(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, LooseFlatInput<TDefinition> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n ): OnlyIfHasParams<TDefinition, string>\n flatLoose(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flatLoose(\n input: OnlyIfNoParams<TDefinition, LooseFlatInput<TDefinition> & { hash?: string | number }>,\n abs?: boolean | string,\n ): OnlyIfNoParams<TDefinition, string>\n flatLoose(...args: unknown[]): string {\n return this.flat(args[0] as never, args[1] as never, true)\n }\n\n /** Same as `flat()`, but only allows declared search keys. */\n flatStrict(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, StrictFlatInput<TDefinition> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n ): OnlyIfHasParams<TDefinition, string>\n flatStrict(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flatStrict(\n input: OnlyIfNoParams<TDefinition, StrictFlatInput<TDefinition> & { hash?: string | number }>,\n abs?: boolean | string,\n ): OnlyIfNoParams<TDefinition, string>\n flatStrict(...args: unknown[]): string {\n return this.flat(args[0] as never, args[1] as never, false)\n }\n\n /** Returns path param keys extracted from route definition. */\n getParamsKeys(): string[] {\n return Object.keys(this.paramsDefinition || {})\n }\n /** Returns named search keys extracted from route definition. */\n getSearchKeys(): string[] {\n return Object.keys(this.searchDefinition || {})\n }\n /** Returns all flat input keys (`search + params`). */\n getFlatKeys(): string[] {\n return [...this.getSearchKeys(), ...this.getParamsKeys()]\n }\n\n getDefinition(): string {\n return this.pathDefinition\n }\n\n /** Clones route with optional config override. */\n clone(config?: RouteConfigInput): CallableRoute<TDefinition> {\n return Route0.create(this.definition, config)\n }\n\n getRegexBaseStrictString(): string {\n return this.pathDefinition\n .replace(/:(\\w+)/g, '___PARAM___') // temporarily replace params with placeholder\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // escape regex special chars\n .replace(/___PARAM___/g, '([^/]+)')\n }\n\n getRegexBaseString(): string {\n return this.getRegexBaseStrictString().replace(/\\/+$/, '') + '/?' // remove trailing slashes and add optional slash\n }\n\n getRegexStrictString(): string {\n return `^${this.getRegexBaseStrictString()}$`\n }\n\n getRegexString(): string {\n return `^${this.getRegexBaseString()}$`\n }\n\n getRegexStrict(): RegExp {\n return new RegExp(this.getRegexStrictString())\n }\n\n getRegex(): RegExp {\n return new RegExp(this.getRegexString())\n }\n\n /** Creates a grouped strict regex pattern string from many routes. */\n static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a strict grouped regex from many routes. */\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Creates a grouped regex pattern string from many routes. */\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a grouped regex from many routes. */\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Converts any location shape to relative form (removes host/origin fields). */\n static toRelLocation<TLocation extends AnyLocation>(location: TLocation): TLocation {\n return {\n ...location,\n abs: false,\n origin: undefined,\n href: undefined,\n port: undefined,\n host: undefined,\n hostname: undefined,\n }\n }\n\n /** Converts a location to absolute form using provided origin URL. */\n static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, origin: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, origin)\n return {\n ...location,\n abs: true,\n origin: url.origin,\n href: url.href,\n port: url.port,\n host: url.host,\n hostname: url.hostname,\n }\n }\n\n /**\n * Parses a URL-like input into raw location object (without route knowledge).\n *\n * Result is always `UnknownLocation` because no route matching is applied.\n */\n static getLocation(href: `${string}://${string}`): UnknownLocation\n static getLocation(hrefRel: `/${string}`): UnknownLocation\n static getLocation(hrefOrHrefRel: string): UnknownLocation\n static getLocation(location: AnyLocation): UnknownLocation\n static getLocation(url: URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return Route0.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n // Check if it's an absolute URL (starts with scheme://)\n const abs = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(hrefOrHrefRelOrLocation)\n\n // Use dummy base only if relative\n const base = abs ? undefined : 'http://example.com'\n const url = new URL(hrefOrHrefRelOrLocation, base)\n\n // Extract search params\n const searchParams = Object.fromEntries(url.searchParams.entries())\n\n // Normalize pathname (remove trailing slash except for root)\n let pathname = url.pathname\n if (pathname.length > 1 && pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1)\n }\n\n // Common derived values\n const hrefRel = pathname + url.search + url.hash\n\n // Build the location object consistent with _GeneralLocation\n const location: UnknownLocation = {\n pathname,\n search: 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 searchParams,\n params: undefined,\n route: undefined,\n known: false,\n exact: false,\n ancestor: false,\n descendant: false,\n unmatched: false,\n }\n\n return location\n }\n\n /**\n * Parses input and matches it against this route definition.\n *\n * Result includes relation flags:\n * - `exact`\n * - `ancestor`\n * - `descendant`\n * - `unmatched`\n */\n getLocation(href: `${string}://${string}`): KnownLocation<TDefinition>\n getLocation(hrefRel: `/${string}`): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRel: string): KnownLocation<TDefinition>\n getLocation(location: AnyLocation): KnownLocation<TDefinition>\n getLocation(url: AnyLocation): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition> {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return this.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n const location = Route0.getLocation(hrefOrHrefRelOrLocation) as never as KnownLocation<TDefinition>\n location.route = this.definition as Definition<TDefinition>\n location.params = {}\n\n // Normalize pathname (no trailing slash except root)\n const pathname =\n location.pathname.length > 1 && location.pathname.endsWith('/')\n ? location.pathname.slice(0, -1)\n : location.pathname\n\n // Extract param names from the definition\n const paramNames: string[] = []\n const def =\n this.pathDefinition.length > 1 && this.pathDefinition.endsWith('/')\n ? this.pathDefinition.slice(0, -1)\n : this.pathDefinition\n def.replace(/:([A-Za-z0-9_]+)/g, (_m: string, name: string) => {\n paramNames.push(String(name))\n return ''\n })\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const ancestorRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n const ancestorMatch = pathname.match(ancestorRe)\n const exact = !!exactMatch\n const ancestor = !exact && !!ancestorMatch\n\n // Parse params for exact and ancestor matches.\n const paramsMatch = exactMatch || (ancestor ? ancestorMatch : null)\n if (paramsMatch) {\n const values = paramsMatch.slice(1, 1 + paramNames.length)\n const params = Object.fromEntries(paramNames.map((n, i) => [n, decodeURIComponent(values[i] ?? '')]))\n location.params = params\n } else {\n location.params = {}\n }\n\n // \"descendant\": the URL is a prefix of the route definition (params match any single segment)\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n const defParts = getParts(def)\n const pathParts = getParts(pathname)\n\n let isPrefix = true\n if (pathParts.length > defParts.length) {\n isPrefix = false\n } else {\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart) {\n isPrefix = false\n break\n }\n if (defPart.startsWith(':')) continue\n if (defPart !== 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.slice(1)] = 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 paramsKeys = this.getParamsKeys()\n if (input === undefined) {\n if (paramsKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${paramsKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid input: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const inputKeys = Object.keys(inputObj)\n const notDefinedKeys = paramsKeys.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> = {}\n for (const k of paramsKeys) {\n const v = inputObj[k]\n 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 input: expected string, number, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as ParamsOutput<TDefinition>,\n }\n }\n\n private _validateSearchInput<TLoose extends boolean>(\n input: unknown,\n loose: TLoose,\n ): StandardSchemaV1.Result<TLoose extends true ? LooseSearchOutput<TDefinition> : StrictSearchOutput<TDefinition>> {\n if (input === undefined) {\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid input: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const paramsKeys = this.getParamsKeys()\n const searchKeys = this.getSearchKeys()\n const data: Record<string, string> = {}\n for (const [k, v] of Object.entries(inputObj)) {\n if (k === 'hash') continue\n if (paramsKeys.includes(k)) continue\n if (!loose && !searchKeys.includes(k)) continue\n if (v === undefined) continue\n 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 input: expected string, number, or undefined, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as TLoose extends true ? LooseSearchOutput<TDefinition> : StrictSearchOutput<TDefinition>,\n }\n }\n\n private _validateFlatInput<TLoose extends boolean>(\n input: unknown,\n loose: TLoose,\n ): StandardSchemaV1.Result<TLoose extends true ? LooseFlatOutput<TDefinition> : StrictFlatOutput<TDefinition>> {\n const paramsResult = this._validateParamsInput(input)\n if ('issues' in paramsResult) {\n return {\n issues: paramsResult.issues ?? [],\n }\n }\n\n const searchResult = this._validateSearchInput(input, loose)\n if ('issues' in searchResult) {\n return {\n issues: searchResult.issues ?? [],\n }\n }\n\n return {\n value: {\n ...(searchResult.value as Record<string, string>),\n ...(paramsResult.value as Record<string, string>),\n } as TLoose extends true ? LooseFlatOutput<TDefinition> : StrictFlatOutput<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 paramsInputSchema: Route0Schema<ParamsInput<TDefinition> | undefined, ParamsOutput<TDefinition>> = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateParamsInput(value),\n types: undefined as unknown as StandardSchemaV1.Types<\n ParamsInput<TDefinition> | undefined,\n ParamsOutput<TDefinition>\n >,\n },\n parse: (value) => this._parseSchemaResult(this._validateParamsInput(value)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateParamsInput(value)),\n }\n\n /** Standard Schema for strict search input. */\n readonly strictSearchInputSchema: Route0Schema<\n StrictSearchInput<TDefinition> | undefined,\n StrictSearchOutput<TDefinition>\n > = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateSearchInput(value, false),\n types: undefined as unknown as StandardSchemaV1.Types<\n StrictSearchInput<TDefinition> | undefined,\n StrictSearchOutput<TDefinition>\n >,\n },\n parse: (value) => this._parseSchemaResult(this._validateSearchInput(value, false)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateSearchInput(value, false)),\n }\n\n /** Standard Schema for loose search input. */\n readonly looseSearchInputSchema: Route0Schema<\n LooseSearchInput<TDefinition> | undefined,\n LooseSearchOutput<TDefinition>\n > = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateSearchInput(value, true),\n types: undefined as unknown as StandardSchemaV1.Types<\n LooseSearchInput<TDefinition> | undefined,\n LooseSearchOutput<TDefinition>\n >,\n },\n parse: (value) => this._parseSchemaResult(this._validateSearchInput(value, true)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateSearchInput(value, true)),\n }\n\n /** Standard Schema for route flat input (uses route default strict/loose mode). */\n readonly flatInputSchema: Route0Schema<\n FlatInput<TDefinition, HasLooseSearch<TDefinition>> | undefined,\n FlatOutput<TDefinition, HasLooseSearch<TDefinition>>\n > = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>),\n types: undefined as unknown as StandardSchemaV1.Types<\n FlatInput<TDefinition, HasLooseSearch<TDefinition>> | undefined,\n FlatOutput<TDefinition, HasLooseSearch<TDefinition>>\n >,\n },\n parse: (value) =>\n this._parseSchemaResult(this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>)),\n safeParse: (value) =>\n this._safeParseSchemaResult(this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>)),\n }\n\n /** True when path structure is equal (param names are ignored). */\n isSame(other: AnyRoute): boolean {\n return (\n this.pathDefinition.replace(/:([A-Za-z0-9_]+)/g, '__PARAM__') ===\n other.pathDefinition.replace(/:([A-Za-z0-9_]+)/g, '__PARAM__')\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.pathDefinition === '/' && this.pathDefinition !== '/') {\n return true\n }\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\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.pathDefinition === '/' && other.pathDefinition !== '/') {\n return true\n }\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\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 getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\n\n // Different lengths = no conflict (one is deeper than the other)\n if (thisParts.length !== otherParts.length) {\n return false\n }\n\n // Check if all segments could match\n for (let i = 0; i < thisParts.length; i++) {\n const thisPart = thisParts[i]\n const otherPart = otherParts[i]\n\n // Both params = always match\n if (thisPart.startsWith(':') && otherPart.startsWith(':')) {\n continue\n }\n\n // One is param = can match\n if (thisPart.startsWith(':') || otherPart.startsWith(':')) {\n continue\n }\n\n // Both static = must be same\n if (thisPart !== otherPart) {\n return false\n }\n }\n\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 // More specific = should come earlier when conflicted\n // Static segments beat param segments at the same position\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\n\n // Compare segment by segment\n for (let i = 0; i < Math.min(thisParts.length, otherParts.length); i++) {\n const thisIsStatic = !thisParts[i].startsWith(':')\n const otherIsStatic = !otherParts[i].startsWith(':')\n\n if (thisIsStatic && !otherIsStatic) return true\n if (!thisIsStatic && otherIsStatic) return false\n }\n\n // All equal, use lexicographic\n return this.pathDefinition < other.pathDefinition\n }\n}\n\n/**\n * Typed route collection with deterministic matching order.\n *\n * `Routes.create()` accepts either plain string definitions or route objects\n * and returns a \"pretty\" object with direct route access + helper methods under `._`.\n */\n\nexport class Routes<const T extends RoutesRecord = any> {\n _routes: RoutesRecordHydrated<T>\n _pathsOrdering: string[]\n _keysOrdering: string[]\n _ordered: CallableRoute[]\n\n _: {\n routes: Routes<T>['_routes']\n getLocation: Routes<T>['_getLocation']\n clone: Routes<T>['_clone']\n pathsOrdering: Routes<T>['_pathsOrdering']\n keysOrdering: Routes<T>['_keysOrdering']\n ordered: Routes<T>['_ordered']\n }\n\n private constructor({\n routes,\n isHydrated = false,\n pathsOrdering,\n keysOrdering,\n ordered,\n }: {\n routes: RoutesRecordHydrated<T> | T\n isHydrated?: boolean\n pathsOrdering?: string[]\n keysOrdering?: string[]\n ordered?: CallableRoute[]\n }) {\n this._routes = (\n isHydrated ? (routes as RoutesRecordHydrated<T>) : Routes.hydrate(routes)\n ) as RoutesRecordHydrated<T>\n if (!pathsOrdering || !keysOrdering || !ordered) {\n const ordering = Routes.makeOrdering(this._routes)\n this._pathsOrdering = ordering.pathsOrdering\n this._keysOrdering = ordering.keysOrdering\n this._ordered = this._keysOrdering.map((key) => this._routes[key])\n } else {\n this._pathsOrdering = pathsOrdering\n this._keysOrdering = keysOrdering\n this._ordered = ordered\n }\n this._ = {\n routes: this._routes,\n getLocation: this._getLocation.bind(this),\n clone: this._clone.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n /** Creates and hydrates a typed routes collection. */\n static create<const T extends RoutesRecord>(routes: T, override?: RouteConfigInput): RoutesPretty<T> {\n const result = Routes.prettify(new Routes({ routes }))\n if (!override) {\n return result\n }\n return result._.clone(override)\n }\n\n private static prettify<const T extends RoutesRecord>(instance: Routes<T>): RoutesPretty<T> {\n Object.setPrototypeOf(instance, Routes.prototype)\n Object.defineProperty(instance, Symbol.toStringTag, {\n value: 'Routes',\n })\n Object.assign(instance, {\n clone: instance._clone.bind(instance),\n })\n Object.assign(instance, instance._routes)\n return instance as unknown as RoutesPretty<T>\n }\n\n private static hydrate<const T extends RoutesRecord>(routes: T): RoutesRecordHydrated<T> {\n const result = {} as RoutesRecordHydrated<T>\n for (const key in routes) {\n if (Object.hasOwn(routes, key)) {\n const value = routes[key]\n result[key] = (typeof value === 'string' ? Route0.create(value) : value) as CallableRoute<T[typeof key]>\n }\n }\n return result\n }\n\n /**\n * Matches an input URL against collection routes.\n *\n * Returns first exact match according to precomputed ordering,\n * otherwise returns `UnknownLocation`.\n */\n _getLocation(href: `${string}://${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefRel: `/${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRel: string): UnknownLocation | ExactLocation\n _getLocation(location: AnyLocation): UnknownLocation | ExactLocation\n _getLocation(url: URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation {\n // Find the route that exactly matches the given location\n const input = hrefOrHrefRelOrLocation\n for (const route of this._ordered) {\n const loc = route.getLocation(hrefOrHrefRelOrLocation)\n if (loc.exact) {\n return loc\n }\n }\n // No exact match found, return UnknownLocation\n return typeof input === 'string' ? Route0.getLocation(input) : Route0.getLocation(input)\n }\n\n private static makeOrdering(routes: RoutesRecord): {\n pathsOrdering: string[]\n keysOrdering: string[]\n } {\n const hydrated = Routes.hydrate(routes)\n const entries = Object.entries(hydrated)\n\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n // Sort: shorter paths first, then by specificity, then alphabetically\n entries.sort(([_keyA, routeA], [_keyB, routeB]) => {\n const partsA = getParts(routeA.pathDefinition)\n const partsB = getParts(routeB.pathDefinition)\n\n // 1. Shorter paths first (by segment count)\n if (partsA.length !== partsB.length) {\n return partsA.length - partsB.length\n }\n\n // 2. Same length: check if they conflict\n if (routeA.isConflict(routeB)) {\n // Conflicting routes: more specific first\n if (routeA.isMoreSpecificThan(routeB)) return -1\n if (routeB.isMoreSpecificThan(routeA)) return 1\n }\n\n // 3. Same length, not conflicting or equal specificity: alphabetically\n return routeA.pathDefinition.localeCompare(routeB.pathDefinition)\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<T extends Route0<string> | string = string> = T extends string ? Route0<T> : T\n/** Callable route (`route(input)`) plus route instance methods/properties. */\nexport type CallableRoute<T extends Route0<string> | string = string> = AnyRoute<T> & AnyRoute<T>['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 PathDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['pathDefinition']\n : T extends string\n ? _PathDefinition<T>\n : never\nexport type ParamsDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['paramsDefinition']\n : T extends string\n ? _ParamsDefinition<T>\n : undefined\nexport type SearchDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['searchDefinition']\n : T extends string\n ? _SearchDefinition<T>\n : undefined\n\nexport type Extended<T extends AnyRoute | string | undefined, TSuffixDefinition extends string> = T extends AnyRoute\n ? Route0<PathExtended<T['definition'], TSuffixDefinition>>\n : T extends string\n ? Route0<PathExtended<T, TSuffixDefinition>>\n : T extends undefined\n ? Route0<TSuffixDefinition>\n : never\n\nexport type IsAncestor<T extends AnyRoute | string, TAncestor extends AnyRoute | string> = _IsAncestor<\n PathDefinition<T>,\n PathDefinition<TAncestor>\n>\nexport type IsDescendant<T extends AnyRoute | string, TDescendant extends AnyRoute | string> = _IsDescendant<\n PathDefinition<T>,\n PathDefinition<TDescendant>\n>\nexport type IsSame<T extends AnyRoute | string, TExact extends AnyRoute | string> = _IsSame<\n PathDefinition<T>,\n PathDefinition<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> =\n ExtractPathParams<PathDefinition<T>> extends infer U ? ([U] extends [never] ? false : true) : false\nexport type HasSearch<T extends AnyRoute | string> = Definition<T> extends `${string}&${string}` ? true : false\nexport type HasNamedSearch<T extends AnyRoute | string> = // Definition<T> extends `${string}&${string}` ? true : false\n SearchTailDefinitionWithoutFirstAndLastAmp<Definition<T>> extends '' ? false : true\nexport type HasLooseSearch<T extends AnyRoute | string> = Definition<T> extends `${string}&` ? true : false\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: string\n}\nexport type LooseSearchOutput<T extends AnyRoute | string = string> = Partial<\n {\n [K in keyof SearchDefinition<T>]?: string\n } & Record<string, string | undefined>\n>\nexport type StrictSearchOutput<T extends AnyRoute | string> = Partial<{\n [K in keyof SearchDefinition<T>]?: string | undefined\n}>\nexport type LooseFlatOutput<T extends AnyRoute | string = string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & LooseSearchOutput<T> : LooseSearchOutput<T>\nexport type StrictFlatOutput<T extends AnyRoute | string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>\nexport type FlatOutput<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = TLoose extends true\n ? LooseFlatOutput<T>\n : StrictFlatOutput<T>\nexport type LooseFlatOutputWithHash<T extends AnyRoute | string = string> = LooseFlatOutput<T> & {\n hash?: string | undefined\n}\nexport type StrictFlatOutputWithHash<T extends AnyRoute | string> = StrictFlatOutput<T> & { hash?: string | undefined }\nexport type FlatOutputWithHash<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = FlatOutput<\n T,\n TLoose\n> & { hash?: string | undefined }\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>\nexport type LooseSearchInput<T extends AnyRoute | string = string> = _LooseSearchInput<Definition<T>>\nexport type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>\nexport type LooseFlatInput<T extends AnyRoute | string> = _LooseFlatInput<Definition<T>>\nexport type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>\nexport type FlatInput<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = TLoose extends true\n ? LooseFlatInput<T>\n : StrictFlatInput<T>\nexport type LooseFlatInputWithHash<T extends AnyRoute | string> = LooseFlatInput<T> & {\n hash?: string | number\n}\nexport type StrictFlatInputWithHash<T extends AnyRoute | string> = StrictFlatInput<T> & {\n hash?: string | number\n}\nexport type FlatInputWithHash<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = FlatInput<\n T,\n TLoose\n> & { hash?: string | number }\nexport type CanInputBeEmpty<T extends AnyRoute | string> = HasParams<Definition<T>> extends true ? false : true\n\nexport type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<PathDefinition<T>>\nexport type LooseSearchInputStringOnly<T extends AnyRoute | string = string> = _LooseSearchInputStringOnly<\n Definition<T>\n>\nexport type StrictSearchInputStringOnly<T extends AnyRoute | string> = _StrictSearchInputStringOnly<Definition<T>>\nexport type LooseFlatInputStringOnly<T extends AnyRoute | string> = _LooseFlatInputStringOnly<Definition<T>>\nexport type StrictFlatInputStringOnly<T extends AnyRoute | string> = _StrictFlatInputStringOnly<Definition<T>>\nexport type FlatInputStringOnly<\n T extends AnyRoute | string,\n TLoose extends boolean = HasLooseSearch<T>,\n> = TLoose extends true ? LooseFlatInputStringOnly<T> : StrictFlatInputStringOnly<T>\n\n// location\n\nexport type LocationParams<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: string\n}\nexport type LocationSearch<TDefinition extends string = string> = {\n [K in keyof _SearchDefinition<TDefinition>]: string | undefined\n} & Record<string, string | undefined>\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 * Raw query string with leading `?`, if present.\n *\n * Example:\n * - `?tab=posts&sort=desc`\n */\n search: string\n /**\n * Parsed query map (first value per key).\n *\n * Example:\n * - search: `?tab=posts&sort=desc`\n * - searchParams: `{ tab: 'posts', sort: 'desc' }`\n */\n searchParams: Record<string, string | undefined>\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 searchParams: LooseSearchOutput\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 searchParams: Record<string, string | undefined>\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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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\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 searchParams: LooseSearchOutput<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 _PathDefinition<T extends string> = T extends string ? TrimSearchTailDefinition<T> : never\nexport type _ParamsDefinition<TDefinition extends string> =\n ExtractPathParams<PathDefinition<TDefinition>> extends infer U\n ? [U] extends [never]\n ? undefined\n : { [K in Extract<U, string>]: true }\n : undefined\nexport type _SearchDefinition<TDefinition extends string> =\n NonEmpty<SearchTailDefinitionWithoutFirstAndLastAmp<TDefinition>> extends infer Tail extends string\n ? AmpSplit<Tail> extends infer U\n ? [U] extends [never]\n ? undefined\n : { [K in Extract<U, string>]: true }\n : undefined\n : undefined\n\nexport type _ParamsInput<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends undefined\n ? Record<never, never>\n : {\n [K in keyof _ParamsDefinition<TDefinition>]: string | number\n }\nexport type _LooseSearchInput<TDefinition extends string> =\n _SearchDefinition<TDefinition> extends undefined\n ? Record<string, string | number>\n : Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string | number\n }> &\n Record<string, string | number>\nexport type _StrictSearchInput<TDefinition extends string> = Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string | number\n}>\nexport type _LooseFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInput<TDefinition> & _LooseSearchInput<TDefinition>\n : _LooseSearchInput<TDefinition>\nexport type _StrictFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition> & _ParamsInput<TDefinition>\n : _ParamsInput<TDefinition>\n : HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition>\n : Record<never, never>\n\nexport type _ParamsInputStringOnly<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends undefined\n ? Record<never, never>\n : {\n [K in keyof _ParamsDefinition<TDefinition>]: string\n }\nexport type _LooseSearchInputStringOnly<TDefinition extends string> =\n _SearchDefinition<TDefinition> extends undefined\n ? Record<string, string>\n : Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string\n }> &\n Record<string, string>\nexport type _StrictSearchInputStringOnly<TDefinition extends string> = Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string\n}>\nexport type _LooseFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInputStringOnly<TDefinition> & _LooseSearchInputStringOnly<TDefinition>\n : _LooseSearchInputStringOnly<TDefinition>\nexport type _StrictFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition> & _ParamsInputStringOnly<TDefinition>\n : _ParamsInputStringOnly<TDefinition>\n : HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition>\n : Record<never, never>\n\nexport type TrimSearchTailDefinition<S extends string> = S extends `${infer P}&${string}` ? P : S\nexport type SearchTailDefinitionWithoutFirstAmp<S extends string> = S extends `${string}&${infer T}` ? T : ''\nexport type SearchTailDefinitionWithoutFirstAndLastAmp<S extends string> = S extends `${string}&${infer T}&`\n ? T\n : S extends `${string}&${infer T}`\n ? T\n : ''\nexport type SearchTailDefinitionWithFirstAmp<S extends string> = S extends `${string}&${infer T}` ? `&${T}` : ''\nexport type AmpSplit<S extends string> = S extends `${infer A}&${infer B}` ? A | AmpSplit<B> : S\nexport type NonEmpty<T> = [T] extends ['' | never] ? never : T\nexport type ExtractPathParams<S extends string> = S extends `${string}:${infer After}`\n ? After extends `${infer Name}/${infer Rest}`\n ? Name | ExtractPathParams<`/${Rest}`>\n : After\n : never\nexport type ReplacePathParams<S extends string> = S extends `${infer Head}:${infer Tail}`\n ? // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Tail extends `${infer _Param}/${infer Rest}`\n ? ReplacePathParams<`${Head}${string}/${Rest}`>\n : `${Head}${string}`\n : S\nexport type DedupeSlashes<S extends string> = S extends `${infer A}//${infer B}` ? DedupeSlashes<`${A}/${B}`> : S\nexport type EmptyRecord = Record<never, never>\nexport type JoinPath<Parent extends string, Suffix extends string> = DedupeSlashes<\n PathDefinition<Parent> extends infer A extends string\n ? PathDefinition<Suffix> extends infer B extends string\n ? A extends ''\n ? B extends ''\n ? ''\n : B extends `/${string}`\n ? B\n : `/${B}`\n : B extends ''\n ? A\n : A extends `${string}/`\n ? `${A}${B}`\n : B extends `/${string}`\n ? `${A}${B}`\n : `${A}/${B}`\n : never\n : never\n>\n\nexport type OnlyIfNoParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends false ? Yes : No\nexport type OnlyIfHasParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends true ? Yes : No\n\n// export type PathRouteValue<TDefinition extends string> = `${ReplacePathParams<PathDefinition<TDefinition>>}`\n// export type PathOnlyRouteValue<TDefinition extends string> = `${ReplacePathParams<PathDefinition<TDefinition>>}`\n// export type WithSearchRouteValue<TDefinition extends string> =\n// `${ReplacePathParams<PathDefinition<TDefinition>>}?${string}`\n// export type AbsolutePathRouteValue<TDefinition extends string> =\n// PathRouteValue<TDefinition> extends '/' ? string : `${string}${PathRouteValue<TDefinition>}`\n// export type AbsolutePathOnlyRouteValue<TDefinition extends string> =\n// PathOnlyRouteValue<TDefinition> extends '/' ? string : `${string}${PathOnlyRouteValue<TDefinition>}`\n// export type AbsoluteWithSearchRouteValue<TDefinition extends string> = `${string}${WithSearchRouteValue<TDefinition>}`\n\nexport type PathExtended<\n TSourcedefinitionDefinition extends string,\n TSuffixdefinitionDefinition extends string,\n> = `${JoinPath<TSourcedefinitionDefinition, TSuffixdefinitionDefinition>}${SearchTailDefinitionWithFirstAmp<TSuffixdefinitionDefinition>}`\n\nexport type WithParamsInput<\n TDefinition extends string,\n T extends\n | {\n search?: _LooseSearchInput<any>\n abs?: boolean | string\n hash?: string | number\n }\n | undefined = undefined,\n> = _ParamsInput<TDefinition> & (T extends undefined ? Record<never, never> : T)\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 }\nexport type SafeParseInputStrictResult<TDefinition extends string> = _SafeParseInputResult<\n StrictFlatOutput<TDefinition>\n>\nexport type SafeParseInputLooseResult<TDefinition extends string> = _SafeParseInputResult<LooseFlatOutput<TDefinition>>\nexport type Route0Schema<\n TInput extends Record<string, unknown> | undefined,\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":["absOriginInput","paramsInput","searchInput","hashInput"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\n\n// TODO: asterisk\n// TODO: when asterisk then query params will be extended also after extend\n// TODO: optional params\n// TODO: required search\n\n// TODO: .extension('.json') to not add additional / but just add some extension\n// TODO: search input can be boolean, or even object with qs\n// TODO: route0 if ens with \"...&\" then can be any query, else only provided type of queries\n// TODO: Роут0 три мод, тогда там все ноуты кончаются на .селф\n// TODO: use splats in param definition \"*\"\n// TODO: ? check extend for search only .extend('&x&z')\n// TODO: .create(route, {useSearch, useParams})\n// TODO: Из пас экзакт, из пасвизквери экзает, из чилдрен, из парент, из экзактОр\n// TODO: isEqual, isDescendant, isAncestor\n// TODO: extractParams, extractSearch\n// TODO: getPathDefinition respecting definitionParamPrefix, definitionSearchPrefix\n// TODO: prepend\n// TODO: ?? Route0.createTree({base:{self: x, children: ...})\n// TODO: ? Routes.create({base:{self: x, children: ...}).attach('section', Routes.create({...}))\n// TODO: overrideTree\n// TODO: .create(route, {origin, useLocation})\n// TODO: ? optional path params as @\n// TODO: prependMany, extendMany, overrideMany, with types\n// TODO: optional route params /x/:id?\n// TODO: fix CallableRoute<CallableRoute<>> in RoutesPretty type, it should be just CallableRoute<>\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> {\n readonly definition: TDefinition\n readonly pathDefinition: _PathDefinition<TDefinition>\n readonly paramsDefinition: _ParamsDefinition<TDefinition>\n readonly searchDefinition: _SearchDefinition<TDefinition>\n readonly hasLooseSearch: HasLooseSearch<TDefinition>\n private _origin: string | undefined\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 this.definition = definition\n this.pathDefinition = Route0._getPathDefinitionBydefinition(definition)\n this.paramsDefinition = Route0._getParamsDefinitionBydefinition(definition)\n this.searchDefinition = Route0._getSearchDefinitionBydefinition(definition)\n this.hasLooseSearch = Route0._hasLooseSearch(definition)\n\n const { origin } = config\n if (origin && typeof origin === 'string' && origin.length) {\n this._origin = origin\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } } | undefined\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this._origin = g.location.origin\n } else {\n this._origin = undefined\n }\n }\n }\n\n /**\n * Creates a callable route instance.\n *\n * If an existing route/callable route is provided, it is cloned.\n */\n static create<TDefinition extends string>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n config?: RouteConfigInput,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n if (typeof definition === 'object') {\n return definition.clone(config) as CallableRoute<TDefinition>\n }\n const original = new Route0<TDefinition>(definition, config)\n const callable = original.get.bind(original)\n Object.setPrototypeOf(callable, original)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: original.definition,\n })\n return callable as never\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>(\n definition: TDefinition | AnyRoute<TDefinition> | CallableRoute<TDefinition>,\n ): CallableRoute<TDefinition> {\n if (typeof definition === 'function') {\n return definition\n }\n const original = typeof definition === 'object' ? definition : new Route0<TDefinition>(definition)\n const callable = original.get.bind(original)\n Object.setPrototypeOf(callable, original)\n Object.defineProperty(callable, Symbol.toStringTag, {\n value: original.definition,\n })\n return callable as never\n }\n\n private static _splitPathDefinitionAndSearchTailDefinition(definition: string) {\n const i = definition.indexOf('&')\n if (i === -1) return { pathDefinition: definition, searchTailDefinition: '' }\n return {\n pathDefinition: definition.slice(0, i),\n searchTailDefinition: definition.slice(i),\n }\n }\n\n private static _getAbsPath(origin: string, pathWithSearch: string) {\n return new URL(pathWithSearch, origin).toString().replace(/\\/$/, '')\n }\n\n private static _getPathDefinitionBydefinition<TDefinition extends string>(definition: TDefinition) {\n const { pathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n return pathDefinition as _PathDefinition<TDefinition>\n }\n\n private static _getParamsDefinitionBydefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _ParamsDefinition<TDefinition> {\n const { pathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n const matches = Array.from(pathDefinition.matchAll(/:([A-Za-z0-9_]+)/g))\n const paramsDefinition = Object.fromEntries(matches.map((m) => [m[1], true]))\n const keysCount = Object.keys(paramsDefinition).length\n if (keysCount === 0) {\n return undefined as _ParamsDefinition<TDefinition>\n }\n return paramsDefinition as _ParamsDefinition<TDefinition>\n }\n\n private static _getSearchDefinitionBydefinition<TDefinition extends string>(\n definition: TDefinition,\n ): _SearchDefinition<TDefinition> {\n const { searchTailDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(definition)\n if (!searchTailDefinition) {\n return undefined as _SearchDefinition<TDefinition>\n }\n const keys = searchTailDefinition.split('&').filter(Boolean)\n const searchDefinition = Object.fromEntries(keys.map((k) => [k, true]))\n const keysCount = Object.keys(searchDefinition).length\n if (keysCount === 0) {\n return undefined as _SearchDefinition<TDefinition>\n }\n return searchDefinition as _SearchDefinition<TDefinition>\n }\n\n private static _hasLooseSearch<TDefinition extends string>(definition: TDefinition): HasLooseSearch<TDefinition> {\n // ends with &\n return definition.endsWith('&') as HasLooseSearch<TDefinition>\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>> {\n const { pathDefinition: parentPathDefinition } = Route0._splitPathDefinitionAndSearchTailDefinition(this.definition)\n const { pathDefinition: suffixPathDefinition, searchTailDefinition: suffixSearchTailDefinition } =\n Route0._splitPathDefinitionAndSearchTailDefinition(suffixDefinition)\n const pathDefinition = `${parentPathDefinition}/${suffixPathDefinition}`.replace(/\\/{2,}/g, '/')\n const definition = `${pathDefinition}${suffixSearchTailDefinition}` as PathExtended<TDefinition, TSuffixDefinition>\n return Route0.create<PathExtended<TDefinition, TSuffixDefinition>>(definition, { origin: this._origin })\n }\n\n // has params\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: false; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n /**\n * Builds a URL string from typed params/search input.\n *\n * - `abs: true` returns absolute URL using `origin`\n * - `hash` appends URL fragment\n * - `search` accepts named/loose search input based on definition\n */\n get(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<\n TDefinition,\n {\n search?: _LooseSearchInput<TDefinition>\n abs?: boolean | string\n hash?: string | number\n }\n >\n >,\n ): OnlyIfHasParams<TDefinition, string>\n\n // no params\n // get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>\n // get(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs?: false; hash?: string | number }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs?: false; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs: true; hash?: string | number }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathRouteValue<TDefinition>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search?: _SearchInput<TDefinition>; abs?: false; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search?: _SearchInput<TDefinition>; abs: true; hash?: string | number }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n get(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n get(\n input: OnlyIfNoParams<\n TDefinition,\n {\n search?: _LooseSearchInput<TDefinition>\n abs?: boolean | string\n hash?: string | number\n }\n >,\n ): OnlyIfNoParams<TDefinition, string>\n\n // implementation\n get(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, absOriginInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\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 = args[0]\n if (typeof input !== 'object' || input === null) {\n // throw new Error(\"Invalid get route input: expected object\")\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n absOriginInput: undefined,\n hashInput: undefined,\n }\n }\n const { search, abs, hash, ...params } = input as Record<string, string | number> & {\n search: Record<string, string | number>\n abs: boolean | string\n hash: string | undefined\n [key: string]: unknown\n }\n const absOriginInput = typeof abs === 'string' && abs.length > 0 ? abs : undefined\n return {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n searchInput: search || {},\n paramsInput: params,\n absInput: absOriginInput !== undefined || abs === true,\n absOriginInput,\n hashInput: hash,\n }\n })()\n\n // validate params\n const neededParamsKeys = this.paramsDefinition ? Object.keys(this.paramsDefinition) : []\n const providedParamsKeys = Object.keys(paramsInput)\n const notProvidedKeys = neededParamsKeys.filter((k) => !providedParamsKeys.includes(k))\n if (notProvidedKeys.length) {\n // throw new Error(`Missing params: not defined keys ${notProvidedKeys.map((k) => `\"${k}\"`).join(\", \")}.`)\n Object.assign(paramsInput, Object.fromEntries(notProvidedKeys.map((k) => [k, 'undefined'])))\n }\n\n // create url\n\n let url = this.pathDefinition as string\n // replace 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] ?? '')))\n // search params\n const searchInputStringified = Object.fromEntries(Object.entries(searchInput).map(([k, v]) => [k, String(v)]))\n url = [url, new URLSearchParams(searchInputStringified).toString()].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 // has params\n // flat(\n // input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string | number }>>,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string | number }>>,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n // >,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n /**\n * Flat input variant of `get()`, where path params + search keys\n * are provided in a single object.\n */\n flat<TLoose extends boolean = HasLooseSearch<TDefinition>>(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, FlatInput<TDefinition, TLoose> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n loose?: TLoose,\n ): OnlyIfHasParams<TDefinition, string>\n\n // no params\n // flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>\n\n // flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathRouteValue<TDefinition>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n flat(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flat<TLoose extends boolean = HasLooseSearch<TDefinition>>(\n input: OnlyIfNoParams<TDefinition, FlatInput<TDefinition, TLoose> & { hash?: string | number }>,\n abs?: boolean | string,\n loose?: TLoose,\n ): OnlyIfNoParams<TDefinition, string>\n\n // implementation\n flat(...args: unknown[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean | string\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return {\n searchInput: {},\n paramsInput: {},\n absInput: false,\n hashInput: undefined,\n }\n }\n const input = args[0] as Record<string, string | number> | undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof input !== 'object' || input === null) {\n // throw new Error(\"Invalid get route input: expected object\")\n return {\n searchInput: {},\n paramsInput: {},\n absInput: (args[1] as boolean | string | undefined) ?? false,\n hashInput: undefined,\n }\n }\n const loose = (args[2] as boolean | undefined) ?? this.hasLooseSearch\n const paramsKeys = this.getParamsKeys()\n const paramsInput = paramsKeys.reduce<Record<string, string | number>>((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (input[key] !== undefined) {\n acc[key] = input[key]\n }\n return acc\n }, {})\n const searchKeys = this.getSearchKeys()\n const searchInput = Object.keys(input)\n .filter((k) => {\n if (k === 'hash') {\n return false\n }\n if (searchKeys.includes(k)) {\n return true\n }\n if (paramsKeys.includes(k)) {\n return false\n }\n return loose\n })\n .reduce<Record<string, string | number>>((acc, key) => {\n acc[key] = input[key]\n return acc\n }, {})\n const hashInput = input.hash\n return {\n searchInput,\n paramsInput,\n absInput: (args[1] as boolean | string | undefined) ?? false,\n hashInput: hashInput as string | undefined,\n }\n })()\n\n return this.get({\n ...paramsInput,\n search: searchInput,\n abs: absInput,\n hash: hashInput,\n } as never)\n }\n\n /** Same as `flat()`, but always accepts loose search keys. */\n flatLoose(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, LooseFlatInput<TDefinition> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n ): OnlyIfHasParams<TDefinition, string>\n flatLoose(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flatLoose(\n input: OnlyIfNoParams<TDefinition, LooseFlatInput<TDefinition> & { hash?: string | number }>,\n abs?: boolean | string,\n ): OnlyIfNoParams<TDefinition, string>\n flatLoose(...args: unknown[]): string {\n return this.flat(args[0] as never, args[1] as never, true)\n }\n\n /** Same as `flat()`, but only allows declared search keys. */\n flatStrict(\n input: OnlyIfHasParams<\n TDefinition,\n WithParamsInput<TDefinition, StrictFlatInput<TDefinition> & { hash?: string | number }>\n >,\n abs?: boolean | string,\n ): OnlyIfHasParams<TDefinition, string>\n flatStrict(...args: OnlyIfNoParams<TDefinition, [], [never]>): string\n flatStrict(\n input: OnlyIfNoParams<TDefinition, StrictFlatInput<TDefinition> & { hash?: string | number }>,\n abs?: boolean | string,\n ): OnlyIfNoParams<TDefinition, string>\n flatStrict(...args: unknown[]): string {\n return this.flat(args[0] as never, args[1] as never, false)\n }\n\n /** Returns path param keys extracted from route definition. */\n getParamsKeys(): string[] {\n return Object.keys(this.paramsDefinition || {})\n }\n /** Returns named search keys extracted from route definition. */\n getSearchKeys(): string[] {\n return Object.keys(this.searchDefinition || {})\n }\n /** Returns all flat input keys (`search + params`). */\n getFlatKeys(): string[] {\n return [...this.getSearchKeys(), ...this.getParamsKeys()]\n }\n\n getDefinition(): string {\n return this.pathDefinition\n }\n\n /** Clones route with optional config override. */\n clone(config?: RouteConfigInput): CallableRoute<TDefinition> {\n return Route0.create(this.definition, config)\n }\n\n getRegexBaseStrictString(): string {\n return this.pathDefinition\n .replace(/:(\\w+)/g, '___PARAM___') // temporarily replace params with placeholder\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // escape regex special chars\n .replace(/___PARAM___/g, '([^/]+)')\n }\n\n getRegexBaseString(): string {\n return this.getRegexBaseStrictString().replace(/\\/+$/, '') + '/?' // remove trailing slashes and add optional slash\n }\n\n getRegexStrictString(): string {\n return `^${this.getRegexBaseStrictString()}$`\n }\n\n getRegexString(): string {\n return `^${this.getRegexBaseString()}$`\n }\n\n getRegexStrict(): RegExp {\n return new RegExp(this.getRegexStrictString())\n }\n\n getRegex(): RegExp {\n return new RegExp(this.getRegexString())\n }\n\n /** Creates a grouped strict regex pattern string from many routes. */\n static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a strict grouped regex from many routes. */\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Creates a grouped regex pattern string from many routes. */\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n /** Creates a grouped regex from many routes. */\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = Route0.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n /** Converts any location shape to relative form (removes host/origin fields). */\n static toRelLocation<TLocation extends AnyLocation>(location: TLocation): TLocation {\n return {\n ...location,\n abs: false,\n origin: undefined,\n href: undefined,\n port: undefined,\n host: undefined,\n hostname: undefined,\n }\n }\n\n /** Converts a location to absolute form using provided origin URL. */\n static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, origin: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, origin)\n return {\n ...location,\n abs: true,\n origin: url.origin,\n href: url.href,\n port: url.port,\n host: url.host,\n hostname: url.hostname,\n }\n }\n\n /**\n * Parses a URL-like input into raw location object (without route knowledge).\n *\n * Result is always `UnknownLocation` because no route matching is applied.\n */\n static getLocation(href: `${string}://${string}`): UnknownLocation\n static getLocation(hrefRel: `/${string}`): UnknownLocation\n static getLocation(hrefOrHrefRel: string): UnknownLocation\n static getLocation(location: AnyLocation): UnknownLocation\n static getLocation(url: URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation\n static getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return Route0.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n // Check if it's an absolute URL (starts with scheme://)\n const abs = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(hrefOrHrefRelOrLocation)\n\n // Use dummy base only if relative\n const base = abs ? undefined : 'http://example.com'\n const url = new URL(hrefOrHrefRelOrLocation, base)\n\n // Extract search params\n const searchParams = Object.fromEntries(url.searchParams.entries())\n\n // Normalize pathname (remove trailing slash except for root)\n let pathname = url.pathname\n if (pathname.length > 1 && pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1)\n }\n\n // Common derived values\n const hrefRel = pathname + url.search + url.hash\n\n // Build the location object consistent with _GeneralLocation\n const location: UnknownLocation = {\n pathname,\n search: 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 searchParams,\n params: undefined,\n route: undefined,\n known: false,\n exact: false,\n ancestor: false,\n descendant: false,\n unmatched: false,\n }\n\n return location\n }\n\n /**\n * Parses input and matches it against this route definition.\n *\n * Result includes relation flags:\n * - `exact`\n * - `ancestor`\n * - `descendant`\n * - `unmatched`\n */\n getLocation(href: `${string}://${string}`): KnownLocation<TDefinition>\n getLocation(hrefRel: `/${string}`): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRel: string): KnownLocation<TDefinition>\n getLocation(location: AnyLocation): KnownLocation<TDefinition>\n getLocation(url: AnyLocation): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition>\n getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): KnownLocation<TDefinition> {\n if (hrefOrHrefRelOrLocation instanceof URL) {\n return this.getLocation(hrefOrHrefRelOrLocation.href)\n }\n if (typeof hrefOrHrefRelOrLocation !== 'string') {\n hrefOrHrefRelOrLocation = hrefOrHrefRelOrLocation.href || hrefOrHrefRelOrLocation.hrefRel\n }\n const location = Route0.getLocation(hrefOrHrefRelOrLocation) as never as KnownLocation<TDefinition>\n location.route = this.definition as Definition<TDefinition>\n location.params = {}\n\n // Normalize pathname (no trailing slash except root)\n const pathname =\n location.pathname.length > 1 && location.pathname.endsWith('/')\n ? location.pathname.slice(0, -1)\n : location.pathname\n\n // Extract param names from the definition\n const paramNames: string[] = []\n const def =\n this.pathDefinition.length > 1 && this.pathDefinition.endsWith('/')\n ? this.pathDefinition.slice(0, -1)\n : this.pathDefinition\n def.replace(/:([A-Za-z0-9_]+)/g, (_m: string, name: string) => {\n paramNames.push(String(name))\n return ''\n })\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const ancestorRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n const ancestorMatch = pathname.match(ancestorRe)\n const exact = !!exactMatch\n const ancestor = !exact && !!ancestorMatch\n\n // Parse params for exact and ancestor matches.\n const paramsMatch = exactMatch || (ancestor ? ancestorMatch : null)\n if (paramsMatch) {\n const values = paramsMatch.slice(1, 1 + paramNames.length)\n const params = Object.fromEntries(paramNames.map((n, i) => [n, decodeURIComponent(values[i] ?? '')]))\n location.params = params\n } else {\n location.params = {}\n }\n\n // \"descendant\": the URL is a prefix of the route definition (params match any single segment)\n const getParts = (path: string) => (path === '/' ? ['/'] : path.split('/').filter(Boolean))\n const defParts = getParts(def)\n const pathParts = getParts(pathname)\n\n let isPrefix = true\n if (pathParts.length > defParts.length) {\n isPrefix = false\n } else {\n for (let i = 0; i < pathParts.length; i++) {\n const defPart = defParts[i]\n const pathPart = pathParts[i]\n if (!defPart) {\n isPrefix = false\n break\n }\n if (defPart.startsWith(':')) continue\n if (defPart !== 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.slice(1)] = 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 paramsKeys = this.getParamsKeys()\n if (input === undefined) {\n if (paramsKeys.length) {\n return {\n issues: [\n {\n message: `Missing params: ${paramsKeys.map((k) => `\"${k}\"`).join(', ')}`,\n },\n ],\n }\n }\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid input: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const inputKeys = Object.keys(inputObj)\n const notDefinedKeys = paramsKeys.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> = {}\n for (const k of paramsKeys) {\n const v = inputObj[k]\n 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 input: expected string, number, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as ParamsOutput<TDefinition>,\n }\n }\n\n private _validateSearchInput<TLoose extends boolean>(\n input: unknown,\n loose: TLoose,\n ): StandardSchemaV1.Result<TLoose extends true ? LooseSearchOutput<TDefinition> : StrictSearchOutput<TDefinition>> {\n if (input === undefined) {\n input = {}\n }\n if (typeof input !== 'object' || input === null) {\n return {\n issues: [{ message: 'Invalid input: expected object' }],\n }\n }\n const inputObj = input as Record<string, unknown>\n const paramsKeys = this.getParamsKeys()\n const searchKeys = this.getSearchKeys()\n const data: Record<string, string> = {}\n for (const [k, v] of Object.entries(inputObj)) {\n if (k === 'hash') continue\n if (paramsKeys.includes(k)) continue\n if (!loose && !searchKeys.includes(k)) continue\n if (v === undefined) continue\n 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 input: expected string, number, or undefined, got ${typeof v} for \"${k}\"` }],\n }\n }\n }\n return {\n value: data as TLoose extends true ? LooseSearchOutput<TDefinition> : StrictSearchOutput<TDefinition>,\n }\n }\n\n private _validateFlatInput<TLoose extends boolean>(\n input: unknown,\n loose: TLoose,\n ): StandardSchemaV1.Result<TLoose extends true ? LooseFlatOutput<TDefinition> : StrictFlatOutput<TDefinition>> {\n const paramsResult = this._validateParamsInput(input)\n if ('issues' in paramsResult) {\n return {\n issues: paramsResult.issues ?? [],\n }\n }\n\n const searchResult = this._validateSearchInput(input, loose)\n if ('issues' in searchResult) {\n return {\n issues: searchResult.issues ?? [],\n }\n }\n\n return {\n value: {\n ...(searchResult.value as Record<string, string>),\n ...(paramsResult.value as Record<string, string>),\n } as TLoose extends true ? LooseFlatOutput<TDefinition> : StrictFlatOutput<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 paramsInputSchema: Route0Schema<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 /** Standard Schema for strict search input. */\n readonly strictSearchInputSchema: Route0Schema<StrictSearchInput<TDefinition>, StrictSearchOutput<TDefinition>> = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateSearchInput(value, false),\n types: undefined as unknown as StandardSchemaV1.Types<\n StrictSearchInput<TDefinition>,\n StrictSearchOutput<TDefinition>\n >,\n },\n parse: (value) => this._parseSchemaResult(this._validateSearchInput(value, false)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateSearchInput(value, false)),\n }\n\n /** Standard Schema for loose search input. */\n readonly looseSearchInputSchema: Route0Schema<LooseSearchInput<TDefinition>, LooseSearchOutput<TDefinition>> = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateSearchInput(value, true),\n types: undefined as unknown as StandardSchemaV1.Types<\n LooseSearchInput<TDefinition>,\n LooseSearchOutput<TDefinition>\n >,\n },\n parse: (value) => this._parseSchemaResult(this._validateSearchInput(value, true)),\n safeParse: (value) => this._safeParseSchemaResult(this._validateSearchInput(value, true)),\n }\n\n /** Standard Schema for route flat input (uses route default strict/loose mode). */\n readonly flatInputSchema: Route0Schema<\n FlatInput<TDefinition, HasLooseSearch<TDefinition>>,\n FlatOutput<TDefinition, HasLooseSearch<TDefinition>>\n > = {\n '~standard': {\n version: 1,\n vendor: 'route0',\n validate: (value) => this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>),\n types: undefined as unknown as StandardSchemaV1.Types<\n FlatInput<TDefinition, HasLooseSearch<TDefinition>>,\n FlatOutput<TDefinition, HasLooseSearch<TDefinition>>\n >,\n },\n parse: (value) =>\n this._parseSchemaResult(this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>)),\n safeParse: (value) =>\n this._safeParseSchemaResult(this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>)),\n }\n\n /** True when path structure is equal (param names are ignored). */\n isSame(other: AnyRoute): boolean {\n return (\n this.pathDefinition.replace(/:([A-Za-z0-9_]+)/g, '__PARAM__') ===\n other.pathDefinition.replace(/:([A-Za-z0-9_]+)/g, '__PARAM__')\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.pathDefinition === '/' && this.pathDefinition !== '/') {\n return true\n }\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\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.pathDefinition === '/' && other.pathDefinition !== '/') {\n return true\n }\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\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 getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\n\n // Different lengths = no conflict (one is deeper than the other)\n if (thisParts.length !== otherParts.length) {\n return false\n }\n\n // Check if all segments could match\n for (let i = 0; i < thisParts.length; i++) {\n const thisPart = thisParts[i]\n const otherPart = otherParts[i]\n\n // Both params = always match\n if (thisPart.startsWith(':') && otherPart.startsWith(':')) {\n continue\n }\n\n // One is param = can match\n if (thisPart.startsWith(':') || otherPart.startsWith(':')) {\n continue\n }\n\n // Both static = must be same\n if (thisPart !== otherPart) {\n return false\n }\n }\n\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 // More specific = should come earlier when conflicted\n // Static segments beat param segments at the same position\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n const thisParts = getParts(this.pathDefinition)\n const otherParts = getParts(other.pathDefinition)\n\n // Compare segment by segment\n for (let i = 0; i < Math.min(thisParts.length, otherParts.length); i++) {\n const thisIsStatic = !thisParts[i].startsWith(':')\n const otherIsStatic = !otherParts[i].startsWith(':')\n\n if (thisIsStatic && !otherIsStatic) return true\n if (!thisIsStatic && otherIsStatic) return false\n }\n\n // All equal, use lexicographic\n return this.pathDefinition < other.pathDefinition\n }\n}\n\n/**\n * Typed route collection with deterministic matching order.\n *\n * `Routes.create()` accepts either plain string definitions or route objects\n * and returns a \"pretty\" object with direct route access + helper methods under `._`.\n */\n\nexport class Routes<const T extends RoutesRecord = any> {\n _routes: RoutesRecordHydrated<T>\n _pathsOrdering: string[]\n _keysOrdering: string[]\n _ordered: CallableRoute[]\n\n _: {\n routes: Routes<T>['_routes']\n getLocation: Routes<T>['_getLocation']\n clone: Routes<T>['_clone']\n pathsOrdering: Routes<T>['_pathsOrdering']\n keysOrdering: Routes<T>['_keysOrdering']\n ordered: Routes<T>['_ordered']\n }\n\n private constructor({\n routes,\n isHydrated = false,\n pathsOrdering,\n keysOrdering,\n ordered,\n }: {\n routes: RoutesRecordHydrated<T> | T\n isHydrated?: boolean\n pathsOrdering?: string[]\n keysOrdering?: string[]\n ordered?: CallableRoute[]\n }) {\n this._routes = (\n isHydrated ? (routes as RoutesRecordHydrated<T>) : Routes.hydrate(routes)\n ) as RoutesRecordHydrated<T>\n if (!pathsOrdering || !keysOrdering || !ordered) {\n const ordering = Routes.makeOrdering(this._routes)\n this._pathsOrdering = ordering.pathsOrdering\n this._keysOrdering = ordering.keysOrdering\n this._ordered = this._keysOrdering.map((key) => this._routes[key])\n } else {\n this._pathsOrdering = pathsOrdering\n this._keysOrdering = keysOrdering\n this._ordered = ordered\n }\n this._ = {\n routes: this._routes,\n getLocation: this._getLocation.bind(this),\n clone: this._clone.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n /** Creates and hydrates a typed routes collection. */\n static create<const T extends RoutesRecord>(routes: T, override?: RouteConfigInput): RoutesPretty<T> {\n const result = Routes.prettify(new Routes({ routes }))\n if (!override) {\n return result\n }\n return result._.clone(override)\n }\n\n private static prettify<const T extends RoutesRecord>(instance: Routes<T>): RoutesPretty<T> {\n Object.setPrototypeOf(instance, Routes.prototype)\n Object.defineProperty(instance, Symbol.toStringTag, {\n value: 'Routes',\n })\n Object.assign(instance, {\n clone: instance._clone.bind(instance),\n })\n Object.assign(instance, instance._routes)\n return instance as unknown as RoutesPretty<T>\n }\n\n private static hydrate<const T extends RoutesRecord>(routes: T): RoutesRecordHydrated<T> {\n const result = {} as RoutesRecordHydrated<T>\n for (const key in routes) {\n if (Object.hasOwn(routes, key)) {\n const value = routes[key]\n result[key] = (typeof value === 'string' ? Route0.create(value) : value) as CallableRoute<T[typeof key]>\n }\n }\n return result\n }\n\n /**\n * Matches an input URL against collection routes.\n *\n * Returns first exact match according to precomputed ordering,\n * otherwise returns `UnknownLocation`.\n */\n _getLocation(href: `${string}://${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefRel: `/${string}`): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRel: string): UnknownLocation | ExactLocation\n _getLocation(location: AnyLocation): UnknownLocation | ExactLocation\n _getLocation(url: URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation\n _getLocation(hrefOrHrefRelOrLocation: string | AnyLocation | URL): UnknownLocation | ExactLocation {\n // Find the route that exactly matches the given location\n const input = hrefOrHrefRelOrLocation\n for (const route of this._ordered) {\n const loc = route.getLocation(hrefOrHrefRelOrLocation)\n if (loc.exact) {\n return loc\n }\n }\n // No exact match found, return UnknownLocation\n return typeof input === 'string' ? Route0.getLocation(input) : Route0.getLocation(input)\n }\n\n private static makeOrdering(routes: RoutesRecord): {\n pathsOrdering: string[]\n keysOrdering: string[]\n } {\n const hydrated = Routes.hydrate(routes)\n const entries = Object.entries(hydrated)\n\n const getParts = (path: string) => {\n if (path === '/') return ['/']\n return path.split('/').filter(Boolean)\n }\n\n // Sort: shorter paths first, then by specificity, then alphabetically\n entries.sort(([_keyA, routeA], [_keyB, routeB]) => {\n const partsA = getParts(routeA.pathDefinition)\n const partsB = getParts(routeB.pathDefinition)\n\n // 1. Shorter paths first (by segment count)\n if (partsA.length !== partsB.length) {\n return partsA.length - partsB.length\n }\n\n // 2. Same length: check if they conflict\n if (routeA.isConflict(routeB)) {\n // Conflicting routes: more specific first\n if (routeA.isMoreSpecificThan(routeB)) return -1\n if (routeB.isMoreSpecificThan(routeA)) return 1\n }\n\n // 3. Same length, not conflicting or equal specificity: alphabetically\n return routeA.pathDefinition.localeCompare(routeB.pathDefinition)\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<T extends Route0<string> | string = string> = T extends string ? Route0<T> : T\n/** Callable route (`route(input)`) plus route instance methods/properties. */\nexport type CallableRoute<T extends Route0<string> | string = string> = AnyRoute<T> & AnyRoute<T>['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 PathDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['pathDefinition']\n : T extends string\n ? _PathDefinition<T>\n : never\nexport type ParamsDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['paramsDefinition']\n : T extends string\n ? _ParamsDefinition<T>\n : undefined\nexport type SearchDefinition<T extends AnyRoute | string> = T extends AnyRoute\n ? T['searchDefinition']\n : T extends string\n ? _SearchDefinition<T>\n : undefined\n\nexport type Extended<T extends AnyRoute | string | undefined, TSuffixDefinition extends string> = T extends AnyRoute\n ? Route0<PathExtended<T['definition'], TSuffixDefinition>>\n : T extends string\n ? Route0<PathExtended<T, TSuffixDefinition>>\n : T extends undefined\n ? Route0<TSuffixDefinition>\n : never\n\nexport type IsAncestor<T extends AnyRoute | string, TAncestor extends AnyRoute | string> = _IsAncestor<\n PathDefinition<T>,\n PathDefinition<TAncestor>\n>\nexport type IsDescendant<T extends AnyRoute | string, TDescendant extends AnyRoute | string> = _IsDescendant<\n PathDefinition<T>,\n PathDefinition<TDescendant>\n>\nexport type IsSame<T extends AnyRoute | string, TExact extends AnyRoute | string> = _IsSame<\n PathDefinition<T>,\n PathDefinition<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> =\n ExtractPathParams<PathDefinition<T>> extends infer U ? ([U] extends [never] ? false : true) : false\nexport type HasSearch<T extends AnyRoute | string> = Definition<T> extends `${string}&${string}` ? true : false\nexport type HasNamedSearch<T extends AnyRoute | string> = // Definition<T> extends `${string}&${string}` ? true : false\n SearchTailDefinitionWithoutFirstAndLastAmp<Definition<T>> extends '' ? false : true\nexport type HasLooseSearch<T extends AnyRoute | string> = Definition<T> extends `${string}&` ? true : false\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: string\n}\nexport type LooseSearchOutput<T extends AnyRoute | string = string> = Partial<\n {\n [K in keyof SearchDefinition<T>]?: string\n } & Record<string, string | undefined>\n>\nexport type StrictSearchOutput<T extends AnyRoute | string> = Partial<{\n [K in keyof SearchDefinition<T>]?: string | undefined\n}>\nexport type LooseFlatOutput<T extends AnyRoute | string = string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & LooseSearchOutput<T> : LooseSearchOutput<T>\nexport type StrictFlatOutput<T extends AnyRoute | string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>\nexport type FlatOutput<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = TLoose extends true\n ? LooseFlatOutput<T>\n : StrictFlatOutput<T>\nexport type LooseFlatOutputWithHash<T extends AnyRoute | string = string> = LooseFlatOutput<T> & {\n hash?: string | undefined\n}\nexport type StrictFlatOutputWithHash<T extends AnyRoute | string> = StrictFlatOutput<T> & { hash?: string | undefined }\nexport type FlatOutputWithHash<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = FlatOutput<\n T,\n TLoose\n> & { hash?: string | undefined }\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>\nexport type LooseSearchInput<T extends AnyRoute | string = string> = _LooseSearchInput<Definition<T>>\nexport type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>\nexport type LooseFlatInput<T extends AnyRoute | string> = _LooseFlatInput<Definition<T>>\nexport type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>\nexport type FlatInput<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = TLoose extends true\n ? LooseFlatInput<T>\n : StrictFlatInput<T>\nexport type LooseFlatInputWithHash<T extends AnyRoute | string> = LooseFlatInput<T> & {\n hash?: string | number\n}\nexport type StrictFlatInputWithHash<T extends AnyRoute | string> = StrictFlatInput<T> & {\n hash?: string | number\n}\nexport type FlatInputWithHash<T extends AnyRoute | string, TLoose extends boolean = HasLooseSearch<T>> = FlatInput<\n T,\n TLoose\n> & { hash?: string | number }\nexport type CanInputBeEmpty<T extends AnyRoute | string> = HasParams<Definition<T>> extends true ? false : true\n\nexport type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<PathDefinition<T>>\nexport type LooseSearchInputStringOnly<T extends AnyRoute | string = string> = _LooseSearchInputStringOnly<\n Definition<T>\n>\nexport type StrictSearchInputStringOnly<T extends AnyRoute | string> = _StrictSearchInputStringOnly<Definition<T>>\nexport type LooseFlatInputStringOnly<T extends AnyRoute | string> = _LooseFlatInputStringOnly<Definition<T>>\nexport type StrictFlatInputStringOnly<T extends AnyRoute | string> = _StrictFlatInputStringOnly<Definition<T>>\nexport type FlatInputStringOnly<\n T extends AnyRoute | string,\n TLoose extends boolean = HasLooseSearch<T>,\n> = TLoose extends true ? LooseFlatInputStringOnly<T> : StrictFlatInputStringOnly<T>\n\n// location\n\nexport type LocationParams<TDefinition extends string> = {\n [K in keyof _ParamsDefinition<TDefinition>]: string\n}\nexport type LocationSearch<TDefinition extends string = string> = {\n [K in keyof _SearchDefinition<TDefinition>]: string | undefined\n} & Record<string, string | undefined>\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 * Raw query string with leading `?`, if present.\n *\n * Example:\n * - `?tab=posts&sort=desc`\n */\n search: string\n /**\n * Parsed query map (first value per key).\n *\n * Example:\n * - search: `?tab=posts&sort=desc`\n * - searchParams: `{ tab: 'posts', sort: 'desc' }`\n */\n searchParams: Record<string, string | undefined>\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 searchParams: LooseSearchOutput\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 searchParams: Record<string, string | undefined>\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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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 searchParams: LooseSearchOutput<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\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 searchParams: LooseSearchOutput<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 _PathDefinition<T extends string> = T extends string ? TrimSearchTailDefinition<T> : never\nexport type _ParamsDefinition<TDefinition extends string> =\n ExtractPathParams<PathDefinition<TDefinition>> extends infer U\n ? [U] extends [never]\n ? undefined\n : { [K in Extract<U, string>]: true }\n : undefined\nexport type _SearchDefinition<TDefinition extends string> =\n NonEmpty<SearchTailDefinitionWithoutFirstAndLastAmp<TDefinition>> extends infer Tail extends string\n ? AmpSplit<Tail> extends infer U\n ? [U] extends [never]\n ? undefined\n : { [K in Extract<U, string>]: true }\n : undefined\n : undefined\n\nexport type _ParamsInput<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends undefined\n ? Record<never, never>\n : {\n [K in keyof _ParamsDefinition<TDefinition>]: string | number\n }\nexport type _LooseSearchInput<TDefinition extends string> =\n _SearchDefinition<TDefinition> extends undefined\n ? Record<string, string | number>\n : Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string | number\n }> &\n Record<string, string | number>\nexport type _StrictSearchInput<TDefinition extends string> = Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string | number\n}>\nexport type _LooseFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInput<TDefinition> & _LooseSearchInput<TDefinition>\n : _LooseSearchInput<TDefinition>\nexport type _StrictFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition> & _ParamsInput<TDefinition>\n : _ParamsInput<TDefinition>\n : HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition>\n : Record<never, never>\n\nexport type _ParamsInputStringOnly<TDefinition extends string> =\n _ParamsDefinition<TDefinition> extends undefined\n ? Record<never, never>\n : {\n [K in keyof _ParamsDefinition<TDefinition>]: string\n }\nexport type _LooseSearchInputStringOnly<TDefinition extends string> =\n _SearchDefinition<TDefinition> extends undefined\n ? Record<string, string>\n : Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string\n }> &\n Record<string, string>\nexport type _StrictSearchInputStringOnly<TDefinition extends string> = Partial<{\n [K in keyof _SearchDefinition<TDefinition>]: string\n}>\nexport type _LooseFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInputStringOnly<TDefinition> & _LooseSearchInputStringOnly<TDefinition>\n : _LooseSearchInputStringOnly<TDefinition>\nexport type _StrictFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition> & _ParamsInputStringOnly<TDefinition>\n : _ParamsInputStringOnly<TDefinition>\n : HasNamedSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition>\n : Record<never, never>\n\nexport type TrimSearchTailDefinition<S extends string> = S extends `${infer P}&${string}` ? P : S\nexport type SearchTailDefinitionWithoutFirstAmp<S extends string> = S extends `${string}&${infer T}` ? T : ''\nexport type SearchTailDefinitionWithoutFirstAndLastAmp<S extends string> = S extends `${string}&${infer T}&`\n ? T\n : S extends `${string}&${infer T}`\n ? T\n : ''\nexport type SearchTailDefinitionWithFirstAmp<S extends string> = S extends `${string}&${infer T}` ? `&${T}` : ''\nexport type AmpSplit<S extends string> = S extends `${infer A}&${infer B}` ? A | AmpSplit<B> : S\nexport type NonEmpty<T> = [T] extends ['' | never] ? never : T\nexport type ExtractPathParams<S extends string> = S extends `${string}:${infer After}`\n ? After extends `${infer Name}/${infer Rest}`\n ? Name | ExtractPathParams<`/${Rest}`>\n : After\n : never\nexport type ReplacePathParams<S extends string> = S extends `${infer Head}:${infer Tail}`\n ? // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Tail extends `${infer _Param}/${infer Rest}`\n ? ReplacePathParams<`${Head}${string}/${Rest}`>\n : `${Head}${string}`\n : S\nexport type DedupeSlashes<S extends string> = S extends `${infer A}//${infer B}` ? DedupeSlashes<`${A}/${B}`> : S\nexport type EmptyRecord = Record<never, never>\nexport type JoinPath<Parent extends string, Suffix extends string> = DedupeSlashes<\n PathDefinition<Parent> extends infer A extends string\n ? PathDefinition<Suffix> extends infer B extends string\n ? A extends ''\n ? B extends ''\n ? ''\n : B extends `/${string}`\n ? B\n : `/${B}`\n : B extends ''\n ? A\n : A extends `${string}/`\n ? `${A}${B}`\n : B extends `/${string}`\n ? `${A}${B}`\n : `${A}/${B}`\n : never\n : never\n>\n\nexport type OnlyIfNoParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends false ? Yes : No\nexport type OnlyIfHasParams<TRoute extends AnyRoute | string, Yes, No = never> =\n HasParams<TRoute> extends true ? Yes : No\n\n// export type PathRouteValue<TDefinition extends string> = `${ReplacePathParams<PathDefinition<TDefinition>>}`\n// export type PathOnlyRouteValue<TDefinition extends string> = `${ReplacePathParams<PathDefinition<TDefinition>>}`\n// export type WithSearchRouteValue<TDefinition extends string> =\n// `${ReplacePathParams<PathDefinition<TDefinition>>}?${string}`\n// export type AbsolutePathRouteValue<TDefinition extends string> =\n// PathRouteValue<TDefinition> extends '/' ? string : `${string}${PathRouteValue<TDefinition>}`\n// export type AbsolutePathOnlyRouteValue<TDefinition extends string> =\n// PathOnlyRouteValue<TDefinition> extends '/' ? string : `${string}${PathOnlyRouteValue<TDefinition>}`\n// export type AbsoluteWithSearchRouteValue<TDefinition extends string> = `${string}${WithSearchRouteValue<TDefinition>}`\n\nexport type PathExtended<\n TSourcedefinitionDefinition extends string,\n TSuffixdefinitionDefinition extends string,\n> = `${JoinPath<TSourcedefinitionDefinition, TSuffixdefinitionDefinition>}${SearchTailDefinitionWithFirstAmp<TSuffixdefinitionDefinition>}`\n\nexport type WithParamsInput<\n TDefinition extends string,\n T extends\n | {\n search?: _LooseSearchInput<any>\n abs?: boolean | string\n hash?: string | number\n }\n | undefined = undefined,\n> = _ParamsInput<TDefinition> & (T extends undefined ? Record<never, never> : T)\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 }\nexport type SafeParseInputStrictResult<TDefinition extends string> = _SafeParseInputResult<\n StrictFlatOutput<TDefinition>\n>\nexport type SafeParseInputLooseResult<TDefinition extends string> = _SafeParseInputResult<LooseFlatOutput<TDefinition>>\nexport type Route0Schema<\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":["absOriginInput","paramsInput","searchInput","hashInput"]}
|
package/package.json
CHANGED
package/src/index.test.ts
CHANGED
|
@@ -1435,16 +1435,16 @@ describe('input schemas', () => {
|
|
|
1435
1435
|
expectTypeOf(route.flatInputSchema).toMatchTypeOf<StandardSchemaV1>()
|
|
1436
1436
|
|
|
1437
1437
|
expectTypeOf(route.paramsInputSchema).toMatchTypeOf<
|
|
1438
|
-
StandardSchemaV1<ParamsInput<'/:id&a&'
|
|
1438
|
+
StandardSchemaV1<ParamsInput<'/:id&a&'>, ParamsOutput<'/:id&a&'>>
|
|
1439
1439
|
>()
|
|
1440
1440
|
expectTypeOf(route.strictSearchInputSchema).toMatchTypeOf<
|
|
1441
|
-
StandardSchemaV1<StrictSearchInput<'/:id&a&'
|
|
1441
|
+
StandardSchemaV1<StrictSearchInput<'/:id&a&'>, StrictSearchOutput<'/:id&a&'>>
|
|
1442
1442
|
>()
|
|
1443
1443
|
expectTypeOf(route.looseSearchInputSchema).toMatchTypeOf<
|
|
1444
|
-
StandardSchemaV1<LooseSearchInput<'/:id&a&'
|
|
1444
|
+
StandardSchemaV1<LooseSearchInput<'/:id&a&'>, LooseSearchOutput<'/:id&a&'>>
|
|
1445
1445
|
>()
|
|
1446
1446
|
expectTypeOf(route.flatInputSchema).toMatchTypeOf<
|
|
1447
|
-
StandardSchemaV1<LooseFlatInput<'/:id&a&'
|
|
1447
|
+
StandardSchemaV1<LooseFlatInput<'/:id&a&'>, LooseFlatOutput<'/:id&a&'>>
|
|
1448
1448
|
>()
|
|
1449
1449
|
})
|
|
1450
1450
|
})
|
package/src/index.ts
CHANGED
|
@@ -981,31 +981,25 @@ export class Route0<TDefinition extends string> {
|
|
|
981
981
|
}
|
|
982
982
|
|
|
983
983
|
/** Standard Schema for route params input. */
|
|
984
|
-
readonly paramsInputSchema: Route0Schema<ParamsInput<TDefinition
|
|
984
|
+
readonly paramsInputSchema: Route0Schema<ParamsInput<TDefinition>, ParamsOutput<TDefinition>> = {
|
|
985
985
|
'~standard': {
|
|
986
986
|
version: 1,
|
|
987
987
|
vendor: 'route0',
|
|
988
988
|
validate: (value) => this._validateParamsInput(value),
|
|
989
|
-
types: undefined as unknown as StandardSchemaV1.Types<
|
|
990
|
-
ParamsInput<TDefinition> | undefined,
|
|
991
|
-
ParamsOutput<TDefinition>
|
|
992
|
-
>,
|
|
989
|
+
types: undefined as unknown as StandardSchemaV1.Types<ParamsInput<TDefinition>, ParamsOutput<TDefinition>>,
|
|
993
990
|
},
|
|
994
991
|
parse: (value) => this._parseSchemaResult(this._validateParamsInput(value)),
|
|
995
992
|
safeParse: (value) => this._safeParseSchemaResult(this._validateParamsInput(value)),
|
|
996
993
|
}
|
|
997
994
|
|
|
998
995
|
/** Standard Schema for strict search input. */
|
|
999
|
-
readonly strictSearchInputSchema: Route0Schema<
|
|
1000
|
-
StrictSearchInput<TDefinition> | undefined,
|
|
1001
|
-
StrictSearchOutput<TDefinition>
|
|
1002
|
-
> = {
|
|
996
|
+
readonly strictSearchInputSchema: Route0Schema<StrictSearchInput<TDefinition>, StrictSearchOutput<TDefinition>> = {
|
|
1003
997
|
'~standard': {
|
|
1004
998
|
version: 1,
|
|
1005
999
|
vendor: 'route0',
|
|
1006
1000
|
validate: (value) => this._validateSearchInput(value, false),
|
|
1007
1001
|
types: undefined as unknown as StandardSchemaV1.Types<
|
|
1008
|
-
StrictSearchInput<TDefinition
|
|
1002
|
+
StrictSearchInput<TDefinition>,
|
|
1009
1003
|
StrictSearchOutput<TDefinition>
|
|
1010
1004
|
>,
|
|
1011
1005
|
},
|
|
@@ -1014,16 +1008,13 @@ export class Route0<TDefinition extends string> {
|
|
|
1014
1008
|
}
|
|
1015
1009
|
|
|
1016
1010
|
/** Standard Schema for loose search input. */
|
|
1017
|
-
readonly looseSearchInputSchema: Route0Schema<
|
|
1018
|
-
LooseSearchInput<TDefinition> | undefined,
|
|
1019
|
-
LooseSearchOutput<TDefinition>
|
|
1020
|
-
> = {
|
|
1011
|
+
readonly looseSearchInputSchema: Route0Schema<LooseSearchInput<TDefinition>, LooseSearchOutput<TDefinition>> = {
|
|
1021
1012
|
'~standard': {
|
|
1022
1013
|
version: 1,
|
|
1023
1014
|
vendor: 'route0',
|
|
1024
1015
|
validate: (value) => this._validateSearchInput(value, true),
|
|
1025
1016
|
types: undefined as unknown as StandardSchemaV1.Types<
|
|
1026
|
-
LooseSearchInput<TDefinition
|
|
1017
|
+
LooseSearchInput<TDefinition>,
|
|
1027
1018
|
LooseSearchOutput<TDefinition>
|
|
1028
1019
|
>,
|
|
1029
1020
|
},
|
|
@@ -1033,7 +1024,7 @@ export class Route0<TDefinition extends string> {
|
|
|
1033
1024
|
|
|
1034
1025
|
/** Standard Schema for route flat input (uses route default strict/loose mode). */
|
|
1035
1026
|
readonly flatInputSchema: Route0Schema<
|
|
1036
|
-
FlatInput<TDefinition, HasLooseSearch<TDefinition
|
|
1027
|
+
FlatInput<TDefinition, HasLooseSearch<TDefinition>>,
|
|
1037
1028
|
FlatOutput<TDefinition, HasLooseSearch<TDefinition>>
|
|
1038
1029
|
> = {
|
|
1039
1030
|
'~standard': {
|
|
@@ -1041,7 +1032,7 @@ export class Route0<TDefinition extends string> {
|
|
|
1041
1032
|
vendor: 'route0',
|
|
1042
1033
|
validate: (value) => this._validateFlatInput(value, this.hasLooseSearch as HasLooseSearch<TDefinition>),
|
|
1043
1034
|
types: undefined as unknown as StandardSchemaV1.Types<
|
|
1044
|
-
FlatInput<TDefinition, HasLooseSearch<TDefinition
|
|
1035
|
+
FlatInput<TDefinition, HasLooseSearch<TDefinition>>,
|
|
1045
1036
|
FlatOutput<TDefinition, HasLooseSearch<TDefinition>>
|
|
1046
1037
|
>,
|
|
1047
1038
|
},
|
|
@@ -1901,7 +1892,7 @@ export type SafeParseInputStrictResult<TDefinition extends string> = _SafeParseI
|
|
|
1901
1892
|
>
|
|
1902
1893
|
export type SafeParseInputLooseResult<TDefinition extends string> = _SafeParseInputResult<LooseFlatOutput<TDefinition>>
|
|
1903
1894
|
export type Route0Schema<
|
|
1904
|
-
TInput extends Record<string, unknown
|
|
1895
|
+
TInput extends Record<string, unknown>,
|
|
1905
1896
|
TOutput extends Record<string, unknown>,
|
|
1906
1897
|
> = StandardSchemaV1<TInput, TOutput> & {
|
|
1907
1898
|
parse: (input: unknown) => TOutput
|