@lytjs/reactivity 6.5.0 → 6.6.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/signal.ts","../src/effect-scope.ts","../src/effect.ts","../src/shared.ts","../src/reactive.ts","../src/ref.ts","../src/computed.ts","../src/watch.ts","../src/batch.ts","../src/index.ts"],"names":["signalFn","computedFn","it","next","REACTIVITY_MAX_TRIGGER_DEPTH","readonlyFn","effect","error","unsafeCast","isSymbol","isObject","isMap","isSet","isReadonly","hasOwn","hasChanged","result","ref","set","computed","isFunction","NOOP","isArray","queuePostFlushCb","queuePreFlushCb"],"mappings":"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","file":"index.cjs","sourcesContent":["// src/constants.ts\r\n// 内部符号常量\r\n\r\n// DEV 检测方式说明:\r\n// 统一使用 typeof 检测方式,兼容编译时 define/replace 替换和未配置构建替换的场景。\r\n// 当打包工具(如 rollup/esbuild)通过 define 插件将 __DEV__ 替换为字面量 true/false 时,\r\n// typeof 检测会被优化为直接的字面量判断,实现死代码消除(DCE)。\r\n// 当未配置构建替换时,typeof 检测也能安全降级为 false,避免 ReferenceError。\r\nconst DEV = typeof __DEV__ !== 'undefined' ? __DEV__ : false;\r\n\r\nexport const RefSymbol: unique symbol = Symbol(DEV ? 'ref' : undefined);\r\nexport const ShallowRefSymbol: unique symbol = Symbol(DEV ? 'shallow_ref' : undefined);\r\nexport const ComputedRefSymbol: unique symbol = Symbol(DEV ? 'computed_ref' : undefined);\r\nexport const ReactiveSymbol: unique symbol = Symbol(DEV ? 'reactive' : undefined);\r\nexport const ReadonlySymbol: unique symbol = Symbol(DEV ? 'readonly' : undefined);\r\nexport const SignalSymbol: unique symbol = Symbol(DEV ? 'signal' : undefined);\r\nexport const ComputedSignalSymbol: unique symbol = Symbol(DEV ? 'computed_signal' : undefined);\r\n\r\n// ReactiveFlags - 用于 Proxy handler 内部标记\r\nexport const ReactiveFlags = {\r\n IS_REACTIVE: '__v_isReactive',\r\n IS_READONLY: '__v_isReadonly',\r\n IS_SHALLOW: '__v_isShallow',\r\n IS_REF: '__v_isRef',\r\n RAW: '__v_raw',\r\n SKIP: '__v_skip',\r\n} as const;\r\n\r\n// Track/Trigger 操作类型\r\nexport const TrackOpTypes = {\r\n GET: 'get',\r\n HAS: 'has',\r\n ITERATE: 'iterate',\r\n} as const;\r\n\r\nexport const TriggerOpTypes = {\r\n SET: 'set',\r\n ADD: 'add',\r\n DELETE: 'delete',\r\n CLEAR: 'clear',\r\n} as const;\r\n\r\n// 内部共享常量\r\nexport const ITERATE_KEY = Symbol('iterate');\r\n","/**\r\n * @lytjs/reactivity - Signal\r\n * 独立自包含的 Signal 响应式原语。\r\n * 拥有独立的订阅/通知机制,同时桥接 effect 系统保持互操作性。\r\n */\r\n\r\nimport { SignalSymbol, ComputedSignalSymbol, TrackOpTypes, TriggerOpTypes } from './constants';\r\nimport { track, trigger } from './effect';\r\nimport { REACTIVITY_MAX_TRIGGER_DEPTH } from '@lytjs/common-constants';\r\nimport type { Subscriber } from './shared/types';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** 订阅者回调 */\r\nexport type { Subscriber };\r\n\r\n/** Signal 只读接口 */\r\nexport interface Signal<T = unknown> {\r\n /** 读取当前值 */\r\n (): T;\r\n readonly [SignalSymbol]: true;\r\n}\r\n\r\n/** WritableSignal 可写接口 */\r\nexport interface WritableSignal<T = unknown> extends Signal<T> {\r\n /** 设置新值 */\r\n set(newValue: T): void;\r\n /** 通过 updater 函数更新值 */\r\n update(updater: (prev: T) => T): void;\r\n /** 停止所有订阅通知,释放资源 */\r\n dispose(): void;\r\n /** @internal 订阅变更通知 */\r\n _subscribe(subscriber: Subscriber): () => void;\r\n /** FIX: P1-5 REACTIVITY-NEW-03 - 手动清理依赖,防止内存泄漏 */\r\n cleanup(): void;\r\n}\r\n\r\n/** ComputedSignal 计算信号接口 */\r\nexport interface ComputedSignal<T = unknown> extends Signal<T> {\r\n /** 停止计算信号的依赖追踪和更新 */\r\n dispose(): void;\r\n /** @deprecated 使用 dispose() */\r\n stop?: () => void;\r\n readonly [ComputedSignalSymbol]: true;\r\n}\r\n\r\n/** WritableComputedSignal 可写计算信号接口 */\r\nexport interface WritableComputedSignal<T = unknown> extends ComputedSignal<T> {\r\n /** 设置新值(通过 setter 函数) */\r\n set(newValue: T): void;\r\n}\r\n\r\n/** ReadonlySignal 只读信号接口 */\r\nexport interface ReadonlySignal<T = unknown> {\r\n /** 读取当前值 */\r\n (): T;\r\n readonly [SignalSymbol]: true;\r\n}\r\n\r\n// ============================================================\r\n// 全局追踪状态\r\n// ============================================================\r\n\r\n/** 当前活跃的订阅者(computed 读取 signal 时自动追踪) */\r\nlet activeSubscriber: Subscriber | null = null;\r\n\r\n/** 是否处于 untrack 模式 */\r\nlet isUntracked = false;\r\n\r\n/** 依赖追踪回调:computed 使用此回调记录 signal 依赖关系 */\r\nlet trackDependency: ((signal: WritableSignal<unknown>, unsubscribe: () => void) => void) | null =\r\n null;\r\n\r\n/** 当前 batch 嵌套深度 */\r\nlet batchDepth = 0;\r\n\r\n/** FIX: P2-05 batch 嵌套深度限制,防止无限递归 */\r\nconst MAX_BATCH_DEPTH = 100;\r\n\r\n/** batch 期间待通知的订阅者 */\r\nconst pendingNotifications = new Set<Subscriber>();\r\n\r\n/** batch 期间待执行的 effect 系统 trigger 操作(自动去重) */\r\n// FIX: P1-05 使用 Map<symbol,...> 替代 Map<string,...>,\r\n// 避免不同 signal 的 Symbol().toString() 产生相同的字符串 key 导致去重错误\r\n// FIX: P2-7 去重时保留最新 newValue:当同一个 signalKey 多次 set 时,\r\n// Map.set 会覆盖旧值,确保最终 trigger 使用最新的 newValue,\r\n// 避免因去重导致订阅者收到过期的旧值。\r\nconst pendingTriggerOps = new Map<\r\n symbol,\r\n { store: Record<symbol, unknown>; signalKey: symbol; newValue?: unknown }\r\n>();\r\n\r\n/** 是否正在执行通知 */\r\nlet isNotifying = false;\r\n\r\n// ============================================================\r\n// signal — 核心 Signal 原语\r\n// ============================================================\r\n\r\n/**\r\n * 创建一个可写 Signal。\r\n * 使用闭包变量存储值,Set 管理订阅者。\r\n */\r\nexport function signal<T>(initialValue: T): WritableSignal<T> {\r\n let value = initialValue;\r\n const subscribers = new Set<Subscriber>();\r\n let disposed = false;\r\n\r\n // effect 系统桥接:使用 store 对象作为 track/trigger 的 target\r\n const store: Record<symbol, T> = {};\r\n const SIGNAL_KEY = Symbol('signal_value');\r\n store[SIGNAL_KEY] = initialValue;\r\n\r\n const signalFn = function signalFn(): T {\r\n // Signal 内部追踪\r\n // FIX: P0-01 闭包捕获过期 activeSubscriber — 立即捕获当前订阅者引用,\r\n // 避免闭包中的 activeSubscriber 在异步回调中被修改后指向错误的订阅者\r\n const currentSubscriber = activeSubscriber;\r\n if (currentSubscriber && !isUntracked && !disposed) {\r\n if (!subscribers.has(currentSubscriber)) {\r\n subscribers.add(currentSubscriber);\r\n if (trackDependency) {\r\n trackDependency(signalFn as WritableSignal<unknown>, () => {\r\n subscribers.delete(currentSubscriber);\r\n });\r\n }\r\n }\r\n }\r\n // effect 系统桥接追踪\r\n if (!disposed) {\r\n track(store, TrackOpTypes.GET, SIGNAL_KEY);\r\n }\r\n return value;\r\n } as WritableSignal<T>;\r\n\r\n Object.defineProperty(signalFn, SignalSymbol, { value: true });\r\n\r\n signalFn.set = (newValue: T): void => {\r\n if (disposed) return;\r\n if (Object.is(newValue, value)) return;\r\n value = newValue;\r\n store[SIGNAL_KEY] = newValue;\r\n notifySubscribers(subscribers, store, SIGNAL_KEY, newValue);\r\n };\r\n\r\n signalFn.update = (updater: (prev: T) => T): void => {\r\n if (disposed) return;\r\n const newValue = updater(value);\r\n if (Object.is(newValue, value)) return;\r\n value = newValue;\r\n store[SIGNAL_KEY] = newValue;\r\n notifySubscribers(subscribers, store, SIGNAL_KEY, newValue);\r\n };\r\n\r\n signalFn.dispose = (): void => {\r\n disposed = true;\r\n subscribers.clear();\r\n };\r\n\r\n // FIX: P1-5 REACTIVITY-NEW-03 - 添加 cleanup 方法,允许手动清理依赖\r\n signalFn.cleanup = (): void => {\r\n // 清理所有订阅者,但保持 signal 可用\r\n subscribers.clear();\r\n // 清理 effect 系统桥接的依赖:直接触发 SET 通知使依赖失效,\r\n // 不传旧值以避免读取 signal 值\r\n trigger(store, TriggerOpTypes.SET, SIGNAL_KEY);\r\n };\r\n\r\n signalFn._subscribe = (subscriber: Subscriber): (() => void) => {\r\n if (disposed) return () => {};\r\n subscribers.add(subscriber);\r\n return () => subscribers.delete(subscriber);\r\n };\r\n\r\n return signalFn;\r\n}\r\n\r\n// ============================================================\r\n// computed — 独立计算信号\r\n// ============================================================\r\n\r\n/**\r\n * 内部工厂函数:创建计算信号的核心逻辑。\r\n * computed 和 writableComputedSignal 共享此实现,消除约 80 行重复代码。\r\n */\r\nfunction createComputedSignalInternal<T>(\r\n getter: () => T,\r\n typeName: string,\r\n): {\r\n computedFn: ComputedSignal<T>;\r\n invalidate: () => void;\r\n dispose: () => void;\r\n} {\r\n let value: T | undefined;\r\n let dirty = true;\r\n let isComputing = false;\r\n const dependencies = new Map<WritableSignal<unknown>, () => void>();\r\n const subscribers = new Set<Subscriber>();\r\n let disposed = false;\r\n\r\n // effect 系统桥接:使用 store 对象作为 track/trigger 的 target\r\n const store: Record<symbol, unknown> = {};\r\n const COMPUTED_SIGNAL_KEY = Symbol('computed_signal_value');\r\n\r\n const invalidate = (): void => {\r\n if (disposed) return;\r\n dirty = true;\r\n // effect 系统桥接触发\r\n trigger(store, TriggerOpTypes.SET, COMPUTED_SIGNAL_KEY);\r\n const subs = Array.from(subscribers);\r\n for (const sub of subs) {\r\n sub();\r\n }\r\n };\r\n\r\n const computedFn = function computedFn(): T {\r\n if (disposed) return value as T;\r\n\r\n // effect 系统桥接追踪\r\n track(store, TrackOpTypes.GET, COMPUTED_SIGNAL_KEY);\r\n\r\n // 追踪:如果有活跃订阅者,注册自身\r\n if (activeSubscriber && !isUntracked) {\r\n subscribers.add(activeSubscriber);\r\n }\r\n\r\n if (dirty) {\r\n if (isComputing) {\r\n throw new Error(`[lytjs/signal] Circular dependency detected in ${typeName}.`);\r\n }\r\n isComputing = true;\r\n try {\r\n // 清理旧依赖(调用 unsubscribe 函数)\r\n for (const unsubscribe of dependencies.values()) {\r\n unsubscribe();\r\n }\r\n dependencies.clear();\r\n\r\n // 在活跃订阅者上下文中执行 getter,自动追踪新依赖\r\n const prevSubscriber = activeSubscriber;\r\n const prevTrackDependency = trackDependency;\r\n activeSubscriber = invalidate; // 注册 invalidate 作为依赖的订阅者\r\n trackDependency = (dep: WritableSignal<unknown>, unsubscribe: () => void) => {\r\n dependencies.set(dep, unsubscribe);\r\n };\r\n try {\r\n value = getter();\r\n dirty = false;\r\n } finally {\r\n activeSubscriber = prevSubscriber;\r\n trackDependency = prevTrackDependency;\r\n }\r\n } finally {\r\n isComputing = false;\r\n }\r\n }\r\n\r\n return value as T;\r\n } as ComputedSignal<T>;\r\n\r\n Object.defineProperty(computedFn, ComputedSignalSymbol, { value: true });\r\n\r\n const dispose = (): void => {\r\n disposed = true;\r\n for (const unsubscribe of dependencies.values()) {\r\n unsubscribe();\r\n }\r\n dependencies.clear();\r\n subscribers.clear();\r\n };\r\n\r\n return { computedFn, invalidate, dispose };\r\n}\r\n\r\n/**\r\n * 创建一个计算信号。\r\n * 惰性求值、自动依赖追踪与清理、循环依赖检测。\r\n */\r\nexport function computed<T>(fn: () => T): ComputedSignal<T> {\r\n const { computedFn, dispose } = createComputedSignalInternal(fn, 'computed signal');\r\n\r\n computedFn.dispose = dispose;\r\n computedFn.stop = dispose;\r\n\r\n return computedFn;\r\n}\r\n\r\n// ============================================================\r\n// writableComputed — 可写计算信号\r\n// ============================================================\r\n\r\n/**\r\n * 创建一个可写计算信号。\r\n * 通过 getter 读取计算值,通过 setter 写入值。\r\n * setter 通常会间接更新 getter 依赖的底层 signal。\r\n */\r\nexport function writableComputedSignal<T>(\r\n getter: () => T,\r\n setter: (value: T) => void,\r\n): WritableComputedSignal<T> {\r\n const { computedFn, dispose } = createComputedSignalInternal(getter, 'writable computed signal');\r\n\r\n (computedFn as WritableComputedSignal<T>).set = (newValue: T): void => {\r\n setter(newValue);\r\n };\r\n\r\n computedFn.dispose = dispose;\r\n computedFn.stop = dispose;\r\n\r\n return computedFn as WritableComputedSignal<T>;\r\n}\r\n\r\n// ============================================================\r\n// batch — 批量更新\r\n// ============================================================\r\n\r\n/**\r\n * 在批处理中执行函数。\r\n * batch 内多次 signal.set 只在函数结束后统一触发一次通知。\r\n */\r\nexport function signalBatch(fn: () => void): void {\r\n // FIX: P2-05 batch 嵌套深度限制\r\n if (batchDepth >= MAX_BATCH_DEPTH) {\r\n if (__DEV__) {\r\n console.warn(\r\n `[lytjs/signal] signalBatch() nesting depth exceeded ${MAX_BATCH_DEPTH}. ` +\r\n `This may indicate an infinite loop. The batch call will be executed synchronously.`,\r\n );\r\n }\r\n fn();\r\n return;\r\n }\r\n batchDepth++;\r\n try {\r\n fn();\r\n } finally {\r\n batchDepth--;\r\n if (batchDepth === 0) {\r\n flushPendingNotifications();\r\n }\r\n }\r\n}\r\n\r\n// ============================================================\r\n// untrack — 取消追踪\r\n// ============================================================\r\n\r\n/**\r\n * 在取消追踪模式中执行函数。\r\n * 函数内读取 signal 不会建立依赖关系。\r\n */\r\nexport function signalUntrack<T>(fn: () => T): T {\r\n const prevIsUntracked = isUntracked;\r\n isUntracked = true;\r\n try {\r\n return fn();\r\n } finally {\r\n isUntracked = prevIsUntracked;\r\n }\r\n}\r\n\r\n/** @internal 检查当前是否处于 untrack 模式(供 effect 系统桥接使用) */\r\nexport function _isSignalUntracked(): boolean {\r\n return isUntracked;\r\n}\r\n\r\n// ============================================================\r\n// 内部通知机制\r\n// ============================================================\r\n\r\nfunction notifySubscribers(\r\n subscribers: Set<Subscriber>,\r\n store?: Record<symbol, unknown>,\r\n signalKey?: symbol,\r\n newValue?: unknown,\r\n): void {\r\n // FIX: P0-02 当 isNotifying 为 true 时也走 batch 路径,\r\n // 避免在 flushPendingNotifications 执行期间嵌套触发同步通知导致无限递归\r\n if (batchDepth > 0 || isNotifying) {\r\n const it = subscribers.values();\r\n let next = it.next();\r\n while (!next.done) {\r\n pendingNotifications.add(next.value);\r\n next = it.next();\r\n }\r\n // effect 系统桥接:batch 期间也延迟 trigger(去重)\r\n if (store && signalKey !== undefined) {\r\n // FIX: P1-05 直接使用 symbol 作为 key,避免 String() 转换导致的 key 冲突\r\n pendingTriggerOps.set(signalKey, { store, signalKey, newValue });\r\n }\r\n return;\r\n }\r\n const it = subscribers.values();\r\n let next = it.next();\r\n while (!next.done) {\r\n next.value();\r\n next = it.next();\r\n }\r\n // effect 系统桥接触发\r\n if (store && signalKey !== undefined) {\r\n trigger(store, TriggerOpTypes.SET, signalKey, newValue);\r\n }\r\n}\r\n\r\nfunction flushPendingNotifications(): void {\r\n if (isNotifying) return;\r\n isNotifying = true;\r\n try {\r\n let iterations = 0;\r\n while ((pendingNotifications.size > 0 || pendingTriggerOps.size > 0) && iterations < REACTIVITY_MAX_TRIGGER_DEPTH) {\r\n const notifications = new Set(pendingNotifications);\r\n const triggers = new Set(pendingTriggerOps.values());\r\n pendingNotifications.clear();\r\n pendingTriggerOps.clear();\r\n \r\n const notifIt = notifications.values();\r\n let notifNext = notifIt.next();\r\n while (!notifNext.done) {\r\n notifNext.value();\r\n notifNext = notifIt.next();\r\n }\r\n \r\n // 执行延迟的 effect 系统 trigger(已去重)\r\n const triggerIt = triggers.values();\r\n let triggerNext = triggerIt.next();\r\n while (!triggerNext.done) {\r\n const { store, signalKey, newValue } = triggerNext.value;\r\n trigger(store, TriggerOpTypes.SET, signalKey, newValue);\r\n triggerNext = triggerIt.next();\r\n }\r\n \r\n iterations++;\r\n }\r\n } finally {\r\n isNotifying = false;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 适配器层 — 旧 API 兼容\r\n// ============================================================\r\n\r\n/**\r\n * @deprecated 使用 computed() 代替\r\n */\r\nexport function computedSignal<T>(fn: () => T): ComputedSignal<T> {\r\n return computed(fn);\r\n}\r\n\r\n/** 读取 signal 值 */\r\nexport function valueOf<T>(sig: Signal<T>): T {\r\n return sig();\r\n}\r\n\r\n/** 设置 signal 值(适配器) */\r\nexport function set<T>(sig: WritableSignal<T> | ReadonlySignal<T>, newValue: T): void {\r\n // FIX: P2-35 使用类型守卫检查是否为 WritableSignal\r\n if (isWritableSignal(sig)) {\r\n sig.set(newValue);\r\n }\r\n // ReadonlySignal: 静默忽略(保持旧行为)\r\n}\r\n\r\n/** 类型守卫:检查信号是否为可写信号 */\r\nfunction isWritableSignal<T>(sig: WritableSignal<T> | ReadonlySignal<T>): sig is WritableSignal<T> {\r\n return typeof sig === 'function' && 'set' in sig;\r\n}\r\n\r\n/** 通过 updater 更新 signal 值(适配器) */\r\nexport function update<T>(sig: WritableSignal<T>, updater: (prev: T) => T): void {\r\n sig.update(updater);\r\n}\r\n\r\n/** 创建只读 signal(适配器) */\r\nexport function readonlySignal<T>(sig: Signal<T>): ReadonlySignal<T> {\r\n const readonlyFn = function readonlyFn(): T {\r\n return sig();\r\n } as ReadonlySignal<T>;\r\n Object.defineProperty(readonlyFn, SignalSymbol, { value: true });\r\n return readonlyFn;\r\n}\r\n\r\n// ============================================================\r\n// 调试/测试 API\r\n// ============================================================\r\n\r\n/** @internal 获取当前活跃订阅者(仅用于测试) */\r\nexport function _getActiveSubscriber(): Subscriber | null {\r\n return activeSubscriber;\r\n}\r\n\r\n/** @internal 获取 batch 深度(仅用于测试) */\r\nexport function _getBatchDepth(): number {\r\n return batchDepth;\r\n}\r\n\r\n/** @internal 获取待通知订阅者数量(仅用于测试) */\r\nexport function _getPendingNotificationsCount(): number {\r\n return pendingNotifications.size;\r\n}\r\n\r\n/** @internal 重置全局状态(仅用于测试) */\r\nexport function _resetSignalGlobalState(): void {\r\n activeSubscriber = null;\r\n isUntracked = false;\r\n batchDepth = 0;\r\n pendingNotifications.clear();\r\n isNotifying = false;\r\n // FIX: P1-4 REACTIVITY-NEW-05 - 遗漏 pendingTriggerOps 清理\r\n // 确保测试间状态完全隔离,避免 pendingTriggerOps 泄漏导致测试不稳定\r\n pendingTriggerOps.clear();\r\n}\r\n","// src/effect-scope.ts\r\n// Vue 3 风格的 effectScope API\r\n// 用于批量管理响应式副作用的创建和销毁\r\n\r\nimport type { EffectScopeEntry } from './effect-scope-registrar';\r\nimport { warn, error } from '@lytjs/common-error';\r\nimport { unsafeCast } from '@lytjs/common-assertions';\r\n\r\nexport interface EffectScope {\r\n /** 当前 scope 是否活跃 */\r\n active: boolean;\r\n /** scope 收集的 effects */\r\n effects: EffectScopeEntry[];\r\n /** scope 注册的清理回调 */\r\n cleanups: (() => void)[];\r\n /** 父 scope(嵌套时自动关联) */\r\n parent: EffectScope | undefined;\r\n /** 是否脱离父 scope(detached scope 不会被父 scope stop) */\r\n detached: boolean;\r\n /** 在 scope 上下文中执行 fn,期间创建的 effect 会被自动收集 */\r\n run<T>(fn: () => T): T | undefined;\r\n /** 停止 scope,清理所有收集的 effects 和 cleanups */\r\n stop(): void;\r\n}\r\n\r\nexport interface EffectScopeOptions {\r\n detached?: boolean;\r\n}\r\n\r\n/** 当前活跃的 effectScope(唯一来源) */\r\nlet activeEffectScope: EffectScope | undefined;\r\n\r\n/** 获取当前活跃的 effectScope */\r\nexport function getActiveEffectScope(): EffectScope | undefined {\r\n return activeEffectScope;\r\n}\r\n\r\n/** 设置当前活跃的 effectScope */\r\nexport function setActiveEffectScope(scope: EffectScope | undefined): void {\r\n activeEffectScope = scope;\r\n}\r\n\r\n/**\r\n * 创建一个 effect scope,用于批量管理响应式副作用。\r\n *\r\n * @param options - 配置选项。支持传入 boolean(兼容旧 API)或 EffectScopeOptions 对象。\r\n * @returns EffectScope 实例\r\n *\r\n * @example\r\n * ```ts\r\n * const scope = effectScope()\r\n * scope.run(() => {\r\n * const count = ref(0)\r\n * watch(count, () => console.log(count.value))\r\n * })\r\n * // 不再需要时一次性停止所有副作用\r\n * scope.stop()\r\n * ```\r\n */\r\nexport function effectScope(options?: boolean | EffectScopeOptions): EffectScope {\r\n const detached = typeof options === 'boolean' ? options : options?.detached;\r\n const scope: EffectScope = {\r\n active: true,\r\n effects: [],\r\n cleanups: [],\r\n parent: activeEffectScope,\r\n detached: !!detached,\r\n\r\n run(fn) {\r\n if (!this.active) {\r\n if (__DEV__) {\r\n warn(`EffectScope is not active. Cannot run fn.`);\r\n }\r\n return;\r\n }\r\n const prevScope = activeEffectScope;\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n activeEffectScope = this;\r\n try {\r\n return fn();\r\n } finally {\r\n activeEffectScope = prevScope;\r\n }\r\n },\r\n\r\n stop() {\r\n if (!this.active) return;\r\n this.active = false;\r\n for (const effect of this.effects) {\r\n try {\r\n effect.stop();\r\n } catch (e) {\r\n error(`Error stopping effect in scope: ${String(e)}`);\r\n }\r\n }\r\n for (const cleanup of this.cleanups) {\r\n try {\r\n cleanup();\r\n } catch (e) {\r\n error(`Error running cleanup in scope: ${String(e)}`);\r\n }\r\n }\r\n if (this.parent) {\r\n const idx = this.parent.effects.indexOf(unsafeCast<EffectScopeEntry>(this));\r\n if (idx !== -1) {\r\n this.parent.effects.splice(idx, 1);\r\n }\r\n }\r\n this.effects.length = 0;\r\n this.cleanups.length = 0;\r\n this.parent = undefined;\r\n },\r\n } as EffectScope;\r\n\r\n if (!scope.detached && activeEffectScope) {\r\n // 双重断言是必要的:EffectScope 对象字面量实现了 EffectScopeEntry 所需的\r\n // stop() 方法,但 TypeScript 无法自动推断对象字面量满足联合类型。\r\n // EffectScopeEntry = ReactiveEffect | EffectScope,此处 scope 是 EffectScope 实例。\r\n activeEffectScope.effects.push(unsafeCast<EffectScopeEntry>(scope));\r\n }\r\n\r\n return scope;\r\n}\r\n\r\n/**\r\n * 获取当前活跃的 effectScope。\r\n */\r\nexport function getCurrentScope(): EffectScope | undefined {\r\n return activeEffectScope;\r\n}\r\n\r\n/**\r\n * 在当前活跃的 effectScope 中注册一个清理回调。\r\n * 当 scope 被 stop 时,所有注册的回调会被执行。\r\n *\r\n * @param fn - 清理回调函数\r\n *\r\n * @example\r\n * ```ts\r\n * const scope = effectScope()\r\n * scope.run(() => {\r\n * onScopeDispose(() => {\r\n * console.log('scope disposed')\r\n * })\r\n * })\r\n * scope.stop() // 输出: scope disposed\r\n * ```\r\n */\r\nexport function onScopeDispose(fn: () => void): void {\r\n if (activeEffectScope) {\r\n activeEffectScope.cleanups.push(fn);\r\n } else if (__DEV__) {\r\n warn(\r\n 'onScopeDispose() was called when there was no active effect scope to be associated with.',\r\n );\r\n }\r\n}\r\n","// src/effect.ts\r\n// 响应式副作用系统核心\r\n\r\nimport { ITERATE_KEY } from './constants';\r\nimport type { ReactiveEffectRunner } from './types';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { _isSignalUntracked } from './signal';\r\nimport { getActiveEffectScope } from './effect-scope';\r\nimport { REACTIVITY_MAX_TRIGGER_DEPTH } from '@lytjs/common-constants';\r\n\r\n// ==================== 全局状态 ====================\r\n\r\nlet activeEffect: ReactiveEffect | undefined;\r\nlet _trackDepth = 0;\r\nconst targetMap = new WeakMap<object, Map<string | symbol, Dep>>();\r\nlet shouldTrack = true;\r\nconst trackStack: boolean[] = [];\r\n\r\n// ==================== 首次渲染优化 ====================\r\n\r\n/** 标记当前是否处于首次渲染优化期间 */\r\nlet isFirstRenderPass = false;\r\n\r\n/** 记录被跳过的追踪次数(用于调试和测试验证) */\r\nlet skippedTrackingCount = 0;\r\n\r\n/**\r\n * 包裹首次渲染过程,期间禁用响应式依赖收集。\r\n * 支持嵌套调用:如果外层已经处于首次渲染优化期间,\r\n * 内层调用不会提前重置标志位。\r\n */\r\nexport function withFirstRenderOptimization<T>(fn: () => T): T {\r\n const wasFirstRender = isFirstRenderPass;\r\n isFirstRenderPass = true;\r\n try {\r\n return fn();\r\n } finally {\r\n if (!wasFirstRender) {\r\n isFirstRenderPass = false;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 检查当前是否应跳过响应式依赖收集。\r\n * 在 withFirstRenderOptimization 执行期间返回 true。\r\n */\r\nexport function shouldSkipTracking(): boolean {\r\n return isFirstRenderPass;\r\n}\r\n\r\n/**\r\n * 获取被跳过的追踪次数(用于调试和测试)。\r\n */\r\nexport function getSkippedTrackingCount(): number {\r\n return skippedTrackingCount;\r\n}\r\n\r\n/**\r\n * 重置被跳过的追踪计数(用于测试)。\r\n */\r\nexport function resetSkippedTrackingCount(): void {\r\n skippedTrackingCount = 0;\r\n}\r\n\r\n// 只读访问器,防止外部修改内部状态\r\n\r\n/**\r\n * 获取当前活跃的 ReactiveEffect 实例。\r\n * 在 effect 执行期间返回当前正在运行的 effect,否则返回 undefined。\r\n *\r\n * @returns 当前活跃的 effect,如果没有则返回 undefined\r\n */\r\nexport function getActiveEffect(): ReactiveEffect | undefined {\r\n return activeEffect;\r\n}\r\n\r\n/**\r\n * 获取当前是否应该进行依赖追踪。\r\n * 可通过 pauseTracking/enableTracking 控制。\r\n *\r\n * @returns 是否应该进行依赖追踪\r\n */\r\nexport function getShouldTrack(): boolean {\r\n return shouldTrack;\r\n}\r\n\r\n// ==================== Dep ====================\r\n\r\n/**\r\n * 依赖集合类型,存储订阅某个响应式属性的所有 ReactiveEffect。\r\n */\r\nexport type Dep = Set<ReactiveEffect>;\r\n\r\n/**\r\n * 创建一个新的 Dep(依赖集合)。\r\n *\r\n * @returns 新的空 Dep 实例\r\n */\r\nexport const createDep = (): Dep => {\r\n return new Set() as Dep;\r\n};\r\n\r\n// ==================== Track / Trigger ====================\r\n\r\n/**\r\n * Maximum depth for nested trigger() calls to prevent infinite reactivity loops.\r\n * When triggerDepth exceeds this limit, further triggers are silently dropped\r\n * and a warning is emitted in DEV mode.\r\n */\r\nlet triggerDepth = 0;\r\n\r\n/**\r\n * 追踪响应式属性的依赖关系。\r\n * 当响应式属性被读取时调用,将当前活跃的 effect 记录为该属性的依赖。\r\n *\r\n * @param target - 被追踪的响应式对象\r\n * @param _type - 追踪操作类型(如 'get'、'has'、'iterate')\r\n * @param key - 被追踪的属性键\r\n */\r\nexport function track(target: object, _type: string, key: string | symbol) {\r\n if (!shouldTrack || activeEffect === undefined) return;\r\n // signal untrack 桥接:signalUntrack 期间跳过 effect 系统的依赖收集\r\n if (_isSignalUntracked()) return;\r\n\r\n let depsMap = targetMap.get(target);\r\n if (!depsMap) {\r\n targetMap.set(target, (depsMap = new Map()));\r\n }\r\n\r\n let dep = depsMap.get(key);\r\n if (!dep) {\r\n depsMap.set(key, (dep = createDep()));\r\n }\r\n\r\n trackEffect(dep);\r\n\r\n // 调试:触发 onTrack\r\n if (__DEV__ && activeEffect.onTrack) {\r\n activeEffect.onTrack({\r\n effect: activeEffect,\r\n target,\r\n type: _type,\r\n key,\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 将当前活跃的 effect 添加到指定的依赖集合中。\r\n * 在首次渲染优化期间会跳过依赖收集。\r\n *\r\n * @param dep - 目标依赖集合\r\n */\r\nexport function trackEffect(dep: Dep) {\r\n // 首次渲染优化:跳过依赖收集\r\n if (shouldSkipTracking()) {\r\n skippedTrackingCount++;\r\n return;\r\n }\r\n // FIX: P1-01 移除重复的 shouldTrack/activeEffect 检查,\r\n // 这些检查已在调用方 track() 中完成,此处只需关注 dep 操作\r\n // FIX: P0-5 添加防御性检查,避免非空断言在公共 API 调用时不安全\r\n if (activeEffect && !dep.has(activeEffect)) {\r\n dep.add(activeEffect);\r\n activeEffect.deps.push(dep);\r\n }\r\n}\r\n\r\n/**\r\n * 触发响应式属性的依赖更新。\r\n * 当响应式属性被修改时调用,通知所有依赖该属性的 effect 重新执行。\r\n *\r\n * 根据操作类型(add/delete/set/clear)会触发不同的依赖集合:\r\n * - `add`:触发属性本身 + ITERATE_KEY(或数组 length)\r\n * - `delete`:触发属性本身 + ITERATE_KEY\r\n * - `set`:触发属性本身 + 数组 length(如果是整数键)\r\n * - `clear`:触发所有属性的依赖\r\n *\r\n * @param target - 被修改的响应式对象\r\n * @param type - 触发操作类型('set' | 'add' | 'delete' | 'clear')\r\n * @param key - 被修改的属性键\r\n * @param _newValue - 新值(可选,用于调试)\r\n * @param _oldValue - 旧值(可选,用于调试)\r\n */\r\nexport function trigger(\r\n target: object,\r\n type: string,\r\n key?: string | symbol,\r\n newValue?: unknown,\r\n oldValue?: unknown,\r\n) {\r\n const depsMap = targetMap.get(target);\r\n if (!depsMap) return;\r\n\r\n const deps: (Dep | undefined)[] = [];\r\n\r\n if (type === 'clear') {\r\n deps.push(...depsMap.values());\r\n } else {\r\n if (key !== undefined) {\r\n deps.push(depsMap.get(key));\r\n }\r\n\r\n if (type === 'add') {\r\n if (Array.isArray(target)) {\r\n deps.push(depsMap.get('length'));\r\n } else {\r\n deps.push(depsMap.get(ITERATE_KEY));\r\n }\r\n } else if (type === 'delete') {\r\n if (!Array.isArray(target)) {\r\n deps.push(depsMap.get(ITERATE_KEY));\r\n }\r\n } else if (type === 'set') {\r\n if (Array.isArray(target) && isIntegerKey(key)) {\r\n deps.push(depsMap.get('length'));\r\n }\r\n }\r\n }\r\n\r\n const effects: ReactiveEffect[] = [];\r\n for (const dep of deps) {\r\n if (dep) {\r\n for (const effect of dep) {\r\n effects.push(effect);\r\n }\r\n }\r\n }\r\n\r\n // 去重:同一个 effect 可能同时存在于多个 dep 中\r\n triggerEffects([...new Set(effects)], target, type, key, newValue, oldValue);\r\n}\r\n\r\n/**\r\n * 执行一组 effect 的触发。\r\n * 优先执行 computed effect,再执行普通 effect。\r\n * 内置递归深度限制,超过最大深度时静默丢弃并发出警告。\r\n *\r\n * @param effects - 需要触发的 ReactiveEffect 数组\r\n * @param target - 被修改的目标对象(用于调试回调)\r\n * @param type - 触发操作类型(用于调试回调)\r\n * @param key - 被修改的属性键(用于调试回调)\r\n * @param newValue - 新值(用于调试回调)\r\n * @param oldValue - 旧值(用于调试回调)\r\n */\r\nexport function triggerEffects(\r\n effects: ReactiveEffect[],\r\n target: object,\r\n type: string,\r\n key?: string | symbol,\r\n newValue?: unknown,\r\n oldValue?: unknown,\r\n) {\r\n if (triggerDepth > REACTIVITY_MAX_TRIGGER_DEPTH) {\r\n // FIX: P2-1 triggerDepth 超限时改为 warn + 静默丢弃,与 Vue 3 行为一致。\r\n // 之前直接 throw Error 过于激进,会导致整个响应式链断裂。\r\n // 改为仅发出警告并丢弃后续 trigger,避免因单个无限循环导致整个应用崩溃。\r\n if (__DEV__) {\r\n warn(\r\n `[lytjs/reactivity] Maximum trigger depth (${REACTIVITY_MAX_TRIGGER_DEPTH}) exceeded. ` +\r\n `Possible infinite reactivity loop detected. Further triggers are silently dropped. ` +\r\n `triggerDepth=${triggerDepth}`,\r\n );\r\n }\r\n return;\r\n }\r\n triggerDepth++;\r\n try {\r\n for (const effect of effects) {\r\n if (effect.computed) {\r\n triggerEffect(effect, target, type, key, newValue, oldValue);\r\n }\r\n }\r\n for (const effect of effects) {\r\n if (!effect.computed) {\r\n triggerEffect(effect, target, type, key, newValue, oldValue);\r\n }\r\n }\r\n } finally {\r\n triggerDepth--;\r\n }\r\n}\r\n\r\nfunction triggerEffect(\r\n effect: ReactiveEffect,\r\n target: object,\r\n type: string,\r\n key?: string | symbol,\r\n newValue?: unknown,\r\n oldValue?: unknown,\r\n) {\r\n if (effect !== activeEffect || effect.allowRecurse) {\r\n // 调用 onTrigger 回调(用于调试)\r\n if (__DEV__ && effect.onTrigger) {\r\n effect.onTrigger({\r\n effect,\r\n target,\r\n type,\r\n key,\r\n newValue,\r\n oldValue,\r\n });\r\n }\r\n if (effect.scheduler) {\r\n effect.scheduler();\r\n } else {\r\n effect.run();\r\n }\r\n }\r\n}\r\n\r\n// ==================== ReactiveEffect ====================\r\n\r\n/**\r\n * 响应式副作用类。\r\n * 封装一个副作用函数,支持依赖自动收集、调度执行和手动停止。\r\n *\r\n * 创建时会自动注册到当前活跃的 effectScope 中。\r\n *\r\n * @typeParam T - 副作用函数的返回值类型\r\n *\r\n * @example\r\n * ```ts\r\n * const eff = new ReactiveEffect(() => {\r\n * console.log(state.count);\r\n * });\r\n * eff.run(); // 执行副作用,同时收集依赖\r\n * eff.stop(); // 停止副作用,清理所有依赖\r\n * ```\r\n */\r\nexport class ReactiveEffect<T = unknown> {\r\n active = true;\r\n deps: Dep[] = [];\r\n parent: ReactiveEffect | undefined = undefined;\r\n computed?: boolean;\r\n allowRecurse?: boolean;\r\n onStop?: () => void;\r\n onTrack?: (event: { effect: ReactiveEffect; target: object; key?: string | symbol; type: string }) => void;\r\n onTrigger?: (event: {\r\n effect: ReactiveEffect;\r\n target: object;\r\n key?: string | symbol;\r\n type: string;\r\n newValue?: unknown;\r\n oldValue?: unknown;\r\n }) => void;\r\n onError?: (error: Error) => void;\r\n // 运行前清理(onEffectCleanup 注册的)\r\n _cleanups: Array<() => void> = [];\r\n\r\n constructor(\r\n public fn: () => T,\r\n public scheduler?: (...args: unknown[]) => unknown,\r\n ) {\r\n // 自动注册到当前活跃的 effectScope\r\n const scope = getActiveEffectScope();\r\n if (scope && scope.active) {\r\n scope.effects.push(this);\r\n }\r\n }\r\n\r\n run(): T | undefined {\r\n if (!this.active) {\r\n return undefined;\r\n }\r\n\r\n // 在重新执行前调用 cleanup\r\n if (this._cleanups.length > 0) {\r\n for (let i = 0; i < this._cleanups.length; i++) {\r\n this._cleanups[i]!();\r\n }\r\n this._cleanups.length = 0;\r\n }\r\n\r\n const prevShouldTrack = shouldTrack;\r\n try {\r\n this.parent = activeEffect;\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n activeEffect = this;\r\n shouldTrack = true;\r\n _trackDepth++;\r\n\r\n return this.fn();\r\n } catch (error) {\r\n if (this.onError) {\r\n this.onError(error as Error);\r\n return undefined;\r\n }\r\n throw error;\r\n } finally {\r\n _trackDepth--;\r\n activeEffect = this.parent;\r\n shouldTrack = prevShouldTrack;\r\n this.parent = undefined;\r\n }\r\n }\r\n\r\n stop(): void {\r\n if (this.active) {\r\n cleanupEffect(this);\r\n if (this._cleanups.length > 0) {\r\n for (let i = 0; i < this._cleanups.length; i++) {\r\n this._cleanups[i]!();\r\n }\r\n this._cleanups.length = 0;\r\n }\r\n if (this.onStop) {\r\n this.onStop();\r\n }\r\n this.active = false;\r\n this.scheduler = undefined;\r\n }\r\n }\r\n}\r\n\r\nfunction cleanupEffect(effect: ReactiveEffect) {\r\n const { deps } = effect;\r\n for (let i = 0; i < deps.length; i++) {\r\n deps[i]!.delete(effect);\r\n }\r\n deps.length = 0;\r\n}\r\n\r\n// ==================== 公共 API ====================\r\n\r\n// Function overloads for effect()\r\n// Non-lazy effect: fn returns void, preventing accidental return value usage\r\n\r\n/**\r\n * 创建一个响应式副作用并立即执行。\r\n *\r\n * 副作用函数会在执行期间自动追踪所使用的响应式属性,\r\n * 当这些属性发生变化时,副作用会重新执行。\r\n *\r\n * @param fn - 副作用函数,返回 void\r\n * @param options - 配置选项\r\n * @param options.lazy - 是否延迟执行(false 时立即执行)\r\n * @param options.scheduler - 自定义调度器,替代默认的立即执行行为\r\n * @param options.allowRecurse - 是否允许副作用递归触发自身\r\n * @param options.onStop - 副作用停止时的回调\r\n * @param options.onTrack - 依赖被追踪时的调试回调\r\n * @param options.onTrigger - 依赖被触发时的调试回调\r\n * @returns 副作用运行器,可调用 run() 手动执行或 stop() 停止\r\n */\r\nexport function effect(\r\n fn: () => void,\r\n options?: {\r\n lazy?: false;\r\n scheduler?: (...args: unknown[]) => unknown;\r\n allowRecurse?: boolean;\r\n onStop?: () => void;\r\n onTrack?: (event: { effect: ReactiveEffect; target: object; key?: string | symbol; type: string }) => void;\r\n onTrigger?: (event: {\r\n effect: ReactiveEffect;\r\n target: object;\r\n key?: string | symbol;\r\n type: string;\r\n newValue?: unknown;\r\n oldValue?: unknown;\r\n }) => void;\r\n },\r\n): ReactiveEffectRunner<void>;\r\n\r\n// Lazy effect: preserves generic return value type (used by computed etc.)\r\nexport function effect<T>(\r\n fn: () => T,\r\n options: {\r\n lazy: true;\r\n scheduler?: (...args: unknown[]) => unknown;\r\n allowRecurse?: boolean;\r\n onStop?: () => void;\r\n onTrack?: (event: { effect: ReactiveEffect; target: object; key?: string | symbol; type: string }) => void;\r\n onTrigger?: (event: {\r\n effect: ReactiveEffect;\r\n target: object;\r\n key?: string | symbol;\r\n type: string;\r\n newValue?: unknown;\r\n oldValue?: unknown;\r\n }) => void;\r\n },\r\n): ReactiveEffectRunner<T>;\r\n\r\n// 统一实现签名\r\nexport function effect<T = unknown>(\r\n fn: () => T,\r\n options?: {\r\n lazy?: boolean;\r\n scheduler?: (...args: unknown[]) => unknown;\r\n allowRecurse?: boolean;\r\n onStop?: () => void;\r\n onTrack?: (event: { effect: ReactiveEffect; target: object; key?: string | symbol; type: string }) => void;\r\n onTrigger?: (event: {\r\n effect: ReactiveEffect;\r\n target: object;\r\n key?: string | symbol;\r\n type: string;\r\n newValue?: unknown;\r\n oldValue?: unknown;\r\n }) => void;\r\n onError?: (error: Error) => void;\r\n },\r\n): ReactiveEffectRunner<T> {\r\n const _effect = new ReactiveEffect(fn);\r\n if (options) {\r\n // 仅提取已知合法选项,防止覆盖内部属性(如 fn、active)\r\n _effect.scheduler = options.scheduler;\r\n _effect.allowRecurse = options.allowRecurse;\r\n _effect.onStop = options.onStop;\r\n _effect.onTrack = options.onTrack;\r\n _effect.onTrigger = options.onTrigger;\r\n _effect.onError = options.onError;\r\n }\r\n if (!options || !options.lazy) {\r\n _effect.run();\r\n }\r\n const runner = _effect.run.bind(_effect) as ReactiveEffectRunner<T>;\r\n runner.effect = _effect;\r\n return runner;\r\n}\r\n\r\n/**\r\n * 停止一个响应式副作用。\r\n * 清理所有依赖关系,并调用 onStop 回调。\r\n *\r\n * @param runner - 由 effect() 返回的副作用运行器\r\n */\r\nexport function stop(runner: ReactiveEffectRunner): void {\r\n runner.effect.stop();\r\n}\r\n\r\n/**\r\n * 暂停依赖追踪。\r\n * 调用后,响应式属性的读取不会建立依赖关系。\r\n * 可通过 resetTracking() 恢复。\r\n */\r\nexport function pauseTracking(): void {\r\n trackStack.push(shouldTrack);\r\n shouldTrack = false;\r\n}\r\n\r\n/**\r\n * 启用依赖追踪。\r\n * 将当前追踪状态压入栈中并设为 true。\r\n * 可通过 resetTracking() 恢复到之前的状态。\r\n */\r\nexport function enableTracking(): void {\r\n trackStack.push(shouldTrack);\r\n shouldTrack = true;\r\n}\r\n\r\n/**\r\n * 重置依赖追踪状态到上一次暂停/启用之前的状态。\r\n * 从追踪栈中弹出最近的状态并恢复。\r\n */\r\nexport function resetTracking(): void {\r\n const last = trackStack.pop();\r\n shouldTrack = last === undefined ? true : last;\r\n}\r\n\r\n/**\r\n * 批量执行函数,期间暂停依赖追踪。\r\n * 与 signalBatch 不同,batch 侧重于暂停追踪而非延迟通知。\r\n * 支持嵌套调用,内层 batch 不会提前恢复追踪状态。\r\n *\r\n * @param fn - 需要批量执行的函数\r\n *\r\n * @example\r\n * ```ts\r\n * batch(() => {\r\n * state.a = 1; // 不会触发依赖更新\r\n * state.b = 2; // 不会触发依赖更新\r\n * }); // 函数结束后恢复追踪\r\n * ```\r\n */\r\nexport function batch(fn: () => void): void {\r\n const stackLength = trackStack.length;\r\n pauseTracking();\r\n try {\r\n fn();\r\n } finally {\r\n // 恢复到 batch 调用前的 stack 长度,确保嵌套安全\r\n while (trackStack.length > stackLength) {\r\n trackStack.pop();\r\n }\r\n shouldTrack = trackStack.length > 0 ? trackStack[trackStack.length - 1]! : true;\r\n }\r\n}\r\n\r\n/**\r\n * batchAsync - like batch but supports async functions.\r\n * Pauses tracking during fn execution (including after await),\r\n * and restores tracking state when fn completes (or throws).\r\n * Returns a Promise.\r\n */\r\nexport function batchAsync(fn: () => void | Promise<void>): Promise<void> {\r\n const stackLength = trackStack.length;\r\n pauseTracking();\r\n const restoreTracking = () => {\r\n while (trackStack.length > stackLength) {\r\n trackStack.pop();\r\n }\r\n shouldTrack = trackStack.length > 0 ? trackStack[trackStack.length - 1]! : true;\r\n };\r\n try {\r\n const result = fn();\r\n if (result && typeof result === 'object' && 'then' in result) {\r\n return (result as Promise<void>).finally(restoreTracking);\r\n }\r\n // 同步路径:立即恢复 tracking 状态\r\n restoreTracking();\r\n return Promise.resolve();\r\n } catch (e) {\r\n restoreTracking();\r\n return Promise.reject(e);\r\n }\r\n}\r\n\r\n/**\r\n * untrack - execute fn without tracking dependencies.\r\n * Semantically different from batch: untrack means \"run but don't track\".\r\n * Returns the return value of fn.\r\n */\r\nexport function untrack<T>(fn: () => T): T {\r\n const stackLength = trackStack.length;\r\n pauseTracking();\r\n try {\r\n return fn();\r\n } finally {\r\n while (trackStack.length > stackLength) {\r\n trackStack.pop();\r\n }\r\n shouldTrack = trackStack.length > 0 ? trackStack[trackStack.length - 1]! : true;\r\n }\r\n}\r\n\r\n/**\r\n * 在当前活跃的 effect 上注册一个清理回调。\r\n * 该回调会在 effect 重新执行前或停止时被调用,用于清理副作用资源。\r\n *\r\n * @param fn - 清理回调函数\r\n * @param failSilently - 当没有活跃 effect 时是否静默失败(默认 false,开发模式下会发出警告)\r\n *\r\n * @example\r\n * ```ts\r\n * effect(() => {\r\n * const timer = setInterval(() => console.log('tick'), 1000);\r\n * onEffectCleanup(() => clearInterval(timer));\r\n * });\r\n * ```\r\n */\r\nexport function onEffectCleanup(fn: () => void, failSilently = false): void {\r\n if (activeEffect === undefined) {\r\n if (!failSilently && __DEV__) {\r\n warn('onEffectCleanup() was called when there was no active effect to associate with.');\r\n }\r\n return;\r\n }\r\n activeEffect._cleanups.push(fn);\r\n}\r\n\r\n// ==================== 辅助 ====================\r\n\r\n/**\r\n * 检查给定的键是否为有效的整数键。\r\n * 用于判断数组索引是否为合法的整数值。\r\n *\r\n * @param key - 需要检查的键值\r\n * @returns 如果是有效的整数键返回 true,否则返回 false\r\n */\r\nexport function isIntegerKey(key: unknown): boolean {\r\n return (\r\n typeof key === 'string' &&\r\n key !== 'NaN' &&\r\n key[0] !== '-' &&\r\n '' + parseInt(key, 10) === key &&\r\n Number.isSafeInteger(Number(key))\r\n );\r\n}\r\n","// src/shared.ts\r\n// @lytjs/reactivity - reactive.ts 和 ref.ts 共享的辅助函数\r\n// 提取公共函数以消除 reactive <-> ref 的循环依赖\r\n\r\nimport { ReactiveFlags } from './constants';\r\nimport type { RefLike } from '@lytjs/shared-types';\r\n\r\n// Re-export RefLike for downstream consumers\r\nexport type { RefLike } from '@lytjs/shared-types';\r\n\r\nimport { hasChanged } from '@lytjs/common-is';\r\nexport { hasChanged };\r\n\r\n/**\r\n * toRaw 遍历时的最大深度限制,防止异常的代理链导致无限循环\r\n */\r\nconst MAX_RAW_DEPTH = 100;\r\n\r\n/**\r\n * toRaw 遍历过程中用于检测循环引用的 Set。\r\n * 提取为模块级常量以避免每次调用 toRaw 时重新分配。\r\n *\r\n * FIX: P2-5 注意:此 Set 假设单线程执行。JavaScript 是单线程的,\r\n * 因此不需要额外的线程同步机制。嵌套调用通过 _rawDepth 计数器管理。\r\n */\r\nconst _rawSeenSet = new Set<object>();\r\n\r\n/**\r\n * toRaw 嵌套调用深度计数器,防止嵌套调用时提前清空 _rawSeenSet。\r\n */\r\nlet _rawDepth = 0;\r\n\r\n/**\r\n * 获取响应式对象的原始值\r\n */\r\nexport function toRaw<T>(observed: T): T {\r\n _rawDepth++;\r\n if (_rawDepth === 1) {\r\n _rawSeenSet.clear();\r\n }\r\n try {\r\n let current: unknown = observed;\r\n let depth = 0;\r\n while (current && (current as Record<string, unknown>)[ReactiveFlags.RAW]) {\r\n if (_rawSeenSet.has(current as object) || depth >= MAX_RAW_DEPTH) return current as T;\r\n _rawSeenSet.add(current as object);\r\n current = (current as Record<string, unknown>)[ReactiveFlags.RAW];\r\n depth++;\r\n }\r\n return current as T;\r\n } finally {\r\n _rawDepth--;\r\n // FIX: P2-6 在 finally 块中确保清理 _rawSeenSet。\r\n // 即使 toRaw 内部抛出异常(如 ReactiveFlags.RAW getter 抛出),\r\n // 也能保证 _rawSeenSet 被清空,避免模块级共享 Set 残留脏数据\r\n // 影响后续调用。\r\n if (_rawDepth === 0) {\r\n _rawSeenSet.clear();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 判断一个值是否为 ref\r\n */\r\nexport function isRef<T = unknown>(r: unknown): r is RefLike<T> {\r\n return !!(r && typeof r === 'object' && (r as RefLike).__v_isRef === true);\r\n}\r\n","// src/reactive.ts\r\n// 响应式对象(Proxy 实现)\r\n// 复用 @lytjs/common-is: isObject, hasChanged, hasOwn, isSymbol, isMap, isSet\r\n\r\nimport { isObject, hasChanged, hasOwn, isSymbol, isMap, isSet } from '@lytjs/common-is';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { unsafeCast } from '@lytjs/common-assertions';\r\nimport { ReactiveFlags, TrackOpTypes, TriggerOpTypes, ITERATE_KEY } from './constants';\r\nimport { track, trigger, pauseTracking, resetTracking, isIntegerKey } from './effect';\r\nimport type { UnwrapNestedRefs, DeepReadonly } from './types';\r\nimport { toRaw, isRef } from './shared';\r\n\r\n// ==================== 类型 ====================\r\n\r\ntype Target = object;\r\ntype ReactiveProxy<T extends object = object> = { [K in keyof T]: T[K] };\r\n\r\n/**\r\n * 带有响应式标志的对象的内部接口\r\n */\r\ninterface ReactiveTarget {\r\n [ReactiveFlags.RAW]?: unknown;\r\n [ReactiveFlags.IS_REACTIVE]?: boolean;\r\n [ReactiveFlags.IS_READONLY]?: boolean;\r\n [ReactiveFlags.IS_SHALLOW]?: boolean;\r\n [ReactiveFlags.IS_REF]?: boolean;\r\n}\r\n\r\n// ==================== 辅助常量 ====================\r\n\r\nconst MUTATING_METHODS = new Set<string>(['set', 'add', 'delete', 'clear']);\r\n\r\n// FIX: P2-3 使用 WeakMap 缓存 Collection 迭代方法的绑定函数,避免每次访问都创建新函数\r\nconst collectionMethodCache = new WeakMap<\r\n object,\r\n Map<string | symbol, (...args: unknown[]) => unknown>\r\n>();\r\n\r\n// ==================== 数组方法拦截 ====================\r\n\r\nconst arrayInstrumentations: Record<string | symbol, (...args: unknown[]) => unknown> = {};\r\n\r\n(['includes', 'indexOf', 'lastIndexOf'] as const).forEach((method) => {\r\n const originMethod = Array.prototype[method] as (...args: unknown[]) => unknown;\r\n arrayInstrumentations[method] = function (this: unknown[], ...args: unknown[]) {\r\n const arr = toRaw(this);\r\n // 只追踪数组长度变化,避免大数组时逐索引创建大量依赖\r\n track(arr, TrackOpTypes.HAS, 'length');\r\n const result = originMethod.apply(arr, args);\r\n if (result === -1 || result === false) {\r\n return originMethod.apply(\r\n arr,\r\n args.map((a) => toRaw(a)),\r\n );\r\n }\r\n return result;\r\n };\r\n});\r\n\r\n(['push', 'pop', 'shift', 'unshift', 'splice'] as const).forEach((method) => {\r\n const originMethod = Array.prototype[method] as (...args: unknown[]) => unknown;\r\n arrayInstrumentations[method] = function (this: unknown[], ...args: unknown[]) {\r\n pauseTracking();\r\n try {\r\n const result = originMethod.apply(this, args);\r\n return result;\r\n } finally {\r\n resetTracking();\r\n }\r\n };\r\n});\r\n\r\n// FIX: P1-L5 响应式数组方法未处理 - 添加 sort, reverse, fill, copyWithin 的处理\r\n(['sort', 'reverse', 'fill', 'copyWithin'] as const).forEach((method) => {\r\n const originMethod = Array.prototype[method] as (...args: unknown[]) => unknown;\r\n arrayInstrumentations[method] = function (this: unknown[], ...args: unknown[]) {\r\n const arr = toRaw(this);\r\n pauseTracking();\r\n try {\r\n const result = originMethod.apply(arr, args);\r\n // 这些方法会修改数组,需要触发更新\r\n trigger(arr, TriggerOpTypes.SET, 'length');\r\n return result;\r\n } finally {\r\n resetTracking();\r\n }\r\n };\r\n});\r\n\r\n// ==================== 辅助常量 ====================\r\n\r\nconst builtInSymbols = new Set<symbol>(\r\n Object.getOwnPropertyNames(Symbol)\r\n .filter((key) => key !== 'arguments' && key !== 'caller')\r\n .map((key) => {\r\n // Object.getOwnPropertyNames 返回 string[],而 Symbol 的属性值类型为 symbol,\r\n // 但 TypeScript 将 Symbol 视为 Function,其索引签名为 unknown。\r\n // 使用索引签名访问 Symbol[key] 返回 unknown,需要类型断言。\r\n const value = unsafeCast<symbol>((Symbol as unknown as Record<string, unknown>)[key]);\r\n return isSymbol(value) ? value : undefined;\r\n })\r\n .filter((sym): sym is symbol => sym !== undefined),\r\n);\r\n\r\nfunction isNonTrackableKey(key: string | symbol): boolean {\r\n return key === '__proto__' || key === '__v_isRef';\r\n}\r\n\r\n/**\r\n * 将 unknown 值安全地转换为 trigger key (string | symbol)。\r\n * 如果值不是 string 或 symbol 类型,返回 undefined。\r\n */\r\nfunction toTriggerKey(value: unknown): string | symbol | undefined {\r\n if (typeof value === 'string' || typeof value === 'symbol') {\r\n return value;\r\n }\r\n return undefined;\r\n}\r\n\r\n// ==================== createReactiveObject ====================\r\n\r\nfunction createReactiveObject(\r\n target: Target,\r\n isReadonlyFlag: boolean,\r\n _isShallow: boolean,\r\n baseHandlers: ProxyHandler<Target>,\r\n collectionHandlers: ProxyHandler<Target>,\r\n proxyMap: WeakMap<Target, ReactiveProxy<Target>>,\r\n) {\r\n if (!isObject(target)) {\r\n if (__DEV__) {\r\n warn(`value cannot be made reactive: ${String(target)}`);\r\n }\r\n return target;\r\n }\r\n\r\n // markRaw 标记的对象不代理\r\n if ((target as Record<string | symbol, unknown>)[ReactiveFlags.SKIP]) {\r\n return target;\r\n }\r\n\r\n if (\r\n (target as Record<string | symbol, unknown>)[ReactiveFlags.RAW] &&\r\n !(isReadonlyFlag && (target as Record<string | symbol, unknown>)[ReactiveFlags.IS_REACTIVE])\r\n ) {\r\n return target;\r\n }\r\n\r\n const existingProxy = proxyMap.get(target);\r\n if (existingProxy) {\r\n return existingProxy;\r\n }\r\n\r\n const handlers = isMap(target) || isSet(target) ? collectionHandlers : baseHandlers;\r\n\r\n const proxy = new Proxy(target, handlers);\r\n proxyMap.set(target, proxy);\r\n return proxy;\r\n}\r\n\r\n// ==================== Mutable Handlers ====================\r\n\r\nfunction createMutableHandler(isReadonly: boolean, isShallow: boolean): ProxyHandler<Target> {\r\n return {\r\n get(target, key, _receiver) {\r\n if (key === ReactiveFlags.IS_REACTIVE) return !isReadonly;\r\n if (key === ReactiveFlags.IS_READONLY) return isReadonly;\r\n if (key === ReactiveFlags.IS_SHALLOW) return isShallow;\r\n if (key === ReactiveFlags.RAW) return target;\r\n\r\n const targetIsArray = Array.isArray(target);\r\n if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {\r\n return Reflect.get(arrayInstrumentations, key, _receiver);\r\n }\r\n\r\n const res = Reflect.get(target, key, _receiver);\r\n\r\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKey(key)) {\r\n return res;\r\n }\r\n\r\n if (!isReadonly) {\r\n track(target, TrackOpTypes.GET, key);\r\n }\r\n\r\n if (isShallow) {\r\n return res;\r\n }\r\n\r\n if (isRef(res)) {\r\n return targetIsArray && isIntegerKey(key) ? res : res.value;\r\n }\r\n\r\n if (isObject(res)) {\r\n return isReadonly ? readonly(res) : reactive(res);\r\n }\r\n\r\n return res;\r\n },\r\n\r\n set(target, key, value, receiver) {\r\n if (isReadonly) {\r\n if (__DEV__) {\r\n warn(\r\n `Set operation on key \"${String(key)}\" failed: target is readonly. Target: ${(() => {\r\n try {\r\n return JSON.stringify(target);\r\n } catch {\r\n return '[object Object]';\r\n }\r\n })()}`,\r\n );\r\n }\r\n return true;\r\n }\r\n\r\n let oldValue = Reflect.get(target, key);\r\n if (!isShallow) {\r\n value = toRaw(value);\r\n // FIX: P1-03 oldValue 也需要 toRaw(),确保新旧值比较时使用原始值,\r\n // 避免响应式代理对象与原始对象比较时 hasChanged 始终返回 true\r\n oldValue = toRaw(oldValue);\r\n if (!Array.isArray(target) && isRef(oldValue) && !isRef(value)) {\r\n oldValue.value = value;\r\n return true;\r\n }\r\n }\r\n\r\n const hadKey =\r\n Array.isArray(target) && isIntegerKey(key)\r\n ? Number(key) < target.length\r\n : hasOwn(target, key);\r\n\r\n const result = Reflect.set(target, key, value, receiver);\r\n\r\n if (target === toRaw(receiver)) {\r\n if (!hadKey) {\r\n trigger(target, TriggerOpTypes.ADD, key, value);\r\n } else if (hasChanged(value, oldValue)) {\r\n trigger(target, TriggerOpTypes.SET, key, value, oldValue);\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n deleteProperty(target, key) {\r\n if (isReadonly) {\r\n if (__DEV__) {\r\n // FIX: P2-03 readonly 深层警告:区分浅层 readonly 和深层 readonly\r\n warn(\r\n `Delete operation on key \"${String(key)}\" failed: target is readonly.` +\r\n (isShallow ? ' (shallow readonly)' : ' (deep readonly)') +\r\n ` Target: ${(() => {\r\n try {\r\n return JSON.stringify(target);\r\n } catch {\r\n return '[object Object]';\r\n }\r\n })()}`,\r\n );\r\n }\r\n return true;\r\n }\r\n\r\n const hadKey = hasOwn(target, key);\r\n const oldValue = Reflect.get(target, key);\r\n const result = Reflect.deleteProperty(target, key);\r\n if (result && hadKey) {\r\n trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);\r\n }\r\n return result;\r\n },\r\n\r\n has(target, key) {\r\n const result = Reflect.has(target, key);\r\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\r\n if (!isReadonly) {\r\n track(target, TrackOpTypes.HAS, key);\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n // FIX: P2-08 ownKeys 属性枚举顺序一致:\r\n // 返回 Reflect.ownKeys 结果,确保与原生 Object.keys() 枚举顺序一致\r\n ownKeys(target) {\r\n if (!isReadonly) {\r\n track(target, TrackOpTypes.ITERATE, Array.isArray(target) ? 'length' : ITERATE_KEY);\r\n }\r\n return Reflect.ownKeys(target);\r\n },\r\n };\r\n}\r\n\r\n// ==================== Collection Handlers ====================\r\n\r\n// Map/Set 的迭代 key(复用 ITERATE_KEY 以保持一致性)\r\n// 使用与 mutable handler 相同的 ITERATE_KEY,确保 collection 和 object 的迭代追踪行为一致。\r\n\r\nfunction createCollectionHandler(isReadonly: boolean, isShallow: boolean): ProxyHandler<Target> {\r\n return {\r\n get(target, key, _receiver) {\r\n if (key === ReactiveFlags.IS_REACTIVE) return !isReadonly;\r\n if (key === ReactiveFlags.IS_READONLY) return isReadonly;\r\n if (key === ReactiveFlags.IS_SHALLOW) return isShallow;\r\n if (key === ReactiveFlags.RAW) return target;\r\n\r\n // 追踪 size 属性和 get 调用\r\n // FIX: P2-4 移除 get handler 中对 ITERATE_KEY 的重复追踪。\r\n // 之前对 'get' key 同时在 get handler 入口处和包装函数中追踪 ITERATE_KEY,\r\n // 导致 Map.get() 调用时产生双重依赖追踪。现在仅在包装函数中追踪具体 key,\r\n // ITERATE_KEY 的追踪由变异方法(set/add/delete/clear)的 trigger 覆盖。\r\n // has/forEach/entries/keys/values/Symbol.iterator 在所有模式下都追踪\r\n if (\r\n key === 'size' ||\r\n key === 'has' ||\r\n key === 'forEach' ||\r\n key === 'entries' ||\r\n key === 'keys' ||\r\n key === 'values' ||\r\n key === Symbol.iterator\r\n ) {\r\n track(target, TrackOpTypes.GET, ITERATE_KEY);\r\n }\r\n\r\n const res = Reflect.get(target, key, target);\r\n if (typeof res === 'function') {\r\n // 对迭代方法进行包装以追踪依赖\r\n if (\r\n !isReadonly &&\r\n (key === 'entries' || key === 'keys' || key === 'values' || key === Symbol.iterator)\r\n ) {\r\n // FIX: P2-3 使用缓存避免每次访问都创建新函数\r\n let methodCache = collectionMethodCache.get(target);\r\n if (!methodCache) {\r\n methodCache = new Map();\r\n collectionMethodCache.set(target, methodCache);\r\n }\r\n let cachedFn = methodCache.get(key);\r\n if (!cachedFn) {\r\n cachedFn = (...args: unknown[]) => {\r\n track(target, TrackOpTypes.GET, ITERATE_KEY);\r\n return res.apply(target, args);\r\n };\r\n methodCache.set(key, cachedFn);\r\n }\r\n return cachedFn;\r\n }\r\n if (!isReadonly) {\r\n // key as string: MUTATING_METHODS 只包含字符串方法名(\"set\"/\"add\"/\"delete\"/\"clear\"),\r\n // 而 Proxy handler 的 key 参数类型为 string | symbol。对于 Map/Set 的变异方法,\r\n // key 始终是字符串,symbol 类型的 key(如 Symbol.iterator)不会匹配 MUTATING_METHODS,\r\n // 因此 Set.has(key as string) 对 symbol 返回 false 是安全的。\r\n if (MUTATING_METHODS.has(key as string)) {\r\n return (...args: unknown[]) => {\r\n const rawTarget = toRaw(target) as Map<unknown, unknown>;\r\n if (key === 'set') {\r\n // Map.set: 检查值是否实际改变\r\n const oldValue = rawTarget.get(args[0]);\r\n const hadKey = rawTarget.has(args[0]);\r\n const result = res.apply(target, args);\r\n if (!hadKey || !Object.is(toRaw(oldValue), toRaw(args[1]))) {\r\n const triggerKey = toTriggerKey(args[0]);\r\n if (triggerKey !== undefined) {\r\n trigger(target, TriggerOpTypes.SET, triggerKey, args[1], oldValue);\r\n }\r\n }\r\n return result;\r\n } else if (key === 'add') {\r\n // Set.add: 利用返回值判断是否新增\r\n const had = rawTarget.has(args[0]);\r\n const result = res.apply(target, args);\r\n if (!had) {\r\n const triggerKey = toTriggerKey(args[0]);\r\n if (triggerKey !== undefined) {\r\n trigger(target, TriggerOpTypes.ADD, triggerKey, args[0]);\r\n }\r\n // size 变化,触发 ITERATE_KEY 依赖\r\n trigger(target, TriggerOpTypes.ADD, ITERATE_KEY);\r\n }\r\n return result;\r\n } else if (key === 'delete') {\r\n // Map/Set.delete: 已有 hadKey 检查\r\n const hadKey = rawTarget.has(args[0]);\r\n const result = res.apply(target, args);\r\n if (hadKey) {\r\n const triggerKey = toTriggerKey(args[0]);\r\n if (triggerKey !== undefined) {\r\n trigger(target, TriggerOpTypes.DELETE, triggerKey, undefined, undefined);\r\n }\r\n // size 变化,触发 ITERATE_KEY 依赖\r\n trigger(target, TriggerOpTypes.DELETE, ITERATE_KEY);\r\n }\r\n return result;\r\n } else if (key === 'clear') {\r\n const hadItems = rawTarget.size > 0;\r\n const result = res.apply(target, args);\r\n if (hadItems) {\r\n trigger(target, TriggerOpTypes.CLEAR, undefined, undefined, undefined);\r\n }\r\n return result;\r\n }\r\n // 其他变异方法\r\n const result = res.apply(target, args);\r\n trigger(target, TriggerOpTypes.ADD, ITERATE_KEY);\r\n return result;\r\n };\r\n }\r\n // Map.get: 额外追踪具体的 key,使 set 变异时能精确触发\r\n if (key === 'get') {\r\n return (...args: unknown[]) => {\r\n track(target, TrackOpTypes.GET, args[0] as string | symbol);\r\n return res.apply(target, args);\r\n };\r\n }\r\n } else {\r\n // Readonly:阻止变异方法并发出警告\r\n if (MUTATING_METHODS.has(key as string)) {\r\n return (..._args: unknown[]) => {\r\n if (__DEV__) {\r\n warn(`Operation \"${String(key)}\" failed: target is readonly.`);\r\n }\r\n // delete 返回 false 以匹配原生 Set.prototype.delete 和 Map.prototype.delete 的\r\n // 失败返回值语义(表示未执行删除)。其他变异方法(set/add/clear)返回 undefined,\r\n // 因为原生 API 中这些方法在成功时返回特定值(如 Set.add 返回 Set 本身),\r\n // 此处用 undefined 表示操作被阻止,与 readonly handler 的行为一致。\r\n if (key === 'delete') return false;\r\n return undefined;\r\n };\r\n }\r\n }\r\n return res.bind(target);\r\n }\r\n return res;\r\n },\r\n };\r\n}\r\n\r\n// ==================== Handler 实例 ====================\r\n\r\nconst mutableHandlers = createMutableHandler(false, false);\r\nconst readonlyHandlers = createMutableHandler(true, false);\r\nconst shallowReactiveHandlers = createMutableHandler(false, true);\r\nconst shallowReadonlyHandlers = createMutableHandler(true, true);\r\n\r\nconst mutableCollectionHandlers = createCollectionHandler(false, false);\r\nconst readonlyCollectionHandlers = createCollectionHandler(true, false);\r\nconst shallowCollectionHandlers = createCollectionHandler(false, true);\r\nconst shallowReadonlyCollectionHandlers = createCollectionHandler(true, true);\r\n\r\n// ==================== 公共 API ====================\r\n\r\nconst reactiveMap = new WeakMap<Target, ReactiveProxy<Target>>();\r\nconst shallowReactiveMap = new WeakMap<Target, ReactiveProxy<Target>>();\r\nconst readonlyMap = new WeakMap<Target, ReactiveProxy<Target>>();\r\nconst shallowReadonlyMap = new WeakMap<Target, ReactiveProxy<Target>>();\r\n\r\nexport function reactive<T extends object>(target: T): UnwrapNestedRefs<T> {\r\n if (isReadonly(target)) return target as UnwrapNestedRefs<T>;\r\n return createReactiveObject(\r\n target,\r\n false,\r\n false,\r\n mutableHandlers,\r\n mutableCollectionHandlers,\r\n reactiveMap,\r\n ) as UnwrapNestedRefs<T>;\r\n}\r\n\r\nexport function shallowReactive<T extends object>(target: T): T {\r\n return createReactiveObject(\r\n target,\r\n false,\r\n true,\r\n shallowReactiveHandlers,\r\n shallowCollectionHandlers,\r\n shallowReactiveMap,\r\n ) as T;\r\n}\r\n\r\nexport function readonly<T extends object>(target: T): DeepReadonly<UnwrapNestedRefs<T>> {\r\n return createReactiveObject(\r\n target,\r\n true,\r\n false,\r\n readonlyHandlers,\r\n readonlyCollectionHandlers,\r\n readonlyMap,\r\n ) as DeepReadonly<UnwrapNestedRefs<T>>;\r\n}\r\n\r\nexport function shallowReadonly<T extends object>(target: T): Readonly<T> {\r\n return createReactiveObject(\r\n target,\r\n true,\r\n true,\r\n shallowReadonlyHandlers,\r\n shallowReadonlyCollectionHandlers,\r\n shallowReadonlyMap,\r\n ) as Readonly<T>;\r\n}\r\n\r\nexport function isReactive(value: unknown): boolean {\r\n if (isReadonly(value)) {\r\n return isReactive((value as ReactiveTarget)[ReactiveFlags.RAW]);\r\n }\r\n return !!(value && (value as ReactiveTarget)[ReactiveFlags.IS_REACTIVE]);\r\n}\r\n\r\nexport function isReadonly(value: unknown): boolean {\r\n return !!(value && (value as ReactiveTarget)[ReactiveFlags.IS_READONLY]);\r\n}\r\n\r\nexport function isProxy(value: unknown): boolean {\r\n return isReactive(value) || isReadonly(value);\r\n}\r\n\r\nexport { toRaw } from './shared';\r\n\r\nexport function markRaw<T extends object>(value: T): T {\r\n // FIX: P2-2 检查对象是否被冻结或密封,避免在冻结对象上调用 defineProperty 抛出 TypeError\r\n if (Object.isFrozen(value) || Object.isSealed(value)) {\r\n if (__DEV__) {\r\n warn('markRaw() cannot be used on frozen or sealed objects.');\r\n }\r\n return value;\r\n }\r\n Object.defineProperty(value, ReactiveFlags.SKIP, { value: true });\r\n return value;\r\n}\r\n","// src/ref.ts\r\n// Ref 响应式引用\r\n// 复用 @lytjs/common-is: isObject, hasChanged\r\n\r\nimport { isObject, hasChanged } from '@lytjs/common-is';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { unsafeCast } from '@lytjs/common-assertions';\r\nimport { track, trigger, getActiveEffect, getShouldTrack, createDep } from './effect';\r\nimport type { Dep } from './effect';\r\nimport { TrackOpTypes, TriggerOpTypes } from './constants';\r\nimport { toRaw, isRef } from './shared';\r\nimport { reactive } from './reactive';\r\n\r\n// ==================== Ref 类型 ====================\r\n\r\n/** track/trigger 中使用的类 ref 对象的内部接口 */\r\nexport interface RefLike<T = unknown> {\r\n dep: Dep;\r\n __v_isRef?: boolean;\r\n value: T;\r\n}\r\n\r\n/** trackRefValue/triggerRefValue 所需的最小接口 */\r\ninterface TrackableRef {\r\n dep: Dep;\r\n}\r\n\r\nexport interface Ref<T = unknown> {\r\n value: T;\r\n __v_isRef: true;\r\n}\r\n\r\nexport interface ShallowRef<T = unknown> extends Ref<T> {\r\n __v_isShallow: true;\r\n}\r\n\r\nexport interface ComputedRef<T = unknown> extends Ref<T> {\r\n __v_isComputed: true;\r\n}\r\n\r\n// ==================== Ref 类 ====================\r\n\r\nclass RefImpl<T> {\r\n private _value: T;\r\n private _rawValue: T;\r\n // 使用 Dep 类型替代 Set<any>,提供更精确的类型约束\r\n public dep: Dep = createDep();\r\n public readonly __v_isRef = true;\r\n public readonly __v_isShallow?: boolean;\r\n\r\n constructor(value: T, isShallow: boolean) {\r\n this.__v_isShallow = isShallow || undefined;\r\n this._rawValue = isShallow ? value : toRaw(value);\r\n // toReactive 仅对对象类型生效,非对象值直接赋值。\r\n // 此处的 as object 断言是安全的,因为 toReactive 内部会先做 isObject 检查。\r\n this._value = isShallow ? value : (toReactive(value as object) as T);\r\n }\r\n\r\n get value(): T {\r\n trackRefValue(this);\r\n return this._value;\r\n }\r\n\r\n set value(newVal: T) {\r\n const useDirectValue = this.__v_isShallow;\r\n newVal = useDirectValue ? newVal : toRaw(newVal);\r\n if (hasChanged(newVal, this._rawValue)) {\r\n const oldVal = this._rawValue;\r\n this._rawValue = newVal;\r\n // toReactive 仅对对象类型生效,非对象值直接赋值。\r\n // 此处的 as object 断言是安全的,因为 toReactive 内部会先做 isObject 检查。\r\n this._value = useDirectValue ? newVal : (toReactive(newVal as object) as T);\r\n triggerRefValue(this, newVal, oldVal);\r\n }\r\n }\r\n}\r\n\r\nclass ShallowRefImpl<T> {\r\n private _value: T;\r\n private _rawValue: T;\r\n // 使用 Dep 类型替代 Set<any>,提供更精确的类型约束\r\n public dep: Dep = createDep();\r\n public readonly __v_isRef = true;\r\n public readonly __v_isShallow = true as const;\r\n\r\n constructor(value: T) {\r\n this._rawValue = value;\r\n this._value = value;\r\n }\r\n\r\n get value(): T {\r\n trackRefValue(this);\r\n return this._value;\r\n }\r\n\r\n set value(newVal: T) {\r\n if (hasChanged(newVal, this._rawValue)) {\r\n const oldVal = this._rawValue;\r\n this._rawValue = newVal;\r\n this._value = newVal;\r\n triggerRefValue(this, newVal, oldVal);\r\n }\r\n }\r\n}\r\n\r\n// ==================== 追踪与触发 ====================\r\n\r\nexport function trackRefValue(ref: TrackableRef): void {\r\n if (getShouldTrack() && getActiveEffect()) {\r\n track(ref, TrackOpTypes.GET, 'value');\r\n }\r\n}\r\n\r\nexport function triggerRefValue(ref: TrackableRef, newVal?: unknown, oldVal?: unknown): void {\r\n trigger(ref, TriggerOpTypes.SET, 'value', newVal, oldVal);\r\n}\r\n\r\n// ==================== 公共 API ====================\r\n\r\nexport function ref<T extends object | string | number | boolean | null | undefined>(\r\n value: T,\r\n): Ref<T> {\r\n if (isRef(value)) {\r\n // FIX: P1-07 ref() 接受 ShallowRef 时添加 DEV 警告,\r\n // 提醒用户 ShallowRef 语义与 Ref 不同,直接返回可能导致意外行为\r\n // FIX: P2-34 使用类型守卫替代类型断言\r\n if (__DEV__ && isShallowRef(value)) {\r\n warn(\r\n 'ref() received a ShallowRef value. ' +\r\n 'ShallowRef and Ref have different reactivity semantics. ' +\r\n 'If this is intentional, use shallowRef() instead.',\r\n );\r\n }\r\n return value as Ref<T>;\r\n }\r\n // 双重断言是必要的:RefImpl 实现了 Ref 接口所需的 value/__v_isRef 属性,\r\n // 但 TypeScript 无法自动推断类实例满足接口(私有成员导致结构不兼容)。\r\n return unsafeCast<Ref<T>>(new RefImpl(value, false));\r\n}\r\n\r\nexport function shallowRef<T>(value: T): ShallowRef<T> {\r\n if (isRef(value)) return unsafeCast<ShallowRef<T>>(value);\r\n return unsafeCast<ShallowRef<T>>(new ShallowRefImpl(value));\r\n}\r\n\r\nexport function triggerRef<T>(ref: ShallowRef<T>): void {\r\n triggerRefValue(unsafeCast<TrackableRef>(ref), ref.value);\r\n}\r\n\r\nexport { isRef } from './shared';\r\n\r\n// FIX: P2-8 添加类型谓词:isShallowRef 和 isComputedRef\r\n/**\r\n * 检查值是否为 ShallowRef\r\n * 类型谓词:缩小类型到 ShallowRef<T>\r\n */\r\nexport function isShallowRef<T = unknown>(r: unknown): r is ShallowRef<T> {\r\n return isRef(r) && !!(r as ShallowRef<T>).__v_isShallow;\r\n}\r\n\r\n/**\r\n * 检查值是否为 ComputedRef\r\n * 类型谓词:缩小类型到 ComputedRef<T>\r\n */\r\nexport function isComputedRef<T = unknown>(r: unknown): r is ComputedRef<T> {\r\n return isRef(r) && !!(r as ComputedRef<T>).__v_isComputed;\r\n}\r\n\r\n// FIX: P2-06 unref 类型守卫增强:添加明确的返回类型注释\r\n// unref 如果参数是 Ref 则返回 .value,否则返回参数本身\r\nexport function unref<T>(r: T | Ref<T>): T {\r\n // FIX: P2-34 使用类型守卫替代类型断言,P2-38 移除不必要的 as\r\n // FIX: DTS build error - 使用类型断言确保类型正确\r\n return isRef(r) ? (r as Ref<T>).value : r;\r\n}\r\n\r\nexport function toRef<T extends object, K extends keyof T>(object: T, key: K): Ref<T[K]> {\r\n if (isRef(object[key])) return unsafeCast<Ref<T[K]>>(object[key]);\r\n return unsafeCast<Ref<T[K]>>(new ObjectRefImpl(object, key));\r\n}\r\n\r\nexport function toRefs<T extends object>(object: T): { [K in keyof T]: Ref<T[K]> } {\r\n const result = {} as { [K in keyof T]: Ref<T[K]> };\r\n for (const key in object) {\r\n result[key] = toRef(object, key);\r\n }\r\n return result;\r\n}\r\n\r\nexport function customRef<T>(factory: CustomRefFactory<T>): Ref<T> {\r\n return unsafeCast<Ref<T>>(new CustomRefImpl(factory));\r\n}\r\n\r\n/**\r\n * 将值规范化为非 ref 值。\r\n * 如果是 Ref 则返回 .value,如果是函数则调用并返回结果,否则直接返回。\r\n * Vue 3.3+ 新增工具函数。\r\n */\r\nexport function toValue<T>(source: T | Ref<T> | (() => T)): T {\r\n // FIX: P2-34 使用类型守卫替代类型断言\r\n // FIX: DTS build error - 使用类型断言确保类型正确\r\n if (isRef(source)) return (source as Ref<T>).value;\r\n if (typeof source === 'function') {\r\n // FIX: P2-35 添加类型守卫确保 source 是函数后再调用\r\n return (source as () => T)();\r\n }\r\n return source as T;\r\n}\r\n\r\n// ==================== 内部实现类 ====================\r\n\r\nclass ObjectRefImpl<T extends object, K extends keyof T> {\r\n public readonly __v_isRef = true;\r\n\r\n constructor(\r\n private readonly _object: T,\r\n private readonly _key: K,\r\n ) {}\r\n\r\n get value(): T[K] {\r\n return this._object[this._key];\r\n }\r\n\r\n set value(newVal: T[K]) {\r\n this._object[this._key] = newVal;\r\n }\r\n}\r\n\r\nclass CustomRefImpl<T> {\r\n public readonly __v_isRef = true;\r\n public dep: Dep = createDep();\r\n private readonly _getter: () => T;\r\n private readonly _setter: (value: T) => void;\r\n\r\n constructor(factory: CustomRefFactory<T>) {\r\n const { get, set } = factory(\r\n () => trackRefValue(this),\r\n () => triggerRefValue(this),\r\n );\r\n this._getter = get;\r\n this._setter = set;\r\n }\r\n\r\n get value(): T {\r\n return this._getter();\r\n }\r\n\r\n set value(newVal: T) {\r\n this._setter(newVal);\r\n }\r\n}\r\n\r\n// ==================== 辅助函数 ====================\r\n\r\ntype CustomRefFactory<T> = (\r\n track: () => void,\r\n trigger: () => void,\r\n) => { get: () => T; set: (value: T) => void };\r\n\r\nfunction toReactive<T>(value: T): T {\r\n return isObject(value) ? (reactive(value as object) as T) : value;\r\n}\r\n","// src/computed.ts\r\n// 计算属性\r\n// 复用 @lytjs/common-is: isFunction, hasChanged\r\n\r\nimport { isFunction } from '@lytjs/common-is';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { unsafeCast } from '@lytjs/common-assertions';\r\nimport { ReactiveEffect, createDep } from './effect';\r\nimport type { Dep } from './effect';\r\nimport { trackRefValue, triggerRefValue } from './ref';\r\nimport type {\r\n ComputedRef,\r\n WritableComputedRef,\r\n ComputedGetter,\r\n ComputedSetter,\r\n WritableComputedOptions,\r\n} from './types';\r\nimport { ComputedRefSymbol } from './constants';\r\n\r\n// ==================== ComputedRefImpl ====================\r\n\r\n// FIX: P1-L6 计算属性循环依赖未检测 - 添加循环依赖检测\r\nconst MAX_COMPUTED_DEPTH = 100;\r\nlet computedDepth = 0;\r\nconst computedStack = new Set<ComputedRefImpl<unknown>>();\r\n\r\nclass ComputedRefImpl<T> {\r\n // 使用 Dep 类型替代 Set<any>,提供更精确的类型约束\r\n public dep: Dep = createDep();\r\n private _value!: T;\r\n private _dirty = true;\r\n private _initialized = false;\r\n public readonly [ComputedRefSymbol] = true;\r\n public readonly __v_isRef = true;\r\n public readonly __v_isComputed = true as const;\r\n public readonly effect: ReactiveEffect<T>;\r\n\r\n // FIX: P2-6 计算属性缓存清理相关属性\r\n private _cacheCleanupTimer: ReturnType<typeof setTimeout> | null = null;\r\n private static readonly CACHE_CLEANUP_DELAY = 60000; // 60秒后清理缓存\r\n\r\n constructor(\r\n getter: ComputedGetter<T>,\r\n private readonly _setter: ComputedSetter<T> | undefined,\r\n isSSR: boolean,\r\n ) {\r\n this.effect = new ReactiveEffect(getter, () => {\r\n if (!this._dirty) {\r\n this._dirty = true;\r\n triggerRefValue(this);\r\n }\r\n // FIX: P2-6 重置缓存清理定时器\r\n this._resetCacheCleanupTimer();\r\n });\r\n this.effect.computed = true;\r\n const effect = this.effect;\r\n effect.onStop = () => {\r\n this._cleanupCache();\r\n };\r\n\r\n if (isSSR) {\r\n try {\r\n this._value = getter();\r\n this._dirty = false;\r\n } catch (e) {\r\n // SSR 模式下 getter 异常不应阻塞渲染流程,\r\n // 标记为 dirty 以便后续访问时重试\r\n this._dirty = true;\r\n if (__DEV__) {\r\n warn(`Computed getter threw during SSR initialization: ${e}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // FIX: P2-6 重置缓存清理定时器\r\n private _resetCacheCleanupTimer(): void {\r\n // 清除现有的定时器\r\n if (this._cacheCleanupTimer) {\r\n clearTimeout(this._cacheCleanupTimer);\r\n }\r\n // 设置新的定时器,在指定时间后清理缓存\r\n this._cacheCleanupTimer = setTimeout(() => {\r\n // 如果 effect 已停止,清理缓存值以释放内存\r\n if (!this.effect.active) {\r\n this._cleanupCache();\r\n }\r\n }, ComputedRefImpl.CACHE_CLEANUP_DELAY);\r\n }\r\n\r\n // FIX: P2-6 清理缓存值\r\n private _cleanupCache(): void {\r\n if (!this.effect.active) {\r\n if (this._cacheCleanupTimer) {\r\n clearTimeout(this._cacheCleanupTimer);\r\n this._cacheCleanupTimer = null;\r\n }\r\n this._value = unsafeCast<T>(undefined);\r\n this._initialized = false;\r\n this._dirty = true;\r\n }\r\n }\r\n\r\n // FIX: P2-6 手动清理缓存的公共方法\r\n /**\r\n * 手动清理计算属性的缓存值。\r\n * 在组件卸载时调用此方法可以释放内存。\r\n */\r\n cleanupCache(): void {\r\n if (this._cacheCleanupTimer) {\r\n clearTimeout(this._cacheCleanupTimer);\r\n this._cacheCleanupTimer = null;\r\n }\r\n this._cleanupCache();\r\n }\r\n\r\n get value(): T {\r\n trackRefValue(this);\r\n if (this._dirty) {\r\n if (this.effect.active) {\r\n // FIX: P1-L6 计算属性循环依赖未检测 - 检测循环依赖\r\n if (computedStack.has(this as ComputedRefImpl<unknown>)) {\r\n throw new Error(\r\n `[LytJS/reactivity] Circular dependency detected in computed property. ` +\r\n `A computed property is indirectly referencing itself, causing an infinite loop.` +\r\n `\\n Error Code: CIRCULAR_REFERENCE (4008) ` +\r\n `\\n Suggestion: Check your computed property dependencies and avoid referencing ` +\r\n `the computed itself or other computeds that depend on it.`,\r\n );\r\n }\r\n computedDepth++;\r\n if (computedDepth > MAX_COMPUTED_DEPTH) {\r\n computedDepth--;\r\n throw new Error(\r\n `[LytJS/reactivity] Maximum computed depth exceeded (${MAX_COMPUTED_DEPTH}). ` +\r\n `Possible infinite loop in computed properties.` +\r\n `\\n Error Code: CIRCULAR_REFERENCE (4008) ` +\r\n `\\n Suggestion: Check for circular dependencies in your computed properties.`,\r\n );\r\n }\r\n computedStack.add(this as ComputedRefImpl<unknown>);\r\n\r\n try {\r\n const value = this.effect.run();\r\n\r\n // FIX: P1-02 effect.run() 返回 undefined 时不覆盖缓存,\r\n // 避免 getter 返回 undefined 被误认为是有效值而覆盖之前的有效缓存\r\n // FIX: P1-3 移除 || this._dirty 条件(在 _dirty 块内恒为 true),\r\n // 仅在 value !== undefined 时覆盖缓存\r\n // FIX: P2-25 缓存未命中处理优化:即使返回 undefined 也标记为已计算,\r\n // 避免重复执行 effect.run(),但保留 _initialized 状态不变\r\n if (value !== undefined) {\r\n this._value = value as T;\r\n this._initialized = true;\r\n }\r\n // FIX: P2-25 无论 value 是否为 undefined,都标记为 clean 以避免重复计算\r\n this._dirty = false;\r\n } catch (e) {\r\n // FIX: P2-25 缓存未命中处理优化:异常时如果已有缓存值,保持 clean 状态\r\n // 避免在异常场景下重复触发 effect.run()\r\n if (this._initialized) {\r\n // 已有缓存值;标记为 clean,以便下次访问时返回缓存值\r\n this._dirty = false;\r\n }\r\n throw e;\r\n } finally {\r\n computedStack.delete(this as ComputedRefImpl<unknown>);\r\n computedDepth--;\r\n }\r\n } else if (__DEV__) {\r\n warn(\r\n 'Computed value was accessed after its effect was stopped. Returning last cached value.',\r\n );\r\n }\r\n }\r\n return this._value;\r\n }\r\n\r\n set value(newValue: T) {\r\n if (this._setter) {\r\n this._setter(newValue);\r\n } else if (__DEV__) {\r\n warn('Write operation failed: computed value is readonly');\r\n }\r\n }\r\n}\r\n\r\n// ==================== SSR 模式管理 ====================\r\n\r\n// FIX: P1-3 REACTIVITY-NEW-04 - _isSSR 是模块级可变状态\r\n// 限制说明:此状态在模块级别共享,多实例/测试场景下可能产生状态泄漏。\r\n// 建议:在 SSR 场景中使用独立的模块实例,或通过上下文参数传递 SSR 状态。\r\nlet _isSSR = false;\r\n\r\n/**\r\n * 设置 SSR 模式。\r\n * 在 SSR 环境中调用 setSSRMode(true) 可让 computed 在创建时立即求值,\r\n * 避免在服务端渲染时因懒求值导致的不一致问题。\r\n *\r\n * 注意:此设置为模块级全局状态,多实例/测试场景下可能产生状态泄漏。\r\n * 如需隔离,请确保不同环境使用独立的模块加载上下文。\r\n */\r\nexport function setSSRMode(isSSR: boolean): void {\r\n _isSSR = isSSR;\r\n}\r\n\r\n// ==================== 公共 API ====================\r\n\r\nexport function computed<T>(\r\n getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>,\r\n): ComputedRef<T> | WritableComputedRef<T> {\r\n let getter: ComputedGetter<T>;\r\n let setter: ComputedSetter<T> | undefined;\r\n\r\n if (isFunction(getterOrOptions)) {\r\n getter = getterOrOptions;\r\n setter = __DEV__ ? () => warn('Write operation failed: computed value is readonly') : undefined;\r\n } else {\r\n getter = getterOrOptions.get;\r\n setter = getterOrOptions.set;\r\n }\r\n\r\n return new ComputedRefImpl(getter, setter, _isSSR) as ComputedRef<T> | WritableComputedRef<T>;\r\n}\r\n","// src/watch.ts\r\n// 侦听器\r\n// 复用 @lytjs/common-is: isFunction, isObject, isArray, hasChanged, NOOP\r\n// 复用 @lytjs/common-scheduler: nextTick, queuePreFlushCb, queuePostFlushCb\r\n\r\nimport { isFunction, isObject, isArray, hasChanged, NOOP } from '@lytjs/common-is';\r\nimport { warn, error } from '@lytjs/common-error';\r\nimport { isRef } from './ref';\r\nimport { isReactive } from './reactive';\r\nimport { ReactiveEffect } from './effect';\r\nimport { queuePreFlushCb, queuePostFlushCb } from '@lytjs/common-scheduler';\r\nimport type {\r\n WatchSource,\r\n WatchCallbackWithImmediate,\r\n WatchOptions,\r\n WatchEffectOptions,\r\n WatchHandle,\r\n OnCleanup,\r\n} from './types';\r\nimport type { Ref } from './ref';\r\n\r\n// ==================== 数据源规范化 ====================\r\n\r\nfunction getSource(source: WatchSource<unknown>): () => unknown {\r\n // FIX: P2-34 使用类型守卫替代类型断言\r\n // FIX: DTS build error - isRef 返回 RefLike,需要类型断言为 Ref\r\n if (isRef(source)) return () => (source as Ref<unknown>).value;\r\n // FIX: P2-35 添加类型守卫确保 source 是对象后再检查 isReactive\r\n if (isObject(source) && isReactive(source)) return () => traverse(source);\r\n if (typeof source === 'function') return source as () => unknown;\r\n // FIX: P2-4 DEV 模式下对无效 source 抛出错误,而非静默返回 NOOP\r\n if (__DEV__) {\r\n throw new Error(\r\n `[LytJS/reactivity] Invalid watch source: ${JSON.stringify(source)}. ` +\r\n `A watch source must be a ref, reactive object, or getter function. ` +\r\n `\\n Error Code: INVALID_WATCH_SOURCE (4010) ` +\r\n `\\n Suggestion: Use watch(ref) or watch(reactiveObj) or watch(() => expr).`,\r\n );\r\n }\r\n return NOOP;\r\n}\r\n\r\n// seen 参数改为可选,允许外部传入已有 Set 以实现复用\r\nconst MAX_TRAVERSE_DEPTH = 100;\r\n\r\n/**\r\n * 深度遍历响应式对象的所有属性以触发依赖收集。\r\n * 使用迭代实现(栈代替递归),避免深层对象导致的栈溢出。\r\n */\r\nfunction traverse(value: unknown, seen?: Set<unknown>, depth = 0): unknown {\r\n const _seen = seen ?? new Set();\r\n if (!isObject(value) || _seen.has(value)) return value;\r\n\r\n // 使用显式栈进行迭代遍历,避免递归栈溢出\r\n const stack: Array<{ value: unknown; depth: number }> = [{ value, depth }];\r\n\r\n while (stack.length > 0) {\r\n const current = stack.pop()!;\r\n const { value: val, depth: d } = current;\r\n\r\n if (!isObject(val) || _seen.has(val)) continue;\r\n if (d > MAX_TRAVERSE_DEPTH) {\r\n if (__DEV__) {\r\n warn(`traverse exceeded maximum depth (${MAX_TRAVERSE_DEPTH}).`);\r\n }\r\n continue;\r\n }\r\n _seen.add(val);\r\n\r\n if (isArray(val)) {\r\n // 反向压栈以保持原始顺序\r\n for (let i = val.length - 1; i >= 0; i--) {\r\n stack.push({ value: val[i]!, depth: d + 1 });\r\n }\r\n } else if (val instanceof Map) {\r\n val.forEach((v, key) => {\r\n stack.push({ value: v, depth: d + 1 });\r\n // 如果 key 是对象,也遍历它\r\n if (isObject(key)) {\r\n stack.push({ value: key, depth: d + 1 });\r\n }\r\n });\r\n } else if (val instanceof Set) {\r\n val.forEach((v) => {\r\n stack.push({ value: v, depth: d + 1 });\r\n });\r\n } else {\r\n const keys = Object.keys(val as object);\r\n for (let i = keys.length - 1; i >= 0; i--) {\r\n stack.push({\r\n value: (val as Record<string, unknown>)[keys[i]!]!,\r\n depth: d + 1,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return value;\r\n}\r\n\r\n// ==================== Watch 实现 ====================\r\n\r\n/**\r\n * 侦听一个或多个响应式数据源,并在数据变化时执行回调。\r\n *\r\n * @param source - 要侦听的数据源,可以是 ref、reactive 对象、getter 函数,或它们的数组\r\n * @param cb - 数据变化时的回调函数\r\n * @param options - 侦听选项\r\n * @returns 停止侦听的句柄函数\r\n *\r\n * @remarks\r\n * 关于 scheduler 参数签名:\r\n * watch 的 scheduler 与 ReactiveEffect 的 scheduler 参数签名不同。\r\n * - ReactiveEffect.scheduler: () => void(无参数,由 effect 系统内部调用)\r\n * - watch scheduler: (job: () => void, ...args: unknown[]) => unknown\r\n * 其中 job 是 watch 内部封装的变更检测+回调执行函数。\r\n * 当用户提供 scheduler 时,watch 会将 job 作为第一个参数传入,\r\n * 用户可以在 scheduler 中决定何时执行 job(如节流、防抖等)。\r\n */\r\nexport function watch<T, Immediate extends Readonly<boolean> = false>(\r\n source: WatchSource<T> | WatchSource<T>[],\r\n cb: WatchCallbackWithImmediate<T, Immediate>,\r\n options?: WatchOptions<Immediate>,\r\n): WatchHandle {\r\n const {\r\n immediate,\r\n deep,\r\n flush = 'pre',\r\n once,\r\n onTrack,\r\n onTrigger,\r\n scheduler: userScheduler,\r\n } = options || {};\r\n\r\n let getter: () => unknown;\r\n let forceTrigger = false;\r\n let isMultiSource = false;\r\n\r\n if (isArray(source)) {\r\n isMultiSource = true;\r\n // FIX: P1-04 完善 forceTrigger 逻辑:当多源中存在 reactive 对象时,\r\n // 即使 deep 为 false 也需要强制触发回调,因为 reactive 对象的属性变化\r\n // 不会改变对象引用本身,hasChanged 检测不到变化\r\n // FIX: P2-35 添加类型守卫确保 s 是对象后再检查 isReactive\r\n forceTrigger = source.some((s) => isObject(s) && isReactive(s));\r\n getter = () =>\r\n source.map((s) => {\r\n if (isRef(s)) return s.value;\r\n // FIX: P2-35 添加类型守卫\r\n if (isObject(s) && isReactive(s)) return traverse(s);\r\n if (isFunction(s)) return s();\r\n return undefined;\r\n });\r\n } else {\r\n getter = getSource(source as WatchSource<T>);\r\n // FIX: P1-04 单源 reactive 对象也需要设置 forceTrigger\r\n // FIX: P2-35 添加类型守卫\r\n if (isObject(source) && isReactive(source)) {\r\n forceTrigger = true;\r\n }\r\n }\r\n\r\n if (deep) {\r\n const baseGetter = getter;\r\n getter = () => traverse(baseGetter());\r\n }\r\n\r\n let oldValue: unknown = isMultiSource\r\n ? new Array((source as WatchSource<T>[]).length).fill(undefined)\r\n : undefined;\r\n\r\n const cleanupFns: Array<() => void> = [];\r\n let isStopped = false;\r\n let consecutiveErrors = 0;\r\n const MAX_CONSECUTIVE_ERRORS = 3;\r\n\r\n const onCleanup: OnCleanup = (fn: () => void) => {\r\n cleanupFns.push(fn);\r\n };\r\n\r\n const job: () => void = () => {\r\n if (!watcher.active || isStopped) return;\r\n if (cb) {\r\n let newValue: unknown;\r\n try {\r\n newValue = watcher.run();\r\n consecutiveErrors = 0;\r\n } catch (e) {\r\n consecutiveErrors++;\r\n if (consecutiveErrors <= MAX_CONSECUTIVE_ERRORS) {\r\n error(`Error in watch getter: ${e}`);\r\n }\r\n throw e;\r\n }\r\n if (\r\n deep ||\r\n forceTrigger ||\r\n (isMultiSource\r\n ? (newValue as unknown[]).some((v, i) => hasChanged(v, (oldValue as unknown[])[i]))\r\n : hasChanged(newValue, oldValue))\r\n ) {\r\n if (cleanupFns.length > 0) {\r\n cleanupFns.forEach((f) => f());\r\n cleanupFns.length = 0;\r\n }\r\n // FIX: P1-L7 watch 回调错误未捕获 - 添加 try-catch 捕获回调错误\r\n try {\r\n cb(\r\n newValue as T,\r\n oldValue as Immediate extends true ? undefined : T | undefined,\r\n onCleanup,\r\n );\r\n consecutiveErrors = 0;\r\n } catch (e) {\r\n consecutiveErrors++;\r\n if (consecutiveErrors <= MAX_CONSECUTIVE_ERRORS) {\r\n error(`Error in watch callback: ${e}`);\r\n }\r\n // 继续执行,不中断 watch 流程\r\n }\r\n oldValue = newValue;\r\n if (once) {\r\n isStopped = true;\r\n watcher.stop();\r\n }\r\n }\r\n } else {\r\n try {\r\n watcher.run();\r\n consecutiveErrors = 0;\r\n } catch (e) {\r\n consecutiveErrors++;\r\n if (consecutiveErrors <= MAX_CONSECUTIVE_ERRORS) {\r\n error(`Error in watch effect run: ${e}`);\r\n }\r\n throw e;\r\n }\r\n }\r\n };\r\n\r\n const rawScheduler =\r\n userScheduler ||\r\n (flush === 'sync'\r\n ? job\r\n : () => {\r\n if (flush === 'post') {\r\n queuePostFlushCb(job);\r\n } else {\r\n queuePreFlushCb(job);\r\n }\r\n });\r\n\r\n // 包装 scheduler,确保传 job 参数给用户自定义 scheduler\r\n // FIX: P2-5 添加 flush=sync 时的语义一致性说明:\r\n // 当 flush='sync' 且用户提供了自定义 scheduler 时,rawScheduler 已经是 job 本身\r\n // (因为三元表达式 `flush === 'sync' ? job : ...` 在 userScheduler 为 falsy 时生效)。\r\n // 但当 userScheduler 存在时,rawScheduler 始终是 userScheduler(三元表达式不生效),\r\n // 此时包装层将 job 作为第一个参数传给 userScheduler,这是正确的行为。\r\n // 因此无论 flush 模式如何,只要 userScheduler 存在,包装逻辑都是一致的。\r\n const scheduler = userScheduler\r\n ? (...args: unknown[]) => rawScheduler(job, ...args)\r\n : rawScheduler;\r\n\r\n const watcher = new ReactiveEffect(getter, scheduler as (...args: unknown[]) => unknown);\r\n\r\n watcher.onStop = () => {\r\n if (cleanupFns.length > 0) {\r\n for (let i = cleanupFns.length - 1; i >= 0; i--) {\r\n cleanupFns[i]!();\r\n }\r\n cleanupFns.length = 0;\r\n }\r\n };\r\n\r\n if (__DEV__) {\r\n watcher.onTrack = onTrack as typeof watcher.onTrack;\r\n watcher.onTrigger = onTrigger as typeof watcher.onTrigger;\r\n }\r\n\r\n // FIX: P2-04 immediate watch 旧值语义注释:\r\n // 如果 immediate 为 true,首次执行时 oldValue 为 undefined。\r\n // 这是预期行为:immediate 首次触发时没有\"旧值\"概念,\r\n // 与 Vue 3 的 watch API 行为一致。\r\n if (immediate) {\r\n job();\r\n } else {\r\n oldValue = watcher.run();\r\n }\r\n\r\n return () => {\r\n if (isStopped) return;\r\n isStopped = true;\r\n watcher.stop();\r\n getter = () => {};\r\n cleanupFns.length = 0;\r\n cb = NOOP;\r\n oldValue = undefined;\r\n consecutiveErrors = 0;\r\n };\r\n}\r\n\r\n// ==================== WatchEffect 实现 ====================\r\n\r\nexport function watchEffect(\r\n effectFn: (onCleanup: OnCleanup) => void,\r\n options?: WatchEffectOptions,\r\n): WatchHandle {\r\n return doWatchEffect(effectFn, options);\r\n}\r\n\r\nexport function watchPostEffect(\r\n effectFn: (onCleanup: OnCleanup) => void,\r\n options?: WatchEffectOptions,\r\n): WatchHandle {\r\n return doWatchEffect(effectFn, { ...options, flush: 'post' });\r\n}\r\n\r\nexport function watchSyncEffect(\r\n effectFn: (onCleanup: OnCleanup) => void,\r\n options?: WatchEffectOptions,\r\n): WatchHandle {\r\n return doWatchEffect(effectFn, { ...options, flush: 'sync' });\r\n}\r\n\r\nfunction doWatchEffect(\r\n source: (onCleanup: OnCleanup) => void,\r\n options: WatchEffectOptions = {},\r\n): WatchHandle {\r\n const { flush = 'pre', onTrack, onTrigger } = options;\r\n\r\n const cleanupFns: Array<() => void> = [];\r\n let isStopped = false;\r\n\r\n const onCleanup: OnCleanup = (fn: () => void) => {\r\n cleanupFns.push(fn);\r\n };\r\n\r\n const getter = () => {\r\n if (cleanupFns.length > 0) {\r\n cleanupFns.forEach((f) => f());\r\n cleanupFns.length = 0;\r\n }\r\n source(onCleanup);\r\n };\r\n\r\n let effectRef: ReactiveEffect | undefined;\r\n\r\n const schedulerFn: (...args: unknown[]) => unknown =\r\n flush === 'sync'\r\n ? () => effectRef?.run()\r\n : () => {\r\n if (flush === 'post') {\r\n queuePostFlushCb(() => effectRef?.run());\r\n } else {\r\n queuePreFlushCb(() => effectRef?.run());\r\n }\r\n };\r\n\r\n const currentEffect: ReactiveEffect = new ReactiveEffect(getter, schedulerFn);\r\n effectRef = currentEffect;\r\n\r\n currentEffect.onStop = () => {\r\n if (cleanupFns.length > 0) {\r\n for (let i = cleanupFns.length - 1; i >= 0; i--) {\r\n cleanupFns[i]!();\r\n }\r\n cleanupFns.length = 0;\r\n }\r\n };\r\n\r\n if (__DEV__) {\r\n currentEffect.onTrack = onTrack as typeof currentEffect.onTrack;\r\n currentEffect.onTrigger = onTrigger as typeof currentEffect.onTrigger;\r\n }\r\n\r\n currentEffect.run();\r\n\r\n return () => {\r\n if (isStopped) return;\r\n isStopped = true;\r\n currentEffect.stop();\r\n cleanupFns.length = 0;\r\n source = NOOP;\r\n effectRef = undefined;\r\n };\r\n}\r\n","/**\r\n * @lytjs/reactivity - batch.ts\r\n * FIX: P2-4 REACTIVITY-NEW-05 - 批量操作 API\r\n * \r\n * 提供 batchScope 函数,支持嵌套批量操作和自动提交。\r\n * 允许在批量作用域内执行多个响应式操作,只在作用域结束时统一触发更新。\r\n */\r\n\r\nimport { batch, batchAsync, untrack } from './effect';\r\n\r\n// ============================================================\r\n// Types\r\n// ============================================================\r\n\r\n/** 批量作用域配置选项 */\r\nexport interface BatchScopeOptions {\r\n /** 是否异步提交(默认 false) */\r\n async?: boolean;\r\n /** 作用域名称(用于调试) */\r\n name?: string;\r\n /** 错误处理回调 */\r\n onError?: (error: unknown) => void;\r\n}\r\n\r\n/** 批量作用域上下文 */\r\nexport interface BatchScopeContext {\r\n /** 当前嵌套深度 */\r\n depth: number;\r\n /** 作用域名称 */\r\n name: string;\r\n /** 是否已提交 */\r\n committed: boolean;\r\n /** 是否已取消 */\r\n cancelled: boolean;\r\n}\r\n\r\n/** 批量操作回调 */\r\nexport type BatchScopeCallback<T> = (ctx: BatchScopeContext) => T;\r\n\r\n// ============================================================\r\n// 内部状态\r\n// ============================================================\r\n\r\n/** 当前活跃的批量作用域栈 */\r\nconst scopeStack: BatchScopeContext[] = [];\r\n\r\n/** 全局批量深度计数器 */\r\nlet globalBatchDepth = 0;\r\n\r\n/** 最大嵌套深度限制 */\r\nconst MAX_NESTING_DEPTH = 100;\r\n\r\n// ============================================================\r\n// Core API\r\n// ============================================================\r\n\r\n/**\r\n * 创建批量作用域并执行回调函数。\r\n * 在作用域内所有响应式操作会被批量收集,只在作用域结束时统一触发更新。\r\n * \r\n * 支持嵌套调用:嵌套的 batchScope 会继承外层的批量状态,\r\n * 只有最外层作用域结束时才会真正提交所有更新。\r\n * \r\n * @example\r\n * ```typescript\r\n * batchScope((ctx) => {\r\n * signal1.set(1);\r\n * signal2.set(2);\r\n * // 此时不会触发更新\r\n * \r\n * batchScope((innerCtx) => {\r\n * signal3.set(3);\r\n * // 嵌套作用域,仍然不会触发更新\r\n * });\r\n * });\r\n * // 所有更新在这里统一触发\r\n * ```\r\n * \r\n * @param callback - 在批量作用域内执行的回调函数\r\n * @param options - 批量作用域配置选项\r\n * @returns 回调函数的返回值\r\n */\r\nexport function batchScope<T>(\r\n callback: BatchScopeCallback<T>,\r\n options: BatchScopeOptions = {}\r\n): T {\r\n const { async = false, name = 'batchScope', onError } = options;\r\n\r\n // 检查嵌套深度限制\r\n if (globalBatchDepth >= MAX_NESTING_DEPTH) {\r\n const error = new Error(\r\n `[lytjs/reactivity] Maximum batchScope nesting depth (${MAX_NESTING_DEPTH}) exceeded. ` +\r\n `This may indicate an infinite loop.`\r\n );\r\n if (onError) {\r\n onError(error);\r\n // FIX: P2-1 避免不安全的 undefined as T,在 onError 回调处理后\r\n // 抛出错误以确保调用方知道操作失败(T 永远不会被返回)\r\n throw error;\r\n }\r\n throw error;\r\n }\r\n\r\n // 创建作用域上下文\r\n const ctx: BatchScopeContext = {\r\n depth: globalBatchDepth,\r\n name,\r\n committed: false,\r\n cancelled: false,\r\n };\r\n\r\n // 推入作用域栈\r\n scopeStack.push(ctx);\r\n globalBatchDepth++;\r\n\r\n try {\r\n if (async) {\r\n // 异步模式:使用 batchAsync\r\n // FIX: P1-2 异步 batchScope 作用域栈提前弹出\r\n // 将 scopeStack.pop() 和 globalBatchDepth-- 移到 .then() 回调中,\r\n // 确保 batchAsync 的异步操作完成后再弹出作用域栈\r\n // FIX: P2-1 初始化 result 为 undefined 并添加运行时检查,避免非空断言\r\n let result: T | undefined;\r\n const promise = batchAsync(() => {\r\n result = callback(ctx);\r\n });\r\n promise.then(() => {\r\n ctx.committed = true;\r\n // 异步操作完成后再弹出作用域栈\r\n scopeStack.pop();\r\n globalBatchDepth--;\r\n }).catch((error) => {\r\n // 异步操作失败时也要弹出作用域栈\r\n scopeStack.pop();\r\n globalBatchDepth--;\r\n if (onError) {\r\n onError(error);\r\n } else {\r\n throw error;\r\n }\r\n });\r\n // FIX: P1-6 移除对 undefined 返回值的检查,void 函数合法返回 undefined\r\n return result as T;\r\n } else {\r\n // 同步模式:使用 batch\r\n // FIX: P2-1 初始化 result 为 undefined 并添加运行时检查,避免非空断言\r\n let result: T | undefined;\r\n batch(() => {\r\n result = callback(ctx);\r\n });\r\n ctx.committed = true;\r\n if (result === undefined) {\r\n throw new Error(\r\n '[lytjs/reactivity] batchScope sync mode: callback returned undefined.',\r\n );\r\n }\r\n return result;\r\n }\r\n } catch (error) {\r\n // 同步模式下的错误处理\r\n if (onError) {\r\n onError(error);\r\n // FIX: P2-1 避免不安全的 undefined as T\r\n throw error;\r\n }\r\n throw error;\r\n } finally {\r\n // 仅在同步模式下弹出作用域栈(异步模式在 .then() 中处理)\r\n if (!async) {\r\n scopeStack.pop();\r\n globalBatchDepth--;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 创建异步批量作用域。\r\n * 与 batchScope 类似,但支持 async/await。\r\n * \r\n * @example\r\n * ```typescript\r\n * await batchScopeAsync(async (ctx) => {\r\n * signal1.set(1);\r\n * await someAsyncOperation();\r\n * signal2.set(2);\r\n * });\r\n * ```\r\n * \r\n * @param callback - 异步回调函数\r\n * @param options - 批量作用域配置选项\r\n * @returns Promise,在批量作用域完成时 resolve\r\n */\r\nexport async function batchScopeAsync<T>(\r\n callback: BatchScopeCallback<Promise<T> | T>,\r\n options: BatchScopeOptions = {}\r\n): Promise<T> {\r\n const { name = 'batchScopeAsync', onError } = options;\r\n\r\n // 检查嵌套深度限制\r\n if (globalBatchDepth >= MAX_NESTING_DEPTH) {\r\n const error = new Error(\r\n `[lytjs/reactivity] Maximum batchScope nesting depth (${MAX_NESTING_DEPTH}) exceeded.`\r\n );\r\n if (onError) {\r\n onError(error);\r\n // FIX: P2-1 避免不安全的 undefined as T\r\n return Promise.reject(error);\r\n }\r\n return Promise.reject(error);\r\n }\r\n\r\n // 创建作用域上下文\r\n const ctx: BatchScopeContext = {\r\n depth: globalBatchDepth,\r\n name,\r\n committed: false,\r\n cancelled: false,\r\n };\r\n\r\n // 推入作用域栈\r\n scopeStack.push(ctx);\r\n globalBatchDepth++;\r\n\r\n try {\r\n // FIX: DTS build error - batchAsync 返回 Promise<void>,需要类型断言\r\n let result: T | undefined;\r\n await batchAsync(async () => {\r\n result = await callback(ctx);\r\n });\r\n ctx.committed = true;\r\n return result as T;\r\n } catch (error) {\r\n if (onError) {\r\n onError(error);\r\n // FIX: P2-1 避免不安全的 undefined as T\r\n throw error;\r\n }\r\n throw error;\r\n } finally {\r\n // 弹出作用域栈\r\n scopeStack.pop();\r\n globalBatchDepth--;\r\n }\r\n}\r\n\r\n/**\r\n * 在批量作用域内执行无追踪操作。\r\n * 函数内读取 signal 不会建立依赖关系。\r\n * \r\n * @param fn - 要执行的函数\r\n * @returns 函数的返回值\r\n */\r\nexport function batchScopeUntrack<T>(fn: () => T): T {\r\n return untrack(fn);\r\n}\r\n\r\n// ============================================================\r\n// 工具函数\r\n// ============================================================\r\n\r\n/**\r\n * 获取当前批量作用域深度。\r\n * 0 表示不在任何批量作用域内。\r\n */\r\nexport function getBatchScopeDepth(): number {\r\n return globalBatchDepth;\r\n}\r\n\r\n/**\r\n * 获取当前活跃的批量作用域信息。\r\n * 返回当前作用域栈的只读副本。\r\n */\r\nexport function getCurrentBatchScopeStack(): ReadonlyArray<BatchScopeContext> {\r\n return [...scopeStack];\r\n}\r\n\r\n/**\r\n * 检查当前是否在批量作用域内。\r\n */\r\nexport function isInBatchScope(): boolean {\r\n return globalBatchDepth > 0;\r\n}\r\n\r\n/**\r\n * 等待所有待处理的批量操作完成(异步模式)。\r\n * 返回一个 Promise,在所有异步批量操作完成后 resolve。\r\n *\r\n * FIX: P2-2 flushBatchScopes 中 pendingCallbacks 始终为空(死代码)。\r\n * 原因:batchScope 的异步模式使用 batchAsync 而非 pendingCallbacks 注册回调,\r\n * 导致 pendingCallbacks 永远不会被填充。移除死代码,避免误导维护者。\r\n * 如需等待异步 batchScope 完成,应直接 await batchScopeAsync()。\r\n *\r\n * FIX: P2-batch1-7 保留原因:\r\n * 1. API 兼容性:此函数是公共 API 的一部分,直接删除会导致破坏性变更\r\n * 2. 未来扩展:可用于实现等待所有异步 batchScope 完成的功能\r\n * 3. 测试用途:提供一种同步刷新所有批量操作的方式(即使当前为空操作)\r\n * 4. 类型安全:返回 Promise<void> 与异步 API 签名保持一致\r\n *\r\n * @deprecated 当前实现为空操作,如需等待异步 batchScope 完成,请直接使用 await batchScopeAsync()\r\n */\r\nexport function flushBatchScopes(): Promise<void> {\r\n // FIX: P2-2 pendingCallbacks 在当前实现中始终为空(死代码已移除)。\r\n // 异步批量操作的完成通过 batchScopeAsync() 的 Promise 链保证。\r\n // 此函数保留为空操作以维持 API 兼容性,未来可用于等待所有异步 batchScope 完成。\r\n return Promise.resolve();\r\n}\r\n\r\n// ============================================================\r\n// Internal API (for testing)\r\n// ============================================================\r\n\r\n/** @internal 重置批量作用域全局状态(仅用于测试) */\r\nexport function _resetBatchScopeState(): void {\r\n scopeStack.length = 0;\r\n globalBatchDepth = 0;\r\n}\r\n\r\n/** @internal 获取待处理回调数量(仅用于测试) */\r\n// FIX: P2-3 pendingCallbacks 已移除,此函数始终返回 0\r\nexport function _getPendingCallbacksCount(): number {\r\n return 0;\r\n}\r\n","// src/index.ts\r\n// @lytjs/reactivity 主入口 - re-export 所有公共 API\r\n\r\nexport {\r\n // reactive\r\n reactive,\r\n shallowReactive,\r\n readonly,\r\n shallowReadonly,\r\n isReactive,\r\n isReadonly,\r\n isProxy,\r\n toRaw,\r\n markRaw,\r\n} from './reactive';\r\n\r\nexport {\r\n // ref\r\n ref,\r\n shallowRef,\r\n triggerRef,\r\n isRef,\r\n isShallowRef,\r\n isComputedRef,\r\n unref,\r\n toRef,\r\n toRefs,\r\n toValue,\r\n customRef,\r\n} from './ref';\r\n\r\nexport {\r\n // computed\r\n computed,\r\n setSSRMode,\r\n} from './computed';\r\n\r\n// scope and async sub-path entries are available at:\r\n// @lytjs/reactivity/scope - effectScope, getCurrentScope, onScopeDispose\r\n// @lytjs/reactivity/async - asyncComputed, useAsyncState\r\n\r\nexport { effectScope, getCurrentScope, onScopeDispose } from './effect-scope';\r\nexport type { EffectScope, EffectScopeOptions } from './effect-scope';\r\n\r\nexport {\r\n // watch\r\n watch,\r\n watchEffect,\r\n watchPostEffect,\r\n watchSyncEffect,\r\n} from './watch';\r\n\r\nexport {\r\n // effect\r\n effect,\r\n stop,\r\n pauseTracking,\r\n enableTracking,\r\n resetTracking,\r\n batch,\r\n batchAsync,\r\n untrack,\r\n onEffectCleanup,\r\n // 首次渲染优化\r\n withFirstRenderOptimization,\r\n shouldSkipTracking,\r\n getSkippedTrackingCount,\r\n resetSkippedTrackingCount,\r\n} from './effect';\r\n\r\n// FIX: P2-4 批量操作 API\r\nexport {\r\n batchScope,\r\n batchScopeAsync,\r\n batchScopeUntrack,\r\n getBatchScopeDepth,\r\n getCurrentBatchScopeStack,\r\n isInBatchScope,\r\n flushBatchScopes,\r\n} from './batch';\r\n\r\nexport type { BatchScopeOptions, BatchScopeContext, BatchScopeCallback } from './batch';\r\n\r\nexport {\r\n // signal\r\n signal,\r\n computed as signalComputed,\r\n computedSignal,\r\n writableComputedSignal,\r\n readonlySignal,\r\n set,\r\n update,\r\n valueOf,\r\n // signal batch/untrack\r\n signalBatch,\r\n signalUntrack,\r\n} from './signal';\r\n\r\nexport type {\r\n Ref,\r\n ShallowRef,\r\n ComputedRef,\r\n WritableComputedRef,\r\n ReactiveEffectRunner,\r\n /** 响应式信号类型,表示一个可读的响应式值 */\r\n Signal,\r\n /** 计算信号类型,表示一个只读的计算响应式值 */\r\n ComputedSignal,\r\n /** 可写计算信号类型,表示一个可读写的计算响应式值 */\r\n WritableComputedSignal,\r\n /** 可写信号类型,表示一个可读写的响应式值 */\r\n WritableSignal,\r\n /** 只读信号类型 */\r\n ReadonlySignal,\r\n /** 订阅者回调类型 */\r\n Subscriber,\r\n WatchOptions,\r\n WatchEffectOptions,\r\n WatchSource,\r\n WatchCallback,\r\n WatchHandle,\r\n ComputedGetter,\r\n ComputedSetter,\r\n WritableComputedOptions,\r\n ReactiveEffectOptions,\r\n DebuggerEvent,\r\n UnwrapRef,\r\n UnwrapNestedRefs,\r\n DeepReadonly,\r\n ToRefs,\r\n ReactiveObject,\r\n} from './types';\r\n\r\nexport {\r\n RefSymbol,\r\n ShallowRefSymbol,\r\n ComputedRefSymbol,\r\n ReactiveSymbol,\r\n ReadonlySymbol,\r\n} from './constants';\r\n\r\n// ============================================================\r\n// FIX: P2-3 调试工具支持 - DevTools 集成\r\n// ============================================================\r\n\r\n/** DevTools 信号依赖信息 */\r\nexport interface DevToolsSignalInfo {\r\n id: string;\r\n name: string;\r\n value: unknown;\r\n dependencies: string[];\r\n dependents: string[];\r\n}\r\n\r\n/** DevTools effect 信息 */\r\nexport interface DevToolsEffectInfo {\r\n id: string;\r\n name: string;\r\n active: boolean;\r\n dependencies: string[];\r\n}\r\n\r\n/** LytJS DevTools 全局对象接口 */\r\nexport interface LytJSDevTools {\r\n /** 版本号 */\r\n version: string;\r\n /** 获取所有信号信息 */\r\n getSignals: () => DevToolsSignalInfo[];\r\n /** 获取所有 effect 信息 */\r\n getEffects: () => DevToolsEffectInfo[];\r\n /** 监听信号变化 */\r\n onSignalChange: (callback: (signalId: string, value: unknown) => void) => () => void;\r\n /** 监听 effect 执行 */\r\n onEffectRun: (callback: (effectId: string) => void) => () => void;\r\n /** 启用/禁用调试 */\r\n setEnabled: (enabled: boolean) => void;\r\n /** 当前是否启用 */\r\n isEnabled: () => boolean;\r\n}\r\n\r\n/** 调试工具全局对象 */\r\ndeclare global {\r\n interface Window {\r\n __LYTJS_DEVTOOLS__?: LytJSDevTools;\r\n }\r\n}\r\n\r\n/** 信号变化监听器集合 */\r\nconst signalChangeListeners = new Set<(signalId: string, value: unknown) => void>();\r\n/** effect 执行监听器集合 */\r\nconst effectRunListeners = new Set<(effectId: string) => void>();\r\n/** 调试工具启用状态 */\r\nlet devToolsEnabled = false;\r\n\r\n// FIX: P2-4 DevTools 通知批处理:使用 microtask 合并高频通知,\r\n// 避免在短时间内大量信号变化时逐个触发监听器导致性能问题\r\nlet pendingSignalNotifications: Array<{ signalId: string; value: unknown }> | null = null;\r\nlet pendingEffectNotifications: Array<string> | null = null;\r\nlet devToolsFlushScheduled = false;\r\n\r\nfunction scheduleDevToolsFlush(): void {\r\n if (devToolsFlushScheduled) return;\r\n devToolsFlushScheduled = true;\r\n queueMicrotask(flushDevToolsNotifications);\r\n}\r\n\r\nfunction flushDevToolsNotifications(): void {\r\n devToolsFlushScheduled = false;\r\n const signals = pendingSignalNotifications;\r\n const effects = pendingEffectNotifications;\r\n pendingSignalNotifications = null;\r\n pendingEffectNotifications = null;\r\n\r\n if (signals) {\r\n // 使用 Map 去重,同一 signalId 只保留最后一次值\r\n const deduplicated = new Map<string, unknown>();\r\n for (const { signalId, value } of signals) {\r\n deduplicated.set(signalId, value);\r\n }\r\n signalChangeListeners.forEach((cb) => {\r\n try {\r\n for (const [signalId, value] of deduplicated) {\r\n cb(signalId, value);\r\n }\r\n } catch (_e) {\r\n // 忽略监听器错误\r\n }\r\n });\r\n }\r\n\r\n if (effects) {\r\n // 使用 Set 去重\r\n const deduplicated = new Set(effects);\r\n effectRunListeners.forEach((cb) => {\r\n try {\r\n for (const effectId of deduplicated) {\r\n cb(effectId);\r\n }\r\n } catch (_e) {\r\n // 忽略监听器错误\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 初始化 LytJS DevTools 全局对象\r\n * 在开发环境下自动挂载到 window.__LYTJS_DEVTOOLS__\r\n */\r\nfunction initDevTools(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n const devTools: LytJSDevTools = {\r\n version: '0.9.9',\r\n getSignals: () => {\r\n // 返回信号信息(由具体实现填充)\r\n return [];\r\n },\r\n getEffects: () => {\r\n // 返回 effect 信息(由具体实现填充)\r\n return [];\r\n },\r\n onSignalChange: (callback) => {\r\n signalChangeListeners.add(callback);\r\n return () => signalChangeListeners.delete(callback);\r\n },\r\n onEffectRun: (callback) => {\r\n effectRunListeners.add(callback);\r\n return () => effectRunListeners.delete(callback);\r\n },\r\n setEnabled: (enabled) => {\r\n devToolsEnabled = enabled;\r\n },\r\n isEnabled: () => devToolsEnabled,\r\n };\r\n\r\n window.__LYTJS_DEVTOOLS__ = devTools;\r\n}\r\n\r\n/**\r\n * 通知 DevTools 信号变化\r\n * @internal\r\n * FIX: P2-4 使用批处理合并高频通知,减少监听器调用次数\r\n */\r\nexport function _notifyDevToolsSignalChange(signalId: string, value: unknown): void {\r\n if (!devToolsEnabled) return;\r\n if (!pendingSignalNotifications) {\r\n pendingSignalNotifications = [];\r\n }\r\n pendingSignalNotifications.push({ signalId, value });\r\n scheduleDevToolsFlush();\r\n}\r\n\r\n/**\r\n * 通知 DevTools effect 执行\r\n * @internal\r\n * FIX: P2-4 使用批处理合并高频通知,减少监听器调用次数\r\n */\r\nexport function _notifyDevToolsEffectRun(effectId: string): void {\r\n if (!devToolsEnabled) return;\r\n if (!pendingEffectNotifications) {\r\n pendingEffectNotifications = [];\r\n }\r\n pendingEffectNotifications.push(effectId);\r\n scheduleDevToolsFlush();\r\n}\r\n\r\n// 在开发环境下自动初始化\r\nif (typeof __DEV__ !== 'undefined' && __DEV__) {\r\n initDevTools();\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/signal.ts","../src/effect-scope.ts","../src/effect.ts","../src/shared.ts","../src/reactive.ts","../src/ref.ts","../src/computed.ts","../src/watch.ts","../src/batch.ts","../src/index.ts"],"names":["signalFn","computedFn","it","next","REACTIVITY_MAX_TRIGGER_DEPTH","readonlyFn","effect","error","unsafeCast","isSymbol","isObject","isMap","isSet","isReadonly","hasOwn","hasChanged","result","ref","set","computed","isFunction","NOOP","isArray","queuePostFlushCb","queuePreFlushCb"],"mappings":"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","file":"index.cjs","sourcesContent":["// src/constants.ts\n// 内部符号常量\n\n// DEV 检测方式说明:\n// 统一使用 typeof 检测方式,兼容编译时 define/replace 替换和未配置构建替换的场景。\n// 当打包工具(如 rollup/esbuild)通过 define 插件将 __DEV__ 替换为字面量 true/false 时,\n// typeof 检测会被优化为直接的字面量判断,实现死代码消除(DCE)。\n// 当未配置构建替换时,typeof 检测也能安全降级为 false,避免 ReferenceError。\nconst DEV = typeof __DEV__ !== 'undefined' ? __DEV__ : false;\n\nexport const RefSymbol: unique symbol = Symbol(DEV ? 'ref' : undefined);\nexport const ShallowRefSymbol: unique symbol = Symbol(DEV ? 'shallow_ref' : undefined);\nexport const ComputedRefSymbol: unique symbol = Symbol(DEV ? 'computed_ref' : undefined);\nexport const ReactiveSymbol: unique symbol = Symbol(DEV ? 'reactive' : undefined);\nexport const ReadonlySymbol: unique symbol = Symbol(DEV ? 'readonly' : undefined);\nexport const SignalSymbol: unique symbol = Symbol(DEV ? 'signal' : undefined);\nexport const ComputedSignalSymbol: unique symbol = Symbol(DEV ? 'computed_signal' : undefined);\n\n// ReactiveFlags - 用于 Proxy handler 内部标记\nexport const ReactiveFlags = {\n IS_REACTIVE: '__v_isReactive',\n IS_READONLY: '__v_isReadonly',\n IS_SHALLOW: '__v_isShallow',\n IS_REF: '__v_isRef',\n RAW: '__v_raw',\n SKIP: '__v_skip',\n} as const;\n\n// Track/Trigger 操作类型\nexport const TrackOpTypes = {\n GET: 'get',\n HAS: 'has',\n ITERATE: 'iterate',\n} as const;\n\nexport const TriggerOpTypes = {\n SET: 'set',\n ADD: 'add',\n DELETE: 'delete',\n CLEAR: 'clear',\n} as const;\n\n// 内部共享常量\nexport const ITERATE_KEY = Symbol('iterate');\n","/**\n * @lytjs/reactivity - Signal\n * 独立自包含的 Signal 响应式原语。\n * 拥有独立的订阅/通知机制,同时桥接 effect 系统保持互操作性。\n */\n\nimport { SignalSymbol, ComputedSignalSymbol, TrackOpTypes, TriggerOpTypes } from './constants';\nimport { track, trigger } from './effect';\nimport { REACTIVITY_MAX_TRIGGER_DEPTH } from '@lytjs/common-constants';\nimport type { Subscriber } from './shared/types';\n\n// ============================================================\n// 类型定义\n// ============================================================\n\n/** 订阅者回调 */\nexport type { Subscriber };\n\n/** Signal 只读接口 */\nexport interface Signal<T = unknown> {\n /** 读取当前值 */\n (): T;\n readonly [SignalSymbol]: true;\n}\n\n/** WritableSignal 可写接口 */\nexport interface WritableSignal<T = unknown> extends Signal<T> {\n /** 设置新值 */\n set(newValue: T): void;\n /** 通过 updater 函数更新值 */\n update(updater: (prev: T) => T): void;\n /** 停止所有订阅通知,释放资源 */\n dispose(): void;\n /** @internal 订阅变更通知 */\n _subscribe(subscriber: Subscriber): () => void;\n /** FIX: P1-5 REACTIVITY-NEW-03 - 手动清理依赖,防止内存泄漏 */\n cleanup(): void;\n}\n\n/** ComputedSignal 计算信号接口 */\nexport interface ComputedSignal<T = unknown> extends Signal<T> {\n /** 停止计算信号的依赖追踪和更新 */\n dispose(): void;\n /** @deprecated 使用 dispose() */\n stop?: () => void;\n readonly [ComputedSignalSymbol]: true;\n}\n\n/** WritableComputedSignal 可写计算信号接口 */\nexport interface WritableComputedSignal<T = unknown> extends ComputedSignal<T> {\n /** 设置新值(通过 setter 函数) */\n set(newValue: T): void;\n}\n\n/** ReadonlySignal 只读信号接口 */\nexport interface ReadonlySignal<T = unknown> {\n /** 读取当前值 */\n (): T;\n readonly [SignalSymbol]: true;\n}\n\n// ============================================================\n// 全局追踪状态\n// ============================================================\n\n/** 当前活跃的订阅者(computed 读取 signal 时自动追踪) */\nlet activeSubscriber: Subscriber | null = null;\n\n/** 是否处于 untrack 模式 */\nlet isUntracked = false;\n\n/** 依赖追踪回调:computed 使用此回调记录 signal 依赖关系 */\nlet trackDependency: ((signal: WritableSignal<unknown>, unsubscribe: () => void) => void) | null =\n null;\n\n/** 当前 batch 嵌套深度 */\nlet batchDepth = 0;\n\n/** FIX: P2-05 batch 嵌套深度限制,防止无限递归 */\nconst MAX_BATCH_DEPTH = 100;\n\n/** batch 期间待通知的订阅者 */\nconst pendingNotifications = new Set<Subscriber>();\n\n/** batch 期间待执行的 effect 系统 trigger 操作(自动去重) */\n// FIX: P1-05 使用 Map<symbol,...> 替代 Map<string,...>,\n// 避免不同 signal 的 Symbol().toString() 产生相同的字符串 key 导致去重错误\n// FIX: P2-7 去重时保留最新 newValue:当同一个 signalKey 多次 set 时,\n// Map.set 会覆盖旧值,确保最终 trigger 使用最新的 newValue,\n// 避免因去重导致订阅者收到过期的旧值。\nconst pendingTriggerOps = new Map<\n symbol,\n { store: Record<symbol, unknown>; signalKey: symbol; newValue?: unknown }\n>();\n\n/** 是否正在执行通知 */\nlet isNotifying = false;\n\n// ============================================================\n// signal — 核心 Signal 原语\n// ============================================================\n\n/**\n * 创建一个可写 Signal。\n * 使用闭包变量存储值,Set 管理订阅者。\n */\nexport function signal<T>(initialValue: T): WritableSignal<T> {\n let value = initialValue;\n const subscribers = new Set<Subscriber>();\n let disposed = false;\n\n // effect 系统桥接:使用 store 对象作为 track/trigger 的 target\n const store: Record<symbol, T> = {};\n const SIGNAL_KEY = Symbol('signal_value');\n store[SIGNAL_KEY] = initialValue;\n\n const signalFn = function signalFn(): T {\n // Signal 内部追踪\n // FIX: P0-01 闭包捕获过期 activeSubscriber — 立即捕获当前订阅者引用,\n // 避免闭包中的 activeSubscriber 在异步回调中被修改后指向错误的订阅者\n const currentSubscriber = activeSubscriber;\n if (currentSubscriber && !isUntracked && !disposed) {\n if (!subscribers.has(currentSubscriber)) {\n subscribers.add(currentSubscriber);\n if (trackDependency) {\n trackDependency(signalFn as WritableSignal<unknown>, () => {\n subscribers.delete(currentSubscriber);\n });\n }\n }\n }\n // effect 系统桥接追踪\n if (!disposed) {\n track(store, TrackOpTypes.GET, SIGNAL_KEY);\n }\n return value;\n } as WritableSignal<T>;\n\n Object.defineProperty(signalFn, SignalSymbol, { value: true });\n\n signalFn.set = (newValue: T): void => {\n if (disposed) return;\n if (Object.is(newValue, value)) return;\n value = newValue;\n store[SIGNAL_KEY] = newValue;\n notifySubscribers(subscribers, store, SIGNAL_KEY, newValue);\n };\n\n signalFn.update = (updater: (prev: T) => T): void => {\n if (disposed) return;\n const newValue = updater(value);\n if (Object.is(newValue, value)) return;\n value = newValue;\n store[SIGNAL_KEY] = newValue;\n notifySubscribers(subscribers, store, SIGNAL_KEY, newValue);\n };\n\n signalFn.dispose = (): void => {\n disposed = true;\n subscribers.clear();\n };\n\n // FIX: P1-5 REACTIVITY-NEW-03 - 添加 cleanup 方法,允许手动清理依赖\n signalFn.cleanup = (): void => {\n // 清理所有订阅者,但保持 signal 可用\n subscribers.clear();\n // 清理 effect 系统桥接的依赖:直接触发 SET 通知使依赖失效,\n // 不传旧值以避免读取 signal 值\n trigger(store, TriggerOpTypes.SET, SIGNAL_KEY);\n };\n\n signalFn._subscribe = (subscriber: Subscriber): (() => void) => {\n if (disposed) return () => {};\n subscribers.add(subscriber);\n return () => subscribers.delete(subscriber);\n };\n\n return signalFn;\n}\n\n// ============================================================\n// computed — 独立计算信号\n// ============================================================\n\n/**\n * 内部工厂函数:创建计算信号的核心逻辑。\n * computed 和 writableComputedSignal 共享此实现,消除约 80 行重复代码。\n */\nfunction createComputedSignalInternal<T>(\n getter: () => T,\n typeName: string,\n): {\n computedFn: ComputedSignal<T>;\n invalidate: () => void;\n dispose: () => void;\n} {\n let value: T | undefined;\n let dirty = true;\n let isComputing = false;\n const dependencies = new Map<WritableSignal<unknown>, () => void>();\n const subscribers = new Set<Subscriber>();\n let disposed = false;\n\n // effect 系统桥接:使用 store 对象作为 track/trigger 的 target\n const store: Record<symbol, unknown> = {};\n const COMPUTED_SIGNAL_KEY = Symbol('computed_signal_value');\n\n const invalidate = (): void => {\n if (disposed) return;\n dirty = true;\n // effect 系统桥接触发\n trigger(store, TriggerOpTypes.SET, COMPUTED_SIGNAL_KEY);\n const subs = Array.from(subscribers);\n for (const sub of subs) {\n sub();\n }\n };\n\n const computedFn = function computedFn(): T {\n if (disposed) return value as T;\n\n // effect 系统桥接追踪\n track(store, TrackOpTypes.GET, COMPUTED_SIGNAL_KEY);\n\n // 追踪:如果有活跃订阅者,注册自身\n if (activeSubscriber && !isUntracked) {\n subscribers.add(activeSubscriber);\n }\n\n if (dirty) {\n if (isComputing) {\n throw new Error(`[lytjs/signal] Circular dependency detected in ${typeName}.`);\n }\n isComputing = true;\n try {\n // 清理旧依赖(调用 unsubscribe 函数)\n for (const unsubscribe of dependencies.values()) {\n unsubscribe();\n }\n dependencies.clear();\n\n // 在活跃订阅者上下文中执行 getter,自动追踪新依赖\n const prevSubscriber = activeSubscriber;\n const prevTrackDependency = trackDependency;\n activeSubscriber = invalidate; // 注册 invalidate 作为依赖的订阅者\n trackDependency = (dep: WritableSignal<unknown>, unsubscribe: () => void) => {\n dependencies.set(dep, unsubscribe);\n };\n try {\n value = getter();\n dirty = false;\n } finally {\n activeSubscriber = prevSubscriber;\n trackDependency = prevTrackDependency;\n }\n } finally {\n isComputing = false;\n }\n }\n\n return value as T;\n } as ComputedSignal<T>;\n\n Object.defineProperty(computedFn, ComputedSignalSymbol, { value: true });\n\n const dispose = (): void => {\n disposed = true;\n for (const unsubscribe of dependencies.values()) {\n unsubscribe();\n }\n dependencies.clear();\n subscribers.clear();\n };\n\n return { computedFn, invalidate, dispose };\n}\n\n/**\n * 创建一个计算信号。\n * 惰性求值、自动依赖追踪与清理、循环依赖检测。\n */\nexport function computed<T>(fn: () => T): ComputedSignal<T> {\n const { computedFn, dispose } = createComputedSignalInternal(fn, 'computed signal');\n\n computedFn.dispose = dispose;\n computedFn.stop = dispose;\n\n return computedFn;\n}\n\n// ============================================================\n// writableComputed — 可写计算信号\n// ============================================================\n\n/**\n * 创建一个可写计算信号。\n * 通过 getter 读取计算值,通过 setter 写入值。\n * setter 通常会间接更新 getter 依赖的底层 signal。\n */\nexport function writableComputedSignal<T>(\n getter: () => T,\n setter: (value: T) => void,\n): WritableComputedSignal<T> {\n const { computedFn, dispose } = createComputedSignalInternal(getter, 'writable computed signal');\n\n (computedFn as WritableComputedSignal<T>).set = (newValue: T): void => {\n setter(newValue);\n };\n\n computedFn.dispose = dispose;\n computedFn.stop = dispose;\n\n return computedFn as WritableComputedSignal<T>;\n}\n\n// ============================================================\n// batch — 批量更新\n// ============================================================\n\n/**\n * 在批处理中执行函数。\n * batch 内多次 signal.set 只在函数结束后统一触发一次通知。\n */\nexport function signalBatch(fn: () => void): void {\n // FIX: P2-05 batch 嵌套深度限制\n if (batchDepth >= MAX_BATCH_DEPTH) {\n if (__DEV__) {\n console.warn(\n `[lytjs/signal] signalBatch() nesting depth exceeded ${MAX_BATCH_DEPTH}. ` +\n `This may indicate an infinite loop. The batch call will be executed synchronously.`,\n );\n }\n fn();\n return;\n }\n batchDepth++;\n try {\n fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) {\n flushPendingNotifications();\n }\n }\n}\n\n// ============================================================\n// untrack — 取消追踪\n// ============================================================\n\n/**\n * 在取消追踪模式中执行函数。\n * 函数内读取 signal 不会建立依赖关系。\n */\nexport function signalUntrack<T>(fn: () => T): T {\n const prevIsUntracked = isUntracked;\n isUntracked = true;\n try {\n return fn();\n } finally {\n isUntracked = prevIsUntracked;\n }\n}\n\n/** @internal 检查当前是否处于 untrack 模式(供 effect 系统桥接使用) */\nexport function _isSignalUntracked(): boolean {\n return isUntracked;\n}\n\n// ============================================================\n// 内部通知机制\n// ============================================================\n\nfunction notifySubscribers(\n subscribers: Set<Subscriber>,\n store?: Record<symbol, unknown>,\n signalKey?: symbol,\n newValue?: unknown,\n): void {\n // FIX: P0-02 当 isNotifying 为 true 时也走 batch 路径,\n // 避免在 flushPendingNotifications 执行期间嵌套触发同步通知导致无限递归\n if (batchDepth > 0 || isNotifying) {\n const it = subscribers.values();\n let next = it.next();\n while (!next.done) {\n pendingNotifications.add(next.value);\n next = it.next();\n }\n // effect 系统桥接:batch 期间也延迟 trigger(去重)\n if (store && signalKey !== undefined) {\n // FIX: P1-05 直接使用 symbol 作为 key,避免 String() 转换导致的 key 冲突\n pendingTriggerOps.set(signalKey, { store, signalKey, newValue });\n }\n return;\n }\n const it = subscribers.values();\n let next = it.next();\n while (!next.done) {\n next.value();\n next = it.next();\n }\n // effect 系统桥接触发\n if (store && signalKey !== undefined) {\n trigger(store, TriggerOpTypes.SET, signalKey, newValue);\n }\n}\n\nfunction flushPendingNotifications(): void {\n if (isNotifying) return;\n isNotifying = true;\n try {\n let iterations = 0;\n while (\n (pendingNotifications.size > 0 || pendingTriggerOps.size > 0) &&\n iterations < REACTIVITY_MAX_TRIGGER_DEPTH\n ) {\n const notifications = new Set(pendingNotifications);\n const triggers = new Set(pendingTriggerOps.values());\n pendingNotifications.clear();\n pendingTriggerOps.clear();\n\n const notifIt = notifications.values();\n let notifNext = notifIt.next();\n while (!notifNext.done) {\n notifNext.value();\n notifNext = notifIt.next();\n }\n\n // 执行延迟的 effect 系统 trigger(已去重)\n const triggerIt = triggers.values();\n let triggerNext = triggerIt.next();\n while (!triggerNext.done) {\n const { store, signalKey, newValue } = triggerNext.value;\n trigger(store, TriggerOpTypes.SET, signalKey, newValue);\n triggerNext = triggerIt.next();\n }\n\n iterations++;\n }\n } finally {\n isNotifying = false;\n }\n}\n\n// ============================================================\n// 适配器层 — 旧 API 兼容\n// ============================================================\n\n/**\n * @deprecated 使用 computed() 代替\n */\nexport function computedSignal<T>(fn: () => T): ComputedSignal<T> {\n return computed(fn);\n}\n\n/** 读取 signal 值 */\nexport function valueOf<T>(sig: Signal<T>): T {\n return sig();\n}\n\n/** 设置 signal 值(适配器) */\nexport function set<T>(sig: WritableSignal<T> | ReadonlySignal<T>, newValue: T): void {\n // FIX: P2-35 使用类型守卫检查是否为 WritableSignal\n if (isWritableSignal(sig)) {\n sig.set(newValue);\n }\n // ReadonlySignal: 静默忽略(保持旧行为)\n}\n\n/** 类型守卫:检查信号是否为可写信号 */\nfunction isWritableSignal<T>(sig: WritableSignal<T> | ReadonlySignal<T>): sig is WritableSignal<T> {\n return typeof sig === 'function' && 'set' in sig;\n}\n\n/** 通过 updater 更新 signal 值(适配器) */\nexport function update<T>(sig: WritableSignal<T>, updater: (prev: T) => T): void {\n sig.update(updater);\n}\n\n/** 创建只读 signal(适配器) */\nexport function readonlySignal<T>(sig: Signal<T>): ReadonlySignal<T> {\n const readonlyFn = function readonlyFn(): T {\n return sig();\n } as ReadonlySignal<T>;\n Object.defineProperty(readonlyFn, SignalSymbol, { value: true });\n return readonlyFn;\n}\n\n// ============================================================\n// 调试/测试 API\n// ============================================================\n\n/** @internal 获取当前活跃订阅者(仅用于测试) */\nexport function _getActiveSubscriber(): Subscriber | null {\n return activeSubscriber;\n}\n\n/** @internal 获取 batch 深度(仅用于测试) */\nexport function _getBatchDepth(): number {\n return batchDepth;\n}\n\n/** @internal 获取待通知订阅者数量(仅用于测试) */\nexport function _getPendingNotificationsCount(): number {\n return pendingNotifications.size;\n}\n\n/** @internal 重置全局状态(仅用于测试) */\nexport function _resetSignalGlobalState(): void {\n activeSubscriber = null;\n isUntracked = false;\n batchDepth = 0;\n pendingNotifications.clear();\n isNotifying = false;\n // FIX: P1-4 REACTIVITY-NEW-05 - 遗漏 pendingTriggerOps 清理\n // 确保测试间状态完全隔离,避免 pendingTriggerOps 泄漏导致测试不稳定\n pendingTriggerOps.clear();\n}\n","// src/effect-scope.ts\n// Vue 3 风格的 effectScope API\n// 用于批量管理响应式副作用的创建和销毁\n\nimport type { EffectScopeEntry } from './effect-scope-registrar';\nimport { warn, error } from '@lytjs/common-error';\nimport { unsafeCast } from '@lytjs/common-assertions';\n\nexport interface EffectScope {\n /** 当前 scope 是否活跃 */\n active: boolean;\n /** scope 收集的 effects */\n effects: EffectScopeEntry[];\n /** scope 注册的清理回调 */\n cleanups: (() => void)[];\n /** 父 scope(嵌套时自动关联) */\n parent: EffectScope | undefined;\n /** 是否脱离父 scope(detached scope 不会被父 scope stop) */\n detached: boolean;\n /** 在 scope 上下文中执行 fn,期间创建的 effect 会被自动收集 */\n run<T>(fn: () => T): T | undefined;\n /** 停止 scope,清理所有收集的 effects 和 cleanups */\n stop(): void;\n}\n\nexport interface EffectScopeOptions {\n detached?: boolean;\n}\n\n/** 当前活跃的 effectScope(唯一来源) */\nlet activeEffectScope: EffectScope | undefined;\n\n/** 获取当前活跃的 effectScope */\nexport function getActiveEffectScope(): EffectScope | undefined {\n return activeEffectScope;\n}\n\n/** 设置当前活跃的 effectScope */\nexport function setActiveEffectScope(scope: EffectScope | undefined): void {\n activeEffectScope = scope;\n}\n\n/**\n * 创建一个 effect scope,用于批量管理响应式副作用。\n *\n * @param options - 配置选项。支持传入 boolean(兼容旧 API)或 EffectScopeOptions 对象。\n * @returns EffectScope 实例\n *\n * @example\n * ```ts\n * const scope = effectScope()\n * scope.run(() => {\n * const count = ref(0)\n * watch(count, () => console.log(count.value))\n * })\n * // 不再需要时一次性停止所有副作用\n * scope.stop()\n * ```\n */\nexport function effectScope(options?: boolean | EffectScopeOptions): EffectScope {\n const detached = typeof options === 'boolean' ? options : options?.detached;\n const scope: EffectScope = {\n active: true,\n effects: [],\n cleanups: [],\n parent: activeEffectScope,\n detached: !!detached,\n\n run(fn) {\n if (!this.active) {\n if (__DEV__) {\n warn(`EffectScope is not active. Cannot run fn.`);\n }\n return;\n }\n const prevScope = activeEffectScope;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n activeEffectScope = this;\n try {\n return fn();\n } finally {\n activeEffectScope = prevScope;\n }\n },\n\n stop() {\n if (!this.active) return;\n this.active = false;\n for (const effect of this.effects) {\n try {\n effect.stop();\n } catch (e) {\n error(`Error stopping effect in scope: ${String(e)}`);\n }\n }\n for (const cleanup of this.cleanups) {\n try {\n cleanup();\n } catch (e) {\n error(`Error running cleanup in scope: ${String(e)}`);\n }\n }\n if (this.parent) {\n const idx = this.parent.effects.indexOf(unsafeCast<EffectScopeEntry>(this));\n if (idx !== -1) {\n this.parent.effects.splice(idx, 1);\n }\n }\n this.effects.length = 0;\n this.cleanups.length = 0;\n this.parent = undefined;\n },\n } as EffectScope;\n\n if (!scope.detached && activeEffectScope) {\n // 双重断言是必要的:EffectScope 对象字面量实现了 EffectScopeEntry 所需的\n // stop() 方法,但 TypeScript 无法自动推断对象字面量满足联合类型。\n // EffectScopeEntry = ReactiveEffect | EffectScope,此处 scope 是 EffectScope 实例。\n activeEffectScope.effects.push(unsafeCast<EffectScopeEntry>(scope));\n }\n\n return scope;\n}\n\n/**\n * 获取当前活跃的 effectScope。\n */\nexport function getCurrentScope(): EffectScope | undefined {\n return activeEffectScope;\n}\n\n/**\n * 在当前活跃的 effectScope 中注册一个清理回调。\n * 当 scope 被 stop 时,所有注册的回调会被执行。\n *\n * @param fn - 清理回调函数\n *\n * @example\n * ```ts\n * const scope = effectScope()\n * scope.run(() => {\n * onScopeDispose(() => {\n * console.log('scope disposed')\n * })\n * })\n * scope.stop() // 输出: scope disposed\n * ```\n */\nexport function onScopeDispose(fn: () => void): void {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (__DEV__) {\n warn(\n 'onScopeDispose() was called when there was no active effect scope to be associated with.',\n );\n }\n}\n","// src/effect.ts\n// 响应式副作用系统核心\n\nimport { ITERATE_KEY } from './constants';\nimport type { ReactiveEffectRunner } from './types';\nimport { warn } from '@lytjs/common-error';\nimport { _isSignalUntracked } from './signal';\nimport { getActiveEffectScope } from './effect-scope';\nimport { REACTIVITY_MAX_TRIGGER_DEPTH } from '@lytjs/common-constants';\n\n// ==================== 全局状态 ====================\n\nlet activeEffect: ReactiveEffect | undefined;\nlet _trackDepth = 0;\nconst targetMap = new WeakMap<object, Map<string | symbol, Dep>>();\nlet shouldTrack = true;\nconst trackStack: boolean[] = [];\n\n// ==================== 首次渲染优化 ====================\n\n/** 标记当前是否处于首次渲染优化期间 */\nlet isFirstRenderPass = false;\n\n/** 记录被跳过的追踪次数(用于调试和测试验证) */\nlet skippedTrackingCount = 0;\n\n/**\n * 包裹首次渲染过程,期间禁用响应式依赖收集。\n * 支持嵌套调用:如果外层已经处于首次渲染优化期间,\n * 内层调用不会提前重置标志位。\n */\nexport function withFirstRenderOptimization<T>(fn: () => T): T {\n const wasFirstRender = isFirstRenderPass;\n isFirstRenderPass = true;\n try {\n return fn();\n } finally {\n if (!wasFirstRender) {\n isFirstRenderPass = false;\n }\n }\n}\n\n/**\n * 检查当前是否应跳过响应式依赖收集。\n * 在 withFirstRenderOptimization 执行期间返回 true。\n */\nexport function shouldSkipTracking(): boolean {\n return isFirstRenderPass;\n}\n\n/**\n * 获取被跳过的追踪次数(用于调试和测试)。\n */\nexport function getSkippedTrackingCount(): number {\n return skippedTrackingCount;\n}\n\n/**\n * 重置被跳过的追踪计数(用于测试)。\n */\nexport function resetSkippedTrackingCount(): void {\n skippedTrackingCount = 0;\n}\n\n// 只读访问器,防止外部修改内部状态\n\n/**\n * 获取当前活跃的 ReactiveEffect 实例。\n * 在 effect 执行期间返回当前正在运行的 effect,否则返回 undefined。\n *\n * @returns 当前活跃的 effect,如果没有则返回 undefined\n */\nexport function getActiveEffect(): ReactiveEffect | undefined {\n return activeEffect;\n}\n\n/**\n * 获取当前是否应该进行依赖追踪。\n * 可通过 pauseTracking/enableTracking 控制。\n *\n * @returns 是否应该进行依赖追踪\n */\nexport function getShouldTrack(): boolean {\n return shouldTrack;\n}\n\n// ==================== Dep ====================\n\n/**\n * 依赖集合类型,存储订阅某个响应式属性的所有 ReactiveEffect。\n */\nexport type Dep = Set<ReactiveEffect>;\n\n/**\n * 创建一个新的 Dep(依赖集合)。\n *\n * @returns 新的空 Dep 实例\n */\nexport const createDep = (): Dep => {\n return new Set() as Dep;\n};\n\n// ==================== Track / Trigger ====================\n\n/**\n * Maximum depth for nested trigger() calls to prevent infinite reactivity loops.\n * When triggerDepth exceeds this limit, further triggers are silently dropped\n * and a warning is emitted in DEV mode.\n */\nlet triggerDepth = 0;\n\n/**\n * 追踪响应式属性的依赖关系。\n * 当响应式属性被读取时调用,将当前活跃的 effect 记录为该属性的依赖。\n *\n * @param target - 被追踪的响应式对象\n * @param _type - 追踪操作类型(如 'get'、'has'、'iterate')\n * @param key - 被追踪的属性键\n */\nexport function track(target: object, _type: string, key: string | symbol) {\n if (!shouldTrack || activeEffect === undefined) return;\n // signal untrack 桥接:signalUntrack 期间跳过 effect 系统的依赖收集\n if (_isSignalUntracked()) return;\n\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, (depsMap = new Map()));\n }\n\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, (dep = createDep()));\n }\n\n trackEffect(dep);\n\n // 调试:触发 onTrack\n if (__DEV__ && activeEffect.onTrack) {\n activeEffect.onTrack({\n effect: activeEffect,\n target,\n type: _type,\n key,\n });\n }\n}\n\n/**\n * 将当前活跃的 effect 添加到指定的依赖集合中。\n * 在首次渲染优化期间会跳过依赖收集。\n *\n * @param dep - 目标依赖集合\n */\nexport function trackEffect(dep: Dep) {\n // 首次渲染优化:跳过依赖收集\n if (shouldSkipTracking()) {\n skippedTrackingCount++;\n return;\n }\n // FIX: P1-01 移除重复的 shouldTrack/activeEffect 检查,\n // 这些检查已在调用方 track() 中完成,此处只需关注 dep 操作\n // FIX: P0-5 添加防御性检查,避免非空断言在公共 API 调用时不安全\n if (activeEffect && !dep.has(activeEffect)) {\n dep.add(activeEffect);\n activeEffect.deps.push(dep);\n }\n}\n\n/**\n * 触发响应式属性的依赖更新。\n * 当响应式属性被修改时调用,通知所有依赖该属性的 effect 重新执行。\n *\n * 根据操作类型(add/delete/set/clear)会触发不同的依赖集合:\n * - `add`:触发属性本身 + ITERATE_KEY(或数组 length)\n * - `delete`:触发属性本身 + ITERATE_KEY\n * - `set`:触发属性本身 + 数组 length(如果是整数键)\n * - `clear`:触发所有属性的依赖\n *\n * @param target - 被修改的响应式对象\n * @param type - 触发操作类型('set' | 'add' | 'delete' | 'clear')\n * @param key - 被修改的属性键\n * @param _newValue - 新值(可选,用于调试)\n * @param _oldValue - 旧值(可选,用于调试)\n */\nexport function trigger(\n target: object,\n type: string,\n key?: string | symbol,\n newValue?: unknown,\n oldValue?: unknown,\n) {\n const depsMap = targetMap.get(target);\n if (!depsMap) return;\n\n const deps: (Dep | undefined)[] = [];\n\n if (type === 'clear') {\n deps.push(...depsMap.values());\n } else {\n if (key !== undefined) {\n deps.push(depsMap.get(key));\n }\n\n if (type === 'add') {\n if (Array.isArray(target)) {\n deps.push(depsMap.get('length'));\n } else {\n deps.push(depsMap.get(ITERATE_KEY));\n }\n } else if (type === 'delete') {\n if (!Array.isArray(target)) {\n deps.push(depsMap.get(ITERATE_KEY));\n }\n } else if (type === 'set') {\n if (Array.isArray(target) && isIntegerKey(key)) {\n deps.push(depsMap.get('length'));\n }\n }\n }\n\n const effects: ReactiveEffect[] = [];\n for (const dep of deps) {\n if (dep) {\n for (const effect of dep) {\n effects.push(effect);\n }\n }\n }\n\n // 去重:同一个 effect 可能同时存在于多个 dep 中\n triggerEffects([...new Set(effects)], target, type, key, newValue, oldValue);\n}\n\n/**\n * 执行一组 effect 的触发。\n * 优先执行 computed effect,再执行普通 effect。\n * 内置递归深度限制,超过最大深度时静默丢弃并发出警告。\n *\n * @param effects - 需要触发的 ReactiveEffect 数组\n * @param target - 被修改的目标对象(用于调试回调)\n * @param type - 触发操作类型(用于调试回调)\n * @param key - 被修改的属性键(用于调试回调)\n * @param newValue - 新值(用于调试回调)\n * @param oldValue - 旧值(用于调试回调)\n */\nexport function triggerEffects(\n effects: ReactiveEffect[],\n target: object,\n type: string,\n key?: string | symbol,\n newValue?: unknown,\n oldValue?: unknown,\n) {\n if (triggerDepth > REACTIVITY_MAX_TRIGGER_DEPTH) {\n // FIX: P2-1 triggerDepth 超限时改为 warn + 静默丢弃,与 Vue 3 行为一致。\n // 之前直接 throw Error 过于激进,会导致整个响应式链断裂。\n // 改为仅发出警告并丢弃后续 trigger,避免因单个无限循环导致整个应用崩溃。\n if (__DEV__) {\n warn(\n `[lytjs/reactivity] Maximum trigger depth (${REACTIVITY_MAX_TRIGGER_DEPTH}) exceeded. ` +\n `Possible infinite reactivity loop detected. Further triggers are silently dropped. ` +\n `triggerDepth=${triggerDepth}`,\n );\n }\n return;\n }\n triggerDepth++;\n try {\n for (const effect of effects) {\n if (effect.computed) {\n triggerEffect(effect, target, type, key, newValue, oldValue);\n }\n }\n for (const effect of effects) {\n if (!effect.computed) {\n triggerEffect(effect, target, type, key, newValue, oldValue);\n }\n }\n } finally {\n triggerDepth--;\n }\n}\n\nfunction triggerEffect(\n effect: ReactiveEffect,\n target: object,\n type: string,\n key?: string | symbol,\n newValue?: unknown,\n oldValue?: unknown,\n) {\n if (effect !== activeEffect || effect.allowRecurse) {\n // 调用 onTrigger 回调(用于调试)\n if (__DEV__ && effect.onTrigger) {\n effect.onTrigger({\n effect,\n target,\n type,\n key,\n newValue,\n oldValue,\n });\n }\n if (effect.scheduler) {\n effect.scheduler();\n } else {\n effect.run();\n }\n }\n}\n\n// ==================== ReactiveEffect ====================\n\n/**\n * 响应式副作用类。\n * 封装一个副作用函数,支持依赖自动收集、调度执行和手动停止。\n *\n * 创建时会自动注册到当前活跃的 effectScope 中。\n *\n * @typeParam T - 副作用函数的返回值类型\n *\n * @example\n * ```ts\n * const eff = new ReactiveEffect(() => {\n * console.log(state.count);\n * });\n * eff.run(); // 执行副作用,同时收集依赖\n * eff.stop(); // 停止副作用,清理所有依赖\n * ```\n */\nexport class ReactiveEffect<T = unknown> {\n active = true;\n deps: Dep[] = [];\n parent: ReactiveEffect | undefined = undefined;\n computed?: boolean;\n allowRecurse?: boolean;\n onStop?: () => void;\n onTrack?: (event: {\n effect: ReactiveEffect;\n target: object;\n key?: string | symbol;\n type: string;\n }) => void;\n onTrigger?: (event: {\n effect: ReactiveEffect;\n target: object;\n key?: string | symbol;\n type: string;\n newValue?: unknown;\n oldValue?: unknown;\n }) => void;\n onError?: (error: Error) => void;\n // 运行前清理(onEffectCleanup 注册的)\n _cleanups: Array<() => void> = [];\n\n constructor(\n public fn: () => T,\n public scheduler?: (...args: unknown[]) => unknown,\n ) {\n // 自动注册到当前活跃的 effectScope\n const scope = getActiveEffectScope();\n if (scope && scope.active) {\n scope.effects.push(this);\n }\n }\n\n run(): T | undefined {\n if (!this.active) {\n return undefined;\n }\n\n // 在重新执行前调用 cleanup\n if (this._cleanups.length > 0) {\n for (let i = 0; i < this._cleanups.length; i++) {\n this._cleanups[i]!();\n }\n this._cleanups.length = 0;\n }\n\n const prevShouldTrack = shouldTrack;\n try {\n this.parent = activeEffect;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n activeEffect = this;\n shouldTrack = true;\n _trackDepth++;\n\n return this.fn();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n return undefined;\n }\n throw error;\n } finally {\n _trackDepth--;\n activeEffect = this.parent;\n shouldTrack = prevShouldTrack;\n this.parent = undefined;\n }\n }\n\n stop(): void {\n if (this.active) {\n cleanupEffect(this);\n if (this._cleanups.length > 0) {\n for (let i = 0; i < this._cleanups.length; i++) {\n this._cleanups[i]!();\n }\n this._cleanups.length = 0;\n }\n if (this.onStop) {\n this.onStop();\n }\n this.active = false;\n this.scheduler = undefined;\n }\n }\n}\n\nfunction cleanupEffect(effect: ReactiveEffect) {\n const { deps } = effect;\n for (let i = 0; i < deps.length; i++) {\n deps[i]!.delete(effect);\n }\n deps.length = 0;\n}\n\n// ==================== 公共 API ====================\n\n// Function overloads for effect()\n// Non-lazy effect: fn returns void, preventing accidental return value usage\n\n/**\n * 创建一个响应式副作用并立即执行。\n *\n * 副作用函数会在执行期间自动追踪所使用的响应式属性,\n * 当这些属性发生变化时,副作用会重新执行。\n *\n * @param fn - 副作用函数,返回 void\n * @param options - 配置选项\n * @param options.lazy - 是否延迟执行(false 时立即执行)\n * @param options.scheduler - 自定义调度器,替代默认的立即执行行为\n * @param options.allowRecurse - 是否允许副作用递归触发自身\n * @param options.onStop - 副作用停止时的回调\n * @param options.onTrack - 依赖被追踪时的调试回调\n * @param options.onTrigger - 依赖被触发时的调试回调\n * @returns 副作用运行器,可调用 run() 手动执行或 stop() 停止\n */\nexport function effect(\n fn: () => void,\n options?: {\n lazy?: false;\n scheduler?: (...args: unknown[]) => unknown;\n allowRecurse?: boolean;\n onStop?: () => void;\n onTrack?: (event: {\n effect: ReactiveEffect;\n target: object;\n key?: string | symbol;\n type: string;\n }) => void;\n onTrigger?: (event: {\n effect: ReactiveEffect;\n target: object;\n key?: string | symbol;\n type: string;\n newValue?: unknown;\n oldValue?: unknown;\n }) => void;\n },\n): ReactiveEffectRunner<void>;\n\n// Lazy effect: preserves generic return value type (used by computed etc.)\nexport function effect<T>(\n fn: () => T,\n options: {\n lazy: true;\n scheduler?: (...args: unknown[]) => unknown;\n allowRecurse?: boolean;\n onStop?: () => void;\n onTrack?: (event: {\n effect: ReactiveEffect;\n target: object;\n key?: string | symbol;\n type: string;\n }) => void;\n onTrigger?: (event: {\n effect: ReactiveEffect;\n target: object;\n key?: string | symbol;\n type: string;\n newValue?: unknown;\n oldValue?: unknown;\n }) => void;\n },\n): ReactiveEffectRunner<T>;\n\n// 统一实现签名\nexport function effect<T = unknown>(\n fn: () => T,\n options?: {\n lazy?: boolean;\n scheduler?: (...args: unknown[]) => unknown;\n allowRecurse?: boolean;\n onStop?: () => void;\n onTrack?: (event: {\n effect: ReactiveEffect;\n target: object;\n key?: string | symbol;\n type: string;\n }) => void;\n onTrigger?: (event: {\n effect: ReactiveEffect;\n target: object;\n key?: string | symbol;\n type: string;\n newValue?: unknown;\n oldValue?: unknown;\n }) => void;\n onError?: (error: Error) => void;\n },\n): ReactiveEffectRunner<T> {\n const _effect = new ReactiveEffect(fn);\n if (options) {\n // 仅提取已知合法选项,防止覆盖内部属性(如 fn、active)\n _effect.scheduler = options.scheduler;\n _effect.allowRecurse = options.allowRecurse;\n _effect.onStop = options.onStop;\n _effect.onTrack = options.onTrack;\n _effect.onTrigger = options.onTrigger;\n _effect.onError = options.onError;\n }\n if (!options || !options.lazy) {\n _effect.run();\n }\n const runner = _effect.run.bind(_effect) as ReactiveEffectRunner<T>;\n runner.effect = _effect;\n return runner;\n}\n\n/**\n * 停止一个响应式副作用。\n * 清理所有依赖关系,并调用 onStop 回调。\n *\n * @param runner - 由 effect() 返回的副作用运行器\n */\nexport function stop(runner: ReactiveEffectRunner): void {\n runner.effect.stop();\n}\n\n/**\n * 暂停依赖追踪。\n * 调用后,响应式属性的读取不会建立依赖关系。\n * 可通过 resetTracking() 恢复。\n */\nexport function pauseTracking(): void {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\n\n/**\n * 启用依赖追踪。\n * 将当前追踪状态压入栈中并设为 true。\n * 可通过 resetTracking() 恢复到之前的状态。\n */\nexport function enableTracking(): void {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\n\n/**\n * 重置依赖追踪状态到上一次暂停/启用之前的状态。\n * 从追踪栈中弹出最近的状态并恢复。\n */\nexport function resetTracking(): void {\n const last = trackStack.pop();\n shouldTrack = last === undefined ? true : last;\n}\n\n/**\n * 批量执行函数,期间暂停依赖追踪。\n * 与 signalBatch 不同,batch 侧重于暂停追踪而非延迟通知。\n * 支持嵌套调用,内层 batch 不会提前恢复追踪状态。\n *\n * @param fn - 需要批量执行的函数\n *\n * @example\n * ```ts\n * batch(() => {\n * state.a = 1; // 不会触发依赖更新\n * state.b = 2; // 不会触发依赖更新\n * }); // 函数结束后恢复追踪\n * ```\n */\nexport function batch(fn: () => void): void {\n const stackLength = trackStack.length;\n pauseTracking();\n try {\n fn();\n } finally {\n // 恢复到 batch 调用前的 stack 长度,确保嵌套安全\n while (trackStack.length > stackLength) {\n trackStack.pop();\n }\n shouldTrack = trackStack.length > 0 ? trackStack[trackStack.length - 1]! : true;\n }\n}\n\n/**\n * batchAsync - like batch but supports async functions.\n * Pauses tracking during fn execution (including after await),\n * and restores tracking state when fn completes (or throws).\n * Returns a Promise.\n */\nexport function batchAsync(fn: () => void | Promise<void>): Promise<void> {\n const stackLength = trackStack.length;\n pauseTracking();\n const restoreTracking = () => {\n while (trackStack.length > stackLength) {\n trackStack.pop();\n }\n shouldTrack = trackStack.length > 0 ? trackStack[trackStack.length - 1]! : true;\n };\n try {\n const result = fn();\n if (result && typeof result === 'object' && 'then' in result) {\n return (result as Promise<void>).finally(restoreTracking);\n }\n // 同步路径:立即恢复 tracking 状态\n restoreTracking();\n return Promise.resolve();\n } catch (e) {\n restoreTracking();\n return Promise.reject(e);\n }\n}\n\n/**\n * untrack - execute fn without tracking dependencies.\n * Semantically different from batch: untrack means \"run but don't track\".\n * Returns the return value of fn.\n */\nexport function untrack<T>(fn: () => T): T {\n const stackLength = trackStack.length;\n pauseTracking();\n try {\n return fn();\n } finally {\n while (trackStack.length > stackLength) {\n trackStack.pop();\n }\n shouldTrack = trackStack.length > 0 ? trackStack[trackStack.length - 1]! : true;\n }\n}\n\n/**\n * 在当前活跃的 effect 上注册一个清理回调。\n * 该回调会在 effect 重新执行前或停止时被调用,用于清理副作用资源。\n *\n * @param fn - 清理回调函数\n * @param failSilently - 当没有活跃 effect 时是否静默失败(默认 false,开发模式下会发出警告)\n *\n * @example\n * ```ts\n * effect(() => {\n * const timer = setInterval(() => console.log('tick'), 1000);\n * onEffectCleanup(() => clearInterval(timer));\n * });\n * ```\n */\nexport function onEffectCleanup(fn: () => void, failSilently = false): void {\n if (activeEffect === undefined) {\n if (!failSilently && __DEV__) {\n warn('onEffectCleanup() was called when there was no active effect to associate with.');\n }\n return;\n }\n activeEffect._cleanups.push(fn);\n}\n\n// ==================== 辅助 ====================\n\n/**\n * 检查给定的键是否为有效的整数键。\n * 用于判断数组索引是否为合法的整数值。\n *\n * @param key - 需要检查的键值\n * @returns 如果是有效的整数键返回 true,否则返回 false\n */\nexport function isIntegerKey(key: unknown): boolean {\n return (\n typeof key === 'string' &&\n key !== 'NaN' &&\n key[0] !== '-' &&\n '' + parseInt(key, 10) === key &&\n Number.isSafeInteger(Number(key))\n );\n}\n","// src/shared.ts\n// @lytjs/reactivity - reactive.ts 和 ref.ts 共享的辅助函数\n// 提取公共函数以消除 reactive <-> ref 的循环依赖\n\nimport { ReactiveFlags } from './constants';\nimport type { RefLike } from '@lytjs/shared-types';\n\n// Re-export RefLike for downstream consumers\nexport type { RefLike } from '@lytjs/shared-types';\n\nimport { hasChanged } from '@lytjs/common-is';\nexport { hasChanged };\n\n/**\n * toRaw 遍历时的最大深度限制,防止异常的代理链导致无限循环\n */\nconst MAX_RAW_DEPTH = 100;\n\n/**\n * toRaw 遍历过程中用于检测循环引用的 Set。\n * 提取为模块级常量以避免每次调用 toRaw 时重新分配。\n *\n * FIX: P2-5 注意:此 Set 假设单线程执行。JavaScript 是单线程的,\n * 因此不需要额外的线程同步机制。嵌套调用通过 _rawDepth 计数器管理。\n */\nconst _rawSeenSet = new Set<object>();\n\n/**\n * toRaw 嵌套调用深度计数器,防止嵌套调用时提前清空 _rawSeenSet。\n */\nlet _rawDepth = 0;\n\n/**\n * 获取响应式对象的原始值\n */\nexport function toRaw<T>(observed: T): T {\n _rawDepth++;\n if (_rawDepth === 1) {\n _rawSeenSet.clear();\n }\n try {\n let current: unknown = observed;\n let depth = 0;\n while (current && (current as Record<string, unknown>)[ReactiveFlags.RAW]) {\n if (_rawSeenSet.has(current as object) || depth >= MAX_RAW_DEPTH) return current as T;\n _rawSeenSet.add(current as object);\n current = (current as Record<string, unknown>)[ReactiveFlags.RAW];\n depth++;\n }\n return current as T;\n } finally {\n _rawDepth--;\n // FIX: P2-6 在 finally 块中确保清理 _rawSeenSet。\n // 即使 toRaw 内部抛出异常(如 ReactiveFlags.RAW getter 抛出),\n // 也能保证 _rawSeenSet 被清空,避免模块级共享 Set 残留脏数据\n // 影响后续调用。\n if (_rawDepth === 0) {\n _rawSeenSet.clear();\n }\n }\n}\n\n/**\n * 判断一个值是否为 ref\n */\nexport function isRef<T = unknown>(r: unknown): r is RefLike<T> {\n return !!(r && typeof r === 'object' && (r as RefLike).__v_isRef === true);\n}\n","// src/reactive.ts\n// 响应式对象(Proxy 实现)\n// 复用 @lytjs/common-is: isObject, hasChanged, hasOwn, isSymbol, isMap, isSet\n\nimport { isObject, hasChanged, hasOwn, isSymbol, isMap, isSet } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport { unsafeCast } from '@lytjs/common-assertions';\nimport { ReactiveFlags, TrackOpTypes, TriggerOpTypes, ITERATE_KEY } from './constants';\nimport { track, trigger, pauseTracking, resetTracking, isIntegerKey } from './effect';\nimport type { UnwrapNestedRefs, DeepReadonly } from './types';\nimport { toRaw, isRef } from './shared';\n\n// ==================== 类型 ====================\n\ntype Target = object;\ntype ReactiveProxy<T extends object = object> = { [K in keyof T]: T[K] };\n\n/**\n * 带有响应式标志的对象的内部接口\n */\ninterface ReactiveTarget {\n [ReactiveFlags.RAW]?: unknown;\n [ReactiveFlags.IS_REACTIVE]?: boolean;\n [ReactiveFlags.IS_READONLY]?: boolean;\n [ReactiveFlags.IS_SHALLOW]?: boolean;\n [ReactiveFlags.IS_REF]?: boolean;\n}\n\n// ==================== 辅助常量 ====================\n\nconst MUTATING_METHODS = new Set<string>(['set', 'add', 'delete', 'clear']);\n\n// FIX: P2-3 使用 WeakMap 缓存 Collection 迭代方法的绑定函数,避免每次访问都创建新函数\nconst collectionMethodCache = new WeakMap<\n object,\n Map<string | symbol, (...args: unknown[]) => unknown>\n>();\n\n// ==================== 数组方法拦截 ====================\n\nconst arrayInstrumentations: Record<string | symbol, (...args: unknown[]) => unknown> = {};\n\n(['includes', 'indexOf', 'lastIndexOf'] as const).forEach((method) => {\n const originMethod = Array.prototype[method] as (...args: unknown[]) => unknown;\n arrayInstrumentations[method] = function (this: unknown[], ...args: unknown[]) {\n const arr = toRaw(this);\n // 只追踪数组长度变化,避免大数组时逐索引创建大量依赖\n track(arr, TrackOpTypes.HAS, 'length');\n const result = originMethod.apply(arr, args);\n if (result === -1 || result === false) {\n return originMethod.apply(\n arr,\n args.map((a) => toRaw(a)),\n );\n }\n return result;\n };\n});\n\n(['push', 'pop', 'shift', 'unshift', 'splice'] as const).forEach((method) => {\n const originMethod = Array.prototype[method] as (...args: unknown[]) => unknown;\n arrayInstrumentations[method] = function (this: unknown[], ...args: unknown[]) {\n pauseTracking();\n try {\n const result = originMethod.apply(this, args);\n return result;\n } finally {\n resetTracking();\n }\n };\n});\n\n// FIX: P1-L5 响应式数组方法未处理 - 添加 sort, reverse, fill, copyWithin 的处理\n(['sort', 'reverse', 'fill', 'copyWithin'] as const).forEach((method) => {\n const originMethod = Array.prototype[method] as (...args: unknown[]) => unknown;\n arrayInstrumentations[method] = function (this: unknown[], ...args: unknown[]) {\n const arr = toRaw(this);\n pauseTracking();\n try {\n const result = originMethod.apply(arr, args);\n // 这些方法会修改数组,需要触发更新\n trigger(arr, TriggerOpTypes.SET, 'length');\n return result;\n } finally {\n resetTracking();\n }\n };\n});\n\n// ==================== 辅助常量 ====================\n\nconst builtInSymbols = new Set<symbol>(\n Object.getOwnPropertyNames(Symbol)\n .filter((key) => key !== 'arguments' && key !== 'caller')\n .map((key) => {\n // Object.getOwnPropertyNames 返回 string[],而 Symbol 的属性值类型为 symbol,\n // 但 TypeScript 将 Symbol 视为 Function,其索引签名为 unknown。\n // 使用索引签名访问 Symbol[key] 返回 unknown,需要类型断言。\n const value = unsafeCast<symbol>((Symbol as unknown as Record<string, unknown>)[key]);\n return isSymbol(value) ? value : undefined;\n })\n .filter((sym): sym is symbol => sym !== undefined),\n);\n\nfunction isNonTrackableKey(key: string | symbol): boolean {\n return key === '__proto__' || key === '__v_isRef';\n}\n\n/**\n * 将 unknown 值安全地转换为 trigger key (string | symbol)。\n * 如果值不是 string 或 symbol 类型,返回 undefined。\n */\nfunction toTriggerKey(value: unknown): string | symbol | undefined {\n if (typeof value === 'string' || typeof value === 'symbol') {\n return value;\n }\n return undefined;\n}\n\n// ==================== createReactiveObject ====================\n\nfunction createReactiveObject(\n target: Target,\n isReadonlyFlag: boolean,\n _isShallow: boolean,\n baseHandlers: ProxyHandler<Target>,\n collectionHandlers: ProxyHandler<Target>,\n proxyMap: WeakMap<Target, ReactiveProxy<Target>>,\n) {\n if (!isObject(target)) {\n if (__DEV__) {\n warn(`value cannot be made reactive: ${String(target)}`);\n }\n return target;\n }\n\n // markRaw 标记的对象不代理\n if ((target as Record<string | symbol, unknown>)[ReactiveFlags.SKIP]) {\n return target;\n }\n\n if (\n (target as Record<string | symbol, unknown>)[ReactiveFlags.RAW] &&\n !(isReadonlyFlag && (target as Record<string | symbol, unknown>)[ReactiveFlags.IS_REACTIVE])\n ) {\n return target;\n }\n\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n\n const handlers = isMap(target) || isSet(target) ? collectionHandlers : baseHandlers;\n\n const proxy = new Proxy(target, handlers);\n proxyMap.set(target, proxy);\n return proxy;\n}\n\n// ==================== Mutable Handlers ====================\n\nfunction createMutableHandler(isReadonly: boolean, isShallow: boolean): ProxyHandler<Target> {\n return {\n get(target, key, _receiver) {\n if (key === ReactiveFlags.IS_REACTIVE) return !isReadonly;\n if (key === ReactiveFlags.IS_READONLY) return isReadonly;\n if (key === ReactiveFlags.IS_SHALLOW) return isShallow;\n if (key === ReactiveFlags.RAW) return target;\n\n const targetIsArray = Array.isArray(target);\n if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {\n return Reflect.get(arrayInstrumentations, key, _receiver);\n }\n\n const res = Reflect.get(target, key, _receiver);\n\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKey(key)) {\n return res;\n }\n\n if (!isReadonly) {\n track(target, TrackOpTypes.GET, key);\n }\n\n if (isShallow) {\n return res;\n }\n\n if (isRef(res)) {\n return targetIsArray && isIntegerKey(key) ? res : res.value;\n }\n\n if (isObject(res)) {\n return isReadonly ? readonly(res) : reactive(res);\n }\n\n return res;\n },\n\n set(target, key, value, receiver) {\n if (isReadonly) {\n if (__DEV__) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly. Target: ${(() => {\n try {\n return JSON.stringify(target);\n } catch {\n return '[object Object]';\n }\n })()}`,\n );\n }\n return true;\n }\n\n let oldValue = Reflect.get(target, key);\n if (!isShallow) {\n value = toRaw(value);\n // FIX: P1-03 oldValue 也需要 toRaw(),确保新旧值比较时使用原始值,\n // 避免响应式代理对象与原始对象比较时 hasChanged 始终返回 true\n oldValue = toRaw(oldValue);\n if (!Array.isArray(target) && isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n }\n }\n\n const hadKey =\n Array.isArray(target) && isIntegerKey(key)\n ? Number(key) < target.length\n : hasOwn(target, key);\n\n const result = Reflect.set(target, key, value, receiver);\n\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, TriggerOpTypes.ADD, key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, TriggerOpTypes.SET, key, value, oldValue);\n }\n }\n\n return result;\n },\n\n deleteProperty(target, key) {\n if (isReadonly) {\n if (__DEV__) {\n // FIX: P2-03 readonly 深层警告:区分浅层 readonly 和深层 readonly\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.` +\n (isShallow ? ' (shallow readonly)' : ' (deep readonly)') +\n ` Target: ${(() => {\n try {\n return JSON.stringify(target);\n } catch {\n return '[object Object]';\n }\n })()}`,\n );\n }\n return true;\n }\n\n const hadKey = hasOwn(target, key);\n const oldValue = Reflect.get(target, key);\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);\n }\n return result;\n },\n\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n if (!isReadonly) {\n track(target, TrackOpTypes.HAS, key);\n }\n }\n return result;\n },\n\n // FIX: P2-08 ownKeys 属性枚举顺序一致:\n // 返回 Reflect.ownKeys 结果,确保与原生 Object.keys() 枚举顺序一致\n ownKeys(target) {\n if (!isReadonly) {\n track(target, TrackOpTypes.ITERATE, Array.isArray(target) ? 'length' : ITERATE_KEY);\n }\n return Reflect.ownKeys(target);\n },\n };\n}\n\n// ==================== Collection Handlers ====================\n\n// Map/Set 的迭代 key(复用 ITERATE_KEY 以保持一致性)\n// 使用与 mutable handler 相同的 ITERATE_KEY,确保 collection 和 object 的迭代追踪行为一致。\n\nfunction createCollectionHandler(isReadonly: boolean, isShallow: boolean): ProxyHandler<Target> {\n return {\n get(target, key, _receiver) {\n if (key === ReactiveFlags.IS_REACTIVE) return !isReadonly;\n if (key === ReactiveFlags.IS_READONLY) return isReadonly;\n if (key === ReactiveFlags.IS_SHALLOW) return isShallow;\n if (key === ReactiveFlags.RAW) return target;\n\n // 追踪 size 属性和 get 调用\n // FIX: P2-4 移除 get handler 中对 ITERATE_KEY 的重复追踪。\n // 之前对 'get' key 同时在 get handler 入口处和包装函数中追踪 ITERATE_KEY,\n // 导致 Map.get() 调用时产生双重依赖追踪。现在仅在包装函数中追踪具体 key,\n // ITERATE_KEY 的追踪由变异方法(set/add/delete/clear)的 trigger 覆盖。\n // has/forEach/entries/keys/values/Symbol.iterator 在所有模式下都追踪\n if (\n key === 'size' ||\n key === 'has' ||\n key === 'forEach' ||\n key === 'entries' ||\n key === 'keys' ||\n key === 'values' ||\n key === Symbol.iterator\n ) {\n track(target, TrackOpTypes.GET, ITERATE_KEY);\n }\n\n const res = Reflect.get(target, key, target);\n if (typeof res === 'function') {\n // 对迭代方法进行包装以追踪依赖\n if (\n !isReadonly &&\n (key === 'entries' || key === 'keys' || key === 'values' || key === Symbol.iterator)\n ) {\n // FIX: P2-3 使用缓存避免每次访问都创建新函数\n let methodCache = collectionMethodCache.get(target);\n if (!methodCache) {\n methodCache = new Map();\n collectionMethodCache.set(target, methodCache);\n }\n let cachedFn = methodCache.get(key);\n if (!cachedFn) {\n cachedFn = (...args: unknown[]) => {\n track(target, TrackOpTypes.GET, ITERATE_KEY);\n return res.apply(target, args);\n };\n methodCache.set(key, cachedFn);\n }\n return cachedFn;\n }\n if (!isReadonly) {\n // key as string: MUTATING_METHODS 只包含字符串方法名(\"set\"/\"add\"/\"delete\"/\"clear\"),\n // 而 Proxy handler 的 key 参数类型为 string | symbol。对于 Map/Set 的变异方法,\n // key 始终是字符串,symbol 类型的 key(如 Symbol.iterator)不会匹配 MUTATING_METHODS,\n // 因此 Set.has(key as string) 对 symbol 返回 false 是安全的。\n if (MUTATING_METHODS.has(key as string)) {\n return (...args: unknown[]) => {\n const rawTarget = toRaw(target) as Map<unknown, unknown>;\n if (key === 'set') {\n // Map.set: 检查值是否实际改变\n const oldValue = rawTarget.get(args[0]);\n const hadKey = rawTarget.has(args[0]);\n const result = res.apply(target, args);\n if (!hadKey || !Object.is(toRaw(oldValue), toRaw(args[1]))) {\n const triggerKey = toTriggerKey(args[0]);\n if (triggerKey !== undefined) {\n trigger(target, TriggerOpTypes.SET, triggerKey, args[1], oldValue);\n }\n }\n return result;\n } else if (key === 'add') {\n // Set.add: 利用返回值判断是否新增\n const had = rawTarget.has(args[0]);\n const result = res.apply(target, args);\n if (!had) {\n const triggerKey = toTriggerKey(args[0]);\n if (triggerKey !== undefined) {\n trigger(target, TriggerOpTypes.ADD, triggerKey, args[0]);\n }\n // size 变化,触发 ITERATE_KEY 依赖\n trigger(target, TriggerOpTypes.ADD, ITERATE_KEY);\n }\n return result;\n } else if (key === 'delete') {\n // Map/Set.delete: 已有 hadKey 检查\n const hadKey = rawTarget.has(args[0]);\n const result = res.apply(target, args);\n if (hadKey) {\n const triggerKey = toTriggerKey(args[0]);\n if (triggerKey !== undefined) {\n trigger(target, TriggerOpTypes.DELETE, triggerKey, undefined, undefined);\n }\n // size 变化,触发 ITERATE_KEY 依赖\n trigger(target, TriggerOpTypes.DELETE, ITERATE_KEY);\n }\n return result;\n } else if (key === 'clear') {\n const hadItems = rawTarget.size > 0;\n const result = res.apply(target, args);\n if (hadItems) {\n trigger(target, TriggerOpTypes.CLEAR, undefined, undefined, undefined);\n }\n return result;\n }\n // 其他变异方法\n const result = res.apply(target, args);\n trigger(target, TriggerOpTypes.ADD, ITERATE_KEY);\n return result;\n };\n }\n // Map.get: 额外追踪具体的 key,使 set 变异时能精确触发\n if (key === 'get') {\n return (...args: unknown[]) => {\n track(target, TrackOpTypes.GET, args[0] as string | symbol);\n return res.apply(target, args);\n };\n }\n } else {\n // Readonly:阻止变异方法并发出警告\n if (MUTATING_METHODS.has(key as string)) {\n return (..._args: unknown[]) => {\n if (__DEV__) {\n warn(`Operation \"${String(key)}\" failed: target is readonly.`);\n }\n // delete 返回 false 以匹配原生 Set.prototype.delete 和 Map.prototype.delete 的\n // 失败返回值语义(表示未执行删除)。其他变异方法(set/add/clear)返回 undefined,\n // 因为原生 API 中这些方法在成功时返回特定值(如 Set.add 返回 Set 本身),\n // 此处用 undefined 表示操作被阻止,与 readonly handler 的行为一致。\n if (key === 'delete') return false;\n return undefined;\n };\n }\n }\n return res.bind(target);\n }\n return res;\n },\n };\n}\n\n// ==================== Handler 实例 ====================\n\nconst mutableHandlers = createMutableHandler(false, false);\nconst readonlyHandlers = createMutableHandler(true, false);\nconst shallowReactiveHandlers = createMutableHandler(false, true);\nconst shallowReadonlyHandlers = createMutableHandler(true, true);\n\nconst mutableCollectionHandlers = createCollectionHandler(false, false);\nconst readonlyCollectionHandlers = createCollectionHandler(true, false);\nconst shallowCollectionHandlers = createCollectionHandler(false, true);\nconst shallowReadonlyCollectionHandlers = createCollectionHandler(true, true);\n\n// ==================== 公共 API ====================\n\nconst reactiveMap = new WeakMap<Target, ReactiveProxy<Target>>();\nconst shallowReactiveMap = new WeakMap<Target, ReactiveProxy<Target>>();\nconst readonlyMap = new WeakMap<Target, ReactiveProxy<Target>>();\nconst shallowReadonlyMap = new WeakMap<Target, ReactiveProxy<Target>>();\n\nexport function reactive<T extends object>(target: T): UnwrapNestedRefs<T> {\n if (isReadonly(target)) return target as UnwrapNestedRefs<T>;\n return createReactiveObject(\n target,\n false,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap,\n ) as UnwrapNestedRefs<T>;\n}\n\nexport function shallowReactive<T extends object>(target: T): T {\n return createReactiveObject(\n target,\n false,\n true,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap,\n ) as T;\n}\n\nexport function readonly<T extends object>(target: T): DeepReadonly<UnwrapNestedRefs<T>> {\n return createReactiveObject(\n target,\n true,\n false,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap,\n ) as DeepReadonly<UnwrapNestedRefs<T>>;\n}\n\nexport function shallowReadonly<T extends object>(target: T): Readonly<T> {\n return createReactiveObject(\n target,\n true,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap,\n ) as Readonly<T>;\n}\n\nexport function isReactive(value: unknown): boolean {\n if (isReadonly(value)) {\n return isReactive((value as ReactiveTarget)[ReactiveFlags.RAW]);\n }\n return !!(value && (value as ReactiveTarget)[ReactiveFlags.IS_REACTIVE]);\n}\n\nexport function isReadonly(value: unknown): boolean {\n return !!(value && (value as ReactiveTarget)[ReactiveFlags.IS_READONLY]);\n}\n\nexport function isProxy(value: unknown): boolean {\n return isReactive(value) || isReadonly(value);\n}\n\nexport { toRaw } from './shared';\n\nexport function markRaw<T extends object>(value: T): T {\n // FIX: P2-2 检查对象是否被冻结或密封,避免在冻结对象上调用 defineProperty 抛出 TypeError\n if (Object.isFrozen(value) || Object.isSealed(value)) {\n if (__DEV__) {\n warn('markRaw() cannot be used on frozen or sealed objects.');\n }\n return value;\n }\n Object.defineProperty(value, ReactiveFlags.SKIP, { value: true });\n return value;\n}\n","// src/ref.ts\n// Ref 响应式引用\n// 复用 @lytjs/common-is: isObject, hasChanged\n\nimport { isObject, hasChanged } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport { unsafeCast } from '@lytjs/common-assertions';\nimport { track, trigger, getActiveEffect, getShouldTrack, createDep } from './effect';\nimport type { Dep } from './effect';\nimport { TrackOpTypes, TriggerOpTypes } from './constants';\nimport { toRaw, isRef } from './shared';\nimport { reactive } from './reactive';\n\n// ==================== Ref 类型 ====================\n\n/** track/trigger 中使用的类 ref 对象的内部接口 */\nexport interface RefLike<T = unknown> {\n dep: Dep;\n __v_isRef?: boolean;\n value: T;\n}\n\n/** trackRefValue/triggerRefValue 所需的最小接口 */\ninterface TrackableRef {\n dep: Dep;\n}\n\nexport interface Ref<T = unknown> {\n value: T;\n __v_isRef: true;\n}\n\nexport interface ShallowRef<T = unknown> extends Ref<T> {\n __v_isShallow: true;\n}\n\nexport interface ComputedRef<T = unknown> extends Ref<T> {\n __v_isComputed: true;\n}\n\n// ==================== Ref 类 ====================\n\nclass RefImpl<T> {\n private _value: T;\n private _rawValue: T;\n // 使用 Dep 类型替代 Set<any>,提供更精确的类型约束\n public dep: Dep = createDep();\n public readonly __v_isRef = true;\n public readonly __v_isShallow?: boolean;\n\n constructor(value: T, isShallow: boolean) {\n this.__v_isShallow = isShallow || undefined;\n this._rawValue = isShallow ? value : toRaw(value);\n // toReactive 仅对对象类型生效,非对象值直接赋值。\n // 此处的 as object 断言是安全的,因为 toReactive 内部会先做 isObject 检查。\n this._value = isShallow ? value : (toReactive(value as object) as T);\n }\n\n get value(): T {\n trackRefValue(this);\n return this._value;\n }\n\n set value(newVal: T) {\n const useDirectValue = this.__v_isShallow;\n newVal = useDirectValue ? newVal : toRaw(newVal);\n if (hasChanged(newVal, this._rawValue)) {\n const oldVal = this._rawValue;\n this._rawValue = newVal;\n // toReactive 仅对对象类型生效,非对象值直接赋值。\n // 此处的 as object 断言是安全的,因为 toReactive 内部会先做 isObject 检查。\n this._value = useDirectValue ? newVal : (toReactive(newVal as object) as T);\n triggerRefValue(this, newVal, oldVal);\n }\n }\n}\n\nclass ShallowRefImpl<T> {\n private _value: T;\n private _rawValue: T;\n // 使用 Dep 类型替代 Set<any>,提供更精确的类型约束\n public dep: Dep = createDep();\n public readonly __v_isRef = true;\n public readonly __v_isShallow = true as const;\n\n constructor(value: T) {\n this._rawValue = value;\n this._value = value;\n }\n\n get value(): T {\n trackRefValue(this);\n return this._value;\n }\n\n set value(newVal: T) {\n if (hasChanged(newVal, this._rawValue)) {\n const oldVal = this._rawValue;\n this._rawValue = newVal;\n this._value = newVal;\n triggerRefValue(this, newVal, oldVal);\n }\n }\n}\n\n// ==================== 追踪与触发 ====================\n\nexport function trackRefValue(ref: TrackableRef): void {\n if (getShouldTrack() && getActiveEffect()) {\n track(ref, TrackOpTypes.GET, 'value');\n }\n}\n\nexport function triggerRefValue(ref: TrackableRef, newVal?: unknown, oldVal?: unknown): void {\n trigger(ref, TriggerOpTypes.SET, 'value', newVal, oldVal);\n}\n\n// ==================== 公共 API ====================\n\nexport function ref<T extends object | string | number | boolean | null | undefined>(\n value: T,\n): Ref<T> {\n if (isRef(value)) {\n // FIX: P1-07 ref() 接受 ShallowRef 时添加 DEV 警告,\n // 提醒用户 ShallowRef 语义与 Ref 不同,直接返回可能导致意外行为\n // FIX: P2-34 使用类型守卫替代类型断言\n if (__DEV__ && isShallowRef(value)) {\n warn(\n 'ref() received a ShallowRef value. ' +\n 'ShallowRef and Ref have different reactivity semantics. ' +\n 'If this is intentional, use shallowRef() instead.',\n );\n }\n return value as Ref<T>;\n }\n // 双重断言是必要的:RefImpl 实现了 Ref 接口所需的 value/__v_isRef 属性,\n // 但 TypeScript 无法自动推断类实例满足接口(私有成员导致结构不兼容)。\n return unsafeCast<Ref<T>>(new RefImpl(value, false));\n}\n\nexport function shallowRef<T>(value: T): ShallowRef<T> {\n if (isRef(value)) return unsafeCast<ShallowRef<T>>(value);\n return unsafeCast<ShallowRef<T>>(new ShallowRefImpl(value));\n}\n\nexport function triggerRef<T>(ref: ShallowRef<T>): void {\n triggerRefValue(unsafeCast<TrackableRef>(ref), ref.value);\n}\n\nexport { isRef } from './shared';\n\n// FIX: P2-8 添加类型谓词:isShallowRef 和 isComputedRef\n/**\n * 检查值是否为 ShallowRef\n * 类型谓词:缩小类型到 ShallowRef<T>\n */\nexport function isShallowRef<T = unknown>(r: unknown): r is ShallowRef<T> {\n return isRef(r) && !!(r as ShallowRef<T>).__v_isShallow;\n}\n\n/**\n * 检查值是否为 ComputedRef\n * 类型谓词:缩小类型到 ComputedRef<T>\n */\nexport function isComputedRef<T = unknown>(r: unknown): r is ComputedRef<T> {\n return isRef(r) && !!(r as ComputedRef<T>).__v_isComputed;\n}\n\n// FIX: P2-06 unref 类型守卫增强:添加明确的返回类型注释\n// unref 如果参数是 Ref 则返回 .value,否则返回参数本身\nexport function unref<T>(r: T | Ref<T>): T {\n // FIX: P2-34 使用类型守卫替代类型断言,P2-38 移除不必要的 as\n // FIX: DTS build error - 使用类型断言确保类型正确\n return isRef(r) ? (r as Ref<T>).value : r;\n}\n\nexport function toRef<T extends object, K extends keyof T>(object: T, key: K): Ref<T[K]> {\n if (isRef(object[key])) return unsafeCast<Ref<T[K]>>(object[key]);\n return unsafeCast<Ref<T[K]>>(new ObjectRefImpl(object, key));\n}\n\nexport function toRefs<T extends object>(object: T): { [K in keyof T]: Ref<T[K]> } {\n const result = {} as { [K in keyof T]: Ref<T[K]> };\n for (const key in object) {\n result[key] = toRef(object, key);\n }\n return result;\n}\n\nexport function customRef<T>(factory: CustomRefFactory<T>): Ref<T> {\n return unsafeCast<Ref<T>>(new CustomRefImpl(factory));\n}\n\n/**\n * 将值规范化为非 ref 值。\n * 如果是 Ref 则返回 .value,如果是函数则调用并返回结果,否则直接返回。\n * Vue 3.3+ 新增工具函数。\n */\nexport function toValue<T>(source: T | Ref<T> | (() => T)): T {\n // FIX: P2-34 使用类型守卫替代类型断言\n // FIX: DTS build error - 使用类型断言确保类型正确\n if (isRef(source)) return (source as Ref<T>).value;\n if (typeof source === 'function') {\n // FIX: P2-35 添加类型守卫确保 source 是函数后再调用\n return (source as () => T)();\n }\n return source as T;\n}\n\n// ==================== 内部实现类 ====================\n\nclass ObjectRefImpl<T extends object, K extends keyof T> {\n public readonly __v_isRef = true;\n\n constructor(\n private readonly _object: T,\n private readonly _key: K,\n ) {}\n\n get value(): T[K] {\n return this._object[this._key];\n }\n\n set value(newVal: T[K]) {\n this._object[this._key] = newVal;\n }\n}\n\nclass CustomRefImpl<T> {\n public readonly __v_isRef = true;\n public dep: Dep = createDep();\n private readonly _getter: () => T;\n private readonly _setter: (value: T) => void;\n\n constructor(factory: CustomRefFactory<T>) {\n const { get, set } = factory(\n () => trackRefValue(this),\n () => triggerRefValue(this),\n );\n this._getter = get;\n this._setter = set;\n }\n\n get value(): T {\n return this._getter();\n }\n\n set value(newVal: T) {\n this._setter(newVal);\n }\n}\n\n// ==================== 辅助函数 ====================\n\ntype CustomRefFactory<T> = (\n track: () => void,\n trigger: () => void,\n) => { get: () => T; set: (value: T) => void };\n\nfunction toReactive<T>(value: T): T {\n return isObject(value) ? (reactive(value as object) as T) : value;\n}\n","// src/computed.ts\n// 计算属性\n// 复用 @lytjs/common-is: isFunction, hasChanged\n\nimport { isFunction } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport { unsafeCast } from '@lytjs/common-assertions';\nimport { ReactiveEffect, createDep } from './effect';\nimport type { Dep } from './effect';\nimport { trackRefValue, triggerRefValue } from './ref';\nimport type {\n ComputedRef,\n WritableComputedRef,\n ComputedGetter,\n ComputedSetter,\n WritableComputedOptions,\n} from './types';\nimport { ComputedRefSymbol } from './constants';\n\n// ==================== ComputedRefImpl ====================\n\n// FIX: P1-L6 计算属性循环依赖未检测 - 添加循环依赖检测\nconst MAX_COMPUTED_DEPTH = 100;\nlet computedDepth = 0;\nconst computedStack = new Set<ComputedRefImpl<unknown>>();\n\nclass ComputedRefImpl<T> {\n // 使用 Dep 类型替代 Set<any>,提供更精确的类型约束\n public dep: Dep = createDep();\n private _value!: T;\n private _dirty = true;\n private _initialized = false;\n public readonly [ComputedRefSymbol] = true;\n public readonly __v_isRef = true;\n public readonly __v_isComputed = true as const;\n public readonly effect: ReactiveEffect<T>;\n\n // FIX: P2-6 计算属性缓存清理相关属性\n private _cacheCleanupTimer: ReturnType<typeof setTimeout> | null = null;\n private static readonly CACHE_CLEANUP_DELAY = 60000; // 60秒后清理缓存\n\n constructor(\n getter: ComputedGetter<T>,\n private readonly _setter: ComputedSetter<T> | undefined,\n isSSR: boolean,\n ) {\n this.effect = new ReactiveEffect(getter, () => {\n if (!this._dirty) {\n this._dirty = true;\n triggerRefValue(this);\n }\n // FIX: P2-6 重置缓存清理定时器\n this._resetCacheCleanupTimer();\n });\n this.effect.computed = true;\n const effect = this.effect;\n effect.onStop = () => {\n this._cleanupCache();\n };\n\n if (isSSR) {\n try {\n this._value = getter();\n this._dirty = false;\n } catch (e) {\n // SSR 模式下 getter 异常不应阻塞渲染流程,\n // 标记为 dirty 以便后续访问时重试\n this._dirty = true;\n if (__DEV__) {\n warn(`Computed getter threw during SSR initialization: ${e}`);\n }\n }\n }\n }\n\n // FIX: P2-6 重置缓存清理定时器\n private _resetCacheCleanupTimer(): void {\n // 清除现有的定时器\n if (this._cacheCleanupTimer) {\n clearTimeout(this._cacheCleanupTimer);\n }\n // 设置新的定时器,在指定时间后清理缓存\n this._cacheCleanupTimer = setTimeout(() => {\n // 如果 effect 已停止,清理缓存值以释放内存\n if (!this.effect.active) {\n this._cleanupCache();\n }\n }, ComputedRefImpl.CACHE_CLEANUP_DELAY);\n }\n\n // FIX: P2-6 清理缓存值\n private _cleanupCache(): void {\n if (!this.effect.active) {\n if (this._cacheCleanupTimer) {\n clearTimeout(this._cacheCleanupTimer);\n this._cacheCleanupTimer = null;\n }\n this._value = unsafeCast<T>(undefined);\n this._initialized = false;\n this._dirty = true;\n }\n }\n\n // FIX: P2-6 手动清理缓存的公共方法\n /**\n * 手动清理计算属性的缓存值。\n * 在组件卸载时调用此方法可以释放内存。\n */\n cleanupCache(): void {\n if (this._cacheCleanupTimer) {\n clearTimeout(this._cacheCleanupTimer);\n this._cacheCleanupTimer = null;\n }\n this._cleanupCache();\n }\n\n get value(): T {\n trackRefValue(this);\n if (this._dirty) {\n if (this.effect.active) {\n // FIX: P1-L6 计算属性循环依赖未检测 - 检测循环依赖\n if (computedStack.has(this as ComputedRefImpl<unknown>)) {\n throw new Error(\n `[LytJS/reactivity] Circular dependency detected in computed property. ` +\n `A computed property is indirectly referencing itself, causing an infinite loop.` +\n `\\n Error Code: CIRCULAR_REFERENCE (4008) ` +\n `\\n Suggestion: Check your computed property dependencies and avoid referencing ` +\n `the computed itself or other computeds that depend on it.`,\n );\n }\n computedDepth++;\n if (computedDepth > MAX_COMPUTED_DEPTH) {\n computedDepth--;\n throw new Error(\n `[LytJS/reactivity] Maximum computed depth exceeded (${MAX_COMPUTED_DEPTH}). ` +\n `Possible infinite loop in computed properties.` +\n `\\n Error Code: CIRCULAR_REFERENCE (4008) ` +\n `\\n Suggestion: Check for circular dependencies in your computed properties.`,\n );\n }\n computedStack.add(this as ComputedRefImpl<unknown>);\n\n try {\n const value = this.effect.run();\n\n // FIX: P1-02 effect.run() 返回 undefined 时不覆盖缓存,\n // 避免 getter 返回 undefined 被误认为是有效值而覆盖之前的有效缓存\n // FIX: P1-3 移除 || this._dirty 条件(在 _dirty 块内恒为 true),\n // 仅在 value !== undefined 时覆盖缓存\n // FIX: P2-25 缓存未命中处理优化:即使返回 undefined 也标记为已计算,\n // 避免重复执行 effect.run(),但保留 _initialized 状态不变\n if (value !== undefined) {\n this._value = value as T;\n this._initialized = true;\n }\n // FIX: P2-25 无论 value 是否为 undefined,都标记为 clean 以避免重复计算\n this._dirty = false;\n } catch (e) {\n // FIX: P2-25 缓存未命中处理优化:异常时如果已有缓存值,保持 clean 状态\n // 避免在异常场景下重复触发 effect.run()\n if (this._initialized) {\n // 已有缓存值;标记为 clean,以便下次访问时返回缓存值\n this._dirty = false;\n }\n throw e;\n } finally {\n computedStack.delete(this as ComputedRefImpl<unknown>);\n computedDepth--;\n }\n } else if (__DEV__) {\n warn(\n 'Computed value was accessed after its effect was stopped. Returning last cached value.',\n );\n }\n }\n return this._value;\n }\n\n set value(newValue: T) {\n if (this._setter) {\n this._setter(newValue);\n } else if (__DEV__) {\n warn('Write operation failed: computed value is readonly');\n }\n }\n}\n\n// ==================== SSR 模式管理 ====================\n\n// FIX: P1-3 REACTIVITY-NEW-04 - _isSSR 是模块级可变状态\n// 限制说明:此状态在模块级别共享,多实例/测试场景下可能产生状态泄漏。\n// 建议:在 SSR 场景中使用独立的模块实例,或通过上下文参数传递 SSR 状态。\nlet _isSSR = false;\n\n/**\n * 设置 SSR 模式。\n * 在 SSR 环境中调用 setSSRMode(true) 可让 computed 在创建时立即求值,\n * 避免在服务端渲染时因懒求值导致的不一致问题。\n *\n * 注意:此设置为模块级全局状态,多实例/测试场景下可能产生状态泄漏。\n * 如需隔离,请确保不同环境使用独立的模块加载上下文。\n */\nexport function setSSRMode(isSSR: boolean): void {\n _isSSR = isSSR;\n}\n\n// ==================== 公共 API ====================\n\nexport function computed<T>(\n getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>,\n): ComputedRef<T> | WritableComputedRef<T> {\n let getter: ComputedGetter<T>;\n let setter: ComputedSetter<T> | undefined;\n\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n setter = __DEV__ ? () => warn('Write operation failed: computed value is readonly') : undefined;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n\n return new ComputedRefImpl(getter, setter, _isSSR) as ComputedRef<T> | WritableComputedRef<T>;\n}\n","// src/watch.ts\n// 侦听器\n// 复用 @lytjs/common-is: isFunction, isObject, isArray, hasChanged, NOOP\n// 复用 @lytjs/common-scheduler: nextTick, queuePreFlushCb, queuePostFlushCb\n\nimport { isFunction, isObject, isArray, hasChanged, NOOP } from '@lytjs/common-is';\nimport { warn, error } from '@lytjs/common-error';\nimport { isRef } from './ref';\nimport { isReactive } from './reactive';\nimport { ReactiveEffect } from './effect';\nimport { queuePreFlushCb, queuePostFlushCb } from '@lytjs/common-scheduler';\nimport type {\n WatchSource,\n WatchCallbackWithImmediate,\n WatchOptions,\n WatchEffectOptions,\n WatchHandle,\n OnCleanup,\n} from './types';\nimport type { Ref } from './ref';\n\n// ==================== 数据源规范化 ====================\n\nfunction getSource(source: WatchSource<unknown>): () => unknown {\n // FIX: P2-34 使用类型守卫替代类型断言\n // FIX: DTS build error - isRef 返回 RefLike,需要类型断言为 Ref\n if (isRef(source)) return () => (source as Ref<unknown>).value;\n // FIX: P2-35 添加类型守卫确保 source 是对象后再检查 isReactive\n if (isObject(source) && isReactive(source)) return () => traverse(source);\n if (typeof source === 'function') return source as () => unknown;\n // FIX: P2-4 DEV 模式下对无效 source 抛出错误,而非静默返回 NOOP\n if (__DEV__) {\n throw new Error(\n `[LytJS/reactivity] Invalid watch source: ${JSON.stringify(source)}. ` +\n `A watch source must be a ref, reactive object, or getter function. ` +\n `\\n Error Code: INVALID_WATCH_SOURCE (4010) ` +\n `\\n Suggestion: Use watch(ref) or watch(reactiveObj) or watch(() => expr).`,\n );\n }\n return NOOP;\n}\n\n// seen 参数改为可选,允许外部传入已有 Set 以实现复用\nconst MAX_TRAVERSE_DEPTH = 100;\n\n/**\n * 深度遍历响应式对象的所有属性以触发依赖收集。\n * 使用迭代实现(栈代替递归),避免深层对象导致的栈溢出。\n */\nfunction traverse(value: unknown, seen?: Set<unknown>, depth = 0): unknown {\n const _seen = seen ?? new Set();\n if (!isObject(value) || _seen.has(value)) return value;\n\n // 使用显式栈进行迭代遍历,避免递归栈溢出\n const stack: Array<{ value: unknown; depth: number }> = [{ value, depth }];\n\n while (stack.length > 0) {\n const current = stack.pop()!;\n const { value: val, depth: d } = current;\n\n if (!isObject(val) || _seen.has(val)) continue;\n if (d > MAX_TRAVERSE_DEPTH) {\n if (__DEV__) {\n warn(`traverse exceeded maximum depth (${MAX_TRAVERSE_DEPTH}).`);\n }\n continue;\n }\n _seen.add(val);\n\n if (isArray(val)) {\n // 反向压栈以保持原始顺序\n for (let i = val.length - 1; i >= 0; i--) {\n stack.push({ value: val[i]!, depth: d + 1 });\n }\n } else if (val instanceof Map) {\n val.forEach((v, key) => {\n stack.push({ value: v, depth: d + 1 });\n // 如果 key 是对象,也遍历它\n if (isObject(key)) {\n stack.push({ value: key, depth: d + 1 });\n }\n });\n } else if (val instanceof Set) {\n val.forEach((v) => {\n stack.push({ value: v, depth: d + 1 });\n });\n } else {\n const keys = Object.keys(val as object);\n for (let i = keys.length - 1; i >= 0; i--) {\n stack.push({\n value: (val as Record<string, unknown>)[keys[i]!]!,\n depth: d + 1,\n });\n }\n }\n }\n\n return value;\n}\n\n// ==================== Watch 实现 ====================\n\n/**\n * 侦听一个或多个响应式数据源,并在数据变化时执行回调。\n *\n * @param source - 要侦听的数据源,可以是 ref、reactive 对象、getter 函数,或它们的数组\n * @param cb - 数据变化时的回调函数\n * @param options - 侦听选项\n * @returns 停止侦听的句柄函数\n *\n * @remarks\n * 关于 scheduler 参数签名:\n * watch 的 scheduler 与 ReactiveEffect 的 scheduler 参数签名不同。\n * - ReactiveEffect.scheduler: () => void(无参数,由 effect 系统内部调用)\n * - watch scheduler: (job: () => void, ...args: unknown[]) => unknown\n * 其中 job 是 watch 内部封装的变更检测+回调执行函数。\n * 当用户提供 scheduler 时,watch 会将 job 作为第一个参数传入,\n * 用户可以在 scheduler 中决定何时执行 job(如节流、防抖等)。\n */\nexport function watch<T, Immediate extends Readonly<boolean> = false>(\n source: WatchSource<T> | WatchSource<T>[],\n cb: WatchCallbackWithImmediate<T, Immediate>,\n options?: WatchOptions<Immediate>,\n): WatchHandle {\n const {\n immediate,\n deep,\n flush = 'pre',\n once,\n onTrack,\n onTrigger,\n scheduler: userScheduler,\n } = options || {};\n\n let getter: () => unknown;\n let forceTrigger = false;\n let isMultiSource = false;\n\n if (isArray(source)) {\n isMultiSource = true;\n // FIX: P1-04 完善 forceTrigger 逻辑:当多源中存在 reactive 对象时,\n // 即使 deep 为 false 也需要强制触发回调,因为 reactive 对象的属性变化\n // 不会改变对象引用本身,hasChanged 检测不到变化\n // FIX: P2-35 添加类型守卫确保 s 是对象后再检查 isReactive\n forceTrigger = source.some((s) => isObject(s) && isReactive(s));\n getter = () =>\n source.map((s) => {\n if (isRef(s)) return s.value;\n // FIX: P2-35 添加类型守卫\n if (isObject(s) && isReactive(s)) return traverse(s);\n if (isFunction(s)) return s();\n return undefined;\n });\n } else {\n getter = getSource(source as WatchSource<T>);\n // FIX: P1-04 单源 reactive 对象也需要设置 forceTrigger\n // FIX: P2-35 添加类型守卫\n if (isObject(source) && isReactive(source)) {\n forceTrigger = true;\n }\n }\n\n if (deep) {\n const baseGetter = getter;\n getter = () => traverse(baseGetter());\n }\n\n let oldValue: unknown = isMultiSource\n ? new Array((source as WatchSource<T>[]).length).fill(undefined)\n : undefined;\n\n const cleanupFns: Array<() => void> = [];\n let isStopped = false;\n let consecutiveErrors = 0;\n const MAX_CONSECUTIVE_ERRORS = 3;\n\n const onCleanup: OnCleanup = (fn: () => void) => {\n cleanupFns.push(fn);\n };\n\n const job: () => void = () => {\n if (!watcher.active || isStopped) return;\n if (cb) {\n let newValue: unknown;\n try {\n newValue = watcher.run();\n consecutiveErrors = 0;\n } catch (e) {\n consecutiveErrors++;\n if (consecutiveErrors <= MAX_CONSECUTIVE_ERRORS) {\n error(`Error in watch getter: ${e}`);\n }\n throw e;\n }\n if (\n deep ||\n forceTrigger ||\n (isMultiSource\n ? (newValue as unknown[]).some((v, i) => hasChanged(v, (oldValue as unknown[])[i]))\n : hasChanged(newValue, oldValue))\n ) {\n if (cleanupFns.length > 0) {\n cleanupFns.forEach((f) => f());\n cleanupFns.length = 0;\n }\n // FIX: P1-L7 watch 回调错误未捕获 - 添加 try-catch 捕获回调错误\n try {\n cb(\n newValue as T,\n oldValue as Immediate extends true ? undefined : T | undefined,\n onCleanup,\n );\n consecutiveErrors = 0;\n } catch (e) {\n consecutiveErrors++;\n if (consecutiveErrors <= MAX_CONSECUTIVE_ERRORS) {\n error(`Error in watch callback: ${e}`);\n }\n // 继续执行,不中断 watch 流程\n }\n oldValue = newValue;\n if (once) {\n isStopped = true;\n watcher.stop();\n }\n }\n } else {\n try {\n watcher.run();\n consecutiveErrors = 0;\n } catch (e) {\n consecutiveErrors++;\n if (consecutiveErrors <= MAX_CONSECUTIVE_ERRORS) {\n error(`Error in watch effect run: ${e}`);\n }\n throw e;\n }\n }\n };\n\n const rawScheduler =\n userScheduler ||\n (flush === 'sync'\n ? job\n : () => {\n if (flush === 'post') {\n queuePostFlushCb(job);\n } else {\n queuePreFlushCb(job);\n }\n });\n\n // 包装 scheduler,确保传 job 参数给用户自定义 scheduler\n // FIX: P2-5 添加 flush=sync 时的语义一致性说明:\n // 当 flush='sync' 且用户提供了自定义 scheduler 时,rawScheduler 已经是 job 本身\n // (因为三元表达式 `flush === 'sync' ? job : ...` 在 userScheduler 为 falsy 时生效)。\n // 但当 userScheduler 存在时,rawScheduler 始终是 userScheduler(三元表达式不生效),\n // 此时包装层将 job 作为第一个参数传给 userScheduler,这是正确的行为。\n // 因此无论 flush 模式如何,只要 userScheduler 存在,包装逻辑都是一致的。\n const scheduler = userScheduler\n ? (...args: unknown[]) => rawScheduler(job, ...args)\n : rawScheduler;\n\n const watcher = new ReactiveEffect(getter, scheduler as (...args: unknown[]) => unknown);\n\n watcher.onStop = () => {\n if (cleanupFns.length > 0) {\n for (let i = cleanupFns.length - 1; i >= 0; i--) {\n cleanupFns[i]!();\n }\n cleanupFns.length = 0;\n }\n };\n\n if (__DEV__) {\n watcher.onTrack = onTrack as typeof watcher.onTrack;\n watcher.onTrigger = onTrigger as typeof watcher.onTrigger;\n }\n\n // FIX: P2-04 immediate watch 旧值语义注释:\n // 如果 immediate 为 true,首次执行时 oldValue 为 undefined。\n // 这是预期行为:immediate 首次触发时没有\"旧值\"概念,\n // 与 Vue 3 的 watch API 行为一致。\n if (immediate) {\n job();\n } else {\n oldValue = watcher.run();\n }\n\n return () => {\n if (isStopped) return;\n isStopped = true;\n watcher.stop();\n getter = () => {};\n cleanupFns.length = 0;\n cb = NOOP;\n oldValue = undefined;\n consecutiveErrors = 0;\n };\n}\n\n// ==================== WatchEffect 实现 ====================\n\nexport function watchEffect(\n effectFn: (onCleanup: OnCleanup) => void,\n options?: WatchEffectOptions,\n): WatchHandle {\n return doWatchEffect(effectFn, options);\n}\n\nexport function watchPostEffect(\n effectFn: (onCleanup: OnCleanup) => void,\n options?: WatchEffectOptions,\n): WatchHandle {\n return doWatchEffect(effectFn, { ...options, flush: 'post' });\n}\n\nexport function watchSyncEffect(\n effectFn: (onCleanup: OnCleanup) => void,\n options?: WatchEffectOptions,\n): WatchHandle {\n return doWatchEffect(effectFn, { ...options, flush: 'sync' });\n}\n\nfunction doWatchEffect(\n source: (onCleanup: OnCleanup) => void,\n options: WatchEffectOptions = {},\n): WatchHandle {\n const { flush = 'pre', onTrack, onTrigger } = options;\n\n const cleanupFns: Array<() => void> = [];\n let isStopped = false;\n\n const onCleanup: OnCleanup = (fn: () => void) => {\n cleanupFns.push(fn);\n };\n\n const getter = () => {\n if (cleanupFns.length > 0) {\n cleanupFns.forEach((f) => f());\n cleanupFns.length = 0;\n }\n source(onCleanup);\n };\n\n let effectRef: ReactiveEffect | undefined;\n\n const schedulerFn: (...args: unknown[]) => unknown =\n flush === 'sync'\n ? () => effectRef?.run()\n : () => {\n if (flush === 'post') {\n queuePostFlushCb(() => effectRef?.run());\n } else {\n queuePreFlushCb(() => effectRef?.run());\n }\n };\n\n const currentEffect: ReactiveEffect = new ReactiveEffect(getter, schedulerFn);\n effectRef = currentEffect;\n\n currentEffect.onStop = () => {\n if (cleanupFns.length > 0) {\n for (let i = cleanupFns.length - 1; i >= 0; i--) {\n cleanupFns[i]!();\n }\n cleanupFns.length = 0;\n }\n };\n\n if (__DEV__) {\n currentEffect.onTrack = onTrack as typeof currentEffect.onTrack;\n currentEffect.onTrigger = onTrigger as typeof currentEffect.onTrigger;\n }\n\n currentEffect.run();\n\n return () => {\n if (isStopped) return;\n isStopped = true;\n currentEffect.stop();\n cleanupFns.length = 0;\n source = NOOP;\n effectRef = undefined;\n };\n}\n","/**\n * @lytjs/reactivity - batch.ts\n * FIX: P2-4 REACTIVITY-NEW-05 - 批量操作 API\n *\n * 提供 batchScope 函数,支持嵌套批量操作和自动提交。\n * 允许在批量作用域内执行多个响应式操作,只在作用域结束时统一触发更新。\n */\n\nimport { batch, batchAsync, untrack } from './effect';\n\n// ============================================================\n// Types\n// ============================================================\n\n/** 批量作用域配置选项 */\nexport interface BatchScopeOptions {\n /** 是否异步提交(默认 false) */\n async?: boolean;\n /** 作用域名称(用于调试) */\n name?: string;\n /** 错误处理回调 */\n onError?: (error: unknown) => void;\n}\n\n/** 批量作用域上下文 */\nexport interface BatchScopeContext {\n /** 当前嵌套深度 */\n depth: number;\n /** 作用域名称 */\n name: string;\n /** 是否已提交 */\n committed: boolean;\n /** 是否已取消 */\n cancelled: boolean;\n}\n\n/** 批量操作回调 */\nexport type BatchScopeCallback<T> = (ctx: BatchScopeContext) => T;\n\n// ============================================================\n// 内部状态\n// ============================================================\n\n/** 当前活跃的批量作用域栈 */\nconst scopeStack: BatchScopeContext[] = [];\n\n/** 全局批量深度计数器 */\nlet globalBatchDepth = 0;\n\n/** 最大嵌套深度限制 */\nconst MAX_NESTING_DEPTH = 100;\n\n// ============================================================\n// Core API\n// ============================================================\n\n/**\n * 创建批量作用域并执行回调函数。\n * 在作用域内所有响应式操作会被批量收集,只在作用域结束时统一触发更新。\n *\n * 支持嵌套调用:嵌套的 batchScope 会继承外层的批量状态,\n * 只有最外层作用域结束时才会真正提交所有更新。\n *\n * @example\n * ```typescript\n * batchScope((ctx) => {\n * signal1.set(1);\n * signal2.set(2);\n * // 此时不会触发更新\n *\n * batchScope((innerCtx) => {\n * signal3.set(3);\n * // 嵌套作用域,仍然不会触发更新\n * });\n * });\n * // 所有更新在这里统一触发\n * ```\n *\n * @param callback - 在批量作用域内执行的回调函数\n * @param options - 批量作用域配置选项\n * @returns 回调函数的返回值\n */\nexport function batchScope<T>(callback: BatchScopeCallback<T>, options: BatchScopeOptions = {}): T {\n const { async = false, name = 'batchScope', onError } = options;\n\n // 检查嵌套深度限制\n if (globalBatchDepth >= MAX_NESTING_DEPTH) {\n const error = new Error(\n `[lytjs/reactivity] Maximum batchScope nesting depth (${MAX_NESTING_DEPTH}) exceeded. ` +\n `This may indicate an infinite loop.`,\n );\n if (onError) {\n onError(error);\n // FIX: P2-1 避免不安全的 undefined as T,在 onError 回调处理后\n // 抛出错误以确保调用方知道操作失败(T 永远不会被返回)\n throw error;\n }\n throw error;\n }\n\n // 创建作用域上下文\n const ctx: BatchScopeContext = {\n depth: globalBatchDepth,\n name,\n committed: false,\n cancelled: false,\n };\n\n // 推入作用域栈\n scopeStack.push(ctx);\n globalBatchDepth++;\n\n try {\n if (async) {\n // 异步模式:使用 batchAsync\n // FIX: P1-2 异步 batchScope 作用域栈提前弹出\n // 将 scopeStack.pop() 和 globalBatchDepth-- 移到 .then() 回调中,\n // 确保 batchAsync 的异步操作完成后再弹出作用域栈\n // FIX: P2-1 初始化 result 为 undefined 并添加运行时检查,避免非空断言\n let result: T | undefined;\n const promise = batchAsync(() => {\n result = callback(ctx);\n });\n promise\n .then(() => {\n ctx.committed = true;\n // 异步操作完成后再弹出作用域栈\n scopeStack.pop();\n globalBatchDepth--;\n })\n .catch((error) => {\n // 异步操作失败时也要弹出作用域栈\n scopeStack.pop();\n globalBatchDepth--;\n if (onError) {\n onError(error);\n } else {\n throw error;\n }\n });\n // FIX: P1-6 移除对 undefined 返回值的检查,void 函数合法返回 undefined\n return result as T;\n } else {\n // 同步模式:使用 batch\n // FIX: P2-1 初始化 result 为 undefined 并添加运行时检查,避免非空断言\n let result: T | undefined;\n batch(() => {\n result = callback(ctx);\n });\n ctx.committed = true;\n if (result === undefined) {\n throw new Error('[lytjs/reactivity] batchScope sync mode: callback returned undefined.');\n }\n return result;\n }\n } catch (error) {\n // 同步模式下的错误处理\n if (onError) {\n onError(error);\n // FIX: P2-1 避免不安全的 undefined as T\n throw error;\n }\n throw error;\n } finally {\n // 仅在同步模式下弹出作用域栈(异步模式在 .then() 中处理)\n if (!async) {\n scopeStack.pop();\n globalBatchDepth--;\n }\n }\n}\n\n/**\n * 创建异步批量作用域。\n * 与 batchScope 类似,但支持 async/await。\n *\n * @example\n * ```typescript\n * await batchScopeAsync(async (ctx) => {\n * signal1.set(1);\n * await someAsyncOperation();\n * signal2.set(2);\n * });\n * ```\n *\n * @param callback - 异步回调函数\n * @param options - 批量作用域配置选项\n * @returns Promise,在批量作用域完成时 resolve\n */\nexport async function batchScopeAsync<T>(\n callback: BatchScopeCallback<Promise<T> | T>,\n options: BatchScopeOptions = {},\n): Promise<T> {\n const { name = 'batchScopeAsync', onError } = options;\n\n // 检查嵌套深度限制\n if (globalBatchDepth >= MAX_NESTING_DEPTH) {\n const error = new Error(\n `[lytjs/reactivity] Maximum batchScope nesting depth (${MAX_NESTING_DEPTH}) exceeded.`,\n );\n if (onError) {\n onError(error);\n // FIX: P2-1 避免不安全的 undefined as T\n return Promise.reject(error);\n }\n return Promise.reject(error);\n }\n\n // 创建作用域上下文\n const ctx: BatchScopeContext = {\n depth: globalBatchDepth,\n name,\n committed: false,\n cancelled: false,\n };\n\n // 推入作用域栈\n scopeStack.push(ctx);\n globalBatchDepth++;\n\n try {\n // FIX: DTS build error - batchAsync 返回 Promise<void>,需要类型断言\n let result: T | undefined;\n await batchAsync(async () => {\n result = await callback(ctx);\n });\n ctx.committed = true;\n return result as T;\n } catch (error) {\n if (onError) {\n onError(error);\n // FIX: P2-1 避免不安全的 undefined as T\n throw error;\n }\n throw error;\n } finally {\n // 弹出作用域栈\n scopeStack.pop();\n globalBatchDepth--;\n }\n}\n\n/**\n * 在批量作用域内执行无追踪操作。\n * 函数内读取 signal 不会建立依赖关系。\n *\n * @param fn - 要执行的函数\n * @returns 函数的返回值\n */\nexport function batchScopeUntrack<T>(fn: () => T): T {\n return untrack(fn);\n}\n\n// ============================================================\n// 工具函数\n// ============================================================\n\n/**\n * 获取当前批量作用域深度。\n * 0 表示不在任何批量作用域内。\n */\nexport function getBatchScopeDepth(): number {\n return globalBatchDepth;\n}\n\n/**\n * 获取当前活跃的批量作用域信息。\n * 返回当前作用域栈的只读副本。\n */\nexport function getCurrentBatchScopeStack(): ReadonlyArray<BatchScopeContext> {\n return [...scopeStack];\n}\n\n/**\n * 检查当前是否在批量作用域内。\n */\nexport function isInBatchScope(): boolean {\n return globalBatchDepth > 0;\n}\n\n/**\n * 等待所有待处理的批量操作完成(异步模式)。\n * 返回一个 Promise,在所有异步批量操作完成后 resolve。\n *\n * FIX: P2-2 flushBatchScopes 中 pendingCallbacks 始终为空(死代码)。\n * 原因:batchScope 的异步模式使用 batchAsync 而非 pendingCallbacks 注册回调,\n * 导致 pendingCallbacks 永远不会被填充。移除死代码,避免误导维护者。\n * 如需等待异步 batchScope 完成,应直接 await batchScopeAsync()。\n *\n * FIX: P2-batch1-7 保留原因:\n * 1. API 兼容性:此函数是公共 API 的一部分,直接删除会导致破坏性变更\n * 2. 未来扩展:可用于实现等待所有异步 batchScope 完成的功能\n * 3. 测试用途:提供一种同步刷新所有批量操作的方式(即使当前为空操作)\n * 4. 类型安全:返回 Promise<void> 与异步 API 签名保持一致\n *\n * @deprecated 当前实现为空操作,如需等待异步 batchScope 完成,请直接使用 await batchScopeAsync()\n */\nexport function flushBatchScopes(): Promise<void> {\n // FIX: P2-2 pendingCallbacks 在当前实现中始终为空(死代码已移除)。\n // 异步批量操作的完成通过 batchScopeAsync() 的 Promise 链保证。\n // 此函数保留为空操作以维持 API 兼容性,未来可用于等待所有异步 batchScope 完成。\n return Promise.resolve();\n}\n\n// ============================================================\n// Internal API (for testing)\n// ============================================================\n\n/** @internal 重置批量作用域全局状态(仅用于测试) */\nexport function _resetBatchScopeState(): void {\n scopeStack.length = 0;\n globalBatchDepth = 0;\n}\n\n/** @internal 获取待处理回调数量(仅用于测试) */\n// FIX: P2-3 pendingCallbacks 已移除,此函数始终返回 0\nexport function _getPendingCallbacksCount(): number {\n return 0;\n}\n","// src/index.ts\n// @lytjs/reactivity 主入口 - re-export 所有公共 API\n\nexport {\n // reactive\n reactive,\n shallowReactive,\n readonly,\n shallowReadonly,\n isReactive,\n isReadonly,\n isProxy,\n toRaw,\n markRaw,\n} from './reactive';\n\nexport {\n // ref\n ref,\n shallowRef,\n triggerRef,\n isRef,\n isShallowRef,\n isComputedRef,\n unref,\n toRef,\n toRefs,\n toValue,\n customRef,\n} from './ref';\n\nexport {\n // computed\n computed,\n setSSRMode,\n} from './computed';\n\n// scope and async sub-path entries are available at:\n// @lytjs/reactivity/scope - effectScope, getCurrentScope, onScopeDispose\n// @lytjs/reactivity/async - asyncComputed, useAsyncState\n\nexport { effectScope, getCurrentScope, onScopeDispose } from './effect-scope';\nexport type { EffectScope, EffectScopeOptions } from './effect-scope';\n\nexport {\n // watch\n watch,\n watchEffect,\n watchPostEffect,\n watchSyncEffect,\n} from './watch';\n\nexport {\n // effect\n effect,\n stop,\n pauseTracking,\n enableTracking,\n resetTracking,\n batch,\n batchAsync,\n untrack,\n onEffectCleanup,\n // 首次渲染优化\n withFirstRenderOptimization,\n shouldSkipTracking,\n getSkippedTrackingCount,\n resetSkippedTrackingCount,\n} from './effect';\n\n// FIX: P2-4 批量操作 API\nexport {\n batchScope,\n batchScopeAsync,\n batchScopeUntrack,\n getBatchScopeDepth,\n getCurrentBatchScopeStack,\n isInBatchScope,\n flushBatchScopes,\n} from './batch';\n\nexport type { BatchScopeOptions, BatchScopeContext, BatchScopeCallback } from './batch';\n\nexport {\n // signal\n signal,\n computed as signalComputed,\n computedSignal,\n writableComputedSignal,\n readonlySignal,\n set,\n update,\n valueOf,\n // signal batch/untrack\n signalBatch,\n signalUntrack,\n} from './signal';\n\nexport type {\n Ref,\n ShallowRef,\n ComputedRef,\n WritableComputedRef,\n ReactiveEffectRunner,\n /** 响应式信号类型,表示一个可读的响应式值 */\n Signal,\n /** 计算信号类型,表示一个只读的计算响应式值 */\n ComputedSignal,\n /** 可写计算信号类型,表示一个可读写的计算响应式值 */\n WritableComputedSignal,\n /** 可写信号类型,表示一个可读写的响应式值 */\n WritableSignal,\n /** 只读信号类型 */\n ReadonlySignal,\n /** 订阅者回调类型 */\n Subscriber,\n WatchOptions,\n WatchEffectOptions,\n WatchSource,\n WatchCallback,\n WatchHandle,\n ComputedGetter,\n ComputedSetter,\n WritableComputedOptions,\n ReactiveEffectOptions,\n DebuggerEvent,\n UnwrapRef,\n UnwrapNestedRefs,\n DeepReadonly,\n ToRefs,\n ReactiveObject,\n} from './types';\n\nexport {\n RefSymbol,\n ShallowRefSymbol,\n ComputedRefSymbol,\n ReactiveSymbol,\n ReadonlySymbol,\n} from './constants';\n\n// ============================================================\n// FIX: P2-3 调试工具支持 - DevTools 集成\n// ============================================================\n\n/** DevTools 信号依赖信息 */\nexport interface DevToolsSignalInfo {\n id: string;\n name: string;\n value: unknown;\n dependencies: string[];\n dependents: string[];\n}\n\n/** DevTools effect 信息 */\nexport interface DevToolsEffectInfo {\n id: string;\n name: string;\n active: boolean;\n dependencies: string[];\n}\n\n/** LytJS DevTools 全局对象接口 */\nexport interface LytJSDevTools {\n /** 版本号 */\n version: string;\n /** 获取所有信号信息 */\n getSignals: () => DevToolsSignalInfo[];\n /** 获取所有 effect 信息 */\n getEffects: () => DevToolsEffectInfo[];\n /** 监听信号变化 */\n onSignalChange: (callback: (signalId: string, value: unknown) => void) => () => void;\n /** 监听 effect 执行 */\n onEffectRun: (callback: (effectId: string) => void) => () => void;\n /** 启用/禁用调试 */\n setEnabled: (enabled: boolean) => void;\n /** 当前是否启用 */\n isEnabled: () => boolean;\n}\n\n/** 调试工具全局对象 */\ndeclare global {\n interface Window {\n __LYTJS_DEVTOOLS__?: LytJSDevTools;\n }\n}\n\n/** 信号变化监听器集合 */\nconst signalChangeListeners = new Set<(signalId: string, value: unknown) => void>();\n/** effect 执行监听器集合 */\nconst effectRunListeners = new Set<(effectId: string) => void>();\n/** 调试工具启用状态 */\nlet devToolsEnabled = false;\n\n// FIX: P2-4 DevTools 通知批处理:使用 microtask 合并高频通知,\n// 避免在短时间内大量信号变化时逐个触发监听器导致性能问题\nlet pendingSignalNotifications: Array<{ signalId: string; value: unknown }> | null = null;\nlet pendingEffectNotifications: Array<string> | null = null;\nlet devToolsFlushScheduled = false;\n\nfunction scheduleDevToolsFlush(): void {\n if (devToolsFlushScheduled) return;\n devToolsFlushScheduled = true;\n queueMicrotask(flushDevToolsNotifications);\n}\n\nfunction flushDevToolsNotifications(): void {\n devToolsFlushScheduled = false;\n const signals = pendingSignalNotifications;\n const effects = pendingEffectNotifications;\n pendingSignalNotifications = null;\n pendingEffectNotifications = null;\n\n if (signals) {\n // 使用 Map 去重,同一 signalId 只保留最后一次值\n const deduplicated = new Map<string, unknown>();\n for (const { signalId, value } of signals) {\n deduplicated.set(signalId, value);\n }\n signalChangeListeners.forEach((cb) => {\n try {\n for (const [signalId, value] of deduplicated) {\n cb(signalId, value);\n }\n } catch (_e) {\n // 忽略监听器错误\n }\n });\n }\n\n if (effects) {\n // 使用 Set 去重\n const deduplicated = new Set(effects);\n effectRunListeners.forEach((cb) => {\n try {\n for (const effectId of deduplicated) {\n cb(effectId);\n }\n } catch (_e) {\n // 忽略监听器错误\n }\n });\n }\n}\n\n/**\n * 初始化 LytJS DevTools 全局对象\n * 在开发环境下自动挂载到 window.__LYTJS_DEVTOOLS__\n */\nfunction initDevTools(): void {\n if (typeof window === 'undefined') return;\n\n const devTools: LytJSDevTools = {\n version: '0.9.9',\n getSignals: () => {\n // 返回信号信息(由具体实现填充)\n return [];\n },\n getEffects: () => {\n // 返回 effect 信息(由具体实现填充)\n return [];\n },\n onSignalChange: (callback) => {\n signalChangeListeners.add(callback);\n return () => signalChangeListeners.delete(callback);\n },\n onEffectRun: (callback) => {\n effectRunListeners.add(callback);\n return () => effectRunListeners.delete(callback);\n },\n setEnabled: (enabled) => {\n devToolsEnabled = enabled;\n },\n isEnabled: () => devToolsEnabled,\n };\n\n window.__LYTJS_DEVTOOLS__ = devTools;\n}\n\n/**\n * 通知 DevTools 信号变化\n * @internal\n * FIX: P2-4 使用批处理合并高频通知,减少监听器调用次数\n */\nexport function _notifyDevToolsSignalChange(signalId: string, value: unknown): void {\n if (!devToolsEnabled) return;\n if (!pendingSignalNotifications) {\n pendingSignalNotifications = [];\n }\n pendingSignalNotifications.push({ signalId, value });\n scheduleDevToolsFlush();\n}\n\n/**\n * 通知 DevTools effect 执行\n * @internal\n * FIX: P2-4 使用批处理合并高频通知,减少监听器调用次数\n */\nexport function _notifyDevToolsEffectRun(effectId: string): void {\n if (!devToolsEnabled) return;\n if (!pendingEffectNotifications) {\n pendingEffectNotifications = [];\n }\n pendingEffectNotifications.push(effectId);\n scheduleDevToolsFlush();\n}\n\n// 在开发环境下自动初始化\nif (typeof __DEV__ !== 'undefined' && __DEV__) {\n initDevTools();\n}\n"]}