@echojs-ecosystem/router 0.1.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.
- package/README.md +80 -0
- package/dist/index.d.ts +455 -0
- package/dist/index.js +1546 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/path.ts","../src/core/route-event.ts","../src/core/query.ts","../src/core/route.ts","../src/core/create-route.ts","../src/core/navigation.ts","../src/core/route-tree.ts","../src/core/lazy-view.ts","../src/core/page.ts","../src/core/create-route-view.ts","../src/core/create-lazy-route-view.ts","../src/core/create-layout-view.ts","../src/histories/browser-history.ts","../src/histories/hash-history.ts","../src/histories/memory-history.ts","../src/core/history-config.ts","../src/core/auth-guard.ts","../src/core/guard-registry.ts","../src/core/route-config.ts","../src/core/build-named-routes.ts","../src/core/resolve-route-view.ts","../src/core/router-view.ts","../src/core/router.ts","../src/core/create-router.ts","../src/hyperdom/create-router.ts","../src/hyperdom/Link.ts","../src/hyperdom/NavLink.ts","../src/plugin/router-plugin.ts","../src/core/create-routes.ts","../src/operators/guard.ts","../src/operators/redirect.ts","../src/operators/chain-route.ts"],"names":["signal","options","authorized","walk","routes","createRouter","h"],"mappings":"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","file":"index.js","sourcesContent":["import type { MatchResult } from \"./types\";\n\nexport const normalizePathname = (pathname: string): string => {\n let path = pathname;\n const queryIndex = path.indexOf(\"?\");\n if (queryIndex !== -1) path = path.slice(0, queryIndex);\n const hashIndex = path.indexOf(\"#\");\n if (hashIndex !== -1) path = path.slice(0, hashIndex);\n\n if (!path || path === \"/\") return \"/\";\n path = path.replace(/\\/+$/, \"\");\n return path || \"/\";\n};\n\nexport const joinRoutePaths = (parentPath: string, childPath: string): string => {\n const parent = normalizePathname(parentPath || \"/\");\n const child = childPath.trim();\n\n if (!child || child === \"/\") return parent;\n\n if (child.startsWith(\"/\")) {\n return normalizePathname(child);\n }\n\n const base = parent === \"/\" ? \"\" : parent;\n return normalizePathname(`${base}/${child}`);\n};\n\nconst splitSegments = (path: string): string[] => {\n const normalized = normalizePathname(path);\n if (normalized === \"/\") return [];\n return normalized.slice(1).split(\"/\");\n};\n\nconst decodeParam = (value: string): string => {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\nconst encodeParam = (value: string): string => encodeURIComponent(value);\n\nexport const matchPath = (pattern: string, pathname: string): MatchResult => {\n const patternSegments = splitSegments(pattern);\n const pathSegments = splitSegments(pathname);\n\n if (patternSegments.length === 0) {\n return { matched: pathSegments.length === 0, params: {} };\n }\n\n const params: Record<string, string> = {};\n let pi = 0;\n let si = 0;\n\n while (pi < patternSegments.length) {\n const segment = patternSegments[pi]!;\n\n if (segment === \"*\") {\n if (si > pathSegments.length) {\n return { matched: false, params: {} };\n }\n const rest = pathSegments.slice(si).map(decodeParam).join(\"/\");\n params[\"*\"] = rest;\n return { matched: true, params };\n }\n\n if (si >= pathSegments.length) {\n return { matched: false, params: {} };\n }\n\n if (segment.startsWith(\":\")) {\n const key = segment.slice(1);\n params[key] = decodeParam(pathSegments[si]!);\n pi += 1;\n si += 1;\n continue;\n }\n\n if (segment !== pathSegments[si]) {\n return { matched: false, params: {} };\n }\n\n pi += 1;\n si += 1;\n }\n\n if (si !== pathSegments.length) {\n return { matched: false, params: {} };\n }\n\n return { matched: true, params };\n};\n\nexport const buildPath = (pattern: string, params: Record<string, string> = {}): string => {\n const segments = splitSegments(pattern);\n if (segments.length === 0) return \"/\";\n\n const built = segments.map((segment) => {\n if (segment === \"*\") {\n const value = params[\"*\"] ?? \"\";\n return value.split(\"/\").map(encodeParam).join(\"/\");\n }\n if (segment.startsWith(\":\")) {\n const key = segment.slice(1);\n const value = params[key];\n if (value === undefined) {\n throw new Error(`Missing path param \"${key}\" for pattern \"${pattern}\"`);\n }\n return encodeParam(value);\n }\n return segment;\n });\n\n return `/${built.join(\"/\")}`;\n};\n\nexport const splitLocation = (location: string): { pathname: string; search: string } => {\n let path = location;\n let search = \"\";\n\n const queryIndex = path.indexOf(\"?\");\n if (queryIndex !== -1) {\n search = path.slice(queryIndex);\n path = path.slice(0, queryIndex);\n }\n\n const hashIndex = path.indexOf(\"#\");\n if (hashIndex !== -1) {\n path = path.slice(0, hashIndex);\n }\n\n return {\n pathname: normalizePathname(path),\n search,\n };\n};\n\nexport const joinLocation = (pathname: string, search: string): string => {\n const path = normalizePathname(pathname);\n if (!search) return path;\n return search.startsWith(\"?\") ? `${path}${search}` : `${path}?${search}`;\n};\n","import type { RouteEvent } from \"./types\";\n\nexport type RouteEventEmitter<T> = RouteEvent<T> & {\n emit(payload: T): void;\n};\n\nexport const createRouteEvent = <T>(): RouteEventEmitter<T> => {\n const listeners = new Set<(payload: T) => void>();\n\n return {\n subscribe(listener: (payload: T) => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n emit(payload: T): void {\n for (const listener of listeners) {\n listener(payload);\n }\n },\n };\n};\n","export type QueryPrimitive = string | number | boolean;\nexport type QueryValue = QueryPrimitive | QueryPrimitive[] | null | undefined;\nexport type QueryRecord = Record<string, QueryValue>;\n\nconst isQueryPrimitive = (value: unknown): value is QueryPrimitive =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n\nexport const parseQuery = (search: string): Record<string, string> => {\n const raw = search.startsWith(\"?\") ? search.slice(1) : search;\n if (!raw) return {};\n\n const params = new URLSearchParams(raw);\n const result: Record<string, string> = {};\n for (const [key, value] of params.entries()) {\n result[key] = value;\n }\n return result;\n};\n\nexport const parseQueryValues = (search: string): Record<string, string | string[]> => {\n const raw = search.startsWith(\"?\") ? search.slice(1) : search;\n if (!raw) return {};\n\n const params = new URLSearchParams(raw);\n const result: Record<string, string | string[]> = {};\n\n for (const key of new Set(params.keys())) {\n const values = params.getAll(key);\n if (values.length === 1) {\n result[key] = coerceQueryValue(values[0]!);\n continue;\n }\n result[key] = values.map(coerceQueryValue);\n }\n\n return result;\n};\n\nconst coerceQueryValue = (value: string): string => {\n if (value === \"true\") return \"true\";\n if (value === \"false\") return \"false\";\n return value;\n};\n\nexport const stringifyQuery = (query: QueryRecord): string => {\n const params = new URLSearchParams();\n\n for (const [key, value] of Object.entries(query)) {\n if (value === null || value === undefined) continue;\n\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item === null || item === undefined) continue;\n params.append(key, String(item));\n }\n continue;\n }\n\n if (isQueryPrimitive(value)) {\n params.append(key, String(value));\n }\n }\n\n const serialized = params.toString();\n return serialized ? `?${serialized}` : \"\";\n};\n\nexport const mapQueryToRecord = <Query extends Record<string, unknown>>(\n raw: Record<string, string>,\n): Query => raw as Query;\n","import { signal } from \"@echojs-ecosystem/reactivity\";\nimport type { Signal } from \"@echojs-ecosystem/reactivity\";\nimport { buildPath, joinLocation } from \"./path\";\nimport { createRouteEvent, type RouteEventEmitter } from \"./route-event\";\nimport { mapQueryToRecord, stringifyQuery, type QueryRecord } from \"./query\";\nimport type { GoOptions, Route, RouteOpenedPayload } from \"./types\";\nimport type { RouterInternal } from \"./router\";\n\nexport type RouteInternalState<Params, Query> = {\n name?: string;\n pathTemplate: string | null;\n router: RouterInternal | null;\n $isOpened: Signal<boolean>;\n $params: Signal<Params | null>;\n $query: Signal<Query>;\n $path: Signal<string | null>;\n $fullPath: Signal<string | null>;\n opened: RouteEventEmitter<RouteOpenedPayload<Params, Query>>;\n closed: RouteEventEmitter<void>;\n wasOpened: boolean;\n};\n\nconst routeStates = new WeakMap<Route<any, any>, RouteInternalState<any, any>>();\n\nexport const getRouteState = <Params, Query>(\n route: Route<Params, Query>,\n): RouteInternalState<Params, Query> => {\n const state = routeStates.get(route);\n if (!state) {\n throw new Error(\"Unknown route instance\");\n }\n return state;\n};\n\nexport const bindRouteToRouter = (\n route: Route<any, any>,\n router: RouterInternal,\n pathTemplate: string,\n): void => {\n const state = getRouteState(route);\n state.router = router;\n state.pathTemplate = pathTemplate;\n};\n\nexport const createRouteModel = <Params = Record<string, never>, Query = Record<string, never>>(\n name?: string,\n): Route<Params, Query> => {\n const $isOpened = signal(false);\n const $params = signal<Params | null>(null);\n const $query = signal<Query>({} as Query);\n const $path = signal<string | null>(null);\n const $fullPath = signal<string | null>(null);\n const opened = createRouteEvent<RouteOpenedPayload<Params, Query>>();\n const closed = createRouteEvent<void>();\n\n const state: RouteInternalState<Params, Query> = {\n name,\n pathTemplate: null,\n router: null,\n $isOpened,\n $params,\n $query,\n $path,\n $fullPath,\n opened,\n closed,\n wasOpened: false,\n };\n\n const go = (...args: [Params?, GoOptions<Query>?]): void => {\n const [params, options] = args;\n if (!state.router || !state.pathTemplate) {\n throw new Error(\n `Route${name ? ` \"${name}\"` : \"\"} is not registered in a router. Pass it to createRouter({ routes }).`,\n );\n }\n\n const pathname = buildPath(state.pathTemplate, (params ?? {}) as Record<string, string>);\n const search = options?.query ? stringifyQuery(options.query as QueryRecord) : \"\";\n const fullPath = joinLocation(pathname, search);\n if (options?.replace) state.router.replace(fullPath);\n else state.router.go(fullPath);\n };\n\n const route: Route<Params, Query> = {\n name,\n $isOpened,\n $params,\n $query,\n $path,\n $fullPath,\n opened,\n closed,\n go,\n open: go,\n close() {\n if (!state.router) {\n throw new Error(`Route${name ? ` \"${name}\"` : \"\"} is not registered in a router.`);\n }\n state.router.closeRoute(route);\n },\n };\n\n routeStates.set(route, state);\n return route;\n};\n\nexport const applyRouteClosed = <Params, Query>(\n state: RouteInternalState<Params, Query>,\n): void => {\n const wasOpened = state.wasOpened;\n state.$isOpened.set(false);\n state.$params.set(null);\n state.$path.set(null);\n state.$fullPath.set(null);\n state.$query.set({} as Query);\n state.wasOpened = false;\n if (wasOpened) {\n state.closed.emit();\n }\n};\n\nexport const applyRouteOpened = <Params, Query>(\n state: RouteInternalState<Params, Query>,\n payload: {\n params: Params;\n query: Query;\n path: string;\n fullPath: string;\n },\n): void => {\n const wasOpened = state.wasOpened;\n state.$isOpened.set(true);\n state.$params.set(payload.params);\n state.$query.set(payload.query);\n state.$path.set(payload.path);\n state.$fullPath.set(payload.fullPath);\n state.wasOpened = true;\n if (!wasOpened) {\n state.opened.emit(payload);\n }\n};\n\nexport const rawQueryToTyped = <Query>(raw: Record<string, string>): Query =>\n mapQueryToRecord(raw) as Query;\n","import { createRouteModel } from \"./route\";\nimport type { NamedRoute, Route } from \"./types\";\n\nexport const createRoute = <\n const Name extends string,\n Params = Record<string, never>,\n Query = Record<string, never>,\n>(\n name: Name,\n): NamedRoute<Name, Params, Query> =>\n createRouteModel<Params, Query>(name) as NamedRoute<Name, Params, Query>;\n","import { buildPath, joinLocation, splitLocation } from \"./path\";\nimport { parseQuery, stringifyQuery, type QueryRecord } from \"./query\";\nimport type { Route } from \"./types\";\nimport { getRouteState } from \"./route\";\n\nexport const buildRouteLocation = (\n pathTemplate: string,\n params: Record<string, string> = {},\n query?: QueryRecord,\n): string => {\n const pathname = buildPath(pathTemplate, params);\n const search = query ? stringifyQuery(query) : \"\";\n return joinLocation(pathname, search);\n};\n\nexport const resolveRoutePath = (\n route: Route<any, any>,\n params?: Record<string, string>,\n options?: { query?: Record<string, unknown> },\n): string => {\n const state = getRouteState(route);\n if (!state.pathTemplate) {\n throw new Error(\"Route is not registered in a router\");\n }\n return buildRouteLocation(\n state.pathTemplate,\n params ?? {},\n options?.query as QueryRecord | undefined,\n );\n};\n\nexport const parseLocation = (\n location: string,\n): { pathname: string; search: string; query: Record<string, string> } => {\n const { pathname, search } = splitLocation(location);\n return {\n pathname,\n search,\n query: parseQuery(search),\n };\n};\n","import { joinRoutePaths, matchPath } from \"./path\";\nimport type { RouteConfig } from \"./types\";\nimport type { AnyRoute } from \"./types\";\n\nexport type FlatRouteEntry = {\n path: string;\n route: AnyRoute;\n parent: FlatRouteEntry | null;\n};\n\nexport const flattenRouteTree = (\n configs: RouteConfig[],\n parentPath = \"/\",\n parent: FlatRouteEntry | null = null,\n): FlatRouteEntry[] => {\n const result: FlatRouteEntry[] = [];\n\n for (const config of configs) {\n const path = joinRoutePaths(parentPath, config.path);\n const entry: FlatRouteEntry = { path, route: config.route, parent };\n result.push(entry);\n\n if (config.children?.length) {\n result.push(...flattenRouteTree(config.children, path, entry));\n }\n }\n\n return result;\n};\n\nexport type RouteMatchChain = {\n leaf: FlatRouteEntry;\n chain: FlatRouteEntry[];\n leafParams: Record<string, string>;\n};\n\nconst routeDepth = (entry: FlatRouteEntry): number => {\n let depth = 0;\n let cursor: FlatRouteEntry | null = entry.parent;\n while (cursor) {\n depth += 1;\n cursor = cursor.parent;\n }\n return depth;\n};\n\n/** Prefer longer paths; on a tie prefer the deeper child (index `path: \"/\"` under a layout). */\nconst isBetterMatch = (entry: FlatRouteEntry, best: FlatRouteEntry): boolean => {\n if (entry.path.length > best.path.length) return true;\n if (entry.path.length < best.path.length) return false;\n return routeDepth(entry) > routeDepth(best);\n};\n\nexport const matchRouteChain = (\n pathname: string,\n flatRoutes: FlatRouteEntry[],\n): RouteMatchChain | null => {\n let best: { entry: FlatRouteEntry; params: Record<string, string> } | null = null;\n\n for (const entry of flatRoutes) {\n const result = matchPath(entry.path, pathname);\n if (!result.matched) continue;\n\n if (!best || isBetterMatch(entry, best.entry)) {\n best = { entry, params: result.params };\n }\n }\n\n if (!best) return null;\n\n const chain: FlatRouteEntry[] = [];\n let cursor: FlatRouteEntry | null = best.entry;\n while (cursor) {\n chain.unshift(cursor);\n cursor = cursor.parent;\n }\n\n return {\n leaf: best.entry,\n chain,\n leafParams: best.params,\n };\n};\n\nexport const matchParamsForEntry = (\n entry: FlatRouteEntry,\n pathname: string,\n): Record<string, string> => matchPath(entry.path, pathname).params;\n","import { getPageState } from \"./page\";\nimport { getRouteState } from \"./route\";\nimport type { RouterInternal } from \"./router\";\nimport type { AnyPage, RouteView } from \"./types\";\n\nexport type LazyRouteViewModule<\n Params = Record<string, unknown>,\n Query = Record<string, unknown>,\n Data = void,\n> = {\n default: RouteView<Params, Query, Data>;\n};\n\nexport type LazyRouteViewLoader<\n Params = Record<string, unknown>,\n Query = Record<string, unknown>,\n Data = void,\n> = () => Promise<LazyRouteViewModule<Params, Query, Data>>;\n\nexport const isLazyRouteView = (page: AnyPage): boolean => {\n const state = getPageState(page);\n return Boolean(state.viewLoader);\n};\n\nexport const ensureLazyViewLoaded = async (\n page: AnyPage,\n navigationId: number,\n): Promise<boolean> => {\n const state = getPageState(page);\n const router = getRouteState(page).router as RouterInternal | null;\n\n if (!state.viewLoader) return true;\n if (state.view) return true;\n\n const runId = ++state.viewLoadRunId;\n state.$viewPending.set(true);\n state.$viewError.set(null);\n\n try {\n const module = await state.viewLoader();\n if (runId !== state.viewLoadRunId) return false;\n if (router && navigationId !== router.navigationId) return false;\n\n const view = module?.default;\n if (typeof view !== \"function\") {\n throw new TypeError(\n `Lazy route view \"${page.name ?? \"anonymous\"}\": dynamic import must export a default view function.`,\n );\n }\n\n state.view = view;\n state.$viewPending.set(false);\n return true;\n } catch (error) {\n if (runId !== state.viewLoadRunId) return false;\n if (router && navigationId !== router.navigationId) return false;\n state.$viewError.set(error);\n state.$viewPending.set(false);\n return false;\n }\n};\n\nexport const cancelLazyViewLoads = (pages: Iterable<AnyPage>): void => {\n for (const page of pages) {\n const state = getPageState(page);\n if (!state.viewLoader) continue;\n state.viewLoadRunId += 1;\n state.$viewPending.set(false);\n state.$viewError.set(null);\n }\n};\n","import { signal } from \"@echojs-ecosystem/reactivity\";\nimport type { Signal } from \"@echojs-ecosystem/reactivity\";\nimport { createRouteModel, getRouteState, type RouteInternalState } from \"./route\";\nimport type { RouterInternal } from \"./router\";\nimport { resolveRoutePath } from \"./navigation\";\nimport type {\n Page,\n PageLoaderContext,\n Route,\n RouteErrorView,\n RouteLoadingView,\n RouteView,\n} from \"./types\";\nimport { matchParamsForEntry, type FlatRouteEntry } from \"./route-tree\";\nimport { rawQueryToTyped } from \"./route\";\nimport type { AnyPage } from \"./types\";\nimport {\n cancelLazyViewLoads,\n ensureLazyViewLoaded,\n type LazyRouteViewLoader,\n} from \"./lazy-view\";\n\nexport type BeforeLoadContext<Params, Query> = PageLoaderContext<Params, Query> & {\n navigationId: number;\n};\n\nexport type PageKind = \"page\" | \"layout\";\n\nexport type PageInternalState<Params, Query, Data> = RouteInternalState<Params, Query> & {\n kind: PageKind;\n view?: RouteView<Params, Query, Data>;\n viewLoader?: LazyRouteViewLoader<Params, Query, Data>;\n viewLoadRunId: number;\n beforeLoad?: (ctx: BeforeLoadContext<Params, Query>) => Data | Promise<Data>;\n /** @deprecated Use `beforeLoad` */\n loader?: (ctx: PageLoaderContext<Params, Query>) => Data | Promise<Data>;\n loadingView?: RouteLoadingView;\n errorView?: RouteErrorView;\n $pending: Signal<boolean>;\n $error: Signal<unknown | null>;\n $viewPending: Signal<boolean>;\n $viewError: Signal<unknown | null>;\n $data: Signal<Data | null>;\n loaderRunId: number;\n};\n\nconst pageStates = new WeakMap<Page<any, any, any>, PageInternalState<any, any, any>>();\n\nexport const isPage = (value: Route<any, any>): value is Page<any, any, any> =>\n pageStates.has(value as Page<any, any, any>);\n\nexport const isLayoutPage = (value: Route<any, any>): value is Page<any, any, any> => {\n const state = pageStates.get(value as Page<any, any, any>);\n return Boolean(state && state.kind === \"layout\");\n};\n\nexport const assertLayoutPage = (value: Route<any, any>, label = \"layout\"): Page => {\n assertPage(value, label);\n if (!isLayoutPage(value)) {\n throw new TypeError(`${label}: expected createLayoutView() instance.`);\n }\n return value;\n};\n\nexport const assertPage = (value: Route<any, any>, label = \"createRouter\"): Page => {\n if (!isPage(value)) {\n throw new TypeError(\n `${label}: only createRouteView() / createLazyRouteView() instances are allowed. Use createRoute() for redirects/guards.`,\n );\n }\n return value;\n};\n\nexport const getPageState = <Params, Query, Data>(\n page: Page<Params, Query, Data>,\n): PageInternalState<Params, Query, Data> => {\n const state = pageStates.get(page);\n if (!state) {\n throw new Error(\"Unknown page instance\");\n }\n return state;\n};\n\nexport type CreateRouteViewOptions<Params, Query, Data> = {\n name?: string;\n view?: RouteView<Params, Query, Data>;\n viewLoader?: LazyRouteViewLoader<Params, Query, Data>;\n beforeLoad?: (ctx: BeforeLoadContext<Params, Query>) => Data | Promise<Data>;\n /** @deprecated Use `beforeLoad` */\n loader?: (ctx: PageLoaderContext<Params, Query>) => Data | Promise<Data>;\n loadingView?: RouteLoadingView;\n errorView?: RouteErrorView;\n};\n\n/** @deprecated Use CreateRouteViewOptions */\nexport type CreatePageOptions<Params, Query, Data> = CreateRouteViewOptions<Params, Query, Data>;\n\nexport const createRouteViewModel = <\n Params = Record<string, never>,\n Query = Record<string, never>,\n Data = void,\n>(\n options: CreateRouteViewOptions<Params, Query, Data> | string,\n): Page<Params, Query, Data> => {\n const resolved =\n typeof options === \"string\"\n ? (() => {\n throw new TypeError(\n `createRouteView(\"${options}\") requires { name, view }. Pass an options object.`,\n );\n })()\n : options;\n\n if (!resolved.view && !resolved.viewLoader) {\n throw new TypeError(\n \"createRouteView() requires { view } or createLazyRouteView() requires { view: () => import(...) }.\",\n );\n }\n\n const route = createRouteModel<Params, Query>(resolved.name);\n const baseState = getRouteState(route);\n\n const $pending = signal(false);\n const $error = signal<unknown | null>(null);\n const $viewPending = signal(false);\n const $viewError = signal<unknown | null>(null);\n const $data = signal<Data | null>(null);\n\n const state: PageInternalState<Params, Query, Data> = {\n ...baseState,\n kind: \"page\",\n view: resolved.view,\n viewLoader: resolved.viewLoader,\n viewLoadRunId: 0,\n beforeLoad: resolved.beforeLoad,\n loader: resolved.loader,\n loadingView: resolved.loadingView,\n errorView: resolved.errorView,\n $pending,\n $error,\n $viewPending,\n $viewError,\n $data,\n loaderRunId: 0,\n };\n\n const page = route as Page<Params, Query, Data>;\n pageStates.set(page, state);\n\n page.closed.subscribe(() => {\n state.loaderRunId += 1;\n state.viewLoadRunId += 1;\n $pending.set(false);\n $error.set(null);\n $viewPending.set(false);\n $viewError.set(null);\n $data.set(null);\n });\n\n return Object.assign(page, {\n $pending,\n $error,\n $data,\n beforeLoad: resolved.beforeLoad,\n loader: resolved.loader,\n loadingView: resolved.loadingView,\n errorView: resolved.errorView,\n replace(\n ...args: [Params?, import(\"./types\").GoOptions<Query>?]\n ): void {\n const [params, options] = args;\n page.go(\n params as Params,\n { ...options, replace: true } as import(\"./types\").GoOptions<Query>,\n );\n },\n resolve(\n params?: Params,\n options?: { query?: Record<string, unknown> },\n ): string {\n return resolveRoutePath(page as Route<any, any>, (params ?? {}) as Record<string, string>, options);\n },\n isActive(): boolean {\n return page.$isOpened.value();\n },\n preload(): void {\n const params = page.$params.value();\n const query = page.$query.value();\n if (params === null) return;\n const navigationId = ++state.loaderRunId;\n void (async () => {\n const viewOk = await ensureLazyViewLoaded(page, navigationId);\n if (!viewOk) return;\n await runPageBeforeLoad(\n page,\n { params, query, navigationId },\n navigationId,\n );\n })();\n },\n });\n};\n\n/** @deprecated Use createRouteViewModel */\nexport const createPageModel = createRouteViewModel;\n\nexport const resolveBeforeLoad = <Params, Query, Data>(\n state: PageInternalState<Params, Query, Data>,\n): ((ctx: BeforeLoadContext<Params, Query>) => Data | Promise<Data>) | undefined =>\n state.beforeLoad ?? state.loader;\n\nexport const runPageBeforeLoad = async <Params, Query, Data>(\n page: AnyPage,\n context: BeforeLoadContext<Params, Query>,\n navigationId: number,\n): Promise<boolean> => {\n const state = getPageState(page);\n const routeState = getRouteState(page);\n const router = routeState.router as RouterInternal | null;\n const beforeLoad = resolveBeforeLoad(state);\n if (!beforeLoad) {\n state.$pending.set(false);\n state.$error.set(null);\n state.$data.set(null);\n return true;\n }\n\n const runId = ++state.loaderRunId;\n state.$pending.set(true);\n state.$error.set(null);\n\n try {\n const data = await Promise.resolve(beforeLoad(context));\n if (runId !== state.loaderRunId) return false;\n if (router && navigationId !== router.navigationId) return false;\n state.$data.set(data);\n state.$pending.set(false);\n return true;\n } catch (error) {\n if (runId !== state.loaderRunId) return false;\n if (router && navigationId !== router.navigationId) return false;\n state.$error.set(error);\n state.$pending.set(false);\n return false;\n }\n};\n\nexport const runBeforeLoadChain = async (\n chain: FlatRouteEntry[],\n pathname: string,\n query: Record<string, string>,\n navigationId: number,\n): Promise<void> => {\n for (const entry of chain) {\n if (!isPage(entry.route)) continue;\n const viewOk = await ensureLazyViewLoaded(entry.route, navigationId);\n if (!viewOk) break;\n\n const params = matchParamsForEntry(entry, pathname) as Record<string, string>;\n const ok = await runPageBeforeLoad(\n entry.route,\n {\n params,\n query: rawQueryToTyped(query),\n navigationId,\n },\n navigationId,\n );\n if (!ok) break;\n }\n};\n\nexport const cancelPageLoads = (pages: Iterable<AnyPage>): void => {\n cancelLazyViewLoads(pages);\n for (const page of pages) {\n const state = getPageState(page);\n state.loaderRunId += 1;\n state.$pending.set(false);\n state.$error.set(null);\n state.$data.set(null);\n }\n};\n","import { createRouteViewModel, type CreateRouteViewOptions } from \"./page\";\nimport type {\n RouteViewDataFromOptions,\n RouteViewNameFromOptions,\n RouteViewOptionsConstraint,\n RouteViewParamsFromOptions,\n RouteViewQueryFromOptions,\n} from \"./route-view-options-types\";\nimport type { NamedPage } from \"./types\";\n\nexport function createRouteView<const O extends RouteViewOptionsConstraint>(\n options: O,\n): NamedPage<\n RouteViewNameFromOptions<O>,\n RouteViewParamsFromOptions<O>,\n RouteViewQueryFromOptions<O>,\n RouteViewDataFromOptions<O>\n>;\n\nexport function createRouteView<\n Params = Record<string, never>,\n Query = Record<string, never>,\n Data = void,\n>(\n options: CreateRouteViewOptions<Params, Query, Data> & { readonly name: string },\n): NamedPage<string, Params, Query, Data>;\n\nexport function createRouteView(\n options: CreateRouteViewOptions<unknown, unknown, unknown> & { readonly name: string },\n) {\n return createRouteViewModel(options);\n}\n\nexport type { CreateRouteViewOptions };\n","import { createRouteViewModel } from \"./page\";\nimport type { LazyRouteViewLoader } from \"./lazy-view\";\nimport type {\n LazyRouteViewDataFromOptions,\n LazyRouteViewNameFromOptions,\n LazyRouteViewOptionsConstraint,\n LazyRouteViewParamsFromOptions,\n LazyRouteViewQueryFromOptions,\n} from \"./lazy-route-view-options-types\";\nimport type { BeforeLoadContext, CreateRouteViewOptions } from \"./page\";\nimport type { NamedPage, RouteLoadingView, RouteErrorView } from \"./types\";\n\nexport type CreateLazyRouteViewOptions<\n Params = Record<string, never>,\n Query = Record<string, never>,\n Data = void,\n> = {\n name?: string;\n /** Dynamic import — module must `export default` a route view function. */\n view: LazyRouteViewLoader<Params, Query, Data>;\n beforeLoad?: (ctx: BeforeLoadContext<Params, Query>) => Data | Promise<Data>;\n loadingView?: RouteLoadingView;\n errorView?: RouteErrorView;\n};\n\nexport function createLazyRouteView<const O extends LazyRouteViewOptionsConstraint>(\n options: O,\n): NamedPage<\n LazyRouteViewNameFromOptions<O>,\n LazyRouteViewParamsFromOptions<O>,\n LazyRouteViewQueryFromOptions<O>,\n LazyRouteViewDataFromOptions<O>\n>;\n\nexport function createLazyRouteView<\n Params = Record<string, never>,\n Query = Record<string, never>,\n Data = void,\n>(\n options: CreateLazyRouteViewOptions<Params, Query, Data> & { readonly name: string },\n): NamedPage<string, Params, Query, Data>;\n\nexport function createLazyRouteView(\n options: CreateLazyRouteViewOptions<unknown, unknown, unknown> & { readonly name: string },\n) {\n return createRouteViewModel({\n name: options.name,\n viewLoader: options.view,\n beforeLoad: options.beforeLoad,\n loadingView: options.loadingView,\n errorView: options.errorView,\n });\n}\n","import { createRouteViewModel, getPageState, type CreateRouteViewOptions } from \"./page\";\nimport type {\n RouteViewDataFromOptions,\n RouteViewNameFromOptions,\n RouteViewOptionsConstraint,\n RouteViewParamsFromOptions,\n RouteViewQueryFromOptions,\n} from \"./route-view-options-types\";\nimport type { LayoutPage, NamedPage } from \"./types\";\n\nexport type NamedLayoutView<\n Name extends string,\n Params = Record<string, never>,\n Query = Record<string, never>,\n Data = void,\n> = LayoutPage & NamedPage<Name, Params, Query, Data>;\n\nexport const createLayoutView = <const O extends RouteViewOptionsConstraint>(\n options: O,\n): NamedLayoutView<\n RouteViewNameFromOptions<O>,\n RouteViewParamsFromOptions<O>,\n RouteViewQueryFromOptions<O>,\n RouteViewDataFromOptions<O>\n> => {\n const layout = createRouteViewModel(options);\n getPageState(layout).kind = \"layout\";\n return layout as NamedLayoutView<\n RouteViewNameFromOptions<O>,\n RouteViewParamsFromOptions<O>,\n RouteViewQueryFromOptions<O>,\n RouteViewDataFromOptions<O>\n >;\n};\n\nexport { isLayoutPage } from \"./page\";\n","import { joinLocation, splitLocation } from \"../core/path\";\nimport type { RouterHistory } from \"../core/types\";\n\nconst readLocation = (): string => {\n const { pathname, search } = window.location;\n return joinLocation(pathname, search);\n};\n\nexport const createBrowserHistory = (): RouterHistory => {\n const listeners = new Set<(path: string) => void>();\n\n const notify = (): void => {\n const path = readLocation();\n for (const listener of listeners) {\n listener(path);\n }\n };\n\n const onPopState = (): void => notify();\n\n return {\n getLocation: readLocation,\n push(path: string) {\n const { pathname, search } = splitLocation(path);\n window.history.pushState(null, \"\", joinLocation(pathname, search));\n notify();\n },\n replace(path: string) {\n const { pathname, search } = splitLocation(path);\n window.history.replaceState(null, \"\", joinLocation(pathname, search));\n notify();\n },\n listen(callback: (path: string) => void) {\n listeners.add(callback);\n window.addEventListener(\"popstate\", onPopState);\n return () => {\n listeners.delete(callback);\n window.removeEventListener(\"popstate\", onPopState);\n };\n },\n back() {\n window.history.back();\n },\n forward() {\n window.history.forward();\n },\n };\n};\n","import { normalizePathname } from \"../core/path\";\nimport type { RouterHistory } from \"../core/types\";\n\nconst readHashPath = (): string => {\n const hash = window.location.hash;\n if (!hash || hash === \"#\") return \"/\";\n const raw = hash.startsWith(\"#\") ? hash.slice(1) : hash;\n const path = raw.startsWith(\"/\") ? raw : `/${raw}`;\n return normalizePathname(path);\n};\n\nexport const createHashHistory = (): RouterHistory => {\n const listeners = new Set<(path: string) => void>();\n\n const notify = (): void => {\n const path = readHashPath();\n for (const listener of listeners) {\n listener(path);\n }\n };\n\n const onHashChange = (): void => notify();\n\n const writeHash = (path: string, replace: boolean): void => {\n const normalized = normalizePathname(path);\n const next = `#${normalized}`;\n if (replace) window.location.replace(next);\n else window.location.hash = next;\n notify();\n };\n\n return {\n getLocation: readHashPath,\n push(path: string) {\n writeHash(path, false);\n },\n replace(path: string) {\n writeHash(path, true);\n },\n listen(callback: (path: string) => void) {\n listeners.add(callback);\n window.addEventListener(\"hashchange\", onHashChange);\n return () => {\n listeners.delete(callback);\n window.removeEventListener(\"hashchange\", onHashChange);\n };\n },\n back() {\n window.history.back();\n },\n forward() {\n window.history.forward();\n },\n };\n};\n","import type { RouterHistory } from \"../core/types\";\nimport { splitLocation } from \"../core/path\";\n\nexport const createMemoryHistory = (initialPath = \"/\"): RouterHistory => {\n let index = 0;\n const stack: string[] = [initialPath];\n const listeners = new Set<(path: string) => void>();\n\n const notify = (): void => {\n const path = stack[index]!;\n for (const listener of listeners) {\n listener(path);\n }\n };\n\n const getLocation = (): string => stack[index]!;\n\n return {\n getLocation,\n push(path: string) {\n stack.splice(index + 1);\n stack.push(path);\n index = stack.length - 1;\n notify();\n },\n replace(path: string) {\n stack[index] = path;\n notify();\n },\n listen(callback: (path: string) => void) {\n listeners.add(callback);\n return () => listeners.delete(callback);\n },\n back() {\n if (index <= 0) return;\n index -= 1;\n notify();\n },\n forward() {\n if (index >= stack.length - 1) return;\n index += 1;\n notify();\n },\n };\n};\n\nexport const memoryHistoryPathname = (location: string): string =>\n splitLocation(location).pathname;\n","import { createBrowserHistory } from \"../histories/browser-history\";\nimport { createHashHistory } from \"../histories/hash-history\";\nimport { createMemoryHistory } from \"../histories/memory-history\";\nimport type { RouterHistory } from \"./types\";\n\nexport type RouterHistoryKind = \"browser\" | \"hash\" | \"memory\";\n\nexport type MemoryHistoryConfig = {\n readonly type: \"memory\";\n readonly initial?: string;\n};\n\nexport type RouterHistoryConfig = RouterHistoryKind | MemoryHistoryConfig | RouterHistory;\n\nconst isRouterHistory = (value: RouterHistoryConfig): value is RouterHistory =>\n typeof value === \"object\" && value !== null && \"getLocation\" in value && \"push\" in value;\n\nexport const resolveHistory = (config: RouterHistoryConfig): RouterHistory => {\n if (isRouterHistory(config)) {\n return config;\n }\n\n if (typeof config === \"string\") {\n switch (config) {\n case \"browser\":\n return createBrowserHistory();\n case \"hash\":\n return createHashHistory();\n case \"memory\":\n return createMemoryHistory(\"/\");\n default: {\n const _exhaustive: never = config;\n throw new TypeError(`Unknown history kind: ${_exhaustive}`);\n }\n }\n }\n\n return createMemoryHistory(config.initial ?? \"/\");\n};\n","import { matchPath, normalizePathname } from \"./path\";\n\nconst isDevMode = (): boolean => {\n try {\n return (import.meta as { env?: { MODE?: string } }).env?.MODE === \"development\";\n } catch {\n return false;\n }\n};\nimport type {\n AuthorizationGuardOptions,\n AuthorizationGuardRedirectContext,\n AuthorizationGuardRedirectTarget,\n RouterHistory,\n} from \"./types\";\n\nconst resolveRedirectTarget = <Paths extends string>(\n target: AuthorizationGuardRedirectTarget<Paths> | undefined,\n context: AuthorizationGuardRedirectContext,\n fallback: Paths,\n): Paths => {\n if (target === undefined) return fallback;\n return typeof target === \"function\" ? target(context) : target;\n};\n\nconst isPathAllowed = (pathname: string, allowedPaths: readonly string[]): boolean => {\n const normalized = normalizePathname(pathname);\n\n for (const pattern of allowedPaths) {\n const normalizedPattern = normalizePathname(pattern);\n if (normalized === normalizedPattern) return true;\n if (matchPath(normalizedPattern, normalized).matched) return true;\n }\n\n return false;\n};\n\nconst redirectIfNeeded = (\n pathname: string,\n target: string,\n history: RouterHistory,\n allowedPaths: readonly string[],\n label: string,\n): boolean => {\n const normalizedTarget = normalizePathname(target);\n const normalizedCurrent = normalizePathname(pathname);\n\n if (normalizedTarget === normalizedCurrent) {\n return true;\n }\n\n if (!isPathAllowed(normalizedTarget, allowedPaths)) {\n const allowed = allowedPaths.join(\", \");\n const message =\n `[router] authorizationGuard ${label}: redirect target \"${target}\" is not allowed (${allowed}).`;\n if (isDevMode()) {\n throw new Error(message);\n }\n console.error(message);\n return false;\n }\n\n history.replace(target);\n return false;\n};\n\nexport const runAuthorizationGuard = (\n pathname: string,\n options: AuthorizationGuardOptions,\n history: RouterHistory,\n): boolean => {\n const authorized = options.isAuthorized();\n const redirectContext = (authorized: boolean): AuthorizationGuardRedirectContext => ({\n pathname,\n authorized,\n });\n\n if (!authorized) {\n if (isPathAllowed(pathname, options.allowedUnauthorizedPaths)) {\n return true;\n }\n const target = resolveRedirectTarget(\n options.redirectTo,\n redirectContext(false),\n \"/login\",\n );\n return redirectIfNeeded(\n pathname,\n target,\n history,\n options.allowedUnauthorizedPaths,\n \"redirectTo\",\n );\n }\n\n if (options.allowedAuthorizedPaths?.length) {\n if (!isPathAllowed(pathname, options.allowedAuthorizedPaths)) {\n const target = resolveRedirectTarget(\n options.redirectWhenAuthorized,\n redirectContext(true),\n \"/\",\n );\n return redirectIfNeeded(\n pathname,\n target,\n history,\n options.allowedAuthorizedPaths,\n \"redirectWhenAuthorized\",\n );\n }\n }\n\n if (\n options.redirectWhenAuthorized !== undefined &&\n isPathAllowed(pathname, options.allowedUnauthorizedPaths)\n ) {\n const target = resolveRedirectTarget(\n options.redirectWhenAuthorized,\n redirectContext(true),\n \"/\",\n );\n const normalizedTarget = normalizePathname(target);\n const normalizedCurrent = normalizePathname(pathname);\n if (normalizedTarget === normalizedCurrent) return true;\n\n if (\n options.allowedAuthorizedPaths?.length &&\n !isPathAllowed(normalizedTarget, options.allowedAuthorizedPaths)\n ) {\n const message = `[router] authorizationGuard redirectWhenAuthorized: \"${target}\" is not in allowedAuthorizedPaths.`;\n if (isDevMode()) {\n throw new Error(message);\n }\n console.error(message);\n return false;\n }\n\n history.replace(target);\n return false;\n }\n\n return true;\n};\n","import { getRouteState } from \"./route\";\nimport { resolveRoutePath } from \"./navigation\";\nimport type { Route, RouterHistory } from \"./types\";\n\nexport type GuardRouteOptions = {\n route: Route<any, any>;\n canOpen: () => boolean;\n otherwise: Route<any, any>;\n};\n\nconst guards: GuardRouteOptions[] = [];\n\nexport const registerGuard = (options: GuardRouteOptions): (() => void) => {\n guards.push(options);\n return () => {\n const index = guards.indexOf(options);\n if (index !== -1) guards.splice(index, 1);\n };\n};\n\nexport const clearGuards = (): void => {\n guards.length = 0;\n};\n\nexport const runRouteGuards = (\n history: RouterHistory,\n matchedRoute: Route<any, any>,\n query: Record<string, string>,\n): boolean => {\n for (const guard of guards) {\n if (guard.route !== matchedRoute) continue;\n if (guard.canOpen()) return true;\n\n const otherwiseState = getRouteState(guard.otherwise);\n const params = (otherwiseState.$params.peek() ?? {}) as Record<string, string>;\n const target = resolveRoutePath(guard.otherwise, params, { query });\n history.replace(target);\n return false;\n }\n return true;\n};\n","import { assertLayoutPage, assertPage, getPageState, isLayoutPage } from \"./page\";\nimport type { RouteViewEntry, RouteTreeEntry } from \"./path-types\";\nimport type { AnyRoute, RouteConfig } from \"./types\";\n\nconst isRouteViewEntry = (item: RouteTreeEntry): item is RouteViewEntry =>\n \"routeView\" in item && !(\"layoutView\" in item);\n\nexport const toRouteConfigs = (definitions: readonly RouteTreeEntry[]): RouteConfig[] => {\n const walk = (items: readonly RouteTreeEntry[], parentPath = \"\"): RouteConfig[] => {\n const result: RouteConfig[] = [];\n\n for (const item of items) {\n const path = parentPath ? `${parentPath}/${item.path}`.replace(/\\/+/g, \"/\") : item.path;\n\n if (\"route\" in item && !(\"routeView\" in item) && !(\"layoutView\" in item)) {\n const childConfigs =\n \"children\" in item && item.children?.length ? walk(item.children, path) : undefined;\n result.push({\n path,\n route: item.route,\n ...(childConfigs?.length ? { children: childConfigs } : {}),\n });\n continue;\n }\n\n if (\"layoutView\" in item) {\n const { layoutView, children, path: segment } = item;\n assertLayoutPage(\n layoutView as import(\"./types\").Route,\n `routes[{ path: \"${segment}\", layoutView }]`,\n );\n if (!children?.length) {\n throw new TypeError(\n `Layout route \"${path}\" requires \"children\" with nested route views.`,\n );\n }\n result.push({\n path,\n route: layoutView as AnyRoute,\n children: walk(children, path),\n });\n continue;\n }\n\n if (!isRouteViewEntry(item)) {\n throw new TypeError(\n `Route at \"${path}\" must define \"routeView\", \"layoutView\", or \"route\".`,\n );\n }\n\n const { routeView } = item;\n assertPage(routeView, \"createRouter\");\n const routeState = getPageState(routeView);\n if (!routeState.view && !routeState.viewLoader) {\n throw new TypeError(\n `Route at \"${path}\" must define a view via createRouteView(), createLazyRouteView(), or createLayoutView().`,\n );\n }\n\n if (isLayoutPage(routeView)) {\n throw new TypeError(\n `Route \"${path}\": use \"layoutView\" instead of \"routeView\" for createLayoutView() instances.`,\n );\n }\n\n result.push({ path, route: routeView as AnyRoute });\n }\n\n return result;\n };\n\n return walk(definitions);\n};\n","import type { AnyRoute } from \"./types\";\nimport type { RouteTreeEntry } from \"./path-types\";\n\nexport type NamedRoutesMap = Readonly<Record<string, AnyRoute>>;\n\nconst requireEntryName = (entry: RouteTreeEntry, pathHint: string): string => {\n const name = entry.name;\n if (!name) {\n throw new TypeError(\n `Route at \"${pathHint}\" must define \"name\" in createRouter({ routes }) for typed router.routes.`,\n );\n }\n return name;\n};\n\nconst register = (bucket: Record<string, AnyRoute>, key: string, route: AnyRoute): void => {\n if (bucket[key]) {\n throw new Error(`Duplicate route name \"${key}\" in createRouter({ routes }).`);\n }\n bucket[key] = route;\n};\n\nconst walk = (\n entries: readonly RouteTreeEntry[],\n bucket: Record<string, AnyRoute>,\n parentPath = \"/\",\n): void => {\n for (const entry of entries) {\n const pathHint = `${parentPath}${entry.path}`;\n\n if (\"routeView\" in entry && !(\"layoutView\" in entry)) {\n register(bucket, requireEntryName(entry, pathHint), entry.routeView as AnyRoute);\n continue;\n }\n\n if (\"route\" in entry && !(\"routeView\" in entry) && !(\"layoutView\" in entry)) {\n register(bucket, requireEntryName(entry, pathHint), entry.route);\n if (\"children\" in entry && entry.children?.length) {\n walk(entry.children, bucket, pathHint);\n }\n continue;\n }\n\n if (\"layoutView\" in entry && \"children\" in entry) {\n register(bucket, requireEntryName(entry, pathHint), entry.layoutView as AnyRoute);\n const { children } = entry;\n if (children?.length) {\n walk(children, bucket, pathHint);\n }\n }\n }\n};\n\n/** Flat `router.routes` keyed by route config `name` (not URL segments). */\nexport const buildNamedRoutes = (entries: readonly RouteTreeEntry[]): NamedRoutesMap => {\n const bucket: Record<string, AnyRoute> = {};\n walk(entries, bucket);\n return bucket;\n};\n","import { getPageState } from \"./page\";\nimport type {\n AnyPage,\n RouteErrorView,\n RouteLoadingView,\n RouteView,\n RouterNotFoundView,\n} from \"./types\";\n\nconst emptyOutlet = (): null => null;\n\nexport const resolvePageLoadingView = (page: AnyPage): RouteLoadingView => {\n const state = getPageState(page);\n if (state.loadingView) return state.loadingView;\n if (state.view) {\n return ({ params, query }) =>\n state.view!({ params, query, outlet: emptyOutlet, data: null });\n }\n throw new TypeError(\n `Route view \"${page.name ?? \"anonymous\"}\": pass loadingView or view for router loadingView.`,\n );\n};\n\nexport const resolvePageErrorView = (page: AnyPage): RouteErrorView => {\n const state = getPageState(page);\n if (state.errorView) return state.errorView;\n if (state.view) {\n return ({ error, params, query }) =>\n state.view!({ params, query, outlet: emptyOutlet, data: null, error });\n }\n throw new TypeError(\n `Route view \"${page.name ?? \"anonymous\"}\": pass errorView or view for router errorView.`,\n );\n};\n\nexport const resolvePageNotFoundView = (page: AnyPage): RouterNotFoundView => {\n const state = getPageState(page);\n if (!state.view) {\n throw new TypeError(\n `Route view \"${page.name ?? \"anonymous\"}\": pass view for router notFoundView.`,\n );\n }\n return (context) => state.view!(context);\n};\n\nexport const resolveLoadingViewOption = (\n option?: RouteLoadingView | AnyPage,\n): RouteLoadingView | undefined => {\n if (!option) return undefined;\n if (typeof option === \"function\") return option;\n return resolvePageLoadingView(option);\n};\n\nexport const resolveErrorViewOption = (\n option?: RouteErrorView | AnyPage,\n): RouteErrorView | undefined => {\n if (!option) return undefined;\n if (typeof option === \"function\") return option;\n return resolvePageErrorView(option);\n};\n\nexport const resolveNotFoundViewOption = (\n option?: RouterNotFoundView | AnyPage,\n): RouterNotFoundView | undefined => {\n if (!option) return undefined;\n if (typeof option === \"function\") return option;\n return resolvePageNotFoundView(option);\n};\n","import type { Child } from \"@echojs-ecosystem/hyperdom\";\nimport { assertPage, getPageState, isLayoutPage, isPage } from \"./page\";\nimport { resolveBeforeLoad } from \"./page\";\nimport type { RouteTreeEntry } from \"./path-types\";\nimport type {\n AnyPage,\n RouteErrorView,\n RouteLoadingView,\n RouteView,\n Router,\n} from \"./types\";\n\nconst entryPage = (def: RouteTreeEntry): AnyPage | undefined =>\n \"layoutView\" in def ? def.layoutView : \"routeView\" in def ? def.routeView : undefined;\n\nexport type RouterViewRuntimeOptions = {\n routes: readonly RouteTreeEntry[];\n notFoundView?: RouteView;\n loadingView?: RouteLoadingView;\n errorView?: RouteErrorView;\n};\n\nconst pickLoadingView = (\n branch: PageNode[],\n leafIndex: number,\n globalLoading?: RouteLoadingView,\n): RouteLoadingView | undefined => {\n const leaf = branch[leafIndex]!.page;\n if (leaf.loadingView) return leaf.loadingView;\n for (let i = leafIndex - 1; i >= 0; i -= 1) {\n const candidate = branch[i]!.page.loadingView;\n if (candidate) return candidate;\n }\n return globalLoading;\n};\n\nconst pickErrorView = (\n branch: PageNode[],\n leafIndex: number,\n globalError?: RouteErrorView,\n): RouteErrorView | undefined => {\n const leaf = branch[leafIndex]!.page;\n if (leaf.errorView) return leaf.errorView;\n for (let i = leafIndex - 1; i >= 0; i -= 1) {\n const candidate = branch[i]!.page.errorView;\n if (candidate) return candidate;\n }\n return globalError;\n};\n\nconst renderLoading = (\n page: AnyPage,\n branch: PageNode[],\n leafIndex: number,\n globalLoading?: RouteLoadingView,\n): unknown => {\n const view = pickLoadingView(branch, leafIndex, globalLoading);\n if (!view) return null;\n const params = page.$params.value() ?? {};\n const query = page.$query.value() ?? {};\n return view({ params, query });\n};\n\nconst renderError = (\n page: AnyPage,\n error: unknown,\n branch: PageNode[],\n leafIndex: number,\n globalError?: RouteErrorView,\n): unknown => {\n const view = pickErrorView(branch, leafIndex, globalError);\n if (!view) return null;\n const params = page.$params.value() ?? {};\n const query = page.$query.value() ?? {};\n return view({ error, params, query });\n};\n\ntype PageNode = {\n page: AnyPage;\n children?: PageNode[];\n};\n\nconst collectChildPageNodes = (definitions: readonly RouteTreeEntry[]): PageNode[] => {\n const nodes: PageNode[] = [];\n for (const def of definitions) {\n const page = entryPage(def);\n if (!page) continue;\n assertPage(page, \"createRouter\");\n nodes.push({\n page,\n children:\n \"children\" in def && def.children ? collectChildPageNodes(def.children) : undefined,\n });\n }\n return nodes;\n};\n\nconst collectPageRoots = (definitions: readonly RouteTreeEntry[]): PageNode[] => {\n const roots: PageNode[] = [];\n for (const def of definitions) {\n const page = entryPage(def);\n if (page) {\n assertPage(page, \"createRouter\");\n roots.push({\n page,\n children:\n \"children\" in def && def.children ? collectChildPageNodes(def.children) : undefined,\n });\n } else if (\"children\" in def && def.children?.length) {\n roots.push(...collectPageRoots(def.children));\n }\n }\n return roots;\n};\n\nconst findBranch = (entries: PageNode[], activePage: AnyPage): PageNode[] | null => {\n for (const entry of entries) {\n if (entry.page === activePage) return [entry];\n if (entry.children?.length) {\n const childBranch = findBranch(entry.children, activePage);\n if (childBranch) return [entry, ...childBranch];\n }\n }\n return null;\n};\n\nconst layoutBeforeLoadFailed = (branch: PageNode[], leafIndex: number): boolean => {\n for (let i = 0; i < leafIndex; i += 1) {\n const page = branch[i]!.page;\n if (!isLayoutPage(page)) continue;\n const state = getPageState(page);\n if (state.viewLoader && !state.view) {\n if (state.$viewPending.value() || state.$viewError.value()) return true;\n }\n if (resolveBeforeLoad(state) && state.$error.value()) return true;\n if (resolveBeforeLoad(state) && state.$pending.value()) return true;\n }\n return false;\n};\n\nconst renderPageView = (\n page: AnyPage,\n outlet: () => Child,\n branch: PageNode[],\n leafIndex: number,\n globalLoading?: RouteLoadingView,\n globalError?: RouteErrorView,\n): unknown => {\n const state = getPageState(page);\n const params = page.$params.value() ?? {};\n const query = page.$query.value() ?? {};\n const data = (page.$data?.value() ?? null) as unknown;\n\n if (state.viewLoader && !state.view) {\n if (state.$viewPending.value()) {\n return renderLoading(page, branch, leafIndex, globalLoading) ?? null;\n }\n if (state.$viewError.value()) {\n return (\n renderError(page, state.$viewError.value(), branch, leafIndex, globalError) ?? null\n );\n }\n return renderLoading(page, branch, leafIndex, globalLoading) ?? null;\n }\n\n if (resolveBeforeLoad(state) && state.$pending.value()) {\n return renderLoading(page, branch, leafIndex, globalLoading) ?? null;\n }\n if (state.$error.value()) {\n return renderError(page, state.$error.value(), branch, leafIndex, globalError) ?? null;\n }\n\n if (!state.view) return null;\n return state.view({ params, query, outlet, data });\n};\n\nconst renderBranch = (\n branch: PageNode[],\n index: number,\n globalLoading?: RouteLoadingView,\n globalError?: RouteErrorView,\n): unknown => {\n const node = branch[index];\n if (!node) return null;\n\n const leafIndex = branch.length - 1;\n if (index > 0 && layoutBeforeLoadFailed(branch, index)) {\n return null;\n }\n\n const outlet = (): Child =>\n (index + 1 < branch.length\n ? renderBranch(branch, index + 1, globalLoading, globalError)\n : null) as Child;\n\n return renderPageView(\n node.page,\n outlet,\n branch,\n leafIndex,\n globalLoading,\n globalError,\n );\n};\n\nexport const createRouterViewComponent = (\n router: Router,\n options: RouterViewRuntimeOptions,\n): (() => unknown) => {\n const pageRoots = collectPageRoots(options.routes);\n const globalLoading = options.loadingView;\n const globalError = options.errorView;\n const notFoundView = options.notFoundView;\n\n return () => {\n const activeRoutes = router.$activeRoutes.value();\n const activePage = activeRoutes.at(-1);\n\n if (!activePage || !isPage(activePage)) {\n return notFoundView?.({ params: {}, query: {}, outlet: () => null, data: null }) ?? null;\n }\n\n const branch = findBranch(pageRoots, activePage);\n if (!branch?.length) {\n return notFoundView?.({ params: {}, query: {}, outlet: () => null, data: null }) ?? null;\n }\n\n return renderBranch(branch, 0, globalLoading, globalError);\n };\n};\n","import { computed, signal } from \"@echojs-ecosystem/reactivity\";\nimport { runAuthorizationGuard } from \"./auth-guard\";\nimport { buildRouteLocation, parseLocation } from \"./navigation\";\nimport {\n flattenRouteTree,\n matchParamsForEntry,\n matchRouteChain,\n type FlatRouteEntry,\n} from \"./route-tree\";\nimport {\n applyRouteClosed,\n applyRouteOpened,\n bindRouteToRouter,\n getRouteState,\n rawQueryToTyped,\n} from \"./route\";\nimport { runRouteGuards } from \"./guard-registry\";\nimport { toRouteConfigs } from \"./route-config\";\nimport { buildNamedRoutes } from \"./build-named-routes\";\nimport {\n resolveErrorViewOption,\n resolveLoadingViewOption,\n resolveNotFoundViewOption,\n} from \"./resolve-route-view\";\nimport { createRouterViewComponent } from \"./router-view\";\nimport { cancelPageLoads, getPageState, isPage, runBeforeLoadChain } from \"./page\";\nimport type {\n AnyRoute,\n RouteErrorView,\n RouteLoadingView,\n RouteView,\n Router,\n RouterRoutes,\n RouterViewComponent,\n} from \"./types\";\n\nexport type RouterModelOptions = {\n history: import(\"./types\").RouterHistory;\n routes: readonly import(\"./path-types\").RouteTreeEntry[];\n authorizationGuard?: import(\"./types\").AuthorizationGuardOptions;\n loadingView?: RouteLoadingView | import(\"./types\").AnyPage;\n errorView?: RouteErrorView | import(\"./types\").AnyPage;\n notFoundView?: RouteView | import(\"./types\").AnyPage;\n};\n\nexport type RouterInternal = Router & {\n readonly history: import(\"./types\").RouterHistory;\n readonly flatRoutes: FlatRouteEntry[];\n readonly options: RouterModelOptions;\n readonly loadingView?: RouteLoadingView;\n readonly errorView?: RouteErrorView;\n navigationId: number;\n sync(): void;\n closeRoute(route: AnyRoute): void;\n};\n\nexport const createRouterModel = (options: RouterModelOptions): RouterInternal => {\n const globalLoadingView = resolveLoadingViewOption(options.loadingView);\n const globalErrorView = resolveErrorViewOption(options.errorView);\n const globalNotFoundView = resolveNotFoundViewOption(options.notFoundView);\n\n const routeConfigs = toRouteConfigs(options.routes);\n const flatRoutes = flattenRouteTree(routeConfigs);\n const allRoutes = flatRoutes.map((entry) => entry.route);\n const allPages = allRoutes.filter(isPage);\n\n const $path = signal(\"/\");\n const $query = signal<Record<string, string>>({});\n const $fullPath = signal(\"/\");\n const $activeRoute = signal<AnyRoute | null>(null);\n const $activeRoutes = signal<AnyRoute[]>([]);\n const $params = signal<Record<string, string>>({});\n\n const $activePage = computed(() => {\n const routes = $activeRoutes.value();\n for (let i = routes.length - 1; i >= 0; i -= 1) {\n const route = routes[i]!;\n if (isPage(route)) return route;\n }\n return null;\n });\n\n const $matched = computed((): AnyRoute[] => [...$activeRoutes.value()]);\n\n const $pending = computed(() => {\n const page = $activePage.value();\n return page ? getPageState(page).$pending.value() : false;\n });\n\n const $error = computed(() => {\n const page = $activePage.value();\n return page ? getPageState(page).$error.value() : null;\n });\n\n let started = false;\n let unlisten: (() => void) | null = null;\n let syncing = false;\n let syncQueued = false;\n let navigationId = 0;\n\n const closeAllRoutes = (): void => {\n cancelPageLoads(allPages);\n for (const route of allRoutes) {\n applyRouteClosed(getRouteState(route));\n }\n };\n\n const routes = buildNamedRoutes(options.routes);\n\n let router!: RouterInternal;\n\n router = {\n history: options.history,\n flatRoutes,\n options,\n loadingView: globalLoadingView,\n errorView: globalErrorView,\n navigationId: 0,\n View: (() => null) as RouterViewComponent,\n $path,\n $query,\n $fullPath,\n $activeRoute,\n $activePage,\n $activeRoutes,\n $matched,\n $params,\n $pending,\n $error,\n routes,\n\n start() {\n if (started) return;\n started = true;\n\n for (const entry of flatRoutes) {\n bindRouteToRouter(entry.route, router, entry.path);\n }\n\n unlisten = options.history.listen(() => {\n router.sync();\n });\n router.sync();\n },\n\n stop() {\n if (!started) return;\n started = false;\n unlisten?.();\n unlisten = null;\n closeAllRoutes();\n $activeRoute.set(null);\n $activeRoutes.set([]);\n $params.set({});\n },\n\n go(path: string, opts?: { replace?: boolean }) {\n if (opts?.replace) options.history.replace(path);\n else options.history.push(path);\n },\n\n navigate(path: string, opts?: { replace?: boolean }) {\n router.go(path, opts);\n },\n\n replace(path: string) {\n options.history.replace(path);\n },\n\n back() {\n options.history.back();\n },\n\n forward() {\n options.history.forward();\n },\n\n reload() {\n router.sync();\n },\n\n resolve(route, params, opts) {\n const state = getRouteState(route);\n if (!state.pathTemplate) {\n throw new Error(\"Route is not registered in a router\");\n }\n return buildRouteLocation(\n state.pathTemplate,\n (params ?? {}) as Record<string, string>,\n opts?.query as import(\"./query\").QueryRecord | undefined,\n );\n },\n\n isActive(route) {\n return $activeRoutes.value().includes(route);\n },\n\n view() {\n return router.View;\n },\n\n closeRoute(route) {\n if (!$activeRoutes.peek().includes(route)) return;\n options.history.push(\"/\");\n },\n\n sync() {\n if (syncing) {\n syncQueued = true;\n return;\n }\n syncing = true;\n try {\n for (let attempt = 0; attempt < 8; attempt += 1) {\n const currentNavigationId = ++navigationId;\n router.navigationId = currentNavigationId;\n\n const location = options.history.getLocation();\n const { pathname, search, query } = parseLocation(location);\n const fullPath = search ? `${pathname}${search}` : pathname;\n\n $path.set(pathname);\n $query.set(query);\n $fullPath.set(fullPath);\n\n if (\n options.authorizationGuard &&\n !runAuthorizationGuard(pathname, options.authorizationGuard, options.history)\n ) {\n continue;\n }\n\n const match = matchRouteChain(pathname, flatRoutes);\n\n if (!match) {\n cancelPageLoads(allPages);\n $activeRoute.set(null);\n $activeRoutes.set([]);\n $params.set({});\n closeAllRoutes();\n return;\n }\n\n if (!runRouteGuards(options.history, match.leaf.route, query)) {\n continue;\n }\n\n const activeSet = new Set(match.chain.map((entry) => entry.route));\n\n $activeRoute.set(match.leaf.route);\n $activeRoutes.set(match.chain.map((entry) => entry.route));\n $params.set(match.leafParams);\n\n for (const route of allRoutes) {\n const state = getRouteState(route);\n if (!activeSet.has(route)) {\n applyRouteClosed(state);\n continue;\n }\n\n const entry = match.chain.find((item) => item.route === route)!;\n const entryParams = matchParamsForEntry(entry, pathname);\n applyRouteOpened(state, {\n params: entryParams,\n query: rawQueryToTyped(query),\n path: pathname,\n fullPath,\n });\n }\n\n void runBeforeLoadChain(match.chain, pathname, query, currentNavigationId);\n return;\n }\n } finally {\n syncing = false;\n if (syncQueued) {\n syncQueued = false;\n router.sync();\n }\n }\n },\n } satisfies RouterInternal;\n\n for (const entry of flatRoutes) {\n bindRouteToRouter(entry.route, router, entry.path);\n }\n\n return Object.assign(router, {\n View: createRouterViewComponent(router, {\n routes: options.routes,\n notFoundView: globalNotFoundView,\n loadingView: globalLoadingView,\n errorView: globalErrorView,\n }),\n });\n};\n\nexport const getRouterInternal = (router: Router): RouterInternal =>\n router as RouterInternal;\n","import { resolveHistory } from \"./history-config\";\nimport { createRouterModel } from \"./router\";\nimport type { CollectNamedRoutes, RouteTreeBranch } from \"./path-types\";\nimport type { RouterModelOptions } from \"./router\";\nimport type { CreateRouterOptions, Router } from \"./types\";\n\nexport const createRouter = <const TRoutes extends readonly RouteTreeBranch[]>(\n options: CreateRouterOptions<TRoutes>,\n): Router<CollectNamedRoutes<TRoutes>> => {\n const { history: historyConfig, routes, ...rest } = options;\n const history = resolveHistory(historyConfig);\n return createRouterModel({ ...rest, history, routes } as RouterModelOptions) as unknown as Router<\n CollectNamedRoutes<TRoutes>\n >;\n};\n","import { createRouter as createRouterCore } from \"../core/create-router\";\nimport type { CollectNamedRoutes, RouteTreeBranch } from \"../core/path-types\";\nimport type { CreateRouterOptions, Router } from \"../core/types\";\nimport type { Child } from \"@echojs-ecosystem/hyperdom\";\nimport { attachRouterQueryParams, type RouterBoundQueryParams } from \"@echojs-ecosystem/url-state\";\n\nexport type HyperdomRouter<TRoutes extends Router[\"routes\"] = Router[\"routes\"]> = Omit<\n Router<TRoutes>,\n \"View\"\n> & {\n readonly View: () => Child;\n createQueryParams: RouterBoundQueryParams;\n};\n\nexport const createRouter = <const TRoutes extends readonly RouteTreeBranch[]>(\n options: CreateRouterOptions<TRoutes>,\n): HyperdomRouter<CollectNamedRoutes<TRoutes>> =>\n attachRouterQueryParams(\n createRouterCore(options) as HyperdomRouter<CollectNamedRoutes<TRoutes>>,\n );\n","import { h } from \"@echojs-ecosystem/hyperdom\";\nimport type { Child } from \"@echojs-ecosystem/hyperdom\";\nimport { getRouteState } from \"../core/route\";\nimport type { Route } from \"../core/types\";\nimport type { QueryRecord } from \"../core/query\";\n\nexport type LinkProps<Params = Record<string, string>, Query = QueryRecord> = {\n to?: Route<Params, Query>;\n href?: string;\n params?: Params;\n query?: Query;\n replace?: boolean;\n children?: Child;\n};\n\nexport const Link = <Params = Record<string, string>, Query = QueryRecord>(\n props: LinkProps<Params, Query>,\n): Child => {\n const { to, href, params, query, replace, children } = props;\n\n const resolvedHref = (): string => {\n if (href) return href;\n if (!to) return \"#\";\n const state = getRouteState(to);\n if (!state.router || !state.pathTemplate) return \"#\";\n return state.router.resolve(to as import(\"../core/types\").AnyRoute, (params ?? {}) as Record<\n string,\n string\n >, { query: query as Record<string, unknown> | undefined });\n };\n\n const onClick = (event: MouseEvent): void => {\n if (!to) return;\n event.preventDefault();\n if (params !== undefined) {\n to.go(params, { query, replace });\n } else {\n to.go(undefined as Params, { query, replace });\n }\n };\n\n return h(\n \"a\",\n {\n href: resolvedHref,\n onClick: to ? onClick : undefined,\n },\n children ?? null,\n );\n};\n","import { cx, h } from \"@echojs-ecosystem/hyperdom\";\nimport type { Child } from \"@echojs-ecosystem/hyperdom\";\nimport { getRouteState } from \"../core/route\";\nimport type { Route } from \"../core/types\";\nimport type { QueryRecord } from \"../core/query\";\nimport type { LinkProps } from \"./Link\";\n\nexport type NavLinkProps<Params = Record<string, string>, Query = QueryRecord> = LinkProps<\n Params,\n Query\n> & {\n activeClass?: string;\n class?: string;\n};\n\nexport const NavLink = <Params = Record<string, string>, Query = QueryRecord>(\n props: NavLinkProps<Params, Query>,\n): Child => {\n const {\n to,\n href,\n params,\n query,\n replace,\n children,\n activeClass = \"active\",\n class: className,\n } = props;\n\n const resolvedHref = (): string => {\n if (href) return href;\n if (!to) return \"#\";\n const state = getRouteState(to);\n if (!state.router || !state.pathTemplate) return \"#\";\n return state.router.resolve(to as import(\"../core/types\").AnyRoute, (params ?? {}) as Record<\n string,\n string\n >, { query: query as Record<string, unknown> | undefined });\n };\n\n const classProp = (): string | undefined => {\n const active = to?.$isOpened.value() ?? false;\n return cx(className, active && activeClass);\n };\n\n const onClick = (event: MouseEvent): void => {\n if (!to) return;\n event.preventDefault();\n if (params !== undefined) {\n to.go(params, { query, replace });\n } else {\n to.go(undefined as Params, { query, replace });\n }\n };\n\n const ariaCurrent = (): string | undefined => (to?.$isOpened.value() ? \"page\" : undefined);\n\n return h(\n \"a\",\n {\n href: resolvedHref,\n class: classProp,\n \"aria-current\": ariaCurrent,\n onClick: to ? onClick : undefined,\n },\n children ?? null,\n );\n};\n","import { createView } from \"@echojs-ecosystem/hyperdom\";\nimport type { Child } from \"@echojs-ecosystem/hyperdom\";\n\nimport type { Router } from \"../core/types\";\n\nexport const ROUTER_KEY = Symbol.for(\"echojs.router\");\n\nexport type RouterLike = Pick<Router, \"View\" | \"start\" | \"stop\">;\n\nexport type RouterProviderHost = {\n provide?<T>(key: symbol, value: T): unknown;\n};\n\n/** @deprecated Use {@link RouterProviderHost} */\nexport type RouterPluginHost = RouterProviderHost;\n\nexport type RouterProviderOptions = {\n /** @default true */\n autoStart?: boolean;\n};\n\n/** @deprecated Use {@link RouterProviderOptions} */\nexport type RouterPluginOptions = RouterProviderOptions;\n\n/** Provider shape accepted by `createEchoApp().use(...)`. */\nexport type RouterProvider = {\n name: \"router\";\n setup: (app: RouterProviderHost) => void;\n resolveRoot: () => Child;\n};\n\n/** @deprecated Use {@link RouterProvider} */\nexport type RouterPlugin = RouterProvider;\n\nexport const isRouterLike = (value: unknown): value is RouterLike =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as RouterLike).View === \"function\" &&\n typeof (value as RouterLike).start === \"function\";\n\nexport const createRouterProvider = (\n router: RouterLike,\n options: RouterProviderOptions = {},\n): RouterProvider => ({\n name: \"router\",\n setup(app) {\n app.provide?.(ROUTER_KEY, router);\n },\n resolveRoot() {\n if (options.autoStart !== false) {\n router.start();\n }\n // Return outlet as a dynamic child (do not call router.View() here — that runs\n // layout/page trees outside render/view context and breaks strict hyperdom checks).\n const RootView = createView(() => router.View as Child, \"EchoRouterRoot\");\n return RootView();\n },\n});\n\n/** @deprecated Use {@link createRouterProvider} */\nexport const routerPlugin = createRouterProvider;\n","import type { CollectNamedRoutes, RouteTreeNode } from \"./path-types\";\n\n/**\n * Builds a typed route tree for `createRouter({ routes })`.\n * Use `routeView`, `layoutView`, and `route` (redirect) on each entry.\n */\nexport function createRoutes<const TRoutes extends readonly RouteTreeNode[]>(\n routes: TRoutes,\n): TRoutes {\n return routes;\n}\n\nexport type RoutesFromConfig<TRoutes extends readonly RouteTreeNode[]> = CollectNamedRoutes<TRoutes>;\n","import { registerGuard, clearGuards as clearGuardsRegistry, type GuardRouteOptions } from \"../core/guard-registry\";\n\nexport type { GuardRouteOptions } from \"../core/guard-registry\";\nexport const clearGuards = clearGuardsRegistry;\nexport const guardRoute = (options: GuardRouteOptions): (() => void) => registerGuard(options);\n","import type { Route } from \"../core/types\";\n\nexport type RedirectOptions<\n FromParams = Record<string, unknown>,\n FromQuery = Record<string, unknown>,\n ToParams = FromParams,\n ToQuery = FromQuery,\n> = {\n from: Route<FromParams, FromQuery>;\n to: Route<ToParams, ToQuery>;\n mapParams?: (params: FromParams) => ToParams;\n mapQuery?: (query: FromQuery) => ToQuery;\n};\n\nexport const redirect = <\n FromParams = Record<string, unknown>,\n FromQuery = Record<string, unknown>,\n ToParams = FromParams,\n ToQuery = FromQuery,\n>(\n options: RedirectOptions<FromParams, FromQuery, ToParams, ToQuery>,\n): (() => void) => {\n const { from, to, mapParams, mapQuery } = options;\n\n return from.opened.subscribe((payload) => {\n const params = (mapParams ? mapParams(payload.params) : payload.params) as ToParams;\n const query = (mapQuery ? mapQuery(payload.query) : payload.query) as ToQuery;\n (to as Route<ToParams, ToQuery>).go(params, { query, replace: true });\n });\n};\n","import { signal } from \"@echojs-ecosystem/reactivity\";\nimport type { Route, ChainedRoute } from \"../core/types\";\n\nexport type ChainRouteOptions<Params, Query, Result = void> = {\n route: Route<Params, Query>;\n beforeOpen: (context: { params: Params; query: Query }) => Result | Promise<Result>;\n};\n\nexport const chainRoute = <Params, Query, Result = void>(\n options: ChainRouteOptions<Params, Query, Result>,\n): ChainedRoute<Params, Query, Result> => {\n const { route, beforeOpen } = options;\n\n const $isOpened = signal(false);\n const $pending = signal(false);\n const $error = signal<unknown | null>(null);\n const $params = signal<Params | null>(null);\n const $query = signal<Query>({} as Query);\n const $result = signal<Result | null>(null);\n\n let runId = 0;\n\n const reset = (): void => {\n $isOpened.set(false);\n $pending.set(false);\n $error.set(null);\n $params.set(null);\n $query.set({} as Query);\n $result.set(null);\n };\n\n route.opened.subscribe((payload) => {\n const id = ++runId;\n reset();\n $pending.set(true);\n $params.set(payload.params);\n $query.set(payload.query);\n\n Promise.resolve(beforeOpen({ params: payload.params, query: payload.query }))\n .then((result) => {\n if (id !== runId) return;\n $pending.set(false);\n $error.set(null);\n $result.set(result);\n $isOpened.set(true);\n })\n .catch((error) => {\n if (id !== runId) return;\n $pending.set(false);\n $error.set(error);\n $isOpened.set(false);\n });\n });\n\n route.closed.subscribe(() => {\n runId += 1;\n reset();\n });\n\n return {\n $isOpened,\n $pending,\n $error,\n $params,\n $query,\n $result,\n };\n};\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@echojs-ecosystem/router",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"files": [
|
|
5
|
+
"dist"
|
|
6
|
+
],
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./hyperdom": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./package.json": "./package.json"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"check-types": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.typing.json --noEmit",
|
|
23
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.typing.json --noEmit",
|
|
24
|
+
"test:types": "tsc -p tsconfig.typing.json --noEmit",
|
|
25
|
+
"lint": "oxlint .",
|
|
26
|
+
"lint:fix": "oxlint . --fix",
|
|
27
|
+
"format": "oxfmt --check .",
|
|
28
|
+
"format:fix": "oxfmt .",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest",
|
|
31
|
+
"test:coverage": "vitest run --coverage",
|
|
32
|
+
"test:e2e": "playwright test",
|
|
33
|
+
"test:e2e:ui": "playwright test --ui",
|
|
34
|
+
"test:e2e:debug": "playwright test --debug",
|
|
35
|
+
"test:e2e:install": "playwright install chromium",
|
|
36
|
+
"test:all": "vitest run && playwright test",
|
|
37
|
+
"e2e:serve": "vite --config e2e/fixture/vite.config.ts"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@echojs-ecosystem/hyperdom": "workspace:*",
|
|
41
|
+
"@echojs-ecosystem/reactivity": "workspace:*",
|
|
42
|
+
"@echojs-ecosystem/url-state": "workspace:*"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@echojs-ecosystem/oxc-config": "workspace:*",
|
|
46
|
+
"@playwright/test": "^1.52.0",
|
|
47
|
+
"jsdom": "^26.1.0",
|
|
48
|
+
"typescript": "5.9.2",
|
|
49
|
+
"vite": "^6.0.0",
|
|
50
|
+
"vitest": "^4.1.4"
|
|
51
|
+
},
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
},
|
|
55
|
+
"repository": {
|
|
56
|
+
"type": "git",
|
|
57
|
+
"url": "https://github.com/echojs-ecosystem/echojs-core.git",
|
|
58
|
+
"directory": "packages/router"
|
|
59
|
+
}
|
|
60
|
+
}
|