bobe-router 0.0.66 → 0.0.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/match.ts","../src/global.ts","../src/router.ts"],"sourcesContent":["import type { RouteMap, MatchResult } from './type';\n\n/** 编译路径模式为正则:/post/:id → ^\\/post\\/([^/]+)$,捕获名为 id */\nfunction compilePattern(pattern: string): { regex: RegExp; params: string[] } {\n const paramNames: string[] = [];\n const regexStr = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // 转义正则特殊字符\n .replace(/:([a-zA-Z_]\\w*)/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n });\n return {\n regex: new RegExp(`^${regexStr}$`),\n params: paramNames,\n };\n}\n\n/** 预编译所有路由的正则 */\ntype CompiledRoute = {\n pattern: string;\n regex: RegExp;\n paramNames: string[];\n};\n\nlet compiledCache: CompiledRoute[] | null = null;\nlet cacheKey: RouteMap | null = null;\n\nfunction compileRoutes(map: RouteMap): CompiledRoute[] {\n if (cacheKey === map && compiledCache) return compiledCache;\n compiledCache = Object.keys(map)\n .filter((k) => k !== '*') // 通配符最后匹配\n .map((pattern) => {\n const { regex, params: paramNames } = compilePattern(pattern);\n return { pattern, regex, paramNames };\n });\n // 通配符路由放最后\n if (map['*']) {\n compiledCache.push({ pattern: '*', regex: /.*/, paramNames: [] });\n }\n cacheKey = map;\n return compiledCache;\n}\n\n/**\n * 根据路径匹配路由表\n * @param path - URL 路径,如 /post/42\n * @param map - 路由表\n * @returns 匹配结果,含路径参数;null 表示 404\n */\nexport function match(path: string, map: RouteMap): MatchResult | null {\n // 确保以 / 开头\n const normalized = path.startsWith('/') ? path : `/${path}`;\n\n for (const compiled of compileRoutes(map)) {\n const m = normalized.match(compiled.regex);\n if (!m) continue;\n\n const params: Record<string, string> = {};\n for (let i = 0; i < compiled.paramNames.length; i++) {\n params[compiled.paramNames[i]] = m[i + 1];\n }\n return { path: compiled.pattern, params };\n }\n return null;\n}\n","/** 通过 globalThis 传递的路由全局变量名 */\nexport enum GlobalKey {\n /** 路由表:{ [url]: { import/component } } */\n Routes = '__BOBE_INIT_ROUTES__',\n /** 菜单树:Menu[] */\n Menus = '__BOBE_INIT_MENUS__',\n /** 初始路径 */\n Path = '__BOBE_INIT_PATH__',\n}\n","import { Store, StoreIgnoreKeys } from 'aoye';\nimport type { RouteMap, RouteEntry, RouteRecord, GuardResult, Menu, RouterOptions } from './type';\nimport { match } from './match';\nimport { GlobalKey } from './global';\n\n/** 创建带初始数据的 RouteRecord */\nexport function createRouteRecord(\n opts: Partial<Pick<RouteRecord, 'import' | 'component' | 'params' | 'meta' | 'layout'>> = {}\n): RouteRecord {\n return {\n import: opts.import,\n component: opts.component,\n status: opts.component ? 'loaded' : 'idle',\n params: opts.params,\n meta: opts.meta,\n layout: opts.layout,\n };\n}\n\nexport class Router extends Store {\n static [StoreIgnoreKeys] = ['routes', 'menus', 'stack', 'ready'] as string[];\n\n /** 当前激活的路由,模板用 {active.component} 渲染 */\n active: RouteEntry | null = null;\n\n /** 路由表 */\n routes: RouteMap = {};\n\n /** 目录嵌套菜单 */\n menus: Menu[] = [];\n\n /** 进入守卫 */\n enterGuard?: (to: RouteEntry) => GuardResult | Promise<GuardResult>;\n\n /** 离开守卫 */\n leaveGuard?: (from: RouteEntry) => GuardResult | Promise<GuardResult>;\n\n /** 历史栈(不响应式) */\n private stack: RouteEntry[] = [];\n private stackIndex = 0;\n\n /** 待预加载的路径集合 */\n private idleSet = new Set<string>();\n\n /** 最大并行预加载数 */\n maxPreload = 3;\n\n /** 当前正在加载的组件数 */\n private loadingCount = 0;\n\n /**\n * 注册首屏就绪回调。\n * - 已初始化 → 同步执行 cb\n * - 未初始化 → 入队,首屏加载完成后执行\n * 支持多次调用。\n * 无参数时返回 Promise。\n */\n ready(): Promise<void>;\n ready(cb: () => void): void;\n ready(cb?: () => void): Promise<void> | void {\n if (cb) {\n if (this.#inited) { cb(); }\n else { this.#readyQueue.push(cb); }\n return;\n }\n return new Promise<void>(resolve => this.ready(resolve));\n }\n\n #inited = false;\n #readyQueue: (() => void)[] = [];\n\n constructor(opt?: RouterOptions) {\n super();\n\n const routes = opt?.routes;\n const initialPath = opt?.initialPath;\n\n // 1. routes 优先级:用户传入 > SSR 注入 > 空\n this.routes = routes\n || (globalThis as any)[GlobalKey.Routes]\n || {};\n\n // 2. menus 优先级:SSR 注入 > 空\n const injectedMenus = (globalThis as any)[GlobalKey.Menus];\n if (injectedMenus) this.menus = injectedMenus;\n\n // 3. path 优先级:用户传入 > SSR 注入 > location > '/'\n const path = initialPath\n || (globalThis as any)[GlobalKey.Path]\n || (typeof location !== 'undefined' ? location.pathname : '/');\n\n this.#init(path);\n }\n\n // ====== 初始化 ======\n async #init(path: string): Promise<void> {\n\n // 1. 初始化 idleSet(在加载首屏前,让预加载尽早启动)\n this.#initIdleSet();\n\n // 2. 首屏:匹配路由,已有 component 则跳过 load\n const result = match(path, this.routes);\n if (result) {\n const route = this.routes[result.path];\n\n if (route?.component) {\n // SSR 注入或构造函数传入的 component,直接复用\n route.status = 'loaded';\n } else {\n await this.#loadComponent(result.path);\n }\n\n this.active = {\n path,\n params: result.params,\n component: route?.component,\n meta: route?.meta,\n layout: route?.layout,\n };\n }\n\n this.stack = [{ path, params: this.active?.params ?? {} }];\n this.stackIndex = 0;\n this.#initBrowser();\n\n // 就绪:执行所有排队回调\n this.#inited = true;\n const q = this.#readyQueue;\n this.#readyQueue = [];\n for (const cb of q) cb();\n }\n\n // ====== 浏览器初始化 ======\n\n #initBrowser(): void {\n if (typeof window === 'undefined') return;\n\n // 劫持容器内链接点击\n document.addEventListener('click', this.#onClick);\n\n // 浏览器前进/后退\n window.addEventListener('popstate', this.#onPopstate);\n }\n\n #initIdleSet(): void {\n for (const path of Object.keys(this.routes)) {\n if (this.routes[path].status === 'idle') {\n this.idleSet.add(path);\n }\n }\n // 移除首屏路径\n if (this.active) {\n this.idleSet.delete(this.active.path);\n }\n }\n\n // ====== 五个公开方法 ======\n\n /** 导航到新页面(追加历史记录) */\n async pushState(url: string): Promise<void> {\n const result = match(url, this.routes);\n if (!result) return;\n\n const target: RouteEntry = { path: url, params: result.params };\n // 截断当前位置之后的历史,再追加\n this.stack.length = this.stackIndex + 1;\n this.stack.push(target);\n this.stackIndex = this.stack.length - 1;\n await this.#navigate(target);\n }\n\n /** 替换当前页面(不追加历史记录) */\n async replaceState(url: string): Promise<void> {\n const result = match(url, this.routes);\n if (!result) return;\n\n const target: RouteEntry = { path: url, params: result.params };\n this.stack[this.stackIndex] = target;\n await this.#navigate(target, { replace: true });\n }\n\n /** 后退 */\n async back(): Promise<void> {\n if (this.stackIndex <= 0) return;\n if (!(await this.#checkGuard(this.active!, 'leave'))) return;\n\n const target = this.stack[this.stackIndex - 1];\n if (!(await this.#checkGuard(target, 'enter'))) return;\n\n history.back(); // popstate 触发 Index 同步\n }\n\n /** 前进 */\n async forward(): Promise<void> {\n if (this.stackIndex >= this.stack.length - 1) return;\n if (!(await this.#checkGuard(this.active!, 'leave'))) return;\n\n const target = this.stack[this.stackIndex + 1];\n if (!(await this.#checkGuard(target, 'enter'))) return;\n\n history.forward(); // popstate 触发 Index 同步\n }\n\n /** 跳转多步 */\n async go(delta: number): Promise<void> {\n if (delta === 0) return;\n const newIdx = this.stackIndex + delta;\n if (newIdx < 0 || newIdx >= this.stack.length) return;\n\n if (!(await this.#checkGuard(this.active!, 'leave'))) return;\n if (!(await this.#checkGuard(this.stack[newIdx], 'enter'))) return;\n\n history.go(delta);\n }\n\n // ====== 内部实现 ======\n\n private navId = 0;\n\n async #navigate(target: RouteEntry, opts: { replace?: boolean } = {}): Promise<void> {\n const id = ++this.navId;\n\n if (!(await this.#checkGuard(this.active!, 'leave'))) return;\n if (id !== this.navId) return; // 守卫期间有新导航,丢弃本次\n if (!(await this.#checkGuard(target, 'enter'))) return;\n if (id !== this.navId) return;\n\n // 保存当前页滚动位置\n if (this.active && this.stack[this.stackIndex]) {\n this.stack[this.stackIndex].scroll = window.scrollY;\n }\n\n if (!opts.replace) {\n history.pushState(null, '', target.path);\n } else {\n history.replaceState(null, '', target.path);\n }\n\n // 加载组件\n await this.#loadComponent(target.path);\n if (id !== this.navId) return; // 加载期间有新导航,丢弃本次\n\n const route = this.routes[target.path];\n target.component = route?.component;\n target.meta = route?.meta;\n target.layout = route?.layout;\n this.active = target;\n\n // hash 滚动\n const hash = new URL(target.path, location.origin).hash;\n if (hash) {\n const el = document.querySelector(decodeURIComponent(hash));\n if (el) (el as HTMLElement).scrollIntoView({ behavior: 'smooth' });\n }\n\n this.#preloadNext();\n }\n\n async #checkGuard(\n entry: RouteEntry,\n type: 'enter' | 'leave'\n ): Promise<boolean> {\n if (type === 'enter' && this.enterGuard) {\n const result = await this.enterGuard(entry);\n if (result === false) return false;\n if (typeof result === 'object' && !result.ok) return false;\n }\n if (type === 'leave' && this.leaveGuard) {\n const result = await this.leaveGuard(entry);\n if (result === false) return false;\n if (typeof result === 'object' && !result.ok) return false;\n }\n return true;\n }\n\n // ====== 组件异步加载 ======\n\n async #loadComponent(path: string): Promise<any> {\n const route = this.routes[path];\n if (!route) return undefined;\n\n switch (route.status) {\n case 'loaded':\n return route.component;\n case 'loading':\n return route.promise;\n case 'error':\n break; // 可重试\n case 'idle':\n break;\n }\n\n if (!route.import) {\n throw new Error(`Route \"${path}\" has no import function`);\n }\n\n this.idleSet.delete(path);\n route.status = 'loading';\n route.promise = route\n .import()\n .then((mod: any) => {\n const Comp = mod.default || mod;\n route.status = 'loaded';\n route.component = Comp;\n // 从模块 named export 提取 routeMeta(构建时未提取到时的回退)\n if (!route.meta && mod.routeMeta) {\n route.meta = mod.routeMeta;\n }\n // 从模块 named export 提取 layout(若未显式设置)\n if (!route.layout && mod.layout) {\n route.layout = mod.layout;\n }\n return route.component;\n })\n .catch((err) => {\n route.status = 'error';\n throw err;\n })\n .finally(() => {\n this.loadingCount--;\n this.#preloadNext();\n });\n\n return route.promise;\n }\n\n // ====== 空闲预加载 ======\n\n #preloadNext(): void {\n while (this.loadingCount < this.maxPreload && this.idleSet.size > 0) {\n const path = this.idleSet.values().next().value!;\n this.loadingCount++;\n const scheduler =\n typeof requestIdleCallback !== 'undefined'\n ? requestIdleCallback\n : (fn: () => void) => setTimeout(fn, 0);\n scheduler(() => {\n this.#loadComponent(path);\n });\n }\n }\n\n // ====== 链接劫持 ======\n\n #onClick = (e: MouseEvent): void => {\n const link = (e.target as Element).closest('a');\n if (!link) return;\n\n const href = link.getAttribute('href');\n if (!href) return;\n\n // 纯 hash 链接放行,浏览器原生处理滚动\n if (href.startsWith('#')) return;\n\n try {\n const url = new URL(href, location.origin);\n // 外部链接不拦截\n if (url.origin !== location.origin) return;\n // 新窗口、下载、快捷键不拦截\n if (link.target === '_blank') return;\n if (link.hasAttribute('download')) return;\n if (e.ctrlKey || e.metaKey || e.shiftKey) return;\n\n e.preventDefault();\n this.pushState(url.pathname + url.search + url.hash);\n } catch {\n // 无效 URL,不拦截\n }\n };\n\n // ====== popstate 回调 ======\n\n #onPopstate = (): void => {\n const current = location.pathname + location.search;\n const idx = this.stack.findLastIndex((r) => r.path === current);\n\n if (idx !== -1) {\n // 仅 hash 变化,浏览器已更新 URL 并处理滚动,跳过 #navigate(避免 replaceState 抹掉 hash)\n if (idx === this.stackIndex) return;\n // 在栈中 → Router 产生的历史,移动指针\n this.stackIndex = idx;\n const entry = this.stack[idx];\n this.#navigate(entry, { replace: true });\n // 恢复滚动位置\n if (entry.scroll != null) {\n window.scrollTo(0, entry.scroll);\n }\n } else {\n // 不在栈中 → 外部跳转,重置栈\n const result = match(current, this.routes);\n const route = result ? this.routes[result.path] : undefined;\n const entry: RouteEntry = {\n path: current,\n params: result?.params ?? {},\n meta: route?.meta,\n layout: route?.layout,\n };\n this.stack = [entry];\n this.stackIndex = 0;\n this.active = entry;\n }\n };\n}\n"],"names":["compilePattern","pattern","paramNames","regexStr","replace","_","name","push","regex","RegExp","params","compiledCache","cacheKey","compileRoutes","map","Object","keys","filter","k","_compilePattern","match","path","normalized","startsWith","compiled","m","i","length","GlobalKey","createRouteRecord","opts","import","component","status","meta","layout","Router","Store","StoreIgnoreKeys","active","routes","menus","stack","stackIndex","idleSet","Set","maxPreload","loadingCount","ready","cb","Promise","resolve","constructor","opt","initialPath","globalThis","Routes","injectedMenus","Menus","Path","location","pathname","#init","result","route","q","#initBrowser","window","document","addEventListener","#initIdleSet","add","delete","pushState","url","target","replaceState","back","history","forward","go","delta","newIdx","navId","#navigate","id","scroll","scrollY","hash","URL","origin","el","querySelector","decodeURIComponent","scrollIntoView","behavior","#checkGuard","entry","type","enterGuard","ok","leaveGuard","#loadComponent","undefined","promise","Error","then","mod","Comp","default","routeMeta","catch","err","finally","#preloadNext","size","values","next","value","scheduler","requestIdleCallback","fn","setTimeout","e","link","closest","href","getAttribute","hasAttribute","ctrlKey","metaKey","shiftKey","preventDefault","search","#onPopstate","current","idx","findLastIndex","r","scrollTo"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/global.ts","../src/match.ts","../src/runtime/transaction.ts","../src/runtime/router.ts"],"sourcesContent":["/** 通过 globalThis 传递的路由全局变量名 */\nexport enum GlobalKey {\n /** 路由表:{ [url]: { import/component } } */\n Routes = '__BOBE_INIT_ROUTES__',\n /** 菜单树:Menu[] */\n Menus = '__BOBE_INIT_MENUS__',\n /** 初始路径 */\n Path = '__BOBE_INIT_PATH__',\n}\n","import type { RouteMap, MatchResult } from './type';\n\n/** 编译路径模式为正则:/post/:id → ^\\/post\\/([^/]+)$,捕获名为 id */\nfunction compilePattern(pattern: string): { regex: RegExp; params: string[] } {\n const paramNames: string[] = [];\n const regexStr = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // 转义正则特殊字符\n .replace(/:([a-zA-Z_]\\w*)/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n });\n return {\n regex: new RegExp(`^${regexStr}$`),\n params: paramNames,\n };\n}\n\n/** 预编译所有路由的正则 */\ntype CompiledRoute = {\n pattern: string;\n regex: RegExp;\n paramNames: string[];\n};\n\nlet compiledCache: CompiledRoute[] | null = null;\nlet cacheKey: RouteMap | null = null;\n\nfunction compileRoutes(map: RouteMap): CompiledRoute[] {\n if (cacheKey === map && compiledCache) return compiledCache;\n compiledCache = Object.keys(map)\n .filter((k) => k !== '*') // 通配符最后匹配\n .map((pattern) => {\n const { regex, params: paramNames } = compilePattern(pattern);\n return { pattern, regex, paramNames };\n });\n // 通配符路由放最后\n if (map['*']) {\n compiledCache.push({ pattern: '*', regex: /.*/, paramNames: [] });\n }\n cacheKey = map;\n return compiledCache;\n}\n\n/**\n * 根据路径匹配路由表\n * @param path - URL 路径,如 /post/42、/about/?foo=bar#sec\n * @param map - 路由表\n * @returns 匹配结果,含路径参数;null 表示 404\n */\nexport function match(path: string, map: RouteMap): MatchResult | null {\n // 用 URL API 解析,自动剥离 query string 和 hash\n const parsed = new URL(path, 'http://localhost');\n let normalized = parsed.pathname;\n\n // 去掉尾部 /(根路径 / 保留)\n if (normalized.length > 1 && normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n for (const compiled of compileRoutes(map)) {\n const m = normalized.match(compiled.regex);\n if (!m) continue;\n\n const params: Record<string, string> = {};\n for (let i = 0; i < compiled.paramNames.length; i++) {\n params[compiled.paramNames[i]] = m[i + 1];\n }\n return { path: compiled.pattern, params, url: normalized };\n }\n return null;\n}\n","import type {\n NavigationContext,\n NavigationHandler,\n NavigationHandlerResult,\n NavigationRequest,\n NavigationResult,\n NavigationStatus,\n RuntimeRouterLike,\n} from './types';\n\nexport class NavigationTransactionRunner {\n #nextTokenId = 0;\n #currentTokenId = 0;\n\n createToken(request?: NavigationRequest) {\n const token = {\n id: ++this.#nextTokenId,\n request,\n cancelled: false,\n };\n this.#currentTokenId = token.id;\n return token;\n }\n\n isTokenValid(ctx: Pick<NavigationContext, 'token'>): boolean {\n return !ctx.token.cancelled && ctx.token.id === this.#currentTokenId;\n }\n\n isTokenIdCurrent(tokenId: number): boolean {\n return tokenId === this.#currentTokenId;\n }\n\n cancelCurrent(): void {\n this.#currentTokenId = ++this.#nextTokenId;\n }\n\n async run(\n router: RuntimeRouterLike,\n handlers: NavigationHandler[],\n request?: NavigationRequest\n ): Promise<NavigationResult> {\n const ctx: NavigationContext = {\n router,\n request,\n token: this.createToken(request),\n status: 'running',\n rollbackStack: [],\n };\n let queue = [...handlers];\n\n while (queue.length > 0) {\n const handler = queue.shift()!;\n let result: NavigationHandlerResult;\n\n try {\n result = await handler(ctx);\n } catch (error) {\n ctx.error = error;\n ctx.status = 'error';\n await this.#rollback(ctx);\n return { status: ctx.status, ctx, error };\n }\n\n if (!this.isTokenValid(ctx)) {\n ctx.status = 'cancelled';\n return { status: ctx.status, ctx };\n }\n\n if (!result) continue;\n\n if (result.type === 'stop') {\n ctx.status = result.status ?? ctx.status;\n return { status: ctx.status, ctx };\n }\n\n if (result.type === 'prepend') {\n queue.unshift(...result.handlers);\n continue;\n }\n\n if (result.type === 'replace') {\n queue = [...result.handlers];\n }\n }\n\n if (ctx.status === 'running') ctx.status = 'completed';\n return { status: ctx.status, ctx };\n }\n\n stop(status: NavigationStatus = 'completed'): NavigationHandlerResult {\n return { type: 'stop', status };\n }\n\n replace(handlers: NavigationHandler[]): NavigationHandlerResult {\n return { type: 'replace', handlers };\n }\n\n prepend(handlers: NavigationHandler[]): NavigationHandlerResult {\n return { type: 'prepend', handlers };\n }\n\n async #rollback(ctx: NavigationContext): Promise<void> {\n for (let i = ctx.rollbackStack.length - 1; i >= 0; i--) {\n await ctx.rollbackStack[i](ctx);\n }\n }\n}\n","import { Store, StoreIgnoreKeys, effect } from 'aoye';\nimport { GlobalKey } from '../global';\nimport { match } from '../match';\nimport type { GuardResult, Menu, RouteMap, RouteRecord } from '../type';\nimport { NavigationTransactionRunner } from './transaction';\nimport type {\n GuardDecision,\n HistoryDeltaRequest,\n NavigationContext,\n NavigationHandler,\n NavigationRequest,\n NavigationResult,\n PendingHistoryDelta,\n PreloadTask,\n ReadyCallback,\n RenderWaiter,\n RouteEntry,\n RouteMatch,\n RouteModule,\n RouterErrorHandler,\n RouterHistoryState,\n RouterTimeoutHandler,\n RuntimeRouterOptions,\n ScrollIntent,\n ScrollRetryPolicy,\n ScrollSnapshot,\n} from './types';\n\nconst DEFAULT_HISTORY_KEY = '__bobe_router_runtime__';\n\nexport function createRouteRecord(\n opts: Partial<Pick<RouteRecord, 'import' | 'component' | 'params' | 'meta' | 'layout'>> = {}\n): RouteRecord {\n return {\n import: opts.import,\n component: opts.component,\n status: opts.component ? 'loaded' : 'idle',\n params: opts.params,\n meta: opts.meta,\n layout: opts.layout,\n };\n}\n\nexport class Router extends Store {\n static [StoreIgnoreKeys] = [\n 'routes',\n 'menus',\n 'stack',\n 'ready',\n 'scrollRootId',\n 'historyKey',\n 'maxPreload',\n 'onError',\n 'loadTimeout',\n 'onTimeout',\n ] as string[];\n\n active: RouteEntry | null = null;\n routes: RouteMap = {};\n menus: Menu[] = [];\n enterGuard?: (to: RouteEntry) => GuardResult | Promise<GuardResult>;\n leaveGuard?: (from: RouteEntry) => GuardResult | Promise<GuardResult>;\n onError?: RouterErrorHandler;\n loadTimeout?: number;\n onTimeout?: RouterTimeoutHandler;\n scrollRootId?: string;\n maxPreload = 3;\n historyKey = DEFAULT_HISTORY_KEY;\n\n #stack: RouteEntry[] = [];\n #stackIndex = 0;\n #ready = false;\n #readyQueue: ReadyCallback[] = [];\n #idleSet = new Set<string>();\n #loadingCount = 0;\n #pendingHistoryDelta: PendingHistoryDelta | null = null;\n #initialHistoryState: RouterHistoryState | null = null;\n #transaction = new NavigationTransactionRunner();\n #entryId = 0;\n\n constructor(opt?: RuntimeRouterOptions) {\n super();\n\n this.routes = opt?.routes || (globalThis as any)[GlobalKey.Routes] || {};\n this.menus = (globalThis as any)[GlobalKey.Menus] || [];\n this.enterGuard = opt?.enterGuard;\n this.leaveGuard = opt?.leaveGuard;\n this.onError = opt?.onError;\n this.loadTimeout = opt?.loadTimeout;\n this.onTimeout = opt?.onTimeout;\n this.scrollRootId = opt?.scrollRootId;\n this.maxPreload = opt?.maxPreload ?? this.maxPreload;\n this.historyKey = opt?.historyKey || DEFAULT_HISTORY_KEY;\n this.#initialHistoryState = this.#hasBrowser() ? this.#readHistoryState(history.state) : null;\n\n const initialUrl =\n opt?.initialPath ||\n (globalThis as any)[GlobalKey.Path] ||\n (this.#hasBrowser() ? location.pathname + location.search + location.hash : '/');\n\n this.#initIdleSet();\n void this.#init(initialUrl);\n }\n\n ready(): Promise<void>;\n ready(cb: ReadyCallback): void;\n ready(cb?: ReadyCallback): Promise<void> | void {\n if (cb) {\n if (this.#ready) cb();\n else this.#readyQueue.push(cb);\n return;\n }\n return new Promise<void>(resolve => this.ready(resolve));\n }\n\n async pushState(url: string): Promise<NavigationResult> {\n const request: NavigationRequest = {\n source: 'api',\n url,\n historyMode: 'push',\n runGuards: true,\n restoreScroll: false,\n };\n return this.#runNavigation(request, [\n this.#handleCreateUrlContext(request),\n this.#handleBuildRouteEntry,\n this.#handleSaveCurrentScroll,\n this.#handleRunGuards,\n this.#handleLoadComponent,\n this.#handleBuildCommitPlan('push', 'append', () => this.#stackIndex + 1),\n this.#handleCommitHistory,\n this.#handleCommitStack,\n this.#handlePrepareScrollWaiter,\n this.#handleSetActive,\n this.#handleScroll,\n this.#handleStartIdlePreload,\n ]);\n }\n\n async replaceState(url: string): Promise<NavigationResult> {\n const request: NavigationRequest = {\n source: 'api',\n url,\n historyMode: 'replace',\n runGuards: true,\n restoreScroll: false,\n };\n return this.#runNavigation(request, this.#replaceHandlers(request));\n }\n\n async back(): Promise<NavigationResult> {\n return this.#goByDelta(-1);\n }\n\n async forward(): Promise<NavigationResult> {\n return this.#goByDelta(1);\n }\n\n async go(delta: number): Promise<NavigationResult> {\n const request: NavigationRequest = {\n source: 'api',\n historyMode: 'browser-delta',\n delta,\n runGuards: true,\n restoreScroll: true,\n };\n if (delta === 0) {\n return {\n status: 'ignored',\n ctx: {\n router: this,\n request,\n token: { id: 0, request, cancelled: false },\n status: 'ignored',\n rollbackStack: [],\n },\n };\n }\n return this.#goByDelta(delta, request);\n }\n\n async #init(url: string): Promise<void> {\n const request: NavigationRequest = {\n source: 'init',\n url,\n historyMode: 'replace',\n runGuards: true,\n restoreScroll: false,\n };\n\n await this.#runNavigation(request, [\n this.#handleCreateUrlContext(request),\n this.#handleBuildRouteEntry,\n this.#handleRunGuards,\n this.#handleLoadComponent,\n this.#handleBuildCommitPlan('replace', 'replace-current', ctx => {\n const existingState = this.#initialHistoryState;\n if (existingState && ctx.to) ctx.to.id = existingState.entryId;\n return existingState?.index ?? 0;\n }),\n this.#handleCommitHistory,\n this.#handleCommitStack,\n this.#handlePrepareScrollWaiter,\n this.#handleSetActive,\n this.#handleScroll,\n this.#handleStartIdlePreload,\n ]);\n\n this.#initBrowser();\n this.#ready = true;\n const queue = this.#readyQueue;\n this.#readyQueue = [];\n for (const cb of queue) cb();\n }\n\n async #goByDelta(delta: number, request?: NavigationRequest): Promise<NavigationResult> {\n const currentRequest =\n request ||\n ({\n source: 'api',\n historyMode: 'browser-delta',\n delta,\n runGuards: true,\n restoreScroll: true,\n } satisfies NavigationRequest);\n if (!this.#hasBrowser()) {\n return {\n status: 'ignored',\n ctx: {\n router: this,\n request: currentRequest,\n token: { id: 0, request: currentRequest, cancelled: false },\n status: 'ignored',\n rollbackStack: [],\n },\n };\n }\n return this.#runNavigation(currentRequest, [\n ctx => {\n ctx.historyDelta = { delta };\n ctx.from = this.active;\n },\n this.#handleResolveHistoryDeltaTarget,\n this.#handleBuildRouteEntryFromStack,\n this.#handleSaveCurrentScroll,\n this.#handleRunGuards,\n this.#handleLoadComponent,\n this.#handleSetPendingHistoryDelta,\n ctx => {\n const delta = ctx.historyDelta?.delta;\n if (!this.#hasBrowser() || typeof delta !== 'number') return;\n history.go(delta);\n },\n ]);\n }\n\n async #runNavigation(\n request: NavigationRequest | undefined,\n handlers: NavigationHandler[]\n ): Promise<NavigationResult> {\n const result = await this.#transaction.run(this, handlers, request);\n if (result.status === 'error') {\n await this.#notifyNavigationError(result.error, result.ctx);\n }\n return result;\n }\n\n async #notifyNavigationError(error: unknown, ctx: NavigationContext): Promise<void> {\n if (!this.onError) {\n console.error(error);\n return;\n }\n\n try {\n await this.onError(error, ctx);\n } catch (notifyError) {\n console.error(notifyError);\n }\n }\n\n #replaceHandlers(request: Extract<NavigationRequest, { url: string }>): NavigationHandler[] {\n return [\n this.#handleCreateUrlContext(request),\n this.#handleBuildRouteEntry,\n this.#handleRunGuards,\n this.#handleLoadComponent,\n this.#handleBuildCommitPlan('replace', 'replace-current', () => this.#stackIndex),\n this.#handleCommitHistory,\n this.#handleCommitStack,\n this.#handlePrepareScrollWaiter,\n this.#handleSetActive,\n this.#handleScroll,\n this.#handleStartIdlePreload,\n ];\n }\n\n #hashOnlyScrollHandlers(url: string): NavigationHandler[] {\n return [\n ctx => {\n ctx.url = url;\n ctx.from = this.active;\n ctx.to = this.active ?? undefined;\n ctx.scrollIntent = this.#createScrollIntentFromUrl(url, undefined, false);\n ctx.commitPlan = {\n historyAction: 'none',\n stackAction: 'none',\n scrollIntent: ctx.scrollIntent,\n };\n if (this.active) {\n const parsed = this.#parseUrl(url);\n this.active.url = url;\n this.active.hash = parsed.hash;\n if (this.#stack[this.#stackIndex]?.id === this.active.id) {\n this.#stack[this.#stackIndex].url = url;\n this.#stack[this.#stackIndex].hash = parsed.hash;\n }\n }\n },\n this.#handlePrepareScrollWaiter,\n this.#handleScroll,\n ];\n }\n\n #handleCreateUrlContext(request: Extract<NavigationRequest, { url: string }>): NavigationHandler {\n return ctx => {\n ctx.request = request;\n ctx.url = request.url;\n ctx.from = this.active;\n };\n }\n\n #handleBuildRouteEntry: NavigationHandler = ctx => {\n if (!ctx.url) return this.#transaction.stop('ignored');\n const routeMatch = this.#matchUrl(ctx.url);\n if (!routeMatch) return this.#transaction.stop('ignored');\n ctx.match = routeMatch;\n ctx.to = this.#createRouteEntry(routeMatch);\n ctx.scrollIntent = this.#createScrollIntentFromUrl(ctx.to.url);\n };\n\n #handleBuildRouteEntryFromStack: NavigationHandler = ctx => {\n const target = ctx.historyDelta?.targetEntry;\n if (!target) {\n this.#allowExternalHistoryDelta(ctx);\n return this.#transaction.stop('completed');\n }\n ctx.to = target;\n ctx.url = target.url;\n const routeMatch = this.#matchUrl(target.url);\n if (routeMatch) ctx.match = routeMatch;\n ctx.scrollIntent = target.scroll\n ? this.#createRestoreScrollIntent(target.scroll)\n : this.#createScrollIntentFromUrl(target.url);\n };\n\n #handleBuildRouteEntryFromHistoryState(state: RouterHistoryState): NavigationHandler {\n return ctx => {\n const entry = this.#stack[state.index];\n ctx.historyDelta = {\n delta: state.index - this.#stackIndex,\n targetState: state,\n targetEntry: entry,\n };\n\n if (entry && entry.id === state.entryId) {\n ctx.to = entry;\n ctx.url = entry.url;\n const routeMatch = this.#matchUrl(entry.url);\n if (routeMatch) ctx.match = routeMatch;\n ctx.scrollIntent = entry.scroll\n ? this.#createRestoreScrollIntent(entry.scroll)\n : this.#createScrollIntentFromUrl(entry.url);\n return;\n }\n\n const routeMatch = this.#matchUrl(ctx.url || state.url);\n if (!routeMatch) return this.#transaction.stop('ignored');\n ctx.match = routeMatch;\n ctx.to = this.#createRouteEntry(routeMatch, state.entryId);\n ctx.historyDelta.targetEntry = ctx.to;\n ctx.scrollIntent = this.#createScrollIntentFromUrl(ctx.to.url);\n };\n }\n\n #handleResolveHistoryDeltaTarget: NavigationHandler = ctx => {\n const delta = ctx.historyDelta?.delta ?? 0;\n const nextIndex = this.#stackIndex + delta;\n\n if (nextIndex < 0 || nextIndex >= this.#stack.length || !this.#stack[nextIndex]) {\n this.#allowExternalHistoryDelta(ctx);\n return this.#transaction.stop('completed');\n }\n\n ctx.historyDelta = {\n delta,\n targetEntry: this.#stack[nextIndex],\n targetState: this.#createHistoryState(this.#stack[nextIndex], nextIndex),\n };\n };\n\n #handleRunGuards: NavigationHandler = async ctx => {\n if (ctx.request && !ctx.request.runGuards) {\n ctx.guard = { type: 'allowed' };\n return;\n }\n if (!ctx.to) return this.#transaction.stop('ignored');\n\n const decision = await this.#runGuardsOnce(ctx.from ?? null, ctx.to);\n if (!this.#transaction.isTokenValid(ctx)) return this.#transaction.stop('cancelled');\n\n ctx.guard = decision;\n if (decision.type === 'allowed') return;\n if (decision.type === 'blocked') {\n this.#rollbackBrowserHistoryIfNeeded(ctx);\n return this.#transaction.stop('blocked');\n }\n return this.#transaction.replace(\n this.#replaceHandlers({\n source: 'redirect',\n url: decision.to,\n historyMode: 'replace',\n runGuards: true,\n restoreScroll: false,\n })\n );\n };\n\n #handleLoadComponent: NavigationHandler = async ctx => {\n if (!ctx.to) return this.#transaction.stop('ignored');\n const pattern = ctx.match?.pattern || this.#matchUrl(ctx.to.url)?.pattern || ctx.to.path;\n await this.#loadComponentWithTimeout(pattern, ctx);\n if (!this.#transaction.isTokenValid(ctx)) return this.#transaction.stop('cancelled');\n this.#syncRouteRecordToEntry(ctx.to, pattern);\n };\n\n #handleSaveCurrentScroll: NavigationHandler = () => {\n this.#saveScroll(this.#stackIndex);\n };\n\n #handleBuildCommitPlan(\n historyAction: 'push' | 'replace',\n stackAction: 'append' | 'replace-current' | 'reset',\n getNextStackIndex: (ctx: NavigationContext) => number\n ): NavigationHandler {\n return ctx => {\n if (!ctx.to) return this.#transaction.stop('ignored');\n const nextStackIndex = getNextStackIndex(ctx);\n ctx.commitPlan = {\n historyState: this.#createHistoryState(ctx.to, nextStackIndex),\n historyAction,\n stackAction,\n nextStackIndex,\n scrollIntent: ctx.scrollIntent,\n };\n };\n }\n\n #handleBuildPopstateMoveCommitPlan(state: RouterHistoryState): NavigationHandler {\n return ctx => {\n if (!ctx.to) return this.#transaction.stop('ignored');\n const hasMemoryEntry = !!this.#stack[state.index] && this.#stack[state.index].id === state.entryId;\n ctx.commitPlan = {\n historyState: hasMemoryEntry ? state : this.#createHistoryState(ctx.to, 0),\n historyAction: hasMemoryEntry ? 'none' : 'replace',\n stackAction: hasMemoryEntry ? 'move-index' : 'reset',\n nextStackIndex: hasMemoryEntry ? state.index : 0,\n scrollIntent: ctx.scrollIntent,\n };\n };\n }\n\n #handleCommitHistory: NavigationHandler = ctx => {\n const action = ctx.commitPlan?.historyAction;\n if (!action || action === 'none') return;\n if (!this.#hasBrowser() || !ctx.to || !ctx.commitPlan?.historyState) return;\n const previousState = history.state;\n const previousUrl = this.#toUrlString(location);\n\n if (action === 'push') {\n history.pushState(ctx.commitPlan.historyState, '', ctx.to.url);\n ctx.rollbackStack.push(() => {\n if (this.#hasBrowser()) history.go(-1);\n });\n } else {\n history.replaceState(ctx.commitPlan.historyState, '', ctx.to.url);\n ctx.rollbackStack.push(() => {\n if (this.#hasBrowser()) history.replaceState(previousState, '', previousUrl);\n });\n }\n };\n\n #handleCommitStack: NavigationHandler = ctx => {\n const action = ctx.commitPlan?.stackAction;\n if (!action || action === 'none') return;\n\n const previousStack = this.#stack.slice();\n const previousStackIndex = this.#stackIndex;\n const rollbackStack = () => {\n this.#stack = previousStack;\n this.#stackIndex = previousStackIndex;\n };\n\n if (action === 'move-index') {\n const nextIndex = ctx.commitPlan?.nextStackIndex;\n if (typeof nextIndex !== 'number' || !this.#stack[nextIndex]) {\n return this.#transaction.stop('ignored');\n }\n this.#stackIndex = nextIndex;\n ctx.to = ctx.to || this.#stack[nextIndex];\n ctx.rollbackStack.push(rollbackStack);\n return;\n }\n\n if (!ctx.to) return this.#transaction.stop('ignored');\n\n if (action === 'append') {\n this.#stack.length = this.#stackIndex + 1;\n this.#stack.push(ctx.to);\n this.#stackIndex = this.#stack.length - 1;\n ctx.rollbackStack.push(rollbackStack);\n return;\n }\n\n if (action === 'replace-current') {\n const nextIndex = ctx.commitPlan?.nextStackIndex ?? this.#stackIndex;\n this.#stack[nextIndex] = ctx.to;\n this.#stackIndex = nextIndex;\n ctx.rollbackStack.push(rollbackStack);\n return;\n }\n\n if (action === 'reset') {\n this.#stack = [ctx.to];\n this.#stackIndex = 0;\n ctx.rollbackStack.push(rollbackStack);\n }\n };\n\n #handleSetActive: NavigationHandler = ctx => {\n if (!ctx.to) return this.#transaction.stop('ignored');\n const previousActive = this.active;\n this.active = ctx.to;\n ctx.rollbackStack.push(() => {\n this.active = previousActive;\n });\n };\n\n #handleRegisterPopstateRollback: NavigationHandler = ctx => {\n if (!this.#hasBrowser()) return;\n\n if (ctx.request?.source === 'popstate') {\n const delta = ctx.historyDelta?.delta;\n if (typeof delta === 'number' && delta !== 0) {\n ctx.rollbackStack.push(() => {\n if (this.#hasBrowser()) history.go(-delta);\n });\n }\n return;\n }\n\n if (ctx.request?.source === 'external-popstate' && ctx.from) {\n const previousEntry = ctx.from;\n const previousState = this.#createHistoryState(previousEntry, this.#stackIndex);\n ctx.rollbackStack.push(() => {\n if (this.#hasBrowser()) history.replaceState(previousState, '', previousEntry.url);\n });\n }\n };\n\n #handleSetPendingHistoryDelta: NavigationHandler = ctx => {\n const delta = ctx.historyDelta?.delta;\n const target = ctx.historyDelta?.targetEntry;\n if (typeof delta !== 'number' || !target) {\n return this.#transaction.stop('ignored');\n }\n\n const toIndex = this.#stackIndex + delta;\n this.#pendingHistoryDelta = {\n tokenId: ctx.token.id,\n delta,\n fromIndex: this.#stackIndex,\n toIndex,\n targetEntryId: target.id,\n targetUrl: target.url,\n consumed: false,\n };\n };\n\n #handlePrepareScrollWaiter: NavigationHandler = ctx => {\n const scrollIntent = ctx.scrollIntent || ctx.commitPlan?.scrollIntent;\n if (!scrollIntent) return;\n\n const needsActiveRender = ctx.commitPlan?.stackAction !== 'none';\n const renderWaiter = needsActiveRender\n ? this.#createPostEffectWaiter()\n : this.#createFallbackWaiter(scrollIntent.retry.wait);\n\n ctx.renderWaiter = renderWaiter;\n if (ctx.commitPlan) ctx.commitPlan.renderWaiter = renderWaiter;\n ctx.rollbackStack.push(() => renderWaiter.dispose?.());\n };\n\n #handleScroll: NavigationHandler = async ctx => {\n const scrollIntent = ctx.scrollIntent || ctx.commitPlan?.scrollIntent;\n if (!scrollIntent) return;\n\n const waiter = ctx.renderWaiter || ctx.commitPlan?.renderWaiter || this.#createFallbackWaiter(scrollIntent.retry.wait);\n await waiter.promise;\n waiter.dispose?.();\n if (!this.#transaction.isTokenValid(ctx)) return this.#transaction.stop('cancelled');\n\n await this.#applyScrollIntent(ctx, scrollIntent);\n };\n\n #handleStartIdlePreload: NavigationHandler = () => {\n this.#preloadNext();\n };\n\n #initBrowser(): void {\n if (!this.#hasBrowser()) return;\n\n if ('scrollRestoration' in history) {\n history.scrollRestoration = 'manual';\n }\n\n document.addEventListener('click', this.#onClick);\n window.addEventListener('popstate', this.#onPopstate);\n }\n\n #onClick = (event: MouseEvent): void => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const link = target.closest('a');\n if (!link) return;\n\n const href = link.getAttribute('href');\n if (!href) return;\n\n try {\n const url = new URL(href, location.origin);\n if (url.origin !== location.origin) return;\n if (link.target === '_blank' || link.hasAttribute('download')) return;\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;\n\n const nextUrl = this.#toUrlString(url);\n\n if (href.startsWith('#') && !this.#isHashOnlyForActive(nextUrl)) return;\n\n event.preventDefault();\n if (this.active && this.#isSameRouteBase(nextUrl, this.active.url) && this.#toUrlString(location) !== nextUrl) {\n void this.#runNavigation(undefined, this.#hashOnlyScrollHandlers(nextUrl));\n this.active.url = nextUrl;\n this.active.hash = url.hash;\n if (this.#stack[this.#stackIndex]) {\n this.#stack[this.#stackIndex].url = nextUrl;\n this.#stack[this.#stackIndex].hash = url.hash;\n }\n history.pushState(\n { ...this.#createHistoryState(this.active, this.#stackIndex), url: nextUrl },\n '',\n nextUrl\n );\n return;\n }\n\n void this.pushState(nextUrl);\n } catch {\n // Let the browser handle malformed href values.\n }\n };\n\n #onPopstate = (event: PopStateEvent): void => {\n void this.#handlePopstate(event).catch(error => {\n console.error(error);\n });\n };\n\n async #handlePopstate(event: PopStateEvent): Promise<void> {\n const url = this.#toUrlString(location);\n const state = this.#readHistoryState(event.state);\n\n if (state && this.#isValidPendingHistoryDelta(state, url)) {\n const entry = this.#stack[state.index];\n const scrollIntent = entry.scroll\n ? this.#createRestoreScrollIntent(entry.scroll)\n : this.#createScrollIntentFromUrl(entry.url);\n await this.#runNavigation(undefined, [\n ctx => {\n if (!this.#pendingHistoryDelta) return this.#transaction.stop('ignored');\n this.#pendingHistoryDelta.consumed = true;\n this.#pendingHistoryDelta = null;\n },\n ctx => {\n ctx.to = entry;\n ctx.url = entry.url;\n ctx.scrollIntent = scrollIntent;\n ctx.commitPlan = {\n historyState: state,\n historyAction: 'none',\n stackAction: 'move-index',\n nextStackIndex: state.index,\n scrollIntent,\n };\n },\n this.#handleCommitStack,\n this.#handlePrepareScrollWaiter,\n this.#handleSetActive,\n this.#handleScroll,\n this.#handleStartIdlePreload,\n ]);\n return;\n }\n\n if (this.#isHashOnlyForActive(url) && (!state || state.index === this.#stackIndex)) {\n await this.#runNavigation(undefined, this.#hashOnlyScrollHandlers(url));\n return;\n }\n\n if (!state) {\n const request: NavigationRequest = {\n source: 'external-popstate',\n url,\n historyMode: 'replace',\n runGuards: true,\n restoreScroll: false,\n };\n await this.#runNavigation(undefined, [\n this.#handleCreateUrlContext(request),\n this.#handleBuildRouteEntry,\n this.#handleSaveCurrentScroll,\n this.#handleRegisterPopstateRollback,\n this.#handleRunGuards,\n this.#handleLoadComponent,\n this.#handleBuildCommitPlan('replace', 'reset', () => 0),\n this.#handleCommitHistory,\n this.#handleCommitStack,\n this.#handlePrepareScrollWaiter,\n this.#handleSetActive,\n this.#handleScroll,\n this.#handleStartIdlePreload,\n ]);\n return;\n }\n\n const request: NavigationRequest = {\n source: 'popstate',\n url,\n historyMode: 'none',\n runGuards: true,\n restoreScroll: true,\n };\n await this.#runNavigation(undefined, [\n this.#handleCreateUrlContext(request),\n this.#handleBuildRouteEntryFromHistoryState(state),\n this.#handleSaveCurrentScroll,\n this.#handleRegisterPopstateRollback,\n this.#handleRunGuards,\n this.#handleLoadComponent,\n this.#handleBuildPopstateMoveCommitPlan(state),\n this.#handleCommitHistory,\n this.#handleCommitStack,\n this.#handlePrepareScrollWaiter,\n this.#handleSetActive,\n this.#handleScroll,\n this.#handleStartIdlePreload,\n ]);\n }\n\n async #runGuardsOnce(from: RouteEntry | null, to: RouteEntry): Promise<GuardDecision> {\n if (from && this.leaveGuard) {\n const result = await this.leaveGuard(from);\n const decision = this.#toGuardDecision(result);\n if (decision.type !== 'allowed') return decision;\n }\n\n if (this.enterGuard) {\n const result = await this.enterGuard(to);\n return this.#toGuardDecision(result);\n }\n\n return { type: 'allowed' };\n }\n\n #toGuardDecision(result: GuardResult): GuardDecision {\n if (result === false) return { type: 'blocked', result };\n if (result === true) return { type: 'allowed' };\n if (result && typeof result === 'object') {\n if (result.redirect) return { type: 'redirect', to: result.redirect, result };\n if (!result.ok) return { type: 'blocked', result };\n return { type: 'allowed' };\n }\n return { type: 'allowed' };\n }\n\n async #loadComponent(pattern: string, counted = false): Promise<typeof Store | Store | undefined> {\n const route = this.routes[pattern];\n if (!route) {\n if (counted) this.#loadingCount--;\n return undefined;\n }\n\n switch (route.status) {\n case 'loaded':\n if (counted) this.#loadingCount--;\n return route.component;\n case 'loading':\n if (counted) this.#loadingCount--;\n return route.promise;\n case 'error':\n case 'idle':\n break;\n }\n\n if (!route.import) {\n if (route.component) {\n route.status = 'loaded';\n if (counted) this.#loadingCount--;\n return route.component;\n }\n if (counted) this.#loadingCount--;\n throw new Error(`Route \"${pattern}\" has no import function`);\n }\n\n this.#idleSet.delete(pattern);\n route.status = 'loading';\n if (!counted) this.#loadingCount++;\n route.promise = route.import()\n .then((mod: RouteModule) => {\n const record = mod as any;\n const component = typeof mod === 'function' ? mod : record.default || mod;\n route.status = 'loaded';\n route.component = component;\n if (!route.meta && record.routeMeta) route.meta = record.routeMeta;\n if (!route.layout && record.layout) route.layout = record.layout;\n return route.component;\n })\n .catch(error => {\n route.status = 'error';\n throw error;\n })\n .finally(() => {\n this.#loadingCount--;\n this.#preloadNext();\n });\n\n return route.promise;\n }\n\n async #loadComponentWithTimeout(pattern: string, ctx: NavigationContext): Promise<typeof Store | Store | undefined> {\n const promise = this.#loadComponent(pattern);\n const timeout = this.loadTimeout;\n\n if (!timeout || timeout <= 0) {\n return promise;\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<'timeout'>(resolve => {\n timeoutId = setTimeout(() => resolve('timeout'), timeout);\n });\n\n let result: Awaited<typeof promise> | 'timeout';\n try {\n result = await Promise.race([promise, timeoutPromise]);\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n\n if (result !== 'timeout') {\n return result;\n }\n\n const decision = this.onTimeout ? await this.onTimeout(ctx) : 'continue';\n if (decision === 'cancel') {\n throw new Error(`Route \"${pattern}\" import timed out after ${timeout}ms`);\n }\n\n return promise;\n }\n\n #preloadNext(): void {\n if (!this.#hasBrowser()) return;\n while (this.#loadingCount < this.maxPreload && this.#idleSet.size > 0) {\n const path = this.#idleSet.values().next().value;\n if (!path) return;\n this.#idleSet.delete(path);\n this.#loadingCount++;\n const task: PreloadTask = { path, scheduledAt: Date.now(), fromIdleQueue: true };\n const scheduler =\n typeof requestIdleCallback !== 'undefined'\n ? requestIdleCallback\n : (fn: () => void) => setTimeout(fn, 0);\n scheduler(() => {\n this.#loadComponent(task.path, true).catch(error => {\n const route = this.routes[task.path];\n if (route) route.status = 'error';\n console.error(error);\n });\n });\n }\n }\n\n async #applyScrollIntent(ctx: NavigationContext, intent: ScrollIntent): Promise<void> {\n const retry = { ...intent.retry };\n\n while (true) {\n if (!this.#transaction.isTokenValid(ctx)) return;\n\n if (intent.type === 'hash') {\n const el = this.#queryHashElement(intent.hash);\n if (el) {\n el.scrollIntoView({ behavior: intent.behavior ?? 'smooth' });\n return;\n }\n } else if (intent.type === 'restore') {\n const target = this.#getScrollTarget();\n if (target) {\n this.#setScroll(target.root, intent.top, intent.left);\n return;\n }\n } else {\n const target = this.#getScrollTarget();\n if (target) {\n this.#setScroll(target.root, 0, 0);\n return;\n }\n }\n\n if (retry.attempts >= retry.maxAttempts) return;\n retry.attempts++;\n await this.#createFallbackWaiter('raf').promise;\n }\n }\n\n #createPostEffectWaiter(): RenderWaiter {\n if (!this.#hasBrowser()) return this.#createFallbackWaiter('resolved');\n\n let dispose: (() => void) | undefined;\n const promise = new Promise<void>(resolve => {\n const watcher = effect(\n () => {\n resolve();\n queueMicrotask(() => dispose?.());\n },\n [() => this.active],\n { type: 'post', immediate: false }\n );\n dispose = () => watcher.dispose();\n });\n\n return {\n promise: promise.finally(() => dispose?.()),\n source: 'post-effect',\n dispose: () => dispose?.(),\n };\n }\n\n #createFallbackWaiter(wait: ScrollRetryPolicy['wait'] | 'resolved'): RenderWaiter {\n if (wait === 'raf' && typeof requestAnimationFrame !== 'undefined') {\n return {\n promise: new Promise(resolve => requestAnimationFrame(() => resolve())),\n source: 'raf',\n };\n }\n return { promise: Promise.resolve(), source: 'resolved' };\n }\n\n #createScrollIntentFromUrl(url: string, snapshot?: ScrollSnapshot, renderDependent = true): ScrollIntent {\n const parsed = this.#parseUrl(url);\n const retry = this.#createRetry(renderDependent ? 'post-effect' : 'raf');\n if (parsed.hash) {\n return { type: 'hash', hash: parsed.hash, retry, behavior: 'smooth' };\n }\n if (snapshot) {\n return { type: 'restore', top: snapshot.top, left: snapshot.left, retry };\n }\n return { type: 'top', retry };\n }\n\n #createRestoreScrollIntent(snapshot: ScrollSnapshot): ScrollIntent {\n return {\n type: 'restore',\n top: snapshot.top,\n left: snapshot.left,\n retry: this.#createRetry('post-effect'),\n };\n }\n\n #createRetry(wait: ScrollRetryPolicy['wait']): ScrollRetryPolicy {\n return { attempts: 0, maxAttempts: 8, wait };\n }\n\n #saveScroll(index: number): void {\n const entry = this.#stack[index];\n if (!entry || !this.#hasBrowser()) return;\n entry.scroll = this.#getScrollSnapshot();\n }\n\n #getScrollSnapshot(): ScrollSnapshot {\n const target = this.#getScrollTarget();\n if (!target) return { top: 0, left: 0 };\n if (target.root === window) {\n return { top: window.scrollY, left: window.scrollX };\n }\n return {\n top: (target.root as HTMLElement).scrollTop,\n left: (target.root as HTMLElement).scrollLeft,\n };\n }\n\n #getScrollTarget() {\n if (!this.#hasBrowser()) return null;\n if (this.scrollRootId) {\n const el = document.getElementById(this.scrollRootId);\n if (el) return { root: el, scrollRootId: this.scrollRootId };\n }\n return { root: window, scrollRootId: this.scrollRootId };\n }\n\n #setScroll(root: HTMLElement | Window, top: number, left: number): void {\n if (root === window) {\n window.scrollTo(left, top);\n return;\n }\n const el = root as HTMLElement;\n el.scrollTop = top;\n el.scrollLeft = left;\n }\n\n #queryHashElement(hash: string): HTMLElement | null {\n if (typeof document === 'undefined' || !hash) return null;\n try {\n return document.querySelector(decodeURIComponent(hash));\n } catch {\n return null;\n }\n }\n\n #allowExternalHistoryDelta(ctx: NavigationContext): void {\n const delta = ctx.historyDelta?.delta;\n if (!this.#hasBrowser() || typeof delta !== 'number') return;\n history.go(delta);\n }\n\n #rollbackBrowserHistoryIfNeeded(ctx: NavigationContext): void {\n const delta = ctx.historyDelta?.delta;\n if (ctx.request?.source !== 'popstate') return;\n if (!this.#hasBrowser() || typeof delta !== 'number') return;\n history.go(-delta);\n }\n\n #isValidPendingHistoryDelta(state: RouterHistoryState, url: string): boolean {\n const pending = this.#pendingHistoryDelta;\n if (!pending || pending.consumed) return false;\n if (!this.#transaction.isTokenIdCurrent(pending.tokenId)) return false;\n if (state.historyKey !== this.historyKey) return false;\n if (state.index !== pending.toIndex) return false;\n if (state.entryId !== pending.targetEntryId) return false;\n if (this.#normalizeUrl(url) !== this.#normalizeUrl(pending.targetUrl)) return false;\n return true;\n }\n\n #readHistoryState(state: unknown): RouterHistoryState | null {\n if (!state || typeof state !== 'object') return null;\n const value = state as RouterHistoryState;\n if (!value.__bobeRouter || value.historyKey !== this.historyKey) return null;\n if (typeof value.entryId !== 'string' || typeof value.index !== 'number') return null;\n return value;\n }\n\n #createHistoryState(entry: RouteEntry, index: number): RouterHistoryState {\n return {\n __bobeRouter: true,\n historyKey: this.historyKey,\n entryId: entry.id,\n index,\n url: entry.url,\n };\n }\n\n #createRouteEntry(routeMatch: RouteMatch, id = this.#createEntryId()): RouteEntry {\n return {\n id,\n path: routeMatch.url,\n url: this.#buildUrl(routeMatch.url, routeMatch.search, routeMatch.hash),\n hash: routeMatch.hash,\n params: routeMatch.params,\n component: routeMatch.record.component,\n meta: routeMatch.record.meta,\n layout: routeMatch.record.layout as RouteEntry['layout'],\n };\n }\n\n #syncRouteRecordToEntry(entry: RouteEntry, pattern: string): void {\n const route = this.routes[pattern];\n if (!route) return;\n entry.component = route.component;\n entry.meta = route.meta;\n entry.layout = route.layout as RouteEntry['layout'];\n }\n\n #matchUrl(url: string): RouteMatch | null {\n const result = match(url, this.routes);\n if (!result) return null;\n const parsed = this.#parseUrl(url);\n const record = this.routes[result.path];\n if (!record) return null;\n return {\n pattern: result.path,\n path: result.path,\n url: result.url,\n search: parsed.search,\n hash: parsed.hash,\n params: result.params,\n record,\n };\n }\n\n #parseUrl(url: string): URL {\n const base = this.#hasBrowser() ? location.origin : 'http://localhost';\n return new URL(url, base);\n }\n\n #buildUrl(path: string, search = '', hash = ''): string {\n return `${path}${search}${hash}`;\n }\n\n #normalizePath(path: string): string {\n const result = match(path, this.routes);\n return result?.url || path;\n }\n\n #normalizeUrl(url: string): string {\n const parsed = this.#parseUrl(url);\n return this.#buildUrl(this.#normalizePath(parsed.pathname), parsed.search, parsed.hash);\n }\n\n #isSameRouteBase(left: string, right: string): boolean {\n const a = this.#parseUrl(left);\n const b = this.#parseUrl(right);\n return this.#normalizePath(a.pathname) === this.#normalizePath(b.pathname) && a.search === b.search;\n }\n\n #toUrlString(url: Pick<URL, 'pathname' | 'search' | 'hash'>): string {\n return `${url.pathname}${url.search}${url.hash}`;\n }\n\n #isHashOnlyForActive(url: string): boolean {\n if (!this.active) return false;\n return this.#isSameRouteBase(url, this.active.url);\n }\n\n #createEntryId(): string {\n this.#entryId++;\n return `${this.historyKey}:${this.#entryId}`;\n }\n\n #initIdleSet(): void {\n for (const path of Object.keys(this.routes)) {\n if (this.routes[path].status === 'idle') {\n this.#idleSet.add(path);\n }\n }\n }\n\n #hasBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined' && typeof history !== 'undefined';\n }\n}\n"],"names":["GlobalKey","compilePattern","pattern","paramNames","regexStr","replace","_","name","push","regex","RegExp","params","compiledCache","cacheKey","compileRoutes","map","Object","keys","filter","k","_compilePattern","match","path","parsed","URL","normalized","pathname","length","endsWith","slice","compiled","m","i","url","NavigationTransactionRunner","createToken","request","token","id","cancelled","isTokenValid","ctx","isTokenIdCurrent","tokenId","cancelCurrent","run","router","handlers","status","rollbackStack","queue","handler","shift","result","error","type","unshift","stop","prepend","#rollback","DEFAULT_HISTORY_KEY","createRouteRecord","opts","import","component","meta","layout","Router","Store","StoreIgnoreKeys","active","routes","menus","maxPreload","historyKey","Set","constructor","opt","globalThis","Routes","Menus","enterGuard","leaveGuard","onError","loadTimeout","onTimeout","scrollRootId","history","state","initialUrl","initialPath","Path","location","search","hash","ready","cb","Promise","resolve","pushState","source","historyMode","runGuards","restoreScroll","replaceState","back","forward","go","delta","#init","existingState","to","entryId","index","#goByDelta","currentRequest","historyDelta","from","#runNavigation","#notifyNavigationError","console","notifyError","#replaceHandlers","#hashOnlyScrollHandlers","undefined","scrollIntent","commitPlan","historyAction","stackAction","#handleCreateUrlContext","routeMatch","target","targetEntry","scroll","#handleBuildRouteEntryFromHistoryState","entry","targetState","nextIndex","guard","decision","#handleSaveCurrentScroll","#handleBuildCommitPlan","getNextStackIndex","nextStackIndex","historyState","#handleBuildPopstateMoveCommitPlan","hasMemoryEntry","action","previousState","previousUrl","previousStack","previousStackIndex","previousActive","previousEntry","toIndex","fromIndex","targetEntryId","targetUrl","consumed","needsActiveRender","renderWaiter","retry","wait","dispose","waiter","promise","#handleStartIdlePreload","#initBrowser","scrollRestoration","document","addEventListener","window","event","Element","link","closest","href","getAttribute","origin","hasAttribute","ctrlKey","metaKey","shiftKey","altKey","nextUrl","startsWith","preventDefault","catch","#handlePopstate","#runGuardsOnce","#toGuardDecision","redirect","ok","#loadComponent","counted","route","Error","delete","then","mod","record","default","routeMeta","finally","#loadComponentWithTimeout","timeout","timeoutId","timeoutPromise","setTimeout","race","clearTimeout","#preloadNext","size","values","next","value","task","scheduler","requestIdleCallback","fn","#applyScrollIntent","intent","el","scrollIntoView","behavior","root","top","left","attempts","maxAttempts","#createPostEffectWaiter","watcher","effect","queueMicrotask","immediate","#createFallbackWaiter","requestAnimationFrame","#createScrollIntentFromUrl","snapshot","renderDependent","#createRestoreScrollIntent","#createRetry","#saveScroll","#getScrollSnapshot","scrollY","scrollX","scrollTop","scrollLeft","#getScrollTarget","getElementById","#setScroll","scrollTo","#queryHashElement","querySelector","decodeURIComponent","#allowExternalHistoryDelta","#rollbackBrowserHistoryIfNeeded","#isValidPendingHistoryDelta","pending","#readHistoryState","__bobeRouter","#createHistoryState","#createRouteEntry","#syncRouteRecordToEntry","#matchUrl","#parseUrl","base","#buildUrl","#normalizePath","#normalizeUrl","#isSameRouteBase","right","a","b","#toUrlString","#isHashOnlyForActive","#createEntryId","#initIdleSet","add","#hasBrowser"],"mappings":"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"}
@@ -131,6 +131,21 @@ function hasDefaultExport(filePath) {
131
131
  return false;
132
132
  }
133
133
  }
