@fluxion-ui/reactivity 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/reactivity.cjs +2 -0
- package/dist/reactivity.cjs.map +1 -0
- package/dist/reactivity.d.ts +340 -0
- package/dist/reactivity.d.ts.map +1 -0
- package/dist/reactivity.js +2 -0
- package/dist/reactivity.js.map +1 -0
- package/package.json +34 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026-present, Fluxion Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=require("@fluxion-ui/shared");let e=null;const n=[],r=new Set;function o(){return e}function c(t){e=t}function s(){return n}function i(t){n.push(t),e=t}function u(){const t=n.pop();return e=n.length>0?n[n.length-1]:null,t}function f(t){r.add(t)}function a(t){r.delete(t)}function l(t){const e=new Set;let n=t;const r=function(){const t=o();if(t){Array.from(e).find(e=>e.effect===t)||e.add({effect:t})}return n};r.set=function(t){const r="function"==typeof t?t(n):t;Object.is(r,n)||(n=r,e.forEach(t=>{t.effect&&t.effect()}))},r.update=function(t){const e=t(n);r.set(e)};const c=r;return c.set=r.set,c.update=r.update,c}function p(t){c(t)}function d(e,n){if(!t.isFunction(e))return t.warn("effect function must be a function",e),()=>{};let r=null;const o=()=>{r&&(r(),r=null)},c=()=>{var n;o(),i(n=c),p(n);try{const n=e();return t.isFunction(n)&&(r=n),n}finally{!function(){const t=u();p(s().length>0?s()[s().length-1]:null)}()}};return c.stop=()=>{o(),a(c)},f(c),c(),c}function y(e){e&&t.isFunction(e.stop)&&e.stop()}function g(e){if(!t.isFunction(e))return t.warn("computed getter must be a function",e),()=>{};let n,r=!0;const o=d(()=>{e(),r=!0}),c=()=>(r&&(n=e(),r=!1),n);return c.stop=()=>{y(o)},c}const x="__v_isReactive",h="__v_isReadonly",w="__v_raw",b=new WeakMap,m=new WeakMap,E=new WeakMap;function R(t,e){const n=function(t){let e=E.get(t);return e||(e=new Map,E.set(t,e)),e}(t);let r=n.get(e);return r||(r=new Set,n.set(e,r)),r}function v(e,n){const r=E.get(e);if(!r)return;if(void 0!==n){const e=r.get(n);e&&e.forEach(e=>{try{e()}catch(e){t.warn("Error triggering effect:",e)}})}const o=r.get(w);o&&o.forEach(e=>{try{e()}catch(e){t.warn("Error triggering effect:",e)}})}function j(t){if(!t)return!1;return!0===t[x]}function O(t){if(!t)return!1;return!0===t[h]}function P(e,n=!1,r=!1){if(j(e))return e;if(O(e))return e;const c=n?m:b,s=c.get(e);if(s)return s;const i=new Proxy(e,{get(e,c,s){if(c===x)return!n;if(c===h)return n;if(c===w)return e;const i=o();if(i){R(e,c).add(i)}const u=Reflect.get(e,c,s);return r?u:t.isObject(u)?n?A(u):S(u):u},set(t,e,n,r){const o=Reflect.get(t,e,r),c=Reflect.set(t,e,n,r);return c&&!Object.is(n,o)&&v(t,e),c},deleteProperty(t,e){Reflect.get(t,e);const n=Reflect.deleteProperty(t,e);return n&&v(t,e),n},has(t,e){const n=Reflect.has(t,e),r=o();if(r){R(t,e).add(r)}return n},ownKeys(t){const e=o();if(e){R(t,w).add(e)}return Reflect.ownKeys(t)},getOwnPropertyDescriptor(t,e){const n=Reflect.getOwnPropertyDescriptor(t,e),r=o();if(r){R(t,e).add(r)}return n}});return c.set(e,i),i}function S(e){return t.isObject(e)?O(e)?e:P(e,!1,!1):(t.warn("reactive() expects an object as target",e),e)}function A(e){return t.isObject(e)?j(e)||O(e)?e:P(e,!0,!1):(t.warn("readonly() expects an object as target",e),e)}function k(t){return j(t)?t[w]:t}function _(e,n){if(e===n)return!0;if(!e||!n)return!1;if("object"!=typeof e||"object"!=typeof n)return e===n;if(t.isArray(e)&&t.isArray(n)){if(e.length!==n.length)return!1;for(let t=0;t<e.length;t++)if(!_(e[t],n[t]))return!1;return!0}const r=Object.keys(e),o=Object.keys(n);if(r.length!==o.length)return!1;for(const t of r){if(!o.includes(t))return!1;if(!_(e[t],n[t]))return!1}return!0}function F(e,n,r){if(!t.isFunction(e)&&!t.isObject(e))return t.warn("watch source must be a function or an object"),()=>{};if(!t.isFunction(n))return t.warn("watch callback must be a function"),()=>{};if(Array.isArray(e)){return function(t,e,n){let r=t.map(()=>{}),o=!0;const c=()=>{const c=t.map(t=>t());let s=o;if(!o)for(let t=0;t<c.length;t++)if(n?.deep){if(!_(c[t],r[t])){s=!0;break}}else if(c[t]!==r[t]){s=!0;break}(s||o)&&(e(c,r),r=[...c],o=!1)};n?.immediate&&c();const s=d(c);return()=>{y(s)}}(e,n,r)}return function(t,e,n){let r,o,c=!0;const s=()=>{o&&o();const s=t();let i=c;c||(i=n?.deep?!_(s,r):s!==r),(i||c)&&(o=e(s,r,o),r=s,c=!1)};n?.immediate&&s();const i=d(s);return()=>{y(i)}}(e,n,r)}function C(e,n){if(!t.isFunction(e))return t.warn("asyncSignal fetcher must be a function",e),function(t){const e=l(t),n=l(!1),r=l(null),o=()=>e();return o.loading=n,o.error=r,o.reload=async()=>{},o.set=t=>{e.set(t)},o.update=t=>{const n=t(e());e.set(n)},o.cancel=()=>{},o.isCancelled=()=>!1,o.abort=()=>{},o.then=(t,n)=>Promise.resolve(e()).then(t,n),o.catch=t=>Promise.resolve(e()).catch(t),o.finally=t=>Promise.resolve(e()).finally(t),o}(n);const r=l(n),o=l(!0),c=l(null);let s=e,i=!1;const u=async()=>{o.set(!0),c.set(null);try{if(s){const t=await s();if(i)return;r.set(t)}}catch(t){if(i)return;c.set(t)}finally{if(i)return;o.set(!1)}};u();const f=function(){return r()};return f.loading=o,f.error=c,f.reload=u,f.set=t=>{r.set(t)},f.update=t=>{const e=t(r());r.set(e)},f.cancel=()=>{i=!0},f.isCancelled=()=>i,f.abort=()=>{i=!0},f.then=(t,e)=>Promise.resolve(r()).then(t,e),f.catch=t=>Promise.resolve(r()).catch(t),f.finally=t=>Promise.resolve(r()).finally(t),f}const M=new Map;exports.asyncSignal=C,exports.asyncSignalSuspense=function(t,e){return C(t,e)},exports.cachedAsyncSignal=function(t,e){const n=M.get(t);if(n)return n;const r=C(e);return M.set(t,r),r},exports.clearAsyncSignalCache=function(){M.clear()},exports.computed=g,exports.computedReadonly=function(t){return g(t)},exports.computedSet=function(t){const e={};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=g(t[n]));return e},exports.disposeAllWatches=function(){t.warn("disposeAllWatches is not implemented")},exports.effect=d,exports.effectPost=function(t){return d(t)},exports.effectSync=function(t){return d(t)},exports.getAllEffects=function(){return r},exports.getCurrentEffect=o,exports.getEffectStack=s,exports.getGlobalEffect=function(){return o()},exports.isCached=function(t){return!0},exports.isProxy=function(t){return j(t)||O(t)},exports.isReactive=function(t){return j(t)},exports.isReadonly=function(t){return O(t)},exports.lazyAsyncSignal=function(t,e=0){return()=>C(t)},exports.pauseEffect=function(e){t.warn("pauseEffect is not fully implemented yet")},exports.popEffect=u,exports.pushEffect=i,exports.reactive=S,exports.readonly=A,exports.readonlySignal=function(t){let e=t;return function(){return e}},exports.refresh=function(t){t()},exports.registerEffect=f,exports.resumeEffect=function(e){t.warn("resumeEffect is not fully implemented yet")},exports.runEffects=function(e){e.forEach(e=>{try{e()}catch(e){t.warn("Error running effect:",e)}})},exports.setCurrentEffect=c,exports.setGlobalEffect=p,exports.shallowReactive=function(e){return t.isObject(e)?P(e,!1,!0):(t.warn("shallowReactive() expects an object as target",e),e)},exports.shallowReadonly=function(e){return t.isObject(e)?P(e,!0,!0):(t.warn("shallowReadonly() expects an object as target",e),e)},exports.signal=l,exports.stop=y,exports.toRaw=k,exports.toReactive=function(t){return j(t)?t:S(t)},exports.toRef=function(t){return t},exports.unregisterEffect=a,exports.unsubscribe=function(e,n){t.warn("unsubscribe is not fully implemented yet")},exports.watch=F,exports.watchDeep=function(t,e){return F(()=>k(t),e,{deep:!0})},exports.watchEffect=function(e,n){if(!t.isFunction(e))return t.warn("watchEffect callback must be a function"),()=>{};let r;const o=d(()=>{r&&r(),r=e(r)});return()=>{y(o)}};
|
|
2
|
+
//# sourceMappingURL=reactivity.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity.cjs","sources":["../src/state.ts","../src/api/signal.ts","../src/api/effect.ts","../src/api/computed.ts","../src/types.ts","../src/api/reactive.ts","../src/api/watch.ts","../src/api/async.ts"],"sourcesContent":["/**\n * 全局响应式状态\n * 用于追踪当前正在执行的 effect\n */\n\nimport type { Effect } from './types'\n\n// 当前正在执行的 effect\nlet currentEffect: Effect | null = null\n\n// effect 栈\nconst effectStack: Effect[] = []\n\n// 存储所有活跃的 effect 集合\nconst allEffects = new Set<Effect>()\n\n/**\n * 获取当前正在执行的 effect\n */\nexport function getCurrentEffect(): Effect | null {\n return currentEffect\n}\n\n/**\n * 设置当前正在执行的 effect\n */\nexport function setCurrentEffect(effect: Effect | null): void {\n currentEffect = effect\n}\n\n/**\n * 获取 effect 栈\n */\nexport function getEffectStack(): Effect[] {\n return effectStack\n}\n\n/**\n * 将 effect 压入栈\n */\nexport function pushEffect(effect: Effect): void {\n effectStack.push(effect)\n currentEffect = effect\n}\n\n/**\n * 将 effect 弹出栈\n */\nexport function popEffect(): Effect | undefined {\n const effect = effectStack.pop()\n currentEffect = effectStack.length > 0\n ? effectStack[effectStack.length - 1]\n : null\n return effect\n}\n\n/**\n * 注册 effect\n */\nexport function registerEffect(effect: Effect): void {\n allEffects.add(effect)\n}\n\n/**\n * 注销 effect\n */\nexport function unregisterEffect(effect: Effect): void {\n allEffects.delete(effect)\n}\n\n/**\n * 获取所有活跃的 effects\n */\nexport function getAllEffects(): Set<Effect> {\n return allEffects\n}\n\n// 重新导出 Effect 类型\nexport type { Effect } from './types'","/**\n * Signal 基础信号实现\n * 提供响应式数据封装\n */\n\nimport { warn } from '@fluxion-ui/shared'\nimport type { Signal, SignalGetter } from '../types'\nimport { getCurrentEffect, setCurrentEffect } from '../state'\n\n/**\n * 设置当前 effect\n */\nexport function setGlobalEffect(effect: (() => void) | null): void {\n setCurrentEffect(effect as any)\n}\n\n/**\n * 获取当前 effect\n */\nexport function getGlobalEffect(): (() => void) | null {\n return getCurrentEffect() as any\n}\n\n/**\n * Signal 订阅者\n */\ninterface SignalSubscriber {\n effect: (() => void) | null\n}\n\n/**\n * 创建 Signal\n * @param value 初始值\n * @returns Signal 函数,调用返回当前值\n */\nexport function signal<T>(value: T): Signal<T> {\n // 订阅者集合\n const subscribers = new Set<SignalSubscriber>()\n\n // 当前值\n let currentValue = value\n\n // 获取器函数\n const getter: SignalGetter<T> = function(this: SignalGetter<T>) {\n // 收集当前正在执行的 effect 作为依赖\n const effect = getGlobalEffect()\n if (effect) {\n // 检查是否已存在该 effect 的订阅\n const existing = Array.from(subscribers).find(s => s.effect === effect)\n if (!existing) {\n subscribers.add({ effect })\n }\n }\n return currentValue\n } as SignalGetter<T>\n\n // 设置值\n getter.set = function(value: T | ((prev: T) => T)): void {\n const resolved = typeof value === 'function'\n ? (value as (prev: T) => T)(currentValue)\n : value\n\n if (Object.is(resolved, currentValue)) {\n return\n }\n\n currentValue = resolved\n\n // 通知所有订阅者\n subscribers.forEach(subscriber => {\n if (subscriber.effect) {\n subscriber.effect()\n }\n })\n }\n\n // 更新值(set 的别名,语义更明确)\n getter.update = function(updater: (prev: T) => T): void {\n const newValue = updater(currentValue)\n getter.set(newValue)\n }\n\n // 合并到 Signal 类型\n const signalFn = getter as Signal<T>\n signalFn.set = getter.set\n signalFn.update = getter.update\n\n return signalFn\n}\n\n/**\n * 创建只读 Signal(不可修改)\n * @param value 初始值\n * @returns 只读的 Signal 函数\n */\nexport function readonlySignal<T>(value: T): () => T {\n let currentValue = value\n\n return function() {\n // 收集依赖\n const effect = getGlobalEffect()\n if (effect) {\n // 只读信号也需要追踪依赖,但这里我们简化处理\n // 在实际实现中可能需要特殊的只读订阅机制\n }\n return currentValue\n }\n}\n\n/**\n * 取消 Signal 的订阅\n * @param signal 要取消订阅的 Signal\n * @param effect 要移除的 effect\n */\nexport function unsubscribe<T>(signal: Signal<T>, effect: () => void): void {\n // 注意:由于 subscribers 是闭包中的私有变量,\n // 这个函数需要在 signal 内部实现专门的取消订阅机制\n // 当前简化实现暂不提供此功能\n warn('unsubscribe is not fully implemented yet')\n}","/**\n * Effect 副作用系统实现\n * 自动追踪依赖并响应变化\n */\n\nimport { warn, isFunction } from '@fluxion-ui/shared'\nimport {\n getCurrentEffect,\n setCurrentEffect,\n pushEffect as statePushEffect,\n popEffect as statePopEffect,\n registerEffect as stateRegisterEffect,\n unregisterEffect as stateUnregisterEffect,\n getEffectStack\n} from '../state'\n\n/**\n * Effect 清理函数\n */\ntype CleanupFn = () => void\n\n/**\n * Effect 运行函数\n */\ntype EffectRunner = () => void | CleanupFn\n\n/**\n * Effect 接口\n */\ninterface IEffect extends Function {\n (): void\n stop: () => void\n}\n\n/**\n * Effect 选项\n */\ninterface EffectOptions {\n flush?: 'pre' | 'post' | 'sync'\n}\n\n/**\n * 设置当前 effect(供 signal 依赖追踪使用)\n */\nexport function setGlobalEffect(effect: (() => void) | null): void {\n setCurrentEffect(effect as any)\n}\n\n/**\n * 获取当前 effect\n */\nexport function getGlobalEffect(): (() => void) | null {\n return getCurrentEffect() as any\n}\n\n/**\n * 将 effect 压入栈\n */\nfunction pushEffect(effect: IEffect): void {\n statePushEffect(effect as any)\n // 设置全局 effect 以便 signal 追踪\n setGlobalEffect(effect as any)\n}\n\n/**\n * 将 effect 弹出栈\n */\nfunction popEffect(): IEffect | undefined {\n const effect = statePopEffect()\n // 清空全局 effect\n setGlobalEffect(getEffectStack().length > 0 ? getEffectStack()[getEffectStack().length - 1] as any : null)\n return effect\n}\n\n/**\n * 注册 effect\n */\nfunction registerEffect(effect: IEffect): void {\n stateRegisterEffect(effect as any)\n}\n\n/**\n * 注销 effect\n */\nfunction unregisterEffect(effect: IEffect): void {\n stateUnregisterEffect(effect as any)\n}\n\n/**\n * 创建 Effect\n */\nexport function effect(fn: EffectRunner, _options?: EffectOptions): IEffect {\n if (!isFunction(fn)) {\n warn('effect function must be a function', fn)\n return (() => {}) as IEffect\n }\n\n let cleanup: CleanupFn | null = null\n\n const runCleanup = () => {\n if (cleanup) {\n cleanup()\n cleanup = null\n }\n }\n\n const effectFn = (() => {\n runCleanup()\n\n pushEffect(effectFn as IEffect)\n\n try {\n const result = fn()\n\n if (isFunction(result)) {\n cleanup = result as CleanupFn\n }\n\n return result\n } finally {\n popEffect()\n }\n }) as IEffect\n\n effectFn.stop = () => {\n runCleanup()\n unregisterEffect(effectFn as IEffect)\n }\n\n registerEffect(effectFn as IEffect)\n effectFn()\n\n return effectFn as IEffect\n}\n\n/**\n * 停止 Effect\n */\nexport function stop(effect: IEffect): void {\n if (effect && isFunction(effect.stop)) {\n effect.stop()\n }\n}\n\n/**\n * 创建一个只在 DOM 更新后执行的 effect\n */\nexport function effectPost(fn: EffectRunner): IEffect {\n return effect(fn)\n}\n\n/**\n * 创建一个同步执行的 effect\n */\nexport function effectSync(fn: EffectRunner): IEffect {\n return effect(fn)\n}\n\nexport function pauseEffect(_effect: IEffect): void {\n warn('pauseEffect is not fully implemented yet')\n}\n\nexport function resumeEffect(_effect: IEffect): void {\n warn('resumeEffect is not fully implemented yet')\n}\n\n/**\n * 批量执行 effects\n */\nexport function runEffects(effects: IEffect[]): void {\n effects.forEach(effect => {\n try {\n effect()\n } catch (error) {\n warn('Error running effect:', error)\n }\n })\n}","/**\n * Computed 计算属性实现\n * 根据依赖自动计算值并缓存结果\n */\n\nimport { warn, isFunction } from '@fluxion-ui/shared'\nimport type { Computed } from '../types'\nimport { effect, stop } from './effect'\n\n/**\n * 创建 Computed 计算属性\n * @param getter 计算函数\n * @returns Computed 函数,调用返回计算值\n */\nexport function computed<T>(getter: () => T): Computed<T> {\n if (!isFunction(getter)) {\n warn('computed getter must be a function', getter)\n return (() => undefined) as Computed<T>\n }\n\n // 缓存的值\n let cachedValue: T | undefined = undefined\n\n // 是否脏(需要重新计算)\n let dirty = true\n\n // 通知更新的回调(外部订阅用)\n let onUpdate: (() => void) | null = null\n\n // 创建一个 effect 来追踪 getter 中的响应式依赖\n // 当依赖变化时,设置 dirty 并通知回调\n const eff = effect(() => {\n // 读取 getter 中的响应式数据\n // 这会收集依赖(如 countSignal)\n getter()\n\n // 依赖变化时,下次访问需要重新计算\n dirty = true\n\n // 通知更新\n if (onUpdate) {\n onUpdate()\n }\n })\n\n // 创建 computed 函数\n const computedFn = (() => {\n if (dirty) {\n // 重新计算\n cachedValue = getter()\n dirty = false\n }\n\n return cachedValue as T\n }) as Computed<T>\n\n // 添加 stop 方法\n computedFn.stop = () => {\n stop(eff)\n }\n\n return computedFn\n}\n\n/**\n * 创建只读的计算属性\n * @param getter 计算函数\n * @returns Computed 函数\n */\nexport function readonly<T>(getter: () => T): Computed<T> {\n return computed(getter)\n}\n\n/**\n * 检查 Computed 是否有缓存值\n * @param computed 要检查的 Computed\n * @returns 是否有缓存\n */\nexport function isCached<T>(computed: Computed<T>): boolean {\n // 当前实现总是有缓存\n return true\n}\n\n/**\n * 强制 Computed 重新计算\n * @param computed 要重新计算的 Computed\n */\nexport function refresh<T>(computed: Computed<T>): void {\n // 触发重新计算\n // 由于 computed 是惰性求值,调用即重新计算\n computed()\n}\n\n/**\n * 创建 ComputedSet(多个相关计算属性的集合)\n * @param getters 计算函数映射\n * @returns Computed 映射\n */\nexport function computedSet<T extends Record<string, () => any>>(\n getters: T\n): {\n [K in keyof T]: ReturnType<T[K]>\n} {\n const result: any = {}\n\n for (const key in getters) {\n if (Object.prototype.hasOwnProperty.call(getters, key)) {\n result[key] = computed(getters[key]!)\n }\n }\n\n return result\n}","/**\n * Reactivity 包类型定义\n */\n\nimport type { AnyFunction } from '@fluxion-ui/shared'\n\n// ==================== Signal 类型 ====================\n\n/**\n * Signal 读取函数\n */\nexport type SignalGetter<T> = (() => T) & {\n set: (value: T | ((prev: T) => T)) => void\n update: (updater: (prev: T) => T) => void\n}\n\n/**\n * Signal 接口\n */\nexport interface Signal<T> extends Function {\n (): T\n set: (value: T | ((prev: T) => T)) => void\n update: (updater: (prev: T) => T) => void\n}\n\n// ==================== Computed 类型 ====================\n\n/**\n * Computed 计算属性接口\n */\nexport interface Computed<T> extends Function {\n (): T\n}\n\n// ==================== Effect 类型 ====================\n\n/**\n * Effect 运行函数\n */\nexport type EffectRunner = () => void\n\n/**\n * Effect 接口\n */\nexport interface Effect extends Function {\n (): void\n stop: () => void\n}\n\n// ==================== Watch 类型 ====================\n\n/**\n * Watch 回调函数\n */\nexport type WatchCallback<T> = (\n newValue: T,\n oldValue: T | undefined,\n cleanup?: () => void\n) => void\n\n/**\n * Watch 源函数\n */\nexport type WatchSource<T> = () => T\n\n/**\n * Watch 选项\n */\nexport interface WatchOptions {\n immediate?: boolean\n deep?: boolean\n flush?: 'pre' | 'post' | 'sync'\n}\n\n// ==================== Reactive 类型 ====================\n\n/**\n * Reactive 目标类型\n */\nexport type ReactiveTarget<T> = T extends object ? T : never\n\n/**\n * Reactive 代理标记\n */\nexport const ReactiveFlags = {\n IS_REACTIVE: '__v_isReactive',\n IS_READONLY: '__v_isReadonly',\n RAW: '__v_raw'\n} as const\n\n/**\n * Reactive 映射表\n */\nexport interface ReactiveMap {\n get(target: object): any\n set(target: object, proxy: object): void\n}\n\n// ==================== AsyncSignal 类型 ====================\n\n/**\n * AsyncSignal 异步信号接口\n */\nexport interface AsyncSignal<T> extends Signal<T | undefined> {\n loading: Signal<boolean>\n error: Signal<Error | null>\n reload: () => Promise<void>\n cancel: () => void\n isCancelled: () => boolean\n abort: () => void\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2>\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult>\n finally(onfinally?: (() => void) | null): Promise<T>\n}\n\n// ==================== 内部类型 ====================\n\n/**\n * 依赖项接口\n */\nexport interface Dependency {\n subscribers: Set<Effect>\n addSubscriber(effect: Effect): void\n removeSubscriber(effect: Effect): void\n notify(): void\n}\n\n/**\n * 全局响应式状态\n */\nexport interface ReactiveState {\n currentEffect: Effect | null\n effects: Set<Effect>[]\n}","/**\n * Reactive 响应式对象实现\n * 深层响应式代理\n */\n\nimport { warn, isObject } from '@fluxion-ui/shared'\nimport { ReactiveFlags } from '../types'\nimport { getCurrentEffect } from '../state'\n\n// 响应式映射表\nconst reactiveMap = new WeakMap<object, any>()\nconst readonlyMap = new WeakMap<object, any>()\n\n// 目标对象到代理的映射\nconst targetMap = new WeakMap<object, Map<string | symbol, Set<any>>>()\n\n/**\n * 获取依赖映射\n */\nfunction getDepMap(target: object): Map<string | symbol, Set<any>> {\n let depMap = targetMap.get(target)\n if (!depMap) {\n depMap = new Map()\n targetMap.set(target, depMap)\n }\n return depMap\n}\n\n/**\n * 获取指定 key 的依赖集合\n */\nfunction getDep(target: object, key: string | symbol): Set<any> {\n const depMap = getDepMap(target)\n let dep = depMap.get(key)\n if (!dep) {\n dep = new Set()\n depMap.set(key, dep)\n }\n return dep\n}\n\n/**\n * 触发指定 key 的依赖更新\n */\nfunction trigger(target: object, key?: string | symbol): void {\n const depMap = targetMap.get(target)\n if (!depMap) return\n\n if (key !== undefined) {\n const dep = depMap.get(key)\n if (dep) {\n dep.forEach((effectFn: any) => {\n try {\n effectFn()\n } catch (error) {\n warn('Error triggering effect:', error)\n }\n })\n }\n }\n\n const dep = depMap.get(ReactiveFlags.RAW)\n if (dep) {\n dep.forEach((effectFn: any) => {\n try {\n effectFn()\n } catch (error) {\n warn('Error triggering effect:', error)\n }\n })\n }\n}\n\n/**\n * 检查是否为响应式\n */\nfunction checkIsReactive(value: unknown): boolean {\n if (!value) return false\n const val = value as any\n return val[ReactiveFlags.IS_REACTIVE] === true\n}\n\n/**\n * 检查是否为只读\n */\nfunction checkIsReadonly(value: unknown): boolean {\n if (!value) return false\n const val = value as any\n return val[ReactiveFlags.IS_READONLY] === true\n}\n\n/**\n * 创建响应式代理\n */\nfunction createReactive<T extends object>(\n target: T,\n readonlyFlag: boolean = false,\n isShallow: boolean = false\n): T {\n if (checkIsReactive(target)) {\n return target\n }\n if (checkIsReadonly(target)) {\n return target\n }\n\n const map = readonlyFlag ? readonlyMap : reactiveMap\n const existingProxy = map.get(target)\n if (existingProxy) {\n return existingProxy\n }\n\n const proxy = new Proxy(target, {\n get(target, key, receiver) {\n if (key === ReactiveFlags.IS_REACTIVE) {\n return !readonlyFlag\n }\n if (key === ReactiveFlags.IS_READONLY) {\n return readonlyFlag\n }\n if (key === ReactiveFlags.RAW) {\n return target\n }\n\n const currentEffect = getCurrentEffect()\n if (currentEffect) {\n const dep = getDep(target, key)\n dep.add(currentEffect)\n }\n\n const result = Reflect.get(target, key, receiver)\n\n if (isShallow) {\n return result\n }\n\n if (isObject(result)) {\n return readonlyFlag\n ? readonly(result)\n : reactive(result)\n }\n\n return result\n },\n\n set(target, key, value, receiver) {\n const oldValue = Reflect.get(target, key, receiver)\n const result = Reflect.set(target, key, value, receiver)\n\n if (result && !Object.is(value, oldValue)) {\n trigger(target, key)\n }\n\n return result\n },\n\n deleteProperty(target, key) {\n const oldValue = Reflect.get(target, key)\n const result = Reflect.deleteProperty(target, key)\n\n if (result) {\n trigger(target, key)\n }\n\n return result\n },\n\n has(target, key) {\n const result = Reflect.has(target, key)\n const currentEffect = getCurrentEffect()\n if (currentEffect) {\n const dep = getDep(target, key)\n dep.add(currentEffect)\n }\n return result\n },\n\n ownKeys(target) {\n const currentEffect = getCurrentEffect()\n if (currentEffect) {\n const dep = getDep(target, ReactiveFlags.RAW)\n dep.add(currentEffect)\n }\n return Reflect.ownKeys(target)\n },\n\n getOwnPropertyDescriptor(target, key) {\n const result = Reflect.getOwnPropertyDescriptor(target, key)\n const currentEffect = getCurrentEffect()\n if (currentEffect) {\n const dep = getDep(target, key)\n dep.add(currentEffect)\n }\n return result\n }\n })\n\n map.set(target, proxy)\n return proxy\n}\n\n/**\n * 创建响应式对象\n */\nexport function reactive<T extends object>(target: T): T {\n if (!isObject(target)) {\n warn('reactive() expects an object as target', target)\n return target\n }\n if (checkIsReadonly(target)) {\n return target\n }\n return createReactive(target, false, false)\n}\n\n/**\n * 创建浅响应式对象\n */\nexport function shallowReactive<T extends object>(target: T): T {\n if (!isObject(target)) {\n warn('shallowReactive() expects an object as target', target)\n return target\n }\n return createReactive(target, false, true)\n}\n\n/**\n * 创建只读对象\n */\nexport function readonly<T extends object>(target: T): Readonly<T> {\n if (!isObject(target)) {\n warn('readonly() expects an object as target', target)\n return target as any\n }\n if (checkIsReactive(target) || checkIsReadonly(target)) {\n return target as any\n }\n return createReactive(target, true, false) as Readonly<T>\n}\n\n/**\n * 创建浅只读对象\n */\nexport function shallowReadonly<T extends object>(target: T): Readonly<T> {\n if (!isObject(target)) {\n warn('shallowReadonly() expects an object as target', target)\n return target as any\n }\n return createReactive(target, true, true) as Readonly<T>\n}\n\n/**\n * 检查是否为响应式对象\n */\nexport function isReactive(value: unknown): boolean {\n return checkIsReactive(value)\n}\n\n/**\n * 检查是否为只读对象\n */\nexport function isReadonly(value: unknown): boolean {\n return checkIsReadonly(value)\n}\n\n/**\n * 检查是否为代理对象\n */\nexport function isProxy(value: unknown): boolean {\n return checkIsReactive(value) || checkIsReadonly(value)\n}\n\n/**\n * 获取原始对象\n */\nexport function toRaw<T>(value: T): T {\n if (checkIsReactive(value)) {\n return (value as any)[ReactiveFlags.RAW]\n }\n return value\n}\n\n/**\n * 转换为响应式(如果尚未转换)\n */\nexport function toReactive<T>(value: T): T {\n return checkIsReactive(value as any) ? value : reactive(value as object) as T\n}\n\n/**\n * 取消响应式(创建副本)\n */\nexport function toRef<T>(target: T): T {\n return target\n}","/**\n * Watch 监听器实现\n * 监听响应式数据变化\n */\n\nimport { warn, isFunction, isObject, isArray } from '@fluxion-ui/shared'\nimport type { WatchCallback, WatchSource, WatchOptions } from '../types'\nimport { effect, stop } from './effect'\nimport { toRaw } from './reactive'\n\n// ==================== 深度比较 ====================\n\n/**\n * 深度比较两个值是否相等\n */\nfunction deepEqual(a: any, b: any): boolean {\n if (a === b) return true\n\n if (!a || !b) return false\n\n // 如果是原始类型,不相等\n if (typeof a !== 'object' || typeof b !== 'object') {\n return a === b\n }\n\n // 如果是数组\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false\n }\n return true\n }\n\n // 如果是对象\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false\n if (!deepEqual(a[key], b[key])) return false\n }\n\n return true\n}\n\n// ==================== Watch 实现 ====================\n\n/**\n * 监听单一数据源\n */\nfunction watchSource<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n options?: WatchOptions\n): () => void {\n let oldValue: T | undefined = undefined\n let initialRun = true\n\n // 清理函数\n let cleanup: (() => void) | undefined\n\n const runner = () => {\n // 如果有清理函数,先执行\n if (cleanup) {\n cleanup()\n }\n\n // 获取新值\n const newValue = source()\n\n // 检查值是否变化\n let isChanged = initialRun\n if (!initialRun) {\n if (options?.deep) {\n isChanged = !deepEqual(newValue, oldValue)\n } else {\n isChanged = newValue !== oldValue\n }\n }\n\n if (isChanged || initialRun) {\n // 执行回调\n cleanup = callback(newValue as T, oldValue as T, cleanup)\n oldValue = newValue\n initialRun = false\n }\n }\n\n // 立即执行(如果设置了 immediate)\n if (options?.immediate) {\n runner()\n }\n\n // 创建 effect 来追踪依赖\n const eff = effect(runner, { flush: options?.flush })\n\n // 返回停止函数\n return () => {\n stop(eff)\n }\n}\n\n/**\n * 监听多个数据源\n */\nfunction watchSources<T>(\n sources: WatchSource<T>[],\n callback: (values: T[], oldValues: T[]) => void,\n options?: WatchOptions\n): () => void {\n let oldValues: T[] = sources.map(() => undefined as any)\n let initialRun = true\n\n const runner = () => {\n const newValues = sources.map(source => source())\n\n let isChanged = initialRun\n if (!initialRun) {\n for (let i = 0; i < newValues.length; i++) {\n if (options?.deep) {\n if (!deepEqual(newValues[i], oldValues[i])) {\n isChanged = true\n break\n }\n } else {\n if (newValues[i] !== oldValues[i]) {\n isChanged = true\n break\n }\n }\n }\n }\n\n if (isChanged || initialRun) {\n callback(newValues, oldValues)\n oldValues = [...newValues]\n initialRun = false\n }\n }\n\n if (options?.immediate) {\n runner()\n }\n\n const eff = effect(runner, { flush: options?.flush })\n\n return () => {\n stop(eff)\n }\n}\n\n// ==================== 导出函数 ====================\n\n/**\n * 监听响应式数据变化\n * @param source 要监听的数据源(函数、Signal 或响应式对象)\n * @param callback 变化时的回调函数\n * @param options 选项\n * @returns 停止监听的函数\n */\nexport function watch<T>(\n source: WatchSource<T> | WatchSource<T>[],\n callback: WatchCallback<T> | ((values: T[], oldValues: T[]) => void),\n options?: WatchOptions\n): () => void {\n // 参数校验\n if (!isFunction(source) && !isObject(source)) {\n warn('watch source must be a function or an object')\n return () => {}\n }\n\n if (!isFunction(callback)) {\n warn('watch callback must be a function')\n return () => {}\n }\n\n // 处理数组(多个数据源)\n if (Array.isArray(source)) {\n const sources = source as WatchSource<T>[]\n return watchSources(sources, callback as any, options)\n }\n\n // 处理单一数据源\n return watchSource(source as WatchSource<T>, callback as WatchCallback<T>, options)\n}\n\n/**\n * 监听响应式对象的属性\n * @param source 响应式对象\n * @param callback 回调函数\n * @param options 选项\n * @returns 停止监听的函数\n */\nexport function watchEffect(\n callback: (cleanup?: () => void) => void,\n options?: WatchOptions\n): () => void {\n if (!isFunction(callback)) {\n warn('watchEffect callback must be a function')\n return () => {}\n }\n\n let cleanup: (() => void) | undefined\n\n const runner = () => {\n if (cleanup) {\n cleanup()\n }\n\n // 传递清理函数给用户\n cleanup = callback(cleanup)\n }\n\n const eff = effect(runner, { flush: options?.flush })\n\n return () => {\n stop(eff)\n }\n}\n\n/**\n * 监听对象深度变化\n * @param source 响应式对象\n * @param callback 回调函数\n * @returns 停止监听的函数\n */\nexport function watchDeep<T extends object>(\n source: T,\n callback: (newValue: T, oldValue: T) => void\n): () => void {\n return watch(\n () => toRaw(source),\n callback,\n { deep: true }\n )\n}\n\n/**\n * 停止所有 watch(全局函数)\n */\nexport function disposeAllWatches(): void {\n // 当前实现中,watch 返回的停止函数由用户调用\n // 这里可以添加全局清理逻辑\n warn('disposeAllWatches is not implemented')\n}","/**\n * AsyncSignal 异步信号实现\n * 支持异步数据获取和加载状态\n */\n\nimport { warn, isFunction } from '@fluxion-ui/shared'\nimport type { Signal, AsyncSignal } from '../types'\nimport { signal } from './signal'\n\n/**\n * AsyncSignal 状态\n */\ninterface AsyncSignalState<T> {\n data: Signal<T | undefined>\n loading: Signal<boolean>\n error: Signal<Error | null>\n}\n\n/**\n * 创建 AsyncSignal 异步信号\n * @param fetcher 异步获取函数\n * @param initialValue 初始值\n * @returns AsyncSignal 对象\n */\nexport function asyncSignal<T>(\n fetcher: () => Promise<T>,\n initialValue?: T\n): AsyncSignal<T> {\n if (!isFunction(fetcher)) {\n warn('asyncSignal fetcher must be a function', fetcher)\n // 返回一个空的 AsyncSignal\n return createEmptyAsyncSignal<T>(initialValue)\n }\n\n // 创建内部 signal\n const data = signal<T | undefined>(initialValue)\n const loading = signal(true)\n const error = signal<Error | null>(null)\n\n // fetcher 函数引用(可能变化)\n let currentFetcher = fetcher\n\n // 取消标志\n let cancelled = false\n\n /**\n * 执行数据获取\n */\n const reload = async (): Promise<void> => {\n // 标记为进行中\n loading.set(true)\n error.set(null)\n\n try {\n // 如果有 fetcher,执行它\n if (currentFetcher) {\n const result = await currentFetcher()\n\n // 检查是否已取消\n if (cancelled) return\n\n // 设置数据\n data.set(result)\n }\n } catch (e) {\n // 检查是否已取消\n if (cancelled) return\n\n // 设置错误\n error.set(e as Error)\n } finally {\n // 检查是否已取消\n if (cancelled) return\n\n // 标记为完成\n loading.set(false)\n }\n }\n\n // 立即执行一次\n reload()\n\n // 创建 AsyncSignal 函数\n const signalFn = (function(this: AsyncSignal<T>) {\n return data()\n }) as AsyncSignal<T>\n\n // 添加属性\n signalFn.loading = loading\n signalFn.error = error\n signalFn.reload = reload\n\n // 添加 set 方法\n signalFn.set = (value: T | undefined | ((prev: T | undefined) => T | undefined)) => {\n data.set(value as any)\n }\n\n // 添加 update 方法\n signalFn.update = (updater: (prev: T | undefined) => T | undefined) => {\n const current = data()\n const newValue = updater(current)\n data.set(newValue as T)\n }\n\n // 添加 cancel 方法\n signalFn.cancel = () => {\n cancelled = true\n }\n\n // 添加 isCancelled 方法\n signalFn.isCancelled = () => cancelled\n\n // 添加 abort 方法(使用 AbortController)\n let abortController: AbortController | null = null\n signalFn.abort = () => {\n if (abortController) {\n abortController.abort()\n abortController = null\n }\n cancelled = true\n }\n\n // 添加 then 方法(Promise 兼容)\n signalFn.then = (onfulfilled?: (value: T) => any, onrejected?: (reason: any) => any) => {\n return Promise.resolve(data()).then(onfulfilled, onrejected)\n }\n\n // 添加 catch 方法\n signalFn.catch = (onrejected?: (reason: any) => any) => {\n return Promise.resolve(data()).catch(onrejected)\n }\n\n // 添加 finally 方法\n signalFn.finally = (onfinally?: () => void) => {\n return Promise.resolve(data()).finally(onfinally)\n }\n\n return signalFn\n}\n\n/**\n * 创建空的 AsyncSignal(用于错误情况)\n */\nfunction createEmptyAsyncSignal<T>(initialValue?: T): AsyncSignal<T> {\n const data = signal<T | undefined>(initialValue)\n const loading = signal(false)\n const error = signal<Error | null>(null)\n\n const signalFn = (() => data()) as AsyncSignal<T>\n signalFn.loading = loading\n signalFn.error = error\n signalFn.reload = async () => {}\n\n signalFn.set = (value: T | undefined | ((prev: T | undefined) => T | undefined)) => {\n data.set(value as any)\n }\n\n signalFn.update = (updater: (prev: T | undefined) => T | undefined) => {\n const current = data()\n const newValue = updater(current)\n data.set(newValue as T)\n }\n\n signalFn.cancel = () => {}\n signalFn.isCancelled = () => false\n signalFn.abort = () => {}\n\n signalFn.then = (onfulfilled?: (value: T) => any, onrejected?: (reason: any) => any) => {\n return Promise.resolve(data()).then(onfulfilled, onrejected)\n }\n\n signalFn.catch = (onrejected?: (reason: any) => any) => {\n return Promise.resolve(data()).catch(onrejected)\n }\n\n signalFn.finally = (onfinally?: () => void) => {\n return Promise.resolve(data()).finally(onfinally)\n }\n\n return signalFn\n}\n\n/**\n * 创建 Suspense 风格的异步信号(带边界)\n * @param fetcher 异步获取函数\n * @param initialValue 初始值\n * @returns AsyncSignal 对象\n */\nexport function asyncSignalSuspense<T>(\n fetcher: () => Promise<T>,\n initialValue?: T\n): AsyncSignal<T> {\n // 简化为普通 asyncSignal\n return asyncSignal(fetcher, initialValue)\n}\n\n/**\n * 延迟创建 AsyncSignal\n * @param delay 延迟时间(毫秒)\n * @param fetcher 异步获取函数\n * @returns AsyncSignal\n */\nexport function lazyAsyncSignal<T>(\n fetcher: () => Promise<T>,\n delay: number = 0\n): () => AsyncSignal<T> {\n return () => {\n return asyncSignal(fetcher)\n }\n}\n\n/**\n * 缓存 AsyncSignal 的结果\n */\nconst asyncSignalCache = new Map<string, AsyncSignal<any>>()\n\n/**\n * 创建带缓存的 AsyncSignal\n * @param key 缓存 key\n * @param fetcher 异步获取函数\n * @returns AsyncSignal\n */\nexport function cachedAsyncSignal<T>(\n key: string,\n fetcher: () => Promise<T>\n): AsyncSignal<T> {\n const cached = asyncSignalCache.get(key)\n if (cached) {\n return cached\n }\n\n const signal = asyncSignal(fetcher)\n asyncSignalCache.set(key, signal)\n return signal\n}\n\n/**\n * 清除 AsyncSignal 缓存\n */\nexport function clearAsyncSignalCache(): void {\n asyncSignalCache.clear()\n}"],"names":["currentEffect","effectStack","allEffects","Set","getCurrentEffect","setCurrentEffect","effect","getEffectStack","pushEffect","push","popEffect","pop","length","registerEffect","add","unregisterEffect","delete","signal","value","subscribers","currentValue","getter","Array","from","find","s","set","resolved","Object","is","forEach","subscriber","update","updater","newValue","signalFn","setGlobalEffect","fn","_options","isFunction","warn","cleanup","runCleanup","effectFn","statePushEffect","result","statePopEffect","stop","stateUnregisterEffect","stateRegisterEffect","computed","cachedValue","dirty","eff","computedFn","ReactiveFlags","reactiveMap","WeakMap","readonlyMap","targetMap","getDep","target","key","depMap","get","Map","getDepMap","dep","trigger","error","checkIsReactive","checkIsReadonly","createReactive","readonlyFlag","isShallow","map","existingProxy","proxy","Proxy","receiver","Reflect","isObject","readonly","reactive","oldValue","deleteProperty","has","ownKeys","getOwnPropertyDescriptor","toRaw","deepEqual","a","b","isArray","i","keysA","keys","keysB","includes","watch","source","callback","options","sources","oldValues","initialRun","runner","newValues","isChanged","deep","immediate","watchSources","watchSource","asyncSignal","fetcher","initialValue","data","loading","reload","async","cancel","isCancelled","abort","then","onfulfilled","onrejected","Promise","resolve","catch","finally","onfinally","createEmptyAsyncSignal","currentFetcher","cancelled","e","asyncSignalCache","cached","clear","getters","prototype","hasOwnProperty","call","delay","_effect","effects"],"mappings":"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"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reactivity 包类型定义
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Signal 读取函数
|
|
6
|
+
*/
|
|
7
|
+
type SignalGetter<T> = (() => T) & {
|
|
8
|
+
set: (value: T | ((prev: T) => T)) => void;
|
|
9
|
+
update: (updater: (prev: T) => T) => void;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Signal 接口
|
|
13
|
+
*/
|
|
14
|
+
interface Signal<T> extends Function {
|
|
15
|
+
(): T;
|
|
16
|
+
set: (value: T | ((prev: T) => T)) => void;
|
|
17
|
+
update: (updater: (prev: T) => T) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Computed 计算属性接口
|
|
21
|
+
*/
|
|
22
|
+
interface Computed<T> extends Function {
|
|
23
|
+
(): T;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Effect 运行函数
|
|
27
|
+
*/
|
|
28
|
+
type EffectRunner$1 = () => void;
|
|
29
|
+
/**
|
|
30
|
+
* Effect 接口
|
|
31
|
+
*/
|
|
32
|
+
interface Effect extends Function {
|
|
33
|
+
(): void;
|
|
34
|
+
stop: () => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Watch 回调函数
|
|
38
|
+
*/
|
|
39
|
+
type WatchCallback<T> = (newValue: T, oldValue: T | undefined, cleanup?: () => void) => void;
|
|
40
|
+
/**
|
|
41
|
+
* Watch 源函数
|
|
42
|
+
*/
|
|
43
|
+
type WatchSource<T> = () => T;
|
|
44
|
+
/**
|
|
45
|
+
* Watch 选项
|
|
46
|
+
*/
|
|
47
|
+
interface WatchOptions {
|
|
48
|
+
immediate?: boolean;
|
|
49
|
+
deep?: boolean;
|
|
50
|
+
flush?: 'pre' | 'post' | 'sync';
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* AsyncSignal 异步信号接口
|
|
54
|
+
*/
|
|
55
|
+
interface AsyncSignal<T> extends Signal<T | undefined> {
|
|
56
|
+
loading: Signal<boolean>;
|
|
57
|
+
error: Signal<Error | null>;
|
|
58
|
+
reload: () => Promise<void>;
|
|
59
|
+
cancel: () => void;
|
|
60
|
+
isCancelled: () => boolean;
|
|
61
|
+
abort: () => void;
|
|
62
|
+
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
|
|
63
|
+
catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null): Promise<T | TResult>;
|
|
64
|
+
finally(onfinally?: (() => void) | null): Promise<T>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Signal 基础信号实现
|
|
69
|
+
* 提供响应式数据封装
|
|
70
|
+
*/
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 创建 Signal
|
|
74
|
+
* @param value 初始值
|
|
75
|
+
* @returns Signal 函数,调用返回当前值
|
|
76
|
+
*/
|
|
77
|
+
declare function signal<T>(value: T): Signal<T>;
|
|
78
|
+
/**
|
|
79
|
+
* 创建只读 Signal(不可修改)
|
|
80
|
+
* @param value 初始值
|
|
81
|
+
* @returns 只读的 Signal 函数
|
|
82
|
+
*/
|
|
83
|
+
declare function readonlySignal<T>(value: T): () => T;
|
|
84
|
+
/**
|
|
85
|
+
* 取消 Signal 的订阅
|
|
86
|
+
* @param signal 要取消订阅的 Signal
|
|
87
|
+
* @param effect 要移除的 effect
|
|
88
|
+
*/
|
|
89
|
+
declare function unsubscribe<T>(signal: Signal<T>, effect: () => void): void;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Computed 计算属性实现
|
|
93
|
+
* 根据依赖自动计算值并缓存结果
|
|
94
|
+
*/
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* 创建 Computed 计算属性
|
|
98
|
+
* @param getter 计算函数
|
|
99
|
+
* @returns Computed 函数,调用返回计算值
|
|
100
|
+
*/
|
|
101
|
+
declare function computed<T>(getter: () => T): Computed<T>;
|
|
102
|
+
/**
|
|
103
|
+
* 创建只读的计算属性
|
|
104
|
+
* @param getter 计算函数
|
|
105
|
+
* @returns Computed 函数
|
|
106
|
+
*/
|
|
107
|
+
declare function readonly$1<T>(getter: () => T): Computed<T>;
|
|
108
|
+
/**
|
|
109
|
+
* 检查 Computed 是否有缓存值
|
|
110
|
+
* @param computed 要检查的 Computed
|
|
111
|
+
* @returns 是否有缓存
|
|
112
|
+
*/
|
|
113
|
+
declare function isCached<T>(computed: Computed<T>): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* 强制 Computed 重新计算
|
|
116
|
+
* @param computed 要重新计算的 Computed
|
|
117
|
+
*/
|
|
118
|
+
declare function refresh<T>(computed: Computed<T>): void;
|
|
119
|
+
/**
|
|
120
|
+
* 创建 ComputedSet(多个相关计算属性的集合)
|
|
121
|
+
* @param getters 计算函数映射
|
|
122
|
+
* @returns Computed 映射
|
|
123
|
+
*/
|
|
124
|
+
declare function computedSet<T extends Record<string, () => any>>(getters: T): {
|
|
125
|
+
[K in keyof T]: ReturnType<T[K]>;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Effect 副作用系统实现
|
|
130
|
+
* 自动追踪依赖并响应变化
|
|
131
|
+
*/
|
|
132
|
+
/**
|
|
133
|
+
* Effect 清理函数
|
|
134
|
+
*/
|
|
135
|
+
type CleanupFn = () => void;
|
|
136
|
+
/**
|
|
137
|
+
* Effect 运行函数
|
|
138
|
+
*/
|
|
139
|
+
type EffectRunner = () => void | CleanupFn;
|
|
140
|
+
/**
|
|
141
|
+
* Effect 接口
|
|
142
|
+
*/
|
|
143
|
+
interface IEffect extends Function {
|
|
144
|
+
(): void;
|
|
145
|
+
stop: () => void;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Effect 选项
|
|
149
|
+
*/
|
|
150
|
+
interface EffectOptions {
|
|
151
|
+
flush?: 'pre' | 'post' | 'sync';
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 设置当前 effect(供 signal 依赖追踪使用)
|
|
155
|
+
*/
|
|
156
|
+
declare function setGlobalEffect(effect: (() => void) | null): void;
|
|
157
|
+
/**
|
|
158
|
+
* 获取当前 effect
|
|
159
|
+
*/
|
|
160
|
+
declare function getGlobalEffect(): (() => void) | null;
|
|
161
|
+
/**
|
|
162
|
+
* 创建 Effect
|
|
163
|
+
*/
|
|
164
|
+
declare function effect(fn: EffectRunner, _options?: EffectOptions): IEffect;
|
|
165
|
+
/**
|
|
166
|
+
* 停止 Effect
|
|
167
|
+
*/
|
|
168
|
+
declare function stop(effect: IEffect): void;
|
|
169
|
+
/**
|
|
170
|
+
* 创建一个只在 DOM 更新后执行的 effect
|
|
171
|
+
*/
|
|
172
|
+
declare function effectPost(fn: EffectRunner): IEffect;
|
|
173
|
+
/**
|
|
174
|
+
* 创建一个同步执行的 effect
|
|
175
|
+
*/
|
|
176
|
+
declare function effectSync(fn: EffectRunner): IEffect;
|
|
177
|
+
declare function pauseEffect(_effect: IEffect): void;
|
|
178
|
+
declare function resumeEffect(_effect: IEffect): void;
|
|
179
|
+
/**
|
|
180
|
+
* 批量执行 effects
|
|
181
|
+
*/
|
|
182
|
+
declare function runEffects(effects: IEffect[]): void;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Watch 监听器实现
|
|
186
|
+
* 监听响应式数据变化
|
|
187
|
+
*/
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* 监听响应式数据变化
|
|
191
|
+
* @param source 要监听的数据源(函数、Signal 或响应式对象)
|
|
192
|
+
* @param callback 变化时的回调函数
|
|
193
|
+
* @param options 选项
|
|
194
|
+
* @returns 停止监听的函数
|
|
195
|
+
*/
|
|
196
|
+
declare function watch<T>(source: WatchSource<T> | WatchSource<T>[], callback: WatchCallback<T> | ((values: T[], oldValues: T[]) => void), options?: WatchOptions): () => void;
|
|
197
|
+
/**
|
|
198
|
+
* 监听响应式对象的属性
|
|
199
|
+
* @param source 响应式对象
|
|
200
|
+
* @param callback 回调函数
|
|
201
|
+
* @param options 选项
|
|
202
|
+
* @returns 停止监听的函数
|
|
203
|
+
*/
|
|
204
|
+
declare function watchEffect(callback: (cleanup?: () => void) => void, options?: WatchOptions): () => void;
|
|
205
|
+
/**
|
|
206
|
+
* 监听对象深度变化
|
|
207
|
+
* @param source 响应式对象
|
|
208
|
+
* @param callback 回调函数
|
|
209
|
+
* @returns 停止监听的函数
|
|
210
|
+
*/
|
|
211
|
+
declare function watchDeep<T extends object>(source: T, callback: (newValue: T, oldValue: T) => void): () => void;
|
|
212
|
+
/**
|
|
213
|
+
* 停止所有 watch(全局函数)
|
|
214
|
+
*/
|
|
215
|
+
declare function disposeAllWatches(): void;
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Reactive 响应式对象实现
|
|
219
|
+
* 深层响应式代理
|
|
220
|
+
*/
|
|
221
|
+
/**
|
|
222
|
+
* 创建响应式对象
|
|
223
|
+
*/
|
|
224
|
+
declare function reactive<T extends object>(target: T): T;
|
|
225
|
+
/**
|
|
226
|
+
* 创建浅响应式对象
|
|
227
|
+
*/
|
|
228
|
+
declare function shallowReactive<T extends object>(target: T): T;
|
|
229
|
+
/**
|
|
230
|
+
* 创建只读对象
|
|
231
|
+
*/
|
|
232
|
+
declare function readonly<T extends object>(target: T): Readonly<T>;
|
|
233
|
+
/**
|
|
234
|
+
* 创建浅只读对象
|
|
235
|
+
*/
|
|
236
|
+
declare function shallowReadonly<T extends object>(target: T): Readonly<T>;
|
|
237
|
+
/**
|
|
238
|
+
* 检查是否为响应式对象
|
|
239
|
+
*/
|
|
240
|
+
declare function isReactive(value: unknown): boolean;
|
|
241
|
+
/**
|
|
242
|
+
* 检查是否为只读对象
|
|
243
|
+
*/
|
|
244
|
+
declare function isReadonly(value: unknown): boolean;
|
|
245
|
+
/**
|
|
246
|
+
* 检查是否为代理对象
|
|
247
|
+
*/
|
|
248
|
+
declare function isProxy(value: unknown): boolean;
|
|
249
|
+
/**
|
|
250
|
+
* 获取原始对象
|
|
251
|
+
*/
|
|
252
|
+
declare function toRaw<T>(value: T): T;
|
|
253
|
+
/**
|
|
254
|
+
* 转换为响应式(如果尚未转换)
|
|
255
|
+
*/
|
|
256
|
+
declare function toReactive<T>(value: T): T;
|
|
257
|
+
/**
|
|
258
|
+
* 取消响应式(创建副本)
|
|
259
|
+
*/
|
|
260
|
+
declare function toRef<T>(target: T): T;
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* AsyncSignal 异步信号实现
|
|
264
|
+
* 支持异步数据获取和加载状态
|
|
265
|
+
*/
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* 创建 AsyncSignal 异步信号
|
|
269
|
+
* @param fetcher 异步获取函数
|
|
270
|
+
* @param initialValue 初始值
|
|
271
|
+
* @returns AsyncSignal 对象
|
|
272
|
+
*/
|
|
273
|
+
declare function asyncSignal<T>(fetcher: () => Promise<T>, initialValue?: T): AsyncSignal<T>;
|
|
274
|
+
/**
|
|
275
|
+
* 创建 Suspense 风格的异步信号(带边界)
|
|
276
|
+
* @param fetcher 异步获取函数
|
|
277
|
+
* @param initialValue 初始值
|
|
278
|
+
* @returns AsyncSignal 对象
|
|
279
|
+
*/
|
|
280
|
+
declare function asyncSignalSuspense<T>(fetcher: () => Promise<T>, initialValue?: T): AsyncSignal<T>;
|
|
281
|
+
/**
|
|
282
|
+
* 延迟创建 AsyncSignal
|
|
283
|
+
* @param delay 延迟时间(毫秒)
|
|
284
|
+
* @param fetcher 异步获取函数
|
|
285
|
+
* @returns AsyncSignal
|
|
286
|
+
*/
|
|
287
|
+
declare function lazyAsyncSignal<T>(fetcher: () => Promise<T>, delay?: number): () => AsyncSignal<T>;
|
|
288
|
+
/**
|
|
289
|
+
* 创建带缓存的 AsyncSignal
|
|
290
|
+
* @param key 缓存 key
|
|
291
|
+
* @param fetcher 异步获取函数
|
|
292
|
+
* @returns AsyncSignal
|
|
293
|
+
*/
|
|
294
|
+
declare function cachedAsyncSignal<T>(key: string, fetcher: () => Promise<T>): AsyncSignal<T>;
|
|
295
|
+
/**
|
|
296
|
+
* 清除 AsyncSignal 缓存
|
|
297
|
+
*/
|
|
298
|
+
declare function clearAsyncSignalCache(): void;
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* 全局响应式状态
|
|
302
|
+
* 用于追踪当前正在执行的 effect
|
|
303
|
+
*/
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* 获取当前正在执行的 effect
|
|
307
|
+
*/
|
|
308
|
+
declare function getCurrentEffect(): Effect | null;
|
|
309
|
+
/**
|
|
310
|
+
* 设置当前正在执行的 effect
|
|
311
|
+
*/
|
|
312
|
+
declare function setCurrentEffect(effect: Effect | null): void;
|
|
313
|
+
/**
|
|
314
|
+
* 获取 effect 栈
|
|
315
|
+
*/
|
|
316
|
+
declare function getEffectStack(): Effect[];
|
|
317
|
+
/**
|
|
318
|
+
* 将 effect 压入栈
|
|
319
|
+
*/
|
|
320
|
+
declare function pushEffect(effect: Effect): void;
|
|
321
|
+
/**
|
|
322
|
+
* 将 effect 弹出栈
|
|
323
|
+
*/
|
|
324
|
+
declare function popEffect(): Effect | undefined;
|
|
325
|
+
/**
|
|
326
|
+
* 注册 effect
|
|
327
|
+
*/
|
|
328
|
+
declare function registerEffect(effect: Effect): void;
|
|
329
|
+
/**
|
|
330
|
+
* 注销 effect
|
|
331
|
+
*/
|
|
332
|
+
declare function unregisterEffect(effect: Effect): void;
|
|
333
|
+
/**
|
|
334
|
+
* 获取所有活跃的 effects
|
|
335
|
+
*/
|
|
336
|
+
declare function getAllEffects(): Set<Effect>;
|
|
337
|
+
|
|
338
|
+
export { asyncSignal, asyncSignalSuspense, cachedAsyncSignal, clearAsyncSignalCache, computed, readonly$1 as computedReadonly, computedSet, disposeAllWatches, effect, effectPost, effectSync, getAllEffects, getCurrentEffect, getEffectStack, getGlobalEffect, isCached, isProxy, isReactive, isReadonly, lazyAsyncSignal, pauseEffect, popEffect, pushEffect, reactive, readonly, readonlySignal, refresh, registerEffect, resumeEffect, runEffects, setCurrentEffect, setGlobalEffect, shallowReactive, shallowReadonly, signal, stop, toRaw, toReactive, toRef, unregisterEffect, unsubscribe, watch, watchDeep, watchEffect };
|
|
339
|
+
export type { AsyncSignal, Computed, Effect, EffectRunner$1 as EffectRunner, Signal, SignalGetter, WatchCallback, WatchOptions, WatchSource };
|
|
340
|
+
//# sourceMappingURL=reactivity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity.d.ts","sources":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{warn as t,isFunction as e,isObject as n,isArray as r}from"@fluxion-ui/shared";let c=null;const o=[],u=new Set;function f(){return c}function i(t){c=t}function s(){return o}function a(t){o.push(t),c=t}function l(){const t=o.pop();return c=o.length>0?o[o.length-1]:null,t}function p(t){u.add(t)}function d(t){u.delete(t)}function y(){return u}function g(t){const e=new Set;let n=t;const r=function(){const t=f();if(t){Array.from(e).find(e=>e.effect===t)||e.add({effect:t})}return n};r.set=function(t){const r="function"==typeof t?t(n):t;Object.is(r,n)||(n=r,e.forEach(t=>{t.effect&&t.effect()}))},r.update=function(t){const e=t(n);r.set(e)};const c=r;return c.set=r.set,c.update=r.update,c}function h(t){let e=t;return function(){return e}}function m(e,n){t("unsubscribe is not fully implemented yet")}function b(t){i(t)}function w(){return f()}function v(n,r){if(!e(n))return t("effect function must be a function",n),()=>{};let c=null;const o=()=>{c&&(c(),c=null)},u=()=>{var t;o(),a(t=u),b(t);try{const t=n();return e(t)&&(c=t),t}finally{!function(){const t=l();b(s().length>0?s()[s().length-1]:null)}()}};return u.stop=()=>{o(),d(u)},p(u),u(),u}function E(t){t&&e(t.stop)&&t.stop()}function R(t){return v(t)}function j(t){return v(t)}function P(e){t("pauseEffect is not fully implemented yet")}function k(e){t("resumeEffect is not fully implemented yet")}function _(e){e.forEach(e=>{try{e()}catch(e){t("Error running effect:",e)}})}function O(n){if(!e(n))return t("computed getter must be a function",n),()=>{};let r,c=!0;const o=v(()=>{n(),c=!0}),u=()=>(c&&(r=n(),c=!1),r);return u.stop=()=>{E(o)},u}function x(t){return O(t)}function M(t){return!0}function A(t){t()}function S(t){const e={};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=O(t[n]));return e}const W="__v_isReactive",C="__v_isReadonly",D="__v_raw",K=new WeakMap,q=new WeakMap,z=new WeakMap;function B(t,e){const n=function(t){let e=z.get(t);return e||(e=new Map,z.set(t,e)),e}(t);let r=n.get(e);return r||(r=new Set,n.set(e,r)),r}function F(e,n){const r=z.get(e);if(!r)return;if(void 0!==n){const e=r.get(n);e&&e.forEach(e=>{try{e()}catch(e){t("Error triggering effect:",e)}})}const c=r.get(D);c&&c.forEach(e=>{try{e()}catch(e){t("Error triggering effect:",e)}})}function G(t){if(!t)return!1;return!0===t[W]}function H(t){if(!t)return!1;return!0===t[C]}function I(t,e=!1,r=!1){if(G(t))return t;if(H(t))return t;const c=e?q:K,o=c.get(t);if(o)return o;const u=new Proxy(t,{get(t,c,o){if(c===W)return!e;if(c===C)return e;if(c===D)return t;const u=f();if(u){B(t,c).add(u)}const i=Reflect.get(t,c,o);return r?i:n(i)?e?N(i):J(i):i},set(t,e,n,r){const c=Reflect.get(t,e,r),o=Reflect.set(t,e,n,r);return o&&!Object.is(n,c)&&F(t,e),o},deleteProperty(t,e){Reflect.get(t,e);const n=Reflect.deleteProperty(t,e);return n&&F(t,e),n},has(t,e){const n=Reflect.has(t,e),r=f();if(r){B(t,e).add(r)}return n},ownKeys(t){const e=f();if(e){B(t,D).add(e)}return Reflect.ownKeys(t)},getOwnPropertyDescriptor(t,e){const n=Reflect.getOwnPropertyDescriptor(t,e),r=f();if(r){B(t,e).add(r)}return n}});return c.set(t,u),u}function J(e){return n(e)?H(e)?e:I(e,!1,!1):(t("reactive() expects an object as target",e),e)}function L(e){return n(e)?I(e,!1,!0):(t("shallowReactive() expects an object as target",e),e)}function N(e){return n(e)?G(e)||H(e)?e:I(e,!0,!1):(t("readonly() expects an object as target",e),e)}function Q(e){return n(e)?I(e,!0,!0):(t("shallowReadonly() expects an object as target",e),e)}function T(t){return G(t)}function U(t){return H(t)}function V(t){return G(t)||H(t)}function X(t){return G(t)?t[D]:t}function Y(t){return G(t)?t:J(t)}function Z(t){return t}function $(t,e){if(t===e)return!0;if(!t||!e)return!1;if("object"!=typeof t||"object"!=typeof e)return t===e;if(r(t)&&r(e)){if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(!$(t[n],e[n]))return!1;return!0}const n=Object.keys(t),c=Object.keys(e);if(n.length!==c.length)return!1;for(const r of n){if(!c.includes(r))return!1;if(!$(t[r],e[r]))return!1}return!0}function tt(r,c,o){if(!e(r)&&!n(r))return t("watch source must be a function or an object"),()=>{};if(!e(c))return t("watch callback must be a function"),()=>{};if(Array.isArray(r)){return function(t,e,n){let r=t.map(()=>{}),c=!0;const o=()=>{const o=t.map(t=>t());let u=c;if(!c)for(let t=0;t<o.length;t++)if(n?.deep){if(!$(o[t],r[t])){u=!0;break}}else if(o[t]!==r[t]){u=!0;break}(u||c)&&(e(o,r),r=[...o],c=!1)};n?.immediate&&o();const u=v(o);return()=>{E(u)}}(r,c,o)}return function(t,e,n){let r,c,o=!0;const u=()=>{c&&c();const u=t();let f=o;o||(f=n?.deep?!$(u,r):u!==r),(f||o)&&(c=e(u,r,c),r=u,o=!1)};n?.immediate&&u();const f=v(u);return()=>{E(f)}}(r,c,o)}function et(n,r){if(!e(n))return t("watchEffect callback must be a function"),()=>{};let c;const o=v(()=>{c&&c(),c=n(c)});return()=>{E(o)}}function nt(t,e){return tt(()=>X(t),e,{deep:!0})}function rt(){t("disposeAllWatches is not implemented")}function ct(n,r){if(!e(n))return t("asyncSignal fetcher must be a function",n),function(t){const e=g(t),n=g(!1),r=g(null),c=()=>e();return c.loading=n,c.error=r,c.reload=async()=>{},c.set=t=>{e.set(t)},c.update=t=>{const n=t(e());e.set(n)},c.cancel=()=>{},c.isCancelled=()=>!1,c.abort=()=>{},c.then=(t,n)=>Promise.resolve(e()).then(t,n),c.catch=t=>Promise.resolve(e()).catch(t),c.finally=t=>Promise.resolve(e()).finally(t),c}(r);const c=g(r),o=g(!0),u=g(null);let f=n,i=!1;const s=async()=>{o.set(!0),u.set(null);try{if(f){const t=await f();if(i)return;c.set(t)}}catch(t){if(i)return;u.set(t)}finally{if(i)return;o.set(!1)}};s();const a=function(){return c()};return a.loading=o,a.error=u,a.reload=s,a.set=t=>{c.set(t)},a.update=t=>{const e=t(c());c.set(e)},a.cancel=()=>{i=!0},a.isCancelled=()=>i,a.abort=()=>{i=!0},a.then=(t,e)=>Promise.resolve(c()).then(t,e),a.catch=t=>Promise.resolve(c()).catch(t),a.finally=t=>Promise.resolve(c()).finally(t),a}function ot(t,e){return ct(t,e)}function ut(t,e=0){return()=>ct(t)}const ft=new Map;function it(t,e){const n=ft.get(t);if(n)return n;const r=ct(e);return ft.set(t,r),r}function st(){ft.clear()}export{ct as asyncSignal,ot as asyncSignalSuspense,it as cachedAsyncSignal,st as clearAsyncSignalCache,O as computed,x as computedReadonly,S as computedSet,rt as disposeAllWatches,v as effect,R as effectPost,j as effectSync,y as getAllEffects,f as getCurrentEffect,s as getEffectStack,w as getGlobalEffect,M as isCached,V as isProxy,T as isReactive,U as isReadonly,ut as lazyAsyncSignal,P as pauseEffect,l as popEffect,a as pushEffect,J as reactive,N as readonly,h as readonlySignal,A as refresh,p as registerEffect,k as resumeEffect,_ as runEffects,i as setCurrentEffect,b as setGlobalEffect,L as shallowReactive,Q as shallowReadonly,g as signal,E as stop,X as toRaw,Y as toReactive,Z as toRef,d as unregisterEffect,m as unsubscribe,tt as watch,nt as watchDeep,et as watchEffect};
|
|
2
|
+
//# sourceMappingURL=reactivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity.js","sources":["../src/state.ts","../src/api/signal.ts","../src/api/effect.ts","../src/api/computed.ts","../src/types.ts","../src/api/reactive.ts","../src/api/watch.ts","../src/api/async.ts"],"sourcesContent":["/**\n * 全局响应式状态\n * 用于追踪当前正在执行的 effect\n */\n\nimport type { Effect } from './types'\n\n// 当前正在执行的 effect\nlet currentEffect: Effect | null = null\n\n// effect 栈\nconst effectStack: Effect[] = []\n\n// 存储所有活跃的 effect 集合\nconst allEffects = new Set<Effect>()\n\n/**\n * 获取当前正在执行的 effect\n */\nexport function getCurrentEffect(): Effect | null {\n return currentEffect\n}\n\n/**\n * 设置当前正在执行的 effect\n */\nexport function setCurrentEffect(effect: Effect | null): void {\n currentEffect = effect\n}\n\n/**\n * 获取 effect 栈\n */\nexport function getEffectStack(): Effect[] {\n return effectStack\n}\n\n/**\n * 将 effect 压入栈\n */\nexport function pushEffect(effect: Effect): void {\n effectStack.push(effect)\n currentEffect = effect\n}\n\n/**\n * 将 effect 弹出栈\n */\nexport function popEffect(): Effect | undefined {\n const effect = effectStack.pop()\n currentEffect = effectStack.length > 0\n ? effectStack[effectStack.length - 1]\n : null\n return effect\n}\n\n/**\n * 注册 effect\n */\nexport function registerEffect(effect: Effect): void {\n allEffects.add(effect)\n}\n\n/**\n * 注销 effect\n */\nexport function unregisterEffect(effect: Effect): void {\n allEffects.delete(effect)\n}\n\n/**\n * 获取所有活跃的 effects\n */\nexport function getAllEffects(): Set<Effect> {\n return allEffects\n}\n\n// 重新导出 Effect 类型\nexport type { Effect } from './types'","/**\n * Signal 基础信号实现\n * 提供响应式数据封装\n */\n\nimport { warn } from '@fluxion-ui/shared'\nimport type { Signal, SignalGetter } from '../types'\nimport { getCurrentEffect, setCurrentEffect } from '../state'\n\n/**\n * 设置当前 effect\n */\nexport function setGlobalEffect(effect: (() => void) | null): void {\n setCurrentEffect(effect as any)\n}\n\n/**\n * 获取当前 effect\n */\nexport function getGlobalEffect(): (() => void) | null {\n return getCurrentEffect() as any\n}\n\n/**\n * Signal 订阅者\n */\ninterface SignalSubscriber {\n effect: (() => void) | null\n}\n\n/**\n * 创建 Signal\n * @param value 初始值\n * @returns Signal 函数,调用返回当前值\n */\nexport function signal<T>(value: T): Signal<T> {\n // 订阅者集合\n const subscribers = new Set<SignalSubscriber>()\n\n // 当前值\n let currentValue = value\n\n // 获取器函数\n const getter: SignalGetter<T> = function(this: SignalGetter<T>) {\n // 收集当前正在执行的 effect 作为依赖\n const effect = getGlobalEffect()\n if (effect) {\n // 检查是否已存在该 effect 的订阅\n const existing = Array.from(subscribers).find(s => s.effect === effect)\n if (!existing) {\n subscribers.add({ effect })\n }\n }\n return currentValue\n } as SignalGetter<T>\n\n // 设置值\n getter.set = function(value: T | ((prev: T) => T)): void {\n const resolved = typeof value === 'function'\n ? (value as (prev: T) => T)(currentValue)\n : value\n\n if (Object.is(resolved, currentValue)) {\n return\n }\n\n currentValue = resolved\n\n // 通知所有订阅者\n subscribers.forEach(subscriber => {\n if (subscriber.effect) {\n subscriber.effect()\n }\n })\n }\n\n // 更新值(set 的别名,语义更明确)\n getter.update = function(updater: (prev: T) => T): void {\n const newValue = updater(currentValue)\n getter.set(newValue)\n }\n\n // 合并到 Signal 类型\n const signalFn = getter as Signal<T>\n signalFn.set = getter.set\n signalFn.update = getter.update\n\n return signalFn\n}\n\n/**\n * 创建只读 Signal(不可修改)\n * @param value 初始值\n * @returns 只读的 Signal 函数\n */\nexport function readonlySignal<T>(value: T): () => T {\n let currentValue = value\n\n return function() {\n // 收集依赖\n const effect = getGlobalEffect()\n if (effect) {\n // 只读信号也需要追踪依赖,但这里我们简化处理\n // 在实际实现中可能需要特殊的只读订阅机制\n }\n return currentValue\n }\n}\n\n/**\n * 取消 Signal 的订阅\n * @param signal 要取消订阅的 Signal\n * @param effect 要移除的 effect\n */\nexport function unsubscribe<T>(signal: Signal<T>, effect: () => void): void {\n // 注意:由于 subscribers 是闭包中的私有变量,\n // 这个函数需要在 signal 内部实现专门的取消订阅机制\n // 当前简化实现暂不提供此功能\n warn('unsubscribe is not fully implemented yet')\n}","/**\n * Effect 副作用系统实现\n * 自动追踪依赖并响应变化\n */\n\nimport { warn, isFunction } from '@fluxion-ui/shared'\nimport {\n getCurrentEffect,\n setCurrentEffect,\n pushEffect as statePushEffect,\n popEffect as statePopEffect,\n registerEffect as stateRegisterEffect,\n unregisterEffect as stateUnregisterEffect,\n getEffectStack\n} from '../state'\n\n/**\n * Effect 清理函数\n */\ntype CleanupFn = () => void\n\n/**\n * Effect 运行函数\n */\ntype EffectRunner = () => void | CleanupFn\n\n/**\n * Effect 接口\n */\ninterface IEffect extends Function {\n (): void\n stop: () => void\n}\n\n/**\n * Effect 选项\n */\ninterface EffectOptions {\n flush?: 'pre' | 'post' | 'sync'\n}\n\n/**\n * 设置当前 effect(供 signal 依赖追踪使用)\n */\nexport function setGlobalEffect(effect: (() => void) | null): void {\n setCurrentEffect(effect as any)\n}\n\n/**\n * 获取当前 effect\n */\nexport function getGlobalEffect(): (() => void) | null {\n return getCurrentEffect() as any\n}\n\n/**\n * 将 effect 压入栈\n */\nfunction pushEffect(effect: IEffect): void {\n statePushEffect(effect as any)\n // 设置全局 effect 以便 signal 追踪\n setGlobalEffect(effect as any)\n}\n\n/**\n * 将 effect 弹出栈\n */\nfunction popEffect(): IEffect | undefined {\n const effect = statePopEffect()\n // 清空全局 effect\n setGlobalEffect(getEffectStack().length > 0 ? getEffectStack()[getEffectStack().length - 1] as any : null)\n return effect\n}\n\n/**\n * 注册 effect\n */\nfunction registerEffect(effect: IEffect): void {\n stateRegisterEffect(effect as any)\n}\n\n/**\n * 注销 effect\n */\nfunction unregisterEffect(effect: IEffect): void {\n stateUnregisterEffect(effect as any)\n}\n\n/**\n * 创建 Effect\n */\nexport function effect(fn: EffectRunner, _options?: EffectOptions): IEffect {\n if (!isFunction(fn)) {\n warn('effect function must be a function', fn)\n return (() => {}) as IEffect\n }\n\n let cleanup: CleanupFn | null = null\n\n const runCleanup = () => {\n if (cleanup) {\n cleanup()\n cleanup = null\n }\n }\n\n const effectFn = (() => {\n runCleanup()\n\n pushEffect(effectFn as IEffect)\n\n try {\n const result = fn()\n\n if (isFunction(result)) {\n cleanup = result as CleanupFn\n }\n\n return result\n } finally {\n popEffect()\n }\n }) as IEffect\n\n effectFn.stop = () => {\n runCleanup()\n unregisterEffect(effectFn as IEffect)\n }\n\n registerEffect(effectFn as IEffect)\n effectFn()\n\n return effectFn as IEffect\n}\n\n/**\n * 停止 Effect\n */\nexport function stop(effect: IEffect): void {\n if (effect && isFunction(effect.stop)) {\n effect.stop()\n }\n}\n\n/**\n * 创建一个只在 DOM 更新后执行的 effect\n */\nexport function effectPost(fn: EffectRunner): IEffect {\n return effect(fn)\n}\n\n/**\n * 创建一个同步执行的 effect\n */\nexport function effectSync(fn: EffectRunner): IEffect {\n return effect(fn)\n}\n\nexport function pauseEffect(_effect: IEffect): void {\n warn('pauseEffect is not fully implemented yet')\n}\n\nexport function resumeEffect(_effect: IEffect): void {\n warn('resumeEffect is not fully implemented yet')\n}\n\n/**\n * 批量执行 effects\n */\nexport function runEffects(effects: IEffect[]): void {\n effects.forEach(effect => {\n try {\n effect()\n } catch (error) {\n warn('Error running effect:', error)\n }\n })\n}","/**\n * Computed 计算属性实现\n * 根据依赖自动计算值并缓存结果\n */\n\nimport { warn, isFunction } from '@fluxion-ui/shared'\nimport type { Computed } from '../types'\nimport { effect, stop } from './effect'\n\n/**\n * 创建 Computed 计算属性\n * @param getter 计算函数\n * @returns Computed 函数,调用返回计算值\n */\nexport function computed<T>(getter: () => T): Computed<T> {\n if (!isFunction(getter)) {\n warn('computed getter must be a function', getter)\n return (() => undefined) as Computed<T>\n }\n\n // 缓存的值\n let cachedValue: T | undefined = undefined\n\n // 是否脏(需要重新计算)\n let dirty = true\n\n // 通知更新的回调(外部订阅用)\n let onUpdate: (() => void) | null = null\n\n // 创建一个 effect 来追踪 getter 中的响应式依赖\n // 当依赖变化时,设置 dirty 并通知回调\n const eff = effect(() => {\n // 读取 getter 中的响应式数据\n // 这会收集依赖(如 countSignal)\n getter()\n\n // 依赖变化时,下次访问需要重新计算\n dirty = true\n\n // 通知更新\n if (onUpdate) {\n onUpdate()\n }\n })\n\n // 创建 computed 函数\n const computedFn = (() => {\n if (dirty) {\n // 重新计算\n cachedValue = getter()\n dirty = false\n }\n\n return cachedValue as T\n }) as Computed<T>\n\n // 添加 stop 方法\n computedFn.stop = () => {\n stop(eff)\n }\n\n return computedFn\n}\n\n/**\n * 创建只读的计算属性\n * @param getter 计算函数\n * @returns Computed 函数\n */\nexport function readonly<T>(getter: () => T): Computed<T> {\n return computed(getter)\n}\n\n/**\n * 检查 Computed 是否有缓存值\n * @param computed 要检查的 Computed\n * @returns 是否有缓存\n */\nexport function isCached<T>(computed: Computed<T>): boolean {\n // 当前实现总是有缓存\n return true\n}\n\n/**\n * 强制 Computed 重新计算\n * @param computed 要重新计算的 Computed\n */\nexport function refresh<T>(computed: Computed<T>): void {\n // 触发重新计算\n // 由于 computed 是惰性求值,调用即重新计算\n computed()\n}\n\n/**\n * 创建 ComputedSet(多个相关计算属性的集合)\n * @param getters 计算函数映射\n * @returns Computed 映射\n */\nexport function computedSet<T extends Record<string, () => any>>(\n getters: T\n): {\n [K in keyof T]: ReturnType<T[K]>\n} {\n const result: any = {}\n\n for (const key in getters) {\n if (Object.prototype.hasOwnProperty.call(getters, key)) {\n result[key] = computed(getters[key]!)\n }\n }\n\n return result\n}","/**\n * Reactivity 包类型定义\n */\n\nimport type { AnyFunction } from '@fluxion-ui/shared'\n\n// ==================== Signal 类型 ====================\n\n/**\n * Signal 读取函数\n */\nexport type SignalGetter<T> = (() => T) & {\n set: (value: T | ((prev: T) => T)) => void\n update: (updater: (prev: T) => T) => void\n}\n\n/**\n * Signal 接口\n */\nexport interface Signal<T> extends Function {\n (): T\n set: (value: T | ((prev: T) => T)) => void\n update: (updater: (prev: T) => T) => void\n}\n\n// ==================== Computed 类型 ====================\n\n/**\n * Computed 计算属性接口\n */\nexport interface Computed<T> extends Function {\n (): T\n}\n\n// ==================== Effect 类型 ====================\n\n/**\n * Effect 运行函数\n */\nexport type EffectRunner = () => void\n\n/**\n * Effect 接口\n */\nexport interface Effect extends Function {\n (): void\n stop: () => void\n}\n\n// ==================== Watch 类型 ====================\n\n/**\n * Watch 回调函数\n */\nexport type WatchCallback<T> = (\n newValue: T,\n oldValue: T | undefined,\n cleanup?: () => void\n) => void\n\n/**\n * Watch 源函数\n */\nexport type WatchSource<T> = () => T\n\n/**\n * Watch 选项\n */\nexport interface WatchOptions {\n immediate?: boolean\n deep?: boolean\n flush?: 'pre' | 'post' | 'sync'\n}\n\n// ==================== Reactive 类型 ====================\n\n/**\n * Reactive 目标类型\n */\nexport type ReactiveTarget<T> = T extends object ? T : never\n\n/**\n * Reactive 代理标记\n */\nexport const ReactiveFlags = {\n IS_REACTIVE: '__v_isReactive',\n IS_READONLY: '__v_isReadonly',\n RAW: '__v_raw'\n} as const\n\n/**\n * Reactive 映射表\n */\nexport interface ReactiveMap {\n get(target: object): any\n set(target: object, proxy: object): void\n}\n\n// ==================== AsyncSignal 类型 ====================\n\n/**\n * AsyncSignal 异步信号接口\n */\nexport interface AsyncSignal<T> extends Signal<T | undefined> {\n loading: Signal<boolean>\n error: Signal<Error | null>\n reload: () => Promise<void>\n cancel: () => void\n isCancelled: () => boolean\n abort: () => void\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2>\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult>\n finally(onfinally?: (() => void) | null): Promise<T>\n}\n\n// ==================== 内部类型 ====================\n\n/**\n * 依赖项接口\n */\nexport interface Dependency {\n subscribers: Set<Effect>\n addSubscriber(effect: Effect): void\n removeSubscriber(effect: Effect): void\n notify(): void\n}\n\n/**\n * 全局响应式状态\n */\nexport interface ReactiveState {\n currentEffect: Effect | null\n effects: Set<Effect>[]\n}","/**\n * Reactive 响应式对象实现\n * 深层响应式代理\n */\n\nimport { warn, isObject } from '@fluxion-ui/shared'\nimport { ReactiveFlags } from '../types'\nimport { getCurrentEffect } from '../state'\n\n// 响应式映射表\nconst reactiveMap = new WeakMap<object, any>()\nconst readonlyMap = new WeakMap<object, any>()\n\n// 目标对象到代理的映射\nconst targetMap = new WeakMap<object, Map<string | symbol, Set<any>>>()\n\n/**\n * 获取依赖映射\n */\nfunction getDepMap(target: object): Map<string | symbol, Set<any>> {\n let depMap = targetMap.get(target)\n if (!depMap) {\n depMap = new Map()\n targetMap.set(target, depMap)\n }\n return depMap\n}\n\n/**\n * 获取指定 key 的依赖集合\n */\nfunction getDep(target: object, key: string | symbol): Set<any> {\n const depMap = getDepMap(target)\n let dep = depMap.get(key)\n if (!dep) {\n dep = new Set()\n depMap.set(key, dep)\n }\n return dep\n}\n\n/**\n * 触发指定 key 的依赖更新\n */\nfunction trigger(target: object, key?: string | symbol): void {\n const depMap = targetMap.get(target)\n if (!depMap) return\n\n if (key !== undefined) {\n const dep = depMap.get(key)\n if (dep) {\n dep.forEach((effectFn: any) => {\n try {\n effectFn()\n } catch (error) {\n warn('Error triggering effect:', error)\n }\n })\n }\n }\n\n const dep = depMap.get(ReactiveFlags.RAW)\n if (dep) {\n dep.forEach((effectFn: any) => {\n try {\n effectFn()\n } catch (error) {\n warn('Error triggering effect:', error)\n }\n })\n }\n}\n\n/**\n * 检查是否为响应式\n */\nfunction checkIsReactive(value: unknown): boolean {\n if (!value) return false\n const val = value as any\n return val[ReactiveFlags.IS_REACTIVE] === true\n}\n\n/**\n * 检查是否为只读\n */\nfunction checkIsReadonly(value: unknown): boolean {\n if (!value) return false\n const val = value as any\n return val[ReactiveFlags.IS_READONLY] === true\n}\n\n/**\n * 创建响应式代理\n */\nfunction createReactive<T extends object>(\n target: T,\n readonlyFlag: boolean = false,\n isShallow: boolean = false\n): T {\n if (checkIsReactive(target)) {\n return target\n }\n if (checkIsReadonly(target)) {\n return target\n }\n\n const map = readonlyFlag ? readonlyMap : reactiveMap\n const existingProxy = map.get(target)\n if (existingProxy) {\n return existingProxy\n }\n\n const proxy = new Proxy(target, {\n get(target, key, receiver) {\n if (key === ReactiveFlags.IS_REACTIVE) {\n return !readonlyFlag\n }\n if (key === ReactiveFlags.IS_READONLY) {\n return readonlyFlag\n }\n if (key === ReactiveFlags.RAW) {\n return target\n }\n\n const currentEffect = getCurrentEffect()\n if (currentEffect) {\n const dep = getDep(target, key)\n dep.add(currentEffect)\n }\n\n const result = Reflect.get(target, key, receiver)\n\n if (isShallow) {\n return result\n }\n\n if (isObject(result)) {\n return readonlyFlag\n ? readonly(result)\n : reactive(result)\n }\n\n return result\n },\n\n set(target, key, value, receiver) {\n const oldValue = Reflect.get(target, key, receiver)\n const result = Reflect.set(target, key, value, receiver)\n\n if (result && !Object.is(value, oldValue)) {\n trigger(target, key)\n }\n\n return result\n },\n\n deleteProperty(target, key) {\n const oldValue = Reflect.get(target, key)\n const result = Reflect.deleteProperty(target, key)\n\n if (result) {\n trigger(target, key)\n }\n\n return result\n },\n\n has(target, key) {\n const result = Reflect.has(target, key)\n const currentEffect = getCurrentEffect()\n if (currentEffect) {\n const dep = getDep(target, key)\n dep.add(currentEffect)\n }\n return result\n },\n\n ownKeys(target) {\n const currentEffect = getCurrentEffect()\n if (currentEffect) {\n const dep = getDep(target, ReactiveFlags.RAW)\n dep.add(currentEffect)\n }\n return Reflect.ownKeys(target)\n },\n\n getOwnPropertyDescriptor(target, key) {\n const result = Reflect.getOwnPropertyDescriptor(target, key)\n const currentEffect = getCurrentEffect()\n if (currentEffect) {\n const dep = getDep(target, key)\n dep.add(currentEffect)\n }\n return result\n }\n })\n\n map.set(target, proxy)\n return proxy\n}\n\n/**\n * 创建响应式对象\n */\nexport function reactive<T extends object>(target: T): T {\n if (!isObject(target)) {\n warn('reactive() expects an object as target', target)\n return target\n }\n if (checkIsReadonly(target)) {\n return target\n }\n return createReactive(target, false, false)\n}\n\n/**\n * 创建浅响应式对象\n */\nexport function shallowReactive<T extends object>(target: T): T {\n if (!isObject(target)) {\n warn('shallowReactive() expects an object as target', target)\n return target\n }\n return createReactive(target, false, true)\n}\n\n/**\n * 创建只读对象\n */\nexport function readonly<T extends object>(target: T): Readonly<T> {\n if (!isObject(target)) {\n warn('readonly() expects an object as target', target)\n return target as any\n }\n if (checkIsReactive(target) || checkIsReadonly(target)) {\n return target as any\n }\n return createReactive(target, true, false) as Readonly<T>\n}\n\n/**\n * 创建浅只读对象\n */\nexport function shallowReadonly<T extends object>(target: T): Readonly<T> {\n if (!isObject(target)) {\n warn('shallowReadonly() expects an object as target', target)\n return target as any\n }\n return createReactive(target, true, true) as Readonly<T>\n}\n\n/**\n * 检查是否为响应式对象\n */\nexport function isReactive(value: unknown): boolean {\n return checkIsReactive(value)\n}\n\n/**\n * 检查是否为只读对象\n */\nexport function isReadonly(value: unknown): boolean {\n return checkIsReadonly(value)\n}\n\n/**\n * 检查是否为代理对象\n */\nexport function isProxy(value: unknown): boolean {\n return checkIsReactive(value) || checkIsReadonly(value)\n}\n\n/**\n * 获取原始对象\n */\nexport function toRaw<T>(value: T): T {\n if (checkIsReactive(value)) {\n return (value as any)[ReactiveFlags.RAW]\n }\n return value\n}\n\n/**\n * 转换为响应式(如果尚未转换)\n */\nexport function toReactive<T>(value: T): T {\n return checkIsReactive(value as any) ? value : reactive(value as object) as T\n}\n\n/**\n * 取消响应式(创建副本)\n */\nexport function toRef<T>(target: T): T {\n return target\n}","/**\n * Watch 监听器实现\n * 监听响应式数据变化\n */\n\nimport { warn, isFunction, isObject, isArray } from '@fluxion-ui/shared'\nimport type { WatchCallback, WatchSource, WatchOptions } from '../types'\nimport { effect, stop } from './effect'\nimport { toRaw } from './reactive'\n\n// ==================== 深度比较 ====================\n\n/**\n * 深度比较两个值是否相等\n */\nfunction deepEqual(a: any, b: any): boolean {\n if (a === b) return true\n\n if (!a || !b) return false\n\n // 如果是原始类型,不相等\n if (typeof a !== 'object' || typeof b !== 'object') {\n return a === b\n }\n\n // 如果是数组\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false\n }\n return true\n }\n\n // 如果是对象\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false\n if (!deepEqual(a[key], b[key])) return false\n }\n\n return true\n}\n\n// ==================== Watch 实现 ====================\n\n/**\n * 监听单一数据源\n */\nfunction watchSource<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n options?: WatchOptions\n): () => void {\n let oldValue: T | undefined = undefined\n let initialRun = true\n\n // 清理函数\n let cleanup: (() => void) | undefined\n\n const runner = () => {\n // 如果有清理函数,先执行\n if (cleanup) {\n cleanup()\n }\n\n // 获取新值\n const newValue = source()\n\n // 检查值是否变化\n let isChanged = initialRun\n if (!initialRun) {\n if (options?.deep) {\n isChanged = !deepEqual(newValue, oldValue)\n } else {\n isChanged = newValue !== oldValue\n }\n }\n\n if (isChanged || initialRun) {\n // 执行回调\n cleanup = callback(newValue as T, oldValue as T, cleanup)\n oldValue = newValue\n initialRun = false\n }\n }\n\n // 立即执行(如果设置了 immediate)\n if (options?.immediate) {\n runner()\n }\n\n // 创建 effect 来追踪依赖\n const eff = effect(runner, { flush: options?.flush })\n\n // 返回停止函数\n return () => {\n stop(eff)\n }\n}\n\n/**\n * 监听多个数据源\n */\nfunction watchSources<T>(\n sources: WatchSource<T>[],\n callback: (values: T[], oldValues: T[]) => void,\n options?: WatchOptions\n): () => void {\n let oldValues: T[] = sources.map(() => undefined as any)\n let initialRun = true\n\n const runner = () => {\n const newValues = sources.map(source => source())\n\n let isChanged = initialRun\n if (!initialRun) {\n for (let i = 0; i < newValues.length; i++) {\n if (options?.deep) {\n if (!deepEqual(newValues[i], oldValues[i])) {\n isChanged = true\n break\n }\n } else {\n if (newValues[i] !== oldValues[i]) {\n isChanged = true\n break\n }\n }\n }\n }\n\n if (isChanged || initialRun) {\n callback(newValues, oldValues)\n oldValues = [...newValues]\n initialRun = false\n }\n }\n\n if (options?.immediate) {\n runner()\n }\n\n const eff = effect(runner, { flush: options?.flush })\n\n return () => {\n stop(eff)\n }\n}\n\n// ==================== 导出函数 ====================\n\n/**\n * 监听响应式数据变化\n * @param source 要监听的数据源(函数、Signal 或响应式对象)\n * @param callback 变化时的回调函数\n * @param options 选项\n * @returns 停止监听的函数\n */\nexport function watch<T>(\n source: WatchSource<T> | WatchSource<T>[],\n callback: WatchCallback<T> | ((values: T[], oldValues: T[]) => void),\n options?: WatchOptions\n): () => void {\n // 参数校验\n if (!isFunction(source) && !isObject(source)) {\n warn('watch source must be a function or an object')\n return () => {}\n }\n\n if (!isFunction(callback)) {\n warn('watch callback must be a function')\n return () => {}\n }\n\n // 处理数组(多个数据源)\n if (Array.isArray(source)) {\n const sources = source as WatchSource<T>[]\n return watchSources(sources, callback as any, options)\n }\n\n // 处理单一数据源\n return watchSource(source as WatchSource<T>, callback as WatchCallback<T>, options)\n}\n\n/**\n * 监听响应式对象的属性\n * @param source 响应式对象\n * @param callback 回调函数\n * @param options 选项\n * @returns 停止监听的函数\n */\nexport function watchEffect(\n callback: (cleanup?: () => void) => void,\n options?: WatchOptions\n): () => void {\n if (!isFunction(callback)) {\n warn('watchEffect callback must be a function')\n return () => {}\n }\n\n let cleanup: (() => void) | undefined\n\n const runner = () => {\n if (cleanup) {\n cleanup()\n }\n\n // 传递清理函数给用户\n cleanup = callback(cleanup)\n }\n\n const eff = effect(runner, { flush: options?.flush })\n\n return () => {\n stop(eff)\n }\n}\n\n/**\n * 监听对象深度变化\n * @param source 响应式对象\n * @param callback 回调函数\n * @returns 停止监听的函数\n */\nexport function watchDeep<T extends object>(\n source: T,\n callback: (newValue: T, oldValue: T) => void\n): () => void {\n return watch(\n () => toRaw(source),\n callback,\n { deep: true }\n )\n}\n\n/**\n * 停止所有 watch(全局函数)\n */\nexport function disposeAllWatches(): void {\n // 当前实现中,watch 返回的停止函数由用户调用\n // 这里可以添加全局清理逻辑\n warn('disposeAllWatches is not implemented')\n}","/**\n * AsyncSignal 异步信号实现\n * 支持异步数据获取和加载状态\n */\n\nimport { warn, isFunction } from '@fluxion-ui/shared'\nimport type { Signal, AsyncSignal } from '../types'\nimport { signal } from './signal'\n\n/**\n * AsyncSignal 状态\n */\ninterface AsyncSignalState<T> {\n data: Signal<T | undefined>\n loading: Signal<boolean>\n error: Signal<Error | null>\n}\n\n/**\n * 创建 AsyncSignal 异步信号\n * @param fetcher 异步获取函数\n * @param initialValue 初始值\n * @returns AsyncSignal 对象\n */\nexport function asyncSignal<T>(\n fetcher: () => Promise<T>,\n initialValue?: T\n): AsyncSignal<T> {\n if (!isFunction(fetcher)) {\n warn('asyncSignal fetcher must be a function', fetcher)\n // 返回一个空的 AsyncSignal\n return createEmptyAsyncSignal<T>(initialValue)\n }\n\n // 创建内部 signal\n const data = signal<T | undefined>(initialValue)\n const loading = signal(true)\n const error = signal<Error | null>(null)\n\n // fetcher 函数引用(可能变化)\n let currentFetcher = fetcher\n\n // 取消标志\n let cancelled = false\n\n /**\n * 执行数据获取\n */\n const reload = async (): Promise<void> => {\n // 标记为进行中\n loading.set(true)\n error.set(null)\n\n try {\n // 如果有 fetcher,执行它\n if (currentFetcher) {\n const result = await currentFetcher()\n\n // 检查是否已取消\n if (cancelled) return\n\n // 设置数据\n data.set(result)\n }\n } catch (e) {\n // 检查是否已取消\n if (cancelled) return\n\n // 设置错误\n error.set(e as Error)\n } finally {\n // 检查是否已取消\n if (cancelled) return\n\n // 标记为完成\n loading.set(false)\n }\n }\n\n // 立即执行一次\n reload()\n\n // 创建 AsyncSignal 函数\n const signalFn = (function(this: AsyncSignal<T>) {\n return data()\n }) as AsyncSignal<T>\n\n // 添加属性\n signalFn.loading = loading\n signalFn.error = error\n signalFn.reload = reload\n\n // 添加 set 方法\n signalFn.set = (value: T | undefined | ((prev: T | undefined) => T | undefined)) => {\n data.set(value as any)\n }\n\n // 添加 update 方法\n signalFn.update = (updater: (prev: T | undefined) => T | undefined) => {\n const current = data()\n const newValue = updater(current)\n data.set(newValue as T)\n }\n\n // 添加 cancel 方法\n signalFn.cancel = () => {\n cancelled = true\n }\n\n // 添加 isCancelled 方法\n signalFn.isCancelled = () => cancelled\n\n // 添加 abort 方法(使用 AbortController)\n let abortController: AbortController | null = null\n signalFn.abort = () => {\n if (abortController) {\n abortController.abort()\n abortController = null\n }\n cancelled = true\n }\n\n // 添加 then 方法(Promise 兼容)\n signalFn.then = (onfulfilled?: (value: T) => any, onrejected?: (reason: any) => any) => {\n return Promise.resolve(data()).then(onfulfilled, onrejected)\n }\n\n // 添加 catch 方法\n signalFn.catch = (onrejected?: (reason: any) => any) => {\n return Promise.resolve(data()).catch(onrejected)\n }\n\n // 添加 finally 方法\n signalFn.finally = (onfinally?: () => void) => {\n return Promise.resolve(data()).finally(onfinally)\n }\n\n return signalFn\n}\n\n/**\n * 创建空的 AsyncSignal(用于错误情况)\n */\nfunction createEmptyAsyncSignal<T>(initialValue?: T): AsyncSignal<T> {\n const data = signal<T | undefined>(initialValue)\n const loading = signal(false)\n const error = signal<Error | null>(null)\n\n const signalFn = (() => data()) as AsyncSignal<T>\n signalFn.loading = loading\n signalFn.error = error\n signalFn.reload = async () => {}\n\n signalFn.set = (value: T | undefined | ((prev: T | undefined) => T | undefined)) => {\n data.set(value as any)\n }\n\n signalFn.update = (updater: (prev: T | undefined) => T | undefined) => {\n const current = data()\n const newValue = updater(current)\n data.set(newValue as T)\n }\n\n signalFn.cancel = () => {}\n signalFn.isCancelled = () => false\n signalFn.abort = () => {}\n\n signalFn.then = (onfulfilled?: (value: T) => any, onrejected?: (reason: any) => any) => {\n return Promise.resolve(data()).then(onfulfilled, onrejected)\n }\n\n signalFn.catch = (onrejected?: (reason: any) => any) => {\n return Promise.resolve(data()).catch(onrejected)\n }\n\n signalFn.finally = (onfinally?: () => void) => {\n return Promise.resolve(data()).finally(onfinally)\n }\n\n return signalFn\n}\n\n/**\n * 创建 Suspense 风格的异步信号(带边界)\n * @param fetcher 异步获取函数\n * @param initialValue 初始值\n * @returns AsyncSignal 对象\n */\nexport function asyncSignalSuspense<T>(\n fetcher: () => Promise<T>,\n initialValue?: T\n): AsyncSignal<T> {\n // 简化为普通 asyncSignal\n return asyncSignal(fetcher, initialValue)\n}\n\n/**\n * 延迟创建 AsyncSignal\n * @param delay 延迟时间(毫秒)\n * @param fetcher 异步获取函数\n * @returns AsyncSignal\n */\nexport function lazyAsyncSignal<T>(\n fetcher: () => Promise<T>,\n delay: number = 0\n): () => AsyncSignal<T> {\n return () => {\n return asyncSignal(fetcher)\n }\n}\n\n/**\n * 缓存 AsyncSignal 的结果\n */\nconst asyncSignalCache = new Map<string, AsyncSignal<any>>()\n\n/**\n * 创建带缓存的 AsyncSignal\n * @param key 缓存 key\n * @param fetcher 异步获取函数\n * @returns AsyncSignal\n */\nexport function cachedAsyncSignal<T>(\n key: string,\n fetcher: () => Promise<T>\n): AsyncSignal<T> {\n const cached = asyncSignalCache.get(key)\n if (cached) {\n return cached\n }\n\n const signal = asyncSignal(fetcher)\n asyncSignalCache.set(key, signal)\n return signal\n}\n\n/**\n * 清除 AsyncSignal 缓存\n */\nexport function clearAsyncSignalCache(): void {\n asyncSignalCache.clear()\n}"],"names":["currentEffect","effectStack","allEffects","Set","getCurrentEffect","setCurrentEffect","effect","getEffectStack","pushEffect","push","popEffect","pop","length","registerEffect","add","unregisterEffect","delete","getAllEffects","signal","value","subscribers","currentValue","getter","Array","from","find","s","set","resolved","Object","is","forEach","subscriber","update","updater","newValue","signalFn","readonlySignal","unsubscribe","warn","setGlobalEffect","getGlobalEffect","fn","_options","isFunction","cleanup","runCleanup","effectFn","statePushEffect","result","statePopEffect","stop","stateUnregisterEffect","stateRegisterEffect","effectPost","effectSync","pauseEffect","_effect","resumeEffect","runEffects","effects","error","computed","cachedValue","dirty","eff","computedFn","readonly","isCached","refresh","computedSet","getters","key","prototype","hasOwnProperty","call","ReactiveFlags","reactiveMap","WeakMap","readonlyMap","targetMap","getDep","target","depMap","get","Map","getDepMap","dep","trigger","checkIsReactive","checkIsReadonly","createReactive","readonlyFlag","isShallow","map","existingProxy","proxy","Proxy","receiver","Reflect","isObject","reactive","oldValue","deleteProperty","has","ownKeys","getOwnPropertyDescriptor","shallowReactive","shallowReadonly","isReactive","isReadonly","isProxy","toRaw","toReactive","toRef","deepEqual","a","b","isArray","i","keysA","keys","keysB","includes","watch","source","callback","options","sources","oldValues","initialRun","runner","newValues","isChanged","deep","immediate","watchSources","watchSource","watchEffect","watchDeep","disposeAllWatches","asyncSignal","fetcher","initialValue","data","loading","reload","async","cancel","isCancelled","abort","then","onfulfilled","onrejected","Promise","resolve","catch","finally","onfinally","createEmptyAsyncSignal","currentFetcher","cancelled","e","asyncSignalSuspense","lazyAsyncSignal","delay","asyncSignalCache","cachedAsyncSignal","cached","clearAsyncSignalCache","clear"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fluxion-ui/reactivity",
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "Fluxion reactivity system",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/reactivity.cjs",
|
|
7
|
+
"module": "./dist/reactivity.js",
|
|
8
|
+
"types": "./dist/reactivity.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/reactivity.js",
|
|
12
|
+
"require": "./dist/reactivity.cjs",
|
|
13
|
+
"types": "./dist/reactivity.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/AiFu-o/fluxion"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"fluxion",
|
|
25
|
+
"reactivity",
|
|
26
|
+
"signal",
|
|
27
|
+
"reactive"
|
|
28
|
+
],
|
|
29
|
+
"author": "Fluxion Team",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@fluxion-ui/shared": "0.0.3"
|
|
33
|
+
}
|
|
34
|
+
}
|