@vobs/resource 1.2.1 → 1.3.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../reactivity/src/debug.ts","../../reactivity/src/owner.ts","../../reactivity/src/signal.ts","../../reactivity/src/scheduler.ts","../../reactivity/src/effect.ts","../src/resource.ts","../../runtime/src/debug.ts","../../runtime/src/hmr.ts","../../runtime/src/ops.ts","../../runtime/src/fragment.ts","../../runtime/src/dynamic.ts","../../runtime/src/error.ts","../../runtime/src/boundary.ts","../../vobs/src/app.ts","../src/boundary.ts","../../router/src/index.ts","../src/plugin.ts"],"names":["effect","handled","keyId","request","dispose","entries"],"mappings":"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","file":"index.js","sourcesContent":["import type { Effect } from './effect'\nimport type { Owner } from './owner'\nimport type { Dependency, ReadableSignal, Subscriber } from './signal'\n\nexport interface ReactivityDebugHooks {\n ownerCreated?(owner: Owner): void\n ownerNamed?(owner: Owner, name: string): void\n ownerDisposed?(owner: Owner): void\n signalCreated?(signal: ReadableSignal<unknown>, owner: Owner | null): void\n signalNamed?(signal: ReadableSignal<unknown>, name: string): void\n signalRead?(signal: ReadableSignal<unknown>, subscriber: Subscriber): void\n signalChanged?(signal: ReadableSignal<unknown>, previousValue: unknown, nextValue: unknown): void\n signalDisposed?(signal: ReadableSignal<unknown>): void\n dependencyTracked?(dependency: Dependency, subscriber: Subscriber): void\n dependencyUntracked?(dependency: Dependency, subscriber: Subscriber): void\n effectCreated?(effect: Effect, owner: Owner | null): void\n effectInvalidated?(effect: Effect): void\n effectRunStart?(effect: Effect): void\n effectRunEnd?(effect: Effect, error?: unknown, handled?: boolean): void\n effectDisposed?(effect: Effect): void\n memoCreated?(signal: ReadableSignal<unknown>, subscriber: Subscriber, owner: Owner | null): void\n memoInvalidated?(signal: ReadableSignal<unknown>): void\n flushStart?(): void\n flushEnd?(): void\n}\n\nlet activeDebugHooks: ReactivityDebugHooks | null = null\nconst signalNames = new WeakMap<object, string>()\n\nexport function setDebugHooks(hooks: ReactivityDebugHooks | null): ReactivityDebugHooks | null {\n const previous = activeDebugHooks\n activeDebugHooks = hooks\n return previous\n}\n\nexport function getDebugHooks(): ReactivityDebugHooks | null {\n return activeDebugHooks\n}\n\n/** 热路径守卫:无 hooks 时跳过 invokeDebug 调用,避免 rest 参数数组分配。 */\nexport function hasDebugHooks(): boolean {\n return activeDebugHooks !== null\n}\n\nexport function setSignalDebugName(signal: ReadableSignal<unknown>, name: string): void {\n signalNames.set(signal, name)\n invokeDebug('signalNamed', signal, name)\n}\n\nexport function getSignalDebugName(signal: ReadableSignal<unknown>): string | undefined {\n return signalNames.get(signal)\n}\n\nexport function invokeDebug<K extends keyof ReactivityDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<ReactivityDebugHooks[K]>>\n): void {\n const callback = activeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change application behavior.\n }\n}\n","import { invokeDebug, hasDebugHooks } from './debug'\n\nexport interface Owner {\n readonly id: string\n readonly parent: Owner | null\n readonly children: readonly Owner[]\n readonly depth: number\n readonly disposed: boolean\n run<T>(fn: () => T): T\n addCleanup(cleanup: () => void): void\n onDispose(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n handleError(error: unknown): boolean\n dispose(): void\n}\n\nlet currentOwner: Owner | null = null\nlet nextOwnerId = 1\nconst ownerNames = new WeakMap<Owner, string>()\n\nexport function createOwner(): Owner {\n const parent = currentOwner\n let disposed = parent?.disposed ?? false\n const children: Owner[] = []\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n\n const owner: Owner = {\n id: `owner-${nextOwnerId++}`,\n parent,\n children,\n depth: (parent?.depth ?? -1) + 1,\n\n get disposed(): boolean {\n return disposed\n },\n\n run<T>(fn: () => T): T {\n if (disposed) throw new Error('Vobs: 已销毁的 Owner 不能继续运行')\n const previous = currentOwner\n currentOwner = owner\n try {\n return fn()\n } finally {\n currentOwner = previous\n }\n },\n\n addCleanup(cleanup: () => void): void {\n if (disposed) {\n cleanup()\n return\n }\n cleanups.push(cleanup)\n },\n\n onDispose(cleanup: () => void): void {\n owner.addCleanup(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n owner.addCleanup(remove)\n return remove\n },\n\n handleError(error: unknown): boolean {\n for (const handler of [...errorHandlers].reverse()) {\n try {\n handler(error)\n return true\n } catch (handlerError) {\n return parent?.handleError(handlerError) ?? false\n }\n }\n return parent?.handleError(error) ?? false\n },\n\n dispose(): void {\n if (disposed) return\n disposed = true\n for (const child of [...children]) child.dispose()\n children.length = 0\n\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n if (parent) {\n const index = parent.children.indexOf(owner)\n if (index >= 0) (parent.children as Owner[]).splice(index, 1)\n }\n if (hasDebugHooks()) invokeDebug('ownerDisposed', owner)\n if (firstError) throw firstError\n }\n }\n\n if (parent && !parent.disposed) (parent.children as Owner[]).push(owner)\n if (hasDebugHooks()) invokeDebug('ownerCreated', owner)\n return owner\n}\n\nexport function setOwnerDebugName(owner: Owner, name: string): void {\n ownerNames.set(owner, name)\n if (hasDebugHooks()) invokeDebug('ownerNamed', owner, name)\n}\n\nexport function getOwnerDebugName(owner: Owner): string | undefined {\n return ownerNames.get(owner)\n}\n\nexport function getCurrentOwner(): Owner | null {\n return currentOwner\n}\n\n/** Re-enter an Owner for an explicitly captured asynchronous continuation. */\nexport function runWithOwner<T>(owner: Owner, fn: () => T): T {\n return owner.run(fn)\n}\n\nexport function onDispose(cleanup: () => void): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: onDispose 必须在 Owner 作用域内调用')\n owner.onDispose(cleanup)\n}\n","import { getCurrentOwner } from './owner'\nimport { invokeDebug, hasDebugHooks, setSignalDebugName } from './debug'\n\nexport interface Dependency {\n unsubscribe(subscriber: Subscriber): void\n}\n\nexport interface Subscriber {\n readonly dependencies: Set<Dependency>\n readonly disposed: boolean\n notify(): void\n}\n\n/** 只读信号:派生值(memo)与只读上下文的最小契约,只能订阅与读取。 */\nexport interface ReadableSignal<T> extends Dependency {\n readonly value: T\n dispose(): void\n}\n\n/** 可写信号:state() 的返回类型。`set` 与 `.value =` 赋值语义完全一致。 */\nexport interface Signal<T> extends ReadableSignal<T> {\n value: T\n set(next: T): void\n}\n\nlet currentSubscriber: Subscriber | null = null\n\nexport function getCurrentSubscriber(): Subscriber | null {\n return currentSubscriber\n}\n\nexport function setCurrentSubscriber(subscriber: Subscriber | null): void {\n currentSubscriber = subscriber\n}\n\nexport function untrack<T>(fn: () => T): T {\n const previous = currentSubscriber\n currentSubscriber = null\n try {\n return fn()\n } finally {\n currentSubscriber = previous\n }\n}\n\nexport function trackDependency(dependency: Dependency): void {\n if (!currentSubscriber || currentSubscriber.disposed) return\n const added = !currentSubscriber.dependencies.has(dependency)\n currentSubscriber.dependencies.add(dependency)\n if (added && hasDebugHooks()) invokeDebug('dependencyTracked', dependency, currentSubscriber)\n}\n\n/**\n * Create a reactive state signal.\n *\n * State uses identity (`Object.is`) change detection. Objects and arrays are\n * intentionally shallow: mutating a nested property in place does not notify\n * subscribers; assign a new object/array to `value` to publish the change.\n *\n * The optional debug name is metadata for inspection tools only. It does not\n * affect subscriptions, scheduling, serialization, or the signal contract.\n */\nexport function state<T>(initialValue: T, debugName?: string): Signal<T> {\n let value = initialValue\n let disposed = false\n const subscribers = new Set<Subscriber>()\n\n const signalInstance: Signal<T> = {\n get value(): T {\n const subscriber = getCurrentSubscriber()\n if (subscriber && !subscriber.disposed) {\n subscribers.add(subscriber)\n if (hasDebugHooks()) invokeDebug('signalRead', signalInstance as Signal<unknown>, subscriber)\n trackDependency(signalInstance)\n }\n return value\n },\n\n set value(nextValue: T) {\n if (disposed || Object.is(value, nextValue)) return\n const previousValue = value\n value = nextValue\n if (hasDebugHooks()) invokeDebug('signalChanged', signalInstance as Signal<unknown>, previousValue, nextValue)\n for (const subscriber of [...subscribers]) subscriber.notify()\n },\n\n unsubscribe(subscriber: Subscriber): void {\n subscribers.delete(subscriber)\n },\n\n // 与 `.value =` 赋值同一条路径:判等短路、debug hook、notify 全部一致。\n // 以闭包实现,可安全地作为回调直接传递(无 this 绑定问题)。\n set(next: T): void {\n signalInstance.value = next\n },\n\n dispose(): void {\n if (disposed) return\n disposed = true\n subscribers.clear()\n if (hasDebugHooks()) invokeDebug('signalDisposed', signalInstance as Signal<unknown>)\n }\n }\n\n const owner = getCurrentOwner()\n owner?.addCleanup(signalInstance.dispose)\n if (hasDebugHooks()) invokeDebug('signalCreated', signalInstance as Signal<unknown>, owner)\n if (debugName?.trim()) setSignalDebugName(signalInstance as Signal<unknown>, debugName.trim())\n return signalInstance\n}\n","import type { Effect } from './effect'\nimport { hasDebugHooks, invokeDebug } from './debug'\n\nexport class Scheduler {\n private readonly dirtyEffects = new Set<Effect>()\n private readonly lowPriorityEffects = new Set<Effect>()\n // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。\n private readonly normalBuffer: Effect[] = []\n private readonly lowBuffer: Effect[] = []\n private flushing = false\n private scheduled = false\n private batchDepth = 0\n\n schedule(effect: Effect): void {\n if (effect.disposed) return\n this.dirtyEffects.add(effect)\n this.lowPriorityEffects.delete(effect)\n this.ensureScheduled()\n }\n\n /** Queue an effect behind normal updates while preserving deterministic order. */\n scheduleLow(effect: Effect): void {\n if (effect.disposed) return\n if (!this.dirtyEffects.has(effect)) this.lowPriorityEffects.add(effect)\n this.ensureScheduled()\n }\n\n private ensureScheduled(): void {\n if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {\n this.scheduled = true\n queueMicrotask(() => {\n this.scheduled = false\n this.flush()\n })\n }\n }\n\n remove(effect: Effect): void {\n this.dirtyEffects.delete(effect)\n this.lowPriorityEffects.delete(effect)\n }\n\n batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) this.flush()\n }\n }\n\n flush(): void {\n if (this.flushing || this.batchDepth > 0) return\n this.flushing = true\n const debugEnabled = hasDebugHooks()\n if (debugEnabled) invokeDebug('flushStart')\n let rounds = 0\n let firstError: unknown\n let hasError = false\n try {\n while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {\n if (++rounds > 100) {\n this.dirtyEffects.clear()\n this.lowPriorityEffects.clear()\n throw new Error('Vobs: 响应式更新超过 100 轮,可能存在循环依赖')\n }\n\n // normal 先、low 后,两组分别排序:与旧的合并排序语义一致\n // (旧比较器里 low 优先级本就高于 depth),但消除了比较器内的 Set 查找。\n this.collectRunnable(this.dirtyEffects, this.normalBuffer)\n this.collectRunnable(this.lowPriorityEffects, this.lowBuffer)\n sortEffects(this.normalBuffer)\n sortEffects(this.lowBuffer)\n for (const effect of this.normalBuffer) {\n try {\n effect.run()\n } catch (error) {\n // Isolate one failed effect from the rest of the flush. Re-throw\n // the first error after all runnable effects have had a chance.\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n for (const effect of this.lowBuffer) {\n try {\n effect.run()\n } catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n }\n } finally {\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n this.flushing = false\n if (debugEnabled) invokeDebug('flushEnd')\n }\n if (hasError) throw firstError\n }\n\n /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */\n private collectRunnable(source: Set<Effect>, target: Effect[]): void {\n for (const effect of source) {\n if (!effect.disposed) target.push(effect)\n }\n source.clear()\n }\n}\n\n/** depth 深的先跑(子 effect 先于父),同深度按创建顺序。 */\nfunction sortEffects(effects: Effect[]): void {\n if (effects.length > 1) {\n effects.sort((a, b) => b.depth - a.depth || a.order - b.order)\n }\n}\n\nexport const scheduler = new Scheduler()\n\nexport function batch<T>(fn: () => T): T {\n return scheduler.batch(fn)\n}\n\n/** Schedule a low-priority effect explicitly. */\nexport function scheduleLow(effect: Effect): void {\n effect.scheduleLow()\n}\n","import { getCurrentOwner } from './owner'\nimport { invokeDebug, hasDebugHooks } from './debug'\nimport {\n getCurrentSubscriber,\n setCurrentSubscriber,\n type Dependency,\n type Subscriber\n} from './signal'\nimport { scheduler } from './scheduler'\n\nexport interface Effect extends Subscriber {\n readonly order: number\n readonly depth: number\n run(): void\n scheduleLow(): void\n dispose(): void\n}\n\nexport type EffectCleanup = () => void\nexport type EffectCallback = () => void | EffectCleanup\n\nlet nextEffectOrder = 1\n\nexport function cleanupDependencies(subscriber: Subscriber): void {\n for (const dependency of subscriber.dependencies) {\n dependency.unsubscribe(subscriber)\n if (hasDebugHooks()) invokeDebug('dependencyUntracked', dependency, subscriber)\n }\n subscriber.dependencies.clear()\n}\n\nexport function effect(callback: EffectCallback): Effect {\n const owner = getCurrentOwner()\n let cleanup: EffectCleanup | undefined\n let dirty = true\n let disposed = false\n\n const eff: Effect = {\n order: nextEffectOrder++,\n depth: owner?.depth ?? 0,\n dependencies: new Set<Dependency>(),\n\n get disposed(): boolean {\n return disposed\n },\n\n notify(): void {\n if (disposed || dirty) return\n dirty = true\n if (hasDebugHooks()) invokeDebug('effectInvalidated', eff)\n scheduler.schedule(eff)\n },\n\n run(): void {\n if (disposed || !dirty) return\n dirty = false\n const previousCleanup = cleanup\n cleanup = undefined\n let cleanupError: unknown\n if (previousCleanup) {\n try {\n previousCleanup()\n } catch (error) {\n const handled = owner?.handleError(error) ?? false\n if (!handled) cleanupError = error\n }\n }\n cleanupDependencies(eff)\n\n const previous = getCurrentSubscriber()\n setCurrentSubscriber(eff)\n let thrown: unknown\n let handled = false\n if (hasDebugHooks()) invokeDebug('effectRunStart', eff)\n try {\n const result = owner ? owner.run(callback) : callback()\n cleanup = typeof result === 'function' ? result : undefined\n } catch (error) {\n thrown = error\n handled = owner?.handleError(error) ?? false\n if (!handled) throw error\n } finally {\n setCurrentSubscriber(previous)\n if (hasDebugHooks()) invokeDebug('effectRunEnd', eff, thrown, handled)\n }\n if (cleanupError && !thrown) throw cleanupError\n },\n\n scheduleLow(): void {\n if (disposed || dirty) return\n dirty = true\n scheduler.scheduleLow(eff)\n },\n\n dispose(): void {\n if (disposed) return\n disposed = true\n dirty = false\n scheduler.remove(eff)\n const previousCleanup = cleanup\n cleanup = undefined\n let cleanupError: unknown\n if (previousCleanup) {\n try {\n previousCleanup()\n } catch (error) {\n const handled = owner?.handleError(error) ?? false\n if (!handled) cleanupError = error\n }\n }\n cleanupDependencies(eff)\n if (hasDebugHooks()) invokeDebug('effectDisposed', eff)\n if (cleanupError) throw cleanupError\n }\n }\n\n owner?.addCleanup(eff.dispose)\n if (hasDebugHooks()) invokeDebug('effectCreated', eff, owner)\n eff.run()\n return eff\n}\n\nexport const renderEffect = effect\n","import { createOwner, effect, getCurrentOwner, state, type Signal } from '@vobs/reactivity'\n\nexport type ResourceKey = readonly unknown[]\nexport type ResourceKeySource = ResourceKey | Signal<ResourceKey> | (() => ResourceKey)\nexport type ResourceFetcher<T> = (signal: AbortSignal) => T | PromiseLike<T>\nexport type ResourceCacheStrategy = 'cache-first' | 'stale-while-revalidate'\n\nexport interface Resource<T> {\n readonly key: ResourceKey | undefined\n readonly data: Signal<T | null>\n readonly error: Signal<Error | null>\n readonly loading: Signal<boolean>\n dispose(): void\n refetch(): Promise<T>\n prefetch(): Promise<T>\n invalidate(): void\n mutate(next: T | ((current: T | null) => T)): void\n optimistic<Result>(\n next: T | ((current: T | null) => T),\n action: () => Result | PromiseLike<Result>\n ): Promise<Result>\n}\n\nexport interface ResourceOptions<T> {\n key?: ResourceKeySource\n fetcher: ResourceFetcher<T>\n staleTime?: number\n cache?: boolean\n strategy?: ResourceCacheStrategy\n retry?: number\n retryDelay?: RetryDelay\n}\n\nexport type RetryDelay = number | ((attempt: number, error: Error) => number)\n\nexport interface ResourceSnapshot<T> {\n readonly data: T | null\n readonly error: Error | null\n readonly loading: boolean\n readonly updatedAt: number\n}\n\nexport interface ResourceDehydratedEntry {\n readonly key: ResourceKey\n readonly data: unknown\n readonly updatedAt: number\n readonly staleTime: number\n}\n\nexport interface ResourceDehydratedState {\n readonly version: 1\n readonly entries: readonly ResourceDehydratedEntry[]\n}\n\nexport interface ResourceClientOptions {\n staleTime?: number\n retry?: number\n retryDelay?: RetryDelay\n onError?: (error: Error, key: ResourceKey | undefined) => void\n}\n\nexport interface ResourceClient {\n resource<T>(fetcher: ResourceFetcher<T>): Resource<T>\n resource<T>(options: ResourceOptions<T>): Resource<T>\n invalidate(key: ResourceKey): void\n prefetchAll(): Promise<void>\n dehydrate(): ResourceDehydratedState\n hydrate(snapshot: unknown): void\n get<T>(key: ResourceKey): ResourceSnapshot<T> | undefined\n clear(): void\n}\n\ninterface ResourceEntry<T> {\n readonly key: ResourceKey | undefined\n readonly data: Signal<T | null>\n readonly error: Signal<Error | null>\n readonly loading: Signal<boolean>\n readonly staleTime: number\n readonly subscribers: Set<object>\n updatedAt: number\n revision: number\n inFlight: Promise<T> | null\n controller: AbortController | null\n}\n\nconst defaultClient = createResourceClient()\n\nexport function resource<T>(fetcher: ResourceFetcher<T>): Resource<T>\nexport function resource<T>(options: ResourceOptions<T>): Resource<T>\nexport function resource<T>(\n optionsOrFetcher: ResourceOptions<T> | ResourceFetcher<T>\n): Resource<T> {\n return typeof optionsOrFetcher === 'function'\n ? defaultClient.resource(optionsOrFetcher)\n : defaultClient.resource(optionsOrFetcher)\n}\n\nexport function createResourceClient(options: ResourceClientOptions = {}): ResourceClient {\n let owner = createOwner()\n const cache = new Map<string, ResourceEntry<unknown>>()\n const entries = new Set<ResourceEntry<unknown>>()\n const defaultStaleTime = validateStaleTime(options.staleTime ?? 0)\n const defaultRetry = validateRetry(options.retry ?? 0)\n const defaultRetryDelay = options.retryDelay ?? 0\n\n function createEntry<T>(key: ResourceKey | undefined, staleTime: number): ResourceEntry<T> {\n const entry: ResourceEntry<T> = owner.run(() => ({\n key,\n data: state<T | null>(null),\n error: state<Error | null>(null),\n loading: state(false),\n staleTime,\n subscribers: new Set(),\n updatedAt: 0,\n revision: 0,\n inFlight: null,\n controller: null\n }))\n owner.onDispose(() => entry.controller?.abort())\n entries.add(entry as ResourceEntry<unknown>)\n return entry\n }\n\n function execute<T>(\n entry: ResourceEntry<T>,\n fetcher: ResourceFetcher<T>,\n retry: number,\n retryDelay: RetryDelay\n ): Promise<T> {\n if (entry.inFlight) return entry.inFlight\n\n entry.loading.value = true\n entry.error.value = null\n const controller = new AbortController()\n entry.controller = controller\n const revision = entry.revision\n const request = requestWithRetry(fetcher, controller.signal, retry, retryDelay)\n entry.inFlight = request.then(\n data => {\n // 请求飞行期间 mutate/optimistic 已推进 revision 时,迟到的旧结果不得覆盖新数据。\n if (entry.revision === revision) {\n entry.revision++\n entry.data.value = data\n entry.error.value = null\n entry.updatedAt = Date.now()\n }\n return data\n },\n reason => {\n const error = toError(reason)\n if (entry.revision === revision) {\n entry.error.value = error\n if (!controller.signal.aborted) options.onError?.(error, entry.key)\n }\n throw error\n }\n ).finally(() => {\n entry.loading.value = false\n if (entry.controller === controller) entry.controller = null\n entry.inFlight = null\n })\n return entry.inFlight\n }\n\n function isFresh(entry: ResourceEntry<unknown>): boolean {\n return entry.updatedAt > 0 && Date.now() - entry.updatedAt <= entry.staleTime\n }\n\n function createResource<T>(\n optionsOrFetcher: ResourceOptions<T> | ResourceFetcher<T>\n ): Resource<T> {\n const config = normalizeOptions(optionsOrFetcher, defaultStaleTime, defaultRetry, defaultRetryDelay)\n if (isReactiveKey(config.key)) return createReactiveResource(config)\n const staticKey = resolveKey(config.key)\n const keyId = config.cache && staticKey ? stableSerialize(staticKey) : undefined\n let entry = keyId ? cache.get(keyId) as ResourceEntry<T> | undefined : undefined\n if (!entry) {\n entry = createEntry(staticKey, config.staleTime)\n if (keyId) cache.set(keyId, entry as ResourceEntry<unknown>)\n }\n\n const request = (force: boolean): Promise<T> => {\n if (entry.inFlight) return entry.inFlight\n if (!force && config.strategy === 'stale-while-revalidate' && entry.data.value !== null) {\n if (!isFresh(entry)) void execute(entry, config.fetcher, config.retry, config.retryDelay).catch(() => undefined)\n return Promise.resolve(entry.data.value as T)\n }\n if (!force && isFresh(entry as ResourceEntry<unknown>)) return Promise.resolve(entry.data.value as T)\n return execute(entry, config.fetcher, config.retry, config.retryDelay)\n }\n\n // Initial failures are represented by error and must not become unhandled rejections.\n void request(false).catch(() => undefined)\n\n const resourceHandle = {}\n entry.subscribers.add(resourceHandle)\n const dispose = (): void => {\n if (!entry?.subscribers.delete(resourceHandle)) return\n if (entry.subscribers.size === 0) entry.controller?.abort()\n }\n getCurrentOwner()?.onDispose(dispose)\n\n return {\n key: staticKey,\n data: entry.data,\n error: entry.error,\n loading: entry.loading,\n dispose,\n refetch: () => request(true),\n prefetch: () => request(false),\n invalidate: () => { entry.updatedAt = 0 },\n mutate(next) {\n const value = typeof next === 'function'\n ? (next as (current: T | null) => T)(entry.data.value)\n : next\n entry.revision++\n entry.data.value = value\n entry.error.value = null\n entry.updatedAt = Date.now()\n },\n optimistic<Result>(\n next: T | ((current: T | null) => T),\n action: () => Result | PromiseLike<Result>\n ): Promise<Result> {\n const previous = {\n data: entry.data.value,\n error: entry.error.value,\n updatedAt: entry.updatedAt\n }\n const value = typeof next === 'function'\n ? (next as (current: T | null) => T)(entry.data.value)\n : next\n const revision = ++entry.revision\n entry.data.value = value\n entry.error.value = null\n entry.updatedAt = Date.now()\n\n let actionResult: Promise<Result>\n try {\n actionResult = Promise.resolve(action())\n } catch (reason) {\n actionResult = Promise.reject(reason)\n }\n return actionResult.catch(reason => {\n const error = toError(reason)\n if (entry.revision === revision) {\n entry.revision++\n entry.data.value = previous.data\n entry.error.value = error\n entry.updatedAt = previous.updatedAt\n options.onError?.(error, entry.key)\n }\n throw error\n })\n }\n }\n\n function createReactiveResource(\n reactiveConfig: ReturnType<typeof normalizeOptions<T>>\n ): Resource<T> {\n const data = state<T | null>(null)\n const error = state<Error | null>(null)\n const loading = state(false)\n const handle = {}\n let activeEntry: ResourceEntry<T> | undefined\n let activeKey: ResourceKey | undefined\n let disposed = false\n\n const sync = (): void => {\n if (!activeEntry) return\n data.value = activeEntry.data.value\n error.value = activeEntry.error.value\n loading.value = activeEntry.loading.value\n }\n\n const switchKey = (nextKey: ResourceKey): void => {\n const keyId = reactiveConfig.cache ? stableSerialize(nextKey) : undefined\n let nextEntry = keyId ? cache.get(keyId) as ResourceEntry<T> | undefined : undefined\n if (!nextEntry) {\n nextEntry = createEntry(nextKey, reactiveConfig.staleTime)\n if (keyId) cache.set(keyId, nextEntry as ResourceEntry<unknown>)\n }\n if (activeEntry === nextEntry) {\n sync()\n return\n }\n if (activeEntry) {\n activeEntry.subscribers.delete(handle)\n if (activeEntry.subscribers.size === 0) activeEntry.controller?.abort()\n }\n activeEntry = nextEntry\n activeKey = nextKey\n activeEntry.subscribers.add(handle)\n sync()\n void request(false).catch(() => undefined)\n }\n\n const stop = effect(() => {\n if (disposed) return\n const nextKey = resolveKey(reactiveConfig.key)\n if (!nextKey) throw new Error('resource: 响应式 key 不能是 undefined')\n switchKey(nextKey)\n sync()\n })\n\n const dispose = (): void => {\n if (disposed) return\n disposed = true\n stop.dispose()\n if (activeEntry) {\n activeEntry.subscribers.delete(handle)\n if (activeEntry.subscribers.size === 0) activeEntry.controller?.abort()\n }\n activeEntry = undefined\n }\n getCurrentOwner()?.onDispose(dispose)\n\n return {\n get key(): ResourceKey | undefined { return activeKey },\n data,\n error,\n loading,\n dispose,\n refetch: () => request(true),\n prefetch: () => request(false),\n invalidate: () => { if (activeEntry) activeEntry.updatedAt = 0 },\n mutate(next) {\n if (!activeEntry) return\n const value = typeof next === 'function'\n ? (next as (current: T | null) => T)(activeEntry.data.value)\n : next\n activeEntry.revision++\n activeEntry.data.value = value\n activeEntry.error.value = null\n activeEntry.updatedAt = Date.now()\n },\n optimistic<Result>(\n next: T | ((current: T | null) => T),\n action: () => Result | PromiseLike<Result>\n ): Promise<Result> {\n if (!activeEntry) return Promise.reject(new Error('resource: key 尚未初始化'))\n return createOptimistic<Result>(activeEntry, next, action)\n }\n }\n\n function request(force: boolean): Promise<T> {\n if (!activeEntry) return Promise.reject(new Error('resource: key 尚未初始化'))\n if (!force && isFresh(activeEntry) && reactiveConfig.strategy === 'cache-first') {\n return Promise.resolve(activeEntry.data.value as T)\n }\n if (!force && reactiveConfig.strategy === 'stale-while-revalidate'\n && activeEntry.data.value !== null) {\n if (!isFresh(activeEntry)) void execute(activeEntry, reactiveConfig.fetcher, reactiveConfig.retry, reactiveConfig.retryDelay)\n .catch(() => undefined)\n return Promise.resolve(activeEntry.data.value as T)\n }\n return execute(activeEntry, reactiveConfig.fetcher, reactiveConfig.retry, reactiveConfig.retryDelay)\n }\n }\n\n function createOptimistic<Result>(\n target: ResourceEntry<T>,\n next: T | ((current: T | null) => T),\n action: () => Result | PromiseLike<Result>\n ): Promise<Result> {\n const previous = { data: target.data.value, error: target.error.value, updatedAt: target.updatedAt }\n const value = typeof next === 'function'\n ? (next as (current: T | null) => T)(target.data.value)\n : next\n const revision = ++target.revision\n target.data.value = value\n target.error.value = null\n target.updatedAt = Date.now()\n return Promise.resolve().then(action).catch(reason => {\n const failure = toError(reason)\n if (target.revision === revision) {\n target.revision++\n target.data.value = previous.data\n target.error.value = failure\n target.updatedAt = previous.updatedAt\n options.onError?.(failure, target.key)\n }\n throw failure\n })\n }\n }\n\n return {\n resource: createResource,\n invalidate(key) {\n const entry = cache.get(stableSerialize(key))\n if (entry) entry.updatedAt = 0\n },\n async prefetchAll() {\n const requests = [...entries]\n .map(entry => entry.inFlight)\n .filter((request): request is Promise<unknown> => request !== null)\n await Promise.allSettled(requests)\n },\n dehydrate() {\n const entries: ResourceDehydratedEntry[] = []\n for (const entry of cache.values()) {\n if (entry.updatedAt <= 0 || entry.error.value) continue\n entries.push({\n key: entry.key ?? [],\n data: entry.data.value,\n updatedAt: entry.updatedAt,\n staleTime: entry.staleTime\n })\n }\n return { version: 1, entries }\n },\n hydrate(snapshot) {\n for (const restored of parseDehydratedState(snapshot).entries) {\n const keyId = stableSerialize(restored.key)\n const entry = cache.get(keyId) as ResourceEntry<unknown> | undefined\n ?? createEntry(restored.key, restored.staleTime)\n entry.data.value = restored.data\n entry.error.value = null\n entry.loading.value = false\n entry.updatedAt = restored.updatedAt\n entry.revision++\n cache.set(keyId, entry)\n }\n },\n get<T>(key: ResourceKey): ResourceSnapshot<T> | undefined {\n const entry = cache.get(stableSerialize(key)) as ResourceEntry<T> | undefined\n if (!entry) return undefined\n return {\n data: entry.data.value,\n error: entry.error.value,\n loading: entry.loading.value,\n updatedAt: entry.updatedAt\n }\n },\n clear() {\n cache.clear()\n entries.clear()\n owner.dispose()\n owner = createOwner()\n }\n }\n}\n\nfunction normalizeOptions<T>(\n optionsOrFetcher: ResourceOptions<T> | ResourceFetcher<T>,\n defaultStaleTime: number,\n defaultRetry: number,\n defaultRetryDelay: RetryDelay\n): Required<Pick<ResourceOptions<T>, 'fetcher' | 'staleTime' | 'cache' | 'strategy' | 'retry' | 'retryDelay'>> & Pick<ResourceOptions<T>, 'key'> {\n if (typeof optionsOrFetcher === 'function') {\n return {\n fetcher: optionsOrFetcher,\n staleTime: defaultStaleTime,\n cache: false,\n strategy: 'cache-first',\n retry: defaultRetry,\n retryDelay: defaultRetryDelay\n }\n }\n return {\n key: optionsOrFetcher.key,\n fetcher: optionsOrFetcher.fetcher,\n staleTime: validateStaleTime(optionsOrFetcher.staleTime ?? defaultStaleTime),\n cache: optionsOrFetcher.cache ?? Boolean(optionsOrFetcher.key),\n strategy: optionsOrFetcher.strategy ?? 'cache-first',\n retry: validateRetry(optionsOrFetcher.retry ?? defaultRetry),\n retryDelay: optionsOrFetcher.retryDelay ?? defaultRetryDelay\n }\n}\n\nfunction isReactiveKey(key: ResourceKeySource | undefined): key is Signal<ResourceKey> | (() => ResourceKey) {\n return typeof key === 'function' || isSignal(key)\n}\n\nfunction isSignal(value: unknown): value is Signal<ResourceKey> {\n return value !== null && typeof value === 'object' && 'value' in value\n && typeof (value as { dispose?: unknown }).dispose === 'function'\n}\n\nfunction resolveKey(source: ResourceKeySource | undefined): ResourceKey | undefined {\n const key = typeof source === 'function'\n ? source()\n : isSignal(source) ? source.value : source\n if (key === undefined) return undefined\n if (!Array.isArray(key)) throw new Error('resource: key 必须是数组')\n return key\n}\n\nfunction requestWithRetry<T>(\n fetcher: ResourceFetcher<T>,\n signal: AbortSignal,\n retry: number,\n retryDelay: RetryDelay\n): Promise<T> {\n let attempt = 0\n const request = (): Promise<T> => Promise.resolve().then(() => fetcher(signal)).catch(reason => {\n const error = toError(reason)\n if (signal.aborted) throw error\n if (attempt++ >= retry) throw error\n const delay = resolveRetryDelay(retryDelay, attempt, error)\n return delay > 0 ? wait(delay).then(request) : request()\n })\n return request()\n}\n\nfunction resolveRetryDelay(retryDelay: RetryDelay, attempt: number, error: Error): number {\n const delay = typeof retryDelay === 'function' ? retryDelay(attempt, error) : retryDelay\n if (!Number.isFinite(delay) || delay < 0) {\n throw new Error('resource: retryDelay 必须是大于等于 0 的有限数字')\n }\n return delay\n}\n\nfunction wait(delay: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, delay))\n}\n\nfunction validateStaleTime(staleTime: number): number {\n if (!Number.isFinite(staleTime) || staleTime < 0) {\n throw new Error('resource: staleTime 必须是大于等于 0 的有限数字')\n }\n return staleTime\n}\n\nfunction validateRetry(retry: number): number {\n if (!Number.isInteger(retry) || retry < 0) {\n throw new Error('resource: retry 必须是大于等于 0 的整数')\n }\n return retry\n}\n\nfunction toError(reason: unknown): Error {\n return reason instanceof Error ? reason : new Error(String(reason))\n}\n\nexport function stableSerialize(value: unknown): string {\n return serialize(value, new Set<object>())\n}\n\nexport function serializeResourceState(snapshot: ResourceDehydratedState): string {\n const serialized = JSON.stringify(snapshot)\n return serialized\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n}\n\nfunction parseDehydratedState(snapshot: unknown): ResourceDehydratedState {\n let value: unknown = snapshot\n if (typeof snapshot === 'string') {\n try {\n value = JSON.parse(snapshot)\n } catch {\n throw new Error('resource: 预取状态不是有效 JSON')\n }\n }\n if (!value || typeof value !== 'object') throw new Error('resource: 预取状态格式无效')\n const candidate = value as { version?: unknown; entries?: unknown }\n if (candidate.version !== 1 || !Array.isArray(candidate.entries)) {\n throw new Error('resource: 预取状态版本或 entries 无效')\n }\n\n const entries: ResourceDehydratedEntry[] = []\n for (const entry of candidate.entries) {\n if (!entry || typeof entry !== 'object') throw new Error('resource: 预取条目格式无效')\n const candidateEntry = entry as Partial<ResourceDehydratedEntry>\n if (!Array.isArray(candidateEntry.key)\n || typeof candidateEntry.updatedAt !== 'number'\n || !Number.isFinite(candidateEntry.updatedAt)\n || typeof candidateEntry.staleTime !== 'number'\n || !Number.isFinite(candidateEntry.staleTime)\n || candidateEntry.staleTime < 0) {\n throw new Error('resource: 预取条目字段无效')\n }\n // Re-serialize now so untrusted keys cannot poison the cache map.\n stableSerialize(candidateEntry.key)\n entries.push({\n key: candidateEntry.key,\n data: candidateEntry.data,\n updatedAt: candidateEntry.updatedAt,\n staleTime: candidateEntry.staleTime\n })\n }\n return { version: 1, entries }\n}\n\nfunction serialize(value: unknown, stack: Set<object>): string {\n if (value === null) return 'null'\n switch (typeof value) {\n case 'string': return `string:${JSON.stringify(value)}`\n case 'boolean': return `boolean:${value}`\n case 'number':\n if (Number.isNaN(value)) return 'number:NaN'\n if (Object.is(value, -0)) return 'number:-0'\n return `number:${value}`\n case 'bigint': return `bigint:${value}`\n case 'undefined': return 'undefined'\n case 'function':\n case 'symbol':\n throw new Error(`resource: key 不能包含 ${typeof value}`)\n case 'object': break\n }\n\n const object = value as object\n if (stack.has(object)) throw new Error('resource: key 不能包含循环引用')\n stack.add(object)\n try {\n if (Array.isArray(object)) {\n return `array:[${object.map(item => serialize(item, stack)).join(',')}]`\n }\n if (object instanceof Date) return `date:${object.toJSON()}`\n if (object instanceof RegExp) return `regexp:${object.toString()}`\n const entries = Object.keys(object).sort().map(key => `${JSON.stringify(key)}:${serialize((object as Record<string, unknown>)[key], stack)}`)\n return `object:{${entries.join(',')}}`\n } finally {\n stack.delete(object)\n }\n}\n","import type { Owner } from '@vobs/reactivity'\n\nexport type RuntimeDebugEnvironment = 'client' | 'server'\n\n/**\n * Lightweight context copied onto debug events created synchronously inside a\n * Router loader, Effect or SSR render. It is intentionally optional so the\n * runtime remains useful without DevTools.\n */\nexport interface RuntimeDebugContext {\n readonly environment?: RuntimeDebugEnvironment\n readonly sessionId?: string\n readonly route?: string\n readonly navigationId?: number\n readonly dataRequestId?: number\n readonly updateId?: string\n readonly effectId?: string\n readonly source?: string\n}\n\nexport interface RuntimeHydrationMismatch {\n readonly kind: 'missing-node' | 'extra-node' | 'position' | 'content'\n readonly expected: string\n readonly actual: string\n readonly path: string\n readonly message: string\n}\n\nexport type RuntimeDomMutationOperation = 'text' | 'property' | 'attribute' | 'insert' | 'remove'\n\nexport interface RuntimeDomMutation {\n readonly operation: RuntimeDomMutationOperation\n readonly target: string\n readonly parent?: string\n readonly key?: string\n readonly previousValue?: unknown\n readonly nextValue?: unknown\n}\n\nexport interface RuntimeErrorEvent {\n readonly error: unknown\n readonly owner: Owner\n readonly phase: 'event' | 'boundary'\n readonly handled: boolean\n readonly recovery: 'propagated' | 'handled' | 'fallback' | 'retrying' | 'recovered'\n}\n\nexport interface RuntimeDebugHooks {\n domMutation?(mutation: RuntimeDomMutation): void\n error?(event: RuntimeErrorEvent): void\n hydrationMismatch?(event: RuntimeHydrationMismatch): void\n}\n\nlet activeRuntimeDebugHooks: RuntimeDebugHooks | null = null\nlet activeRuntimeDebugContext: RuntimeDebugContext | null = null\n\nexport function setRuntimeDebugHooks(hooks: RuntimeDebugHooks | null): RuntimeDebugHooks | null {\n const previous = activeRuntimeDebugHooks\n activeRuntimeDebugHooks = hooks\n return previous\n}\n\nexport function getRuntimeDebugHooks(): RuntimeDebugHooks | null {\n return activeRuntimeDebugHooks\n}\n\nexport function getRuntimeDebugContext(): RuntimeDebugContext | null {\n return activeRuntimeDebugContext\n}\n\n/** Run a synchronous operation with trace context, preserving async renders. */\nexport function runWithRuntimeDebugContext<T>(context: RuntimeDebugContext, task: () => T): T {\n const previous = activeRuntimeDebugContext\n const next = { ...previous, ...context }\n activeRuntimeDebugContext = next\n let result: T\n try {\n result = task()\n } catch (error) {\n activeRuntimeDebugContext = previous\n throw error\n }\n if (isPromiseLike(result)) {\n return Promise.resolve(result).finally(() => {\n if (activeRuntimeDebugContext === next) activeRuntimeDebugContext = previous\n }) as T\n }\n activeRuntimeDebugContext = previous\n return result\n}\n\n/** Keep a context active across callback boundaries such as Effect execution. */\nexport function pushRuntimeDebugContext(context: RuntimeDebugContext): () => void {\n const previous = activeRuntimeDebugContext\n activeRuntimeDebugContext = { ...previous, ...context }\n let restored = false\n return () => {\n if (restored) return\n restored = true\n activeRuntimeDebugContext = previous\n }\n}\n\nexport function invokeRuntimeDebug<K extends keyof RuntimeDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<RuntimeDebugHooks[K]>>\n): void {\n const callback = activeRuntimeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change runtime behavior.\n }\n}\n\nexport function readDebugValue(read: () => unknown): unknown {\n try {\n return read()\n } catch {\n return '[Uninspectable]'\n }\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return Boolean(value) && (typeof value === 'object' || typeof value === 'function')\n && typeof (value as { then?: unknown }).then === 'function'\n}\n\nexport function describeDebugNode(node: unknown): string {\n if (!node || typeof node !== 'object') return 'node'\n const value = node as {\n readonly nodeName?: unknown\n readonly tagName?: unknown\n readonly id?: unknown\n readonly className?: unknown\n }\n const name = typeof value.tagName === 'string'\n ? value.tagName.toLowerCase()\n : typeof value.nodeName === 'string' ? value.nodeName.toLowerCase() : 'node'\n const id = typeof value.id === 'string' && value.id ? `#${value.id}` : ''\n const className = typeof value.className === 'string' && value.className\n ? `.${value.className.trim().split(/\\s+/).filter(Boolean).join('.')}`\n : ''\n return `${name}${id}${className}`\n}\n","import type { VobsNode } from './fragment'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void {\n const modules = [...hmrGlobal.modules.values()]\n for (const module of modules) {\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) continue\n for (const instance of module.instances) {\n try {\n instance.refresh()\n } catch {\n // HMR failures remain application errors on the next normal render.\n }\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n","// 编译产物调用的基础操作\n\nimport { createOwner, getCurrentOwner, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { isVobsFragment, type VobsNode } from './fragment'\nimport { describeDebugNode, getRuntimeDebugHooks, invokeRuntimeDebug, readDebugValue } from './debug'\nimport {\n associateHmrInstance,\n markHmrInstanceMounted,\n registerHmrInstance,\n type HmrInstance\n} from './hmr'\nimport type { VobsRenderer } from './renderer'\nimport { setRef } from './ref'\n\ntype RuntimeRenderer = VobsRenderer<Node, Text, Element, Comment>\n\nlet currentRenderer: RuntimeRenderer | null = null\nconst nodeOwners = new WeakMap<object, Owner>()\ninterface EventBinding {\n readonly handler: EventListener\n readonly owner: Owner | null\n readonly original: EventListener\n}\nconst eventBindings = new WeakMap<object, Map<string, EventBinding>>()\n\nexport function setRenderer<\n NodeType,\n TextNode extends NodeType,\n ElementNode extends NodeType,\n CommentNode extends NodeType\n>(renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>): void {\n // 编译产物仍使用 DOM 节点声明;实际宿主类型由应用提供的渲染器决定。\n currentRenderer = renderer as unknown as RuntimeRenderer\n}\n\nexport function getRenderer(): RuntimeRenderer {\n if (!currentRenderer) {\n throw new Error('渲染器未初始化')\n }\n return currentRenderer\n}\n\nexport function createText(content: string): Text {\n return getRenderer().createText(content)\n}\n\nexport function createElement(tag: string): Element {\n return getRenderer().createElement(tag)\n}\n\nexport function createComment(content: string): Comment {\n return getRenderer().createComment(content)\n}\n\nexport function insertBefore(\n parent: Node,\n child: VobsNode,\n anchor: VobsNode | null\n): void {\n if (isVobsFragment(child)) {\n child.mount(parent, isVobsFragment(anchor) ? anchor.start : anchor)\n return\n }\n getRenderer().insertBefore(parent, child, isVobsFragment(anchor) ? anchor.start : anchor)\n markHmrInstanceMounted(child, parent)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'insert',\n target: describeDebugNode(child),\n parent: describeDebugNode(parent)\n })\n }\n}\n\nexport function removeChild(\n parent: Node,\n child: VobsNode\n): void {\n disposeNodeOwner(child)\n if (isVobsFragment(child)) {\n child.unmount(parent)\n return\n }\n getRenderer().removeChild(parent, child)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'remove',\n target: describeDebugNode(child),\n parent: describeDebugNode(parent)\n })\n }\n}\n\nexport function setTextContent(\n node: Text,\n content: string\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => node.textContent)\n : undefined\n getRenderer().setTextContent(node, content)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'text',\n target: describeDebugNode(node),\n previousValue,\n nextValue: content\n })\n }\n}\n\nexport function setProperty(\n node: Element,\n key: string,\n value: unknown\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => Reflect.get(node, key))\n : undefined\n getRenderer().setProperty(node, key, value)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'property',\n target: describeDebugNode(node),\n key,\n previousValue,\n nextValue: value\n })\n }\n}\n\nexport function setAttribute(\n node: Element,\n key: string,\n value: string\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => typeof node.getAttribute === 'function' ? node.getAttribute(key) : undefined)\n : undefined\n getRenderer().setAttribute(node, key, value)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'attribute',\n target: describeDebugNode(node),\n key,\n previousValue,\n nextValue: value\n })\n }\n}\n\nexport function spreadProps(node: Element, props: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'key' || value === null || value === undefined) continue\n if (key === 'ref') {\n setRef(node, value)\n continue\n }\n if (key.startsWith('on') && typeof value === 'function') addEventListener(node, key.slice(2).toLowerCase(), value as EventListener)\n // property 键的 false 有语义(如 disabled={false} 必须清除),不能跳过;\n // attribute 键的 false 表示“不设置”,与 HTML 语义一致。\n else if (isPropertyKey(key)) setProperty(node, key, value)\n else if (value === false) continue\n else setAttribute(node, key === 'className' ? 'class' : key, key === 'style' && isStyleObject(value) ? formatStyle(value) : String(value))\n }\n}\n\n/** Apply compile-time host properties in one renderer pass. */\nexport function setStaticProps(node: Element, props: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'key' || key === 'ref' || key.startsWith('on')) continue\n if (value === null || value === undefined) continue\n if (isPropertyKey(key)) setProperty(node, key, value)\n else if (value === false) continue\n else setAttribute(node, key === 'className' ? 'class' : key, key === 'style' && isStyleObject(value) ? formatStyle(value) : String(value))\n }\n}\n\nfunction isPropertyKey(key: string): boolean {\n return key === 'value' || key === 'checked' || key === 'selected' || key === 'disabled'\n || key === 'multiple' || key === 'readOnly' || key === 'required'\n || key === 'autofocus' || key === 'hidden' || key === 'tabIndex'\n}\n\nfunction isStyleObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction formatStyle(value: Record<string, unknown>): string {\n return Object.entries(value).filter(([, entry]) => entry !== null && entry !== undefined && entry !== false)\n .map(([key, entry]) => `${key.replace(/[A-Z]/gu, match => `-${match.toLowerCase()}`)}:${String(entry)}`).join(';')\n}\n\nexport function addEventListener(\n node: Element,\n event: string,\n handler: EventListener\n): void {\n const renderer = getRenderer()\n const owner = getCurrentOwner()\n let bindings = eventBindings.get(node)\n if (!bindings) {\n bindings = new Map()\n eventBindings.set(node, bindings)\n }\n const previous = bindings.get(event)\n if (previous && previous.original === handler && previous.owner === owner) return\n if (previous) renderer.removeEventListener(node, event, previous.handler)\n const listener = owner ? (reason: Event) => {\n try {\n owner.run(() => handler(reason))\n } catch (error) {\n const handled = owner.handleError(error)\n invokeRuntimeDebug('error', {\n error,\n owner,\n phase: 'event',\n handled,\n recovery: handled ? 'handled' : 'propagated'\n })\n if (!handled) throw error\n }\n } : handler\n const binding: EventBinding = { handler: listener, owner, original: handler }\n bindings.set(event, binding)\n renderer.addEventListener(node, event, listener)\n owner?.onDispose(() => {\n if (bindings?.get(event) !== binding) return\n bindings.delete(event)\n renderer.removeEventListener(node, event, listener)\n })\n}\n\nexport function removeEventListener(\n node: Element,\n event: string,\n handler: EventListener\n): void {\n const renderer = getRenderer()\n const binding = eventBindings.get(node)?.get(event)\n renderer.removeEventListener(node, event, binding?.handler ?? handler)\n eventBindings.get(node)?.delete(event)\n}\n\nexport function clear(container: Node): void {\n getRenderer().clear(container)\n}\n\ntype VobsComponent = (...args: any[]) => VobsNode\n\ntype ComponentProps<Component extends VobsComponent> = Component extends (\n props: infer Props\n) => VobsNode\n ? NonNullable<Props> extends object ? NonNullable<Props> : Record<string, never>\n : Record<string, never>\n\nexport function createComponent<Component extends VobsComponent>(\n component: Component,\n props: ComponentProps<Component>,\n source?: VobsSourceLocation\n): VobsNode {\n const owner = createOwner()\n const componentName = (component as typeof component & { displayName?: string }).displayName\n || component.name\n || 'anonymous'\n setOwnerDebugName(owner, source\n ? `${componentName} (${source.file}:${source.line}:${source.column})`\n : componentName)\n owner.onError(reason => {\n attachSourceLocation(reason, source)\n attachComponentContext(reason, componentName, owner.id)\n throw reason\n })\n let node: VobsNode\n try {\n node = owner.run(() => component(props))\n } catch (error) {\n owner.dispose()\n attachSourceLocation(error, source)\n attachComponentContext(error, componentName, owner.id)\n throw error\n }\n associateNodeOwner(node, owner)\n const hmrKey = (component as typeof component & { hmrKey?: string }).hmrKey\n if (hmrKey) {\n const instance: HmrInstance = {\n node,\n parent: null,\n refresh(): void {\n const previous = instance.node\n const next = owner.run(() => component(props))\n if (instance.parent && !isVobsFragment(previous) && !isVobsFragment(next)) {\n getRenderer().insertBefore(instance.parent, next, previous)\n getRenderer().removeChild(instance.parent, previous)\n }\n nodeOwners.delete(previous as object)\n nodeOwners.set(next as object, owner)\n associateHmrInstance(next, instance)\n instance.node = next\n }\n }\n associateHmrInstance(node, instance)\n const separator = hmrKey.lastIndexOf(':')\n const moduleId = separator < 0 ? hmrKey : hmrKey.slice(0, separator)\n const cleanup = registerHmrInstance(moduleId, instance)\n owner.onDispose(cleanup)\n }\n return node\n}\n\nexport interface VobsSourceLocation {\n readonly file: string\n readonly line: number\n readonly column: number\n}\n\nexport interface VobsLocatedError extends Error {\n readonly vobsSource?: VobsSourceLocation\n readonly vobsComponent?: string\n readonly vobsOwnerId?: string\n}\n\nfunction attachSourceLocation(reason: unknown, source: VobsSourceLocation | undefined): void {\n if (!source || (!reason || (typeof reason !== 'object' && typeof reason !== 'function'))) return\n const error = reason as VobsLocatedError\n if (error.vobsSource) return\n try {\n Object.defineProperty(error, 'vobsSource', {\n configurable: true,\n enumerable: false,\n value: source,\n writable: false\n })\n } catch {\n // Frozen third-party errors still propagate with their original details.\n }\n}\n\nfunction attachComponentContext(reason: unknown, component: string, ownerId: string): void {\n if (!reason || (typeof reason !== 'object' && typeof reason !== 'function')) return\n const error = reason as VobsLocatedError\n try {\n if (!error.vobsComponent) Object.defineProperty(error, 'vobsComponent', { configurable: true, enumerable: false, value: component, writable: false })\n if (!error.vobsOwnerId) Object.defineProperty(error, 'vobsOwnerId', { configurable: true, enumerable: false, value: ownerId, writable: false })\n } catch {\n // Frozen third-party errors still propagate with their original details.\n }\n}\n\nexport function createBlock(factory: () => VobsNode | null | undefined | false): VobsNode | null {\n const owner = createOwner()\n setOwnerDebugName(owner, 'dynamic')\n let node: VobsNode | null | undefined | false\n try {\n node = owner.run(factory)\n } catch (error) {\n owner.dispose()\n throw error\n }\n if (!node) {\n owner.dispose()\n return null\n }\n associateNodeOwner(node, owner)\n return node\n}\n\nexport function associateNodeOwner(node: VobsNode, owner: Owner): void {\n nodeOwners.set(node, owner)\n}\n\nexport function disposeNodeOwner(node: VobsNode): void {\n const owner = nodeOwners.get(node)\n if (!owner) return\n nodeOwners.delete(node)\n owner.dispose()\n}\n","import { getCurrentOwner } from '@vobs/reactivity'\nimport { createComment, getRenderer } from './ops'\n\nexport interface VobsFragment {\n readonly kind: 'vobs-fragment'\n readonly start: Node\n readonly end: Node\n readonly mount: (parent: Node, anchor: Node | null) => void\n readonly unmount: (parent: Node) => void\n}\n\nexport type VobsNode = Node | VobsFragment\nexport type FragmentFactory = (parent: Node, anchor: Node) => void\n\nexport function createFragment(factory: FragmentFactory): VobsFragment {\n const start = createComment('vobs:fragment:start')\n const end = createComment('vobs:fragment:end')\n let parent: Node | null = null\n let initialized = false\n const owner = getCurrentOwner()\n\n const fragment: VobsFragment = {\n kind: 'vobs-fragment',\n start,\n end,\n mount(nextParent, anchor): void {\n if (parent && parent !== nextParent) {\n throw new Error('Vobs Fragment: 不能跨父节点移动 Fragment')\n }\n\n if (initialized) {\n moveRange(nextParent, start, end, anchor)\n return\n }\n\n const renderer = getRenderer()\n renderer.insertBefore(nextParent, start, anchor)\n renderer.insertBefore(nextParent, end, anchor)\n parent = nextParent\n initialized = true\n if (owner) owner.run(() => factory(nextParent, end))\n else factory(nextParent, end)\n },\n unmount(nextParent): void {\n if (!initialized || parent !== nextParent) {\n throw new Error('Vobs Fragment: Fragment 不属于指定父节点')\n }\n const renderer = getRenderer()\n let current = renderer.nextSibling(start)\n while (current && current !== end) {\n const next = renderer.nextSibling(current)\n renderer.removeChild(nextParent, current)\n current = next\n }\n renderer.removeChild(nextParent, start)\n renderer.removeChild(nextParent, end)\n parent = null\n initialized = false\n }\n }\n return fragment\n}\n\nexport function isVobsFragment(value: unknown): value is VobsFragment {\n return Boolean(value) && typeof value === 'object' && (value as VobsFragment).kind === 'vobs-fragment'\n}\n\nfunction moveRange(parent: Node, start: Node, end: Node, anchor: Node | null): void {\n const renderer = getRenderer()\n const nodes: Node[] = [start]\n let current = renderer.nextSibling(start)\n while (current) {\n nodes.push(current)\n if (current === end) break\n current = renderer.nextSibling(current)\n }\n if (nodes[nodes.length - 1] !== end) {\n throw new Error('Vobs Fragment: 找不到结束锚点')\n }\n for (const node of nodes) renderer.insertBefore(parent, node, anchor)\n}\n","import { createOwner, effect, state, type Owner, type Signal } from '@vobs/reactivity'\nimport {\n associateNodeOwner,\n createBlock,\n createComment,\n createText,\n insertBefore,\n removeChild\n} from './ops'\nimport { createFragment, isVobsFragment, type VobsNode } from './fragment'\n\nexport type NodeFactory = () => VobsNode | null | undefined | false\nexport type DynamicChild = VobsNode | string | number | boolean | null | undefined | readonly DynamicChild[]\n\ninterface ListEntry<T> {\n key: unknown\n node: VobsNode\n owner: Owner\n viewOwner: Owner\n item: Signal<T>\n /** 最近一次赋值的原始 item:供比较与刷新使用,避免在列表 effect 内读取 item 信号造成自依赖。 */\n value: T\n index: number\n}\n\nexport function insertDynamic(parent: Node, anchor: Node | null, factory: NodeFactory): void {\n const marker = createComment('vobs:dynamic')\n insertBefore(parent, marker, anchor)\n let current: VobsNode | null = null\n\n effect(() => {\n const next = createBlock(factory)\n if (next === current) return\n\n if (current) removeChild(parent, current)\n current = next\n if (current) insertBefore(parent, current, marker)\n })\n}\n\n/**\n * Inserts any Vobs child value. This is the escape hatch for JSX expressions\n * that return a node, an array of nodes, text, or an empty conditional value.\n */\nexport function insertDynamicValue(\n parent: Node,\n anchor: Node | null,\n factory: () => DynamicChild\n): void {\n const marker = createComment('vobs:value')\n insertBefore(parent, marker, anchor)\n let current: VobsNode | null = null\n let scope: Owner | null = null\n\n effect(() => {\n // 每轮求值使用独立 scope Owner:factory 求值与挂载期间创建的组件 Owner 全部挂在它下面。\n // 数组/节点被替换时整体 dispose 旧 scope,避免被丢弃子树的 effect 继续订阅信号(幽灵更新与内存泄漏)。\n const nextScope = createOwner()\n const next = nextScope.run(() => normalizeDynamicChild(factory()))\n if (next === current) {\n nextScope.dispose()\n return\n }\n if (current) removeChild(parent, current)\n scope?.dispose()\n scope = nextScope\n current = next\n if (current) insertBefore(parent, current, marker)\n })\n}\n\n/** Convert a JSX child value to a host node without creating a wrapper element. */\nexport function normalizeDynamicChild(value: DynamicChild): VobsNode | null {\n if (value === null || value === undefined || typeof value === 'boolean') return null\n if (typeof value === 'string' || typeof value === 'number') return createText(String(value))\n if (isVobsFragment(value) || isHostNode(value)) return value as VobsNode\n if (Array.isArray(value)) {\n const children = value\n if (children.length === 0) return null\n return createFragment((parent, anchor) => {\n for (const child of children) {\n const node = normalizeDynamicChild(child)\n if (node) insertBefore(parent, node, anchor)\n }\n })\n }\n return null\n}\n\nfunction isHostNode(value: unknown): value is Node {\n return Boolean(value && typeof value === 'object'\n && ('nodeType' in value || ((value as { type?: unknown }).type === 'element'\n || (value as { type?: unknown }).type === 'text'\n || (value as { type?: unknown }).type === 'comment')))\n}\n\nexport function insertList<T>(\n parent: Node,\n anchor: Node | null,\n source: () => readonly T[],\n renderItem: (item: T, index: number) => VobsNode,\n keyOf?: (item: T, index: number) => unknown\n): void {\n const marker = createComment('vobs:list')\n insertBefore(parent, marker, anchor)\n let entries: Array<ListEntry<T>> = []\n const tracksIndex = renderItem.length >= 2\n\n effect(() => {\n const items = source()\n\n // key 只计算一次:keyed 判定与调和共用,避免 keyOf 每轮被调用两遍。\n let keys: unknown[] | null = null\n if (keyOf) {\n keys = new Array(items.length)\n let allKeyed = items.length > 0\n for (let index = 0; index < items.length; index++) {\n const key = keyOf(items[index], index)\n if (key == null) {\n allKeyed = false\n break\n }\n keys[index] = key\n }\n if (!allKeyed) keys = null\n }\n\n const nextEntries = keys\n ? reconcileKeyed(items, keys, entries, renderItem)\n : reconcileIndexed(items, entries, renderItem)\n\n // tracksIndex 时 index 参与渲染,位置变化的行必须整体重建,新节点不在 DOM 中,\n // 重排阶段强制插入;否则只同步记录的位置,节点保持原样交给重排阶段移动。\n const refreshed = tracksIndex ? new Set<ListEntry<T>>() : null\n for (let index = 0; index < nextEntries.length; index++) {\n const entry = nextEntries[index]\n if (tracksIndex) {\n if (entry.index !== index) {\n refreshListEntry(parent, entry, index, renderItem)\n refreshed!.add(entry)\n }\n } else {\n entry.index = index\n }\n }\n\n const retained = new Set(nextEntries)\n for (const entry of entries) {\n if (!retained.has(entry)) disposeEntry(parent, entry)\n }\n\n reorderListEntries(parent, marker, entries, nextEntries, refreshed)\n entries = nextEntries\n })\n}\n\n/**\n * 按 nextEntries 顺序整理 DOM,但只移动必须移动的节点。\n */\nfunction reorderListEntries<T>(\n parent: Node,\n marker: Node,\n previous: readonly ListEntry<T>[],\n nextEntries: readonly ListEntry<T>[],\n forceInsert: Set<ListEntry<T>> | null\n): void {\n const count = nextEntries.length\n if (count === 0) return\n\n // 首次挂载(旧列表为空):全部是新节点,倒序直插即可,跳过 Map/LIS 构建。\n if (previous.length === 0) {\n let reference: VobsNode = marker\n for (let index = count - 1; index >= 0; index--) {\n const node = nextEntries[index].node\n insertBefore(parent, node, reference)\n reference = node\n }\n return\n }\n\n const oldIndexOf = new Map<ListEntry<T>, number>()\n for (let index = 0; index < previous.length; index++) oldIndexOf.set(previous[index], index)\n\n // seq[i] = 条目在旧序中的位置;新条目、重建条目与强制插入条目为 -1。\n const seq: number[] = new Array(count)\n for (let index = 0; index < count; index++) {\n const entry = nextEntries[index]\n seq[index] = forceInsert?.has(entry) ? -1 : oldIndexOf.get(entry) ?? -1\n }\n\n const keep = computeKeptByLis(seq)\n\n let reference: VobsNode = marker\n for (let index = count - 1; index >= 0; index--) {\n const node = nextEntries[index].node\n if (keep[index]) {\n reference = node\n continue\n }\n insertBefore(parent, node, reference)\n reference = node\n }\n}\n\n/**\n * 严格递增子序列(LIS)成员标记,O(n log n)。\n * 负值(新节点)不参与 LIS,永远视为需要移动。\n */\nfunction computeKeptByLis(seq: readonly number[]): boolean[] {\n const count = seq.length\n const keep = new Array<boolean>(count).fill(false)\n const tailsIndex: number[] = []\n const tailsValue: number[] = []\n const prev = new Array<number>(count).fill(-1)\n\n for (let i = 0; i < count; i++) {\n const value = seq[i]\n if (value < 0) continue\n let lo = 0\n let hi = tailsValue.length\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (tailsValue[mid] < value) lo = mid + 1\n else hi = mid\n }\n if (lo === tailsValue.length) {\n tailsValue.push(value)\n tailsIndex.push(i)\n } else {\n tailsValue[lo] = value\n tailsIndex[lo] = i\n }\n prev[i] = lo > 0 ? tailsIndex[lo - 1] : -1\n }\n\n let cursor = tailsIndex.length > 0 ? tailsIndex[tailsIndex.length - 1] : -1\n while (cursor >= 0) {\n keep[cursor] = true\n cursor = prev[cursor]\n }\n return keep\n}\n\nfunction reconcileKeyed<T>(\n items: readonly T[],\n keys: readonly unknown[],\n entries: Array<ListEntry<T>>,\n renderItem: (item: T, index: number) => VobsNode\n): Array<ListEntry<T>> {\n const previous = new Map(entries.map(entry => [entry.key, entry]))\n const seen = new Set<unknown>()\n const nextEntries: Array<ListEntry<T>> = []\n\n for (let index = 0; index < items.length; index++) {\n const item = items[index]\n const key = keys[index]\n if (seen.has(key)) {\n console.warn(`Vobs: 检测到重复的列表 key: ${String(key)}`)\n }\n seen.add(key)\n const entry = previous.get(key)\n if (entry) {\n previous.delete(key)\n if (isPrimitiveItem(item) && !Object.is(entry.value, item)) {\n // 原始类型项在编译产物中被静态捕获,无法通过 item 信号刷新视图:值变化时必须重建行。\n nextEntries.push(createListEntry(item, index, key, renderItem))\n continue\n }\n entry.item.value = item\n entry.value = item\n nextEntries.push(entry)\n continue\n }\n nextEntries.push(createListEntry(item, index, key, renderItem))\n }\n\n return nextEntries\n}\n\nfunction reconcileIndexed<T>(\n items: readonly T[],\n entries: Array<ListEntry<T>>,\n renderItem: (item: T, index: number) => VobsNode\n): Array<ListEntry<T>> {\n const nextEntries: Array<ListEntry<T>> = []\n for (let index = 0; index < items.length; index++) {\n const item = items[index]\n const entry = entries[index]\n if (entry && isPrimitiveItem(item) && !Object.is(entry.value, item)) {\n // 原始类型项被编译产物静态捕获,值变化时必须重建行;旧行由主循环统一 dispose。\n nextEntries.push(createListEntry(item, index, index, renderItem))\n continue\n }\n if (entry) {\n entry.item.value = item\n entry.value = item\n nextEntries.push(entry)\n continue\n }\n nextEntries.push(createListEntry(item, index, index, renderItem))\n }\n return nextEntries\n}\n\n/** 原始类型(含 function)无法被 Proxy 响应化,只能整行重建。 */\nfunction isPrimitiveItem(item: unknown): boolean {\n return item === null || typeof item !== 'object'\n}\n\nfunction createListEntry<T>(\n item: T,\n index: number,\n key: unknown,\n renderItem: (item: T, index: number) => VobsNode\n): ListEntry<T> {\n const owner = createOwner()\n let itemSignal!: Signal<T>\n let viewOwner!: Owner\n let node!: VobsNode\n owner.run(() => {\n itemSignal = state(item)\n viewOwner = createOwner()\n node = viewOwner.run(() => renderItem(toReactiveItem(itemSignal, item), index))\n })\n associateNodeOwner(node, viewOwner)\n return { key, node, owner, viewOwner, item: itemSignal, value: item, index }\n}\n\nfunction refreshListEntry<T>(\n parent: Node,\n entry: ListEntry<T>,\n index: number,\n renderItem: (item: T, index: number) => VobsNode\n): void {\n removeChild(parent, entry.node)\n entry.index = index\n const previousView = entry.viewOwner\n entry.owner.run(() => {\n entry.viewOwner = createOwner()\n entry.node = entry.viewOwner.run(() => renderItem(\n toReactiveItem(entry.item, entry.value),\n index\n ))\n })\n // 旧视图的 effect 仍订阅着 item 信号,必须 dispose,否则会写已脱离的 DOM(幽灵更新)。\n previousView.dispose()\n associateNodeOwner(entry.node, entry.viewOwner)\n}\n\nfunction toReactiveItem<T>(item: Signal<T>, initialValue: T): T {\n if (typeof initialValue !== 'object' || initialValue === null) {\n return initialValue\n }\n\n // 代理目标使用创建时的原始对象:避免在列表 effect 内读取 item 信号造成自依赖;\n // 属性读取始终转发到 item.value,在行内绑定 effect 中被正常追踪。\n return new Proxy(initialValue as object, {\n get(_target, property, receiver) {\n return Reflect.get(item.value as object, property, receiver)\n },\n has(_target, property) {\n return property in (item.value as object)\n },\n ownKeys() {\n return Reflect.ownKeys(item.value as object)\n },\n getOwnPropertyDescriptor(_target, property) {\n return Object.getOwnPropertyDescriptor(item.value as object, property)\n }\n }) as T\n}\n\nfunction disposeEntry(parent: Node, entry: ListEntry<unknown>): void {\n removeChild(parent, entry.node)\n entry.owner.dispose()\n}\n","/** Shared error protocol used by the runtime, compiler and DevTools. */\nexport type VobsErrorSeverity = 'error' | 'warning' | 'info'\nexport type VobsErrorLayer =\n | 'compiler'\n | 'runtime'\n | 'constraint'\n | 'permission'\n | 'ssr'\n | 'http'\n | 'resource'\n\nexport interface VobsErrorLocation {\n readonly file: string\n readonly line: number\n readonly column: number\n}\n\nexport interface VobsErrorOptions {\n readonly code: string\n readonly message: string\n readonly severity?: VobsErrorSeverity\n readonly layer?: VobsErrorLayer\n readonly cause?: unknown\n readonly fix?: string\n readonly location?: VobsErrorLocation\n readonly trace?: readonly string[]\n readonly example?: string\n readonly docs?: string\n readonly codeFrame?: string\n}\n\nexport interface VobsErrorDefaults {\n readonly code?: string\n readonly severity?: VobsErrorSeverity\n readonly layer?: VobsErrorLayer\n readonly fix?: string\n}\n\n/** A framework error with stable machine-readable metadata. */\nexport class VobsError extends Error {\n readonly code: string\n readonly severity: VobsErrorSeverity\n readonly layer: VobsErrorLayer\n readonly cause?: unknown\n readonly fix?: string\n readonly location?: VobsErrorLocation\n readonly trace?: readonly string[]\n readonly example?: string\n readonly docs?: string\n readonly codeFrame?: string\n\n constructor(options: VobsErrorOptions) {\n super(options.message)\n this.name = 'VobsError'\n this.code = options.code\n this.severity = options.severity ?? 'error'\n this.layer = options.layer ?? 'runtime'\n this.cause = options.cause\n this.fix = options.fix\n this.location = options.location\n this.trace = options.trace\n this.example = options.example\n this.docs = options.docs\n this.codeFrame = options.codeFrame\n }\n}\n\nexport function createVobsError(options: VobsErrorOptions): VobsError {\n return new VobsError(options)\n}\n\nexport function isVobsError(value: unknown): value is VobsError {\n return value instanceof VobsError\n || Boolean(value && typeof value === 'object'\n && typeof (value as { code?: unknown }).code === 'string'\n && typeof (value as { message?: unknown }).message === 'string'\n && typeof (value as { layer?: unknown }).layer === 'string')\n}\n\n/** Convert thrown strings and third-party errors without losing their message. */\nexport function normalizeVobsError(value: unknown, defaults: VobsErrorDefaults = {}): VobsError {\n if (value instanceof VobsError) return value\n if (value instanceof Error) {\n // Preserve the original Error identity so boundaries and DevTools can\n // correlate event/effect phases without creating duplicate diagnostics.\n const metadata = value as Error & {\n readonly vobsCode?: unknown\n readonly vobsHint?: unknown\n readonly vobsSource?: unknown\n }\n const code = defaults.code ?? (typeof metadata.vobsCode === 'string' ? metadata.vobsCode : undefined)\n if (code) defineErrorMetadata(value, 'code', code)\n defineErrorMetadata(value, 'severity', defaults.severity ?? 'error')\n defineErrorMetadata(value, 'layer', defaults.layer ?? 'runtime')\n const fix = defaults.fix ?? (typeof metadata.vobsHint === 'string' ? metadata.vobsHint : undefined)\n if (fix) defineErrorMetadata(value, 'fix', fix)\n const source = metadata.vobsSource\n if (source && typeof source === 'object'\n && typeof (source as { file?: unknown }).file === 'string'\n && typeof (source as { line?: unknown }).line === 'number'\n && typeof (source as { column?: unknown }).column === 'number') {\n defineErrorMetadata(value, 'location', source)\n }\n return value as VobsError\n }\n if (isVobsError(value)) {\n const candidate = value as VobsErrorOptions & { severity?: VobsErrorSeverity; layer?: VobsErrorLayer }\n return new VobsError({\n code: candidate.code,\n message: candidate.message,\n severity: candidate.severity ?? defaults.severity,\n layer: candidate.layer ?? defaults.layer,\n cause: candidate.cause,\n fix: candidate.fix ?? defaults.fix,\n location: candidate.location,\n trace: candidate.trace,\n example: candidate.example,\n docs: candidate.docs,\n codeFrame: candidate.codeFrame\n })\n }\n const message = String(value)\n return new VobsError({\n code: defaults.code ?? 'VOBS_UNKNOWN',\n message,\n severity: defaults.severity ?? 'error',\n layer: defaults.layer ?? 'runtime',\n cause: undefined,\n fix: defaults.fix\n })\n}\n\nfunction defineErrorMetadata(target: Error, key: string, value: unknown): void {\n if (key in target) return\n try {\n Object.defineProperty(target, key, { configurable: true, enumerable: false, value, writable: true })\n } catch {\n // Frozen third-party errors still retain their original message and stack.\n }\n}\n\nexport interface FormatVobsErrorOptions {\n readonly environment?: 'development' | 'production'\n readonly includeStack?: boolean\n}\n\n/** Format a concise, actionable message for terminals and dev overlays. */\nexport function formatVobsError(\n value: unknown,\n options: FormatVobsErrorOptions = {}\n): string {\n const error = normalizeVobsError(value)\n const code = error.code || 'VOBS_UNKNOWN'\n const severity = error.severity || 'error'\n if (options.environment === 'production') return `[Vobs ${code}] ${error.message}`\n\n const lines = [`[Vobs ${capitalize(severity)}] ${error.message}`, `Code: ${code}`]\n if (error.location) lines.push(`Location: ${error.location.file}:${error.location.line}:${error.location.column}`)\n if (error.codeFrame) lines.push('', error.codeFrame)\n if (error.cause !== undefined) lines.push(`Cause: ${formatCause(error.cause)}`)\n if (error.trace?.length) lines.push('', `Trace: ${error.trace.join(' → ')}`)\n if (error.fix) lines.push('', `Fix: ${error.fix}`)\n if (error.example) lines.push('', `Example:\\n${error.example}`)\n if (error.docs) lines.push(`Docs: ${error.docs}`)\n if (options.includeStack && error.stack) lines.push('', error.stack)\n return lines.join('\\n')\n}\n\nfunction formatCause(value: unknown): string {\n return value instanceof Error ? `${value.name}: ${value.message}` : String(value)\n}\n\nfunction capitalize(value: string): string {\n return value.slice(0, 1).toUpperCase() + value.slice(1)\n}\n","import { createOwner, state } from '@vobs/reactivity'\nimport { invokeRuntimeDebug } from './debug'\nimport { insertDynamic, type NodeFactory } from './dynamic'\nimport { normalizeVobsError } from './error'\n\nexport type BoundaryRetry = () => void | Promise<unknown>\nexport type BoundaryFallback = (error: Error, retry: BoundaryRetry) => ReturnType<NodeFactory>\n\nexport interface BoundaryOptions {\n children: NodeFactory\n fallback: BoundaryFallback\n onRetry?: () => void | Promise<unknown>\n resetKey?: () => unknown\n}\n\n/**\n * Shared no-wrapper boundary protocol. The boundary owns its reactive error\n * state and child branch, so replacing the branch also disposes its Owner.\n */\nexport function insertBoundary(\n parent: Node,\n anchor: Node | null,\n options: BoundaryOptions\n): void {\n const boundary = createOwner()\n boundary.run(() => {\n const error = state<Error | null>(null)\n let fallbackActive = false\n let lastError: Error | null = null\n let initialized = false\n let previousKey: unknown\n\n boundary.onError(reason => {\n if (fallbackActive) throw reason\n const normalized = normalizeVobsError(reason, {\n code: 'VOBS_R001',\n layer: 'runtime',\n fix: '检查组件渲染逻辑,或在边界 fallback 中提供恢复操作。'\n })\n lastError = normalized\n invokeRuntimeDebug('error', {\n error: normalized,\n owner: boundary,\n phase: 'boundary',\n handled: true,\n recovery: 'fallback'\n })\n error.value = normalized\n })\n\n const retry = (): void | Promise<unknown> => {\n if (error.value) {\n invokeRuntimeDebug('error', {\n error: error.value,\n owner: boundary,\n phase: 'boundary',\n handled: true,\n recovery: 'retrying'\n })\n }\n error.value = null\n return options.onRetry?.()\n }\n\n insertDynamic(parent, anchor, () => {\n const nextKey = options.resetKey?.()\n if (!initialized || !Object.is(previousKey, nextKey)) {\n initialized = true\n previousKey = nextKey\n if (error.value) error.value = null\n }\n\n const currentError = error.value\n if (!currentError) {\n if (fallbackActive && lastError) {\n invokeRuntimeDebug('error', {\n error: lastError,\n owner: boundary,\n phase: 'boundary',\n handled: true,\n recovery: 'recovered'\n })\n lastError = null\n }\n fallbackActive = false\n return options.children()\n }\n\n fallbackActive = true\n return options.fallback(currentError, retry)\n })\n })\n}\n","import { createOwner, scheduler, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { createDOMRenderer } from '@vobs/dom'\nimport { insertBefore as insertRuntimeNode, setRenderer, type VobsFragment, type VobsRenderer } from '@vobs/runtime'\nimport { injectFromOwner, provideToOwner } from './context'\n\nexport type InjectionKey<T> = symbol & {\n readonly __vobsType?: T\n}\n\nexport interface ProvideOptions {\n override?: boolean\n}\n\nexport interface VobsPlugin {\n name: string\n version?: string\n requires?: readonly VobsPlugin[]\n optional?: readonly VobsPlugin[]\n install?: (ctx: VobsContext) => void | (() => void)\n}\n\nexport interface VobsContext {\n readonly app: VobsApp\n provide<T>(key: InjectionKey<T>, value: T, options?: ProvideOptions): void\n inject<T>(key: InjectionKey<T>): T | undefined\n injectRequired<T>(key: InjectionKey<T>, description?: string): T\n onDestroy(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n}\n\nexport interface VobsConfig<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n> {\n render: () => NodeType | VobsFragment | Node | null | undefined\n renderer?: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n plugins?: VobsPlugin[]\n /** Optional application-level error observer. Observers are isolated from the app. */\n onError?: (error: unknown) => void\n}\n\nexport interface VobsApp<NodeType = Node> {\n readonly mounted: boolean\n readonly destroyed: boolean\n use(plugin: VobsPlugin): VobsApp<NodeType>\n mount(target: string | NodeType): void\n hydrate(target: string | NodeType): void\n update(): void\n destroy(): void\n}\n\nexport function createInjectionKey<T>(description: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>\n}\n\nexport function createVobs(\n config: VobsConfig<Node, Text, Element, Comment>\n): VobsApp<Node>\nexport function createVobs<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n>(\n config: VobsConfig<NodeType, TextNode, ElementNode, CommentNode> & {\n renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n }\n): VobsApp<NodeType>\nexport function createVobs(\n config: VobsConfig<any, any, any, any>\n): VobsApp<any> {\n if (!config.render) throw new Error('createVobs: render 不能为空')\n\n const renderer = config.renderer ?? createDOMRenderer()\n const rootOwner: Owner = createOwner()\n setOwnerDebugName(rootOwner, 'App')\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n const installed = new Set<string>()\n const installing = new Set<string>()\n let mounted = false\n let destroyed = false\n let container: any = null\n let app!: VobsApp<any>\n\n if (config.onError) {\n errorHandlers.add(config.onError)\n cleanups.push(() => errorHandlers.delete(config.onError!))\n }\n\n const context: VobsContext = {\n get app(): VobsApp<any> {\n return app\n },\n\n provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n provideToOwner(rootOwner, key, value, options)\n },\n\n inject<T>(key: InjectionKey<T>): T | undefined {\n return injectFromOwner(rootOwner, key)\n },\n\n injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = injectFromOwner(rootOwner, key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n },\n\n onDestroy(cleanup: () => void): void {\n cleanups.push(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n cleanups.push(remove)\n return remove\n }\n }\n\n function notifyError(error: unknown): void {\n for (const handler of [...errorHandlers]) {\n try {\n handler(error)\n } catch {\n // 错误处理器不能覆盖触发它的原始错误。\n }\n }\n }\n\n function installPlugin(plugin: VobsPlugin): void {\n if (installed.has(plugin.name)) return\n if (installing.has(plugin.name)) {\n throw new Error(`Vobs: 插件依赖存在循环:${plugin.name}`)\n }\n\n installing.add(plugin.name)\n try {\n for (const dependency of plugin.requires ?? []) installPlugin(dependency)\n const cleanup = plugin.install?.(context)\n if (cleanup) cleanups.push(cleanup)\n installed.add(plugin.name)\n } finally {\n installing.delete(plugin.name)\n }\n }\n\n function cleanup(clearContainer = true): unknown {\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n try {\n rootOwner.dispose()\n } catch (error) {\n firstError ??= error\n }\n\n if (container && clearContainer) {\n try {\n renderer.clear(container)\n } catch (error) {\n firstError ??= error\n }\n }\n return firstError\n }\n\n function start(target: string | any, hydrating: boolean): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能挂载')\n if (mounted) return\n\n container = typeof target === 'string' ? document.querySelector(target) : target\n if (!container) throw new Error(`mount: 目标不存在: ${target}`)\n if (hydrating && !renderer.beginHydration) {\n throw new Error('Vobs: 当前渲染器不支持 Hydration')\n }\n\n setRenderer(renderer)\n try {\n if (hydrating) renderer.beginHydration?.()\n const rootNode = rootOwner.run(config.render)\n if (!hydrating) renderer.clear(container)\n if (rootNode) insertRuntimeNode(container, rootNode as any, null)\n if (hydrating) renderer.completeHydration?.()\n mounted = true\n } catch (error) {\n notifyError(error)\n const cleanupError = cleanup(!hydrating)\n destroyed = true\n throw cleanupError ?? error\n }\n }\n\n app = {\n get mounted(): boolean {\n return mounted\n },\n\n get destroyed(): boolean {\n return destroyed\n },\n\n use(plugin: VobsPlugin): VobsApp<any> {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能安装插件')\n installPlugin(plugin)\n return app\n },\n\n mount(target: string | any): void {\n start(target, false)\n },\n\n hydrate(target: string | any): void {\n start(target, true)\n },\n\n update(): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能更新')\n try {\n scheduler.flush()\n } catch (error) {\n notifyError(error)\n throw error\n }\n },\n\n destroy(): void {\n if (destroyed) return\n try {\n const cleanupError = cleanup()\n if (cleanupError) {\n notifyError(cleanupError)\n throw cleanupError\n }\n } finally {\n mounted = false\n destroyed = true\n }\n }\n }\n\n try {\n for (const plugin of config.plugins ?? []) app.use(plugin)\n } catch (error) {\n notifyError(error)\n cleanup()\n destroyed = true\n throw error\n }\n\n return app\n}\n","import { createFragment, insertBoundary, type NodeFactory, type VobsNode } from '@vobs/vobs'\nimport type { Resource } from './resource'\n\nexport type ResourceBoundaryChild<T> = (data: T) => ReturnType<NodeFactory>\nexport type ResourceBoundaryView = ReturnType<NodeFactory> | NodeFactory\nexport type ResourceBoundaryFallback = (\n error: Error,\n retry: () => Promise<unknown>\n) => ReturnType<NodeFactory>\n\nexport interface ResourceBoundaryOptions<T> {\n resource: Resource<T>\n children: ResourceBoundaryChild<T>\n loading?: ResourceBoundaryView\n empty?: ResourceBoundaryView\n fallback?: ResourceBoundaryFallback\n}\n\nexport interface ResourceBoundaryProps<T> extends ResourceBoundaryOptions<T> {}\n\n/**\n * Inserts a reactive Resource state branch. The compiler can lower a future\n * ResourceBoundary JSX element to this host-level instruction without a wrapper node.\n */\nexport function insertResourceBoundary<T>(\n parent: Node,\n anchor: Node | null,\n options: ResourceBoundaryOptions<T>\n): void {\n insertBoundary(parent, anchor, {\n onRetry: () => options.resource.refetch(),\n fallback: (error, retry) => options.fallback?.(error, () => Promise.resolve(retry())) ?? null,\n children: () => {\n if (options.resource.error.value) throw options.resource.error.value\n if (options.resource.loading.value) return resolveView(options.loading)\n\n const data = options.resource.data.value\n if (data === null) return resolveView(options.empty)\n return options.children(data)\n }\n })\n}\n\n/** Component-shaped API backed by the same no-wrapper boundary instruction. */\nexport function ResourceBoundary<T>(props: ResourceBoundaryProps<T>): VobsNode {\n return createFragment((parent, anchor) => insertResourceBoundary(parent, anchor, props))\n}\n\nfunction resolveView(view: ResourceBoundaryView | undefined): ReturnType<NodeFactory> {\n if (!view) return null\n return typeof view === 'function' ? view() : view\n}\n","import { state, type Signal } from '@vobs/reactivity'\nimport {\n createComponent,\n createFragment,\n createInjectionKey,\n inject,\n insertBoundary,\n type InjectionKey,\n type VobsNode,\n type VobsPlugin\n} from '@vobs/vobs'\nimport {\n createRouterDebugId,\n emitRouterDebug\n} from './debug'\nimport {\n getRuntimeDebugContext,\n runWithRuntimeDebugContext,\n type RuntimeDebugContext\n} from '@vobs/runtime'\n\nexport { createRouterDebugId, emitRouterDebug, subscribeRouterDebug } from './debug'\nexport type { RouterDebugEvent, RouterDebugEventType } from './debug'\n\nexport type RouteParams = Readonly<Record<string, string>>\nexport type RouteQueryValue = string | readonly string[]\nexport type RouteQuery = Readonly<Record<string, RouteQueryValue>>\nexport type RouteMeta = Readonly<Record<string, unknown>>\n\nexport interface RouteLocation {\n readonly path: string\n readonly fullPath: string\n readonly params: RouteParams\n readonly query: RouteQuery\n readonly hash: string\n readonly name: string | undefined\n readonly meta: RouteMeta\n readonly record: RouteRecord | null\n readonly matched: readonly RouteRecord[]\n readonly state?: unknown\n}\n\nexport interface RouteComponentProps {\n readonly route: RouteLocation\n readonly params: RouteParams\n readonly query: RouteQuery\n readonly children?: VobsNode\n}\n\nexport type RouteComponent = (props: RouteComponentProps) => VobsNode\nexport type RouteComponentModule = RouteComponent | { default: RouteComponent }\nexport type RouteComponentLoader = () => PromiseLike<RouteComponentModule>\n\nexport interface LazyRouteComponent {\n readonly kind: 'vobs-lazy-route'\n readonly load: RouteComponentLoader\n}\n\nexport type RouteComponentDefinition = RouteComponent | LazyRouteComponent\n\nexport interface RouteLoaderContext {\n readonly route: RouteLocation\n readonly navigationId?: number\n readonly dataRequestId?: number\n}\n\nexport type RouteLoader = (context: RouteLoaderContext) => unknown | PromiseLike<unknown>\n\nexport interface RouteRecord {\n readonly path?: string\n readonly component?: RouteComponentDefinition\n readonly source?: string\n readonly name?: string\n readonly meta?: Record<string, unknown>\n readonly loader?: RouteLoader\n readonly action?: RouteLoader\n readonly children?: readonly RouteRecord[]\n}\n\nexport type RouteQueryInput = Record<string, unknown> | URLSearchParams\n\nexport interface RouteLocationRaw {\n readonly path?: string\n readonly name?: string\n readonly params?: Record<string, unknown>\n readonly query?: RouteQueryInput\n readonly hash?: string\n readonly state?: unknown\n}\n\nexport type RouteTarget = string | RouteLocationRaw\n\nexport type NavigationGuardResult = void | boolean | RouteTarget\nexport type NavigationGuard = (\n to: RouteLocation,\n from: RouteLocation\n) => NavigationGuardResult | PromiseLike<NavigationGuardResult>\n\nexport class NavigationCancelledError extends Error {\n readonly code = 'NAVIGATION_CANCELLED'\n\n constructor() {\n super('Vobs Router: 导航已被更新的导航取消')\n this.name = 'NavigationCancelledError'\n }\n}\n\nexport class NavigationRedirectError extends Error {\n readonly code = 'NAVIGATION_REDIRECT_LIMIT'\n\n constructor() {\n super('Vobs Router: 导航重定向超过最大次数')\n this.name = 'NavigationRedirectError'\n }\n}\n\nexport interface RouterHistory {\n readonly location: string\n /** 当前 history 条目携带的导航 state(push/replace 时写入,popstate/初始启动时回读)。 */\n readonly state?: unknown\n push(path: string, state?: unknown): void\n replace(path: string, state?: unknown): void\n back(): void\n listen(listener: (path: string, state: unknown) => void): () => void\n}\n\nexport interface RouterOptions {\n readonly routes: readonly RouteRecord[]\n readonly history?: RouterHistory\n}\n\nexport interface RouterViewState {\n readonly status: 'ready' | 'loading' | 'error' | 'not-found'\n readonly component?: RouteComponent\n readonly layouts?: readonly RouteComponent[]\n readonly error?: Error\n readonly retry: () => void\n}\n\nexport interface RouteDebugNode {\n readonly id: string\n readonly path: string\n readonly name?: string\n readonly component: string\n readonly lazy: boolean\n readonly loader: boolean\n readonly action: boolean\n readonly status: 'ready' | 'loading' | 'error'\n readonly meta: RouteMeta\n readonly source?: string\n readonly children: readonly RouteDebugNode[]\n}\n\nexport interface RouteErrorTrace {\n readonly id: number\n readonly phase: 'navigation' | 'render' | 'lazy' | 'loader' | 'action' | 'fetcher'\n readonly route: string\n readonly message: string\n readonly stack?: string\n readonly timestamp: number\n readonly requestId?: number\n readonly navigationId?: number\n}\n\nexport interface NavigationTrace {\n readonly id: number\n readonly from: string\n readonly to: string\n readonly status: 'success' | 'redirected' | 'cancelled' | 'error'\n readonly source: 'push' | 'replace' | 'history'\n readonly startedAt: number\n readonly endedAt: number\n readonly duration: number\n readonly redirect?: string\n readonly error?: string\n}\n\nexport interface NavigationState {\n readonly status: 'idle' | 'loading' | 'error'\n readonly from: string\n readonly to: string\n readonly traceId?: number\n readonly error?: string\n}\n\nexport interface RouterPerformanceMetrics {\n readonly navigationCount: number\n readonly averageNavigationDuration: number\n readonly slowNavigationCount: number\n}\n\nexport type RouterDataRequestKind = 'loader' | 'action' | 'fetcher'\n\nexport interface RouterDataRequestTrace {\n readonly id: number\n readonly kind: RouterDataRequestKind\n readonly key: string\n readonly route?: string\n readonly status: 'loading' | 'success' | 'error' | 'cancelled'\n readonly startedAt: number\n readonly endedAt?: number\n readonly duration?: number\n readonly result?: unknown\n readonly error?: string\n readonly navigationId?: number\n readonly trigger?: 'navigation' | 'revalidate' | 'manual' | 'resource'\n readonly environment?: 'client' | 'server'\n}\n\nexport interface RouterDataRequestOptions {\n readonly route?: string\n readonly navigationId?: number\n readonly trigger?: 'navigation' | 'revalidate' | 'manual' | 'resource'\n readonly environment?: 'client' | 'server'\n}\n\nexport type RouterDevToolsEvent = 'navigation:start' | 'navigation:end' | 'route:update' | 'data-request' | 'error'\n\nexport interface RouterDevToolsAPI {\n getRouteTree(): readonly RouteDebugNode[]\n getCurrentRoute(): RouteLocation\n getNavigationState(): NavigationState\n getNavigationHistory(): readonly NavigationTrace[]\n getPerformanceMetrics(): RouterPerformanceMetrics\n getDataRequests(): readonly RouterDataRequestTrace[]\n getErrors(): readonly RouteErrorTrace[]\n trackDataRequest<T>(\n kind: RouterDataRequestKind,\n key: string,\n task: () => T | PromiseLike<T>,\n options?: RouterDataRequestOptions | string\n ): Promise<T>\n runAction<T>(key: string, task: () => T | PromiseLike<T>): Promise<T>\n runFetcher<T>(key: string, task: () => T | PromiseLike<T>): Promise<T>\n reportError(phase: RouteErrorTrace['phase'], error: unknown, route?: string, context?: { readonly requestId?: number; readonly navigationId?: number }): void\n revalidate(route?: string): Promise<void>\n subscribe(event: RouterDevToolsEvent, callback: (payload: unknown) => void): () => void\n}\n\nexport interface Router {\n readonly currentRoute: Signal<RouteLocation>\n readonly history: RouterHistory\n resolve(to: RouteTarget): RouteLocation\n push(to: RouteTarget): Promise<RouteLocation | false>\n replace(to: RouteTarget): Promise<RouteLocation | false>\n back(): void\n beforeEach(guard: NavigationGuard): () => void\n getViewState(route: RouteLocation): RouterViewState\n readonly devtools: RouterDevToolsAPI\n destroy(): void\n}\n\nexport interface RouterViewProps {\n readonly router?: Router\n readonly loading?: () => VobsNode | null | undefined\n readonly notFound?: (route: RouteLocation) => VobsNode | null | undefined\n readonly error?: (error: Error, retry: () => void) => VobsNode | null | undefined\n}\n\nexport interface RouterPluginOptions {\n readonly router?: Router\n readonly routes?: readonly RouteRecord[]\n readonly history?: RouterHistory\n}\n\nexport const ROUTER_KEY: InjectionKey<Router> = createInjectionKey<Router>('vobs.router')\n\nexport function lazy(loader: RouteComponentLoader): LazyRouteComponent {\n return {\n kind: 'vobs-lazy-route',\n load: loader\n }\n}\n\nexport function createMemoryHistory(initial = '/'): RouterHistory {\n let entries = [{ path: normalizeHistoryPath(initial), state: undefined as unknown }]\n let index = 0\n const listeners = new Set<(path: string, state: unknown) => void>()\n\n return {\n get location(): string {\n return entries[index]!.path\n },\n\n get state(): unknown {\n return entries[index]!.state\n },\n\n push(path: string, state?: unknown): void {\n const next = normalizeHistoryPath(path)\n entries = entries.slice(0, index + 1)\n entries.push({ path: next, state })\n index++\n },\n\n replace(path: string, state?: unknown): void {\n entries[index] = { path: normalizeHistoryPath(path), state }\n },\n\n back(): void {\n if (index === 0) return\n index--\n notifyListeners(listeners, entries[index]!.path, entries[index]!.state)\n },\n\n listen(listener: (path: string, state: unknown) => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n }\n }\n}\n\nexport function createBrowserHistory(base = ''): RouterHistory {\n if (typeof window === 'undefined') {\n throw new Error('Vobs Router: createBrowserHistory 需要浏览器环境')\n }\n\n const normalizedBase = normalizeBase(base)\n const listeners = new Set<(path: string, state: unknown) => void>()\n const onPopState = (event: PopStateEvent): void => {\n notifyListeners(listeners, readBrowserLocation(normalizedBase), event.state)\n }\n\n return {\n get location(): string {\n return readBrowserLocation(normalizedBase)\n },\n\n get state(): unknown {\n return window.history.state\n },\n\n push(path: string, state?: unknown): void {\n window.history.pushState(state ?? null, '', withBase(normalizeHistoryPath(path), normalizedBase))\n },\n\n replace(path: string, state?: unknown): void {\n window.history.replaceState(state ?? null, '', withBase(normalizeHistoryPath(path), normalizedBase))\n },\n\n back(): void {\n window.history.back()\n },\n\n listen(listener: (path: string, state: unknown) => void): () => void {\n if (listeners.size === 0) window.addEventListener('popstate', onPopState)\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n if (listeners.size === 0) window.removeEventListener('popstate', onPopState)\n }\n }\n }\n}\n\nexport function createRouter(options: RouterOptions): Router {\n const matchers = normalizeRoutes(options.routes)\n const history = options.history ?? defaultHistory()\n const routerDebugId = createRouterDebugId()\n matchers.sort(compareMatchers)\n const currentRoute = state<RouteLocation>(resolvePath(history.location))\n const lazyStates = new Map<RouteRecord, LazyState>()\n const guards: NavigationGuard[] = []\n const navigationHistory: NavigationTrace[] = []\n const dataRequests: RouterDataRequestTrace[] = []\n const errors: RouteErrorTrace[] = []\n const dataLoaders = new Map<string, { kind: RouterDataRequestKind; route: string; task: () => unknown | PromiseLike<unknown> }>()\n const dataRequestContexts = new Map<number, RuntimeDebugContext>()\n const routerListeners = new Map<RouterDevToolsEvent, Set<(payload: unknown) => void>>()\n let navigationState: NavigationState = { status: 'idle', from: currentRoute.value.fullPath, to: currentRoute.value.fullPath }\n let navigationCount = 0\n let totalNavigationDuration = 0\n let slowNavigationCount = 0\n let nextDataRequestId = 1\n let nextErrorId = 1\n let navigationId = 0\n let destroyed = false\n const viewRevision = state(0)\n\n function resolve(to: RouteTarget): RouteLocation {\n ensureActive()\n const target = typeof to === 'string' ? parseTargetString(to) : normalizeTarget(to, matchers)\n return resolvePath(buildTargetPath(target.path, target.query, target.hash), target.state)\n }\n\n function resolvePath(rawPath: string, state?: unknown): RouteLocation {\n const parsed = parseTargetString(rawPath)\n const matched = matchers.find(matcher => matcher.regex.exec(parsed.path))\n const params = matched ? extractParams(matched, parsed.path) : {}\n const record = matched?.record ?? null\n const query = parsed.query\n const hash = parsed.hash\n return {\n path: parsed.path,\n fullPath: buildTargetPath(parsed.path, query, hash),\n params,\n query,\n hash,\n name: record?.name,\n meta: matched?.meta ?? {},\n record,\n matched: matched?.chain ?? EMPTY_MATCHED,\n state\n }\n }\n\n async function navigate(\n to: RouteTarget,\n replaceHistory: boolean,\n fromHistory: boolean,\n historyState?: unknown\n ): Promise<RouteLocation | false> {\n ensureActive()\n const id = ++navigationId\n const from = currentRoute.value\n let target = resolve(to)\n // popstate 回读的 state 保存在 history 条目上,不在目标描述里,这里回填。\n if (fromHistory && historyState !== undefined) target = { ...target, state: historyState }\n const source: NavigationTrace['source'] = fromHistory ? 'history' : replaceHistory ? 'replace' : 'push'\n const startedAt = now()\n const initialTarget = target.fullPath\n let terminalRecorded = false\n navigationState = { status: 'loading', from: from.fullPath, to: target.fullPath, traceId: id }\n emitRouter('navigation:start', navigationState)\n if (target.fullPath === from.fullPath && !fromHistory) {\n navigationState = { status: 'idle', from: from.fullPath, to: target.fullPath }\n return from\n }\n\n try {\n for (let redirectCount = 0; ; redirectCount++) {\n ensureNavigationIsCurrent(id)\n let redirect: RouteTarget | undefined\n for (const guard of [...guards]) {\n let result: NavigationGuardResult\n try {\n result = await guard(target, from)\n } catch (reason) {\n if (reason instanceof NavigationCancelledError) throw reason\n const error = toError(reason)\n reportError('navigation', error, target.fullPath)\n recordNavigation({ id, from: from.fullPath, to: target.fullPath, status: 'error', source, startedAt, endedAt: now(), duration: now() - startedAt, error: error.message })\n terminalRecorded = true\n throw reason\n }\n ensureNavigationIsCurrent(id)\n if (result === false) {\n recordNavigation({ id, from: from.fullPath, to: target.fullPath, status: 'cancelled', source, startedAt, endedAt: now(), duration: now() - startedAt })\n terminalRecorded = true\n return false\n }\n if (typeof result === 'string' || isRouteLocationRaw(result)) {\n redirect = result\n break\n }\n }\n\n for (const record of target.matched) {\n if (!record.loader) continue\n // 上一 loader 期间被新导航抢占时立即取消,跳过剩余 loader。\n ensureNavigationIsCurrent(id)\n await trackDataRequest(\n 'loader',\n `${target.fullPath}#${record.path ?? record.name ?? 'route'}`,\n context => record.loader!({ route: target, navigationId: id, dataRequestId: context.dataRequestId }),\n { route: target.fullPath, navigationId: id, trigger: 'navigation' }\n )\n }\n\n // loader 完成后、提交前必须重新校验:飞行期间被抢占的导航不允许覆盖 currentRoute 与 history。\n ensureNavigationIsCurrent(id)\n\n if (redirect !== undefined) {\n if (redirectCount >= 10) {\n const error = new NavigationRedirectError()\n recordNavigation({ id, from: from.fullPath, to: target.fullPath, status: 'error', source, startedAt, endedAt: now(), duration: now() - startedAt, error: error.message })\n terminalRecorded = true\n throw error\n }\n const redirected = resolve(redirect)\n if (redirected.fullPath === target.fullPath) return false\n recordNavigation({ id, from: from.fullPath, to: target.fullPath, status: 'redirected', source, startedAt, endedAt: now(), duration: now() - startedAt, redirect: redirected.fullPath })\n target = redirected\n continue\n }\n\n if (target.fullPath === from.fullPath) return from\n if (!fromHistory) {\n if (replaceHistory) history.replace(target.fullPath, target.state)\n else history.push(target.fullPath, target.state)\n }\n currentRoute.value = target\n recordNavigation({ id, from: from.fullPath, to: target.fullPath, status: 'success', source, startedAt, endedAt: now(), duration: now() - startedAt, redirect: target.fullPath !== initialTarget ? target.fullPath : undefined })\n terminalRecorded = true\n return target\n }\n } catch (reason) {\n if (reason instanceof NavigationCancelledError) {\n recordNavigation({ id, from: from.fullPath, to: target.fullPath, status: 'cancelled', source, startedAt, endedAt: now(), duration: now() - startedAt })\n terminalRecorded = true\n } else if (!terminalRecorded) {\n const error = toError(reason)\n reportError('navigation', error, target.fullPath)\n recordNavigation({ id, from: from.fullPath, to: target.fullPath, status: 'error', source, startedAt, endedAt: now(), duration: now() - startedAt, error: error.message })\n terminalRecorded = true\n }\n throw reason\n }\n }\n\n function now(): number {\n return typeof performance === 'undefined' ? Date.now() : performance.now()\n }\n\n function emitRouter(event: RouterDevToolsEvent, payload: unknown): void {\n for (const callback of routerListeners.get(event) ?? []) {\n try { callback(payload) } catch { /* diagnostics must not affect navigation */ }\n }\n emitRouterDebug(routerDebugId, event, payload, getRuntimeDebugContext() ?? undefined)\n }\n\n function recordNavigation(trace: NavigationTrace): void {\n navigationHistory.push(Object.freeze(trace))\n if (navigationHistory.length > 100) navigationHistory.shift()\n navigationCount++\n totalNavigationDuration += trace.duration\n if (trace.duration >= 16) slowNavigationCount++\n if (trace.id === navigationId) {\n navigationState = trace.status === 'error'\n ? { status: 'error', from: trace.from, to: trace.to, traceId: trace.id, error: trace.error }\n : { status: 'idle', from: trace.from, to: trace.to, traceId: trace.id }\n }\n emitRouter('navigation:end', trace)\n emitRouter('route:update', currentRoute.value)\n }\n\n async function trackDataRequest<T>(\n kind: RouterDataRequestKind,\n key: string,\n task: ((context: { readonly dataRequestId: number }) => T | PromiseLike<T>) | (() => T | PromiseLike<T>),\n optionsOrRoute: RouterDataRequestOptions | string = {}\n ): Promise<T> {\n ensureActive()\n const options = typeof optionsOrRoute === 'string' ? { route: optionsOrRoute } : optionsOrRoute\n const id = nextDataRequestId++\n const startedAt = now()\n const context = getRuntimeDebugContext()\n const route = options.route ?? currentRoute.value.fullPath\n const requestContext: RuntimeDebugContext = {\n ...context,\n environment: options.environment ?? context?.environment,\n route,\n navigationId: options.navigationId ?? context?.navigationId,\n dataRequestId: id,\n source: kind\n }\n const loading: RouterDataRequestTrace = {\n id,\n kind,\n key,\n route,\n status: 'loading',\n startedAt,\n navigationId: requestContext.navigationId,\n trigger: options.trigger,\n environment: requestContext.environment\n }\n dataRequests.push(loading)\n if (dataRequests.length > 100) dataRequests.shift()\n dataRequestContexts.set(id, requestContext)\n emitRouter('route:update', currentRoute.value)\n emitRouter('data-request', loading)\n emitRouterDebug(routerDebugId, 'data-request', { phase: 'start', trace: loading }, requestContext)\n dataLoaders.set(key, { kind, route, task: task as () => unknown | PromiseLike<unknown> })\n try {\n const result = await runWithRuntimeDebugContext(requestContext, () => (task as (context: { readonly dataRequestId: number }) => T | PromiseLike<T>)({ dataRequestId: id }))\n const endedAt = now()\n replaceDataRequest(id, { ...loading, status: 'success', endedAt, duration: endedAt - startedAt, result })\n return result\n } catch (reason) {\n const endedAt = now()\n const error = toError(reason)\n const status = isAbortError(reason) ? 'cancelled' : 'error'\n if (status === 'error') reportError(kind, error, route, { requestId: id, navigationId: requestContext.navigationId })\n replaceDataRequest(id, { ...loading, status, endedAt, duration: endedAt - startedAt, error: status === 'error' ? error.message : undefined })\n throw reason\n }\n }\n\n function replaceDataRequest(id: number, trace: RouterDataRequestTrace): void {\n const index = dataRequests.findIndex(item => item.id === id)\n if (index >= 0) dataRequests[index] = Object.freeze(trace)\n emitRouter('route:update', currentRoute.value)\n emitRouter('data-request', trace)\n emitRouterDebug(routerDebugId, 'data-request', { phase: 'end', trace }, dataRequestContexts.get(id))\n dataRequestContexts.delete(id)\n }\n\n function reportError(\n phase: RouteErrorTrace['phase'],\n reason: unknown,\n route = currentRoute.value.fullPath,\n context: { readonly requestId?: number; readonly navigationId?: number } = {}\n ): void {\n const error = toError(reason)\n errors.push(Object.freeze({\n id: nextErrorId++,\n phase,\n route,\n message: error.message,\n stack: error.stack,\n timestamp: now(),\n requestId: context.requestId,\n navigationId: context.navigationId\n }))\n if (errors.length > 100) errors.shift()\n emitRouter('error', errors[errors.length - 1]!)\n emitRouter('route:update', currentRoute.value)\n }\n\n function routeTree(): readonly RouteDebugNode[] {\n const statuses = new Map<string, LazyState['status']>()\n for (const matcher of matchers) {\n for (const record of matcher.chain) {\n if (record.component && isLazyRouteComponent(record.component)) {\n const debugId = routeDebugIds.get(record)\n if (debugId) statuses.set(debugId, lazyStates.get(record)?.status ?? 'loading')\n }\n }\n }\n return buildRouteDebugTree(options.routes, statuses)\n }\n\n function handleHistoryNavigation(path: string, state: unknown): void {\n void navigate(path, false, true, state).then(result => {\n if (destroyed) return\n if (result === false) {\n history.replace(currentRoute.value.fullPath, currentRoute.value.state)\n } else if (result.fullPath !== normalizeHistoryPath(path)) {\n history.replace(result.fullPath, result.state)\n }\n }).catch(error => {\n if (!(error instanceof NavigationCancelledError) && !destroyed) {\n const current = currentRoute.value.fullPath\n const failed = toError(error)\n reportError('navigation', failed, normalizeHistoryPath(path))\n navigationState = { status: 'error', from: current, to: normalizeHistoryPath(path), error: failed.message }\n emitRouter('navigation:end', { status: 'error', from: current, to: normalizeHistoryPath(path), error: failed.message })\n history.replace(currentRoute.value.fullPath, currentRoute.value.state)\n }\n })\n }\n\n const stopHistory = history.listen(handleHistoryNavigation)\n\n const router: Router = {\n currentRoute,\n history,\n\n resolve,\n\n push(to: RouteTarget): Promise<RouteLocation | false> {\n return navigate(to, false, false)\n },\n\n replace(to: RouteTarget): Promise<RouteLocation | false> {\n return navigate(to, true, false)\n },\n\n back(): void {\n ensureActive()\n history.back()\n },\n\n beforeEach(guard: NavigationGuard): () => void {\n ensureActive()\n guards.push(guard)\n return () => {\n const index = guards.indexOf(guard)\n if (index >= 0) guards.splice(index, 1)\n }\n },\n\n getViewState(route: RouteLocation): RouterViewState {\n viewRevision.value\n const records = route.matched.length > 0 ? route.matched : route.record ? [route.record] : []\n const entries = records\n .map(record => ({ record, definition: record.component }))\n .filter((entry): entry is { record: RouteRecord; definition: RouteComponentDefinition } =>\n isRouteComponentDefinition(entry.definition))\n if (!route.record || entries.length === 0) return { status: 'not-found', retry: () => undefined }\n\n const loaded: RouteComponent[] = []\n const lazyRecords: RouteRecord[] = []\n for (const entry of entries) {\n const { record, definition } = entry\n if (!isLazyRouteComponent(definition)) {\n loaded.push(definition)\n continue\n }\n lazyRecords.push(record)\n const lazyState = ensureLazyState(record, definition)\n if (lazyState.status === 'loading') return { status: 'loading', retry: () => retryLazyRoutes(lazyRecords) }\n if (lazyState.status === 'error') {\n return { status: 'error', error: lazyState.error, retry: () => retryLazyRoutes(lazyRecords) }\n }\n if (lazyState.component) loaded.push(lazyState.component)\n }\n\n const component = loaded[loaded.length - 1]\n if (!component) return { status: 'not-found', retry: () => undefined }\n return {\n status: 'ready',\n component,\n layouts: loaded.slice(0, -1),\n retry: () => retryLazyRoutes(lazyRecords)\n }\n },\n\n devtools: {\n getRouteTree: routeTree,\n getCurrentRoute: () => currentRoute.value,\n getNavigationState: () => navigationState,\n getNavigationHistory: () => [...navigationHistory],\n getPerformanceMetrics: () => ({\n navigationCount,\n averageNavigationDuration: navigationCount === 0 ? 0 : totalNavigationDuration / navigationCount,\n slowNavigationCount\n }),\n getDataRequests: () => [...dataRequests],\n getErrors: () => [...errors],\n trackDataRequest,\n runAction: (key, task) => trackDataRequest('action', key, task, { trigger: 'manual' }),\n runFetcher: (key, task) => trackDataRequest('fetcher', key, task, { trigger: 'manual' }),\n reportError,\n revalidate: async (route) => {\n await Promise.all([...dataLoaders.entries()]\n .filter(([, loader]) => loader.kind === 'loader' && (route === undefined || loader.route === route))\n .map(([key, loader]) => trackDataRequest(loader.kind, key, loader.task, { route: loader.route, trigger: 'revalidate' })))\n },\n subscribe(event, callback) {\n let listeners = routerListeners.get(event)\n if (!listeners) { listeners = new Set(); routerListeners.set(event, listeners) }\n listeners.add(callback)\n return () => listeners?.delete(callback)\n }\n },\n\n destroy(): void {\n if (destroyed) return\n destroyed = true\n navigationId++\n stopHistory()\n guards.length = 0\n routerListeners.clear()\n lazyStates.clear()\n errors.length = 0\n dataRequestContexts.clear()\n currentRoute.dispose()\n viewRevision.dispose()\n }\n }\n\n function ensureLazyState(record: RouteRecord, definition: LazyRouteComponent): LazyState {\n let lazyState = lazyStates.get(record)\n if (!lazyState) {\n lazyState = { status: 'loading' }\n lazyStates.set(record, lazyState)\n void loadRouteComponent(definition).then(component => {\n if (destroyed) return\n lazyState!.status = 'ready'\n lazyState!.component = component\n viewRevision.value++\n emitRouter('route:update', currentRoute.value)\n }).catch(reason => {\n if (destroyed) return\n lazyState!.status = 'error'\n lazyState!.error = toError(reason)\n reportError('lazy', reason, currentRoute.value.fullPath)\n viewRevision.value++\n emitRouter('route:update', currentRoute.value)\n })\n }\n return lazyState\n }\n\n function retryLazyRoutes(records: readonly RouteRecord[]): void {\n for (const record of records) lazyStates.delete(record)\n viewRevision.value++\n }\n\n function ensureActive(): void {\n if (destroyed) throw new Error('Vobs Router: 已销毁的 Router 不能继续使用')\n }\n\n function ensureNavigationIsCurrent(id: number): void {\n if (id !== navigationId) throw new NavigationCancelledError()\n }\n\n return router\n}\n\nexport function RouterView(props: RouterViewProps = {}): VobsNode {\n const router = props.router ?? inject(ROUTER_KEY)\n if (!router) throw new Error('Vobs Router: RouterView 找不到 Router,请安装 routerPlugin')\n\n return createFragment((parent, anchor) => {\n let routeRetry: () => void = () => undefined\n insertBoundary(parent, anchor, {\n resetKey: () => router.currentRoute.value.fullPath,\n onRetry: () => routeRetry(),\n fallback: (error, retry) => {\n router.devtools.reportError('render', error, router.currentRoute.value.fullPath)\n return props.error?.(error, () => { void retry() }) ?? null\n },\n children: () => {\n const route = router.currentRoute.value\n const view = router.getViewState(route)\n routeRetry = view.retry\n if (view.status === 'loading') return props.loading?.() ?? null\n if (view.status === 'not-found') return props.notFound?.(route) ?? null\n if (view.status === 'error') {\n throw view.error ?? new Error('路由组件加载失败')\n }\n if (!view.component) return null\n let node = createComponent(view.component, {\n route,\n params: route.params,\n query: route.query\n })\n for (let index = (view.layouts?.length ?? 0) - 1; index >= 0; index--) {\n node = createComponent(view.layouts![index]!, {\n route,\n params: route.params,\n query: route.query,\n children: node\n })\n }\n return node\n }})\n })\n}\n\nexport function useRouter(): Router {\n const router = inject(ROUTER_KEY)\n if (!router) throw new Error('Vobs Router: useRouter 找不到 Router,请安装 routerPlugin')\n return router\n}\n\nexport function useRoute(): Signal<RouteLocation> {\n return useRouter().currentRoute\n}\n\nexport function routerPlugin(options: RouterPluginOptions = {}): VobsPlugin {\n return {\n name: '@vobs/router',\n version: '0.1.0',\n install(context) {\n const ownedRouter = options.router ? undefined : createRouter({\n routes: options.routes ?? [],\n history: options.history\n })\n const router = options.router ?? ownedRouter!\n context.provide(ROUTER_KEY, router)\n return () => ownedRouter?.destroy()\n }\n }\n}\n\ninterface RouteMatcher {\n readonly record: RouteRecord\n readonly debugId: string\n readonly chain: readonly RouteRecord[]\n readonly meta: RouteMeta\n readonly regex: RegExp\n readonly keys: readonly string[]\n readonly score: number\n readonly order: number\n}\n\ninterface LazyState {\n status: 'loading' | 'ready' | 'error'\n component?: RouteComponent\n error?: Error\n}\n\ninterface ParsedTarget {\n readonly path: string\n readonly query: RouteQuery\n readonly hash: string\n readonly state?: unknown\n}\n\nfunction defaultHistory(): RouterHistory {\n return typeof window === 'undefined' ? createMemoryHistory('/') : createBrowserHistory()\n}\n\nconst EMPTY_MATCHED: readonly RouteRecord[] = Object.freeze([])\nconst routeDebugIds = new WeakMap<RouteRecord, string>()\n\nfunction buildRouteDebugTree(routes: readonly RouteRecord[], lazyStatuses: ReadonlyMap<string, LazyState['status']> = new Map()): readonly RouteDebugNode[] {\n const visit = (records: readonly RouteRecord[], parentPath: string, parentId: string): RouteDebugNode[] => records.map((record, index) => {\n const path = record.path === undefined ? parentPath || '/' : resolveChildPath(parentPath, record.path)\n const id = `${parentId}.${index}`\n const definition = record.component\n const lazyDefinition = definition !== undefined && isLazyRouteComponent(definition)\n const componentName = definition === undefined\n ? 'Route'\n : lazyDefinition\n ? 'lazy(...)'\n : typeof definition === 'function'\n ? definition.name || 'Anonymous'\n : 'Route'\n return {\n id,\n path,\n name: record.name,\n component: componentName,\n source: record.source,\n lazy: lazyDefinition,\n loader: record.loader !== undefined,\n action: record.action !== undefined,\n status: lazyDefinition ? (lazyStatuses.get(id) ?? 'loading') : 'ready',\n meta: Object.freeze({ ...(record.meta ?? {}) }),\n children: visit(record.children ?? [], path, id)\n }\n })\n return Object.freeze(visit(routes, '', 'route'))\n}\n\nfunction normalizeRoutes(routes: readonly RouteRecord[]): RouteMatcher[] {\n const matchers: RouteMatcher[] = []\n let order = 0\n\n function visit(records: readonly RouteRecord[], parentPath: string, parentChain: readonly RouteRecord[], parentMeta: RouteMeta, parentId = 'route'): void {\n records.forEach((record, index) => {\n const debugId = `${parentId}.${index}`\n const children = record.children ?? []\n const path = record.path === undefined\n ? parentPath\n : resolveChildPath(parentPath, record.path)\n const normalized: RouteRecord = {\n ...record,\n path: record.path === undefined\n ? (children.length > 0 ? undefined : (path || '/'))\n : path,\n meta: record.meta ? { ...record.meta } : {}\n }\n routeDebugIds.set(normalized, debugId)\n const chain = [...parentChain, normalized]\n const meta = Object.freeze({ ...parentMeta, ...(normalized.meta ?? {}) })\n if (children.length > 0) {\n visit(children, path, chain, meta, debugId)\n } else if (normalized.component) {\n matchers.push(createMatcher(normalized, chain, meta, order++, debugId))\n } else if (normalized.path === undefined) {\n throw new Error(`Vobs Router: 第 ${index + 1} 个路由缺少 path 或 children`)\n }\n })\n }\n\n visit(routes, '', [], {})\n return matchers\n}\n\nfunction resolveChildPath(parentPath: string, childPath: string): string {\n const normalizedChild = normalizePath(childPath)\n if (!parentPath || normalizedChild === '/') return normalizedChild === '/' ? (parentPath || '/') : normalizedChild\n if (childPath.startsWith('/')) return normalizedChild\n return normalizePath(`${parentPath}/${childPath}`)\n}\n\nfunction createMatcher(record: RouteRecord, chain: readonly RouteRecord[], meta: RouteMeta, order: number, debugId: string): RouteMatcher {\n const path = record.path ?? '/'\n const segments = path === '/' ? [] : path.slice(1).split('/')\n const keys: string[] = []\n let score = 0\n const pattern = segments.map(segment => {\n if (segment === '*') {\n keys.push('pathMatch')\n return '(.*)'\n }\n if (segment.startsWith(':')) {\n const key = segment.slice(1)\n if (!key) throw new Error(`Vobs Router: 路由 ${path} 的参数名不能为空`)\n if (keys.includes(key)) throw new Error(`Vobs Router: 路由 ${path} 存在重复参数 ${key}`)\n keys.push(key)\n score += 1\n return '([^/]+)'\n }\n score += 3\n return escapeRegExp(segment)\n }).join('/')\n\n return {\n record,\n debugId,\n chain: Object.freeze([...chain]),\n meta,\n regex: new RegExp(segments.length === 0 ? '^/?$' : `^/${pattern}/?$`),\n keys,\n score,\n order\n }\n}\n\nfunction compareMatchers(left: RouteMatcher, right: RouteMatcher): number {\n return right.score - left.score || left.order - right.order\n}\n\nfunction extractParams(matcher: RouteMatcher, path: string): RouteParams {\n const match = matcher.regex.exec(path)\n if (!match) return {}\n const params: Record<string, string> = {}\n matcher.keys.forEach((key, index) => {\n params[key] = decodeRoutePart(match[index + 1] ?? '')\n })\n return Object.freeze(params)\n}\n\nfunction parseTargetString(raw: string): ParsedTarget {\n const hashIndex = raw.indexOf('#')\n const hash = hashIndex >= 0 ? normalizeHash(raw.slice(hashIndex + 1)) : ''\n const withoutHash = hashIndex >= 0 ? raw.slice(0, hashIndex) : raw\n const queryIndex = withoutHash.indexOf('?')\n const path = normalizePath(queryIndex >= 0 ? withoutHash.slice(0, queryIndex) : withoutHash)\n const query = queryIndex >= 0 ? parseQuery(withoutHash.slice(queryIndex + 1)) : {}\n return { path, query, hash }\n}\n\nfunction normalizeTarget(target: RouteLocationRaw, matchers: readonly RouteMatcher[]): ParsedTarget {\n let path = target.path\n if (!path && target.name) {\n const matcher = matchers.find(candidate => candidate.record.name === target.name)\n if (!matcher) throw new Error(`Vobs Router: 找不到名为 ${target.name} 的路由`)\n path = fillRouteParams(matcher.record.path ?? '/', target.params ?? {})\n }\n if (!path) throw new Error('Vobs Router: 导航目标必须提供 path 或 name')\n\n const parsed = parseTargetString(path)\n const filledPath = fillRouteParams(parsed.path, target.params ?? {})\n const query = target.query === undefined ? parsed.query : normalizeQuery(target.query)\n const hash = target.hash === undefined ? parsed.hash : normalizeHash(target.hash)\n return { path: filledPath, query, hash, state: target.state }\n}\n\nfunction fillRouteParams(path: string, params: Record<string, unknown>): string {\n return path.replace(/:([A-Za-z0-9_]+)|\\*/g, (token, key: string | undefined) => {\n const value = key ? params[key] : params.pathMatch\n if (value === undefined || value === null) return token\n return encodeURIComponent(String(value))\n })\n}\n\nfunction buildTargetPath(path: string, query: RouteQuery, hash: string): string {\n const params = new URLSearchParams()\n for (const key of Object.keys(query).sort()) {\n const value = query[key]\n if (typeof value === 'string') {\n params.set(key, value)\n } else {\n for (const item of value) params.append(key, item)\n }\n }\n const serialized = params.toString()\n return `${path}${serialized ? `?${serialized}` : ''}${hash}`\n}\n\nfunction parseQuery(raw: string): RouteQuery {\n const params = new URLSearchParams(raw)\n const result: Record<string, RouteQueryValue> = {}\n params.forEach((value, key) => {\n const previous = result[key]\n if (previous === undefined) result[key] = value\n else if (typeof previous === 'string') result[key] = [previous, value]\n else result[key] = [...previous, value]\n })\n for (const key of Object.keys(result)) {\n if (Array.isArray(result[key])) result[key] = Object.freeze(result[key] as string[])\n }\n return Object.freeze(result)\n}\n\nfunction normalizeQuery(input: RouteQueryInput): RouteQuery {\n if (input instanceof URLSearchParams) return parseQuery(input.toString())\n const result: Record<string, RouteQueryValue> = {}\n for (const [key, value] of Object.entries(input)) {\n if (value === undefined || value === null) continue\n if (Array.isArray(value)) result[key] = Object.freeze(value.map(item => String(item)))\n else result[key] = String(value)\n }\n return Object.freeze(result)\n}\n\nfunction normalizePath(path: string): string {\n if (!path) return '/'\n const withoutQuery = path.split(/[?#]/, 1)[0] || '/'\n const withLeadingSlash = withoutQuery.startsWith('/') ? withoutQuery : `/${withoutQuery}`\n if (withLeadingSlash === '/*' || withLeadingSlash === '/') return withLeadingSlash\n return withLeadingSlash.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/'\n}\n\nfunction normalizeHistoryPath(path: string): string {\n const parsed = parseTargetString(path)\n return buildTargetPath(parsed.path, parsed.query, parsed.hash)\n}\n\nfunction normalizeHash(hash: string): string {\n if (!hash) return ''\n return hash.startsWith('#') ? hash : `#${hash}`\n}\n\nfunction normalizeBase(base: string): string {\n if (!base || base === '/') return ''\n return `/${base.replace(/^\\/+|\\/+$/g, '')}`\n}\n\nfunction readBrowserLocation(base: string): string {\n const pathname = window.location.pathname\n const path = base && (pathname === base || pathname.startsWith(`${base}/`))\n ? pathname.slice(base.length) || '/'\n : pathname\n return normalizeHistoryPath(`${path}${window.location.search}${window.location.hash}`)\n}\n\nfunction withBase(path: string, base: string): string {\n return `${base}${path === '/' ? '/' : path}` || '/'\n}\n\nfunction notifyListeners(listeners: Set<(path: string, state: unknown) => void>, path: string, state: unknown): void {\n for (const listener of [...listeners]) listener(path, state)\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction decodeRoutePart(value: string): string {\n try {\n return decodeURIComponent(value)\n } catch {\n return value\n }\n}\n\nfunction isLazyRouteComponent(value: RouteComponentDefinition): value is LazyRouteComponent {\n return typeof value === 'object' && value !== null && value.kind === 'vobs-lazy-route'\n}\n\nfunction isRouteComponentDefinition(value: unknown): value is RouteComponentDefinition {\n return typeof value === 'function' || isLazyRouteComponent(value as RouteComponentDefinition)\n}\n\nasync function loadRouteComponent(loader: LazyRouteComponent): Promise<RouteComponent> {\n const module = await loader.load()\n const component = typeof module === 'function' ? module : module.default\n if (typeof component !== 'function') throw new Error('Vobs Router: 懒加载模块没有默认组件导出')\n return component\n}\n\nfunction isRouteLocationRaw(value: unknown): value is RouteLocationRaw {\n return Boolean(value) && typeof value === 'object'\n}\n\nfunction toError(reason: unknown): Error {\n return reason instanceof Error ? reason : new Error(String(reason))\n}\n\nfunction isAbortError(reason: unknown): boolean {\n return Boolean(reason) && typeof reason === 'object'\n && ((reason as { readonly name?: unknown }).name === 'AbortError'\n || (reason as { readonly code?: unknown }).code === 'ERR_CANCELED')\n}\n","import { createInjectionKey, type VobsPlugin } from '@vobs/vobs'\nimport { ROUTER_KEY, type RouteLocation, type Router } from '@vobs/router'\nimport { createResourceClient, type ResourceClient, type ResourceClientOptions } from './resource'\n\nexport const RESOURCE_KEY = createInjectionKey<ResourceClient>('vobs.resource')\n\nexport interface ResourcePluginOptions extends ResourceClientOptions {\n client?: ResourceClient\n}\n\nexport interface ResourceRoutePrefetchContext {\n readonly route: RouteLocation\n readonly client: ResourceClient\n}\n\nexport type ResourceRoutePrefetch = (\n context: ResourceRoutePrefetchContext\n) => unknown | PromiseLike<unknown>\n\nexport interface ResourceRouterPluginOptions {\n readonly router?: Router\n readonly client?: ResourceClient\n}\n\nexport function resourcePlugin(options: ResourcePluginOptions = {}): VobsPlugin {\n return {\n name: '@vobs/resource',\n version: '0.1.0',\n install(context) {\n const client = options.client ?? createResourceClient(options)\n context.provide(RESOURCE_KEY, client)\n return () => {\n if (!options.client) client.clear()\n }\n }\n }\n}\n\nexport function resourceRouterPlugin(options: ResourceRouterPluginOptions = {}): VobsPlugin {\n return {\n name: '@vobs/resource-router',\n version: '0.1.0',\n install(context) {\n const router = options.router ?? context.inject(ROUTER_KEY)\n const client = options.client ?? context.inject(RESOURCE_KEY)\n if (!router) throw new Error('Vobs Resource Router: 找不到 Router,请安装 routerPlugin 或传入 router')\n if (!client) throw new Error('Vobs Resource Router: 找不到 ResourceClient,请安装 resourcePlugin 或传入 client')\n\n return router.beforeEach(async to => {\n const prefetch = readPrefetch(to)\n await Promise.all(prefetch.map((task, index) => router.devtools.trackDataRequest(\n 'loader',\n `${to.fullPath}#prefetch-${index + 1}`,\n () => task({ route: to, client }),\n { route: to.fullPath, trigger: 'resource' }\n )))\n })\n }\n }\n}\n\nfunction readPrefetch(route: RouteLocation): readonly ResourceRoutePrefetch[] {\n const value = route.meta.prefetch\n if (value === undefined) return []\n if (typeof value === 'function') return [value as ResourceRoutePrefetch]\n if (!Array.isArray(value) || value.some(task => typeof task !== 'function')) {\n throw new Error('Vobs Resource Router: route.meta.prefetch 必须是函数或函数数组')\n }\n return value as ResourceRoutePrefetch[]\n}\n"]}
1
+ {"version":3,"sources":["../src/resource.ts","../src/boundary.ts","../src/plugin.ts"],"sourcesContent":["import { createOwner, effect, getCurrentOwner, state, type Signal } from '@vobs/reactivity'\n\nexport type ResourceKey = readonly unknown[]\nexport type ResourceKeySource = ResourceKey | Signal<ResourceKey> | (() => ResourceKey)\nexport type ResourceFetcher<T> = (signal: AbortSignal) => T | PromiseLike<T>\nexport type ResourceCacheStrategy = 'cache-first' | 'stale-while-revalidate'\n\nexport interface Resource<T> {\n readonly key: ResourceKey | undefined\n readonly data: Signal<T | null>\n readonly error: Signal<Error | null>\n readonly loading: Signal<boolean>\n dispose(): void\n refetch(): Promise<T>\n prefetch(): Promise<T>\n invalidate(): void\n mutate(next: T | ((current: T | null) => T)): void\n optimistic<Result>(\n next: T | ((current: T | null) => T),\n action: () => Result | PromiseLike<Result>\n ): Promise<Result>\n}\n\nexport interface ResourceOptions<T> {\n key?: ResourceKeySource\n fetcher: ResourceFetcher<T>\n staleTime?: number\n cache?: boolean\n strategy?: ResourceCacheStrategy\n retry?: number\n retryDelay?: RetryDelay\n}\n\nexport type RetryDelay = number | ((attempt: number, error: Error) => number)\n\nexport interface ResourceSnapshot<T> {\n readonly data: T | null\n readonly error: Error | null\n readonly loading: boolean\n readonly updatedAt: number\n}\n\nexport interface ResourceDehydratedEntry {\n readonly key: ResourceKey\n readonly data: unknown\n readonly updatedAt: number\n readonly staleTime: number\n}\n\nexport interface ResourceDehydratedState {\n readonly version: 1\n readonly entries: readonly ResourceDehydratedEntry[]\n}\n\nexport interface ResourceClientOptions {\n staleTime?: number\n retry?: number\n retryDelay?: RetryDelay\n onError?: (error: Error, key: ResourceKey | undefined) => void\n}\n\nexport interface ResourceClient {\n resource<T>(fetcher: ResourceFetcher<T>): Resource<T>\n resource<T>(options: ResourceOptions<T>): Resource<T>\n invalidate(key: ResourceKey): void\n prefetchAll(): Promise<void>\n dehydrate(): ResourceDehydratedState\n hydrate(snapshot: unknown): void\n get<T>(key: ResourceKey): ResourceSnapshot<T> | undefined\n clear(): void\n}\n\ninterface ResourceEntry<T> {\n readonly key: ResourceKey | undefined\n readonly data: Signal<T | null>\n readonly error: Signal<Error | null>\n readonly loading: Signal<boolean>\n readonly staleTime: number\n readonly subscribers: Set<object>\n updatedAt: number\n revision: number\n inFlight: Promise<T> | null\n controller: AbortController | null\n}\n\nconst defaultClient = createResourceClient()\n\nexport function resource<T>(fetcher: ResourceFetcher<T>): Resource<T>\nexport function resource<T>(options: ResourceOptions<T>): Resource<T>\nexport function resource<T>(\n optionsOrFetcher: ResourceOptions<T> | ResourceFetcher<T>\n): Resource<T> {\n return typeof optionsOrFetcher === 'function'\n ? defaultClient.resource(optionsOrFetcher)\n : defaultClient.resource(optionsOrFetcher)\n}\n\nexport function createResourceClient(options: ResourceClientOptions = {}): ResourceClient {\n let owner = createOwner()\n const cache = new Map<string, ResourceEntry<unknown>>()\n const entries = new Set<ResourceEntry<unknown>>()\n const defaultStaleTime = validateStaleTime(options.staleTime ?? 0)\n const defaultRetry = validateRetry(options.retry ?? 0)\n const defaultRetryDelay = options.retryDelay ?? 0\n\n function createEntry<T>(key: ResourceKey | undefined, staleTime: number): ResourceEntry<T> {\n const entry: ResourceEntry<T> = owner.run(() => ({\n key,\n data: state<T | null>(null),\n error: state<Error | null>(null),\n loading: state(false),\n staleTime,\n subscribers: new Set(),\n updatedAt: 0,\n revision: 0,\n inFlight: null,\n controller: null\n }))\n owner.onDispose(() => entry.controller?.abort())\n entries.add(entry as ResourceEntry<unknown>)\n return entry\n }\n\n function execute<T>(\n entry: ResourceEntry<T>,\n fetcher: ResourceFetcher<T>,\n retry: number,\n retryDelay: RetryDelay\n ): Promise<T> {\n if (entry.inFlight) return entry.inFlight\n\n entry.loading.value = true\n entry.error.value = null\n const controller = new AbortController()\n entry.controller = controller\n const revision = entry.revision\n const request = requestWithRetry(fetcher, controller.signal, retry, retryDelay)\n entry.inFlight = request.then(\n data => {\n // 请求飞行期间 mutate/optimistic 已推进 revision 时,迟到的旧结果不得覆盖新数据。\n if (entry.revision === revision) {\n entry.revision++\n entry.data.value = data\n entry.error.value = null\n entry.updatedAt = Date.now()\n }\n return data\n },\n reason => {\n const error = toError(reason)\n if (entry.revision === revision) {\n entry.error.value = error\n if (!controller.signal.aborted) options.onError?.(error, entry.key)\n }\n throw error\n }\n ).finally(() => {\n entry.loading.value = false\n if (entry.controller === controller) entry.controller = null\n entry.inFlight = null\n })\n return entry.inFlight\n }\n\n function isFresh(entry: ResourceEntry<unknown>): boolean {\n return entry.updatedAt > 0 && Date.now() - entry.updatedAt <= entry.staleTime\n }\n\n function createResource<T>(\n optionsOrFetcher: ResourceOptions<T> | ResourceFetcher<T>\n ): Resource<T> {\n const config = normalizeOptions(optionsOrFetcher, defaultStaleTime, defaultRetry, defaultRetryDelay)\n if (isReactiveKey(config.key)) return createReactiveResource(config)\n const staticKey = resolveKey(config.key)\n const keyId = config.cache && staticKey ? stableSerialize(staticKey) : undefined\n let entry = keyId ? cache.get(keyId) as ResourceEntry<T> | undefined : undefined\n if (!entry) {\n entry = createEntry(staticKey, config.staleTime)\n if (keyId) cache.set(keyId, entry as ResourceEntry<unknown>)\n }\n\n const request = (force: boolean): Promise<T> => {\n if (entry.inFlight) return entry.inFlight\n if (!force && config.strategy === 'stale-while-revalidate' && entry.data.value !== null) {\n if (!isFresh(entry)) void execute(entry, config.fetcher, config.retry, config.retryDelay).catch(() => undefined)\n return Promise.resolve(entry.data.value as T)\n }\n if (!force && isFresh(entry as ResourceEntry<unknown>)) return Promise.resolve(entry.data.value as T)\n return execute(entry, config.fetcher, config.retry, config.retryDelay)\n }\n\n // Initial failures are represented by error and must not become unhandled rejections.\n void request(false).catch(() => undefined)\n\n const resourceHandle = {}\n entry.subscribers.add(resourceHandle)\n const dispose = (): void => {\n if (!entry?.subscribers.delete(resourceHandle)) return\n if (entry.subscribers.size === 0) entry.controller?.abort()\n }\n getCurrentOwner()?.onDispose(dispose)\n\n return {\n key: staticKey,\n data: entry.data,\n error: entry.error,\n loading: entry.loading,\n dispose,\n refetch: () => request(true),\n prefetch: () => request(false),\n invalidate: () => { entry.updatedAt = 0 },\n mutate(next) {\n const value = typeof next === 'function'\n ? (next as (current: T | null) => T)(entry.data.value)\n : next\n entry.revision++\n entry.data.value = value\n entry.error.value = null\n entry.updatedAt = Date.now()\n },\n optimistic<Result>(\n next: T | ((current: T | null) => T),\n action: () => Result | PromiseLike<Result>\n ): Promise<Result> {\n const previous = {\n data: entry.data.value,\n error: entry.error.value,\n updatedAt: entry.updatedAt\n }\n const value = typeof next === 'function'\n ? (next as (current: T | null) => T)(entry.data.value)\n : next\n const revision = ++entry.revision\n entry.data.value = value\n entry.error.value = null\n entry.updatedAt = Date.now()\n\n let actionResult: Promise<Result>\n try {\n actionResult = Promise.resolve(action())\n } catch (reason) {\n actionResult = Promise.reject(reason)\n }\n return actionResult.catch(reason => {\n const error = toError(reason)\n if (entry.revision === revision) {\n entry.revision++\n entry.data.value = previous.data\n entry.error.value = error\n entry.updatedAt = previous.updatedAt\n options.onError?.(error, entry.key)\n }\n throw error\n })\n }\n }\n\n function createReactiveResource(\n reactiveConfig: ReturnType<typeof normalizeOptions<T>>\n ): Resource<T> {\n const data = state<T | null>(null)\n const error = state<Error | null>(null)\n const loading = state(false)\n const handle = {}\n let activeEntry: ResourceEntry<T> | undefined\n let activeKey: ResourceKey | undefined\n let disposed = false\n\n const sync = (): void => {\n if (!activeEntry) return\n data.value = activeEntry.data.value\n error.value = activeEntry.error.value\n loading.value = activeEntry.loading.value\n }\n\n const switchKey = (nextKey: ResourceKey): void => {\n const keyId = reactiveConfig.cache ? stableSerialize(nextKey) : undefined\n let nextEntry = keyId ? cache.get(keyId) as ResourceEntry<T> | undefined : undefined\n if (!nextEntry) {\n nextEntry = createEntry(nextKey, reactiveConfig.staleTime)\n if (keyId) cache.set(keyId, nextEntry as ResourceEntry<unknown>)\n }\n if (activeEntry === nextEntry) {\n sync()\n return\n }\n if (activeEntry) {\n activeEntry.subscribers.delete(handle)\n if (activeEntry.subscribers.size === 0) activeEntry.controller?.abort()\n }\n activeEntry = nextEntry\n activeKey = nextKey\n activeEntry.subscribers.add(handle)\n sync()\n void request(false).catch(() => undefined)\n }\n\n const stop = effect(() => {\n if (disposed) return\n const nextKey = resolveKey(reactiveConfig.key)\n if (!nextKey) throw new Error('resource: 响应式 key 不能是 undefined')\n switchKey(nextKey)\n sync()\n })\n\n const dispose = (): void => {\n if (disposed) return\n disposed = true\n stop.dispose()\n if (activeEntry) {\n activeEntry.subscribers.delete(handle)\n if (activeEntry.subscribers.size === 0) activeEntry.controller?.abort()\n }\n activeEntry = undefined\n }\n getCurrentOwner()?.onDispose(dispose)\n\n return {\n get key(): ResourceKey | undefined { return activeKey },\n data,\n error,\n loading,\n dispose,\n refetch: () => request(true),\n prefetch: () => request(false),\n invalidate: () => { if (activeEntry) activeEntry.updatedAt = 0 },\n mutate(next) {\n if (!activeEntry) return\n const value = typeof next === 'function'\n ? (next as (current: T | null) => T)(activeEntry.data.value)\n : next\n activeEntry.revision++\n activeEntry.data.value = value\n activeEntry.error.value = null\n activeEntry.updatedAt = Date.now()\n },\n optimistic<Result>(\n next: T | ((current: T | null) => T),\n action: () => Result | PromiseLike<Result>\n ): Promise<Result> {\n if (!activeEntry) return Promise.reject(new Error('resource: key 尚未初始化'))\n return createOptimistic<Result>(activeEntry, next, action)\n }\n }\n\n function request(force: boolean): Promise<T> {\n if (!activeEntry) return Promise.reject(new Error('resource: key 尚未初始化'))\n if (!force && isFresh(activeEntry) && reactiveConfig.strategy === 'cache-first') {\n return Promise.resolve(activeEntry.data.value as T)\n }\n if (!force && reactiveConfig.strategy === 'stale-while-revalidate'\n && activeEntry.data.value !== null) {\n if (!isFresh(activeEntry)) void execute(activeEntry, reactiveConfig.fetcher, reactiveConfig.retry, reactiveConfig.retryDelay)\n .catch(() => undefined)\n return Promise.resolve(activeEntry.data.value as T)\n }\n return execute(activeEntry, reactiveConfig.fetcher, reactiveConfig.retry, reactiveConfig.retryDelay)\n }\n }\n\n function createOptimistic<Result>(\n target: ResourceEntry<T>,\n next: T | ((current: T | null) => T),\n action: () => Result | PromiseLike<Result>\n ): Promise<Result> {\n const previous = { data: target.data.value, error: target.error.value, updatedAt: target.updatedAt }\n const value = typeof next === 'function'\n ? (next as (current: T | null) => T)(target.data.value)\n : next\n const revision = ++target.revision\n target.data.value = value\n target.error.value = null\n target.updatedAt = Date.now()\n return Promise.resolve().then(action).catch(reason => {\n const failure = toError(reason)\n if (target.revision === revision) {\n target.revision++\n target.data.value = previous.data\n target.error.value = failure\n target.updatedAt = previous.updatedAt\n options.onError?.(failure, target.key)\n }\n throw failure\n })\n }\n }\n\n return {\n resource: createResource,\n invalidate(key) {\n const entry = cache.get(stableSerialize(key))\n if (entry) entry.updatedAt = 0\n },\n async prefetchAll() {\n const requests = [...entries]\n .map(entry => entry.inFlight)\n .filter((request): request is Promise<unknown> => request !== null)\n await Promise.allSettled(requests)\n },\n dehydrate() {\n const entries: ResourceDehydratedEntry[] = []\n for (const entry of cache.values()) {\n if (entry.updatedAt <= 0 || entry.error.value) continue\n entries.push({\n key: entry.key ?? [],\n data: entry.data.value,\n updatedAt: entry.updatedAt,\n staleTime: entry.staleTime\n })\n }\n return { version: 1, entries }\n },\n hydrate(snapshot) {\n for (const restored of parseDehydratedState(snapshot).entries) {\n const keyId = stableSerialize(restored.key)\n const entry = cache.get(keyId) as ResourceEntry<unknown> | undefined\n ?? createEntry(restored.key, restored.staleTime)\n entry.data.value = restored.data\n entry.error.value = null\n entry.loading.value = false\n entry.updatedAt = restored.updatedAt\n entry.revision++\n cache.set(keyId, entry)\n }\n },\n get<T>(key: ResourceKey): ResourceSnapshot<T> | undefined {\n const entry = cache.get(stableSerialize(key)) as ResourceEntry<T> | undefined\n if (!entry) return undefined\n return {\n data: entry.data.value,\n error: entry.error.value,\n loading: entry.loading.value,\n updatedAt: entry.updatedAt\n }\n },\n clear() {\n cache.clear()\n entries.clear()\n owner.dispose()\n owner = createOwner()\n }\n }\n}\n\nfunction normalizeOptions<T>(\n optionsOrFetcher: ResourceOptions<T> | ResourceFetcher<T>,\n defaultStaleTime: number,\n defaultRetry: number,\n defaultRetryDelay: RetryDelay\n): Required<Pick<ResourceOptions<T>, 'fetcher' | 'staleTime' | 'cache' | 'strategy' | 'retry' | 'retryDelay'>> & Pick<ResourceOptions<T>, 'key'> {\n if (typeof optionsOrFetcher === 'function') {\n return {\n fetcher: optionsOrFetcher,\n staleTime: defaultStaleTime,\n cache: false,\n strategy: 'cache-first',\n retry: defaultRetry,\n retryDelay: defaultRetryDelay\n }\n }\n return {\n key: optionsOrFetcher.key,\n fetcher: optionsOrFetcher.fetcher,\n staleTime: validateStaleTime(optionsOrFetcher.staleTime ?? defaultStaleTime),\n cache: optionsOrFetcher.cache ?? Boolean(optionsOrFetcher.key),\n strategy: optionsOrFetcher.strategy ?? 'cache-first',\n retry: validateRetry(optionsOrFetcher.retry ?? defaultRetry),\n retryDelay: optionsOrFetcher.retryDelay ?? defaultRetryDelay\n }\n}\n\nfunction isReactiveKey(key: ResourceKeySource | undefined): key is Signal<ResourceKey> | (() => ResourceKey) {\n return typeof key === 'function' || isSignal(key)\n}\n\nfunction isSignal(value: unknown): value is Signal<ResourceKey> {\n return value !== null && typeof value === 'object' && 'value' in value\n && typeof (value as { dispose?: unknown }).dispose === 'function'\n}\n\nfunction resolveKey(source: ResourceKeySource | undefined): ResourceKey | undefined {\n const key = typeof source === 'function'\n ? source()\n : isSignal(source) ? source.value : source\n if (key === undefined) return undefined\n if (!Array.isArray(key)) throw new Error('resource: key 必须是数组')\n return key\n}\n\nfunction requestWithRetry<T>(\n fetcher: ResourceFetcher<T>,\n signal: AbortSignal,\n retry: number,\n retryDelay: RetryDelay\n): Promise<T> {\n let attempt = 0\n const request = (): Promise<T> => Promise.resolve().then(() => fetcher(signal)).catch(reason => {\n const error = toError(reason)\n if (signal.aborted) throw error\n if (attempt++ >= retry) throw error\n const delay = resolveRetryDelay(retryDelay, attempt, error)\n return delay > 0 ? wait(delay).then(request) : request()\n })\n return request()\n}\n\nfunction resolveRetryDelay(retryDelay: RetryDelay, attempt: number, error: Error): number {\n const delay = typeof retryDelay === 'function' ? retryDelay(attempt, error) : retryDelay\n if (!Number.isFinite(delay) || delay < 0) {\n throw new Error('resource: retryDelay 必须是大于等于 0 的有限数字')\n }\n return delay\n}\n\nfunction wait(delay: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, delay))\n}\n\nfunction validateStaleTime(staleTime: number): number {\n if (!Number.isFinite(staleTime) || staleTime < 0) {\n throw new Error('resource: staleTime 必须是大于等于 0 的有限数字')\n }\n return staleTime\n}\n\nfunction validateRetry(retry: number): number {\n if (!Number.isInteger(retry) || retry < 0) {\n throw new Error('resource: retry 必须是大于等于 0 的整数')\n }\n return retry\n}\n\nfunction toError(reason: unknown): Error {\n return reason instanceof Error ? reason : new Error(String(reason))\n}\n\nexport function stableSerialize(value: unknown): string {\n return serialize(value, new Set<object>())\n}\n\nexport function serializeResourceState(snapshot: ResourceDehydratedState): string {\n const serialized = JSON.stringify(snapshot)\n return serialized\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n}\n\nfunction parseDehydratedState(snapshot: unknown): ResourceDehydratedState {\n let value: unknown = snapshot\n if (typeof snapshot === 'string') {\n try {\n value = JSON.parse(snapshot)\n } catch {\n throw new Error('resource: 预取状态不是有效 JSON')\n }\n }\n if (!value || typeof value !== 'object') throw new Error('resource: 预取状态格式无效')\n const candidate = value as { version?: unknown; entries?: unknown }\n if (candidate.version !== 1 || !Array.isArray(candidate.entries)) {\n throw new Error('resource: 预取状态版本或 entries 无效')\n }\n\n const entries: ResourceDehydratedEntry[] = []\n for (const entry of candidate.entries) {\n if (!entry || typeof entry !== 'object') throw new Error('resource: 预取条目格式无效')\n const candidateEntry = entry as Partial<ResourceDehydratedEntry>\n if (!Array.isArray(candidateEntry.key)\n || typeof candidateEntry.updatedAt !== 'number'\n || !Number.isFinite(candidateEntry.updatedAt)\n || typeof candidateEntry.staleTime !== 'number'\n || !Number.isFinite(candidateEntry.staleTime)\n || candidateEntry.staleTime < 0) {\n throw new Error('resource: 预取条目字段无效')\n }\n // Re-serialize now so untrusted keys cannot poison the cache map.\n stableSerialize(candidateEntry.key)\n entries.push({\n key: candidateEntry.key,\n data: candidateEntry.data,\n updatedAt: candidateEntry.updatedAt,\n staleTime: candidateEntry.staleTime\n })\n }\n return { version: 1, entries }\n}\n\nfunction serialize(value: unknown, stack: Set<object>): string {\n if (value === null) return 'null'\n switch (typeof value) {\n case 'string': return `string:${JSON.stringify(value)}`\n case 'boolean': return `boolean:${value}`\n case 'number':\n if (Number.isNaN(value)) return 'number:NaN'\n if (Object.is(value, -0)) return 'number:-0'\n return `number:${value}`\n case 'bigint': return `bigint:${value}`\n case 'undefined': return 'undefined'\n case 'function':\n case 'symbol':\n throw new Error(`resource: key 不能包含 ${typeof value}`)\n case 'object': break\n }\n\n const object = value as object\n if (stack.has(object)) throw new Error('resource: key 不能包含循环引用')\n stack.add(object)\n try {\n if (Array.isArray(object)) {\n return `array:[${object.map(item => serialize(item, stack)).join(',')}]`\n }\n if (object instanceof Date) return `date:${object.toJSON()}`\n if (object instanceof RegExp) return `regexp:${object.toString()}`\n const entries = Object.keys(object).sort().map(key => `${JSON.stringify(key)}:${serialize((object as Record<string, unknown>)[key], stack)}`)\n return `object:{${entries.join(',')}}`\n } finally {\n stack.delete(object)\n }\n}\n","import { createFragment, insertBoundary, type NodeFactory, type VobsNode } from '@vobs/vobs'\nimport type { Resource } from './resource'\n\nexport type ResourceBoundaryChild<T> = (data: T) => ReturnType<NodeFactory>\nexport type ResourceBoundaryView = ReturnType<NodeFactory> | NodeFactory\nexport type ResourceBoundaryFallback = (\n error: Error,\n retry: () => Promise<unknown>\n) => ReturnType<NodeFactory>\n\nexport interface ResourceBoundaryOptions<T> {\n resource: Resource<T>\n children: ResourceBoundaryChild<T>\n loading?: ResourceBoundaryView\n empty?: ResourceBoundaryView\n fallback?: ResourceBoundaryFallback\n}\n\nexport interface ResourceBoundaryProps<T> extends ResourceBoundaryOptions<T> {}\n\n/**\n * Inserts a reactive Resource state branch. The compiler can lower a future\n * ResourceBoundary JSX element to this host-level instruction without a wrapper node.\n */\nexport function insertResourceBoundary<T>(\n parent: Node,\n anchor: Node | null,\n options: ResourceBoundaryOptions<T>\n): void {\n insertBoundary(parent, anchor, {\n onRetry: () => options.resource.refetch(),\n fallback: (error, retry) => options.fallback?.(error, () => Promise.resolve(retry())) ?? null,\n children: () => {\n if (options.resource.error.value) throw options.resource.error.value\n if (options.resource.loading.value) return resolveView(options.loading)\n\n const data = options.resource.data.value\n if (data === null) return resolveView(options.empty)\n return options.children(data)\n }\n })\n}\n\n/** Component-shaped API backed by the same no-wrapper boundary instruction. */\nexport function ResourceBoundary<T>(props: ResourceBoundaryProps<T>): VobsNode {\n return createFragment((parent, anchor) => insertResourceBoundary(parent, anchor, props))\n}\n\nfunction resolveView(view: ResourceBoundaryView | undefined): ReturnType<NodeFactory> {\n if (!view) return null\n return typeof view === 'function' ? view() : view\n}\n","import { createInjectionKey, type VobsPlugin } from '@vobs/vobs'\nimport { ROUTER_KEY, type RouteLocation, type Router } from '@vobs/router'\nimport { createResourceClient, type ResourceClient, type ResourceClientOptions } from './resource'\n\nexport const RESOURCE_KEY = createInjectionKey<ResourceClient>('vobs.resource')\n\nexport interface ResourcePluginOptions extends ResourceClientOptions {\n client?: ResourceClient\n}\n\nexport interface ResourceRoutePrefetchContext {\n readonly route: RouteLocation\n readonly client: ResourceClient\n}\n\nexport type ResourceRoutePrefetch = (\n context: ResourceRoutePrefetchContext\n) => unknown | PromiseLike<unknown>\n\nexport interface ResourceRouterPluginOptions {\n readonly router?: Router\n readonly client?: ResourceClient\n}\n\nexport function resourcePlugin(options: ResourcePluginOptions = {}): VobsPlugin {\n return {\n name: '@vobs/resource',\n version: '0.1.0',\n install(context) {\n const client = options.client ?? createResourceClient(options)\n context.provide(RESOURCE_KEY, client)\n return () => {\n if (!options.client) client.clear()\n }\n }\n }\n}\n\nexport function resourceRouterPlugin(options: ResourceRouterPluginOptions = {}): VobsPlugin {\n return {\n name: '@vobs/resource-router',\n version: '0.1.0',\n install(context) {\n const router = options.router ?? context.inject(ROUTER_KEY)\n const client = options.client ?? context.inject(RESOURCE_KEY)\n if (!router) throw new Error('Vobs Resource Router: 找不到 Router,请安装 routerPlugin 或传入 router')\n if (!client) throw new Error('Vobs Resource Router: 找不到 ResourceClient,请安装 resourcePlugin 或传入 client')\n\n return router.beforeEach(async to => {\n const prefetch = readPrefetch(to)\n await Promise.all(prefetch.map((task, index) => router.devtools.trackDataRequest(\n 'loader',\n `${to.fullPath}#prefetch-${index + 1}`,\n () => task({ route: to, client }),\n { route: to.fullPath, trigger: 'resource' }\n )))\n })\n }\n }\n}\n\nfunction readPrefetch(route: RouteLocation): readonly ResourceRoutePrefetch[] {\n const value = route.meta.prefetch\n if (value === undefined) return []\n if (typeof value === 'function') return [value as ResourceRoutePrefetch]\n if (!Array.isArray(value) || value.some(task => typeof task !== 'function')) {\n throw new Error('Vobs Resource Router: route.meta.prefetch 必须是函数或函数数组')\n }\n return value as ResourceRoutePrefetch[]\n}\n"],"mappings":"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","names":["keyId","request","dispose","entries"]}