@devp0nt/route0 1.0.0-next.44 → 1.0.0-next.45
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 +18 -6
- package/dist/esm/index.d.ts +18 -6
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.test.ts +80 -0
- package/src/index.ts +35 -29
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["// 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, isChildren, isParent\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, {baseUrl, 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\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 baseUrl: string\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\n const { baseUrl } = config\n if (baseUrl && typeof baseUrl === 'string' && baseUrl.length) {\n this.baseUrl = baseUrl\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this.baseUrl = g.location.origin\n } else {\n this.baseUrl = 'https://example.com'\n }\n }\n }\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 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(baseUrl: string, pathWithSearch: string) {\n return new URL(pathWithSearch, baseUrl).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 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, { baseUrl: this.baseUrl })\n }\n\n // has params\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs?: false; hash?: string }>\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 }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs: true; hash?: string }>\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 }>\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 }>\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 }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n get(\n input: OnlyIfHasParams<\n _ParamsDefinition<TDefinition>,\n WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string }>\n >,\n ): OnlyIfHasParams<_ParamsDefinition<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 }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs?: false; hash?: string }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs: true; hash?: string }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs: true; hash?: string }\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 }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search?: _SearchInput<TDefinition>; abs: true; hash?: string }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): string\n get(\n input: OnlyIfNoParams<\n _ParamsDefinition<TDefinition>,\n { search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string }\n >,\n ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>\n\n // implementation\n get(...args: any[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\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 { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\n }\n const { search, abs, hash, ...params } = input\n return { searchInput: search || {}, paramsInput: params, absInput: abs ?? false, hashInput: hash }\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(this.baseUrl, 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 }>>,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>\n // >,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string }>>,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>\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 }>\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 }>\n // >,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n flat(\n input: OnlyIfHasParams<\n _ParamsDefinition<TDefinition>,\n WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>\n >,\n abs?: boolean,\n ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, string>\n\n // no params\n // flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,\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 }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): string\n flat(\n input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,\n abs?: boolean,\n ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>\n\n // implementation\n flat(...args: any[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\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 { searchInput: {}, paramsInput: {}, absInput: args[1] ?? false, hashInput: undefined }\n }\n const paramsKeys = this.getParamsKeys()\n const paramsInput = paramsKeys.reduce<Record<string, string | number>>((acc, key) => {\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 true\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 { searchInput, paramsInput, absInput: args[1] ?? false, hashInput }\n })()\n\n return this.get({ ...paramsInput, search: searchInput, abs: absInput, hash: hashInput } as never)\n }\n\n getParamsKeys(): string[] {\n return Object.keys(this.paramsDefinition || {})\n }\n getSearchKeys(): string[] {\n return Object.keys(this.searchDefinition || {})\n }\n getFlatKeys(): string[] {\n return [...this.getSearchKeys(), ...this.getParamsKeys()]\n }\n\n getDefinition(): string {\n return this.pathDefinition\n }\n\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 static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = this.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = this.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\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 static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, baseUrl: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, baseUrl)\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 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 exact: false,\n parent: false,\n children: false,\n }\n\n return location\n }\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-conversion\n paramNames.push(String(name))\n return ''\n })\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const parentRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n\n // Fill params only for exact match (keeps behavior predictable)\n if (exactMatch) {\n const values = exactMatch.slice(1)\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 const exact = !!exactMatch\n const parent = !exact && parentRe.test(pathname)\n\n // \"children\": 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 children = !exact && isPrefix\n\n return {\n ...location,\n exact,\n parent,\n children,\n } as KnownLocation<TDefinition>\n }\n\n isSame(other: Route0<TDefinition>): 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 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 isChildren(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a child 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 parent of any non-root; thus any non-root is a child 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 child 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 isParent(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a parent 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 parent 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 // A parent 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 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 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\nexport class Routes<const T extends RoutesRecord = RoutesRecord> {\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 override: Routes<T>['_override']\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 override: this._override.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n static create<const T extends RoutesRecord>(routes: T): RoutesPretty<T> {\n const instance = new Routes({ routes })\n return Routes.prettify(instance)\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 override: instance._override.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.prototype.hasOwnProperty.call(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 _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): { pathsOrdering: string[]; keysOrdering: string[] } {\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, route]) => _key)\n return { pathsOrdering, keysOrdering }\n }\n\n _override(config: RouteConfigInput): RoutesPretty<T> {\n const newRoutes = {} as RoutesRecordHydrated<T>\n for (const key in this._routes) {\n if (Object.prototype.hasOwnProperty.call(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\nexport type AnyRoute<T extends Route0<string> | string = string> = T extends string ? Route0<T> : T\nexport type CallableRoute<T extends Route0<string> | string = string> = AnyRoute<T> & AnyRoute<T>['get']\nexport type AnyRouteOrDefinition<T extends string = string> = AnyRoute<T> | CallableRoute<T> | T\nexport type RouteConfigInput = {\n baseUrl?: string\n}\n\n// collection\n\nexport type RoutesRecord = Record<string, AnyRoute | string>\nexport type RoutesRecordHydrated<TRoutesRecord extends RoutesRecord = RoutesRecord> = {\n [K in keyof TRoutesRecord]: CallableRoute<TRoutesRecord[K]>\n}\nexport type RoutesPretty<TRoutesRecord extends RoutesRecord = RoutesRecord> = RoutesRecordHydrated<TRoutesRecord> &\n Omit<\n Routes<TRoutesRecord>,\n '_routes' | '_getLocation' | '_override' | '_pathsOrdering' | '_keysOrdering' | '_ordered'\n >\nexport type ExtractRoutesKeys<TRoutes extends RoutesPretty<any> | RoutesRecord> =\n TRoutes extends RoutesPretty<any>\n ? keyof TRoutes['_']['routes']\n : TRoutes extends RoutesRecord\n ? keyof TRoutes\n : never\nexport type ExtractRoute<TRoutes extends RoutesPretty<any> | RoutesRecord, TKey extends ExtractRoutesKeys<TRoutes>> =\n TRoutes extends RoutesPretty<any>\n ? TRoutes['_']['routes'][TKey]\n : TRoutes extends RoutesRecord\n ? TRoutes[TKey]\n : 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 IsParent<T extends AnyRoute | string, TParent extends AnyRoute | string> = _IsParent<\n PathDefinition<T>,\n PathDefinition<TParent>\n>\nexport type IsChildren<T extends AnyRoute | string, TChildren extends AnyRoute | string> = _IsChildren<\n PathDefinition<T>,\n PathDefinition<TChildren>\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> =\n NonEmpty<SearchTailDefinitionWithoutFirstAmp<Definition<T>>> extends infer Tail extends string\n ? AmpSplit<Tail> extends infer U\n ? [U] extends [never]\n ? false\n : true\n : false\n : false\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: string\n}\nexport type SearchOutput<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 FlatOutput<T extends AnyRoute | string = string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & SearchOutput<T> : SearchOutput<T>\nexport type StrictFlatOutput<T extends AnyRoute | string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>\nexport type SearchInput<T extends AnyRoute | string = string> = _SearchInput<Definition<T>>\nexport type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>\nexport type FlatInput<T extends AnyRoute | string> = _FlatInput<Definition<T>>\nexport type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>\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 SearchInputStringOnly<T extends AnyRoute | string = string> = _SearchInputStringOnly<Definition<T>>\nexport type StrictSearchInputStringOnly<T extends AnyRoute | string> = _StrictSearchInputStringOnly<Definition<T>>\nexport type FlatInputStringOnly<T extends AnyRoute | string> = _FlatInputStringOnly<Definition<T>>\nexport type StrictFlatInputStringOnly<T extends AnyRoute | string> = _StrictFlatInputStringOnly<Definition<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\nexport type _GeneralLocation = {\n pathname: string\n search: string\n hash: string\n origin?: string\n href?: string\n hrefRel: string\n abs: boolean\n port?: string\n host?: string\n hostname?: string\n}\nexport type UnknownLocation = _GeneralLocation & {\n params: undefined\n searchParams: SearchOutput\n route: undefined\n exact: false\n parent: false\n children: false\n}\nexport type UnmatchedLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: Record<never, never>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: false\n children: false\n}\nexport type ExactLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: ParamsOutput<TRoute>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: true\n parent: false\n children: false\n}\nexport type ParentLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: Partial<ParamsOutput<TRoute>> // in fact maybe there will be whole params object, but does not matter now\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: true\n children: false\n}\nexport type ChildrenLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: ParamsOutput<TRoute>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: false\n children: true\n}\nexport type KnownLocation<TRoute extends AnyRoute | string = AnyRoute | string> =\n | UnmatchedLocation<TRoute>\n | ExactLocation<TRoute>\n | ParentLocation<TRoute>\n | ChildrenLocation<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<SearchTailDefinitionWithoutFirstAmp<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 _SearchInput<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 _FlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInput<TDefinition> & _SearchInput<TDefinition>\n : _SearchInput<TDefinition>\nexport type _StrictFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition> & _ParamsInput<TDefinition>\n : _ParamsInput<TDefinition>\n : HasSearch<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 _SearchInputStringOnly<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 _FlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInputStringOnly<TDefinition> & _SearchInputStringOnly<TDefinition>\n : _SearchInputStringOnly<TDefinition>\nexport type _StrictFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition> & _ParamsInputStringOnly<TDefinition>\n : _ParamsInputStringOnly<TDefinition>\n : HasSearch<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 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\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\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<TParams extends object | undefined, Yes, No = never> = TParams extends undefined ? Yes : No\nexport type OnlyIfHasParams<TParams extends object | undefined, Yes, No = never> = TParams extends undefined ? No : Yes\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?: _SearchInput<any>\n abs?: boolean\n hash?: string\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 _IsParent<T extends string, TParent extends string> = T extends TParent\n ? false\n : T extends `${TParent}${string}`\n ? true\n : false\nexport type _IsChildren<T extends string, TChildren extends string> = TChildren extends T\n ? false\n : TChildren 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"],"mappings":"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","names":["paramsInput","searchInput","hashInput"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["// 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, isChildren, isParent\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, {baseUrl, 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\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 baseUrl: string\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\n const { baseUrl } = config\n if (baseUrl && typeof baseUrl === 'string' && baseUrl.length) {\n this.baseUrl = baseUrl\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this.baseUrl = g.location.origin\n } else {\n this.baseUrl = 'https://example.com'\n }\n }\n }\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 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(baseUrl: string, pathWithSearch: string) {\n return new URL(pathWithSearch, baseUrl).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 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, { baseUrl: this.baseUrl })\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 get(\n input: OnlyIfHasParams<\n _ParamsDefinition<TDefinition>,\n WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string | number }>\n >,\n ): OnlyIfHasParams<_ParamsDefinition<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<_ParamsDefinition<TDefinition>, [], [never]>): string\n get(\n input: OnlyIfNoParams<\n _ParamsDefinition<TDefinition>,\n { search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string | number }\n >,\n ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>\n\n // implementation\n get(...args: any[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\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 { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\n }\n const { search, abs, hash, ...params } = input\n return { searchInput: search || {}, paramsInput: params, absInput: abs ?? false, hashInput: hash }\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(this.baseUrl, 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 flat(\n input: OnlyIfHasParams<\n _ParamsDefinition<TDefinition>,\n WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n >,\n abs?: boolean,\n ): OnlyIfHasParams<_ParamsDefinition<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<_ParamsDefinition<TDefinition>, [], [never]>): string\n flat(\n input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n abs?: boolean,\n ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>\n\n // implementation\n flat(...args: any[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\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 { searchInput: {}, paramsInput: {}, absInput: args[1] ?? false, hashInput: undefined }\n }\n const paramsKeys = this.getParamsKeys()\n const paramsInput = paramsKeys.reduce<Record<string, string | number>>((acc, key) => {\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 true\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 { searchInput, paramsInput, absInput: args[1] ?? false, hashInput }\n })()\n\n return this.get({ ...paramsInput, search: searchInput, abs: absInput, hash: hashInput } as never)\n }\n\n getParamsKeys(): string[] {\n return Object.keys(this.paramsDefinition || {})\n }\n getSearchKeys(): string[] {\n return Object.keys(this.searchDefinition || {})\n }\n getFlatKeys(): string[] {\n return [...this.getSearchKeys(), ...this.getParamsKeys()]\n }\n\n getDefinition(): string {\n return this.pathDefinition\n }\n\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 static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = this.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = this.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\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 static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, baseUrl: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, baseUrl)\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 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 exact: false,\n parent: false,\n children: false,\n }\n\n return location\n }\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-conversion\n paramNames.push(String(name))\n return ''\n })\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const parentRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n\n // Fill params only for exact match (keeps behavior predictable)\n if (exactMatch) {\n const values = exactMatch.slice(1)\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 const exact = !!exactMatch\n const parent = !exact && parentRe.test(pathname)\n\n // \"children\": 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 children = !exact && isPrefix\n\n return {\n ...location,\n exact,\n parent,\n children,\n } as KnownLocation<TDefinition>\n }\n\n isSame(other: Route0<TDefinition>): 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 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 isChildren(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a child 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 parent of any non-root; thus any non-root is a child 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 child 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 isParent(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a parent 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 parent 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 // A parent 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 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 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\nexport class Routes<const T extends RoutesRecord = RoutesRecord> {\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 override: Routes<T>['_override']\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 override: this._override.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n static create<const T extends RoutesRecord>(routes: T): RoutesPretty<T> {\n const instance = new Routes({ routes })\n return Routes.prettify(instance)\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 override: instance._override.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.prototype.hasOwnProperty.call(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 _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): { pathsOrdering: string[]; keysOrdering: string[] } {\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, route]) => _key)\n return { pathsOrdering, keysOrdering }\n }\n\n _override(config: RouteConfigInput): RoutesPretty<T> {\n const newRoutes = {} as RoutesRecordHydrated<T>\n for (const key in this._routes) {\n if (Object.prototype.hasOwnProperty.call(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\nexport type AnyRoute<T extends Route0<string> | string = string> = T extends string ? Route0<T> : T\nexport type CallableRoute<T extends Route0<string> | string = string> = AnyRoute<T> & AnyRoute<T>['get']\nexport type AnyRouteOrDefinition<T extends string = string> = AnyRoute<T> | CallableRoute<T> | T\nexport type RouteConfigInput = {\n baseUrl?: string\n}\n\n// collection\n\nexport type RoutesRecord = Record<string, AnyRoute | string>\nexport type RoutesRecordHydrated<TRoutesRecord extends RoutesRecord = RoutesRecord> = {\n [K in keyof TRoutesRecord]: CallableRoute<TRoutesRecord[K]>\n}\nexport type RoutesPretty<TRoutesRecord extends RoutesRecord = RoutesRecord> = RoutesRecordHydrated<TRoutesRecord> &\n Omit<\n Routes<TRoutesRecord>,\n '_routes' | '_getLocation' | '_override' | '_pathsOrdering' | '_keysOrdering' | '_ordered'\n >\nexport type ExtractRoutesKeys<TRoutes extends RoutesPretty<any> | RoutesRecord> =\n TRoutes extends RoutesPretty<any>\n ? keyof TRoutes['_']['routes']\n : TRoutes extends RoutesRecord\n ? keyof TRoutes\n : never\nexport type ExtractRoute<TRoutes extends RoutesPretty<any> | RoutesRecord, TKey extends ExtractRoutesKeys<TRoutes>> =\n TRoutes extends RoutesPretty<any>\n ? TRoutes['_']['routes'][TKey]\n : TRoutes extends RoutesRecord\n ? TRoutes[TKey]\n : 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 IsParent<T extends AnyRoute | string, TParent extends AnyRoute | string> = _IsParent<\n PathDefinition<T>,\n PathDefinition<TParent>\n>\nexport type IsChildren<T extends AnyRoute | string, TChildren extends AnyRoute | string> = _IsChildren<\n PathDefinition<T>,\n PathDefinition<TChildren>\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> =\n NonEmpty<SearchTailDefinitionWithoutFirstAmp<Definition<T>>> extends infer Tail extends string\n ? AmpSplit<Tail> extends infer U\n ? [U] extends [never]\n ? false\n : true\n : false\n : false\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: string\n}\nexport type SearchOutput<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 FlatOutput<T extends AnyRoute | string = string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & SearchOutput<T> : SearchOutput<T>\nexport type StrictFlatOutput<T extends AnyRoute | string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>\nexport type FlatOutputWithHash<T extends AnyRoute | string = string> = FlatOutput<T> & { hash?: string | undefined }\nexport type StrictFlatOutputWithHash<T extends AnyRoute | string> = StrictFlatOutput<T> & { hash?: string | undefined }\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>\nexport type SearchInput<T extends AnyRoute | string = string> = _SearchInput<Definition<T>>\nexport type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>\nexport type FlatInput<T extends AnyRoute | string> = _FlatInput<Definition<T>>\nexport type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>\nexport type FlatInputWithHash<T extends AnyRoute | string> = _FlatInput<Definition<T>> & { hash?: string | number }\nexport type StrictFlatInputWithHash<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>> & {\n hash?: string | number\n}\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 SearchInputStringOnly<T extends AnyRoute | string = string> = _SearchInputStringOnly<Definition<T>>\nexport type StrictSearchInputStringOnly<T extends AnyRoute | string> = _StrictSearchInputStringOnly<Definition<T>>\nexport type FlatInputStringOnly<T extends AnyRoute | string> = _FlatInputStringOnly<Definition<T>>\nexport type StrictFlatInputStringOnly<T extends AnyRoute | string> = _StrictFlatInputStringOnly<Definition<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\nexport type _GeneralLocation = {\n pathname: string\n search: string\n hash: string\n origin?: string\n href?: string\n hrefRel: string\n abs: boolean\n port?: string\n host?: string\n hostname?: string\n}\nexport type UnknownLocation = _GeneralLocation & {\n params: undefined\n searchParams: SearchOutput\n route: undefined\n exact: false\n parent: false\n children: false\n}\nexport type UnmatchedLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: Record<never, never>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: false\n children: false\n}\nexport type ExactLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: ParamsOutput<TRoute>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: true\n parent: false\n children: false\n}\nexport type ParentLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: Partial<ParamsOutput<TRoute>> // in fact maybe there will be whole params object, but does not matter now\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: true\n children: false\n}\nexport type ChildrenLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: ParamsOutput<TRoute>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: false\n children: true\n}\nexport type KnownLocation<TRoute extends AnyRoute | string = AnyRoute | string> =\n | UnmatchedLocation<TRoute>\n | ExactLocation<TRoute>\n | ParentLocation<TRoute>\n | ChildrenLocation<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<SearchTailDefinitionWithoutFirstAmp<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 _SearchInput<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 _FlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInput<TDefinition> & _SearchInput<TDefinition>\n : _SearchInput<TDefinition>\nexport type _StrictFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition> & _ParamsInput<TDefinition>\n : _ParamsInput<TDefinition>\n : HasSearch<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 _SearchInputStringOnly<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 _FlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInputStringOnly<TDefinition> & _SearchInputStringOnly<TDefinition>\n : _SearchInputStringOnly<TDefinition>\nexport type _StrictFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition> & _ParamsInputStringOnly<TDefinition>\n : _ParamsInputStringOnly<TDefinition>\n : HasSearch<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 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\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\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<TParams extends object | undefined, Yes, No = never> = TParams extends undefined ? Yes : No\nexport type OnlyIfHasParams<TParams extends object | undefined, Yes, No = never> = TParams extends undefined ? No : Yes\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?: _SearchInput<any>\n abs?: boolean\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 _IsParent<T extends string, TParent extends string> = T extends TParent\n ? false\n : T extends `${TParent}${string}`\n ? true\n : false\nexport type _IsChildren<T extends string, TChildren extends string> = TChildren extends T\n ? false\n : TChildren 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"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BO,MAAM,OAAmC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EAEQ,YAAY,YAAyB,SAA2B,CAAC,GAAG;AAC1E,SAAK,aAAa;AAClB,SAAK,iBAAiB,OAAO,+BAA+B,UAAU;AACtE,SAAK,mBAAmB,OAAO,iCAAiC,UAAU;AAC1E,SAAK,mBAAmB,OAAO,iCAAiC,UAAU;AAE1E,UAAM,EAAE,QAAQ,IAAI;AACpB,QAAI,WAAW,OAAO,YAAY,YAAY,QAAQ,QAAQ;AAC5D,WAAK,UAAU;AAAA,IACjB,OAAO;AACL,YAAM,IAAI;AAEV,UAAI,OAAO,GAAG,UAAU,WAAW,YAAY,EAAE,SAAS,OAAO,SAAS,GAAG;AAC3E,aAAK,UAAU,EAAE,SAAS;AAAA,MAC5B,OAAO;AACL,aAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OACL,YACA,QAC4B;AAC5B,QAAI,OAAO,eAAe,YAAY;AACpC,aAAO,WAAW,MAAM,MAAM;AAAA,IAChC;AACA,QAAI,OAAO,eAAe,UAAU;AAClC,aAAO,WAAW,MAAM,MAAM;AAAA,IAChC;AACA,UAAM,WAAW,IAAI,OAAoB,YAAY,MAAM;AAC3D,UAAM,WAAW,SAAS,IAAI,KAAK,QAAQ;AAC3C,WAAO,eAAe,UAAU,QAAQ;AACxC,WAAO,eAAe,UAAU,OAAO,aAAa;AAAA,MAClD,OAAO,SAAS;AAAA,IAClB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,KACL,YAC4B;AAC5B,QAAI,OAAO,eAAe,YAAY;AACpC,aAAO;AAAA,IACT;AACA,UAAM,WAAW,OAAO,eAAe,WAAW,aAAa,IAAI,OAAoB,UAAU;AACjG,UAAM,WAAW,SAAS,IAAI,KAAK,QAAQ;AAC3C,WAAO,eAAe,UAAU,QAAQ;AACxC,WAAO,eAAe,UAAU,OAAO,aAAa;AAAA,MAClD,OAAO,SAAS;AAAA,IAClB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,4CAA4C,YAAoB;AAC7E,UAAM,IAAI,WAAW,QAAQ,GAAG;AAChC,QAAI,MAAM,GAAI,QAAO,EAAE,gBAAgB,YAAY,sBAAsB,GAAG;AAC5E,WAAO;AAAA,MACL,gBAAgB,WAAW,MAAM,GAAG,CAAC;AAAA,MACrC,sBAAsB,WAAW,MAAM,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,OAAe,YAAY,SAAiB,gBAAwB;AAClE,WAAO,IAAI,IAAI,gBAAgB,OAAO,EAAE,SAAS,EAAE,QAAQ,OAAO,EAAE;AAAA,EACtE;AAAA,EAEA,OAAe,+BAA2D,YAAyB;AACjG,UAAM,EAAE,eAAe,IAAI,OAAO,4CAA4C,UAAU;AACxF,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,iCACb,YACgC;AAChC,UAAM,EAAE,eAAe,IAAI,OAAO,4CAA4C,UAAU;AACxF,UAAM,UAAU,MAAM,KAAK,eAAe,SAAS,mBAAmB,CAAC;AACvE,UAAM,mBAAmB,OAAO,YAAY,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC5E,UAAM,YAAY,OAAO,KAAK,gBAAgB,EAAE;AAChD,QAAI,cAAc,GAAG;AACnB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,iCACb,YACgC;AAChC,UAAM,EAAE,qBAAqB,IAAI,OAAO,4CAA4C,UAAU;AAC9F,QAAI,CAAC,sBAAsB;AACzB,aAAO;AAAA,IACT;AACA,UAAM,OAAO,qBAAqB,MAAM,GAAG,EAAE,OAAO,OAAO;AAC3D,UAAM,mBAAmB,OAAO,YAAY,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;AACtE,UAAM,YAAY,OAAO,KAAK,gBAAgB,EAAE;AAChD,QAAI,cAAc,GAAG;AACnB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OACE,kBAC6D;AAC7D,UAAM,EAAE,gBAAgB,qBAAqB,IAAI,OAAO,4CAA4C,KAAK,UAAU;AACnH,UAAM,EAAE,gBAAgB,sBAAsB,sBAAsB,2BAA2B,IAC7F,OAAO,4CAA4C,gBAAgB;AACrE,UAAM,iBAAiB,GAAG,oBAAoB,IAAI,oBAAoB,GAAG,QAAQ,WAAW,GAAG;AAC/F,UAAM,aAAa,GAAG,cAAc,GAAG,0BAA0B;AACjE,WAAO,OAAO,OAAqD,YAAY,EAAE,SAAS,KAAK,QAAQ,CAAC;AAAA,EAC1G;AAAA;AAAA,EA4FA,OAAO,MAAqB;AAC1B,UAAM,EAAE,aAAa,aAAa,UAAU,UAAU,KAAK,MAKtD;AACH,UAAI,KAAK,WAAW,GAAG;AACrB,eAAO,EAAE,aAAa,CAAC,GAAG,aAAa,CAAC,GAAG,UAAU,OAAO,WAAW,OAAU;AAAA,MACnF;AACA,YAAM,QAAQ,KAAK,CAAC;AACpB,UAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAE/C,eAAO,EAAE,aAAa,CAAC,GAAG,aAAa,CAAC,GAAG,UAAU,OAAO,WAAW,OAAU;AAAA,MACnF;AACA,YAAM,EAAE,QAAQ,KAAK,MAAM,GAAG,OAAO,IAAI;AACzC,aAAO,EAAE,aAAa,UAAU,CAAC,GAAG,aAAa,QAAQ,UAAU,OAAO,OAAO,WAAW,KAAK;AAAA,IACnG,GAAG;AAGH,UAAM,mBAAmB,KAAK,mBAAmB,OAAO,KAAK,KAAK,gBAAgB,IAAI,CAAC;AACvF,UAAM,qBAAqB,OAAO,KAAK,WAAW;AAClD,UAAM,kBAAkB,iBAAiB,OAAO,CAAC,MAAM,CAAC,mBAAmB,SAAS,CAAC,CAAC;AACtF,QAAI,gBAAgB,QAAQ;AAE1B,aAAO,OAAO,aAAa,OAAO,YAAY,gBAAgB,IAAI,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;AAAA,IAC7F;AAIA,QAAI,MAAM,KAAK;AAGf,UAAM,IAAI,QAAQ,qBAAqB,CAAC,IAAI,MAAM,mBAAmB,OAAO,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;AAEpG,UAAM,yBAAyB,OAAO,YAAY,OAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC7G,UAAM,CAAC,KAAK,IAAI,gBAAgB,sBAAsB,EAAE,SAAS,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE5F,UAAM,IAAI,QAAQ,WAAW,GAAG;AAEhC,UAAM,WAAW,OAAO,YAAY,KAAK,SAAS,GAAG,IAAI;AAEzD,QAAI,cAAc,QAAW;AAC3B,YAAM,GAAG,GAAG,IAAI,SAAS;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAqFA,QAAQ,MAAqB;AAC3B,UAAM,EAAE,aAAa,aAAa,UAAU,UAAU,KAAK,MAKtD;AACH,UAAI,KAAK,WAAW,GAAG;AACrB,eAAO,EAAE,aAAa,CAAC,GAAG,aAAa,CAAC,GAAG,UAAU,OAAO,WAAW,OAAU;AAAA,MACnF;AACA,YAAM,QAAQ,KAAK,CAAC;AACpB,UAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAE/C,eAAO,EAAE,aAAa,CAAC,GAAG,aAAa,CAAC,GAAG,UAAU,KAAK,CAAC,KAAK,OAAO,WAAW,OAAU;AAAA,MAC9F;AACA,YAAM,aAAa,KAAK,cAAc;AACtC,YAAMA,eAAc,WAAW,OAAwC,CAAC,KAAK,QAAQ;AACnF,YAAI,MAAM,GAAG,MAAM,QAAW;AAC5B,cAAI,GAAG,IAAI,MAAM,GAAG;AAAA,QACtB;AACA,eAAO;AAAA,MACT,GAAG,CAAC,CAAC;AACL,YAAM,aAAa,KAAK,cAAc;AACtC,YAAMC,eAAc,OAAO,KAAK,KAAK,EAClC,OAAO,CAAC,MAAM;AACb,YAAI,MAAM,QAAQ;AAChB,iBAAO;AAAA,QACT;AACA,YAAI,WAAW,SAAS,CAAC,GAAG;AAC1B,iBAAO;AAAA,QACT;AACA,YAAI,WAAW,SAAS,CAAC,GAAG;AAC1B,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC,EACA,OAAwC,CAAC,KAAK,QAAQ;AACrD,YAAI,GAAG,IAAI,MAAM,GAAG;AACpB,eAAO;AAAA,MACT,GAAG,CAAC,CAAC;AACP,YAAMC,aAAY,MAAM;AACxB,aAAO,EAAE,aAAAD,cAAa,aAAAD,cAAa,UAAU,KAAK,CAAC,KAAK,OAAO,WAAAE,WAAU;AAAA,IAC3E,GAAG;AAEH,WAAO,KAAK,IAAI,EAAE,GAAG,aAAa,QAAQ,aAAa,KAAK,UAAU,MAAM,UAAU,CAAU;AAAA,EAClG;AAAA,EAEA,gBAA0B;AACxB,WAAO,OAAO,KAAK,KAAK,oBAAoB,CAAC,CAAC;AAAA,EAChD;AAAA,EACA,gBAA0B;AACxB,WAAO,OAAO,KAAK,KAAK,oBAAoB,CAAC,CAAC;AAAA,EAChD;AAAA,EACA,cAAwB;AACtB,WAAO,CAAC,GAAG,KAAK,cAAc,GAAG,GAAG,KAAK,cAAc,CAAC;AAAA,EAC1D;AAAA,EAEA,gBAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAuD;AAC3D,WAAO,OAAO,OAAO,KAAK,YAAY,MAAM;AAAA,EAC9C;AAAA,EAEA,2BAAmC;AACjC,WAAO,KAAK,eACT,QAAQ,WAAW,aAAa,EAChC,QAAQ,uBAAuB,MAAM,EACrC,QAAQ,gBAAgB,SAAS;AAAA,EACtC;AAAA,EAEA,qBAA6B;AAC3B,WAAO,KAAK,yBAAyB,EAAE,QAAQ,QAAQ,EAAE,IAAI;AAAA,EAC/D;AAAA,EAEA,uBAA+B;AAC7B,WAAO,IAAI,KAAK,yBAAyB,CAAC;AAAA,EAC5C;AAAA,EAEA,iBAAyB;AACvB,WAAO,IAAI,KAAK,mBAAmB,CAAC;AAAA,EACtC;AAAA,EAEA,iBAAyB;AACvB,WAAO,IAAI,OAAO,KAAK,qBAAqB,CAAC;AAAA,EAC/C;AAAA,EAEA,WAAmB;AACjB,WAAO,IAAI,OAAO,KAAK,eAAe,CAAC;AAAA,EACzC;AAAA,EAEA,OAAO,0BAA0B,QAA4B;AAC3D,UAAM,WAAW,OAAO,IAAI,CAAC,UAAU,MAAM,qBAAqB,CAAC,EAAE,KAAK,GAAG;AAC7E,WAAO,IAAI,QAAQ;AAAA,EACrB;AAAA,EAEA,OAAO,oBAAoB,QAA4B;AACrD,UAAM,WAAW,KAAK,0BAA0B,MAAM;AACtD,WAAO,IAAI,OAAO,KAAK,QAAQ,IAAI;AAAA,EACrC;AAAA,EAEA,OAAO,oBAAoB,QAA4B;AACrD,UAAM,WAAW,OAAO,IAAI,CAAC,UAAU,MAAM,eAAe,CAAC,EAAE,KAAK,GAAG;AACvE,WAAO,IAAI,QAAQ;AAAA,EACrB;AAAA,EAEA,OAAO,cAAc,QAA4B;AAC/C,UAAM,WAAW,KAAK,oBAAoB,MAAM;AAChD,WAAO,IAAI,OAAO,KAAK,QAAQ,IAAI;AAAA,EACrC;AAAA,EAEA,OAAO,cAA6C,UAAgC;AAClF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,OAAO,cAA6C,UAAqB,SAA4B;AACnG,UAAM,SAAS,OAAO,cAAc,QAAQ;AAC5C,UAAM,MAAM,IAAI,IAAI,OAAO,SAAS,OAAO;AAC3C,WAAO;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,QAAQ,IAAI;AAAA,MACZ,MAAM,IAAI;AAAA,MACV,MAAM,IAAI;AAAA,MACV,MAAM,IAAI;AAAA,MACV,UAAU,IAAI;AAAA,IAChB;AAAA,EACF;AAAA,EAQA,OAAO,YAAY,yBAAsE;AACvF,QAAI,mCAAmC,KAAK;AAC1C,aAAO,OAAO,YAAY,wBAAwB,IAAI;AAAA,IACxD;AACA,QAAI,OAAO,4BAA4B,UAAU;AAC/C,gCAA0B,wBAAwB,QAAQ,wBAAwB;AAAA,IACpF;AAEA,UAAM,MAAM,gCAAgC,KAAK,uBAAuB;AAGxE,UAAM,OAAO,MAAM,SAAY;AAC/B,UAAM,MAAM,IAAI,IAAI,yBAAyB,IAAI;AAGjD,UAAM,eAAe,OAAO,YAAY,IAAI,aAAa,QAAQ,CAAC;AAGlE,QAAI,WAAW,IAAI;AACnB,QAAI,SAAS,SAAS,KAAK,SAAS,SAAS,GAAG,GAAG;AACjD,iBAAW,SAAS,MAAM,GAAG,EAAE;AAAA,IACjC;AAGA,UAAM,UAAU,WAAW,IAAI,SAAS,IAAI;AAG5C,UAAM,WAA4B;AAAA,MAChC;AAAA,MACA,QAAQ,IAAI;AAAA,MACZ,MAAM,IAAI;AAAA,MACV,QAAQ,MAAM,IAAI,SAAS;AAAA,MAC3B,MAAM,MAAM,IAAI,OAAO;AAAA,MACvB;AAAA,MACA;AAAA;AAAA,MAGA,MAAM,MAAM,IAAI,OAAO;AAAA,MACvB,UAAU,MAAM,IAAI,WAAW;AAAA,MAC/B,MAAM,MAAM,IAAI,QAAQ,SAAY;AAAA;AAAA,MAGpC;AAAA,MACA,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAEA,WAAO;AAAA,EACT;AAAA,EAQA,YAAY,yBAAiF;AAC3F,QAAI,mCAAmC,KAAK;AAC1C,aAAO,KAAK,YAAY,wBAAwB,IAAI;AAAA,IACtD;AACA,QAAI,OAAO,4BAA4B,UAAU;AAC/C,gCAA0B,wBAAwB,QAAQ,wBAAwB;AAAA,IACpF;AACA,UAAM,WAAW,OAAO,YAAY,uBAAuB;AAC3D,aAAS,QAAQ,KAAK;AACtB,aAAS,SAAS,CAAC;AAGnB,UAAM,WACJ,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS,SAAS,GAAG,IAC1D,SAAS,SAAS,MAAM,GAAG,EAAE,IAC7B,SAAS;AAGf,UAAM,aAAuB,CAAC;AAC9B,UAAM,MACJ,KAAK,eAAe,SAAS,KAAK,KAAK,eAAe,SAAS,GAAG,IAC9D,KAAK,eAAe,MAAM,GAAG,EAAE,IAC/B,KAAK;AACX,QAAI,QAAQ,qBAAqB,CAAC,IAAY,SAAiB;AAE7D,iBAAW,KAAK,OAAO,IAAI,CAAC;AAC5B,aAAO;AAAA,IACT,CAAC;AAED,UAAM,UAAU,IAAI,OAAO,IAAI,KAAK,mBAAmB,CAAC,GAAG;AAC3D,UAAM,WAAW,IAAI,OAAO,IAAI,KAAK,mBAAmB,CAAC,WAAW;AACpE,UAAM,aAAa,SAAS,MAAM,OAAO;AAGzC,QAAI,YAAY;AACd,YAAM,SAAS,WAAW,MAAM,CAAC;AACjC,YAAM,SAAS,OAAO,YAAY,WAAW,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,mBAAmB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACpG,eAAS,SAAS;AAAA,IACpB,OAAO;AACL,eAAS,SAAS,CAAC;AAAA,IACrB;AAEA,UAAM,QAAQ,CAAC,CAAC;AAChB,UAAM,SAAS,CAAC,SAAS,SAAS,KAAK,QAAQ;AAG/C,UAAM,WAAW,CAAC,SAAkB,SAAS,MAAM,CAAC,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AACzF,UAAM,WAAW,SAAS,GAAG;AAC7B,UAAM,YAAY,SAAS,QAAQ;AAEnC,QAAI,WAAW;AACf,QAAI,UAAU,SAAS,SAAS,QAAQ;AACtC,iBAAW;AAAA,IACb,OAAO;AACL,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,cAAM,UAAU,SAAS,CAAC;AAC1B,cAAM,WAAW,UAAU,CAAC;AAC5B,YAAI,CAAC,SAAS;AACZ,qBAAW;AACX;AAAA,QACF;AACA,YAAI,QAAQ,WAAW,GAAG,EAAG;AAC7B,YAAI,YAAY,UAAU;AACxB,qBAAW;AACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,CAAC,SAAS;AAE3B,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OAAqC;AAC1C,WACE,KAAK,eAAe,QAAQ,qBAAqB,WAAW,MAC5D,MAAM,eAAe,QAAQ,qBAAqB,WAAW;AAAA,EAEjE;AAAA,EACA,OAAO,OAAO,GAAkC,GAA2C;AACzF,QAAI,CAAC,GAAG;AACN,UAAI,CAAC,EAAG,QAAO;AACf,aAAO;AAAA,IACT;AACA,QAAI,CAAC,GAAG;AACN,aAAO;AAAA,IACT;AACA,WAAO,OAAO,OAAO,CAAC,EAAE,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,EACjD;AAAA,EAEA,WAAW,OAA+C;AACxD,QAAI,CAAC,MAAO,QAAO;AACnB,YAAQ,OAAO,OAAO,KAAK;AAI3B,UAAM,WAAW,CAAC,SAAkB,SAAS,MAAM,CAAC,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAEzF,QAAI,MAAM,mBAAmB,OAAO,KAAK,mBAAmB,KAAK;AAC/D,aAAO;AAAA,IACT;AACA,UAAM,YAAY,SAAS,KAAK,cAAc;AAC9C,UAAM,aAAa,SAAS,MAAM,cAAc;AAGhD,QAAI,UAAU,UAAU,WAAW,OAAQ,QAAO;AAElD,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAM,YAAY,WAAW,CAAC;AAC9B,YAAM,WAAW,UAAU,CAAC;AAC5B,UAAI,UAAU,WAAW,GAAG,EAAG;AAC/B,UAAI,cAAc,SAAU,QAAO;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,OAA+C;AACtD,QAAI,CAAC,MAAO,QAAO;AACnB,YAAQ,OAAO,OAAO,KAAK;AAI3B,UAAM,WAAW,CAAC,SAAkB,SAAS,MAAM,CAAC,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAEzF,QAAI,KAAK,mBAAmB,OAAO,MAAM,mBAAmB,KAAK;AAC/D,aAAO;AAAA,IACT;AACA,UAAM,YAAY,SAAS,KAAK,cAAc;AAC9C,UAAM,aAAa,SAAS,MAAM,cAAc;AAGhD,QAAI,UAAU,UAAU,WAAW,OAAQ,QAAO;AAElD,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,WAAW,UAAU,CAAC;AAC5B,YAAM,YAAY,WAAW,CAAC;AAC9B,UAAI,SAAS,WAAW,GAAG,EAAG;AAC9B,UAAI,aAAa,UAAW,QAAO;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,OAA+C;AACxD,QAAI,CAAC,MAAO,QAAO;AACnB,YAAQ,OAAO,OAAO,KAAK;AAC3B,UAAM,WAAW,CAAC,SAAiB;AACjC,UAAI,SAAS,IAAK,QAAO,CAAC,GAAG;AAC7B,aAAO,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,IACvC;AAEA,UAAM,YAAY,SAAS,KAAK,cAAc;AAC9C,UAAM,aAAa,SAAS,MAAM,cAAc;AAGhD,QAAI,UAAU,WAAW,WAAW,QAAQ;AAC1C,aAAO;AAAA,IACT;AAGA,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,WAAW,UAAU,CAAC;AAC5B,YAAM,YAAY,WAAW,CAAC;AAG9B,UAAI,SAAS,WAAW,GAAG,KAAK,UAAU,WAAW,GAAG,GAAG;AACzD;AAAA,MACF;AAGA,UAAI,SAAS,WAAW,GAAG,KAAK,UAAU,WAAW,GAAG,GAAG;AACzD;AAAA,MACF;AAGA,UAAI,aAAa,WAAW;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,OAA+C;AAChE,QAAI,CAAC,MAAO,QAAO;AACnB,YAAQ,OAAO,OAAO,KAAK;AAG3B,UAAM,WAAW,CAAC,SAAiB;AACjC,UAAI,SAAS,IAAK,QAAO,CAAC,GAAG;AAC7B,aAAO,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,IACvC;AAEA,UAAM,YAAY,SAAS,KAAK,cAAc;AAC9C,UAAM,aAAa,SAAS,MAAM,cAAc;AAGhD,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,UAAU,QAAQ,WAAW,MAAM,GAAG,KAAK;AACtE,YAAM,eAAe,CAAC,UAAU,CAAC,EAAE,WAAW,GAAG;AACjD,YAAM,gBAAgB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG;AAEnD,UAAI,gBAAgB,CAAC,cAAe,QAAO;AAC3C,UAAI,CAAC,gBAAgB,cAAe,QAAO;AAAA,IAC7C;AAGA,WAAO,KAAK,iBAAiB,MAAM;AAAA,EACrC;AACF;AAEO,MAAM,OAAoD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EASQ,YAAY;AAAA,IAClB;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAMG;AACD,SAAK,UACH,aAAc,SAAqC,OAAO,QAAQ,MAAM;AAE1E,QAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,SAAS;AAC/C,YAAM,WAAW,OAAO,aAAa,KAAK,OAAO;AACjD,WAAK,iBAAiB,SAAS;AAC/B,WAAK,gBAAgB,SAAS;AAC9B,WAAK,WAAW,KAAK,cAAc,IAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG,CAAC;AAAA,IACnE,OAAO;AACL,WAAK,iBAAiB;AACtB,WAAK,gBAAgB;AACrB,WAAK,WAAW;AAAA,IAClB;AACA,SAAK,IAAI;AAAA,MACP,QAAQ,KAAK;AAAA,MACb,aAAa,KAAK,aAAa,KAAK,IAAI;AAAA,MACxC,UAAU,KAAK,UAAU,KAAK,IAAI;AAAA,MAClC,eAAe,KAAK;AAAA,MACpB,cAAc,KAAK;AAAA,MACnB,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,OAAO,OAAqC,QAA4B;AACtE,UAAM,WAAW,IAAI,OAAO,EAAE,OAAO,CAAC;AACtC,WAAO,OAAO,SAAS,QAAQ;AAAA,EACjC;AAAA,EAEA,OAAe,SAAuC,UAAsC;AAC1F,WAAO,eAAe,UAAU,OAAO,SAAS;AAChD,WAAO,eAAe,UAAU,OAAO,aAAa;AAAA,MAClD,OAAO;AAAA,IACT,CAAC;AACD,WAAO,OAAO,UAAU;AAAA,MACtB,UAAU,SAAS,UAAU,KAAK,QAAQ;AAAA,IAC5C,CAAC;AACD,WAAO,OAAO,UAAU,SAAS,OAAO;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,QAAsC,QAAoC;AACvF,UAAM,SAAS,CAAC;AAChB,eAAW,OAAO,QAAQ;AACxB,UAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG,GAAG;AACrD,cAAM,QAAQ,OAAO,GAAG;AACxB,eAAO,GAAG,IAAK,OAAO,UAAU,WAAW,OAAO,OAAO,KAAK,IAAI;AAAA,MACpE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAQA,aAAa,yBAAsF;AAEjG,UAAM,QAAQ;AACd,eAAW,SAAS,KAAK,UAAU;AACjC,YAAM,MAAM,MAAM,YAAY,uBAAuB;AACrD,UAAI,IAAI,OAAO;AACb,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,OAAO,UAAU,WAAW,OAAO,YAAY,KAAK,IAAI,OAAO,YAAY,KAAK;AAAA,EACzF;AAAA,EAEA,OAAe,aAAa,QAA2E;AACrG,UAAM,WAAW,OAAO,QAAQ,MAAM;AACtC,UAAM,UAAU,OAAO,QAAQ,QAAQ;AAEvC,UAAM,WAAW,CAAC,SAAiB;AACjC,UAAI,SAAS,IAAK,QAAO,CAAC,GAAG;AAC7B,aAAO,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,IACvC;AAGA,YAAQ,KAAK,CAAC,CAAC,OAAO,MAAM,GAAG,CAAC,OAAO,MAAM,MAAM;AACjD,YAAM,SAAS,SAAS,OAAO,cAAc;AAC7C,YAAM,SAAS,SAAS,OAAO,cAAc;AAG7C,UAAI,OAAO,WAAW,OAAO,QAAQ;AACnC,eAAO,OAAO,SAAS,OAAO;AAAA,MAChC;AAGA,UAAI,OAAO,WAAW,MAAM,GAAG;AAE7B,YAAI,OAAO,mBAAmB,MAAM,EAAG,QAAO;AAC9C,YAAI,OAAO,mBAAmB,MAAM,EAAG,QAAO;AAAA,MAChD;AAGA,aAAO,OAAO,eAAe,cAAc,OAAO,cAAc;AAAA,IAClE,CAAC;AAED,UAAM,gBAAgB,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,MAAM,UAAU;AACrE,UAAM,eAAe,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI;AACxD,WAAO,EAAE,eAAe,aAAa;AAAA,EACvC;AAAA,EAEA,UAAU,QAA2C;AACnD,UAAM,YAAY,CAAC;AACnB,eAAW,OAAO,KAAK,SAAS;AAC9B,UAAI,OAAO,UAAU,eAAe,KAAK,KAAK,SAAS,GAAG,GAAG;AAC3D,kBAAU,GAAG,IAAI,KAAK,QAAQ,GAAG,EAAE,MAAM,MAAM;AAAA,MACjD;AAAA,IACF;AACA,UAAM,WAAW,IAAI,OAAO;AAAA,MAC1B,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,eAAe,KAAK;AAAA,MACpB,cAAc,KAAK;AAAA,MACnB,SAAS,KAAK,cAAc,IAAI,CAAC,QAAQ,UAAU,GAAG,CAAC;AAAA,IACzD,CAAC;AACD,WAAO,OAAO,SAAS,QAAQ;AAAA,EACjC;AAAA,EAEA,OAAO,IAAI;AAAA,IACT,UAAU,OAAO,SAAS,KAAK,MAAM;AAAA,IACrC,SAAS,OAAO,QAAQ,KAAK,MAAM;AAAA,IACnC,cAAc,OAAO,aAAa,KAAK,MAAM;AAAA,EAC/C;AACF;","names":["paramsInput","searchInput","hashInput"]}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -16,20 +16,20 @@ declare class Route0<TDefinition extends string> {
|
|
|
16
16
|
get(input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, {
|
|
17
17
|
search?: _SearchInput<TDefinition>;
|
|
18
18
|
abs?: boolean;
|
|
19
|
-
hash?: string;
|
|
19
|
+
hash?: string | number;
|
|
20
20
|
}>>): OnlyIfHasParams<_ParamsDefinition<TDefinition>, string>;
|
|
21
21
|
get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): string;
|
|
22
22
|
get(input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, {
|
|
23
23
|
search?: _SearchInput<TDefinition>;
|
|
24
24
|
abs?: boolean;
|
|
25
|
-
hash?: string;
|
|
25
|
+
hash?: string | number;
|
|
26
26
|
}>): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>;
|
|
27
27
|
flat(input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, _SearchInput<TDefinition> & {
|
|
28
|
-
hash?: string;
|
|
28
|
+
hash?: string | number;
|
|
29
29
|
}>>, abs?: boolean): OnlyIfHasParams<_ParamsDefinition<TDefinition>, string>;
|
|
30
30
|
flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): string;
|
|
31
31
|
flat(input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & {
|
|
32
|
-
hash?: string;
|
|
32
|
+
hash?: string | number;
|
|
33
33
|
}>, abs?: boolean): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>;
|
|
34
34
|
getParamsKeys(): string[];
|
|
35
35
|
getSearchKeys(): string[];
|
|
@@ -133,11 +133,23 @@ type StrictSearchOutput<T extends AnyRoute | string> = Partial<{
|
|
|
133
133
|
}>;
|
|
134
134
|
type FlatOutput<T extends AnyRoute | string = string> = HasParams<Definition<T>> extends true ? ParamsOutput<T> & SearchOutput<T> : SearchOutput<T>;
|
|
135
135
|
type StrictFlatOutput<T extends AnyRoute | string> = HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>;
|
|
136
|
+
type FlatOutputWithHash<T extends AnyRoute | string = string> = FlatOutput<T> & {
|
|
137
|
+
hash?: string | undefined;
|
|
138
|
+
};
|
|
139
|
+
type StrictFlatOutputWithHash<T extends AnyRoute | string> = StrictFlatOutput<T> & {
|
|
140
|
+
hash?: string | undefined;
|
|
141
|
+
};
|
|
136
142
|
type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>;
|
|
137
143
|
type SearchInput<T extends AnyRoute | string = string> = _SearchInput<Definition<T>>;
|
|
138
144
|
type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>;
|
|
139
145
|
type FlatInput<T extends AnyRoute | string> = _FlatInput<Definition<T>>;
|
|
140
146
|
type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>;
|
|
147
|
+
type FlatInputWithHash<T extends AnyRoute | string> = _FlatInput<Definition<T>> & {
|
|
148
|
+
hash?: string | number;
|
|
149
|
+
};
|
|
150
|
+
type StrictFlatInputWithHash<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>> & {
|
|
151
|
+
hash?: string | number;
|
|
152
|
+
};
|
|
141
153
|
type CanInputBeEmpty<T extends AnyRoute | string> = HasParams<Definition<T>> extends true ? false : true;
|
|
142
154
|
type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<PathDefinition<T>>;
|
|
143
155
|
type SearchInputStringOnly<T extends AnyRoute | string = string> = _SearchInputStringOnly<Definition<T>>;
|
|
@@ -249,11 +261,11 @@ type PathExtended<TSourcedefinitionDefinition extends string, TSuffixdefinitionD
|
|
|
249
261
|
type WithParamsInput<TDefinition extends string, T extends {
|
|
250
262
|
search?: _SearchInput<any>;
|
|
251
263
|
abs?: boolean;
|
|
252
|
-
hash?: string;
|
|
264
|
+
hash?: string | number;
|
|
253
265
|
} | undefined = undefined> = _ParamsInput<TDefinition> & (T extends undefined ? Record<never, never> : T);
|
|
254
266
|
type _IsSameParams<T1 extends object | undefined, T2 extends object | undefined> = T1 extends undefined ? T2 extends undefined ? true : false : T2 extends undefined ? false : T1 extends T2 ? T2 extends T1 ? true : false : false;
|
|
255
267
|
type _IsParent<T extends string, TParent extends string> = T extends TParent ? false : T extends `${TParent}${string}` ? true : false;
|
|
256
268
|
type _IsChildren<T extends string, TChildren extends string> = TChildren extends T ? false : TChildren extends `${T}${string}` ? true : false;
|
|
257
269
|
type _IsSame<T extends string, TExact extends string> = T extends TExact ? TExact extends T ? true : false : false;
|
|
258
270
|
|
|
259
|
-
export { type AmpSplit, type AnyLocation, type AnyRoute, type AnyRouteOrDefinition, type CallableRoute, type CanInputBeEmpty, type ChildrenLocation, type DedupeSlashes, type Definition, type EmptyRecord, type ExactLocation, type Extended, type ExtractPathParams, type ExtractRoute, type ExtractRoutesKeys, type FlatInput, type FlatInputStringOnly, type FlatOutput, type HasParams, type HasSearch, type IsChildren, type IsParent, type IsSame, type IsSameParams, type JoinPath, type KnownLocation, type LocationParams, type LocationSearch, type NonEmpty, type OnlyIfHasParams, type OnlyIfNoParams, type ParamsDefinition, type ParamsInput, type ParamsInputStringOnly, type ParamsOutput, type ParentLocation, type PathDefinition, type PathExtended, type ReplacePathParams, Route0, type RouteConfigInput, Routes, type RoutesPretty, type RoutesRecord, type RoutesRecordHydrated, type SearchDefinition, type SearchInput, type SearchInputStringOnly, type SearchOutput, type SearchTailDefinitionWithFirstAmp, type SearchTailDefinitionWithoutFirstAmp, type StrictFlatInput, type StrictFlatInputStringOnly, type StrictFlatOutput, type StrictSearchInput, type StrictSearchInputStringOnly, type StrictSearchOutput, type TrimSearchTailDefinition, type UnknownLocation, type UnmatchedLocation, type WithParamsInput, type _FlatInput, type _FlatInputStringOnly, type _GeneralLocation, type _IsChildren, type _IsParent, type _IsSame, type _IsSameParams, type _ParamsDefinition, type _ParamsInput, type _ParamsInputStringOnly, type _PathDefinition, type _SearchDefinition, type _SearchInput, type _SearchInputStringOnly, type _StrictFlatInput, type _StrictFlatInputStringOnly, type _StrictSearchInput, type _StrictSearchInputStringOnly };
|
|
271
|
+
export { type AmpSplit, type AnyLocation, type AnyRoute, type AnyRouteOrDefinition, type CallableRoute, type CanInputBeEmpty, type ChildrenLocation, type DedupeSlashes, type Definition, type EmptyRecord, type ExactLocation, type Extended, type ExtractPathParams, type ExtractRoute, type ExtractRoutesKeys, type FlatInput, type FlatInputStringOnly, type FlatInputWithHash, type FlatOutput, type FlatOutputWithHash, type HasParams, type HasSearch, type IsChildren, type IsParent, type IsSame, type IsSameParams, type JoinPath, type KnownLocation, type LocationParams, type LocationSearch, type NonEmpty, type OnlyIfHasParams, type OnlyIfNoParams, type ParamsDefinition, type ParamsInput, type ParamsInputStringOnly, type ParamsOutput, type ParentLocation, type PathDefinition, type PathExtended, type ReplacePathParams, Route0, type RouteConfigInput, Routes, type RoutesPretty, type RoutesRecord, type RoutesRecordHydrated, type SearchDefinition, type SearchInput, type SearchInputStringOnly, type SearchOutput, type SearchTailDefinitionWithFirstAmp, type SearchTailDefinitionWithoutFirstAmp, type StrictFlatInput, type StrictFlatInputStringOnly, type StrictFlatInputWithHash, type StrictFlatOutput, type StrictFlatOutputWithHash, type StrictSearchInput, type StrictSearchInputStringOnly, type StrictSearchOutput, type TrimSearchTailDefinition, type UnknownLocation, type UnmatchedLocation, type WithParamsInput, type _FlatInput, type _FlatInputStringOnly, type _GeneralLocation, type _IsChildren, type _IsParent, type _IsSame, type _IsSameParams, type _ParamsDefinition, type _ParamsInput, type _ParamsInputStringOnly, type _PathDefinition, type _SearchDefinition, type _SearchInput, type _SearchInputStringOnly, type _StrictFlatInput, type _StrictFlatInputStringOnly, type _StrictSearchInput, type _StrictSearchInputStringOnly };
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -16,20 +16,20 @@ declare class Route0<TDefinition extends string> {
|
|
|
16
16
|
get(input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, {
|
|
17
17
|
search?: _SearchInput<TDefinition>;
|
|
18
18
|
abs?: boolean;
|
|
19
|
-
hash?: string;
|
|
19
|
+
hash?: string | number;
|
|
20
20
|
}>>): OnlyIfHasParams<_ParamsDefinition<TDefinition>, string>;
|
|
21
21
|
get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): string;
|
|
22
22
|
get(input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, {
|
|
23
23
|
search?: _SearchInput<TDefinition>;
|
|
24
24
|
abs?: boolean;
|
|
25
|
-
hash?: string;
|
|
25
|
+
hash?: string | number;
|
|
26
26
|
}>): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>;
|
|
27
27
|
flat(input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, _SearchInput<TDefinition> & {
|
|
28
|
-
hash?: string;
|
|
28
|
+
hash?: string | number;
|
|
29
29
|
}>>, abs?: boolean): OnlyIfHasParams<_ParamsDefinition<TDefinition>, string>;
|
|
30
30
|
flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): string;
|
|
31
31
|
flat(input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & {
|
|
32
|
-
hash?: string;
|
|
32
|
+
hash?: string | number;
|
|
33
33
|
}>, abs?: boolean): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>;
|
|
34
34
|
getParamsKeys(): string[];
|
|
35
35
|
getSearchKeys(): string[];
|
|
@@ -133,11 +133,23 @@ type StrictSearchOutput<T extends AnyRoute | string> = Partial<{
|
|
|
133
133
|
}>;
|
|
134
134
|
type FlatOutput<T extends AnyRoute | string = string> = HasParams<Definition<T>> extends true ? ParamsOutput<T> & SearchOutput<T> : SearchOutput<T>;
|
|
135
135
|
type StrictFlatOutput<T extends AnyRoute | string> = HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>;
|
|
136
|
+
type FlatOutputWithHash<T extends AnyRoute | string = string> = FlatOutput<T> & {
|
|
137
|
+
hash?: string | undefined;
|
|
138
|
+
};
|
|
139
|
+
type StrictFlatOutputWithHash<T extends AnyRoute | string> = StrictFlatOutput<T> & {
|
|
140
|
+
hash?: string | undefined;
|
|
141
|
+
};
|
|
136
142
|
type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>;
|
|
137
143
|
type SearchInput<T extends AnyRoute | string = string> = _SearchInput<Definition<T>>;
|
|
138
144
|
type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>;
|
|
139
145
|
type FlatInput<T extends AnyRoute | string> = _FlatInput<Definition<T>>;
|
|
140
146
|
type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>;
|
|
147
|
+
type FlatInputWithHash<T extends AnyRoute | string> = _FlatInput<Definition<T>> & {
|
|
148
|
+
hash?: string | number;
|
|
149
|
+
};
|
|
150
|
+
type StrictFlatInputWithHash<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>> & {
|
|
151
|
+
hash?: string | number;
|
|
152
|
+
};
|
|
141
153
|
type CanInputBeEmpty<T extends AnyRoute | string> = HasParams<Definition<T>> extends true ? false : true;
|
|
142
154
|
type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<PathDefinition<T>>;
|
|
143
155
|
type SearchInputStringOnly<T extends AnyRoute | string = string> = _SearchInputStringOnly<Definition<T>>;
|
|
@@ -249,11 +261,11 @@ type PathExtended<TSourcedefinitionDefinition extends string, TSuffixdefinitionD
|
|
|
249
261
|
type WithParamsInput<TDefinition extends string, T extends {
|
|
250
262
|
search?: _SearchInput<any>;
|
|
251
263
|
abs?: boolean;
|
|
252
|
-
hash?: string;
|
|
264
|
+
hash?: string | number;
|
|
253
265
|
} | undefined = undefined> = _ParamsInput<TDefinition> & (T extends undefined ? Record<never, never> : T);
|
|
254
266
|
type _IsSameParams<T1 extends object | undefined, T2 extends object | undefined> = T1 extends undefined ? T2 extends undefined ? true : false : T2 extends undefined ? false : T1 extends T2 ? T2 extends T1 ? true : false : false;
|
|
255
267
|
type _IsParent<T extends string, TParent extends string> = T extends TParent ? false : T extends `${TParent}${string}` ? true : false;
|
|
256
268
|
type _IsChildren<T extends string, TChildren extends string> = TChildren extends T ? false : TChildren extends `${T}${string}` ? true : false;
|
|
257
269
|
type _IsSame<T extends string, TExact extends string> = T extends TExact ? TExact extends T ? true : false : false;
|
|
258
270
|
|
|
259
|
-
export { type AmpSplit, type AnyLocation, type AnyRoute, type AnyRouteOrDefinition, type CallableRoute, type CanInputBeEmpty, type ChildrenLocation, type DedupeSlashes, type Definition, type EmptyRecord, type ExactLocation, type Extended, type ExtractPathParams, type ExtractRoute, type ExtractRoutesKeys, type FlatInput, type FlatInputStringOnly, type FlatOutput, type HasParams, type HasSearch, type IsChildren, type IsParent, type IsSame, type IsSameParams, type JoinPath, type KnownLocation, type LocationParams, type LocationSearch, type NonEmpty, type OnlyIfHasParams, type OnlyIfNoParams, type ParamsDefinition, type ParamsInput, type ParamsInputStringOnly, type ParamsOutput, type ParentLocation, type PathDefinition, type PathExtended, type ReplacePathParams, Route0, type RouteConfigInput, Routes, type RoutesPretty, type RoutesRecord, type RoutesRecordHydrated, type SearchDefinition, type SearchInput, type SearchInputStringOnly, type SearchOutput, type SearchTailDefinitionWithFirstAmp, type SearchTailDefinitionWithoutFirstAmp, type StrictFlatInput, type StrictFlatInputStringOnly, type StrictFlatOutput, type StrictSearchInput, type StrictSearchInputStringOnly, type StrictSearchOutput, type TrimSearchTailDefinition, type UnknownLocation, type UnmatchedLocation, type WithParamsInput, type _FlatInput, type _FlatInputStringOnly, type _GeneralLocation, type _IsChildren, type _IsParent, type _IsSame, type _IsSameParams, type _ParamsDefinition, type _ParamsInput, type _ParamsInputStringOnly, type _PathDefinition, type _SearchDefinition, type _SearchInput, type _SearchInputStringOnly, type _StrictFlatInput, type _StrictFlatInputStringOnly, type _StrictSearchInput, type _StrictSearchInputStringOnly };
|
|
271
|
+
export { type AmpSplit, type AnyLocation, type AnyRoute, type AnyRouteOrDefinition, type CallableRoute, type CanInputBeEmpty, type ChildrenLocation, type DedupeSlashes, type Definition, type EmptyRecord, type ExactLocation, type Extended, type ExtractPathParams, type ExtractRoute, type ExtractRoutesKeys, type FlatInput, type FlatInputStringOnly, type FlatInputWithHash, type FlatOutput, type FlatOutputWithHash, type HasParams, type HasSearch, type IsChildren, type IsParent, type IsSame, type IsSameParams, type JoinPath, type KnownLocation, type LocationParams, type LocationSearch, type NonEmpty, type OnlyIfHasParams, type OnlyIfNoParams, type ParamsDefinition, type ParamsInput, type ParamsInputStringOnly, type ParamsOutput, type ParentLocation, type PathDefinition, type PathExtended, type ReplacePathParams, Route0, type RouteConfigInput, Routes, type RoutesPretty, type RoutesRecord, type RoutesRecordHydrated, type SearchDefinition, type SearchInput, type SearchInputStringOnly, type SearchOutput, type SearchTailDefinitionWithFirstAmp, type SearchTailDefinitionWithoutFirstAmp, type StrictFlatInput, type StrictFlatInputStringOnly, type StrictFlatInputWithHash, type StrictFlatOutput, type StrictFlatOutputWithHash, type StrictSearchInput, type StrictSearchInputStringOnly, type StrictSearchOutput, type TrimSearchTailDefinition, type UnknownLocation, type UnmatchedLocation, type WithParamsInput, type _FlatInput, type _FlatInputStringOnly, type _GeneralLocation, type _IsChildren, type _IsParent, type _IsSame, type _IsSameParams, type _ParamsDefinition, type _ParamsInput, type _ParamsInputStringOnly, type _PathDefinition, type _SearchDefinition, type _SearchInput, type _SearchInputStringOnly, type _StrictFlatInput, type _StrictFlatInputStringOnly, type _StrictSearchInput, type _StrictSearchInputStringOnly };
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["// 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, isChildren, isParent\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, {baseUrl, 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\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 baseUrl: string\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\n const { baseUrl } = config\n if (baseUrl && typeof baseUrl === 'string' && baseUrl.length) {\n this.baseUrl = baseUrl\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this.baseUrl = g.location.origin\n } else {\n this.baseUrl = 'https://example.com'\n }\n }\n }\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 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(baseUrl: string, pathWithSearch: string) {\n return new URL(pathWithSearch, baseUrl).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 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, { baseUrl: this.baseUrl })\n }\n\n // has params\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs?: false; hash?: string }>\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 }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, { search?: undefined; abs: true; hash?: string }>\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 }>\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 }>\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 }>\n // >,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n get(\n input: OnlyIfHasParams<\n _ParamsDefinition<TDefinition>,\n WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string }>\n >,\n ): OnlyIfHasParams<_ParamsDefinition<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 }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs?: false; hash?: string }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs: true; hash?: string }>,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search: _SearchInput<TDefinition>; abs: true; hash?: string }\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 }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // get(\n // input: OnlyIfNoParams<\n // _ParamsDefinition<TDefinition>,\n // { search?: _SearchInput<TDefinition>; abs: true; hash?: string }\n // >,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): string\n get(\n input: OnlyIfNoParams<\n _ParamsDefinition<TDefinition>,\n { search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string }\n >,\n ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>\n\n // implementation\n get(...args: any[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\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 { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\n }\n const { search, abs, hash, ...params } = input\n return { searchInput: search || {}, paramsInput: params, absInput: abs ?? false, hashInput: hash }\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(this.baseUrl, 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 }>>,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>\n // >,\n // abs?: false,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string }>>,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfHasParams<\n // _ParamsDefinition<TDefinition>,\n // WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>\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 }>\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 }>\n // >,\n // abs: true,\n // ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n flat(\n input: OnlyIfHasParams<\n _ParamsDefinition<TDefinition>,\n WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>\n >,\n abs?: boolean,\n ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, string>\n\n // no params\n // flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,\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 }>,\n // abs?: false,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>\n // flat(\n // input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,\n // abs: true,\n // ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>\n\n flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): string\n flat(\n input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,\n abs?: boolean,\n ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>\n\n // implementation\n flat(...args: any[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\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 { searchInput: {}, paramsInput: {}, absInput: args[1] ?? false, hashInput: undefined }\n }\n const paramsKeys = this.getParamsKeys()\n const paramsInput = paramsKeys.reduce<Record<string, string | number>>((acc, key) => {\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 true\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 { searchInput, paramsInput, absInput: args[1] ?? false, hashInput }\n })()\n\n return this.get({ ...paramsInput, search: searchInput, abs: absInput, hash: hashInput } as never)\n }\n\n getParamsKeys(): string[] {\n return Object.keys(this.paramsDefinition || {})\n }\n getSearchKeys(): string[] {\n return Object.keys(this.searchDefinition || {})\n }\n getFlatKeys(): string[] {\n return [...this.getSearchKeys(), ...this.getParamsKeys()]\n }\n\n getDefinition(): string {\n return this.pathDefinition\n }\n\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 static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = this.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = this.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\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 static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, baseUrl: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, baseUrl)\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 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 exact: false,\n parent: false,\n children: false,\n }\n\n return location\n }\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-conversion\n paramNames.push(String(name))\n return ''\n })\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const parentRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n\n // Fill params only for exact match (keeps behavior predictable)\n if (exactMatch) {\n const values = exactMatch.slice(1)\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 const exact = !!exactMatch\n const parent = !exact && parentRe.test(pathname)\n\n // \"children\": 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 children = !exact && isPrefix\n\n return {\n ...location,\n exact,\n parent,\n children,\n } as KnownLocation<TDefinition>\n }\n\n isSame(other: Route0<TDefinition>): 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 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 isChildren(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a child 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 parent of any non-root; thus any non-root is a child 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 child 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 isParent(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a parent 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 parent 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 // A parent 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 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 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\nexport class Routes<const T extends RoutesRecord = RoutesRecord> {\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 override: Routes<T>['_override']\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 override: this._override.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n static create<const T extends RoutesRecord>(routes: T): RoutesPretty<T> {\n const instance = new Routes({ routes })\n return Routes.prettify(instance)\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 override: instance._override.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.prototype.hasOwnProperty.call(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 _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): { pathsOrdering: string[]; keysOrdering: string[] } {\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, route]) => _key)\n return { pathsOrdering, keysOrdering }\n }\n\n _override(config: RouteConfigInput): RoutesPretty<T> {\n const newRoutes = {} as RoutesRecordHydrated<T>\n for (const key in this._routes) {\n if (Object.prototype.hasOwnProperty.call(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\nexport type AnyRoute<T extends Route0<string> | string = string> = T extends string ? Route0<T> : T\nexport type CallableRoute<T extends Route0<string> | string = string> = AnyRoute<T> & AnyRoute<T>['get']\nexport type AnyRouteOrDefinition<T extends string = string> = AnyRoute<T> | CallableRoute<T> | T\nexport type RouteConfigInput = {\n baseUrl?: string\n}\n\n// collection\n\nexport type RoutesRecord = Record<string, AnyRoute | string>\nexport type RoutesRecordHydrated<TRoutesRecord extends RoutesRecord = RoutesRecord> = {\n [K in keyof TRoutesRecord]: CallableRoute<TRoutesRecord[K]>\n}\nexport type RoutesPretty<TRoutesRecord extends RoutesRecord = RoutesRecord> = RoutesRecordHydrated<TRoutesRecord> &\n Omit<\n Routes<TRoutesRecord>,\n '_routes' | '_getLocation' | '_override' | '_pathsOrdering' | '_keysOrdering' | '_ordered'\n >\nexport type ExtractRoutesKeys<TRoutes extends RoutesPretty<any> | RoutesRecord> =\n TRoutes extends RoutesPretty<any>\n ? keyof TRoutes['_']['routes']\n : TRoutes extends RoutesRecord\n ? keyof TRoutes\n : never\nexport type ExtractRoute<TRoutes extends RoutesPretty<any> | RoutesRecord, TKey extends ExtractRoutesKeys<TRoutes>> =\n TRoutes extends RoutesPretty<any>\n ? TRoutes['_']['routes'][TKey]\n : TRoutes extends RoutesRecord\n ? TRoutes[TKey]\n : 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 IsParent<T extends AnyRoute | string, TParent extends AnyRoute | string> = _IsParent<\n PathDefinition<T>,\n PathDefinition<TParent>\n>\nexport type IsChildren<T extends AnyRoute | string, TChildren extends AnyRoute | string> = _IsChildren<\n PathDefinition<T>,\n PathDefinition<TChildren>\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> =\n NonEmpty<SearchTailDefinitionWithoutFirstAmp<Definition<T>>> extends infer Tail extends string\n ? AmpSplit<Tail> extends infer U\n ? [U] extends [never]\n ? false\n : true\n : false\n : false\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: string\n}\nexport type SearchOutput<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 FlatOutput<T extends AnyRoute | string = string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & SearchOutput<T> : SearchOutput<T>\nexport type StrictFlatOutput<T extends AnyRoute | string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>\nexport type SearchInput<T extends AnyRoute | string = string> = _SearchInput<Definition<T>>\nexport type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>\nexport type FlatInput<T extends AnyRoute | string> = _FlatInput<Definition<T>>\nexport type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>\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 SearchInputStringOnly<T extends AnyRoute | string = string> = _SearchInputStringOnly<Definition<T>>\nexport type StrictSearchInputStringOnly<T extends AnyRoute | string> = _StrictSearchInputStringOnly<Definition<T>>\nexport type FlatInputStringOnly<T extends AnyRoute | string> = _FlatInputStringOnly<Definition<T>>\nexport type StrictFlatInputStringOnly<T extends AnyRoute | string> = _StrictFlatInputStringOnly<Definition<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\nexport type _GeneralLocation = {\n pathname: string\n search: string\n hash: string\n origin?: string\n href?: string\n hrefRel: string\n abs: boolean\n port?: string\n host?: string\n hostname?: string\n}\nexport type UnknownLocation = _GeneralLocation & {\n params: undefined\n searchParams: SearchOutput\n route: undefined\n exact: false\n parent: false\n children: false\n}\nexport type UnmatchedLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: Record<never, never>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: false\n children: false\n}\nexport type ExactLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: ParamsOutput<TRoute>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: true\n parent: false\n children: false\n}\nexport type ParentLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: Partial<ParamsOutput<TRoute>> // in fact maybe there will be whole params object, but does not matter now\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: true\n children: false\n}\nexport type ChildrenLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: ParamsOutput<TRoute>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: false\n children: true\n}\nexport type KnownLocation<TRoute extends AnyRoute | string = AnyRoute | string> =\n | UnmatchedLocation<TRoute>\n | ExactLocation<TRoute>\n | ParentLocation<TRoute>\n | ChildrenLocation<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<SearchTailDefinitionWithoutFirstAmp<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 _SearchInput<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 _FlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInput<TDefinition> & _SearchInput<TDefinition>\n : _SearchInput<TDefinition>\nexport type _StrictFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition> & _ParamsInput<TDefinition>\n : _ParamsInput<TDefinition>\n : HasSearch<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 _SearchInputStringOnly<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 _FlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInputStringOnly<TDefinition> & _SearchInputStringOnly<TDefinition>\n : _SearchInputStringOnly<TDefinition>\nexport type _StrictFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition> & _ParamsInputStringOnly<TDefinition>\n : _ParamsInputStringOnly<TDefinition>\n : HasSearch<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 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\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\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<TParams extends object | undefined, Yes, No = never> = TParams extends undefined ? Yes : No\nexport type OnlyIfHasParams<TParams extends object | undefined, Yes, No = never> = TParams extends undefined ? No : Yes\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?: _SearchInput<any>\n abs?: boolean\n hash?: string\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 _IsParent<T extends string, TParent extends string> = T extends TParent\n ? false\n : T extends `${TParent}${string}`\n ? true\n : false\nexport type _IsChildren<T extends string, TChildren extends string> = TChildren extends T\n ? false\n : TChildren 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"],"mappings":"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","names":["paramsInput","searchInput","hashInput"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["// 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, isChildren, isParent\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, {baseUrl, 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\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 baseUrl: string\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\n const { baseUrl } = config\n if (baseUrl && typeof baseUrl === 'string' && baseUrl.length) {\n this.baseUrl = baseUrl\n } else {\n const g = globalThis as unknown as { location?: { origin?: string } }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof g?.location?.origin === 'string' && g.location.origin.length > 0) {\n this.baseUrl = g.location.origin\n } else {\n this.baseUrl = 'https://example.com'\n }\n }\n }\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 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(baseUrl: string, pathWithSearch: string) {\n return new URL(pathWithSearch, baseUrl).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 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, { baseUrl: this.baseUrl })\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 get(\n input: OnlyIfHasParams<\n _ParamsDefinition<TDefinition>,\n WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string | number }>\n >,\n ): OnlyIfHasParams<_ParamsDefinition<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<_ParamsDefinition<TDefinition>, [], [never]>): string\n get(\n input: OnlyIfNoParams<\n _ParamsDefinition<TDefinition>,\n { search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string | number }\n >,\n ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>\n\n // implementation\n get(...args: any[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\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 { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\n }\n const { search, abs, hash, ...params } = input\n return { searchInput: search || {}, paramsInput: params, absInput: abs ?? false, hashInput: hash }\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(this.baseUrl, 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 flat(\n input: OnlyIfHasParams<\n _ParamsDefinition<TDefinition>,\n WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>\n >,\n abs?: boolean,\n ): OnlyIfHasParams<_ParamsDefinition<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<_ParamsDefinition<TDefinition>, [], [never]>): string\n flat(\n input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,\n abs?: boolean,\n ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>\n\n // implementation\n flat(...args: any[]): string {\n const { searchInput, paramsInput, absInput, hashInput } = ((): {\n searchInput: Record<string, string | number>\n paramsInput: Record<string, string | number>\n absInput: boolean\n hashInput: string | undefined\n } => {\n if (args.length === 0) {\n return { searchInput: {}, paramsInput: {}, absInput: false, hashInput: undefined }\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 { searchInput: {}, paramsInput: {}, absInput: args[1] ?? false, hashInput: undefined }\n }\n const paramsKeys = this.getParamsKeys()\n const paramsInput = paramsKeys.reduce<Record<string, string | number>>((acc, key) => {\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 true\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 { searchInput, paramsInput, absInput: args[1] ?? false, hashInput }\n })()\n\n return this.get({ ...paramsInput, search: searchInput, abs: absInput, hash: hashInput } as never)\n }\n\n getParamsKeys(): string[] {\n return Object.keys(this.paramsDefinition || {})\n }\n getSearchKeys(): string[] {\n return Object.keys(this.searchDefinition || {})\n }\n getFlatKeys(): string[] {\n return [...this.getSearchKeys(), ...this.getParamsKeys()]\n }\n\n getDefinition(): string {\n return this.pathDefinition\n }\n\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 static getRegexStrictStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexStrictString()).join('|')\n return `(${patterns})`\n }\n\n static getRegexStrictGroup(routes: AnyRoute[]): RegExp {\n const patterns = this.getRegexStrictStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\n static getRegexStringGroup(routes: AnyRoute[]): string {\n const patterns = routes.map((route) => route.getRegexString()).join('|')\n return `(${patterns})`\n }\n\n static getRegexGroup(routes: AnyRoute[]): RegExp {\n const patterns = this.getRegexStringGroup(routes)\n return new RegExp(`^(${patterns})$`)\n }\n\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 static toAbsLocation<TLocation extends AnyLocation>(location: TLocation, baseUrl: string): TLocation {\n const relLoc = Route0.toRelLocation(location)\n const url = new URL(relLoc.hrefRel, baseUrl)\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 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 exact: false,\n parent: false,\n children: false,\n }\n\n return location\n }\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-conversion\n paramNames.push(String(name))\n return ''\n })\n\n const exactRe = new RegExp(`^${this.getRegexBaseString()}$`)\n const parentRe = new RegExp(`^${this.getRegexBaseString()}(?:/.*)?$`) // route matches the beginning of the URL (may have more)\n const exactMatch = pathname.match(exactRe)\n\n // Fill params only for exact match (keeps behavior predictable)\n if (exactMatch) {\n const values = exactMatch.slice(1)\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 const exact = !!exactMatch\n const parent = !exact && parentRe.test(pathname)\n\n // \"children\": 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 children = !exact && isPrefix\n\n return {\n ...location,\n exact,\n parent,\n children,\n } as KnownLocation<TDefinition>\n }\n\n isSame(other: Route0<TDefinition>): 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 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 isChildren(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a child 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 parent of any non-root; thus any non-root is a child 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 child 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 isParent(other: AnyRoute | string | undefined): boolean {\n if (!other) return false\n other = Route0.create(other)\n // this is a parent 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 parent 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 // A parent 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 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 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\nexport class Routes<const T extends RoutesRecord = RoutesRecord> {\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 override: Routes<T>['_override']\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 override: this._override.bind(this),\n pathsOrdering: this._pathsOrdering,\n keysOrdering: this._keysOrdering,\n ordered: this._ordered,\n }\n }\n\n static create<const T extends RoutesRecord>(routes: T): RoutesPretty<T> {\n const instance = new Routes({ routes })\n return Routes.prettify(instance)\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 override: instance._override.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.prototype.hasOwnProperty.call(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 _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): { pathsOrdering: string[]; keysOrdering: string[] } {\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, route]) => _key)\n return { pathsOrdering, keysOrdering }\n }\n\n _override(config: RouteConfigInput): RoutesPretty<T> {\n const newRoutes = {} as RoutesRecordHydrated<T>\n for (const key in this._routes) {\n if (Object.prototype.hasOwnProperty.call(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\nexport type AnyRoute<T extends Route0<string> | string = string> = T extends string ? Route0<T> : T\nexport type CallableRoute<T extends Route0<string> | string = string> = AnyRoute<T> & AnyRoute<T>['get']\nexport type AnyRouteOrDefinition<T extends string = string> = AnyRoute<T> | CallableRoute<T> | T\nexport type RouteConfigInput = {\n baseUrl?: string\n}\n\n// collection\n\nexport type RoutesRecord = Record<string, AnyRoute | string>\nexport type RoutesRecordHydrated<TRoutesRecord extends RoutesRecord = RoutesRecord> = {\n [K in keyof TRoutesRecord]: CallableRoute<TRoutesRecord[K]>\n}\nexport type RoutesPretty<TRoutesRecord extends RoutesRecord = RoutesRecord> = RoutesRecordHydrated<TRoutesRecord> &\n Omit<\n Routes<TRoutesRecord>,\n '_routes' | '_getLocation' | '_override' | '_pathsOrdering' | '_keysOrdering' | '_ordered'\n >\nexport type ExtractRoutesKeys<TRoutes extends RoutesPretty<any> | RoutesRecord> =\n TRoutes extends RoutesPretty<any>\n ? keyof TRoutes['_']['routes']\n : TRoutes extends RoutesRecord\n ? keyof TRoutes\n : never\nexport type ExtractRoute<TRoutes extends RoutesPretty<any> | RoutesRecord, TKey extends ExtractRoutesKeys<TRoutes>> =\n TRoutes extends RoutesPretty<any>\n ? TRoutes['_']['routes'][TKey]\n : TRoutes extends RoutesRecord\n ? TRoutes[TKey]\n : 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 IsParent<T extends AnyRoute | string, TParent extends AnyRoute | string> = _IsParent<\n PathDefinition<T>,\n PathDefinition<TParent>\n>\nexport type IsChildren<T extends AnyRoute | string, TChildren extends AnyRoute | string> = _IsChildren<\n PathDefinition<T>,\n PathDefinition<TChildren>\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> =\n NonEmpty<SearchTailDefinitionWithoutFirstAmp<Definition<T>>> extends infer Tail extends string\n ? AmpSplit<Tail> extends infer U\n ? [U] extends [never]\n ? false\n : true\n : false\n : false\n\nexport type ParamsOutput<T extends AnyRoute | string> = {\n [K in keyof ParamsDefinition<T>]: string\n}\nexport type SearchOutput<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 FlatOutput<T extends AnyRoute | string = string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & SearchOutput<T> : SearchOutput<T>\nexport type StrictFlatOutput<T extends AnyRoute | string> =\n HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>\nexport type FlatOutputWithHash<T extends AnyRoute | string = string> = FlatOutput<T> & { hash?: string | undefined }\nexport type StrictFlatOutputWithHash<T extends AnyRoute | string> = StrictFlatOutput<T> & { hash?: string | undefined }\nexport type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>\nexport type SearchInput<T extends AnyRoute | string = string> = _SearchInput<Definition<T>>\nexport type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>\nexport type FlatInput<T extends AnyRoute | string> = _FlatInput<Definition<T>>\nexport type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>\nexport type FlatInputWithHash<T extends AnyRoute | string> = _FlatInput<Definition<T>> & { hash?: string | number }\nexport type StrictFlatInputWithHash<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>> & {\n hash?: string | number\n}\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 SearchInputStringOnly<T extends AnyRoute | string = string> = _SearchInputStringOnly<Definition<T>>\nexport type StrictSearchInputStringOnly<T extends AnyRoute | string> = _StrictSearchInputStringOnly<Definition<T>>\nexport type FlatInputStringOnly<T extends AnyRoute | string> = _FlatInputStringOnly<Definition<T>>\nexport type StrictFlatInputStringOnly<T extends AnyRoute | string> = _StrictFlatInputStringOnly<Definition<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\nexport type _GeneralLocation = {\n pathname: string\n search: string\n hash: string\n origin?: string\n href?: string\n hrefRel: string\n abs: boolean\n port?: string\n host?: string\n hostname?: string\n}\nexport type UnknownLocation = _GeneralLocation & {\n params: undefined\n searchParams: SearchOutput\n route: undefined\n exact: false\n parent: false\n children: false\n}\nexport type UnmatchedLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: Record<never, never>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: false\n children: false\n}\nexport type ExactLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: ParamsOutput<TRoute>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: true\n parent: false\n children: false\n}\nexport type ParentLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: Partial<ParamsOutput<TRoute>> // in fact maybe there will be whole params object, but does not matter now\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: true\n children: false\n}\nexport type ChildrenLocation<TRoute extends AnyRoute | string = AnyRoute | string> = _GeneralLocation & {\n params: ParamsOutput<TRoute>\n searchParams: SearchOutput<TRoute>\n route: Definition<TRoute>\n exact: false\n parent: false\n children: true\n}\nexport type KnownLocation<TRoute extends AnyRoute | string = AnyRoute | string> =\n | UnmatchedLocation<TRoute>\n | ExactLocation<TRoute>\n | ParentLocation<TRoute>\n | ChildrenLocation<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<SearchTailDefinitionWithoutFirstAmp<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 _SearchInput<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 _FlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInput<TDefinition> & _SearchInput<TDefinition>\n : _SearchInput<TDefinition>\nexport type _StrictFlatInput<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasSearch<TDefinition> extends true\n ? _StrictSearchInput<TDefinition> & _ParamsInput<TDefinition>\n : _ParamsInput<TDefinition>\n : HasSearch<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 _SearchInputStringOnly<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 _FlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? _ParamsInputStringOnly<TDefinition> & _SearchInputStringOnly<TDefinition>\n : _SearchInputStringOnly<TDefinition>\nexport type _StrictFlatInputStringOnly<TDefinition extends string> =\n HasParams<TDefinition> extends true\n ? HasSearch<TDefinition> extends true\n ? _StrictSearchInputStringOnly<TDefinition> & _ParamsInputStringOnly<TDefinition>\n : _ParamsInputStringOnly<TDefinition>\n : HasSearch<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 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\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\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<TParams extends object | undefined, Yes, No = never> = TParams extends undefined ? Yes : No\nexport type OnlyIfHasParams<TParams extends object | undefined, Yes, No = never> = TParams extends undefined ? No : Yes\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?: _SearchInput<any>\n abs?: boolean\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 _IsParent<T extends string, TParent extends string> = T extends TParent\n ? false\n : T extends `${TParent}${string}`\n ? true\n : false\nexport type _IsChildren<T extends string, TChildren extends string> = TChildren extends T\n ? false\n : TChildren 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"],"mappings":"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","names":["paramsInput","searchInput","hashInput"]}
|
package/package.json
CHANGED
package/src/index.test.ts
CHANGED
|
@@ -9,7 +9,9 @@ import type {
|
|
|
9
9
|
ExtractRoutesKeys,
|
|
10
10
|
FlatInput,
|
|
11
11
|
FlatInputStringOnly,
|
|
12
|
+
FlatInputWithHash,
|
|
12
13
|
FlatOutput,
|
|
14
|
+
FlatOutputWithHash,
|
|
13
15
|
HasParams,
|
|
14
16
|
HasSearch,
|
|
15
17
|
IsChildren,
|
|
@@ -24,7 +26,9 @@ import type {
|
|
|
24
26
|
SearchOutput,
|
|
25
27
|
StrictFlatInput,
|
|
26
28
|
StrictFlatInputStringOnly,
|
|
29
|
+
StrictFlatInputWithHash,
|
|
27
30
|
StrictFlatOutput,
|
|
31
|
+
StrictFlatOutputWithHash,
|
|
28
32
|
StrictSearchInput,
|
|
29
33
|
StrictSearchInputStringOnly,
|
|
30
34
|
StrictSearchOutput,
|
|
@@ -576,6 +580,82 @@ describe('type utilities', () => {
|
|
|
576
580
|
>()
|
|
577
581
|
})
|
|
578
582
|
|
|
583
|
+
it('FlatInputWithHash', () => {
|
|
584
|
+
type T1 = FlatInputWithHash<'/path&x&y'>
|
|
585
|
+
expectTypeOf<T1>().toEqualTypeOf<
|
|
586
|
+
{ hash?: string | number } & Partial<{
|
|
587
|
+
x: string | number
|
|
588
|
+
y: string | number
|
|
589
|
+
}> &
|
|
590
|
+
Record<string, string | number>
|
|
591
|
+
>()
|
|
592
|
+
|
|
593
|
+
type T2 = FlatInputWithHash<'/path/:id&x&y'>
|
|
594
|
+
expectTypeOf<T2>().toEqualTypeOf<
|
|
595
|
+
{ hash?: string | number } & {
|
|
596
|
+
id: string | number
|
|
597
|
+
} & Partial<{
|
|
598
|
+
x: string | number
|
|
599
|
+
y: string | number
|
|
600
|
+
}> &
|
|
601
|
+
Record<string, string | number>
|
|
602
|
+
>()
|
|
603
|
+
})
|
|
604
|
+
it('StrictFlatInputWithHash', () => {
|
|
605
|
+
type T1 = StrictFlatInputWithHash<'/path&x&y'>
|
|
606
|
+
expectTypeOf<T1>().toEqualTypeOf<{ hash?: string | number } & { x?: string | number; y?: string | number }>()
|
|
607
|
+
type T2 = StrictFlatInputWithHash<'/path/:id&x&y'>
|
|
608
|
+
expectTypeOf<T2>().toEqualTypeOf<
|
|
609
|
+
{ hash?: string | number } & Partial<{
|
|
610
|
+
x: string | number
|
|
611
|
+
y: string | number
|
|
612
|
+
}> & {
|
|
613
|
+
id: string | number
|
|
614
|
+
}
|
|
615
|
+
>()
|
|
616
|
+
})
|
|
617
|
+
|
|
618
|
+
it('FlatOutputWithHash', () => {
|
|
619
|
+
type T1 = FlatOutputWithHash<'/path&x&y'>
|
|
620
|
+
expectTypeOf<T1>().toEqualTypeOf<
|
|
621
|
+
{
|
|
622
|
+
[x: string]: string | undefined
|
|
623
|
+
x?: string | undefined
|
|
624
|
+
y?: string | undefined
|
|
625
|
+
} & {
|
|
626
|
+
hash?: string | undefined
|
|
627
|
+
}
|
|
628
|
+
>()
|
|
629
|
+
|
|
630
|
+
type T2 = FlatOutputWithHash<'/path/:id&x&y'>
|
|
631
|
+
expectTypeOf<T2>().toEqualTypeOf<
|
|
632
|
+
{
|
|
633
|
+
id: string
|
|
634
|
+
} & {
|
|
635
|
+
[x: string]: string | undefined
|
|
636
|
+
x?: string | undefined
|
|
637
|
+
y?: string | undefined
|
|
638
|
+
} & {
|
|
639
|
+
hash?: string | undefined
|
|
640
|
+
}
|
|
641
|
+
>()
|
|
642
|
+
})
|
|
643
|
+
it('StrictFlatOutputWithHash', () => {
|
|
644
|
+
type T1 = StrictFlatOutputWithHash<'/path&x&y'>
|
|
645
|
+
expectTypeOf<T1>().toEqualTypeOf<
|
|
646
|
+
{ x?: string | undefined; y?: string | undefined } & { hash?: string | undefined }
|
|
647
|
+
>()
|
|
648
|
+
type T2 = StrictFlatOutputWithHash<'/path/:id&x&y'>
|
|
649
|
+
expectTypeOf<T2>().toEqualTypeOf<
|
|
650
|
+
{ id: string } & Partial<{
|
|
651
|
+
x?: string | undefined
|
|
652
|
+
y?: string | undefined
|
|
653
|
+
}> & {
|
|
654
|
+
hash?: string | undefined
|
|
655
|
+
}
|
|
656
|
+
>()
|
|
657
|
+
})
|
|
658
|
+
|
|
579
659
|
it('ParamsInputStringOnly', () => {
|
|
580
660
|
expectTypeOf<ParamsInputStringOnly<'/path'>>().toEqualTypeOf<Record<never, never>>()
|
|
581
661
|
expectTypeOf<ParamsInputStringOnly<'/path/:id'>>().toEqualTypeOf<{ id: string }>()
|
package/src/index.ts
CHANGED
|
@@ -147,66 +147,66 @@ export class Route0<TDefinition extends string> {
|
|
|
147
147
|
// get(
|
|
148
148
|
// input: OnlyIfHasParams<
|
|
149
149
|
// _ParamsDefinition<TDefinition>,
|
|
150
|
-
// WithParamsInput<TDefinition, { search?: undefined; abs?: false; hash?: string }>
|
|
150
|
+
// WithParamsInput<TDefinition, { search?: undefined; abs?: false; hash?: string | number }>
|
|
151
151
|
// >,
|
|
152
152
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>
|
|
153
153
|
// get(
|
|
154
154
|
// input: OnlyIfHasParams<
|
|
155
155
|
// _ParamsDefinition<TDefinition>,
|
|
156
|
-
// WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs?: false; hash?: string }>
|
|
156
|
+
// WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs?: false; hash?: string | number }>
|
|
157
157
|
// >,
|
|
158
158
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>
|
|
159
159
|
// get(
|
|
160
160
|
// input: OnlyIfHasParams<
|
|
161
161
|
// _ParamsDefinition<TDefinition>,
|
|
162
|
-
// WithParamsInput<TDefinition, { search?: undefined; abs: true; hash?: string }>
|
|
162
|
+
// WithParamsInput<TDefinition, { search?: undefined; abs: true; hash?: string | number }>
|
|
163
163
|
// >,
|
|
164
164
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>
|
|
165
165
|
// get(
|
|
166
166
|
// input: OnlyIfHasParams<
|
|
167
167
|
// _ParamsDefinition<TDefinition>,
|
|
168
|
-
// WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string }>
|
|
168
|
+
// WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }>
|
|
169
169
|
// >,
|
|
170
170
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>
|
|
171
171
|
|
|
172
172
|
// get(
|
|
173
173
|
// input: OnlyIfHasParams<
|
|
174
174
|
// _ParamsDefinition<TDefinition>,
|
|
175
|
-
// WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: false; hash?: string }>
|
|
175
|
+
// WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: false; hash?: string | number }>
|
|
176
176
|
// >,
|
|
177
177
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>
|
|
178
178
|
// get(
|
|
179
179
|
// input: OnlyIfHasParams<
|
|
180
180
|
// _ParamsDefinition<TDefinition>,
|
|
181
|
-
// WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string }>
|
|
181
|
+
// WithParamsInput<TDefinition, { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }>
|
|
182
182
|
// >,
|
|
183
183
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>
|
|
184
184
|
|
|
185
185
|
get(
|
|
186
186
|
input: OnlyIfHasParams<
|
|
187
187
|
_ParamsDefinition<TDefinition>,
|
|
188
|
-
WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string }>
|
|
188
|
+
WithParamsInput<TDefinition, { search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string | number }>
|
|
189
189
|
>,
|
|
190
190
|
): OnlyIfHasParams<_ParamsDefinition<TDefinition>, string>
|
|
191
191
|
|
|
192
192
|
// no params
|
|
193
193
|
// get(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>
|
|
194
194
|
// get(
|
|
195
|
-
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs?: false; hash?: string }>,
|
|
195
|
+
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs?: false; hash?: string | number }>,
|
|
196
196
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>
|
|
197
197
|
// get(
|
|
198
198
|
// input: OnlyIfNoParams<
|
|
199
199
|
// _ParamsDefinition<TDefinition>,
|
|
200
|
-
// { search: _SearchInput<TDefinition>; abs?: false; hash?: string }
|
|
200
|
+
// { search: _SearchInput<TDefinition>; abs?: false; hash?: string | number }
|
|
201
201
|
// >,
|
|
202
202
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>
|
|
203
203
|
// get(
|
|
204
|
-
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs: true; hash?: string }>,
|
|
204
|
+
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { search?: undefined; abs: true; hash?: string | number }>,
|
|
205
205
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>
|
|
206
206
|
// get(
|
|
207
207
|
// input: OnlyIfNoParams<
|
|
208
208
|
// _ParamsDefinition<TDefinition>,
|
|
209
|
-
// { search: _SearchInput<TDefinition>; abs: true; hash?: string }
|
|
209
|
+
// { search: _SearchInput<TDefinition>; abs: true; hash?: string | number }
|
|
210
210
|
// >,
|
|
211
211
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>
|
|
212
212
|
|
|
@@ -214,13 +214,13 @@ export class Route0<TDefinition extends string> {
|
|
|
214
214
|
// get(
|
|
215
215
|
// input: OnlyIfNoParams<
|
|
216
216
|
// _ParamsDefinition<TDefinition>,
|
|
217
|
-
// { search?: _SearchInput<TDefinition>; abs?: false; hash?: string }
|
|
217
|
+
// { search?: _SearchInput<TDefinition>; abs?: false; hash?: string | number }
|
|
218
218
|
// >,
|
|
219
219
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>
|
|
220
220
|
// get(
|
|
221
221
|
// input: OnlyIfNoParams<
|
|
222
222
|
// _ParamsDefinition<TDefinition>,
|
|
223
|
-
// { search?: _SearchInput<TDefinition>; abs: true; hash?: string }
|
|
223
|
+
// { search?: _SearchInput<TDefinition>; abs: true; hash?: string | number }
|
|
224
224
|
// >,
|
|
225
225
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>
|
|
226
226
|
|
|
@@ -228,7 +228,7 @@ export class Route0<TDefinition extends string> {
|
|
|
228
228
|
get(
|
|
229
229
|
input: OnlyIfNoParams<
|
|
230
230
|
_ParamsDefinition<TDefinition>,
|
|
231
|
-
{ search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string }
|
|
231
|
+
{ search?: _SearchInput<TDefinition>; abs?: boolean; hash?: string | number }
|
|
232
232
|
>,
|
|
233
233
|
): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>
|
|
234
234
|
|
|
@@ -284,24 +284,24 @@ export class Route0<TDefinition extends string> {
|
|
|
284
284
|
|
|
285
285
|
// has params
|
|
286
286
|
// flat(
|
|
287
|
-
// input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string }>>,
|
|
287
|
+
// input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string | number }>>,
|
|
288
288
|
// abs?: false,
|
|
289
289
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>
|
|
290
290
|
// flat(
|
|
291
291
|
// input: OnlyIfHasParams<
|
|
292
292
|
// _ParamsDefinition<TDefinition>,
|
|
293
|
-
// WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>
|
|
293
|
+
// WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>
|
|
294
294
|
// >,
|
|
295
295
|
// abs?: false,
|
|
296
296
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>
|
|
297
297
|
// flat(
|
|
298
|
-
// input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string }>>,
|
|
298
|
+
// input: OnlyIfHasParams<_ParamsDefinition<TDefinition>, WithParamsInput<TDefinition, { hash?: string | number }>>,
|
|
299
299
|
// abs: true,
|
|
300
300
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>
|
|
301
301
|
// flat(
|
|
302
302
|
// input: OnlyIfHasParams<
|
|
303
303
|
// _ParamsDefinition<TDefinition>,
|
|
304
|
-
// WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>
|
|
304
|
+
// WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>
|
|
305
305
|
// >,
|
|
306
306
|
// abs: true,
|
|
307
307
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>
|
|
@@ -309,14 +309,14 @@ export class Route0<TDefinition extends string> {
|
|
|
309
309
|
// flat(
|
|
310
310
|
// input: OnlyIfHasParams<
|
|
311
311
|
// _ParamsDefinition<TDefinition>,
|
|
312
|
-
// WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>
|
|
312
|
+
// WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>
|
|
313
313
|
// >,
|
|
314
314
|
// abs?: false,
|
|
315
315
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>
|
|
316
316
|
// flat(
|
|
317
317
|
// input: OnlyIfHasParams<
|
|
318
318
|
// _ParamsDefinition<TDefinition>,
|
|
319
|
-
// WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>
|
|
319
|
+
// WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>
|
|
320
320
|
// >,
|
|
321
321
|
// abs: true,
|
|
322
322
|
// ): OnlyIfHasParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>
|
|
@@ -324,7 +324,7 @@ export class Route0<TDefinition extends string> {
|
|
|
324
324
|
flat(
|
|
325
325
|
input: OnlyIfHasParams<
|
|
326
326
|
_ParamsDefinition<TDefinition>,
|
|
327
|
-
WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string }>
|
|
327
|
+
WithParamsInput<TDefinition, _SearchInput<TDefinition> & { hash?: string | number }>
|
|
328
328
|
>,
|
|
329
329
|
abs?: boolean,
|
|
330
330
|
): OnlyIfHasParams<_ParamsDefinition<TDefinition>, string>
|
|
@@ -332,35 +332,35 @@ export class Route0<TDefinition extends string> {
|
|
|
332
332
|
// no params
|
|
333
333
|
// flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathOnlyRouteValue<TDefinition>
|
|
334
334
|
// flat(
|
|
335
|
-
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string }>,
|
|
335
|
+
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string | number }>,
|
|
336
336
|
// abs?: false,
|
|
337
337
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathOnlyRouteValue<TDefinition>>
|
|
338
338
|
// flat(
|
|
339
|
-
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,
|
|
339
|
+
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,
|
|
340
340
|
// abs?: false,
|
|
341
341
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, WithSearchRouteValue<TDefinition>>
|
|
342
342
|
// flat(
|
|
343
|
-
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string }>,
|
|
343
|
+
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, { hash?: string | number }>,
|
|
344
344
|
// abs: true,
|
|
345
345
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathOnlyRouteValue<TDefinition>>
|
|
346
346
|
// flat(
|
|
347
|
-
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,
|
|
347
|
+
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,
|
|
348
348
|
// abs: true,
|
|
349
349
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsoluteWithSearchRouteValue<TDefinition>>
|
|
350
350
|
|
|
351
351
|
// flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): PathRouteValue<TDefinition>
|
|
352
352
|
// flat(
|
|
353
|
-
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,
|
|
353
|
+
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,
|
|
354
354
|
// abs?: false,
|
|
355
355
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, PathRouteValue<TDefinition>>
|
|
356
356
|
// flat(
|
|
357
|
-
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,
|
|
357
|
+
// input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,
|
|
358
358
|
// abs: true,
|
|
359
359
|
// ): OnlyIfNoParams<_ParamsDefinition<TDefinition>, AbsolutePathRouteValue<TDefinition>>
|
|
360
360
|
|
|
361
361
|
flat(...args: OnlyIfNoParams<_ParamsDefinition<TDefinition>, [], [never]>): string
|
|
362
362
|
flat(
|
|
363
|
-
input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string }>,
|
|
363
|
+
input: OnlyIfNoParams<_ParamsDefinition<TDefinition>, _SearchInput<TDefinition> & { hash?: string | number }>,
|
|
364
364
|
abs?: boolean,
|
|
365
365
|
): OnlyIfNoParams<_ParamsDefinition<TDefinition>, string>
|
|
366
366
|
|
|
@@ -1048,11 +1048,17 @@ export type FlatOutput<T extends AnyRoute | string = string> =
|
|
|
1048
1048
|
HasParams<Definition<T>> extends true ? ParamsOutput<T> & SearchOutput<T> : SearchOutput<T>
|
|
1049
1049
|
export type StrictFlatOutput<T extends AnyRoute | string> =
|
|
1050
1050
|
HasParams<Definition<T>> extends true ? ParamsOutput<T> & StrictSearchOutput<T> : StrictSearchOutput<T>
|
|
1051
|
+
export type FlatOutputWithHash<T extends AnyRoute | string = string> = FlatOutput<T> & { hash?: string | undefined }
|
|
1052
|
+
export type StrictFlatOutputWithHash<T extends AnyRoute | string> = StrictFlatOutput<T> & { hash?: string | undefined }
|
|
1051
1053
|
export type ParamsInput<T extends AnyRoute | string = string> = _ParamsInput<PathDefinition<T>>
|
|
1052
1054
|
export type SearchInput<T extends AnyRoute | string = string> = _SearchInput<Definition<T>>
|
|
1053
1055
|
export type StrictSearchInput<T extends AnyRoute | string> = _StrictSearchInput<Definition<T>>
|
|
1054
1056
|
export type FlatInput<T extends AnyRoute | string> = _FlatInput<Definition<T>>
|
|
1055
1057
|
export type StrictFlatInput<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>>
|
|
1058
|
+
export type FlatInputWithHash<T extends AnyRoute | string> = _FlatInput<Definition<T>> & { hash?: string | number }
|
|
1059
|
+
export type StrictFlatInputWithHash<T extends AnyRoute | string> = _StrictFlatInput<Definition<T>> & {
|
|
1060
|
+
hash?: string | number
|
|
1061
|
+
}
|
|
1056
1062
|
export type CanInputBeEmpty<T extends AnyRoute | string> = HasParams<Definition<T>> extends true ? false : true
|
|
1057
1063
|
|
|
1058
1064
|
export type ParamsInputStringOnly<T extends AnyRoute | string = string> = _ParamsInputStringOnly<PathDefinition<T>>
|
|
@@ -1268,7 +1274,7 @@ export type WithParamsInput<
|
|
|
1268
1274
|
| {
|
|
1269
1275
|
search?: _SearchInput<any>
|
|
1270
1276
|
abs?: boolean
|
|
1271
|
-
hash?: string
|
|
1277
|
+
hash?: string | number
|
|
1272
1278
|
}
|
|
1273
1279
|
| undefined = undefined,
|
|
1274
1280
|
> = _ParamsInput<TDefinition> & (T extends undefined ? Record<never, never> : T)
|