@vielzeug/wayfinder 2.2.0 → 3.0.0

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.
Files changed (52) hide show
  1. package/README.md +3 -41
  2. package/dist/compile.cjs +1 -1
  3. package/dist/compile.cjs.map +1 -1
  4. package/dist/compile.d.ts +4 -4
  5. package/dist/compile.d.ts.map +1 -1
  6. package/dist/compile.js +1 -4
  7. package/dist/compile.js.map +1 -1
  8. package/dist/context.cjs +1 -1
  9. package/dist/context.cjs.map +1 -1
  10. package/dist/context.d.ts +6 -7
  11. package/dist/context.d.ts.map +1 -1
  12. package/dist/context.js +18 -17
  13. package/dist/context.js.map +1 -1
  14. package/dist/guards.cjs +1 -1
  15. package/dist/guards.cjs.map +1 -1
  16. package/dist/guards.js +1 -1
  17. package/dist/guards.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/path.cjs +1 -1
  21. package/dist/path.cjs.map +1 -1
  22. package/dist/path.d.ts +4 -5
  23. package/dist/path.d.ts.map +1 -1
  24. package/dist/path.js +1 -10
  25. package/dist/path.js.map +1 -1
  26. package/dist/router.cjs +1 -1
  27. package/dist/router.cjs.map +1 -1
  28. package/dist/router.d.ts +14 -22
  29. package/dist/router.d.ts.map +1 -1
  30. package/dist/router.js +190 -238
  31. package/dist/router.js.map +1 -1
  32. package/dist/types.d.ts +27 -39
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/wayfinder.cjs +1 -1
  35. package/dist/wayfinder.cjs.map +1 -1
  36. package/dist/wayfinder.iife.js +1 -1
  37. package/dist/wayfinder.iife.js.map +1 -1
  38. package/dist/wayfinder.js +1 -1
  39. package/dist/wayfinder.js.map +1 -1
  40. package/package.json +6 -6
  41. package/dist/hydration.cjs +0 -2
  42. package/dist/hydration.cjs.map +0 -1
  43. package/dist/hydration.d.ts +0 -7
  44. package/dist/hydration.d.ts.map +0 -1
  45. package/dist/hydration.js +0 -55
  46. package/dist/hydration.js.map +0 -1
  47. package/dist/preload.cjs +0 -2
  48. package/dist/preload.cjs.map +0 -1
  49. package/dist/preload.d.ts +0 -18
  50. package/dist/preload.d.ts.map +0 -1
  51. package/dist/preload.js +0 -30
  52. package/dist/preload.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","names":["#base","#globalMiddleware","#globalCoerceSearch","#history","#records","#routesByName","#scroll","#useViewTransition","#onError","#beforeLeaveBlockers","#navigation","#disposeController","#listeners","#notFoundRecord","#hydration","#preload","#unlistenHistory","#currentState","#registerHistoryListener","#lastHref","#handleRoute","#hrefForLocation","#runInBackground","#assertNotDisposed","#navigateToPath","#resolveUrl","#loadDataDrain","#doPreload","#reportError","#disposed","#handleHistoryNavigation","#navigationDestination","#drainGenerator","#loadDataStream","#notifyListeners","#runStreamingLoader","#prepareRoute","#resolveDestination","#runTerminal","#runWithTransition","#locationFromPath","#applyScroll"],"sources":["../src/router.ts"],"sourcesContent":["import { createNavigationCoordinator, type NavigationAttempt } from './_navigation';\nimport { compileRoutes } from './compile';\nimport {\n buildMatchBranch,\n createRouteContext,\n createRouteState,\n executeMiddlewarePipeline,\n reportError,\n} from './context';\nimport { WayfinderDisposedError, WayfinderRedirectLoopError, WayfinderRouteError } from './errors';\nimport { type RegisteredBlocker, runLeaveBlockers } from './guards';\nimport { createBrowserHistory } from './history';\nimport { createHydrationManager } from './hydration';\nimport {\n buildPreloadKey,\n buildUrl,\n joinPaths,\n matchesPrefix,\n matchRouteFor,\n normalizePath,\n parseQuery,\n readLocation,\n stripBase,\n} from './path';\nimport { createPreloadManager } from './preload';\nimport type {\n BeforeLeaveBlocker,\n BeforeLeaveOptions,\n CoerceSearchFn,\n DataContext,\n DataFn,\n HistoryDriver,\n IsActiveOptions,\n Middleware,\n NamedNavigationTarget,\n NavigateOptions,\n NavigationDestination,\n NavigationStatus,\n PathParams,\n QueryParams,\n RawNavigationTarget,\n ResolvedQueryParams,\n RouteBranchDef,\n RouteContext,\n RouteLocation,\n RouteMatchBranch,\n RouteName,\n RouteParams,\n RoutePathByName,\n RouteRecord,\n RouterErrorContext,\n RouterOptions,\n RouteState,\n RouteTable,\n Unsubscribe,\n} from './types';\n\n// ─── Module-level helpers (formerly in resolve.ts) ────────────────────────────\n\nfunction getRouteByName<TMeta, TComponent>(\n name: string,\n routesByName: ReadonlyMap<string, RouteRecord<TMeta, TComponent>>,\n): RouteRecord<TMeta, TComponent> {\n const route = routesByName.get(name);\n\n if (route) return route;\n\n const available = [...routesByName.keys()].join(', ');\n\n throw new WayfinderRouteError(\n available ? `Unknown route name: ${name}. Available routes: ${available}` : `Unknown route name: ${name}`,\n );\n}\n\nfunction resolveTarget<TMeta, TComponent>(\n target: { path: string } | { hash?: string; name: string; params?: RouteParams; query?: ResolvedQueryParams },\n routesByName: ReadonlyMap<string, RouteRecord<TMeta, TComponent>>,\n base = '/',\n): string {\n if ('path' in target) return target.path;\n\n const route = getRouteByName(target.name, routesByName);\n const path = buildUrl(base, route.path, target.params, target.query);\n\n return target.hash ? `${path}#${target.hash}` : path;\n}\n\n// ─── Internal helper ─────────────────────────────────────────────────────────\n\nconst ERROR_CONTEXT = Symbol('wayfinder.errorContext');\n\nfunction attachErrorContext(error: unknown, context: RouterErrorContext): void {\n if (error !== null && typeof error === 'object') {\n (error as Record<symbol, RouterErrorContext>)[ERROR_CONTEXT] = context;\n }\n}\n\nfunction getErrorContext(error: unknown): RouterErrorContext | undefined {\n if (error !== null && typeof error === 'object') {\n return (error as Record<symbol, RouterErrorContext | undefined>)[ERROR_CONTEXT];\n }\n\n return undefined;\n}\n\n// ─── Internal types ───────────────────────────────────────────────────────────\n\ntype NavigationDecision<TMeta, TComponent> =\n | {\n branch: RouteMatchBranch<TMeta, TComponent>;\n location: RouteLocation;\n params: RouteParams;\n record: RouteRecord<TMeta, TComponent>;\n resolvedQuery: ResolvedQueryParams;\n type: 'matched';\n }\n | { location: RouteLocation; params: RouteParams; type: 'unmatched' }\n | { location: RouteLocation; params: RouteParams; redirectTo: string; type: 'redirect' };\n\n// ─── Streaming helper ─────────────────────────────────────────────────────────\n\nfunction isAsyncGenerator(value: unknown): value is AsyncGenerator<unknown, unknown> {\n return (\n value !== null &&\n typeof value === 'object' &&\n typeof (value as AsyncGenerator)[Symbol.asyncIterator] === 'function' &&\n typeof (value as AsyncGenerator).next === 'function' &&\n typeof (value as AsyncGenerator).return === 'function'\n );\n}\n\n// ─── Router class ─────────────────────────────────────────────────────────────\n\nclass Router<TRoutes extends RouteTable, TMeta = unknown, TComponent = unknown> {\n readonly #base: string;\n readonly #globalMiddleware: readonly Middleware[];\n readonly #globalCoerceSearch?: CoerceSearchFn;\n readonly #history: HistoryDriver;\n readonly #records: readonly RouteRecord<TMeta, TComponent>[];\n readonly #routesByName: ReadonlyMap<string, RouteRecord<TMeta, TComponent>>;\n readonly #scroll?: RouterOptions<TRoutes, TMeta, TComponent>['scroll'];\n readonly #useViewTransition: boolean;\n readonly #onError?: RouterOptions<TRoutes, TMeta, TComponent>['onError'];\n\n // Mutable navigation state\n readonly #beforeLeaveBlockers = new Set<RegisteredBlocker>();\n readonly #navigation = createNavigationCoordinator();\n #currentState: RouteState<TMeta, TComponent>;\n #disposed = false;\n readonly #disposeController = new AbortController();\n #lastHref = '/';\n readonly #listeners = new Set<(state: RouteState<TMeta, TComponent>) => void>();\n // Compiled notFound fallback record\n readonly #notFoundRecord: RouteRecord<TMeta, TComponent> | null;\n\n // Sub-managers\n readonly #hydration: ReturnType<typeof createHydrationManager<TMeta, TComponent>>;\n readonly #preload: ReturnType<typeof createPreloadManager>;\n\n readonly #unlistenHistory: () => void;\n\n /** Resolves when the constructor-triggered navigation has settled; rejects if it fails. */\n readonly ready: Promise<void>;\n\n constructor(options: RouterOptions<TRoutes, TMeta, TComponent>) {\n const compiled = compileRoutes(options);\n\n this.#base = normalizePath(options.base ?? '/');\n this.#globalMiddleware = (options.middleware ?? []) as unknown as Middleware[];\n this.#globalCoerceSearch = options.coerceSearch;\n this.#history = options.history ?? createBrowserHistory();\n this.#useViewTransition = options.viewTransition ?? false;\n this.#scroll = options.scroll;\n this.#onError = options.onError;\n this.#records = compiled.records as unknown as readonly RouteRecord<TMeta, TComponent>[];\n this.#routesByName = compiled.routesByName as unknown as ReadonlyMap<string, RouteRecord<TMeta, TComponent>>;\n this.#hydration = createHydrationManager<TMeta, TComponent>();\n this.#preload = createPreloadManager();\n this.#currentState = createRouteState<TMeta, TComponent>({\n location: { hash: '', historyState: null, pathname: '/', query: {} },\n matches: [] as RouteMatchBranch<TMeta, TComponent>,\n status: 'idle',\n });\n\n // Build a synthetic RouteRecord for the notFound fallback.\n if (options.notFound) {\n const nf = options.notFound;\n const leafDef: RouteBranchDef<TMeta, TComponent> = {\n component: nf.component as TComponent | undefined,\n dataFn: nf.data,\n meta: nf.meta as TMeta | undefined,\n name: '__notFound__',\n };\n\n this.#notFoundRecord = {\n branchDefs: [leafDef],\n leaf: leafDef,\n matcher: { paramNames: [], pattern: /(?:)/, prefixPattern: /(?:)/ },\n ownMiddleware: (nf.middleware ?? []) as unknown as Middleware[],\n path: '/*',\n };\n } else {\n this.#notFoundRecord = null;\n }\n\n this.#unlistenHistory = this.#registerHistoryListener();\n\n const { hash, pathname, search } = this.#history.location;\n\n this.#lastHref = `${pathname}${search}${hash}`;\n\n const attempt = this.#navigation.begin();\n\n this.ready = this.#handleRoute(\n attempt,\n readLocation(this.#base, this.#history),\n (location, replace) => {\n if (!attempt.isCurrent()) return;\n\n const href = this.#hrefForLocation(location);\n\n if (replace) this.#history.replace(href, location.historyState);\n\n this.#lastHref = href;\n },\n undefined,\n 0,\n false,\n ).then(() => undefined);\n this.#runInBackground(this.ready, { source: 'initial-navigation' });\n\n // Router actions are intentionally bound once so they remain safe when destructured.\n this.beforeLeave = this.beforeLeave.bind(this);\n this.dispose = this.dispose.bind(this);\n this.getSnapshot = this.getSnapshot.bind(this);\n this.isActive = this.isActive.bind(this);\n this.load = this.load.bind(this);\n this.match = this.match.bind(this);\n this.navigate = this.navigate.bind(this);\n this.preload = this.preload.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.url = this.url.bind(this);\n this.waitFor = this.waitFor.bind(this);\n }\n\n // ─── Public state ─────────────────────────────────────────────────────────\n\n /**\n * Returns the current immutable router state snapshot.\n *\n * Compatible with React's `useSyncExternalStore`:\n * ```ts\n * const state = useSyncExternalStore(\n * (cb) => router.subscribe(cb),\n * () => router.getSnapshot()\n * );\n * ```\n */\n getSnapshot(): RouteState<TMeta, TComponent> {\n return this.#currentState;\n }\n\n // ─── Subscription ─────────────────────────────────────────────────────────\n\n /**\n * Subscribe to state changes. The listener is called on each subsequent state change;\n * use `getSnapshot()` to read the current value immediately.\n */\n subscribe(listener: (state: RouteState<TMeta, TComponent>) => void): Unsubscribe {\n this.#assertNotDisposed();\n this.#listeners.add(listener);\n\n return () => {\n this.#listeners.delete(listener);\n };\n }\n\n // ─── Navigation ───────────────────────────────────────────────────────────\n\n /**\n * Navigate using a named route target or a raw path target.\n *\n * If a data loader throws after terminal execution begins, history has already committed\n * the destination and the returned Promise rejects with the loader error.\n */\n navigate(\n target: NamedNavigationTarget<TRoutes> | RawNavigationTarget | string,\n options?: NavigateOptions,\n ): Promise<void> {\n const normalized = typeof target === 'string' ? { path: target } : target;\n const destination = resolveTarget(normalized, this.#routesByName);\n\n return this.#navigateToPath(destination, options);\n }\n\n // ─── URL helpers ──────────────────────────────────────────────────────────\n\n /** Build a URL for a named route, including optional params and query string. */\n url<Name extends RouteName<TRoutes>>(\n name: Name,\n params?: PathParams<RoutePathByName<TRoutes, Name>>,\n query?: ResolvedQueryParams,\n ): string {\n const route = getRouteByName(name, this.#routesByName);\n\n return buildUrl(this.#base, route.path, params, query);\n }\n\n /** Returns true when the current location matches the named route by prefix (default) or exactly. */\n isActive<Name extends RouteName<TRoutes>>(name: Name, options: IsActiveOptions = {}): boolean {\n const route = getRouteByName(name, this.#routesByName);\n const pathname = this.#currentState.location.pathname;\n const exact = options.exact ?? false;\n\n return exact ? matchRouteFor(pathname, [route]).record != null : matchesPrefix(pathname, route);\n }\n\n /** Match a pathname to a route branch without running middleware or data loaders. Returns null for redirects or no match. */\n match(pathname: string): RouteMatchBranch<TMeta, TComponent> | null {\n const normalizedPathname = stripBase(normalizePath(pathname), this.#base);\n const { params, record } = matchRouteFor(normalizedPathname, this.#records);\n\n if (!record || record.redirect) return null;\n\n const defs = this.#hydration.effectiveDefs(record);\n const branch = buildMatchBranch(\n defs,\n params,\n normalizedPathname,\n defs.map(() => undefined),\n );\n\n return branch.length ? branch : null;\n }\n\n /**\n * Load a URL into a route state including data loader results, without modifying\n * router state or history. Follows declarative redirects and may resolve lazy modules.\n * Middleware is not executed — use `navigate()` when middleware side effects are needed.\n */\n async load(url: string, options?: { signal?: AbortSignal }): Promise<RouteState<TMeta, TComponent> | null> {\n const prepared = await this.#resolveUrl(url);\n\n if (prepared.type !== 'matched') return null;\n\n const { location, params, record, resolvedQuery } = prepared;\n const defs = this.#hydration.effectiveDefs(record);\n const hasData = defs.some((d) => d.dataFn != null);\n let dataResults: unknown[] = defs.map(() => undefined);\n let error: unknown;\n let status: 'error' | 'idle' = 'idle';\n\n if (hasData) {\n const effectiveSignal = options?.signal ?? new AbortController().signal;\n const branch = buildMatchBranch(defs, params, location.pathname, dataResults);\n const context = createRouteContext<TRoutes>(location, resolvedQuery, params, branch, () => Promise.resolve());\n\n try {\n dataResults = await this.#loadDataDrain(defs, context, effectiveSignal);\n } catch (e) {\n error = e;\n status = 'error';\n }\n }\n\n return createRouteState<TMeta, TComponent>({\n error,\n location,\n matches: buildMatchBranch(defs, params, location.pathname, dataResults),\n status,\n });\n }\n\n /**\n * Returns a Promise that resolves the next time the router reaches `status: 'idle'`\n * and the active matches include a route named `name`.\n *\n * - Resolves immediately if the router is already `idle` at `name`.\n * - Rejects immediately if the router is already in `status: 'error'`.\n * - If the router is currently `idle` at a **different** route and no navigation is in\n * flight, this promise will not resolve until a future navigation lands on `name`.\n * Typical use-case is awaiting a navigation you just triggered:\n * `router.navigate(target); await router.waitFor('routeName')`.\n * @throws {WayfinderDisposedError} if the router is disposed while the promise is pending,\n * or if called after the router has already been disposed.\n */\n waitFor(name: RouteName<TRoutes>): Promise<RouteState<TMeta, TComponent>> {\n this.#assertNotDisposed();\n\n return new Promise((resolve, reject) => {\n const matchesName = (state: RouteState<TMeta, TComponent>): boolean =>\n state.status === 'idle' && state.matches.some((m) => m.name === name);\n\n if (this.#currentState.status === 'error') {\n reject(this.#currentState.error);\n\n return;\n }\n\n if (matchesName(this.#currentState)) {\n resolve(this.#currentState);\n\n return;\n }\n\n const unsub = this.subscribe((state) => {\n if (matchesName(state)) {\n unsub();\n resolve(state);\n } else if (state.status === 'error') {\n unsub();\n reject(state.error);\n }\n });\n\n this.#disposeController.signal.addEventListener(\n 'abort',\n () => {\n unsub();\n reject(this.#disposeController.signal.reason);\n },\n { once: true },\n );\n });\n }\n\n // ─── Preload ──────────────────────────────────────────────────────────────\n\n /**\n * Eagerly execute the data loaders for a named route without navigating.\n * Results are cached and reused during the next navigation to the same route.\n * Concurrent calls for the same route are deduplicated.\n *\n * Pass the same `query` you intend to navigate with to ensure the cached result\n * matches the navigation's cache key. Without `query`, the preload key is the\n * bare path — any navigation with a query string will produce a cache miss.\n *\n * @throws {WayfinderDisposedError} if the router has already been disposed.\n */\n async preload<Name extends RouteName<TRoutes>>(\n name: Name,\n params?: PathParams<RoutePathByName<TRoutes, Name>>,\n query?: QueryParams,\n ): Promise<void> {\n this.#assertNotDisposed();\n\n const route = getRouteByName(name, this.#routesByName);\n const cacheKey = buildPreloadKey(this.#base, route.path, params as RouteParams, query);\n\n const inflight = this.#preload.getInflight(cacheKey);\n\n if (inflight) return inflight;\n\n const work = this.#doPreload(cacheKey, this.#disposeController.signal, query).finally(() => {\n this.#preload.untrack(cacheKey);\n });\n\n this.#preload.track(cacheKey, work);\n\n try {\n return await work;\n } catch (error) {\n if (this.#onError) this.#reportError(error, { source: 'preload' });\n\n throw error;\n }\n }\n\n // ─── Navigation guards ────────────────────────────────────────────────────\n\n /**\n * Register a leave guard. Called before user-triggered navigation attempts.\n * Return `false` to cancel; `true` to allow.\n * Returns a function that removes the guard.\n *\n * Use `options.routes` to scope the guard to specific routes (fires only when navigating\n * away from a route whose name appears in the array, checked against any node in the active branch).\n */\n beforeLeave(blocker: BeforeLeaveBlocker, options?: BeforeLeaveOptions<TRoutes>): Unsubscribe {\n this.#assertNotDisposed();\n\n const entry: RegisteredBlocker = {\n handler: blocker,\n routes: options?.routes as string[] | undefined,\n };\n\n this.#beforeLeaveBlockers.add(entry);\n\n return () => {\n this.#beforeLeaveBlockers.delete(entry);\n };\n }\n\n // ─── Lifecycle ────────────────────────────────────────────────────────────\n\n get disposalSignal(): AbortSignal {\n return this.#disposeController.signal;\n }\n\n get disposed(): boolean {\n return this.#disposed;\n }\n\n /** Dispose event listeners and prevent further router interaction. Idempotent. */\n dispose(): void {\n if (this.#disposed) return;\n\n this.#disposed = true;\n this.#beforeLeaveBlockers.clear();\n this.#listeners.clear();\n this.#navigation.invalidate(new WayfinderDisposedError());\n this.#unlistenHistory();\n // Abort the disposal signal last — waitFor() listeners clean themselves up via this signal.\n this.#disposeController.abort(new WayfinderDisposedError());\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n // ─── Private: assertions ──────────────────────────────────────────────────\n\n #assertNotDisposed(): void {\n if (this.#disposed) throw new WayfinderDisposedError();\n }\n\n // ─── Private: history listener ────────────────────────────────────────────\n\n #registerHistoryListener(): () => void {\n return this.#history.onPopstate(() => {\n const { hash, pathname, search } = this.#history.location;\n const newHref = `${pathname}${search}${hash}`;\n const previousHref = this.#lastHref;\n\n if (newHref === previousHref) return;\n\n this.#runInBackground(this.#handleHistoryNavigation(newHref, previousHref), { source: 'history-listener' });\n });\n }\n\n async #handleHistoryNavigation(newHref: string, previousHref: string): Promise<void> {\n const attempt = this.#navigation.begin();\n const activeMatchNames = this.#currentState.matches.map((m) => m.name);\n const destination = this.#navigationDestination(newHref);\n const allowed = await runLeaveBlockers(this.#beforeLeaveBlockers, activeMatchNames, destination);\n\n if (!attempt.isCurrent()) return;\n\n if (!allowed) {\n this.#history.replace(previousHref, this.#currentState.location.historyState);\n\n return;\n }\n\n const terminalRan = await this.#handleRoute(\n attempt,\n readLocation(this.#base, this.#history),\n (location, replace) => {\n if (!attempt.isCurrent()) return;\n\n const href = this.#hrefForLocation(location);\n\n if (replace) this.#history.replace(href, location.historyState);\n\n this.#lastHref = href;\n },\n undefined,\n 0,\n false,\n );\n\n if (attempt.isCurrent() && !terminalRan) {\n this.#history.replace(previousHref, this.#currentState.location.historyState);\n }\n }\n\n // ─── Private: error handling ──────────────────────────────────────────────\n\n #reportError(error: unknown, context: RouterErrorContext): void {\n reportError(error, context, this.#onError);\n }\n\n #runInBackground(promise: Promise<void>, context: RouterErrorContext): void {\n void promise.catch((error) => {\n this.#reportError(error, getErrorContext(error) ?? context);\n });\n }\n\n // ─── Private: listener notification ──────────────────────────────────────\n\n #notifyListeners(): void {\n this.#listeners.forEach((listener) => {\n listener(this.#currentState);\n });\n }\n\n // ─── Private: data loaders ────────────────────────────────────────────────\n\n /**\n * R10: Drain an async generator to completion. Private class method replaces\n * the module-level `drainGenerator` helper.\n */\n async #drainGenerator(gen: AsyncGenerator<unknown, unknown>, signal: AbortSignal): Promise<unknown> {\n let lastYield: unknown;\n\n while (true) {\n if (signal.aborted) {\n await gen.return(undefined as unknown).catch(() => undefined);\n\n return lastYield;\n }\n\n const { done, value } = await gen.next();\n\n if (done) return value ?? lastYield;\n\n lastYield = value;\n }\n }\n\n /**\n * Drain all data loaders to completion. Async generators are consumed entirely.\n * Used in `load()` and `preload()`. Per-def `onError` boundaries are applied.\n */\n async #loadDataDrain(\n defs: readonly RouteBranchDef<TMeta, TComponent>[],\n context: RouteContext<RouteParams, TRoutes>,\n signal: AbortSignal,\n ): Promise<unknown[]> {\n return Promise.all(\n defs.map(async (def) => {\n if (!def.dataFn) return undefined;\n\n const dataFn = def.dataFn as unknown as DataFn<RouteParams, TRoutes>;\n const raw = dataFn({ ...context, signal } as DataContext<RouteParams, TRoutes>);\n\n try {\n return isAsyncGenerator(raw) ? await this.#drainGenerator(raw, signal) : await (raw as Promise<unknown>);\n } catch (err) {\n if (def.onError) return def.onError(err, { ...context, signal } as unknown as DataContext);\n\n throw err;\n }\n }),\n );\n }\n\n /**\n * Run all data loaders in streaming mode. Generators yield partial states via `onPartial`.\n * Non-generator loaders are awaited normally. Per-def `onError` boundaries are applied.\n * Used during live navigation in `#runTerminal`.\n */\n async #loadDataStream(\n defs: readonly RouteBranchDef<TMeta, TComponent>[],\n context: RouteContext<RouteParams, TRoutes>,\n signal: AbortSignal,\n isCurrent: () => boolean,\n location: RouteLocation,\n params: RouteParams,\n ): Promise<unknown[]> {\n const rawResults: Array<AsyncGenerator<unknown, unknown> | unknown> = defs.map((def) => {\n if (!def.dataFn) return undefined;\n\n const dataFn = def.dataFn as unknown as DataFn<RouteParams, TRoutes>;\n\n return dataFn({ ...context, signal } as DataContext<RouteParams, TRoutes>);\n });\n\n const streamingIndices: number[] = [];\n\n const settled: unknown[] = await Promise.all(\n rawResults.map(async (raw, i) => {\n if (isAsyncGenerator(raw)) {\n streamingIndices.push(i);\n\n return undefined;\n }\n\n if (raw === undefined) return undefined;\n\n try {\n return await (raw as Promise<unknown>);\n } catch (err) {\n const def = defs[i]!;\n\n if (def.onError) return def.onError(err, { ...context, signal } as unknown as DataContext);\n\n throw err;\n }\n }),\n );\n\n if (streamingIndices.length === 0) return settled;\n\n const streamingData: unknown[] = [...settled];\n\n const onPartial = (value: unknown, idx: number): void => {\n if (!isCurrent()) return;\n\n streamingData[idx] = value;\n\n const nodeStatuses: NavigationStatus[] = defs.map((_, i) =>\n streamingIndices.includes(i) ? 'streaming' : 'idle',\n );\n\n this.#currentState = createRouteState<TMeta, TComponent>({\n location,\n matches: buildMatchBranch(defs, params, location.pathname, streamingData, nodeStatuses),\n status: 'streaming',\n });\n this.#notifyListeners();\n };\n\n await Promise.all(\n streamingIndices.map(async (idx) => {\n const gen = rawResults[idx] as AsyncGenerator<unknown, unknown>;\n\n try {\n streamingData[idx] = await this.#runStreamingLoader(gen, idx, signal, isCurrent, onPartial);\n } catch (err) {\n const def = defs[idx]!;\n\n if (def.onError) {\n streamingData[idx] = await def.onError(err, { ...context, signal } as unknown as DataContext);\n } else {\n throw err;\n }\n }\n }),\n );\n\n return streamingData;\n }\n\n // ─── Private: URL resolution ──────────────────────────────────────────────\n\n /** Parse a URL, call #prepareRoute, and follow declarative redirects up to 5 hops. */\n async #resolveUrl(url: string): Promise<NavigationDecision<TMeta, TComponent>> {\n let destination = url;\n\n for (let i = 0; i < 5; i += 1) {\n const parsed = new URL(destination, 'http://localhost');\n const location: RouteLocation = {\n hash: parsed.hash.replace(/^#/, ''),\n historyState: null,\n pathname: stripBase(parsed.pathname, this.#base),\n query: parseQuery(parsed.search),\n };\n\n const prepared = await this.#prepareRoute(location);\n\n if (prepared.type !== 'redirect') return prepared;\n\n destination = this.#resolveDestination(prepared.redirectTo);\n }\n\n throw new WayfinderRedirectLoopError();\n }\n\n // ─── Private: preload ─────────────────────────────────────────────────────\n\n async #doPreload(startUrl: string, signal: AbortSignal, query?: QueryParams): Promise<void> {\n const prepared = await this.#resolveUrl(startUrl);\n\n if (prepared.type !== 'matched') return;\n\n const { location, params, record, resolvedQuery } = prepared;\n const defs = this.#hydration.effectiveDefs(record);\n const hasData = defs.some((d) => d.dataFn != null);\n\n if (!hasData) return;\n\n const branch = buildMatchBranch(\n defs,\n params,\n location.pathname,\n defs.map(() => undefined),\n );\n const context = createRouteContext<TRoutes>(location, resolvedQuery, params, branch, () => Promise.resolve());\n const results = await this.#loadDataDrain(defs, context, signal);\n\n this.#preload.set(buildPreloadKey(this.#base, record.path, params, query ?? location.query), results);\n }\n\n // ─── Private: route preparation ───────────────────────────────────────────\n\n async #prepareRoute(location: RouteLocation): Promise<NavigationDecision<TMeta, TComponent>> {\n const { params, record } = matchRouteFor(location.pathname, this.#records);\n\n if (!record) {\n return { location, params, type: 'unmatched' };\n }\n\n if (record.redirect) {\n return {\n location,\n params,\n redirectTo: resolveTarget(record.redirect, this.#routesByName, this.#base),\n type: 'redirect',\n };\n }\n\n let resolvedQuery: ResolvedQueryParams = location.query;\n\n const coerce: CoerceSearchFn | undefined = record.coerceSearch ?? this.#globalCoerceSearch;\n\n if (coerce) {\n try {\n resolvedQuery = coerce(location.query);\n } catch (err) {\n this.#reportError(err, { source: 'coerce-search' });\n resolvedQuery = location.query;\n }\n }\n\n await this.#hydration.hydrate(record);\n\n const defs = this.#hydration.effectiveDefs(record);\n\n return {\n branch: buildMatchBranch(\n defs,\n params,\n location.pathname,\n defs.map(() => undefined),\n ),\n location,\n params,\n record,\n resolvedQuery,\n type: 'matched',\n };\n }\n\n // ─── Private: streaming data loader ──────────────────────────────────────\n\n /**\n * Drain an AsyncGenerator data loader, emitting `status: 'streaming'` for every yielded\n * partial value and returning the generator's return value as the final settled data.\n * Aborts cleanly when the signal fires or the navigation is superseded.\n */\n async #runStreamingLoader(\n generator: AsyncGenerator<unknown, unknown>,\n defIndex: number,\n signal: AbortSignal,\n isCurrent: () => boolean,\n onPartial: (data: unknown, defIndex: number) => void,\n ): Promise<unknown> {\n let lastValue: unknown;\n\n try {\n while (true) {\n if (signal.aborted || !isCurrent()) {\n await generator.return(undefined as unknown);\n\n return lastValue;\n }\n\n const { done, value } = await generator.next();\n\n if (done) return value ?? lastValue;\n\n lastValue = value;\n onPartial(value, defIndex);\n }\n } catch (err) {\n await generator.return(undefined as unknown).catch(() => undefined);\n throw err;\n }\n }\n\n // ─── Private: terminal (data only) ────────────────────────────────────────\n\n async #runTerminal(\n record: RouteRecord<TMeta, TComponent>,\n context: RouteContext<RouteParams, TRoutes>,\n location: RouteLocation,\n params: RouteParams,\n signal: AbortSignal,\n isCurrent: () => boolean,\n ): Promise<void> {\n if (!isCurrent()) return;\n\n const defs = this.#hydration.effectiveDefs(record);\n const hasData = defs.some((d) => d.dataFn != null);\n let dataResults: unknown[] = defs.map(() => undefined);\n\n if (hasData) {\n const preloadKey = buildPreloadKey(this.#base, record.path, params, location.query);\n const cached = this.#preload.consume(preloadKey);\n\n if (cached) {\n dataResults = cached;\n } else {\n // Emit per-node loading state while data is in-flight.\n const loadingStatuses: NavigationStatus[] = defs.map((d) => (d.dataFn ? 'loading' : 'idle'));\n\n this.#currentState = createRouteState<TMeta, TComponent>({\n location,\n matches: buildMatchBranch(defs, params, location.pathname, dataResults, loadingStatuses),\n status: 'loading',\n });\n this.#notifyListeners();\n\n try {\n dataResults = await this.#loadDataStream(defs, context, signal, isCurrent, location, params);\n } catch (error) {\n if (!isCurrent()) return;\n\n this.#currentState = createRouteState<TMeta, TComponent>({\n error,\n location,\n matches: buildMatchBranch(defs, params, location.pathname, dataResults),\n status: 'error',\n });\n // Attach enriched context so the eventual reporter uses it.\n attachErrorContext(error, { routeName: record.leaf.name, source: 'data-loader' });\n // Do not call #notifyListeners here — the finally block in #handleRoute does it once.\n throw error;\n }\n }\n }\n\n if (!isCurrent()) return;\n\n this.#currentState = createRouteState<TMeta, TComponent>({\n location,\n matches: buildMatchBranch(defs, params, location.pathname, dataResults),\n status: 'idle',\n });\n }\n\n // ─── Private: view transitions ────────────────────────────────────────────\n\n async #runWithTransition(run: () => Promise<void>, useTransition?: boolean): Promise<void> {\n const shouldUseTransition = useTransition ?? this.#useViewTransition;\n\n if (shouldUseTransition && typeof document !== 'undefined') {\n type ViewTransitionDocument = Document & {\n startViewTransition?: (callback: () => void | Promise<void>) => { finished: Promise<void> };\n };\n\n const doc = document as ViewTransitionDocument;\n\n if (doc.startViewTransition) {\n await doc.startViewTransition(run).finished;\n\n return;\n }\n }\n\n await run();\n }\n\n // ─── Private: main navigation orchestrator ────────────────────────────────\n\n /**\n * Declarative redirects reuse the active attempt and replace the final history entry.\n * Middleware redirects call `ctx.navigate()`, which starts a new attempt.\n */\n async #handleRoute(\n attempt: NavigationAttempt,\n currentLocation: RouteLocation,\n commit: (location: RouteLocation, replace: boolean) => void,\n useTransition?: boolean,\n depth = 0,\n replace = false,\n ): Promise<boolean> {\n const prevState = this.#currentState;\n const isCurrent = (): boolean => attempt.isCurrent() && !this.#disposed;\n const prepared = await this.#prepareRoute(currentLocation);\n\n if (!isCurrent()) return false;\n\n if (prepared.type === 'redirect') {\n if (depth >= 5) throw new WayfinderRedirectLoopError();\n\n return this.#handleRoute(\n attempt,\n this.#locationFromPath(prepared.redirectTo, currentLocation.historyState),\n commit,\n useTransition,\n depth + 1,\n true,\n );\n }\n\n if (prepared.type === 'unmatched') {\n // Fall back to notFound record when defined.\n if (this.#notFoundRecord) {\n const nfDefs = [this.#notFoundRecord.leaf];\n const nfBranch = buildMatchBranch(nfDefs, {}, currentLocation.pathname, [undefined]);\n let committed = false;\n let terminalRan = false;\n\n // Apply global coerceSearch to the unmatched location so notFound handlers\n // receive typed query params, consistent with matched-route behaviour.\n let nfResolvedQuery: ResolvedQueryParams = currentLocation.query;\n\n if (this.#globalCoerceSearch) {\n try {\n nfResolvedQuery = this.#globalCoerceSearch(currentLocation.query);\n } catch (err) {\n this.#reportError(err, { source: 'coerce-search' });\n }\n }\n\n const run = async (): Promise<void> => {\n if (!isCurrent()) return;\n\n const context = createRouteContext<TRoutes>(\n currentLocation,\n nfResolvedQuery,\n {},\n nfBranch,\n (target, options) => this.navigate(target, options),\n );\n\n terminalRan = await executeMiddlewarePipeline(\n context,\n [...this.#globalMiddleware, ...this.#notFoundRecord!.ownMiddleware] as unknown as Middleware<TRoutes>[],\n async () => {\n if (!isCurrent()) return;\n\n committed = true;\n commit(currentLocation, replace);\n\n if (!isCurrent()) return;\n\n await this.#runTerminal(this.#notFoundRecord!, context, currentLocation, {}, attempt.signal, isCurrent);\n },\n );\n };\n\n try {\n await this.#runWithTransition(run, useTransition);\n } finally {\n if (isCurrent() && committed) {\n this.#notifyListeners();\n this.#applyScroll(this.#currentState, prevState);\n }\n }\n\n return terminalRan && committed;\n }\n\n if (!isCurrent()) return false;\n\n commit(prepared.location, replace);\n\n if (!isCurrent()) return false;\n\n this.#currentState = createRouteState<TMeta, TComponent>({\n location: prepared.location,\n matches: [] as RouteMatchBranch<TMeta, TComponent>,\n status: 'idle',\n });\n this.#notifyListeners();\n this.#applyScroll(this.#currentState, prevState);\n\n return true;\n }\n\n const { branch, location, params, record, resolvedQuery } = prepared;\n let committed = false;\n let terminalRan = false;\n\n const run = async (): Promise<void> => {\n if (!isCurrent()) return;\n\n const context = createRouteContext<TRoutes>(location, resolvedQuery, params, branch, (target, options) =>\n this.navigate(target, options),\n );\n\n terminalRan = await executeMiddlewarePipeline(\n context,\n [...this.#globalMiddleware, ...record.ownMiddleware] as unknown as Middleware<TRoutes>[],\n async () => {\n if (!isCurrent()) return;\n\n committed = true;\n commit(location, replace);\n\n if (!isCurrent()) return;\n\n await this.#runTerminal(record, context, location, params, attempt.signal, isCurrent);\n },\n );\n };\n\n try {\n await this.#runWithTransition(run, useTransition);\n } finally {\n if (isCurrent() && committed) {\n this.#notifyListeners();\n this.#applyScroll(this.#currentState, prevState);\n }\n }\n\n return terminalRan && committed;\n }\n\n // ─── Private: scroll ─────────────────────────────────────────────────────\n\n #applyScroll(to: RouteState<TMeta, TComponent>, from: RouteState<TMeta, TComponent>): void {\n if (!this.#scroll || typeof window === 'undefined') return;\n\n const decision = this.#scroll(to, from);\n\n if (decision === 'preserve') return;\n\n if (decision === 'top') {\n window.scrollTo(0, 0);\n\n return;\n }\n\n window.scrollTo(decision.x, decision.y);\n }\n\n // ─── Private: destination resolution ─────────────────────────────────────\n\n #resolveDestination(path: string): string {\n const parsed = new URL(path, 'http://localhost');\n const normalizedPath = stripBase(parsed.pathname, this.#base);\n\n return `${joinPaths(this.#base, normalizedPath)}${parsed.search}${parsed.hash}`;\n }\n\n #locationFromPath(path: string, historyState: unknown): RouteLocation {\n const parsed = new URL(this.#resolveDestination(path), 'http://localhost');\n\n return {\n hash: parsed.hash.replace(/^#/, ''),\n historyState,\n pathname: stripBase(parsed.pathname, this.#base),\n query: parseQuery(parsed.search),\n };\n }\n\n #hrefForLocation(location: RouteLocation): string {\n const search = new URLSearchParams();\n\n for (const [key, value] of Object.entries(location.query)) {\n if (Array.isArray(value))\n value.forEach((item) => {\n search.append(key, item);\n });\n else search.set(key, value);\n }\n\n const query = search.toString();\n const hash = location.hash ? `#${location.hash}` : '';\n\n return `${joinPaths(this.#base, location.pathname)}${query ? `?${query}` : ''}${hash}`;\n }\n\n #navigationDestination(href: string): NavigationDestination {\n const parsed = new URL(href, 'http://localhost');\n const pathname = stripBase(parsed.pathname, this.#base);\n const { params, record } = matchRouteFor(pathname, this.#records);\n\n return {\n name: record?.leaf.name,\n params,\n pathname,\n query: parseQuery(parsed.search),\n };\n }\n\n /** User-initiated navigation. History changes only after middleware reaches the terminal stage. */\n async #navigateToPath(path: string, options: NavigateOptions = {}): Promise<void> {\n this.#assertNotDisposed();\n\n const destination = this.#resolveDestination(path);\n\n if (!options.force && destination === this.#lastHref) return;\n\n const attempt = this.#navigation.begin();\n const activeMatchNames = this.#currentState.matches.map((match) => match.name);\n const allowed = await runLeaveBlockers(\n this.#beforeLeaveBlockers,\n activeMatchNames,\n this.#navigationDestination(destination),\n );\n\n if (!attempt.isCurrent() || !allowed) return;\n\n await this.#handleRoute(\n attempt,\n this.#locationFromPath(destination, options.state),\n (location, replace) => {\n if (!attempt.isCurrent()) return;\n\n const href = this.#hrefForLocation(location);\n\n if (replace) this.#history.replace(href, location.historyState);\n else this.#history.push(href, location.historyState);\n\n this.#lastHref = href;\n },\n options.viewTransition,\n 0,\n options.replace ?? false,\n );\n }\n}\n\n// ─── Public factory ───────────────────────────────────────────────────────────\n\n/**\n * Create a new router instance from a route table.\n *\n * @example\n * const router = createRouter({\n * routes: {\n * home: { path: '/' },\n * userDetail: { path: '/users/:id', data: fetchUser },\n * },\n * });\n */\nexport function createRouter<const TRoutes extends RouteTable, TMeta = unknown, TComponent = unknown>(\n options: RouterOptions<TRoutes, TMeta, TComponent>,\n): Router<TRoutes, TMeta, TComponent> {\n return new Router(options);\n}\n\n// Export the Router type (not the constructor value) for type annotations.\nexport type { Router };\n"],"mappings":";;;;;;;;;;AA2DA,SAAS,EACP,GACA,GACgC;CAChC,IAAM,IAAQ,EAAa,IAAI,CAAI;CAEnC,IAAI,GAAO,OAAO;CAElB,IAAM,IAAY,CAAC,GAAG,EAAa,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;CAEpD,MAAM,IAAI,EACR,IAAY,uBAAuB,EAAK,sBAAsB,MAAc,uBAAuB,GACrG;AACF;AAEA,SAAS,EACP,GACA,GACA,IAAO,KACC;CACR,IAAI,UAAU,GAAQ,OAAO,EAAO;CAEpC,IAAM,IAAQ,EAAe,EAAO,MAAM,CAAY,GAChD,IAAO,EAAS,GAAM,EAAM,MAAM,EAAO,QAAQ,EAAO,KAAK;CAEnE,OAAO,EAAO,OAAO,GAAG,EAAK,GAAG,EAAO,SAAS;AAClD;AAIA,IAAM,IAAgB,OAAO,wBAAwB;AAErD,SAAS,EAAmB,GAAgB,GAAmC;CAC7E,AAAsB,OAAO,KAAU,YAAnC,MACF,EAA8C,KAAiB;AAEnE;AAEA,SAAS,EAAgB,GAAgD;CACvE,IAAsB,OAAO,KAAU,YAAnC,GACF,OAAQ,EAAyD;AAIrE;AAkBA,SAAS,EAAiB,GAA2D;CACnF,OAEE,OAAO,KAAU,cADjB,KAEA,OAAQ,EAAyB,OAAO,kBAAmB,cAC3D,OAAQ,EAAyB,QAAS,cAC1C,OAAQ,EAAyB,UAAW;AAEhD;AAIA,IAAM,IAAN,MAAgF;CAC9E;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA,qBAAgC,IAAI,IAAuB;CAC3D,KAAuB,EAA4B;CACnD;CACA,KAAY;CACZ,KAA8B,IAAI,gBAAgB;CAClD,KAAY;CACZ,qBAAsB,IAAI,IAAoD;CAE9E;CAGA;CACA;CAEA;CAGA;CAEA,YAAY,GAAoD;EAC9D,IAAM,IAAW,EAAc,CAAO;EAoBtC,IAlBA,KAAKA,KAAQ,EAAc,EAAQ,QAAQ,GAAG,GAC9C,KAAKC,KAAqB,EAAQ,cAAc,CAAC,GACjD,KAAKC,KAAsB,EAAQ,cACnC,KAAKC,KAAW,EAAQ,WAAW,EAAqB,GACxD,KAAKI,KAAqB,EAAQ,kBAAkB,IACpD,KAAKD,KAAU,EAAQ,QACvB,KAAKE,KAAW,EAAQ,SACxB,KAAKJ,KAAW,EAAS,SACzB,KAAKC,KAAgB,EAAS,cAC9B,KAAKS,KAAa,EAA0C,GAC5D,KAAKC,KAAW,EAAqB,GACrC,KAAKE,KAAgB,EAAoC;GACvD,UAAU;IAAE,MAAM;IAAI,cAAc;IAAM,UAAU;IAAK,OAAO,CAAC;GAAE;GACnE,SAAS,CAAC;GACV,QAAQ;EACV,CAAC,GAGG,EAAQ,UAAU;GACpB,IAAM,IAAK,EAAQ,UACb,IAA6C;IACjD,WAAW,EAAG;IACd,QAAQ,EAAG;IACX,MAAM,EAAG;IACT,MAAM;GACR;GAEA,KAAKJ,KAAkB;IACrB,YAAY,CAAC,CAAO;IACpB,MAAM;IACN,SAAS;KAAE,YAAY,CAAC;KAAG,SAAS;KAAQ,eAAe;IAAO;IAClE,eAAgB,EAAG,cAAc,CAAC;IAClC,MAAM;GACR;EACF,OACE,KAAKA,KAAkB;EAGzB,KAAKG,KAAmB,KAAKE,GAAyB;EAEtD,IAAM,EAAE,SAAM,aAAU,cAAW,KAAKf,GAAS;EAEjD,KAAKgB,KAAY,GAAG,IAAW,IAAS;EAExC,IAAM,IAAU,KAAKT,GAAY,MAAM;EA+BvC,AA7BA,KAAK,QAAQ,KAAKU,GAChB,GACA,EAAa,KAAKpB,IAAO,KAAKG,EAAQ,IACrC,GAAU,MAAY;GACrB,IAAI,CAAC,EAAQ,UAAU,GAAG;GAE1B,IAAM,IAAO,KAAKkB,GAAiB,CAAQ;GAI3C,AAFI,KAAS,KAAKlB,GAAS,QAAQ,GAAM,EAAS,YAAY,GAE9D,KAAKgB,KAAY;EACnB,GACA,KAAA,GACA,GACA,EACF,CAAC,CAAC,WAAW,KAAA,CAAS,GACtB,KAAKG,GAAiB,KAAK,OAAO,EAAE,QAAQ,qBAAqB,CAAC,GAGlE,KAAK,cAAc,KAAK,YAAY,KAAK,IAAI,GAC7C,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI,GACrC,KAAK,cAAc,KAAK,YAAY,KAAK,IAAI,GAC7C,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI,GACvC,KAAK,OAAO,KAAK,KAAK,KAAK,IAAI,GAC/B,KAAK,QAAQ,KAAK,MAAM,KAAK,IAAI,GACjC,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI,GACvC,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI,GACrC,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI,GACzC,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,GAC7B,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;CACvC;CAeA,cAA6C;EAC3C,OAAO,KAAKL;CACd;CAQA,UAAU,GAAuE;EAI/E,OAHA,KAAKM,GAAmB,GACxB,KAAKX,GAAW,IAAI,CAAQ,SAEf;GACX,KAAKA,GAAW,OAAO,CAAQ;EACjC;CACF;CAUA,SACE,GACA,GACe;EAEf,IAAM,IAAc,EADD,OAAO,KAAW,WAAW,EAAE,MAAM,EAAO,IAAI,GACrB,KAAKP,EAAa;EAEhE,OAAO,KAAKmB,GAAgB,GAAa,CAAO;CAClD;CAKA,IACE,GACA,GACA,GACQ;EACR,IAAM,IAAQ,EAAe,GAAM,KAAKnB,EAAa;EAErD,OAAO,EAAS,KAAKL,IAAO,EAAM,MAAM,GAAQ,CAAK;CACvD;CAGA,SAA0C,GAAY,IAA2B,CAAC,GAAY;EAC5F,IAAM,IAAQ,EAAe,GAAM,KAAKK,EAAa,GAC/C,IAAW,KAAKY,GAAc,SAAS;EAG7C,OAFc,EAAQ,SAAS,KAEhB,EAAc,GAAU,CAAC,CAAK,CAAC,CAAC,CAAC,UAAU,OAAO,EAAc,GAAU,CAAK;CAChG;CAGA,MAAM,GAA8D;EAClE,IAAM,IAAqB,EAAU,EAAc,CAAQ,GAAG,KAAKjB,EAAK,GAClE,EAAE,WAAQ,cAAW,EAAc,GAAoB,KAAKI,EAAQ;EAE1E,IAAI,CAAC,KAAU,EAAO,UAAU,OAAO;EAEvC,IAAM,IAAO,KAAKU,GAAW,cAAc,CAAM,GAC3C,IAAS,EACb,GACA,GACA,GACA,EAAK,UAAU,KAAA,CAAS,CAC1B;EAEA,OAAO,EAAO,SAAS,IAAS;CAClC;CAOA,MAAM,KAAK,GAAa,GAAmF;EACzG,IAAM,IAAW,MAAM,KAAKW,GAAY,CAAG;EAE3C,IAAI,EAAS,SAAS,WAAW,OAAO;EAExC,IAAM,EAAE,aAAU,WAAQ,WAAQ,qBAAkB,GAC9C,IAAO,KAAKX,GAAW,cAAc,CAAM,GAC3C,IAAU,EAAK,MAAM,MAAM,EAAE,UAAU,IAAI,GAC7C,IAAyB,EAAK,UAAU,KAAA,CAAS,GACjD,GACA,IAA2B;EAE/B,IAAI,GAAS;GACX,IAAM,IAAkB,GAAS,UAAU,IAAI,gBAAgB,CAAC,CAAC,QAC3D,IAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,CAAW,GACtE,IAAU,EAA4B,GAAU,GAAe,GAAQ,SAAc,QAAQ,QAAQ,CAAC;GAE5G,IAAI;IACF,IAAc,MAAM,KAAKY,GAAe,GAAM,GAAS,CAAe;GACxE,SAAS,GAAG;IAEV,AADA,IAAQ,GACR,IAAS;GACX;EACF;EAEA,OAAO,EAAoC;GACzC;GACA;GACA,SAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,CAAW;GACtE;EACF,CAAC;CACH;CAeA,QAAQ,GAAkE;EAGxE,OAFA,KAAKH,GAAmB,GAEjB,IAAI,SAAS,GAAS,MAAW;GACtC,IAAM,KAAe,MACnB,EAAM,WAAW,UAAU,EAAM,QAAQ,MAAM,MAAM,EAAE,SAAS,CAAI;GAEtE,IAAI,KAAKN,GAAc,WAAW,SAAS;IACzC,EAAO,KAAKA,GAAc,KAAK;IAE/B;GACF;GAEA,IAAI,EAAY,KAAKA,EAAa,GAAG;IACnC,EAAQ,KAAKA,EAAa;IAE1B;GACF;GAEA,IAAM,IAAQ,KAAK,WAAW,MAAU;IACtC,AAAI,EAAY,CAAK,KACnB,EAAM,GACN,EAAQ,CAAK,KACJ,EAAM,WAAW,YAC1B,EAAM,GACN,EAAO,EAAM,KAAK;GAEtB,CAAC;GAED,KAAKN,GAAmB,OAAO,iBAC7B,eACM;IAEJ,AADA,EAAM,GACN,EAAO,KAAKA,GAAmB,OAAO,MAAM;GAC9C,GACA,EAAE,MAAM,GAAK,CACf;EACF,CAAC;CACH;CAeA,MAAM,QACJ,GACA,GACA,GACe;EACf,KAAKY,GAAmB;EAExB,IAAM,IAAQ,EAAe,GAAM,KAAKlB,EAAa,GAC/C,IAAW,EAAgB,KAAKL,IAAO,EAAM,MAAM,GAAuB,CAAK,GAE/E,IAAW,KAAKe,GAAS,YAAY,CAAQ;EAEnD,IAAI,GAAU,OAAO;EAErB,IAAM,IAAO,KAAKY,GAAW,GAAU,KAAKhB,GAAmB,QAAQ,CAAK,CAAC,CAAC,cAAc;GAC1F,KAAKI,GAAS,QAAQ,CAAQ;EAChC,CAAC;EAED,KAAKA,GAAS,MAAM,GAAU,CAAI;EAElC,IAAI;GACF,OAAO,MAAM;EACf,SAAS,GAAO;GAGd,MAFI,KAAKP,MAAU,KAAKoB,GAAa,GAAO,EAAE,QAAQ,UAAU,CAAC,GAE3D;EACR;CACF;CAYA,YAAY,GAA6B,GAAoD;EAC3F,KAAKL,GAAmB;EAExB,IAAM,IAA2B;GAC/B,SAAS;GACT,QAAQ,GAAS;EACnB;EAIA,OAFA,KAAKd,GAAqB,IAAI,CAAK,SAEtB;GACX,KAAKA,GAAqB,OAAO,CAAK;EACxC;CACF;CAIA,IAAI,iBAA8B;EAChC,OAAO,KAAKE,GAAmB;CACjC;CAEA,IAAI,WAAoB;EACtB,OAAO,KAAKkB;CACd;CAGA,UAAgB;EACV,KAAKA,OAET,KAAKA,KAAY,IACjB,KAAKpB,GAAqB,MAAM,GAChC,KAAKG,GAAW,MAAM,GACtB,KAAKF,GAAY,WAAW,IAAI,EAAuB,CAAC,GACxD,KAAKM,GAAiB,GAEtB,KAAKL,GAAmB,MAAM,IAAI,EAAuB,CAAC;CAC5D;CAEA,CAAC,OAAO,WAAiB;EACvB,KAAK,QAAQ;CACf;CAIA,KAA2B;EACzB,IAAI,KAAKkB,IAAW,MAAM,IAAI,EAAuB;CACvD;CAIA,KAAuC;EACrC,OAAO,KAAK1B,GAAS,iBAAiB;GACpC,IAAM,EAAE,SAAM,aAAU,cAAW,KAAKA,GAAS,UAC3C,IAAU,GAAG,IAAW,IAAS,KACjC,IAAe,KAAKgB;GAEtB,MAAY,KAEhB,KAAKG,GAAiB,KAAKQ,GAAyB,GAAS,CAAY,GAAG,EAAE,QAAQ,mBAAmB,CAAC;EAC5G,CAAC;CACH;CAEA,MAAMA,GAAyB,GAAiB,GAAqC;EACnF,IAAM,IAAU,KAAKpB,GAAY,MAAM,GACjC,IAAmB,KAAKO,GAAc,QAAQ,KAAK,MAAM,EAAE,IAAI,GAC/D,IAAc,KAAKc,GAAuB,CAAO,GACjD,IAAU,MAAM,EAAiB,KAAKtB,IAAsB,GAAkB,CAAW;EAE/F,IAAI,CAAC,EAAQ,UAAU,GAAG;EAE1B,IAAI,CAAC,GAAS;GACZ,KAAKN,GAAS,QAAQ,GAAc,KAAKc,GAAc,SAAS,YAAY;GAE5E;EACF;EAEA,IAAM,IAAc,MAAM,KAAKG,GAC7B,GACA,EAAa,KAAKpB,IAAO,KAAKG,EAAQ,IACrC,GAAU,MAAY;GACrB,IAAI,CAAC,EAAQ,UAAU,GAAG;GAE1B,IAAM,IAAO,KAAKkB,GAAiB,CAAQ;GAI3C,AAFI,KAAS,KAAKlB,GAAS,QAAQ,GAAM,EAAS,YAAY,GAE9D,KAAKgB,KAAY;EACnB,GACA,KAAA,GACA,GACA,EACF;EAEA,AAAI,EAAQ,UAAU,KAAK,CAAC,KAC1B,KAAKhB,GAAS,QAAQ,GAAc,KAAKc,GAAc,SAAS,YAAY;CAEhF;CAIA,GAAa,GAAgB,GAAmC;EAC9D,EAAY,GAAO,GAAS,KAAKT,EAAQ;CAC3C;CAEA,GAAiB,GAAwB,GAAmC;EAC1E,EAAa,OAAO,MAAU;GAC5B,KAAKoB,GAAa,GAAO,EAAgB,CAAK,KAAK,CAAO;EAC5D,CAAC;CACH;CAIA,KAAyB;EACvB,KAAKhB,GAAW,SAAS,MAAa;GACpC,EAAS,KAAKK,EAAa;EAC7B,CAAC;CACH;CAQA,MAAMe,GAAgB,GAAuC,GAAuC;EAClG,IAAI;EAEJ,SAAa;GACX,IAAI,EAAO,SAGT,OAFA,MAAM,EAAI,OAAO,KAAA,CAAoB,CAAC,CAAC,YAAY,KAAA,CAAS,GAErD;GAGT,IAAM,EAAE,SAAM,aAAU,MAAM,EAAI,KAAK;GAEvC,IAAI,GAAM,OAAO,KAAS;GAE1B,IAAY;EACd;CACF;CAMA,MAAMN,GACJ,GACA,GACA,GACoB;EACpB,OAAO,QAAQ,IACb,EAAK,IAAI,OAAO,MAAQ;GACtB,IAAI,CAAC,EAAI,QAAQ;GAEjB,IAAM,IAAS,EAAI,QACb,IAAM,EAAO;IAAE,GAAG;IAAS;GAAO,CAAsC;GAE9E,IAAI;IACF,OAAO,EAAiB,CAAG,IAAI,MAAM,KAAKM,GAAgB,GAAK,CAAM,IAAI,MAAO;GAClF,SAAS,GAAK;IACZ,IAAI,EAAI,SAAS,OAAO,EAAI,QAAQ,GAAK;KAAE,GAAG;KAAS;IAAO,CAA2B;IAEzF,MAAM;GACR;EACF,CAAC,CACH;CACF;CAOA,MAAMC,GACJ,GACA,GACA,GACA,GACA,GACA,GACoB;EACpB,IAAM,IAAgE,EAAK,KAAK,MAAQ;GACtF,IAAI,CAAC,EAAI,QAAQ;GAEjB,IAAM,IAAS,EAAI;GAEnB,OAAO,EAAO;IAAE,GAAG;IAAS;GAAO,CAAsC;EAC3E,CAAC,GAEK,IAA6B,CAAC,GAE9B,IAAqB,MAAM,QAAQ,IACvC,EAAW,IAAI,OAAO,GAAK,MAAM;GAC/B,IAAI,EAAiB,CAAG,GAAG;IACzB,EAAiB,KAAK,CAAC;IAEvB;GACF;GAEI,UAAQ,KAAA,GAEZ,IAAI;IACF,OAAO,MAAO;GAChB,SAAS,GAAK;IACZ,IAAM,IAAM,EAAK;IAEjB,IAAI,EAAI,SAAS,OAAO,EAAI,QAAQ,GAAK;KAAE,GAAG;KAAS;IAAO,CAA2B;IAEzF,MAAM;GACR;EACF,CAAC,CACH;EAEA,IAAI,EAAiB,WAAW,GAAG,OAAO;EAE1C,IAAM,IAA2B,CAAC,GAAG,CAAO,GAEtC,KAAa,GAAgB,MAAsB;GACvD,IAAI,CAAC,EAAU,GAAG;GAElB,EAAc,KAAO;GAErB,IAAM,IAAmC,EAAK,KAAK,GAAG,MACpD,EAAiB,SAAS,CAAC,IAAI,cAAc,MAC/C;GAOA,AALA,KAAKhB,KAAgB,EAAoC;IACvD;IACA,SAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,GAAe,CAAY;IACtF,QAAQ;GACV,CAAC,GACD,KAAKiB,GAAiB;EACxB;EAoBA,OAlBA,MAAM,QAAQ,IACZ,EAAiB,IAAI,OAAO,MAAQ;GAClC,IAAM,IAAM,EAAW;GAEvB,IAAI;IACF,EAAc,KAAO,MAAM,KAAKC,GAAoB,GAAK,GAAK,GAAQ,GAAW,CAAS;GAC5F,SAAS,GAAK;IACZ,IAAM,IAAM,EAAK;IAEjB,IAAI,EAAI,SACN,EAAc,KAAO,MAAM,EAAI,QAAQ,GAAK;KAAE,GAAG;KAAS;IAAO,CAA2B;SAE5F,MAAM;GAEV;EACF,CAAC,CACH,GAEO;CACT;CAKA,MAAMV,GAAY,GAA6D;EAC7E,IAAI,IAAc;EAElB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;GAC7B,IAAM,IAAS,IAAI,IAAI,GAAa,kBAAkB,GAChD,IAA0B;IAC9B,MAAM,EAAO,KAAK,QAAQ,MAAM,EAAE;IAClC,cAAc;IACd,UAAU,EAAU,EAAO,UAAU,KAAKzB,EAAK;IAC/C,OAAO,EAAW,EAAO,MAAM;GACjC,GAEM,IAAW,MAAM,KAAKoC,GAAc,CAAQ;GAElD,IAAI,EAAS,SAAS,YAAY,OAAO;GAEzC,IAAc,KAAKC,GAAoB,EAAS,UAAU;EAC5D;EAEA,MAAM,IAAI,EAA2B;CACvC;CAIA,MAAMV,GAAW,GAAkB,GAAqB,GAAoC;EAC1F,IAAM,IAAW,MAAM,KAAKF,GAAY,CAAQ;EAEhD,IAAI,EAAS,SAAS,WAAW;EAEjC,IAAM,EAAE,aAAU,WAAQ,WAAQ,qBAAkB,GAC9C,IAAO,KAAKX,GAAW,cAAc,CAAM;EAGjD,IAAI,CAFY,EAAK,MAAM,MAAM,EAAE,UAAU,IAExC,GAAS;EAEd,IAAM,IAAS,EACb,GACA,GACA,EAAS,UACT,EAAK,UAAU,KAAA,CAAS,CAC1B,GACM,IAAU,EAA4B,GAAU,GAAe,GAAQ,SAAc,QAAQ,QAAQ,CAAC,GACtG,IAAU,MAAM,KAAKY,GAAe,GAAM,GAAS,CAAM;EAE/D,KAAKX,GAAS,IAAI,EAAgB,KAAKf,IAAO,EAAO,MAAM,GAAQ,KAAS,EAAS,KAAK,GAAG,CAAO;CACtG;CAIA,MAAMoC,GAAc,GAAyE;EAC3F,IAAM,EAAE,WAAQ,cAAW,EAAc,EAAS,UAAU,KAAKhC,EAAQ;EAEzE,IAAI,CAAC,GACH,OAAO;GAAE;GAAU;GAAQ,MAAM;EAAY;EAG/C,IAAI,EAAO,UACT,OAAO;GACL;GACA;GACA,YAAY,EAAc,EAAO,UAAU,KAAKC,IAAe,KAAKL,EAAK;GACzE,MAAM;EACR;EAGF,IAAI,IAAqC,EAAS,OAE5C,IAAqC,EAAO,gBAAgB,KAAKE;EAEvE,IAAI,GACF,IAAI;GACF,IAAgB,EAAO,EAAS,KAAK;EACvC,SAAS,GAAK;GAEZ,AADA,KAAK0B,GAAa,GAAK,EAAE,QAAQ,gBAAgB,CAAC,GAClD,IAAgB,EAAS;EAC3B;EAGF,MAAM,KAAKd,GAAW,QAAQ,CAAM;EAEpC,IAAM,IAAO,KAAKA,GAAW,cAAc,CAAM;EAEjD,OAAO;GACL,QAAQ,EACN,GACA,GACA,EAAS,UACT,EAAK,UAAU,KAAA,CAAS,CAC1B;GACA;GACA;GACA;GACA;GACA,MAAM;EACR;CACF;CASA,MAAMqB,GACJ,GACA,GACA,GACA,GACA,GACkB;EAClB,IAAI;EAEJ,IAAI;GACF,SAAa;IACX,IAAI,EAAO,WAAW,CAAC,EAAU,GAG/B,OAFA,MAAM,EAAU,OAAO,KAAA,CAAoB,GAEpC;IAGT,IAAM,EAAE,SAAM,aAAU,MAAM,EAAU,KAAK;IAE7C,IAAI,GAAM,OAAO,KAAS;IAG1B,AADA,IAAY,GACZ,EAAU,GAAO,CAAQ;GAC3B;EACF,SAAS,GAAK;GAEZ,MADA,MAAM,EAAU,OAAO,KAAA,CAAoB,CAAC,CAAC,YAAY,KAAA,CAAS,GAC5D;EACR;CACF;CAIA,MAAMG,GACJ,GACA,GACA,GACA,GACA,GACA,GACe;EACf,IAAI,CAAC,EAAU,GAAG;EAElB,IAAM,IAAO,KAAKxB,GAAW,cAAc,CAAM,GAC3C,IAAU,EAAK,MAAM,MAAM,EAAE,UAAU,IAAI,GAC7C,IAAyB,EAAK,UAAU,KAAA,CAAS;EAErD,IAAI,GAAS;GACX,IAAM,IAAa,EAAgB,KAAKd,IAAO,EAAO,MAAM,GAAQ,EAAS,KAAK,GAC5E,IAAS,KAAKe,GAAS,QAAQ,CAAU;GAE/C,IAAI,GACF,IAAc;QACT;IAEL,IAAM,IAAsC,EAAK,KAAK,MAAO,EAAE,SAAS,YAAY,MAAO;IAO3F,AALA,KAAKE,KAAgB,EAAoC;KACvD;KACA,SAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,GAAa,CAAe;KACvF,QAAQ;IACV,CAAC,GACD,KAAKiB,GAAiB;IAEtB,IAAI;KACF,IAAc,MAAM,KAAKD,GAAgB,GAAM,GAAS,GAAQ,GAAW,GAAU,CAAM;IAC7F,SAAS,GAAO;KACd,IAAI,CAAC,EAAU,GAAG;KAWlB,MATA,KAAKhB,KAAgB,EAAoC;MACvD;MACA;MACA,SAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,CAAW;MACtE,QAAQ;KACV,CAAC,GAED,EAAmB,GAAO;MAAE,WAAW,EAAO,KAAK;MAAM,QAAQ;KAAc,CAAC,GAE1E;IACR;GACF;EACF;EAEK,EAAU,MAEf,KAAKA,KAAgB,EAAoC;GACvD;GACA,SAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,CAAW;GACtE,QAAQ;EACV,CAAC;CACH;CAIA,MAAMsB,GAAmB,GAA0B,GAAwC;EAGzF,KAF4B,KAAiB,KAAKhC,OAEvB,OAAO,WAAa,KAAa;GAK1D,IAAM,IAAM;GAEZ,IAAI,EAAI,qBAAqB;IAC3B,MAAM,EAAI,oBAAoB,CAAG,CAAC,CAAC;IAEnC;GACF;EACF;EAEA,MAAM,EAAI;CACZ;CAQA,MAAMa,GACJ,GACA,GACA,GACA,GACA,IAAQ,GACR,IAAU,IACQ;EAClB,IAAM,IAAY,KAAKH,IACjB,UAA2B,EAAQ,UAAU,KAAK,CAAC,KAAKY,IACxD,IAAW,MAAM,KAAKO,GAAc,CAAe;EAEzD,IAAI,CAAC,EAAU,GAAG,OAAO;EAEzB,IAAI,EAAS,SAAS,YAAY;GAChC,IAAI,KAAS,GAAG,MAAM,IAAI,EAA2B;GAErD,OAAO,KAAKhB,GACV,GACA,KAAKoB,GAAkB,EAAS,YAAY,EAAgB,YAAY,GACxE,GACA,GACA,IAAQ,GACR,EACF;EACF;EAEA,IAAI,EAAS,SAAS,aAAa;GAEjC,IAAI,KAAK3B,IAAiB;IACxB,IAAM,IAAS,CAAC,KAAKA,GAAgB,IAAI,GACnC,IAAW,EAAiB,GAAQ,CAAC,GAAG,EAAgB,UAAU,CAAC,KAAA,CAAS,CAAC,GAC/E,IAAY,IACZ,IAAc,IAId,IAAuC,EAAgB;IAE3D,IAAI,KAAKX,IACP,IAAI;KACF,IAAkB,KAAKA,GAAoB,EAAgB,KAAK;IAClE,SAAS,GAAK;KACZ,KAAK0B,GAAa,GAAK,EAAE,QAAQ,gBAAgB,CAAC;IACpD;IAGF,IAAM,IAAM,YAA2B;KACrC,IAAI,CAAC,EAAU,GAAG;KAElB,IAAM,IAAU,EACd,GACA,GACA,CAAC,GACD,IACC,GAAQ,MAAY,KAAK,SAAS,GAAQ,CAAO,CACpD;KAEA,IAAc,MAAM,EAClB,GACA,CAAC,GAAG,KAAK3B,IAAmB,GAAG,KAAKY,GAAiB,aAAa,GAClE,YAAY;MACL,EAAU,MAEf,IAAY,IACZ,EAAO,GAAiB,CAAO,GAE1B,EAAU,KAEf,MAAM,KAAKyB,GAAa,KAAKzB,IAAkB,GAAS,GAAiB,CAAC,GAAG,EAAQ,QAAQ,CAAS;KACxG,CACF;IACF;IAEA,IAAI;KACF,MAAM,KAAK0B,GAAmB,GAAK,CAAa;IAClD,UAAU;KACR,AAAI,EAAU,KAAK,MACjB,KAAKL,GAAiB,GACtB,KAAKO,GAAa,KAAKxB,IAAe,CAAS;IAEnD;IAEA,OAAO,KAAe;GACxB;GAgBA,OAdI,CAAC,EAAU,MAEf,EAAO,EAAS,UAAU,CAAO,GAE7B,CAAC,EAAU,KAAU,MAEzB,KAAKA,KAAgB,EAAoC;IACvD,UAAU,EAAS;IACnB,SAAS,CAAC;IACV,QAAQ;GACV,CAAC,GACD,KAAKiB,GAAiB,GACtB,KAAKO,GAAa,KAAKxB,IAAe,CAAS,GAExC;EACT;EAEA,IAAM,EAAE,WAAQ,aAAU,WAAQ,WAAQ,qBAAkB,GACxD,IAAY,IACZ,IAAc,IAEZ,IAAM,YAA2B;GACrC,IAAI,CAAC,EAAU,GAAG;GAElB,IAAM,IAAU,EAA4B,GAAU,GAAe,GAAQ,IAAS,GAAQ,MAC5F,KAAK,SAAS,GAAQ,CAAO,CAC/B;GAEA,IAAc,MAAM,EAClB,GACA,CAAC,GAAG,KAAKhB,IAAmB,GAAG,EAAO,aAAa,GACnD,YAAY;IACL,EAAU,MAEf,IAAY,IACZ,EAAO,GAAU,CAAO,GAEnB,EAAU,KAEf,MAAM,KAAKqC,GAAa,GAAQ,GAAS,GAAU,GAAQ,EAAQ,QAAQ,CAAS;GACtF,CACF;EACF;EAEA,IAAI;GACF,MAAM,KAAKC,GAAmB,GAAK,CAAa;EAClD,UAAU;GACR,AAAI,EAAU,KAAK,MACjB,KAAKL,GAAiB,GACtB,KAAKO,GAAa,KAAKxB,IAAe,CAAS;EAEnD;EAEA,OAAO,KAAe;CACxB;CAIA,GAAa,GAAmC,GAA2C;EACzF,IAAI,CAAC,KAAKX,MAAW,OAAO,SAAW,KAAa;EAEpD,IAAM,IAAW,KAAKA,GAAQ,GAAI,CAAI;EAElC,UAAa,YAEjB;OAAI,MAAa,OAAO;IACtB,OAAO,SAAS,GAAG,CAAC;IAEpB;GACF;GAEA,OAAO,SAAS,EAAS,GAAG,EAAS,CAAC;EAFtC;CAGF;CAIA,GAAoB,GAAsB;EACxC,IAAM,IAAS,IAAI,IAAI,GAAM,kBAAkB,GACzC,IAAiB,EAAU,EAAO,UAAU,KAAKN,EAAK;EAE5D,OAAO,GAAG,EAAU,KAAKA,IAAO,CAAc,IAAI,EAAO,SAAS,EAAO;CAC3E;CAEA,GAAkB,GAAc,GAAsC;EACpE,IAAM,IAAS,IAAI,IAAI,KAAKqC,GAAoB,CAAI,GAAG,kBAAkB;EAEzE,OAAO;GACL,MAAM,EAAO,KAAK,QAAQ,MAAM,EAAE;GAClC;GACA,UAAU,EAAU,EAAO,UAAU,KAAKrC,EAAK;GAC/C,OAAO,EAAW,EAAO,MAAM;EACjC;CACF;CAEA,GAAiB,GAAiC;EAChD,IAAM,IAAS,IAAI,gBAAgB;EAEnC,KAAK,IAAM,CAAC,GAAK,MAAU,OAAO,QAAQ,EAAS,KAAK,GACtD,AAAI,MAAM,QAAQ,CAAK,IACrB,EAAM,SAAS,MAAS;GACtB,EAAO,OAAO,GAAK,CAAI;EACzB,CAAC,IACE,EAAO,IAAI,GAAK,CAAK;EAG5B,IAAM,IAAQ,EAAO,SAAS,GACxB,IAAO,EAAS,OAAO,IAAI,EAAS,SAAS;EAEnD,OAAO,GAAG,EAAU,KAAKA,IAAO,EAAS,QAAQ,IAAI,IAAQ,IAAI,MAAU,KAAK;CAClF;CAEA,GAAuB,GAAqC;EAC1D,IAAM,IAAS,IAAI,IAAI,GAAM,kBAAkB,GACzC,IAAW,EAAU,EAAO,UAAU,KAAKA,EAAK,GAChD,EAAE,WAAQ,cAAW,EAAc,GAAU,KAAKI,EAAQ;EAEhE,OAAO;GACL,MAAM,GAAQ,KAAK;GACnB;GACA;GACA,OAAO,EAAW,EAAO,MAAM;EACjC;CACF;CAGA,MAAMoB,GAAgB,GAAc,IAA2B,CAAC,GAAkB;EAChF,KAAKD,GAAmB;EAExB,IAAM,IAAc,KAAKc,GAAoB,CAAI;EAEjD,IAAI,CAAC,EAAQ,SAAS,MAAgB,KAAKlB,IAAW;EAEtD,IAAM,IAAU,KAAKT,GAAY,MAAM,GACjC,IAAmB,KAAKO,GAAc,QAAQ,KAAK,MAAU,EAAM,IAAI,GACvE,IAAU,MAAM,EACpB,KAAKR,IACL,GACA,KAAKsB,GAAuB,CAAW,CACzC;EAEI,CAAC,EAAQ,UAAU,KAAK,CAAC,KAE7B,MAAM,KAAKX,GACT,GACA,KAAKoB,GAAkB,GAAa,EAAQ,KAAK,IAChD,GAAU,MAAY;GACrB,IAAI,CAAC,EAAQ,UAAU,GAAG;GAE1B,IAAM,IAAO,KAAKnB,GAAiB,CAAQ;GAK3C,AAHI,IAAS,KAAKlB,GAAS,QAAQ,GAAM,EAAS,YAAY,IACzD,KAAKA,GAAS,KAAK,GAAM,EAAS,YAAY,GAEnD,KAAKgB,KAAY;EACnB,GACA,EAAQ,gBACR,GACA,EAAQ,WAAW,EACrB;CACF;AACF;AAeA,SAAgB,EACd,GACoC;CACpC,OAAO,IAAI,EAAO,CAAO;AAC3B"}