134
+ function hasLayoutExport(filePath) {
135
+ try {
136
+ const ext = filePath.split('.').pop()?.toLowerCase();
137
+ if (ext === 'md' || ext === 'mdx') {
138
+ const content = fs.readFileSync(filePath, 'utf-8');
139
+ const _matter3 = matter(content),
140
+ data = _matter3.data;
141
+ return !!data.layout;
142
+ }
143
+ const content = fs.readFileSync(filePath, 'utf-8');
144
+ return /export\s+(?:const\s+layout\b|\{[^}]*\blayout\b[^}]*\})/.test(content);
145
+ } catch {
146
+ return false;
147
+ }
148
+ }
134
149
  function parseEntry(name, fileRe) {
135
150
  const dirMatch = name.match(RE_DIR);
136
151
  const isDir = !name.includes('.');
@@ -169,7 +184,7 @@ function sortEntries(entries, fileRe) {
169
184
  return a.name.localeCompare(b.name);
170
185
  });
171
186
  }
172
- function scanDir(absDir, basePath = absDir, parentPath = '', menuRef, extensions = DEFAULT_EXTENSIONS) {
187
+ function scanDir(absDir, basePath = absDir, parentPath = '', parentMenu, extensions = DEFAULT_EXTENSIONS, nearestRef = {}) {
173
188
  const routes = [];
174
189
  const menus = [];
175
190
  let entries;
@@ -191,15 +206,20 @@ function scanDir(absDir, basePath = absDir, parentPath = '', menuRef, extensions
191
206
  if (!parsed) continue;
192
207
  const pathPart = parsed.pathPart,
193
208
  menuName = parsed.menuName;
209
+ const handledName = menuName || pathPart;
194
210
  if (ent.isDirectory()) {
195
211
  const urlPath = buildUrl(parentPath, pathPart);
196
212
  const menu = {
197
213
  name: menuName || pathPart,
198
214
  hasComponent: false,
215
+ path: urlPath,
199
216
  children: []
200
217
  };
201
- const child = scanDir(full, basePath, urlPath, menu, extensions);
218
+ const child = scanDir(full, basePath, urlPath, menu, extensions, nearestRef);
202
219
  routes.push(...child.routes);
220
+ if (menu.nearestFile && parentMenu && !parentMenu.nearestFile) {
221
+ parentMenu.nearestFile = menu.nearestFile;
222
+ }
203
223
  menu.children = child.menus;
204
224
  menus.push(menu);
205
225
  } else if (ent.isFile()) {
@@ -210,6 +230,7 @@ function scanDir(absDir, basePath = absDir, parentPath = '', menuRef, extensions
210
230
  const metaRaw = metaResult?.raw;
211
231
  const meta = metaResult?.value && Object.keys(metaResult.value).length > 0 ? metaResult.value : undefined;
212
232
  const hasComp = hasDefaultExport(full);
233
+ const hasLayout = hasLayoutExport(full);
213
234
  if (isIndex) {
214
235
  const url = parentPath || '/';
215
236
  if (hasComp) {
@@ -217,23 +238,32 @@ function scanDir(absDir, basePath = absDir, parentPath = '', menuRef, extensions
217
238
  url,
218
239
  file: relFile,
219
240
  menuName,
220
- metaRaw
241
+ metaRaw,
242
+ hasLayout
221
243
  });
222
244
  }
223
- if (menuRef) {
224
- if (menuName) menuRef.name = menuName;
245
+ if (parentMenu) {
246
+ if (menuName) parentMenu.name = menuName;
225
247
  if (hasComp) {
226
- menuRef.path = url;
227
- menuRef.hasComponent = true;
248
+ parentMenu.path = url;
249
+ parentMenu.hasComponent = true;
250
+ parentMenu.nearestFile = {
251
+ name: handledName,
252
+ path: url
253
+ };
228
254
  }
229
- if (meta) menuRef.meta = meta;
255
+ if (meta) parentMenu.meta = meta;
230
256
  } else if (menuName) {
231
257
  menus.push({
232
258
  name: menuName,
233
259
  path: hasComp ? '/' : undefined,
234
260
  hasComponent: hasComp,
235
261
  children: [],
236
- meta
262
+ meta,
263
+ nearestFile: hasComp ? {
264
+ name: menuName,
265
+ path: '/'
266
+ } : undefined
237
267
  });
238
268
  }
239
269
  } else {
@@ -242,15 +272,26 @@ function scanDir(absDir, basePath = absDir, parentPath = '', menuRef, extensions
242
272
  url: urlPath,
243
273
  file: relFile,
244
274
  menuName,
245
- metaRaw
275
+ metaRaw,
276
+ hasLayout
246
277
  });
278
+ if (parentMenu && !parentMenu.nearestFile) {
279
+ parentMenu.nearestFile = {
280
+ name: handledName,
281
+ path: urlPath
282
+ };
283
+ }
247
284
  }
248
285
  if (menuName || meta) {
249
286
  menus.push({
250
287
  name: menuName || pathPart,
251
288
  path: hasComp ? urlPath : undefined,
252
289
  hasComponent: hasComp,
253
- meta
290
+ meta,
291
+ nearestFile: hasComp ? {
292
+ name: handledName,
293
+ path: urlPath
294
+ } : undefined
254
295
  });
255
296
  }
256
297
  }
@@ -289,10 +330,12 @@ function generateSsgInit(items) {
289
330
  const names = items.map((_, i) => `__module_${i}.default`);
290
331
  const entries = items.map(({
291
332
  url,
292
- metaRaw
333
+ metaRaw,
334
+ hasLayout
293
335
  }, i) => {
294
336
  const metaPart = metaRaw ? `, meta: ${metaRaw}` : '';
295
- return ` '${url}': { component: __module_${i}.default, layout: __module_${i}.layout${metaPart} }`;
337
+ const layoutPart = hasLayout ? `, layout: __module_${i}.layout` : '';
338
+ return ` '${url}': { component: __module_${i}.default${layoutPart}${metaPart} }`;
296
339
  });
297
340
  return imports.join('\n') + `\n\nglobalThis['${Routes}'] = {\n` + entries.join(',\n') + '\n};' + `\nexport const __bobe_routes = [${names.join(', ')}];`;
298
341
  }
@@ -300,40 +343,117 @@ function generateCsrMenus(menus) {
300
343
  return `globalThis['${Menus}'] = ${JSON.stringify(menus)};`;
301
344
  }
302
345
 
346
+ function injectImport(code, source) {
347
+ if (code.includes(`'${source}'`) || code.includes(`"${source}"`)) return code;
348
+ return `import '${source}';\n` + code;
349
+ }
350
+ function normalizeEntryId(id, root) {
351
+ const cleanId = id.split('?')[0].replace(/\\/g, '/');
352
+ const cleanRoot = root.replace(/\\/g, '/');
353
+ if (cleanId.startsWith(cleanRoot + '/')) {
354
+ return cleanId.slice(cleanRoot.length + 1);
355
+ }
356
+ return cleanId.replace(/^\/+/, '');
357
+ }
358
+ function normalizeConfigEntry(entry, root) {
359
+ const cleanEntry = entry.split('?')[0].replace(/\\/g, '/');
360
+ const absEntry = path.isAbsolute(cleanEntry) ? cleanEntry : path.resolve(root, cleanEntry);
361
+ return normalizeEntryId(absEntry, root);
362
+ }
363
+ function normalizeUrlEntry(url, root) {
364
+ const cleanUrl = url.split('?')[0].replace(/\\/g, '/').replace(/^\/+/, '');
365
+ return normalizeEntryId(path.resolve(root, cleanUrl), root);
366
+ }
367
+ function collectInputEntries(input, root) {
368
+ const values = typeof input === 'string' ? [input] : Array.isArray(input) ? input : input && typeof input === 'object' ? Object.values(input) : [];
369
+ return values.filter(entry => typeof entry === 'string' && !entry.split('?')[0].endsWith('.html')).map(entry => normalizeConfigEntry(entry, root));
370
+ }
303
371
  function bobeRouter(opt = {}) {
304
372
  const dir = opt.dir || 'pages';
305
373
  const extensions = opt.extensions || ['js', 'jsx', 'ts', 'tsx'];
374
+ const csrRoutesId = 'bobe-router/csr-routes';
375
+ const ssgRoutesId = 'bobe-router/ssg-routes';
376
+ const resolvedCsrRoutesId = '\0' + csrRoutesId;
377
+ const resolvedSsgRoutesId = '\0' + ssgRoutesId;
306
378
  let root;
379
+ let isSsrBuild = false;
380
+ let csrEntryIds = new Set();
381
+ let ssgEntryIds = new Set();
307
382
  return [{
308
383
  name: 'bobe-router',
309
384
  enforce: 'pre',
310
385
  configResolved(config) {
311
386
  root = config.root;
387
+ isSsrBuild = Boolean(config.build.ssr);
388
+ csrEntryIds = new Set();
389
+ ssgEntryIds = new Set();
390
+ if (typeof config.build.ssr === 'string') {
391
+ ssgEntryIds.add(normalizeConfigEntry(config.build.ssr, root));
392
+ } else if (config.build.ssr) {
393
+ ssgEntryIds = new Set(collectInputEntries(config.build.rollupOptions.input, root));
394
+ } else {
395
+ const libEntry = config.build.lib && typeof config.build.lib === 'object' ? config.build.lib.entry : undefined;
396
+ csrEntryIds = new Set(collectInputEntries((config.build.rolldownOptions ?? config.build.rollupOptions).input || libEntry, root));
397
+ }
398
+ },
399
+ configureServer(server) {
400
+ const ssrLoadModule = server.ssrLoadModule.bind(server);
401
+ server.ssrLoadModule = (url, opts) => {
402
+ ssgEntryIds.add(normalizeUrlEntry(url, root));
403
+ return ssrLoadModule(url, opts);
404
+ };
312
405
  },
313
406
  resolveId(id) {
314
- if (id === 'bobe-router/csr-routes') return '\0bobe-router/csr-routes';
407
+ if (id === csrRoutesId) return {
408
+ id: resolvedCsrRoutesId,
409
+ moduleSideEffects: true
410
+ };
411
+ if (id === ssgRoutesId) return {
412
+ id: resolvedSsgRoutesId,
413
+ moduleSideEffects: true
414
+ };
315
415
  },
316
416
  load(id) {
317
- if (id === '\0bobe-router/csr-routes') {
417
+ if (id === resolvedCsrRoutesId) {
318
418
  const absDir = path.resolve(root, dir);
319
419
  const _scanDir = scanDir(absDir, root, '', undefined, extensions),
320
420
  routes = _scanDir.routes,
321
421
  menus = _scanDir.menus;
322
422
  return generateCsrInit(routes) + (menus.length ? '\n' + generateCsrMenus(menus) : '');
323
423
  }
324
- },
325
- transform(code, id) {
326
- if (id.includes('entry-server.ts')) {
424
+ if (id === resolvedSsgRoutesId) {
327
425
  const absDir = path.resolve(root, dir);
328
426
  const _scanDir2 = scanDir(absDir, root, '', undefined, extensions),
329
427
  routes = _scanDir2.routes,
330
428
  menus = _scanDir2.menus;
331
- const ssg = generateSsgInit(routes) + (menus.length ? '\n' + generateCsrMenus(menus) : '');
332
- return ssg + '\n' + code;
429
+ return generateSsgInit(routes) + (menus.length ? '\n' + generateCsrMenus(menus) : '');
430
+ }
431
+ },
432
+ transform(code, id) {
433
+ const entryId = normalizeEntryId(id, root);
434
+ if (ssgEntryIds.has(entryId)) {
435
+ return injectImport(code, ssgRoutesId);
436
+ }
437
+ if (!isSsrBuild && csrEntryIds.has(entryId)) {
438
+ return injectImport(code, csrRoutesId);
439
+ }
440
+ },
441
+ transformIndexHtml: {
442
+ order: 'pre',
443
+ handler(html) {
444
+ if (isSsrBuild || html.includes(csrRoutesId)) return;
445
+ return [{
446
+ tag: 'script',
447
+ attrs: {
448
+ type: 'module'
449
+ },
450
+ children: `import '${csrRoutesId}';`,
451
+ injectTo: 'head-prepend'
452
+ }];
333
453
  }
334
454
  }
335
455
  }];
336
456
  }
337
457
 
338
458
  module.exports = bobeRouter;
339
- //# sourceMappingURL=plugin.cjs.js.map
459
+ //# sourceMappingURL=plugin.cjs.map