1
+ {"version":3,"file":"router.js","names":[],"sources":["../src/router.ts"],"sourcesContent":["import { createNavigationCoordinator, type NavigationAttempt } from './_navigation';\nimport { compileRoutes } from './compile';\nimport {\n buildMatchBranch,\n createRouteContext,\n createRouteState,\n executeMiddlewarePipeline,\n reportError,\n} from './context';\nimport { WayfinderDisposedError, WayfinderRedirectLoopError, WayfinderRouteError } from './errors';\nimport { type RegisteredBlocker, runLeaveBlockers } from './guards';\nimport { createBrowserHistory } from './history';\nimport {\n buildUrl,\n joinPaths,\n matchesPrefix,\n matchRouteFor,\n normalizePath,\n parseQuery,\n readLocation,\n stripBase,\n} from './path';\nimport type {\n BeforeLeaveBlocker,\n BeforeLeaveOptions,\n CoerceSearchFn,\n DataContext,\n DataFn,\n HistoryDriver,\n IsActiveOptions,\n Middleware,\n NamedNavigationTarget,\n NavigateOptions,\n NavigationDestination,\n PathParams,\n RawNavigationTarget,\n ResolvedQueryParams,\n RouteBranchDef,\n RouteContext,\n RouteLocation,\n RouteMatchBranch,\n RouteName,\n RouteParams,\n RoutePathByName,\n RouteRecord,\n RouterErrorContext,\n RouterOptions,\n RouteState,\n RouteTable,\n RouteViewMap,\n RouteViewName,\n RouteViewRegistry,\n Unsubscribe,\n} from './types';\n\n// ─── Module-level helpers ────────────────────────────────────────────────────\n\nfunction getRouteByName(name: string, routesByName: ReadonlyMap<string, RouteRecord>): RouteRecord {\n const route = routesByName.get(name);\n\n if (route) return route;\n\n const available = [...routesByName.keys()].join(', ');\n\n throw new WayfinderRouteError(\n available ? `Unknown route name: ${name}. Available routes: ${available}` : `Unknown route name: ${name}`,\n );\n}\n\nfunction resolveTarget(\n target: { path: string } | { hash?: string; name: string; params?: RouteParams; query?: ResolvedQueryParams },\n routesByName: ReadonlyMap<string, RouteRecord>,\n base = '/',\n): string {\n if ('path' in target) return target.path;\n\n const route = getRouteByName(target.name, routesByName);\n const path = buildUrl(base, route.path, target.params, target.query);\n\n return target.hash ? `${path}#${target.hash}` : path;\n}\n\n// ─── Internal error carrier ──────────────────────────────────────────────────\n//\n// Carries error context alongside the original error without mutating the thrown\n// object. The carrier is unwrapped before reaching external callers so error\n// identity and `cause` chains are preserved.\n\nconst ROUTER_ERROR = Symbol('wayfinder.routerError');\n\ntype RouterErrorCarrier = {\n [ROUTER_ERROR]: true;\n readonly error: unknown;\n readonly context: RouterErrorContext;\n};\n\nfunction carryError(error: unknown, context: RouterErrorContext): RouterErrorCarrier {\n return { [ROUTER_ERROR]: true, context, error };\n}\n\nfunction isRouterErrorCarrier(value: unknown): value is RouterErrorCarrier {\n return value !== null && typeof value === 'object' && ROUTER_ERROR in (value as Record<symbol, unknown>);\n}\n\nfunction unwrapCarrier(value: unknown): never {\n if (isRouterErrorCarrier(value)) throw value.error;\n\n throw value;\n}\n\n// ─── Internal types ───────────────────────────────────────────────────────────\n\ntype NavigationDecision =\n | {\n branch: RouteMatchBranch;\n location: RouteLocation;\n params: RouteParams;\n record: RouteRecord;\n resolvedQuery: ResolvedQueryParams;\n type: 'matched';\n }\n | { location: RouteLocation; params: RouteParams; type: 'unmatched' }\n | { location: RouteLocation; params: RouteParams; redirectTo: string; type: 'redirect' };\n\n// ─── Router class ─────────────────────────────────────────────────────────────\n\nclass Router<TRoutes extends RouteTable> {\n readonly #base: string;\n readonly #globalMiddleware: readonly Middleware[];\n readonly #globalCoerceSearch?: CoerceSearchFn;\n readonly #history: HistoryDriver;\n readonly #records: readonly RouteRecord[];\n readonly #routesByName: ReadonlyMap<string, RouteRecord>;\n readonly #onError?: RouterOptions<TRoutes>['onError'];\n readonly #scroll?: RouterOptions<TRoutes>['scroll'];\n readonly #useViewTransition: boolean;\n\n // Mutable navigation state\n readonly #beforeLeaveBlockers = new Set<RegisteredBlocker>();\n readonly #navigation = createNavigationCoordinator();\n #currentState: RouteState;\n #disposed = false;\n readonly #disposeController = new AbortController();\n #lastHref = '/';\n readonly #listeners = new Set<(state: RouteState) => void>();\n readonly #preloaded = new Map<string, unknown[]>();\n readonly #preloads = new Map<string, Promise<RouteState | null>>();\n // Compiled notFound fallback record\n readonly #notFoundRecord: RouteRecord | null;\n\n readonly #unlistenHistory: () => void;\n\n /** Resolves when the constructor-triggered navigation has settled; rejects if it fails. */\n readonly ready: Promise<void>;\n\n constructor(options: RouterOptions<TRoutes>) {\n const compiled = compileRoutes(options);\n\n this.#base = normalizePath(options.base ?? '/');\n this.#globalMiddleware = (options.middleware ?? []) as unknown as Middleware[];\n this.#globalCoerceSearch = options.coerceSearch;\n this.#history = options.history ?? createBrowserHistory();\n this.#onError = options.onError;\n this.#scroll = options.scroll;\n this.#useViewTransition = options.viewTransition ?? false;\n this.#records = compiled.records as unknown as readonly RouteRecord[];\n this.#routesByName = compiled.routesByName as unknown as ReadonlyMap<string, RouteRecord>;\n this.#currentState = createRouteState({\n location: { hash: '', historyState: null, pathname: '/', query: {} },\n matches: [] as RouteMatchBranch,\n status: 'idle',\n });\n\n // Build a synthetic RouteRecord for the notFound fallback.\n if (options.notFound) {\n const nf = options.notFound;\n const leafDef: RouteBranchDef = {\n dataFn: nf.data,\n name: '__notFound__',\n };\n\n this.#notFoundRecord = {\n branchDefs: [leafDef],\n leaf: leafDef,\n matcher: { paramNames: [], pattern: /(?:)/, prefixPattern: /(?:)/ },\n ownMiddleware: (nf.middleware ?? []) as unknown as Middleware[],\n path: '/*',\n };\n } else {\n this.#notFoundRecord = null;\n }\n\n this.#unlistenHistory = this.#registerHistoryListener();\n\n const { hash, pathname, search } = this.#history.location;\n\n this.#lastHref = `${pathname}${search}${hash}`;\n\n const attempt = this.#navigation.begin();\n\n const navigationPromise = this.#handleRoute(\n attempt,\n readLocation(this.#base, this.#history),\n (location, replace) => {\n if (!attempt.isCurrent()) return;\n\n const href = this.#hrefForLocation(location);\n\n if (replace) this.#history.replace(href, location.historyState);\n\n this.#lastHref = href;\n },\n undefined,\n 0,\n false,\n ).then(() => undefined);\n\n // ready rejects with the original error (carrier unwrapped) for external consumers.\n this.ready = navigationPromise.catch(unwrapCarrier);\n // Attach a silent handler so an unawaited ready promise doesn't trigger\n // an unhandled-rejection warning. External consumers can still await ready\n // and receive the rejection — each .catch() subscriber fires independently.\n this.ready.catch(() => {});\n // #runInBackground receives the raw promise so it can extract carrier context for onError.\n this.#runInBackground(navigationPromise, { source: 'initial-navigation' });\n\n // Router actions are intentionally bound once so they remain safe when destructured.\n this.beforeLeave = this.beforeLeave.bind(this);\n this.createViewRegistry = this.createViewRegistry.bind(this);\n this.dispose = this.dispose.bind(this);\n this.getSnapshot = this.getSnapshot.bind(this);\n this.isActive = this.isActive.bind(this);\n this.load = this.load.bind(this);\n this.match = this.match.bind(this);\n this.navigate = this.navigate.bind(this);\n this.preload = this.preload.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.url = this.url.bind(this);\n this.waitFor = this.waitFor.bind(this);\n }\n\n // ─── Public state ─────────────────────────────────────────────────────────\n\n /**\n * Returns the current immutable router state snapshot.\n *\n * Compatible with React's `useSyncExternalStore`:\n * ```ts\n * const state = useSyncExternalStore(\n * (cb) => router.subscribe(cb),\n * () => router.getSnapshot()\n * );\n * ```\n */\n getSnapshot(): RouteState {\n return this.#currentState;\n }\n\n createViewRegistry<const TViews extends RouteViewMap<TRoutes>, TNotFound = never>(\n views: TViews & Record<Exclude<keyof TViews, RouteViewName<TRoutes>>, never>,\n options?: { notFound?: TNotFound },\n ): RouteViewRegistry<TViews[keyof TViews] | TNotFound> {\n return {\n resolve: (state) => {\n const name = state.matches.at(-1)?.name;\n\n if (name === '__notFound__') return options?.notFound;\n\n return name ? (views[name as keyof TViews] as TViews[keyof TViews]) : undefined;\n },\n };\n }\n\n // ─── Subscription ─────────────────────────────────────────────────────────\n\n /**\n * Subscribe to state changes. The listener is called on each subsequent state change;\n * use `getSnapshot()` to read the current value immediately.\n */\n subscribe(listener: (state: RouteState) => void): Unsubscribe {\n this.#assertNotDisposed();\n this.#listeners.add(listener);\n\n return () => {\n this.#listeners.delete(listener);\n };\n }\n\n // ─── Navigation ───────────────────────────────────────────────────────────\n\n /**\n * Navigate using a named route target or a raw path target.\n *\n * If a data loader throws after terminal execution begins, history has already committed\n * the destination and the returned Promise rejects with the loader error.\n */\n navigate(\n target: NamedNavigationTarget<TRoutes> | RawNavigationTarget | string,\n options?: NavigateOptions,\n ): Promise<void> {\n const normalized = typeof target === 'string' ? { path: target } : target;\n const destination = resolveTarget(normalized, this.#routesByName);\n\n return this.#navigateToPath(destination, options);\n }\n\n // ─── URL helpers ──────────────────────────────────────────────────────────\n\n /** Build a URL for a named route, including optional params and query string. */\n url<Name extends RouteName<TRoutes>>(\n name: Name,\n params?: PathParams<RoutePathByName<TRoutes, Name>>,\n query?: ResolvedQueryParams,\n ): string {\n const route = getRouteByName(name, this.#routesByName);\n\n return buildUrl(this.#base, route.path, params, query);\n }\n\n /** Returns true when the current location matches the named route by prefix (default) or exactly. */\n isActive<Name extends RouteName<TRoutes>>(name: Name, options: IsActiveOptions = {}): boolean {\n const route = getRouteByName(name, this.#routesByName);\n const pathname = this.#currentState.location.pathname;\n const exact = options.exact ?? false;\n\n return exact ? matchRouteFor(pathname, [route]).record != null : matchesPrefix(pathname, route);\n }\n\n /** Match a pathname to a route branch without running middleware or data loaders. Returns null for redirects or no match. */\n match(pathname: string): RouteMatchBranch | null {\n const normalizedPathname = stripBase(normalizePath(pathname), this.#base);\n const { params, record } = matchRouteFor(normalizedPathname, this.#records);\n\n if (!record || record.redirect) return null;\n\n const branch = buildMatchBranch(\n record.branchDefs,\n params,\n normalizedPathname,\n record.branchDefs.map(() => undefined),\n );\n\n return branch.length ? branch : null;\n }\n\n /**\n * Load a URL into a route state including data loader results, without modifying\n * router state or history. Follows declarative redirects but does not cache results.\n * Middleware is not executed — use `navigate()` when middleware side effects are needed.\n */\n async load(url: string, options?: { signal?: AbortSignal }): Promise<RouteState | null> {\n const prepared = await this.#resolveUrl(url);\n\n if (prepared.type !== 'matched') return null;\n\n const { location, params, record, resolvedQuery } = prepared;\n const defs = record.branchDefs;\n const hasData = defs.some((d) => d.dataFn != null);\n let dataResults: unknown[] = defs.map(() => undefined);\n let error: unknown;\n let status: 'error' | 'idle' = 'idle';\n\n if (hasData) {\n const effectiveSignal = options?.signal ?? new AbortController().signal;\n const branch = buildMatchBranch(defs, params, location.pathname, dataResults);\n const context = createRouteContext<TRoutes>(location, resolvedQuery, params, branch, () => Promise.resolve());\n\n try {\n dataResults = await this.#loadData(defs, context, effectiveSignal);\n } catch (e) {\n error = e;\n status = 'error';\n }\n }\n\n return createRouteState({\n error,\n location,\n matches: buildMatchBranch(defs, params, location.pathname, dataResults),\n status,\n });\n }\n\n async preload(target: NamedNavigationTarget<TRoutes>): Promise<RouteState | null> {\n this.#assertNotDisposed();\n\n const destination = this.#resolveDestination(resolveTarget(target, this.#routesByName, this.#base));\n const existing = this.#preloads.get(destination);\n\n if (existing) return existing;\n\n const work = this.load(destination, { signal: this.#disposeController.signal })\n .then((state) => {\n if (this.#disposed) throw this.#disposeController.signal.reason;\n\n if (state?.status === 'error') throw state.error;\n\n if (state) {\n const key = this.#hrefForLocation(state.location);\n\n if (this.#preloaded.size >= 20) this.#preloaded.delete(this.#preloaded.keys().next().value!);\n\n this.#preloaded.set(\n key,\n state.matches.map((match) => match.data),\n );\n }\n\n return state;\n })\n .catch((error) => {\n if (this.#onError) this.#reportError(error, { source: 'preload' });\n\n throw error;\n })\n .finally(() => {\n this.#preloads.delete(destination);\n });\n\n this.#preloads.set(destination, work);\n\n return work;\n }\n\n /**\n * Returns a Promise that resolves the next time the router reaches `status: 'idle'`\n * and the active matches include a route named `name`.\n *\n * - Resolves immediately if the router is already `idle` at `name`.\n * - Rejects immediately if the router is already in `status: 'error'`.\n * - If the router is currently `idle` at a **different** route and no navigation is in\n * flight, this promise will not resolve until a future navigation lands on `name`.\n * Typical use-case is awaiting a navigation you just triggered:\n * `router.navigate(target); await router.waitFor('routeName')`.\n * @throws {WayfinderDisposedError} if the router is disposed while the promise is pending,\n * or if called after the router has already been disposed.\n */\n waitFor(name: RouteName<TRoutes>): Promise<RouteState> {\n this.#assertNotDisposed();\n\n return new Promise((resolve, reject) => {\n const matchesName = (state: RouteState): boolean =>\n state.status === 'idle' && state.matches.some((m) => m.name === name);\n\n if (this.#currentState.status === 'error') {\n reject(this.#currentState.error);\n\n return;\n }\n\n if (matchesName(this.#currentState)) {\n resolve(this.#currentState);\n\n return;\n }\n\n const unsub = this.subscribe((state) => {\n if (matchesName(state)) {\n unsub();\n resolve(state);\n } else if (state.status === 'error') {\n unsub();\n reject(state.error);\n }\n });\n\n this.#disposeController.signal.addEventListener(\n 'abort',\n () => {\n unsub();\n reject(this.#disposeController.signal.reason);\n },\n { once: true },\n );\n });\n }\n\n // ─── Navigation guards ────────────────────────────────────────────────────\n\n /**\n * Register a leave guard. Called before user-triggered navigation attempts.\n * Return `false` to cancel; `true` to allow.\n * Returns a function that removes the guard.\n *\n * Use `options.routes` to scope the guard to specific routes (fires only when navigating\n * away from a route whose name appears in the array, checked against any node in the active branch).\n */\n beforeLeave(blocker: BeforeLeaveBlocker, options?: BeforeLeaveOptions<TRoutes>): Unsubscribe {\n this.#assertNotDisposed();\n\n const entry: RegisteredBlocker = {\n handler: blocker,\n routes: options?.routes as string[] | undefined,\n };\n\n this.#beforeLeaveBlockers.add(entry);\n\n return () => {\n this.#beforeLeaveBlockers.delete(entry);\n };\n }\n\n // ─── Lifecycle ────────────────────────────────────────────────────────────\n\n get disposalSignal(): AbortSignal {\n return this.#disposeController.signal;\n }\n\n get disposed(): boolean {\n return this.#disposed;\n }\n\n /** Dispose event listeners and prevent further router interaction. Idempotent. */\n dispose(): void {\n if (this.#disposed) return;\n\n this.#disposed = true;\n this.#beforeLeaveBlockers.clear();\n this.#listeners.clear();\n this.#preloaded.clear();\n this.#preloads.clear();\n this.#navigation.invalidate(new WayfinderDisposedError());\n this.#unlistenHistory();\n // Abort the disposal signal last — waitFor() listeners clean themselves up via this signal.\n this.#disposeController.abort(new WayfinderDisposedError());\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n // ─── Private: assertions ──────────────────────────────────────────────────\n\n #assertNotDisposed(): void {\n if (this.#disposed) throw new WayfinderDisposedError();\n }\n\n // ─── Private: history listener ────────────────────────────────────────────\n\n #registerHistoryListener(): () => void {\n return this.#history.onPopstate(() => {\n const { hash, pathname, search } = this.#history.location;\n const newHref = `${pathname}${search}${hash}`;\n const previousHref = this.#lastHref;\n\n if (newHref === previousHref) return;\n\n this.#runInBackground(this.#handleHistoryNavigation(newHref, previousHref), { source: 'history-listener' });\n });\n }\n\n async #handleHistoryNavigation(newHref: string, previousHref: string): Promise<void> {\n const attempt = this.#navigation.begin();\n const activeMatchNames = this.#currentState.matches.map((m) => m.name);\n const destination = this.#navigationDestination(newHref);\n const allowed = await runLeaveBlockers(this.#beforeLeaveBlockers, activeMatchNames, destination);\n\n if (!attempt.isCurrent()) return;\n\n if (!allowed) {\n this.#history.replace(previousHref, this.#currentState.location.historyState);\n\n return;\n }\n\n const terminalRan = await this.#handleRoute(\n attempt,\n readLocation(this.#base, this.#history),\n (location, replace) => {\n if (!attempt.isCurrent()) return;\n\n const href = this.#hrefForLocation(location);\n\n if (replace) this.#history.replace(href, location.historyState);\n\n this.#lastHref = href;\n },\n undefined,\n 0,\n false,\n );\n\n if (attempt.isCurrent() && !terminalRan) {\n this.#history.replace(previousHref, this.#currentState.location.historyState);\n }\n }\n\n // ─── Private: error handling ──────────────────────────────────────────────\n\n #reportError(error: unknown, context: RouterErrorContext): void {\n reportError(error, context, this.#onError);\n }\n\n #runInBackground(promise: Promise<void>, context: RouterErrorContext): void {\n void promise.catch((value) => {\n if (isRouterErrorCarrier(value)) {\n this.#reportError(value.error, value.context);\n } else {\n this.#reportError(value, context);\n }\n });\n }\n\n // ─── Private: listener notification ──────────────────────────────────────\n\n #notifyListeners(): void {\n this.#listeners.forEach((listener) => {\n listener(this.#currentState);\n });\n }\n\n // ─── Private: data loaders ────────────────────────────────────────────────\n\n /**\n * Run all data loaders and return their results. Per-def `onError` boundaries are applied.\n */\n async #loadData(\n defs: readonly RouteBranchDef[],\n context: RouteContext<RouteParams, TRoutes>,\n signal: AbortSignal,\n ): Promise<unknown[]> {\n return Promise.all(\n defs.map(async (def) => {\n if (!def.dataFn) return undefined;\n\n const dataFn = def.dataFn as unknown as DataFn<RouteParams, TRoutes>;\n\n try {\n return await dataFn({ ...context, signal } as DataContext<RouteParams, TRoutes>);\n } catch (err) {\n if (def.onError) return def.onError(err, { ...context, signal } as unknown as DataContext);\n\n throw err;\n }\n }),\n );\n }\n\n // ─── Private: URL resolution ──────────────────────────────────────────────\n\n /** Parse a URL, call #prepareRoute, and follow declarative redirects up to 5 hops. */\n async #resolveUrl(url: string): Promise<NavigationDecision> {\n let destination = url;\n\n for (let i = 0; i < 5; i += 1) {\n const parsed = new URL(destination, 'http://localhost');\n const location: RouteLocation = {\n hash: parsed.hash.replace(/^#/, ''),\n historyState: null,\n pathname: stripBase(parsed.pathname, this.#base),\n query: parseQuery(parsed.search),\n };\n\n const prepared = await this.#prepareRoute(location);\n\n if (prepared.type !== 'redirect') return prepared;\n\n destination = this.#resolveDestination(prepared.redirectTo);\n }\n\n throw new WayfinderRedirectLoopError();\n }\n\n // ─── Private: route preparation ───────────────────────────────────────────\n\n async #prepareRoute(location: RouteLocation): Promise<NavigationDecision> {\n const { params, record } = matchRouteFor(location.pathname, this.#records);\n\n if (!record) {\n return { location, params, type: 'unmatched' };\n }\n\n if (record.redirect) {\n return {\n location,\n params,\n redirectTo: resolveTarget(record.redirect, this.#routesByName, this.#base),\n type: 'redirect',\n };\n }\n\n let resolvedQuery: ResolvedQueryParams = location.query;\n\n const coerce: CoerceSearchFn | undefined = record.coerceSearch ?? this.#globalCoerceSearch;\n\n if (coerce) {\n try {\n resolvedQuery = coerce(location.query);\n } catch (err) {\n this.#reportError(err, { source: 'coerce-search' });\n resolvedQuery = location.query;\n }\n }\n\n return {\n branch: buildMatchBranch(\n record.branchDefs,\n params,\n location.pathname,\n record.branchDefs.map(() => undefined),\n ),\n location,\n params,\n record,\n resolvedQuery,\n type: 'matched',\n };\n }\n\n // ─── Private: terminal (data only) ────────────────────────────────────────\n\n async #runTerminal(\n record: RouteRecord,\n context: RouteContext<RouteParams, TRoutes>,\n location: RouteLocation,\n params: RouteParams,\n signal: AbortSignal,\n isCurrent: () => boolean,\n onDataError?: (error: unknown) => void,\n ): Promise<void> {\n if (!isCurrent()) return;\n\n const defs = record.branchDefs;\n const hasData = defs.some((d) => d.dataFn != null);\n let dataResults: unknown[] = defs.map(() => undefined);\n\n if (hasData) {\n const preloadKey = this.#hrefForLocation(location);\n const preloading = this.#preloads.get(preloadKey);\n\n if (preloading) {\n await preloading.catch(() => undefined);\n\n if (!isCurrent()) return;\n }\n\n const cached = this.#preloaded.get(preloadKey);\n\n if (cached) {\n this.#preloaded.delete(preloadKey);\n dataResults = cached;\n } else {\n this.#currentState = createRouteState({\n location,\n matches: buildMatchBranch(defs, params, location.pathname, dataResults),\n status: 'loading',\n });\n this.#notifyListeners();\n\n try {\n dataResults = await this.#loadData(defs, context, signal);\n } catch (error) {\n if (!isCurrent()) return;\n\n this.#currentState = createRouteState({\n error,\n location,\n matches: buildMatchBranch(defs, params, location.pathname, dataResults),\n status: 'error',\n });\n onDataError?.(error);\n throw error;\n }\n }\n }\n\n if (!isCurrent()) return;\n\n this.#currentState = createRouteState({\n location,\n matches: buildMatchBranch(defs, params, location.pathname, dataResults),\n status: 'idle',\n });\n }\n\n // ─── Private: main navigation orchestrator ────────────────────────────────\n\n /**\n * Declarative redirects reuse the active attempt and replace the final history entry.\n * Middleware redirects call `ctx.navigate()`, which starts a new attempt.\n */\n async #handleRoute(\n attempt: NavigationAttempt,\n currentLocation: RouteLocation,\n commit: (location: RouteLocation, replace: boolean) => void,\n useTransition?: boolean,\n depth = 0,\n replace = false,\n ): Promise<boolean> {\n const previousState = this.#currentState;\n const isCurrent = (): boolean => attempt.isCurrent() && !this.#disposed;\n const prepared = await this.#prepareRoute(currentLocation);\n\n if (!isCurrent()) return false;\n\n if (prepared.type === 'redirect') {\n if (depth >= 5) throw new WayfinderRedirectLoopError();\n\n return this.#handleRoute(\n attempt,\n this.#locationFromPath(prepared.redirectTo, currentLocation.historyState),\n commit,\n useTransition,\n depth + 1,\n true,\n );\n }\n\n if (prepared.type === 'unmatched') {\n // Fall back to notFound record when defined.\n if (this.#notFoundRecord) {\n const nfDefs = [this.#notFoundRecord.leaf];\n const nfBranch = buildMatchBranch(nfDefs, {}, currentLocation.pathname, [undefined]);\n let committed = false;\n let dataError: unknown;\n let hasDataError = false;\n let terminalRan = false;\n\n // Apply global coerceSearch to the unmatched location so notFound handlers\n // receive typed query params, consistent with matched-route behaviour.\n let nfResolvedQuery: ResolvedQueryParams = currentLocation.query;\n\n if (this.#globalCoerceSearch) {\n try {\n nfResolvedQuery = this.#globalCoerceSearch(currentLocation.query);\n } catch (err) {\n this.#reportError(err, { source: 'coerce-search' });\n }\n }\n\n const run = async (): Promise<void> => {\n if (!isCurrent()) return;\n\n const context = createRouteContext<TRoutes>(\n currentLocation,\n nfResolvedQuery,\n {},\n nfBranch,\n (target, options) => this.navigate(target, options),\n );\n\n terminalRan = await executeMiddlewarePipeline(\n context,\n [...this.#globalMiddleware, ...this.#notFoundRecord!.ownMiddleware] as unknown as Middleware<TRoutes>[],\n async () => {\n if (!isCurrent()) return;\n\n committed = true;\n commit(currentLocation, replace);\n\n if (!isCurrent()) return;\n\n await this.#runTerminal(\n this.#notFoundRecord!,\n context,\n currentLocation,\n {},\n attempt.signal,\n isCurrent,\n (error) => {\n dataError = error;\n hasDataError = true;\n },\n );\n },\n (error) =>\n isRouterErrorCarrier(error) || (hasDataError && error === dataError)\n ? error\n : carryError(error, { routeName: '__notFound__', source: 'middleware' }),\n );\n };\n\n try {\n await this.#runWithTransition(run, useTransition);\n } catch (error) {\n if (hasDataError && error === dataError) {\n throw carryError(error, { routeName: '__notFound__', source: 'data-loader' });\n }\n\n throw error;\n } finally {\n if (isCurrent() && committed) {\n this.#notifyListeners();\n this.#applyScroll(this.#currentState, previousState);\n }\n }\n\n return terminalRan && committed;\n }\n\n if (!isCurrent()) return false;\n\n commit(prepared.location, replace);\n\n if (!isCurrent()) return false;\n\n this.#currentState = createRouteState({\n location: prepared.location,\n matches: [] as RouteMatchBranch,\n status: 'idle',\n });\n this.#notifyListeners();\n this.#applyScroll(this.#currentState, previousState);\n\n return true;\n }\n\n const { branch, location, params, record, resolvedQuery } = prepared;\n let committed = false;\n let dataError: unknown;\n let hasDataError = false;\n let terminalRan = false;\n\n const run = async (): Promise<void> => {\n if (!isCurrent()) return;\n\n const context = createRouteContext<TRoutes>(location, resolvedQuery, params, branch, (target, options) =>\n this.navigate(target, options),\n );\n\n terminalRan = await executeMiddlewarePipeline(\n context,\n [...this.#globalMiddleware, ...record.ownMiddleware] as unknown as Middleware<TRoutes>[],\n async () => {\n if (!isCurrent()) return;\n\n committed = true;\n commit(location, replace);\n\n if (!isCurrent()) return;\n\n await this.#runTerminal(record, context, location, params, attempt.signal, isCurrent, (error) => {\n dataError = error;\n hasDataError = true;\n });\n },\n (error) =>\n isRouterErrorCarrier(error) || (hasDataError && error === dataError)\n ? error\n : carryError(error, { routeName: record.leaf.name, source: 'middleware' }),\n );\n };\n\n try {\n await this.#runWithTransition(run, useTransition);\n } catch (error) {\n if (hasDataError && error === dataError) {\n throw carryError(error, { routeName: record.leaf.name, source: 'data-loader' });\n }\n\n throw error;\n } finally {\n if (isCurrent() && committed) {\n this.#notifyListeners();\n this.#applyScroll(this.#currentState, previousState);\n }\n }\n\n return terminalRan && committed;\n }\n\n async #runWithTransition(run: () => Promise<void>, useTransition?: boolean): Promise<void> {\n if ((useTransition ?? this.#useViewTransition) && typeof document !== 'undefined') {\n const startViewTransition = (\n document as Document & {\n startViewTransition?: (callback: () => void | Promise<void>) => { finished: Promise<void> };\n }\n ).startViewTransition;\n\n if (startViewTransition) {\n await startViewTransition.call(document, run).finished;\n\n return;\n }\n }\n\n await run();\n }\n\n #applyScroll(to: RouteState, from: RouteState): void {\n if (!this.#scroll || typeof window === 'undefined') return;\n\n const decision = this.#scroll(to, from);\n\n if (decision === 'preserve') return;\n\n if (decision === 'top') {\n window.scrollTo(0, 0);\n\n return;\n }\n\n window.scrollTo(decision.x, decision.y);\n }\n\n // ─── Private: destination resolution ─────────────────────────────────────\n\n #resolveDestination(path: string): string {\n const parsed = new URL(path, 'http://localhost');\n const normalizedPath = stripBase(parsed.pathname, this.#base);\n\n return `${joinPaths(this.#base, normalizedPath)}${parsed.search}${parsed.hash}`;\n }\n\n #locationFromPath(path: string, historyState: unknown): RouteLocation {\n const parsed = new URL(this.#resolveDestination(path), 'http://localhost');\n\n return {\n hash: parsed.hash.replace(/^#/, ''),\n historyState,\n pathname: stripBase(parsed.pathname, this.#base),\n query: parseQuery(parsed.search),\n };\n }\n\n #hrefForLocation(location: RouteLocation): string {\n const search = new URLSearchParams();\n\n for (const [key, value] of Object.entries(location.query)) {\n if (Array.isArray(value))\n value.forEach((item) => {\n search.append(key, item);\n });\n else search.set(key, value);\n }\n\n const query = search.toString();\n const hash = location.hash ? `#${location.hash}` : '';\n\n return `${joinPaths(this.#base, location.pathname)}${query ? `?${query}` : ''}${hash}`;\n }\n\n #navigationDestination(href: string): NavigationDestination {\n const parsed = new URL(href, 'http://localhost');\n const pathname = stripBase(parsed.pathname, this.#base);\n const { params, record } = matchRouteFor(pathname, this.#records);\n\n return {\n name: record?.leaf.name,\n params,\n pathname,\n query: parseQuery(parsed.search),\n };\n }\n\n /** User-initiated navigation. History changes only after middleware reaches the terminal stage. */\n async #navigateToPath(path: string, options: NavigateOptions = {}): Promise<void> {\n this.#assertNotDisposed();\n\n const destination = this.#resolveDestination(path);\n\n if (!options.force && destination === this.#lastHref) return;\n\n const attempt = this.#navigation.begin();\n const activeMatchNames = this.#currentState.matches.map((match) => match.name);\n const allowed = await runLeaveBlockers(\n this.#beforeLeaveBlockers,\n activeMatchNames,\n this.#navigationDestination(destination),\n );\n\n if (!attempt.isCurrent() || !allowed) return;\n\n try {\n await this.#handleRoute(\n attempt,\n this.#locationFromPath(destination, options.state),\n (location, replace) => {\n if (!attempt.isCurrent()) return;\n\n const href = this.#hrefForLocation(location);\n\n if (replace) this.#history.replace(href, location.historyState);\n else this.#history.push(href, location.historyState);\n\n this.#lastHref = href;\n },\n options.viewTransition,\n 0,\n options.replace ?? false,\n );\n } catch (value) {\n throw isRouterErrorCarrier(value) ? value.error : value;\n }\n }\n}\n\n// ─── Public factory ───────────────────────────────────────────────────────────\n\n/**\n * Create a new router instance from a route table.\n *\n * @example\n * const router = createRouter({\n * routes: {\n * home: { path: '/' },\n * userDetail: { path: '/users/:id', data: fetchUser },\n * },\n * });\n */\nexport function createRouter<const TRoutes extends RouteTable>(options: RouterOptions<TRoutes>): Router<TRoutes> {\n return new Router(options);\n}\n\n// Export the Router type (not the constructor value) for type annotations.\nexport type { Router };\n"],"mappings":";;;;;;;;AAyDA,SAAS,EAAe,GAAc,GAA6D;CACjG,IAAM,IAAQ,EAAa,IAAI,CAAI;CAEnC,IAAI,GAAO,OAAO;CAElB,IAAM,IAAY,CAAC,GAAG,EAAa,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;CAEpD,MAAM,IAAI,EACR,IAAY,uBAAuB,EAAK,sBAAsB,MAAc,uBAAuB,GACrG;AACF;AAEA,SAAS,EACP,GACA,GACA,IAAO,KACC;CACR,IAAI,UAAU,GAAQ,OAAO,EAAO;CAEpC,IAAM,IAAQ,EAAe,EAAO,MAAM,CAAY,GAChD,IAAO,EAAS,GAAM,EAAM,MAAM,EAAO,QAAQ,EAAO,KAAK;CAEnE,OAAO,EAAO,OAAO,GAAG,EAAK,GAAG,EAAO,SAAS;AAClD;AAQA,IAAM,IAAe,OAAO,uBAAuB;AAQnD,SAAS,EAAW,GAAgB,GAAiD;CACnF,OAAO;GAAG,IAAe;EAAM;EAAS;CAAM;AAChD;AAEA,SAAS,EAAqB,GAA6C;CACzE,OAAyB,OAAO,KAAU,cAAnC,KAA+C,KAAiB;AACzE;AAEA,SAAS,EAAc,GAAuB;CAG5C,MAFI,EAAqB,CAAK,IAAS,EAAM,QAEvC;AACR;AAkBA,IAAM,IAAN,MAAyC;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA,qBAAgC,IAAI,IAAuB;CAC3D,KAAuB,EAA4B;CACnD;CACA,KAAY;CACZ,KAA8B,IAAI,gBAAgB;CAClD,KAAY;CACZ,qBAAsB,IAAI,IAAiC;CAC3D,qBAAsB,IAAI,IAAuB;CACjD,qBAAqB,IAAI,IAAwC;CAEjE;CAEA;CAGA;CAEA,YAAY,GAAiC;EAC3C,IAAM,IAAW,EAAc,CAAO;EAkBtC,IAhBA,KAAK,KAAQ,EAAc,EAAQ,QAAQ,GAAG,GAC9C,KAAK,KAAqB,EAAQ,cAAc,CAAC,GACjD,KAAK,KAAsB,EAAQ,cACnC,KAAK,KAAW,EAAQ,WAAW,EAAqB,GACxD,KAAK,KAAW,EAAQ,SACxB,KAAK,KAAU,EAAQ,QACvB,KAAK,KAAqB,EAAQ,kBAAkB,IACpD,KAAK,KAAW,EAAS,SACzB,KAAK,KAAgB,EAAS,cAC9B,KAAK,KAAgB,EAAiB;GACpC,UAAU;IAAE,MAAM;IAAI,cAAc;IAAM,UAAU;IAAK,OAAO,CAAC;GAAE;GACnE,SAAS,CAAC;GACV,QAAQ;EACV,CAAC,GAGG,EAAQ,UAAU;GACpB,IAAM,IAAK,EAAQ,UACb,IAA0B;IAC9B,QAAQ,EAAG;IACX,MAAM;GACR;GAEA,KAAK,KAAkB;IACrB,YAAY,CAAC,CAAO;IACpB,MAAM;IACN,SAAS;KAAE,YAAY,CAAC;KAAG,SAAS;KAAQ,eAAe;IAAO;IAClE,eAAgB,EAAG,cAAc,CAAC;IAClC,MAAM;GACR;EACF,OACE,KAAK,KAAkB;EAGzB,KAAK,KAAmB,KAAK,GAAyB;EAEtD,IAAM,EAAE,SAAM,aAAU,cAAW,KAAK,GAAS;EAEjD,KAAK,KAAY,GAAG,IAAW,IAAS;EAExC,IAAM,IAAU,KAAK,GAAY,MAAM,GAEjC,IAAoB,KAAK,GAC7B,GACA,EAAa,KAAK,IAAO,KAAK,EAAQ,IACrC,GAAU,MAAY;GACrB,IAAI,CAAC,EAAQ,UAAU,GAAG;GAE1B,IAAM,IAAO,KAAK,GAAiB,CAAQ;GAI3C,AAFI,KAAS,KAAK,GAAS,QAAQ,GAAM,EAAS,YAAY,GAE9D,KAAK,KAAY;EACnB,GACA,KAAA,GACA,GACA,EACF,CAAC,CAAC,WAAW,KAAA,CAAS;EAuBtB,AApBA,KAAK,QAAQ,EAAkB,MAAM,CAAa,GAIlD,KAAK,MAAM,YAAY,CAAC,CAAC,GAEzB,KAAK,GAAiB,GAAmB,EAAE,QAAQ,qBAAqB,CAAC,GAGzE,KAAK,cAAc,KAAK,YAAY,KAAK,IAAI,GAC7C,KAAK,qBAAqB,KAAK,mBAAmB,KAAK,IAAI,GAC3D,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI,GACrC,KAAK,cAAc,KAAK,YAAY,KAAK,IAAI,GAC7C,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI,GACvC,KAAK,OAAO,KAAK,KAAK,KAAK,IAAI,GAC/B,KAAK,QAAQ,KAAK,MAAM,KAAK,IAAI,GACjC,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI,GACvC,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI,GACrC,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI,GACzC,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,GAC7B,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;CACvC;CAeA,cAA0B;EACxB,OAAO,KAAK;CACd;CAEA,mBACE,GACA,GACqD;EACrD,OAAO,EACL,UAAU,MAAU;GAClB,IAAM,IAAO,EAAM,QAAQ,GAAG,EAAE,CAAC,EAAE;GAInC,OAFI,MAAS,iBAAuB,GAAS,WAEtC,IAAQ,EAAM,KAAiD,KAAA;EACxE,EACF;CACF;CAQA,UAAU,GAAoD;EAI5D,OAHA,KAAK,GAAmB,GACxB,KAAK,GAAW,IAAI,CAAQ,SAEf;GACX,KAAK,GAAW,OAAO,CAAQ;EACjC;CACF;CAUA,SACE,GACA,GACe;EAEf,IAAM,IAAc,EADD,OAAO,KAAW,WAAW,EAAE,MAAM,EAAO,IAAI,GACrB,KAAK,EAAa;EAEhE,OAAO,KAAK,GAAgB,GAAa,CAAO;CAClD;CAKA,IACE,GACA,GACA,GACQ;EACR,IAAM,IAAQ,EAAe,GAAM,KAAK,EAAa;EAErD,OAAO,EAAS,KAAK,IAAO,EAAM,MAAM,GAAQ,CAAK;CACvD;CAGA,SAA0C,GAAY,IAA2B,CAAC,GAAY;EAC5F,IAAM,IAAQ,EAAe,GAAM,KAAK,EAAa,GAC/C,IAAW,KAAK,GAAc,SAAS;EAG7C,OAFc,EAAQ,SAAS,KAEhB,EAAc,GAAU,CAAC,CAAK,CAAC,CAAC,CAAC,UAAU,OAAO,EAAc,GAAU,CAAK;CAChG;CAGA,MAAM,GAA2C;EAC/C,IAAM,IAAqB,EAAU,EAAc,CAAQ,GAAG,KAAK,EAAK,GAClE,EAAE,WAAQ,cAAW,EAAc,GAAoB,KAAK,EAAQ;EAE1E,IAAI,CAAC,KAAU,EAAO,UAAU,OAAO;EAEvC,IAAM,IAAS,EACb,EAAO,YACP,GACA,GACA,EAAO,WAAW,UAAU,KAAA,CAAS,CACvC;EAEA,OAAO,EAAO,SAAS,IAAS;CAClC;CAOA,MAAM,KAAK,GAAa,GAAgE;EACtF,IAAM,IAAW,MAAM,KAAK,GAAY,CAAG;EAE3C,IAAI,EAAS,SAAS,WAAW,OAAO;EAExC,IAAM,EAAE,aAAU,WAAQ,WAAQ,qBAAkB,GAC9C,IAAO,EAAO,YACd,IAAU,EAAK,MAAM,MAAM,EAAE,UAAU,IAAI,GAC7C,IAAyB,EAAK,UAAU,KAAA,CAAS,GACjD,GACA,IAA2B;EAE/B,IAAI,GAAS;GACX,IAAM,IAAkB,GAAS,UAAU,IAAI,gBAAgB,CAAC,CAAC,QAC3D,IAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,CAAW,GACtE,IAAU,EAA4B,GAAU,GAAe,GAAQ,SAAc,QAAQ,QAAQ,CAAC;GAE5G,IAAI;IACF,IAAc,MAAM,KAAK,GAAU,GAAM,GAAS,CAAe;GACnE,SAAS,GAAG;IAEV,AADA,IAAQ,GACR,IAAS;GACX;EACF;EAEA,OAAO,EAAiB;GACtB;GACA;GACA,SAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,CAAW;GACtE;EACF,CAAC;CACH;CAEA,MAAM,QAAQ,GAAoE;EAChF,KAAK,GAAmB;EAExB,IAAM,IAAc,KAAK,GAAoB,EAAc,GAAQ,KAAK,IAAe,KAAK,EAAK,CAAC,GAC5F,IAAW,KAAK,GAAU,IAAI,CAAW;EAE/C,IAAI,GAAU,OAAO;EAErB,IAAM,IAAO,KAAK,KAAK,GAAa,EAAE,QAAQ,KAAK,GAAmB,OAAO,CAAC,CAAC,CAC5E,MAAM,MAAU;GACf,IAAI,KAAK,IAAW,MAAM,KAAK,GAAmB,OAAO;GAEzD,IAAI,GAAO,WAAW,SAAS,MAAM,EAAM;GAE3C,IAAI,GAAO;IACT,IAAM,IAAM,KAAK,GAAiB,EAAM,QAAQ;IAIhD,AAFI,KAAK,GAAW,QAAQ,MAAI,KAAK,GAAW,OAAO,KAAK,GAAW,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAM,GAE3F,KAAK,GAAW,IACd,GACA,EAAM,QAAQ,KAAK,MAAU,EAAM,IAAI,CACzC;GACF;GAEA,OAAO;EACT,CAAC,CAAC,CACD,OAAO,MAAU;GAGhB,MAFI,KAAK,MAAU,KAAK,GAAa,GAAO,EAAE,QAAQ,UAAU,CAAC,GAE3D;EACR,CAAC,CAAC,CACD,cAAc;GACb,KAAK,GAAU,OAAO,CAAW;EACnC,CAAC;EAIH,OAFA,KAAK,GAAU,IAAI,GAAa,CAAI,GAE7B;CACT;CAeA,QAAQ,GAA+C;EAGrD,OAFA,KAAK,GAAmB,GAEjB,IAAI,SAAS,GAAS,MAAW;GACtC,IAAM,KAAe,MACnB,EAAM,WAAW,UAAU,EAAM,QAAQ,MAAM,MAAM,EAAE,SAAS,CAAI;GAEtE,IAAI,KAAK,GAAc,WAAW,SAAS;IACzC,EAAO,KAAK,GAAc,KAAK;IAE/B;GACF;GAEA,IAAI,EAAY,KAAK,EAAa,GAAG;IACnC,EAAQ,KAAK,EAAa;IAE1B;GACF;GAEA,IAAM,IAAQ,KAAK,WAAW,MAAU;IACtC,AAAI,EAAY,CAAK,KACnB,EAAM,GACN,EAAQ,CAAK,KACJ,EAAM,WAAW,YAC1B,EAAM,GACN,EAAO,EAAM,KAAK;GAEtB,CAAC;GAED,KAAK,GAAmB,OAAO,iBAC7B,eACM;IAEJ,AADA,EAAM,GACN,EAAO,KAAK,GAAmB,OAAO,MAAM;GAC9C,GACA,EAAE,MAAM,GAAK,CACf;EACF,CAAC;CACH;CAYA,YAAY,GAA6B,GAAoD;EAC3F,KAAK,GAAmB;EAExB,IAAM,IAA2B;GAC/B,SAAS;GACT,QAAQ,GAAS;EACnB;EAIA,OAFA,KAAK,GAAqB,IAAI,CAAK,SAEtB;GACX,KAAK,GAAqB,OAAO,CAAK;EACxC;CACF;CAIA,IAAI,iBAA8B;EAChC,OAAO,KAAK,GAAmB;CACjC;CAEA,IAAI,WAAoB;EACtB,OAAO,KAAK;CACd;CAGA,UAAgB;EACV,KAAK,OAET,KAAK,KAAY,IACjB,KAAK,GAAqB,MAAM,GAChC,KAAK,GAAW,MAAM,GACtB,KAAK,GAAW,MAAM,GACtB,KAAK,GAAU,MAAM,GACrB,KAAK,GAAY,WAAW,IAAI,EAAuB,CAAC,GACxD,KAAK,GAAiB,GAEtB,KAAK,GAAmB,MAAM,IAAI,EAAuB,CAAC;CAC5D;CAEA,CAAC,OAAO,WAAiB;EACvB,KAAK,QAAQ;CACf;CAIA,KAA2B;EACzB,IAAI,KAAK,IAAW,MAAM,IAAI,EAAuB;CACvD;CAIA,KAAuC;EACrC,OAAO,KAAK,GAAS,iBAAiB;GACpC,IAAM,EAAE,SAAM,aAAU,cAAW,KAAK,GAAS,UAC3C,IAAU,GAAG,IAAW,IAAS,KACjC,IAAe,KAAK;GAEtB,MAAY,KAEhB,KAAK,GAAiB,KAAK,GAAyB,GAAS,CAAY,GAAG,EAAE,QAAQ,mBAAmB,CAAC;EAC5G,CAAC;CACH;CAEA,MAAM,GAAyB,GAAiB,GAAqC;EACnF,IAAM,IAAU,KAAK,GAAY,MAAM,GACjC,IAAmB,KAAK,GAAc,QAAQ,KAAK,MAAM,EAAE,IAAI,GAC/D,IAAc,KAAK,GAAuB,CAAO,GACjD,IAAU,MAAM,EAAiB,KAAK,IAAsB,GAAkB,CAAW;EAE/F,IAAI,CAAC,EAAQ,UAAU,GAAG;EAE1B,IAAI,CAAC,GAAS;GACZ,KAAK,GAAS,QAAQ,GAAc,KAAK,GAAc,SAAS,YAAY;GAE5E;EACF;EAEA,IAAM,IAAc,MAAM,KAAK,GAC7B,GACA,EAAa,KAAK,IAAO,KAAK,EAAQ,IACrC,GAAU,MAAY;GACrB,IAAI,CAAC,EAAQ,UAAU,GAAG;GAE1B,IAAM,IAAO,KAAK,GAAiB,CAAQ;GAI3C,AAFI,KAAS,KAAK,GAAS,QAAQ,GAAM,EAAS,YAAY,GAE9D,KAAK,KAAY;EACnB,GACA,KAAA,GACA,GACA,EACF;EAEA,AAAI,EAAQ,UAAU,KAAK,CAAC,KAC1B,KAAK,GAAS,QAAQ,GAAc,KAAK,GAAc,SAAS,YAAY;CAEhF;CAIA,GAAa,GAAgB,GAAmC;EAC9D,EAAY,GAAO,GAAS,KAAK,EAAQ;CAC3C;CAEA,GAAiB,GAAwB,GAAmC;EAC1E,EAAa,OAAO,MAAU;GAC5B,AAAI,EAAqB,CAAK,IAC5B,KAAK,GAAa,EAAM,OAAO,EAAM,OAAO,IAE5C,KAAK,GAAa,GAAO,CAAO;EAEpC,CAAC;CACH;CAIA,KAAyB;EACvB,KAAK,GAAW,SAAS,MAAa;GACpC,EAAS,KAAK,EAAa;EAC7B,CAAC;CACH;CAOA,MAAM,GACJ,GACA,GACA,GACoB;EACpB,OAAO,QAAQ,IACb,EAAK,IAAI,OAAO,MAAQ;GACtB,IAAI,CAAC,EAAI,QAAQ;GAEjB,IAAM,IAAS,EAAI;GAEnB,IAAI;IACF,OAAO,MAAM,EAAO;KAAE,GAAG;KAAS;IAAO,CAAsC;GACjF,SAAS,GAAK;IACZ,IAAI,EAAI,SAAS,OAAO,EAAI,QAAQ,GAAK;KAAE,GAAG;KAAS;IAAO,CAA2B;IAEzF,MAAM;GACR;EACF,CAAC,CACH;CACF;CAKA,MAAM,GAAY,GAA0C;EAC1D,IAAI,IAAc;EAElB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;GAC7B,IAAM,IAAS,IAAI,IAAI,GAAa,kBAAkB,GAChD,IAA0B;IAC9B,MAAM,EAAO,KAAK,QAAQ,MAAM,EAAE;IAClC,cAAc;IACd,UAAU,EAAU,EAAO,UAAU,KAAK,EAAK;IAC/C,OAAO,EAAW,EAAO,MAAM;GACjC,GAEM,IAAW,MAAM,KAAK,GAAc,CAAQ;GAElD,IAAI,EAAS,SAAS,YAAY,OAAO;GAEzC,IAAc,KAAK,GAAoB,EAAS,UAAU;EAC5D;EAEA,MAAM,IAAI,EAA2B;CACvC;CAIA,MAAM,GAAc,GAAsD;EACxE,IAAM,EAAE,WAAQ,cAAW,EAAc,EAAS,UAAU,KAAK,EAAQ;EAEzE,IAAI,CAAC,GACH,OAAO;GAAE;GAAU;GAAQ,MAAM;EAAY;EAG/C,IAAI,EAAO,UACT,OAAO;GACL;GACA;GACA,YAAY,EAAc,EAAO,UAAU,KAAK,IAAe,KAAK,EAAK;GACzE,MAAM;EACR;EAGF,IAAI,IAAqC,EAAS,OAE5C,IAAqC,EAAO,gBAAgB,KAAK;EAEvE,IAAI,GACF,IAAI;GACF,IAAgB,EAAO,EAAS,KAAK;EACvC,SAAS,GAAK;GAEZ,AADA,KAAK,GAAa,GAAK,EAAE,QAAQ,gBAAgB,CAAC,GAClD,IAAgB,EAAS;EAC3B;EAGF,OAAO;GACL,QAAQ,EACN,EAAO,YACP,GACA,EAAS,UACT,EAAO,WAAW,UAAU,KAAA,CAAS,CACvC;GACA;GACA;GACA;GACA;GACA,MAAM;EACR;CACF;CAIA,MAAM,GACJ,GACA,GACA,GACA,GACA,GACA,GACA,GACe;EACf,IAAI,CAAC,EAAU,GAAG;EAElB,IAAM,IAAO,EAAO,YACd,IAAU,EAAK,MAAM,MAAM,EAAE,UAAU,IAAI,GAC7C,IAAyB,EAAK,UAAU,KAAA,CAAS;EAErD,IAAI,GAAS;GACX,IAAM,IAAa,KAAK,GAAiB,CAAQ,GAC3C,IAAa,KAAK,GAAU,IAAI,CAAU;GAEhD,IAAI,MACF,MAAM,EAAW,YAAY,KAAA,CAAS,GAElC,CAAC,EAAU,IAAG;GAGpB,IAAM,IAAS,KAAK,GAAW,IAAI,CAAU;GAE7C,IAAI,GAEF,AADA,KAAK,GAAW,OAAO,CAAU,GACjC,IAAc;QACT;IAML,AALA,KAAK,KAAgB,EAAiB;KACpC;KACA,SAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,CAAW;KACtE,QAAQ;IACV,CAAC,GACD,KAAK,GAAiB;IAEtB,IAAI;KACF,IAAc,MAAM,KAAK,GAAU,GAAM,GAAS,CAAM;IAC1D,SAAS,GAAO;KACd,IAAI,CAAC,EAAU,GAAG;KASlB,MAPA,KAAK,KAAgB,EAAiB;MACpC;MACA;MACA,SAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,CAAW;MACtE,QAAQ;KACV,CAAC,GACD,IAAc,CAAK,GACb;IACR;GACF;EACF;EAEK,EAAU,MAEf,KAAK,KAAgB,EAAiB;GACpC;GACA,SAAS,EAAiB,GAAM,GAAQ,EAAS,UAAU,CAAW;GACtE,QAAQ;EACV,CAAC;CACH;CAQA,MAAM,GACJ,GACA,GACA,GACA,GACA,IAAQ,GACR,IAAU,IACQ;EAClB,IAAM,IAAgB,KAAK,IACrB,UAA2B,EAAQ,UAAU,KAAK,CAAC,KAAK,IACxD,IAAW,MAAM,KAAK,GAAc,CAAe;EAEzD,IAAI,CAAC,EAAU,GAAG,OAAO;EAEzB,IAAI,EAAS,SAAS,YAAY;GAChC,IAAI,KAAS,GAAG,MAAM,IAAI,EAA2B;GAErD,OAAO,KAAK,GACV,GACA,KAAK,GAAkB,EAAS,YAAY,EAAgB,YAAY,GACxE,GACA,GACA,IAAQ,GACR,EACF;EACF;EAEA,IAAI,EAAS,SAAS,aAAa;GAEjC,IAAI,KAAK,IAAiB;IACxB,IAAM,IAAS,CAAC,KAAK,GAAgB,IAAI,GACnC,IAAW,EAAiB,GAAQ,CAAC,GAAG,EAAgB,UAAU,CAAC,KAAA,CAAS,CAAC,GAC/E,IAAY,IACZ,GACA,IAAe,IACf,IAAc,IAId,IAAuC,EAAgB;IAE3D,IAAI,KAAK,IACP,IAAI;KACF,IAAkB,KAAK,GAAoB,EAAgB,KAAK;IAClE,SAAS,GAAK;KACZ,KAAK,GAAa,GAAK,EAAE,QAAQ,gBAAgB,CAAC;IACpD;IAGF,IAAM,IAAM,YAA2B;KACrC,IAAI,CAAC,EAAU,GAAG;KAElB,IAAM,IAAU,EACd,GACA,GACA,CAAC,GACD,IACC,GAAQ,MAAY,KAAK,SAAS,GAAQ,CAAO,CACpD;KAEA,IAAc,MAAM,EAClB,GACA,CAAC,GAAG,KAAK,IAAmB,GAAG,KAAK,GAAiB,aAAa,GAClE,YAAY;MACL,EAAU,MAEf,IAAY,IACZ,EAAO,GAAiB,CAAO,GAE1B,EAAU,KAEf,MAAM,KAAK,GACT,KAAK,IACL,GACA,GACA,CAAC,GACD,EAAQ,QACR,IACC,MAAU;OAET,AADA,IAAY,GACZ,IAAe;MACjB,CACF;KACF,IACC,MACC,EAAqB,CAAK,KAAM,KAAgB,MAAU,IACtD,IACA,EAAW,GAAO;MAAE,WAAW;MAAgB,QAAQ;KAAa,CAAC,CAC7E;IACF;IAEA,IAAI;KACF,MAAM,KAAK,GAAmB,GAAK,CAAa;IAClD,SAAS,GAAO;KAKd,MAJI,KAAgB,MAAU,IACtB,EAAW,GAAO;MAAE,WAAW;MAAgB,QAAQ;KAAc,CAAC,IAGxE;IACR,UAAU;KACR,AAAI,EAAU,KAAK,MACjB,KAAK,GAAiB,GACtB,KAAK,GAAa,KAAK,IAAe,CAAa;IAEvD;IAEA,OAAO,KAAe;GACxB;GAgBA,OAdI,CAAC,EAAU,MAEf,EAAO,EAAS,UAAU,CAAO,GAE7B,CAAC,EAAU,KAAU,MAEzB,KAAK,KAAgB,EAAiB;IACpC,UAAU,EAAS;IACnB,SAAS,CAAC;IACV,QAAQ;GACV,CAAC,GACD,KAAK,GAAiB,GACtB,KAAK,GAAa,KAAK,IAAe,CAAa,GAE5C;EACT;EAEA,IAAM,EAAE,WAAQ,aAAU,WAAQ,WAAQ,qBAAkB,GACxD,IAAY,IACZ,GACA,IAAe,IACf,IAAc,IAEZ,IAAM,YAA2B;GACrC,IAAI,CAAC,EAAU,GAAG;GAElB,IAAM,IAAU,EAA4B,GAAU,GAAe,GAAQ,IAAS,GAAQ,MAC5F,KAAK,SAAS,GAAQ,CAAO,CAC/B;GAEA,IAAc,MAAM,EAClB,GACA,CAAC,GAAG,KAAK,IAAmB,GAAG,EAAO,aAAa,GACnD,YAAY;IACL,EAAU,MAEf,IAAY,IACZ,EAAO,GAAU,CAAO,GAEnB,EAAU,KAEf,MAAM,KAAK,GAAa,GAAQ,GAAS,GAAU,GAAQ,EAAQ,QAAQ,IAAY,MAAU;KAE/F,AADA,IAAY,GACZ,IAAe;IACjB,CAAC;GACH,IACC,MACC,EAAqB,CAAK,KAAM,KAAgB,MAAU,IACtD,IACA,EAAW,GAAO;IAAE,WAAW,EAAO,KAAK;IAAM,QAAQ;GAAa,CAAC,CAC/E;EACF;EAEA,IAAI;GACF,MAAM,KAAK,GAAmB,GAAK,CAAa;EAClD,SAAS,GAAO;GAKd,MAJI,KAAgB,MAAU,IACtB,EAAW,GAAO;IAAE,WAAW,EAAO,KAAK;IAAM,QAAQ;GAAc,CAAC,IAG1E;EACR,UAAU;GACR,AAAI,EAAU,KAAK,MACjB,KAAK,GAAiB,GACtB,KAAK,GAAa,KAAK,IAAe,CAAa;EAEvD;EAEA,OAAO,KAAe;CACxB;CAEA,MAAM,GAAmB,GAA0B,GAAwC;EACzF,KAAK,KAAiB,KAAK,OAAuB,OAAO,WAAa,KAAa;GACjF,IAAM,IACJ,SAGA;GAEF,IAAI,GAAqB;IACvB,MAAM,EAAoB,KAAK,UAAU,CAAG,CAAC,CAAC;IAE9C;GACF;EACF;EAEA,MAAM,EAAI;CACZ;CAEA,GAAa,GAAgB,GAAwB;EACnD,IAAI,CAAC,KAAK,MAAW,OAAO,SAAW,KAAa;EAEpD,IAAM,IAAW,KAAK,GAAQ,GAAI,CAAI;EAElC,UAAa,YAEjB;OAAI,MAAa,OAAO;IACtB,OAAO,SAAS,GAAG,CAAC;IAEpB;GACF;GAEA,OAAO,SAAS,EAAS,GAAG,EAAS,CAAC;EAFtC;CAGF;CAIA,GAAoB,GAAsB;EACxC,IAAM,IAAS,IAAI,IAAI,GAAM,kBAAkB,GACzC,IAAiB,EAAU,EAAO,UAAU,KAAK,EAAK;EAE5D,OAAO,GAAG,EAAU,KAAK,IAAO,CAAc,IAAI,EAAO,SAAS,EAAO;CAC3E;CAEA,GAAkB,GAAc,GAAsC;EACpE,IAAM,IAAS,IAAI,IAAI,KAAK,GAAoB,CAAI,GAAG,kBAAkB;EAEzE,OAAO;GACL,MAAM,EAAO,KAAK,QAAQ,MAAM,EAAE;GAClC;GACA,UAAU,EAAU,EAAO,UAAU,KAAK,EAAK;GAC/C,OAAO,EAAW,EAAO,MAAM;EACjC;CACF;CAEA,GAAiB,GAAiC;EAChD,IAAM,IAAS,IAAI,gBAAgB;EAEnC,KAAK,IAAM,CAAC,GAAK,MAAU,OAAO,QAAQ,EAAS,KAAK,GACtD,AAAI,MAAM,QAAQ,CAAK,IACrB,EAAM,SAAS,MAAS;GACtB,EAAO,OAAO,GAAK,CAAI;EACzB,CAAC,IACE,EAAO,IAAI,GAAK,CAAK;EAG5B,IAAM,IAAQ,EAAO,SAAS,GACxB,IAAO,EAAS,OAAO,IAAI,EAAS,SAAS;EAEnD,OAAO,GAAG,EAAU,KAAK,IAAO,EAAS,QAAQ,IAAI,IAAQ,IAAI,MAAU,KAAK;CAClF;CAEA,GAAuB,GAAqC;EAC1D,IAAM,IAAS,IAAI,IAAI,GAAM,kBAAkB,GACzC,IAAW,EAAU,EAAO,UAAU,KAAK,EAAK,GAChD,EAAE,WAAQ,cAAW,EAAc,GAAU,KAAK,EAAQ;EAEhE,OAAO;GACL,MAAM,GAAQ,KAAK;GACnB;GACA;GACA,OAAO,EAAW,EAAO,MAAM;EACjC;CACF;CAGA,MAAM,GAAgB,GAAc,IAA2B,CAAC,GAAkB;EAChF,KAAK,GAAmB;EAExB,IAAM,IAAc,KAAK,GAAoB,CAAI;EAEjD,IAAI,CAAC,EAAQ,SAAS,MAAgB,KAAK,IAAW;EAEtD,IAAM,IAAU,KAAK,GAAY,MAAM,GACjC,IAAmB,KAAK,GAAc,QAAQ,KAAK,MAAU,EAAM,IAAI,GACvE,IAAU,MAAM,EACpB,KAAK,IACL,GACA,KAAK,GAAuB,CAAW,CACzC;EAEI,IAAC,EAAQ,UAAU,KAAM,GAE7B,IAAI;GACF,MAAM,KAAK,GACT,GACA,KAAK,GAAkB,GAAa,EAAQ,KAAK,IAChD,GAAU,MAAY;IACrB,IAAI,CAAC,EAAQ,UAAU,GAAG;IAE1B,IAAM,IAAO,KAAK,GAAiB,CAAQ;IAK3C,AAHI,IAAS,KAAK,GAAS,QAAQ,GAAM,EAAS,YAAY,IACzD,KAAK,GAAS,KAAK,GAAM,EAAS,YAAY,GAEnD,KAAK,KAAY;GACnB,GACA,EAAQ,gBACR,GACA,EAAQ,WAAW,EACrB;EACF,SAAS,GAAO;GACd,MAAM,EAAqB,CAAK,IAAI,EAAM,QAAQ;EACpD;CACF;AACF;AAeA,SAAgB,EAA+C,GAAkD;CAC/G,OAAO,IAAI,EAAO,CAAO;AAC3B"}
package/dist/types.d.ts CHANGED
@@ -12,14 +12,8 @@ export type QueryParams = Record<string, string | string[]>;
12
12
  export type ResolvedQueryValue = boolean | number | string;
13
13
  export type ResolvedQueryParams = Record<string, ResolvedQueryValue | ResolvedQueryValue[]>;
14
14
  export type MaybePromise<T> = T | Promise<T>;
15
- /**
16
- * An async generator used as a streaming data loader.
17
- * Each `yield` emits a partial result (status: `'streaming'`).
18
- * The `return` value becomes the final settled data (status: `'idle'`).
19
- */
20
- export type DataStream<T = unknown> = AsyncGenerator<T, T>;
21
- /** Navigation status for the whole router and per-route match status. */
22
- export type NavigationStatus = 'error' | 'idle' | 'loading' | 'streaming';
15
+ /** Navigation status for the whole router. */
16
+ export type NavigationStatus = 'error' | 'idle' | 'loading';
23
17
  export type IsActiveOptions = {
24
18
  /** Require an exact pathname match. Defaults to prefix matching. */
25
19
  exact?: boolean;
@@ -44,7 +38,6 @@ export type RouterErrorContext = {
44
38
  } | {
45
39
  source: 'coerce-search' | 'history-listener' | 'initial-navigation' | 'preload';
46
40
  };
47
- export type RouterErrorSource = RouterErrorContext['source'];
48
41
  /**
49
42
  * Per-route search-param coercion function.
50
43
  * Receives raw parsed strings and returns typed values (e.g. numbers, booleans).
@@ -123,8 +116,8 @@ export type RouteContext<Params extends RouteParams = RouteParams, TRoutes exten
123
116
  export type DataContext<Params extends RouteParams = RouteParams, TRoutes extends RouteTable = RouteTable> = RouteContext<Params, TRoutes> & {
124
117
  readonly signal: AbortSignal;
125
118
  };
126
- /** Data loader function. May return a plain value/Promise or an AsyncGenerator for streaming. */
127
- export type DataFn<Params extends RouteParams = RouteParams, TRoutes extends RouteTable = RouteTable> = (context: DataContext<Params, TRoutes>) => DataStream | MaybePromise<unknown>;
119
+ /** Data loader function. Returns a value or a Promise that resolves to the data. */
120
+ export type DataFn<Params extends RouteParams = RouteParams, TRoutes extends RouteTable = RouteTable> = (context: DataContext<Params, TRoutes>) => MaybePromise<unknown>;
128
121
  /**
129
122
  * Global middleware function. Call `next()` to continue the chain; return without calling it to block navigation.
130
123
  */
@@ -143,9 +136,6 @@ export type RouteMiddleware<Path extends string = string, TRoutes extends RouteT
143
136
  type RouteCommon = {
144
137
  /** Nested child routes. Keys become part of the compound route name (e.g. `dashboard.settings`). */
145
138
  children?: RouteChildren;
146
- /** Optional view payload for framework-level RouterView rendering. */
147
- component?: unknown;
148
- meta?: unknown;
149
139
  };
150
140
  type PathRouteShape<Path extends string = string> = {
151
141
  index?: false;
@@ -163,12 +153,8 @@ type ContentRouteDefinition<Path extends string = string> = RouteCommon & RouteP
163
153
  coerceSearch?: CoerceSearchFn;
164
154
  /**
165
155
  * Data loader. Runs after middleware; result is available as `match.data` in the matched branch.
166
- * Supports streaming via AsyncGenerator. May also perform side effects directly
167
- * (rendering, state hydration) — replaces the former `handler` concept.
168
156
  */
169
157
  data?: DataFn<PathParams<Path>>;
170
- /** Lazy-load the route module. The resolved export replaces data/component/meta. */
171
- lazy?: () => Promise<Pick<ContentRouteDefinition<Path>, 'component' | 'data' | 'meta'>>;
172
158
  /**
173
159
  * Per-route middleware with typed params. Use `RouteMiddleware<Path>` for inline type safety.
174
160
  * Runs after parent middleware, before this route's data loader.
@@ -186,7 +172,6 @@ type ContentRouteDefinition<Path extends string = string> = RouteCommon & RouteP
186
172
  type RedirectRouteDefinition<Path extends string = string> = RouteCommon & RoutePathShape<Path> & {
187
173
  coerceSearch?: never;
188
174
  data?: never;
189
- lazy?: never;
190
175
  middleware?: never;
191
176
  onError?: never;
192
177
  /** Declarative redirect. Resolved before middleware runs. */
@@ -200,17 +185,18 @@ type BuildPath<Parent extends string, Def extends RouteDefinition<string>> = Def
200
185
  } ? Parent : Def extends {
201
186
  path: infer Path extends string;
202
187
  } ? JoinPath<Parent, Path> : Parent;
203
- type RouteEntry<Name extends string, Path extends string> = {
188
+ type RouteEntry<Name extends string, Path extends string, Definition extends RouteDefinition<string>> = {
189
+ definition: Definition;
204
190
  name: Name;
205
191
  path: Path;
206
192
  };
207
193
  type ChildEntries<Children extends RouteChildren, Prefix extends string, ParentPath extends string> = {
208
- [ChildName in keyof Children & string]: RouteEntry<`${Prefix}.${ChildName}`, BuildPath<ParentPath, Children[ChildName]>> | (Children[ChildName] extends {
194
+ [ChildName in keyof Children & string]: RouteEntry<`${Prefix}.${ChildName}`, BuildPath<ParentPath, Children[ChildName]>, Children[ChildName]> | (Children[ChildName] extends {
209
195
  children: infer Nested extends RouteChildren;
210
196
  } ? ChildEntries<Nested, `${Prefix}.${ChildName}`, BuildPath<ParentPath, Children[ChildName]>> : never);
211
197
  }[keyof Children & string];
212
198
  type RouteEntries<TRoutes extends RouteTable> = {
213
- [Name in keyof TRoutes & string]: RouteEntry<Name, BuildPath<'/', TRoutes[Name]>> | (TRoutes[Name] extends {
199
+ [Name in keyof TRoutes & string]: RouteEntry<Name, BuildPath<'/', TRoutes[Name]>, TRoutes[Name]> | (TRoutes[Name] extends {
214
200
  children: infer Children extends RouteChildren;
215
201
  } ? ChildEntries<Children, Name, BuildPath<'/', TRoutes[Name]>> : never);
216
202
  }[keyof TRoutes & string];
@@ -221,6 +207,17 @@ export type RoutePathByName<TRoutes extends RouteTable, Name extends string> = E
221
207
  } ? Path : string;
222
208
  export type RouteTable = Record<string, RouteDefinition<string>>;
223
209
  export type RouteName<TRoutes extends RouteTable> = RouteEntries<TRoutes>['name'];
210
+ export type RouteViewName<TRoutes extends RouteTable> = Exclude<RouteEntries<TRoutes>, {
211
+ definition: {
212
+ redirect: unknown;
213
+ };
214
+ }>['name'];
215
+ export type RouteViewMap<TRoutes extends RouteTable> = {
216
+ readonly [Name in RouteViewName<TRoutes>]: unknown;
217
+ };
218
+ export type RouteViewRegistry<TView = unknown> = {
219
+ resolve(state: RouteState): TView | undefined;
220
+ };
224
221
  export type NamedNavigationTarget<TRoutes extends RouteTable> = {
225
222
  [Name in RouteName<TRoutes>]: {
226
223
  hash?: string;
@@ -231,24 +228,16 @@ export type NamedNavigationTarget<TRoutes extends RouteTable> = {
231
228
  }[RouteName<TRoutes>];
232
229
  /**
233
230
  * A single node in the matched route branch (root → leaf).
234
- *
235
- * Each match node carries its own `status` so nested layouts can reflect
236
- * per-slot loading/streaming state without polling the router-level status.
237
231
  */
238
- export type RouteMatch<TMeta = unknown, TComponent = unknown> = {
239
- /** Optional view payload copied from route `component` or lazy module output. */
240
- readonly component: TComponent;
232
+ export type RouteMatch = {
241
233
  /** Result of the route's `data()` function, or `undefined` if none was defined. */
242
234
  readonly data: unknown;
243
- readonly meta: TMeta;
244
235
  readonly name: string;
245
236
  readonly params: RouteParams;
246
237
  readonly pathname: string;
247
- /** Per-node loading status. Reflects individual loader state in nested layouts. */
248
- readonly status: NavigationStatus;
249
238
  };
250
239
  /** Ordered array of matched route nodes from the root layout down to the active leaf. */
251
- export type RouteMatchBranch<TMeta = unknown, TComponent = unknown> = readonly RouteMatch<TMeta, TComponent>[];
240
+ export type RouteMatchBranch = readonly RouteMatch[];
252
241
  export type RouteLocation = {
253
242
  readonly hash: string;
254
243
  /** State object stored on the history entry (mirrors `history.state`). */
@@ -260,21 +249,20 @@ export type RouteLocation = {
260
249
  */
261
250
  readonly query: QueryParams;
262
251
  };
263
- export type RouteState<TMeta = unknown, TComponent = unknown> = {
252
+ export type RouteState = {
264
253
  /** The error thrown by a `data()` function. Only set when `status === 'error'`. */
265
254
  readonly error?: unknown;
266
255
  readonly location: RouteLocation;
267
- /** Matched route branch from root to leaf, including per-node data loader results. */
268
- readonly matches: RouteMatchBranch<TMeta, TComponent>;
256
+ /** Matched route branch from root to leaf, including data loader results. */
257
+ readonly matches: RouteMatchBranch;
269
258
  /**
270
259
  * `idle` — navigation settled successfully.
271
260
  * `loading` — data loaders are in-flight.
272
- * `streaming` — at least one data loader is an AsyncGenerator still yielding partial results.
273
261
  * `error` — a data loader threw and no route-level `onError` handled it.
274
262
  */
275
263
  readonly status: NavigationStatus;
276
264
  };
277
- export type RouterOptions<TRoutes extends RouteTable = RouteTable, TMeta = unknown, TComponent = unknown> = {
265
+ export type RouterOptions<TRoutes extends RouteTable = RouteTable> = {
278
266
  /** Base path for all routes (default: '/'). */
279
267
  base?: string;
280
268
  /**
@@ -291,13 +279,13 @@ export type RouterOptions<TRoutes extends RouteTable = RouteTable, TMeta = unkno
291
279
  * Declared explicitly and matched last after all routes.
292
280
  * The `data` function receives the unmatched pathname via `ctx.pathname`.
293
281
  */
294
- notFound?: Pick<ContentRouteDefinition, 'component' | 'data' | 'meta' | 'middleware'>;
282
+ notFound?: Pick<ContentRouteDefinition, 'data' | 'middleware'>;
295
283
  /** Optional sink for non-awaited/background router errors. */
296
284
  onError?: (error: unknown, context: RouterErrorContext) => void;
297
285
  /** Declarative route table. Object key order determines match precedence. */
298
286
  routes: TRoutes;
299
287
  /** Called after every successful navigation. Return `top`, `preserve`, or explicit coordinates. */
300
- scroll?: (to: RouteState<TMeta, TComponent>, from: RouteState<TMeta, TComponent>) => ScrollDecision;
288
+ scroll?: (to: RouteState, from: RouteState) => ScrollDecision;
301
289
  /** Wrap navigation in the View Transition API when available. */
302
290
  viewTransition?: boolean;
303
291
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{constructor(){super(`Router is disposed`)}},n=class extends e{},r=class extends e{constructor(){super(`Redirect loop detected`)}},i=class extends e{};function a(){return{back(){window.history.back()},get location(){return{hash:window.location.hash,pathname:window.location.pathname,search:window.location.search,state:window.history.state}},onPopstate(e){return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},push(e,t){window.history.pushState(t,``,e)},replace(e,t){window.history.replaceState(t,``,e)}}}function o(e=`/`){let t=new URL(e,`http://localhost`),n=[{hash:t.hash,pathname:t.pathname,search:t.search,state:null}],r=0,i=new Set;return{back(){r<=0||(--r,i.forEach(e=>{e()}))},get location(){return n[r]},onPopstate(e){return i.add(e),()=>i.delete(e)},push(e,t=null){let i=new URL(e,`http://localhost`);n.splice(r+1),n.push({hash:i.hash,pathname:i.pathname,search:i.search,state:t}),r=n.length-1},replace(e,t=null){let i=new URL(e,`http://localhost`);n[r]={hash:i.hash,pathname:i.pathname,search:i.search,state:t}}}}function s(e,t){return async n=>{await n.navigate(e,t)}}function c(){let e;return{begin(){e?.abort();let t=new AbortController;return e=t,{isCurrent:()=>e===t&&!t.signal.aborted,signal:t.signal}},invalidate(t){e?.abort(t),e=void 0}}}function l(e){let t=`/${e}`.replace(/\/+/g,`/`);return t!==`/`&&t.endsWith(`/`)?t.slice(0,-1):t}function u(e,t){return l(`${e}/${t}`)}function d(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function f(e){let t=l(e);if(t===`/`)return{paramNames:[],pattern:/^\/$/,prefixPattern:/^\/$/};let r=[],i=t.slice(1).split(`/`),a=[`^`],o=[`^`];for(let t=0;t<i.length;t+=1){let s=i[t];if(s===`*`){if(t!==i.length-1)throw new n(`Wildcard "*" must be the final segment in path: ${e}`);a.push(`(?:/.*)?`);break}if(s.startsWith(`:`)&&s.endsWith(`*`)){if(t!==i.length-1)throw new n(`Wildcard param must be final segment in path: ${e}`);let c=s.slice(1,-1);if(!/^\w+$/.test(c))throw new n(`Invalid param name ":${c}" in path "${e}". Param names must only contain word characters (a–z, A–Z, 0–9, _).`);r.push(c),a.push(t===i.length-1?`(?:/(.*))?`:`/(.*)`),o.push(`/.*`);break}if(s.startsWith(`:`)){let t=s.slice(1);if(!/^\w+$/.test(t))throw new n(`Invalid param name ":${t}" in path "${e}". Param names must only contain word characters (a–z, A–Z, 0–9, _).`);r.push(t),a.push(`/([^/]+)`),o.push(`/[^/]+`);continue}let c=d(s);a.push(`/${c}`),o.push(`/${c}`)}return a.push(`$`),o.push(`(?:/.*)?$`),{paramNames:r,pattern:new RegExp(a.join(``)),prefixPattern:new RegExp(o.join(``))}}function p(e,t){let n=t.matcher.pattern.exec(e);if(!n)return null;let r={};return t.matcher.paramNames.forEach((e,t)=>{let i=n[t+1]??``;try{r[e]=decodeURIComponent(i)}catch{r[e]=i}}),r}function m(e,t){for(let n of t){let t=p(e,n);if(t)return{params:t,record:n}}return{params:{}}}function h(e,t){return t.matcher.prefixPattern.test(e)}function g(e){let t=new URLSearchParams(e),n={},r=(e,t)=>{Object.defineProperty(n,e,{configurable:!0,enumerable:!0,value:t,writable:!0})};for(let[e,i]of t.entries()){let t=Object.hasOwn(n,e)?n[e]:void 0;if(t===void 0){r(e,i);continue}if(Array.isArray(t)){t.push(i);continue}r(e,[t,i])}return n}function _(e,t,r={},i){let a=t.replace(/:(\w+)(\*)?/g,(e,t,i)=>{let a=r[t];if(a==null)throw new n(`Missing path param: ${t}`);return i?a.split(`/`).map(e=>encodeURIComponent(e)).join(`/`):encodeURIComponent(a)});if(i&&Object.keys(i).length){let e=new URLSearchParams;Object.entries(i).forEach(([t,n])=>{Array.isArray(n)?n.forEach(n=>{e.append(t,String(n))}):e.set(t,String(n))}),a+=`?${e.toString()}`}return u(e,a)}function v(e,t=`/`){let n=l(e),r=l(t);if(r===`/`)return n;if(n===r)return`/`;let i=`${r}/`;return n.startsWith(i)?l(n.slice(r.length)):n}function y(e,t){return{hash:t.location.hash.replace(/^#/,``),historyState:t.location.state,pathname:v(t.location.pathname||`/`,e),query:g(t.location.search||``)}}function b(e,t,n,r){let i=_(e,t,n);if(!r||Object.keys(r).length===0)return i;let a=new URLSearchParams;for(let[e,t]of Object.entries(r))Array.isArray(t)?t.forEach(t=>{a.append(e,t)}):a.set(e,t);return`${i}?${a.toString()}`}function x(e){let t=[],r=(e,i,a,o,s)=>{if(i.index&&i.path!==void 0)throw new n(`Route "${e}" cannot define both index and path`);if(!i.index&&i.path===void 0)throw new n(`Route "${e}" must define path or set index: true`);let c=i.index?a:l(i.path?u(a,i.path):a),d=[...o,{component:i.component,dataFn:i.data,lazy:i.lazy,meta:i.meta,name:e,onError:i.onError}],p=[...s,...i.middleware??[]];if(i.children)for(let[t,n]of Object.entries(i.children))r(`${e}.${t}`,n,c,d,p);if(i.lazy!==void 0||i.redirect!==void 0||!i.children||i.data!==void 0){let e=d[d.length-1];t.push({branchDefs:d,coerceSearch:i.coerceSearch,leaf:e,matcher:f(c),ownMiddleware:p,path:c,redirect:i.redirect})}};for(let[t,n]of Object.entries(e.routes))r(t,n,`/`,[],[]);let i=new Set;for(let e of t){if(i.has(e.leaf.name))throw new n(`Duplicate route name: "${e.leaf.name}". A top-level route key must not coincide with a nested route's dot-notation name.`);i.add(e.leaf.name)}let a=!1;for(let e of t){let t=e.path===`/*`||e.path.endsWith(`/*`)||e.path.includes(`:`)&&e.path.endsWith(`*`);a&&!t&&`${e.leaf.name}${e.path}`,t&&(a=!0)}return{records:t,routesByName:new Map(t.map(e=>[e.leaf.name,e]))}}function S(e){return{error:e.error,location:e.location,matches:e.matches,status:e.status}}function C(e,t,n,r,i){return e.map((e,a)=>({component:e.component,data:r[a],meta:e.meta,name:e.name,params:{...t},pathname:n,status:i?.[a]??`idle`}))}function w(e,t,n,r,i){return{hash:e.hash,historyState:e.historyState,locals:{},matches:r,navigate:i,params:n,pathname:e.pathname,query:t}}async function T(e,t,n){let r=!1;async function a(o){if(o<t.length){let n=!1;await t[o]?.(e,async()=>{if(n)throw new i(`next() called multiple times`);n=!0,await a(o+1)});return}r=!0,await n()}return await a(0),r}function E(e,t,n){if(n){n(e,t);return}}async function D(e,t,n){let r=new Set(t),i=[...e];for(let{handler:e,routes:t}of i)if(!(t!==void 0&&!t.some(e=>r.has(e)))&&!await e(n))return!1;return!0}function O(){let e=new Map;function t(t){let n=e.get(t);return n?.overrides.size?t.branchDefs.map((e,t)=>{let r=n.overrides.get(t);return r?{...e,...r}:e}):t.branchDefs}async function n(t){if(!t.branchDefs.some(e=>e.lazy!=null))return;let n=e.get(t);if(n?.done)return;if(n?.work){await n.work;return}n={done:!1,overrides:new Map},e.set(t,n);let r=n,i=(async()=>{let e=t.branchDefs.map((e,t)=>({def:e,i:t})).filter(({def:e})=>e.lazy!=null),n=await Promise.all(e.map(async({def:e,i:t})=>({index:t,mod:await e.lazy()})));for(let{index:e,mod:t}of n){let n={};t.data!==void 0&&(n.dataFn=t.data),t.component!==void 0&&(n.component=t.component),t.meta!==void 0&&(n.meta=t.meta),r.overrides.set(e,n)}r.done=!0,r.work=void 0})();n.work=i;try{await i}catch(n){throw e.delete(t),n}}return{effectiveDefs:t,hydrate:n}}function k(e=20){let t=new Map,n=new Map;return{consume(e){let n=t.get(e);return n!==void 0&&t.delete(e),n},getInflight(e){return n.get(e)},set(n,r){if(t.size>=e){let e=t.keys().next().value;t.delete(e)}t.set(n,r)},track(e,t){n.set(e,t)},untrack(e){n.delete(e)}}}function A(e,t){let r=t.get(e);if(r)return r;let i=[...t.keys()].join(`, `);throw new n(i?`Unknown route name: ${e}. Available routes: ${i}`:`Unknown route name: ${e}`)}function j(e,t,n=`/`){if(`path`in e)return e.path;let r=_(n,A(e.name,t).path,e.params,e.query);return e.hash?`${r}#${e.hash}`:r}var M=Symbol(`wayfinder.errorContext`);function N(e,t){typeof e==`object`&&e&&(e[M]=t)}function P(e){if(typeof e==`object`&&e)return e[M]}function F(e){return typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`&&typeof e.next==`function`&&typeof e.return==`function`}var I=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=new Set;#u=c();#d;#f=!1;#p=new AbortController;#m=`/`;#h=new Set;#g;#_;#v;#y;ready;constructor(e){let t=x(e);if(this.#e=l(e.base??`/`),this.#t=e.middleware??[],this.#n=e.coerceSearch,this.#r=e.history??a(),this.#s=e.viewTransition??!1,this.#o=e.scroll,this.#c=e.onError,this.#i=t.records,this.#a=t.routesByName,this.#_=O(),this.#v=k(),this.#d=S({location:{hash:``,historyState:null,pathname:`/`,query:{}},matches:[],status:`idle`}),e.notFound){let t=e.notFound,n={component:t.component,dataFn:t.data,meta:t.meta,name:`__notFound__`};this.#g={branchDefs:[n],leaf:n,matcher:{paramNames:[],pattern:/(?:)/,prefixPattern:/(?:)/},ownMiddleware:t.middleware??[],path:`/*`}}else this.#g=null;this.#y=this.#x();let{hash:n,pathname:r,search:i}=this.#r.location;this.#m=`${r}${i}${n}`;let o=this.#u.begin();this.ready=this.#F(o,y(this.#e,this.#r),(e,t)=>{if(!o.isCurrent())return;let n=this.#z(e);t&&this.#r.replace(n,e.historyState),this.#m=n},void 0,0,!1).then(()=>void 0),this.#w(this.ready,{source:`initial-navigation`}),this.beforeLeave=this.beforeLeave.bind(this),this.dispose=this.dispose.bind(this),this.getSnapshot=this.getSnapshot.bind(this),this.isActive=this.isActive.bind(this),this.load=this.load.bind(this),this.match=this.match.bind(this),this.navigate=this.navigate.bind(this),this.preload=this.preload.bind(this),this.subscribe=this.subscribe.bind(this),this.url=this.url.bind(this),this.waitFor=this.waitFor.bind(this)}getSnapshot(){return this.#d}subscribe(e){return this.#b(),this.#h.add(e),()=>{this.#h.delete(e)}}navigate(e,t){let n=j(typeof e==`string`?{path:e}:e,this.#a);return this.#V(n,t)}url(e,t,n){let r=A(e,this.#a);return _(this.#e,r.path,t,n)}isActive(e,t={}){let n=A(e,this.#a),r=this.#d.location.pathname;return t.exact??!1?m(r,[n]).record!=null:h(r,n)}match(e){let t=v(l(e),this.#e),{params:n,record:r}=m(t,this.#i);if(!r||r.redirect)return null;let i=this.#_.effectiveDefs(r),a=C(i,n,t,i.map(()=>void 0));return a.length?a:null}async load(e,t){let n=await this.#k(e);if(n.type!==`matched`)return null;let{location:r,params:i,record:a,resolvedQuery:o}=n,s=this.#_.effectiveDefs(a),c=s.some(e=>e.dataFn!=null),l=s.map(()=>void 0),u,d=`idle`;if(c){let e=t?.signal??new AbortController().signal,n=w(r,o,i,C(s,i,r.pathname,l),()=>Promise.resolve());try{l=await this.#D(s,n,e)}catch(e){u=e,d=`error`}}return S({error:u,location:r,matches:C(s,i,r.pathname,l),status:d})}waitFor(e){return this.#b(),new Promise((t,n)=>{let r=t=>t.status===`idle`&&t.matches.some(t=>t.name===e);if(this.#d.status===`error`){n(this.#d.error);return}if(r(this.#d)){t(this.#d);return}let i=this.subscribe(e=>{r(e)?(i(),t(e)):e.status===`error`&&(i(),n(e.error))});this.#p.signal.addEventListener(`abort`,()=>{i(),n(this.#p.signal.reason)},{once:!0})})}async preload(e,t,n){this.#b();let r=A(e,this.#a),i=b(this.#e,r.path,t,n),a=this.#v.getInflight(i);if(a)return a;let o=this.#A(i,this.#p.signal,n).finally(()=>{this.#v.untrack(i)});this.#v.track(i,o);try{return await o}catch(e){throw this.#c&&this.#C(e,{source:`preload`}),e}}beforeLeave(e,t){this.#b();let n={handler:e,routes:t?.routes};return this.#l.add(n),()=>{this.#l.delete(n)}}get disposalSignal(){return this.#p.signal}get disposed(){return this.#f}dispose(){this.#f||(this.#f=!0,this.#l.clear(),this.#h.clear(),this.#u.invalidate(new t),this.#y(),this.#p.abort(new t))}[Symbol.dispose](){this.dispose()}#b(){if(this.#f)throw new t}#x(){return this.#r.onPopstate(()=>{let{hash:e,pathname:t,search:n}=this.#r.location,r=`${t}${n}${e}`,i=this.#m;r!==i&&this.#w(this.#S(r,i),{source:`history-listener`})})}async#S(e,t){let n=this.#u.begin(),r=this.#d.matches.map(e=>e.name),i=this.#B(e),a=await D(this.#l,r,i);if(!n.isCurrent())return;if(!a){this.#r.replace(t,this.#d.location.historyState);return}let o=await this.#F(n,y(this.#e,this.#r),(e,t)=>{if(!n.isCurrent())return;let r=this.#z(e);t&&this.#r.replace(r,e.historyState),this.#m=r},void 0,0,!1);n.isCurrent()&&!o&&this.#r.replace(t,this.#d.location.historyState)}#C(e,t){E(e,t,this.#c)}#w(e,t){e.catch(e=>{this.#C(e,P(e)??t)})}#T(){this.#h.forEach(e=>{e(this.#d)})}async#E(e,t){let n;for(;;){if(t.aborted)return await e.return(void 0).catch(()=>void 0),n;let{done:r,value:i}=await e.next();if(r)return i??n;n=i}}async#D(e,t,n){return Promise.all(e.map(async e=>{if(!e.dataFn)return;let r=e.dataFn,i=r({...t,signal:n});try{return F(i)?await this.#E(i,n):await i}catch(r){if(e.onError)return e.onError(r,{...t,signal:n});throw r}}))}async#O(e,t,n,r,i,a){let o=e.map(e=>{if(!e.dataFn)return;let r=e.dataFn;return r({...t,signal:n})}),s=[],c=await Promise.all(o.map(async(r,i)=>{if(F(r)){s.push(i);return}if(r!==void 0)try{return await r}catch(r){let a=e[i];if(a.onError)return a.onError(r,{...t,signal:n});throw r}}));if(s.length===0)return c;let l=[...c],u=(t,n)=>{if(!r())return;l[n]=t;let o=e.map((e,t)=>s.includes(t)?`streaming`:`idle`);this.#d=S({location:i,matches:C(e,a,i.pathname,l,o),status:`streaming`}),this.#T()};return await Promise.all(s.map(async i=>{let a=o[i];try{l[i]=await this.#M(a,i,n,r,u)}catch(r){let a=e[i];if(a.onError)l[i]=await a.onError(r,{...t,signal:n});else throw r}})),l}async#k(e){let t=e;for(let e=0;e<5;e+=1){let e=new URL(t,`http://localhost`),n={hash:e.hash.replace(/^#/,``),historyState:null,pathname:v(e.pathname,this.#e),query:g(e.search)},r=await this.#j(n);if(r.type!==`redirect`)return r;t=this.#L(r.redirectTo)}throw new r}async#A(e,t,n){let r=await this.#k(e);if(r.type!==`matched`)return;let{location:i,params:a,record:o,resolvedQuery:s}=r,c=this.#_.effectiveDefs(o);if(!c.some(e=>e.dataFn!=null))return;let l=w(i,s,a,C(c,a,i.pathname,c.map(()=>void 0)),()=>Promise.resolve()),u=await this.#D(c,l,t);this.#v.set(b(this.#e,o.path,a,n??i.query),u)}async#j(e){let{params:t,record:n}=m(e.pathname,this.#i);if(!n)return{location:e,params:t,type:`unmatched`};if(n.redirect)return{location:e,params:t,redirectTo:j(n.redirect,this.#a,this.#e),type:`redirect`};let r=e.query,i=n.coerceSearch??this.#n;if(i)try{r=i(e.query)}catch(t){this.#C(t,{source:`coerce-search`}),r=e.query}await this.#_.hydrate(n);let a=this.#_.effectiveDefs(n);return{branch:C(a,t,e.pathname,a.map(()=>void 0)),location:e,params:t,record:n,resolvedQuery:r,type:`matched`}}async#M(e,t,n,r,i){let a;try{for(;;){if(n.aborted||!r())return await e.return(void 0),a;let{done:o,value:s}=await e.next();if(o)return s??a;a=s,i(s,t)}}catch(t){throw await e.return(void 0).catch(()=>void 0),t}}async#N(e,t,n,r,i,a){if(!a())return;let o=this.#_.effectiveDefs(e),s=o.some(e=>e.dataFn!=null),c=o.map(()=>void 0);if(s){let s=b(this.#e,e.path,r,n.query),l=this.#v.consume(s);if(l)c=l;else{let s=o.map(e=>e.dataFn?`loading`:`idle`);this.#d=S({location:n,matches:C(o,r,n.pathname,c,s),status:`loading`}),this.#T();try{c=await this.#O(o,t,i,a,n,r)}catch(t){if(!a())return;throw this.#d=S({error:t,location:n,matches:C(o,r,n.pathname,c),status:`error`}),N(t,{routeName:e.leaf.name,source:`data-loader`}),t}}}a()&&(this.#d=S({location:n,matches:C(o,r,n.pathname,c),status:`idle`}))}async#P(e,t){if((t??this.#s)&&typeof document<`u`){let t=document;if(t.startViewTransition){await t.startViewTransition(e).finished;return}}await e()}async#F(e,t,n,i,a=0,o=!1){let s=this.#d,c=()=>e.isCurrent()&&!this.#f,l=await this.#j(t);if(!c())return!1;if(l.type===`redirect`){if(a>=5)throw new r;return this.#F(e,this.#R(l.redirectTo,t.historyState),n,i,a+1,!0)}if(l.type===`unmatched`){if(this.#g){let r=C([this.#g.leaf],{},t.pathname,[void 0]),a=!1,l=!1,u=t.query;if(this.#n)try{u=this.#n(t.query)}catch(e){this.#C(e,{source:`coerce-search`})}let d=async()=>{if(!c())return;let i=w(t,u,{},r,(e,t)=>this.navigate(e,t));l=await T(i,[...this.#t,...this.#g.ownMiddleware],async()=>{c()&&(a=!0,n(t,o),c()&&await this.#N(this.#g,i,t,{},e.signal,c))})};try{await this.#P(d,i)}finally{c()&&a&&(this.#T(),this.#I(this.#d,s))}return l&&a}return!c()||(n(l.location,o),!c())?!1:(this.#d=S({location:l.location,matches:[],status:`idle`}),this.#T(),this.#I(this.#d,s),!0)}let{branch:u,location:d,params:f,record:p,resolvedQuery:m}=l,h=!1,g=!1,_=async()=>{if(!c())return;let t=w(d,m,f,u,(e,t)=>this.navigate(e,t));g=await T(t,[...this.#t,...p.ownMiddleware],async()=>{c()&&(h=!0,n(d,o),c()&&await this.#N(p,t,d,f,e.signal,c))})};try{await this.#P(_,i)}finally{c()&&h&&(this.#T(),this.#I(this.#d,s))}return g&&h}#I(e,t){if(!this.#o||typeof window>`u`)return;let n=this.#o(e,t);if(n!==`preserve`){if(n===`top`){window.scrollTo(0,0);return}window.scrollTo(n.x,n.y)}}#L(e){let t=new URL(e,`http://localhost`),n=v(t.pathname,this.#e);return`${u(this.#e,n)}${t.search}${t.hash}`}#R(e,t){let n=new URL(this.#L(e),`http://localhost`);return{hash:n.hash.replace(/^#/,``),historyState:t,pathname:v(n.pathname,this.#e),query:g(n.search)}}#z(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e.query))Array.isArray(r)?r.forEach(e=>{t.append(n,e)}):t.set(n,r);let n=t.toString(),r=e.hash?`#${e.hash}`:``;return`${u(this.#e,e.pathname)}${n?`?${n}`:``}${r}`}#B(e){let t=new URL(e,`http://localhost`),n=v(t.pathname,this.#e),{params:r,record:i}=m(n,this.#i);return{name:i?.leaf.name,params:r,pathname:n,query:g(t.search)}}async#V(e,t={}){this.#b();let n=this.#L(e);if(!t.force&&n===this.#m)return;let r=this.#u.begin(),i=this.#d.matches.map(e=>e.name),a=await D(this.#l,i,this.#B(n));!r.isCurrent()||!a||await this.#F(r,this.#R(n,t.state),(e,t)=>{if(!r.isCurrent())return;let n=this.#z(e);t?this.#r.replace(n,e.historyState):this.#r.push(n,e.historyState),this.#m=n},t.viewTransition,0,t.replace??!1)}};function L(e){return new I(e)}exports.WayfinderApiError=i,exports.WayfinderDisposedError=t,exports.WayfinderError=e,exports.WayfinderRedirectLoopError=r,exports.WayfinderRouteError=n,exports.createBrowserHistory=a,exports.createMemoryHistory=o,exports.createRouter=L,exports.redirectTo=s;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{constructor(){super(`Router is disposed`)}},n=class extends e{},r=class extends e{constructor(){super(`Redirect loop detected`)}},i=class extends e{};function a(){return{back(){window.history.back()},get location(){return{hash:window.location.hash,pathname:window.location.pathname,search:window.location.search,state:window.history.state}},onPopstate(e){return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},push(e,t){window.history.pushState(t,``,e)},replace(e,t){window.history.replaceState(t,``,e)}}}function o(e=`/`){let t=new URL(e,`http://localhost`),n=[{hash:t.hash,pathname:t.pathname,search:t.search,state:null}],r=0,i=new Set;return{back(){r<=0||(--r,i.forEach(e=>{e()}))},get location(){return n[r]},onPopstate(e){return i.add(e),()=>i.delete(e)},push(e,t=null){let i=new URL(e,`http://localhost`);n.splice(r+1),n.push({hash:i.hash,pathname:i.pathname,search:i.search,state:t}),r=n.length-1},replace(e,t=null){let i=new URL(e,`http://localhost`);n[r]={hash:i.hash,pathname:i.pathname,search:i.search,state:t}}}}function s(e,t){return async n=>{await n.navigate(e,t)}}function c(){let e;return{begin(){e?.abort();let t=new AbortController;return e=t,{isCurrent:()=>e===t&&!t.signal.aborted,signal:t.signal}},invalidate(t){e?.abort(t),e=void 0}}}function l(e){let t=`/${e}`.replace(/\/+/g,`/`);return t!==`/`&&t.endsWith(`/`)?t.slice(0,-1):t}function u(e,t){return l(`${e}/${t}`)}function d(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function f(e){let t=l(e);if(t===`/`)return{paramNames:[],pattern:/^\/$/,prefixPattern:/^\/$/};let r=[],i=t.slice(1).split(`/`),a=[`^`],o=[`^`];for(let t=0;t<i.length;t+=1){let s=i[t];if(s===`*`){if(t!==i.length-1)throw new n(`Wildcard "*" must be the final segment in path: ${e}`);a.push(`(?:/.*)?`);break}if(s.startsWith(`:`)&&s.endsWith(`*`)){if(t!==i.length-1)throw new n(`Wildcard param must be final segment in path: ${e}`);let c=s.slice(1,-1);if(!/^\w+$/.test(c))throw new n(`Invalid param name ":${c}" in path "${e}". Param names must only contain word characters (a–z, A–Z, 0–9, _).`);r.push(c),a.push(t===i.length-1?`(?:/(.*))?`:`/(.*)`),o.push(`/.*`);break}if(s.startsWith(`:`)){let t=s.slice(1);if(!/^\w+$/.test(t))throw new n(`Invalid param name ":${t}" in path "${e}". Param names must only contain word characters (a–z, A–Z, 0–9, _).`);r.push(t),a.push(`/([^/]+)`),o.push(`/[^/]+`);continue}let c=d(s);a.push(`/${c}`),o.push(`/${c}`)}return a.push(`$`),o.push(`(?:/.*)?$`),{paramNames:r,pattern:new RegExp(a.join(``)),prefixPattern:new RegExp(o.join(``))}}function p(e,t){let n=t.matcher.pattern.exec(e);if(!n)return null;let r={};return t.matcher.paramNames.forEach((e,t)=>{let i=n[t+1]??``;try{r[e]=decodeURIComponent(i)}catch{r[e]=i}}),r}function m(e,t){for(let n of t){let t=p(e,n);if(t)return{params:t,record:n}}return{params:{}}}function h(e,t){return t.matcher.prefixPattern.test(e)}function g(e){let t=new URLSearchParams(e),n={},r=(e,t)=>{Object.defineProperty(n,e,{configurable:!0,enumerable:!0,value:t,writable:!0})};for(let[e,i]of t.entries()){let t=Object.hasOwn(n,e)?n[e]:void 0;if(t===void 0){r(e,i);continue}if(Array.isArray(t)){t.push(i);continue}r(e,[t,i])}return n}function _(e,t,r={},i){let a=t.replace(/:(\w+)(\*)?/g,(e,t,i)=>{let a=r[t];if(a==null)throw new n(`Missing path param: ${t}`);return i?a.split(`/`).map(e=>encodeURIComponent(e)).join(`/`):encodeURIComponent(a)});if(i&&Object.keys(i).length){let e=new URLSearchParams;Object.entries(i).forEach(([t,n])=>{Array.isArray(n)?n.forEach(n=>{e.append(t,String(n))}):e.set(t,String(n))}),a+=`?${e.toString()}`}return u(e,a)}function v(e,t=`/`){let n=l(e),r=l(t);if(r===`/`)return n;if(n===r)return`/`;let i=`${r}/`;return n.startsWith(i)?l(n.slice(r.length)):n}function y(e,t){return{hash:t.location.hash.replace(/^#/,``),historyState:t.location.state,pathname:v(t.location.pathname||`/`,e),query:g(t.location.search||``)}}function b(e){let t=[],r=(e,i,a,o,s)=>{if(i.index&&i.path!==void 0)throw new n(`Route "${e}" cannot define both index and path`);if(!i.index&&i.path===void 0)throw new n(`Route "${e}" must define path or set index: true`);let c=i.index?a:l(i.path?u(a,i.path):a),d=[...o,{dataFn:i.data,name:e,onError:i.onError}],p=[...s,...i.middleware??[]];if(i.children)for(let[t,n]of Object.entries(i.children))r(`${e}.${t}`,n,c,d,p);if(i.redirect!==void 0||!i.children||i.data!==void 0){let e=d[d.length-1];t.push({branchDefs:d,coerceSearch:i.coerceSearch,leaf:e,matcher:f(c),ownMiddleware:p,path:c,redirect:i.redirect})}};for(let[t,n]of Object.entries(e.routes))r(t,n,`/`,[],[]);let i=new Set;for(let e of t){if(i.has(e.leaf.name))throw new n(`Duplicate route name: "${e.leaf.name}". A top-level route key must not coincide with a nested route's dot-notation name.`);i.add(e.leaf.name)}let a=!1;for(let e of t){let t=e.path===`/*`||e.path.endsWith(`/*`)||e.path.includes(`:`)&&e.path.endsWith(`*`);a&&!t&&`${e.leaf.name}${e.path}`,t&&(a=!0)}return{records:t,routesByName:new Map(t.map(e=>[e.leaf.name,e]))}}function x(e){return{error:e.error,location:e.location,matches:e.matches,status:e.status}}function S(e,t,n,r){return e.map((e,i)=>({data:r[i],name:e.name,params:{...t},pathname:n}))}function C(e,t,n,r,i){return{hash:e.hash,historyState:e.historyState,locals:{},matches:r,navigate:i,params:n,pathname:e.pathname,query:t}}async function w(e,t,n,r){let a=!1;async function o(s){if(s<t.length){let n=!1;try{await t[s]?.(e,async()=>{if(n)throw new i(`next() called multiple times`);n=!0,await o(s+1)})}catch(e){throw r?.(e)??e}return}a=!0,await n()}return await o(0),a}function T(e,t,n){if(n){n(e,t);return}}async function E(e,t,n){let r=new Set(t),i=[...e];for(let{handler:e,routes:t}of i)if((t===void 0||t.some(e=>r.has(e)))&&!await e(n))return!1;return!0}function D(e,t){let r=t.get(e);if(r)return r;let i=[...t.keys()].join(`, `);throw new n(i?`Unknown route name: ${e}. Available routes: ${i}`:`Unknown route name: ${e}`)}function O(e,t,n=`/`){if(`path`in e)return e.path;let r=_(n,D(e.name,t).path,e.params,e.query);return e.hash?`${r}#${e.hash}`:r}var k=Symbol(`wayfinder.routerError`);function A(e,t){return{[k]:!0,context:t,error:e}}function j(e){return typeof e==`object`&&!!e&&k in e}function M(e){throw j(e)?e.error:e}var N=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=new Set;#u=c();#d;#f=!1;#p=new AbortController;#m=`/`;#h=new Set;#g=new Map;#_=new Map;#v;#y;ready;constructor(e){let t=b(e);if(this.#e=l(e.base??`/`),this.#t=e.middleware??[],this.#n=e.coerceSearch,this.#r=e.history??a(),this.#o=e.onError,this.#s=e.scroll,this.#c=e.viewTransition??!1,this.#i=t.records,this.#a=t.routesByName,this.#d=x({location:{hash:``,historyState:null,pathname:`/`,query:{}},matches:[],status:`idle`}),e.notFound){let t=e.notFound,n={dataFn:t.data,name:`__notFound__`};this.#v={branchDefs:[n],leaf:n,matcher:{paramNames:[],pattern:/(?:)/,prefixPattern:/(?:)/},ownMiddleware:t.middleware??[],path:`/*`}}else this.#v=null;this.#y=this.#x();let{hash:n,pathname:r,search:i}=this.#r.location;this.#m=`${r}${i}${n}`;let o=this.#u.begin(),s=this.#A(o,y(this.#e,this.#r),(e,t)=>{if(!o.isCurrent())return;let n=this.#F(e);t&&this.#r.replace(n,e.historyState),this.#m=n},void 0,0,!1).then(()=>void 0);this.ready=s.catch(M),this.ready.catch(()=>{}),this.#w(s,{source:`initial-navigation`}),this.beforeLeave=this.beforeLeave.bind(this),this.createViewRegistry=this.createViewRegistry.bind(this),this.dispose=this.dispose.bind(this),this.getSnapshot=this.getSnapshot.bind(this),this.isActive=this.isActive.bind(this),this.load=this.load.bind(this),this.match=this.match.bind(this),this.navigate=this.navigate.bind(this),this.preload=this.preload.bind(this),this.subscribe=this.subscribe.bind(this),this.url=this.url.bind(this),this.waitFor=this.waitFor.bind(this)}getSnapshot(){return this.#d}createViewRegistry(e,t){return{resolve:n=>{let r=n.matches.at(-1)?.name;return r===`__notFound__`?t?.notFound:r?e[r]:void 0}}}subscribe(e){return this.#b(),this.#h.add(e),()=>{this.#h.delete(e)}}navigate(e,t){let n=O(typeof e==`string`?{path:e}:e,this.#a);return this.#L(n,t)}url(e,t,n){let r=D(e,this.#a);return _(this.#e,r.path,t,n)}isActive(e,t={}){let n=D(e,this.#a),r=this.#d.location.pathname;return t.exact??!1?m(r,[n]).record!=null:h(r,n)}match(e){let t=v(l(e),this.#e),{params:n,record:r}=m(t,this.#i);if(!r||r.redirect)return null;let i=S(r.branchDefs,n,t,r.branchDefs.map(()=>void 0));return i.length?i:null}async load(e,t){let n=await this.#D(e);if(n.type!==`matched`)return null;let{location:r,params:i,record:a,resolvedQuery:o}=n,s=a.branchDefs,c=s.some(e=>e.dataFn!=null),l=s.map(()=>void 0),u,d=`idle`;if(c){let e=t?.signal??new AbortController().signal,n=C(r,o,i,S(s,i,r.pathname,l),()=>Promise.resolve());try{l=await this.#E(s,n,e)}catch(e){u=e,d=`error`}}return x({error:u,location:r,matches:S(s,i,r.pathname,l),status:d})}async preload(e){this.#b();let t=this.#N(O(e,this.#a,this.#e)),n=this.#_.get(t);if(n)return n;let r=this.load(t,{signal:this.#p.signal}).then(e=>{if(this.#f)throw this.#p.signal.reason;if(e?.status===`error`)throw e.error;if(e){let t=this.#F(e.location);this.#g.size>=20&&this.#g.delete(this.#g.keys().next().value),this.#g.set(t,e.matches.map(e=>e.data))}return e}).catch(e=>{throw this.#o&&this.#C(e,{source:`preload`}),e}).finally(()=>{this.#_.delete(t)});return this.#_.set(t,r),r}waitFor(e){return this.#b(),new Promise((t,n)=>{let r=t=>t.status===`idle`&&t.matches.some(t=>t.name===e);if(this.#d.status===`error`){n(this.#d.error);return}if(r(this.#d)){t(this.#d);return}let i=this.subscribe(e=>{r(e)?(i(),t(e)):e.status===`error`&&(i(),n(e.error))});this.#p.signal.addEventListener(`abort`,()=>{i(),n(this.#p.signal.reason)},{once:!0})})}beforeLeave(e,t){this.#b();let n={handler:e,routes:t?.routes};return this.#l.add(n),()=>{this.#l.delete(n)}}get disposalSignal(){return this.#p.signal}get disposed(){return this.#f}dispose(){this.#f||(this.#f=!0,this.#l.clear(),this.#h.clear(),this.#g.clear(),this.#_.clear(),this.#u.invalidate(new t),this.#y(),this.#p.abort(new t))}[Symbol.dispose](){this.dispose()}#b(){if(this.#f)throw new t}#x(){return this.#r.onPopstate(()=>{let{hash:e,pathname:t,search:n}=this.#r.location,r=`${t}${n}${e}`,i=this.#m;r!==i&&this.#w(this.#S(r,i),{source:`history-listener`})})}async#S(e,t){let n=this.#u.begin(),r=this.#d.matches.map(e=>e.name),i=this.#I(e),a=await E(this.#l,r,i);if(!n.isCurrent())return;if(!a){this.#r.replace(t,this.#d.location.historyState);return}let o=await this.#A(n,y(this.#e,this.#r),(e,t)=>{if(!n.isCurrent())return;let r=this.#F(e);t&&this.#r.replace(r,e.historyState),this.#m=r},void 0,0,!1);n.isCurrent()&&!o&&this.#r.replace(t,this.#d.location.historyState)}#C(e,t){T(e,t,this.#o)}#w(e,t){e.catch(e=>{j(e)?this.#C(e.error,e.context):this.#C(e,t)})}#T(){this.#h.forEach(e=>{e(this.#d)})}async#E(e,t,n){return Promise.all(e.map(async e=>{if(!e.dataFn)return;let r=e.dataFn;try{return await r({...t,signal:n})}catch(r){if(e.onError)return e.onError(r,{...t,signal:n});throw r}}))}async#D(e){let t=e;for(let e=0;e<5;e+=1){let e=new URL(t,`http://localhost`),n={hash:e.hash.replace(/^#/,``),historyState:null,pathname:v(e.pathname,this.#e),query:g(e.search)},r=await this.#O(n);if(r.type!==`redirect`)return r;t=this.#N(r.redirectTo)}throw new r}async#O(e){let{params:t,record:n}=m(e.pathname,this.#i);if(!n)return{location:e,params:t,type:`unmatched`};if(n.redirect)return{location:e,params:t,redirectTo:O(n.redirect,this.#a,this.#e),type:`redirect`};let r=e.query,i=n.coerceSearch??this.#n;if(i)try{r=i(e.query)}catch(t){this.#C(t,{source:`coerce-search`}),r=e.query}return{branch:S(n.branchDefs,t,e.pathname,n.branchDefs.map(()=>void 0)),location:e,params:t,record:n,resolvedQuery:r,type:`matched`}}async#k(e,t,n,r,i,a,o){if(!a())return;let s=e.branchDefs,c=s.some(e=>e.dataFn!=null),l=s.map(()=>void 0);if(c){let e=this.#F(n),c=this.#_.get(e);if(c&&(await c.catch(()=>void 0),!a()))return;let u=this.#g.get(e);if(u)this.#g.delete(e),l=u;else{this.#d=x({location:n,matches:S(s,r,n.pathname,l),status:`loading`}),this.#T();try{l=await this.#E(s,t,i)}catch(e){if(!a())return;throw this.#d=x({error:e,location:n,matches:S(s,r,n.pathname,l),status:`error`}),o?.(e),e}}}a()&&(this.#d=x({location:n,matches:S(s,r,n.pathname,l),status:`idle`}))}async#A(e,t,n,i,a=0,o=!1){let s=this.#d,c=()=>e.isCurrent()&&!this.#f,l=await this.#O(t);if(!c())return!1;if(l.type===`redirect`){if(a>=5)throw new r;return this.#A(e,this.#P(l.redirectTo,t.historyState),n,i,a+1,!0)}if(l.type===`unmatched`){if(this.#v){let r=S([this.#v.leaf],{},t.pathname,[void 0]),a=!1,l,u=!1,d=!1,f=t.query;if(this.#n)try{f=this.#n(t.query)}catch(e){this.#C(e,{source:`coerce-search`})}let p=async()=>{if(!c())return;let i=C(t,f,{},r,(e,t)=>this.navigate(e,t));d=await w(i,[...this.#t,...this.#v.ownMiddleware],async()=>{c()&&(a=!0,n(t,o),c()&&await this.#k(this.#v,i,t,{},e.signal,c,e=>{l=e,u=!0}))},e=>j(e)||u&&e===l?e:A(e,{routeName:`__notFound__`,source:`middleware`}))};try{await this.#j(p,i)}catch(e){throw u&&e===l?A(e,{routeName:`__notFound__`,source:`data-loader`}):e}finally{c()&&a&&(this.#T(),this.#M(this.#d,s))}return d&&a}return!c()||(n(l.location,o),!c())?!1:(this.#d=x({location:l.location,matches:[],status:`idle`}),this.#T(),this.#M(this.#d,s),!0)}let{branch:u,location:d,params:f,record:p,resolvedQuery:m}=l,h=!1,g,_=!1,v=!1,y=async()=>{if(!c())return;let t=C(d,m,f,u,(e,t)=>this.navigate(e,t));v=await w(t,[...this.#t,...p.ownMiddleware],async()=>{c()&&(h=!0,n(d,o),c()&&await this.#k(p,t,d,f,e.signal,c,e=>{g=e,_=!0}))},e=>j(e)||_&&e===g?e:A(e,{routeName:p.leaf.name,source:`middleware`}))};try{await this.#j(y,i)}catch(e){throw _&&e===g?A(e,{routeName:p.leaf.name,source:`data-loader`}):e}finally{c()&&h&&(this.#T(),this.#M(this.#d,s))}return v&&h}async#j(e,t){if((t??this.#c)&&typeof document<`u`){let t=document.startViewTransition;if(t){await t.call(document,e).finished;return}}await e()}#M(e,t){if(!this.#s||typeof window>`u`)return;let n=this.#s(e,t);if(n!==`preserve`){if(n===`top`){window.scrollTo(0,0);return}window.scrollTo(n.x,n.y)}}#N(e){let t=new URL(e,`http://localhost`),n=v(t.pathname,this.#e);return`${u(this.#e,n)}${t.search}${t.hash}`}#P(e,t){let n=new URL(this.#N(e),`http://localhost`);return{hash:n.hash.replace(/^#/,``),historyState:t,pathname:v(n.pathname,this.#e),query:g(n.search)}}#F(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e.query))Array.isArray(r)?r.forEach(e=>{t.append(n,e)}):t.set(n,r);let n=t.toString(),r=e.hash?`#${e.hash}`:``;return`${u(this.#e,e.pathname)}${n?`?${n}`:``}${r}`}#I(e){let t=new URL(e,`http://localhost`),n=v(t.pathname,this.#e),{params:r,record:i}=m(n,this.#i);return{name:i?.leaf.name,params:r,pathname:n,query:g(t.search)}}async#L(e,t={}){this.#b();let n=this.#N(e);if(!t.force&&n===this.#m)return;let r=this.#u.begin(),i=this.#d.matches.map(e=>e.name),a=await E(this.#l,i,this.#I(n));if(r.isCurrent()&&a)try{await this.#A(r,this.#P(n,t.state),(e,t)=>{if(!r.isCurrent())return;let n=this.#F(e);t?this.#r.replace(n,e.historyState):this.#r.push(n,e.historyState),this.#m=n},t.viewTransition,0,t.replace??!1)}catch(e){throw j(e)?e.error:e}}};function P(e){return new N(e)}exports.WayfinderApiError=i,exports.WayfinderDisposedError=t,exports.WayfinderError=e,exports.WayfinderRedirectLoopError=r,exports.WayfinderRouteError=n,exports.createBrowserHistory=a,exports.createMemoryHistory=o,exports.createRouter=P,exports.redirectTo=s;
2
2
  //# sourceMappingURL=wayfinder.cjs.map