@warp-ts/reactivity 0.0.0-stage → 0.1.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/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ function e(e){return e._pure!==void 0}var t=class extends Error{constructor(e,t,n){super(`[${e}] ${t}`),this.name=`WarpError`,this.code=e,this.hint=n}};function n(e,n){return new t(e,e)}let r=null,i=null,a=null,o=0,s=!1,c=!1,l=0,u=0,d=null,f=!1,p,m=!1;const h=()=>{};function g(e){return!e||e.equals===void 0?Object.is:e.equals===!1?()=>!1:e.equals}function ee(e,t){let n={_v:e,_eq:g(t),_subs:null,_subSlots:null},r=(()=>_(n));return r.set=e=>v(n,typeof e==`function`?e(n._v):e),r.peek=()=>n._v,r}function _(e){let t=r;if(t){let n,r=t._sources;r===null?(t._sources=e,n=0):Array.isArray(r)?(r.push(e),t._sourceSlots.push(0),n=r.length-1):(t._sources=[r,e],t._sourceSlots=[t._sourceSlots,0],n=1);let i,a=e._subs;a==null?(e._subs=t,e._subSlots=n,i=0):Array.isArray(a)?(a.push(t),e._subSlots.push(n),i=a.length-1):(e._subs=[a,t],e._subSlots=[e._subSlots,n],i=1),Array.isArray(t._sourceSlots)?t._sourceSlots[n]=i:t._sourceSlots=i}return e._v}function v(e,t){e._eq(e._v,t)||(e._v=t,++l,e._subs&&O(()=>y(e._subs,e=>w(e,2))))}function y(e,t){if(e){if(Array.isArray(e))for(let n=0;n<e.length;n++)t(e[n]);else t(e)}}function b(e){++l,e._subs&&O(()=>y(e._subs,e=>w(e,2)))}const x=_;function S(){return{_v:void 0,_eq:()=>!1,_subs:null,_subSlots:null}}function C(){return r!==null}function te(e){let t={_v:e,_eq:Object.is,_subs:null,_subSlots:null};return{read:()=>_(t),node:t}}const ne=v;function w(e,t){if(e._state>=t)return;let n=e._state;e._state=t,n===0&&!e._pure&&a.push(e),y(e._subs,e=>w(e,1))}function re(e){if(e._running)throw n(`WARP-R102`,``);return e._state!==0&&!(e._seen===l&&!r)&&T(e),!r&&!e._subs&&e._sources&&se(e),_(e)}function T(t){if(!t._disposed){if(t._state===1){let n=t._sources,r=n=>e(n)&&(T(n),n._updatedAt>t._updatedAt)?(t._state=2,!0):!1;if(n){if(Array.isArray(n))for(let e=0;e<n.length&&!r(n[e]);e++);else r(n)}t._state===1&&(t._state=0)}t._state===2&&E(t)}}function E(e){P(e),e._state=0;let t=r,n=i,a=D;r=e,i=e._pure?e._parent:e,D=e,e._running=!0;try{let t=e._fn(ie);e._pure&&(!e._updatedAt||!e._eq(e._v,t))?(e._v=t,e._updatedAt=++l,y(e._subs,e=>w(e,2))):e._pure||(e._updatedAt=l)}catch(t){ae(e,t)}finally{e._running=!1,r=t,i=n,D=a}}let D=null;const ie=e=>{let t=D;t&&(t._cleanups||(t._cleanups=[])).push(e)};function ae(e,t){let n=e;for(;n;){if(n._err&&n._err(t)!==!1)return;n=n._parent}throw t}function O(e){if(a)return e();a=[];try{return e()}finally{o===0&&k()}}function k(){s||(s=!0,queueMicrotask(j))}const oe=(e,t)=>e._seq-t._seq;function A(){let e=a;for(a=[];e&&e.length;){e.sort(oe);for(let t=0;t<e.length;t++){let n=e[t];if(n._state!==0)try{T(n)}catch(e){f||(f=!0,p=e)}}e=a,a=[]}}function se(e){(d||(d=[])).push(e),c||k()}function ce(){for(;d;){let e=d;d=null;for(let t=0;t<e.length;t++){let n=e[t];n._subs||n._running||!n._sources||(n._seen=n._state===0?l:-1,P(n),n._state=2)}}}function j(){if(c){A();return}s=!1,c=!0;try{A()}finally{a=null,c=!1,++l,ce()}if(f){let e=p;throw f=!1,p=void 0,e}}function M(e){o++;try{return O(e)}finally{--o===0&&a&&k()}}function le(){(a||s)&&j()}function N(e){let t=r;r=null;try{return e()}finally{r=t}}function P(e){let t=e._sources;if(t){if(Array.isArray(t)){let n=e._sourceSlots;for(let e=t.length-1;e>=0;e--)L(t[e],n[e])}else L(t,e._sourceSlots);e._sources=null,e._sourceSlots=null}I(e);let n=e._cleanups;if(n){e._cleanups=null;for(let e=n.length-1;e>=0;e--)n[e]()}}function F(e,t){let n=e._children;n?Array.isArray(n)?n.push(t):e._children=[n,t]:e._children=t}function I(e){let t=e._children;if(t){if(e._children=null,e._dead=0,Array.isArray(t))for(let e=t.length-1;e>=0;e--)H(t[e]);else H(t)}}function L(e,t){let n=e._subs;if(!n)return;if(!Array.isArray(n)){e._subs=null,e._subSlots=null,e._pure&&se(e);return}let r=e._subSlots,i=n.pop(),a=r.pop();if(t<n.length&&(n[t]=i,r[t]=a,R(i,a,t)),n.length===1){let t=n[0],i=r[0];e._subs=t,e._subSlots=i,R(t,i,0)}}function R(e,t,n){Array.isArray(e._sourceSlots)?e._sourceSlots[t]=n:e._sourceSlots=n}function z(e,t,n){let r=t?{_v:void 0,_eq:g(n),_subs:null,_subSlots:null,_fn:e,_sources:null,_sourceSlots:null,_state:2,_pure:!0,_running:!1,_updatedAt:0,_seq:++u,_seen:-1,_parent:i,_children:null,_cleanups:null,_context:null,_disposed:!1}:{_fn:e,_sources:null,_sourceSlots:null,_state:2,_pure:!1,_running:!1,_updatedAt:0,_seq:++u,_parent:i,_children:null,_cleanups:null,_context:null,_disposed:!1};return i&&!t&&F(i,r),r}function B(e,t){if(m)return e(U),h;let n=z(e,!1,t);return c||o>0?a.push(n):E(n),()=>H(n)}function ue(e,t){if(m)return e(U),h;let n=z(e,!1,t);return E(n),()=>H(n)}function de(e,t){let n=z(e,!0,t);return()=>re(n)}function fe(e,t=i){let n={root:null};return V(()=>e(()=>H(n.root)),t,n)}function V(e,t,n){let a=t??null,o={_parent:a,_children:null,_cleanups:null,_context:null,_disposed:!1};a&&F(a,o),n.root=o;let s=r,c=i;r=null,i=o;try{return e()}finally{r=s,i=c}}function pe(e){H(e)}const me=void 0;function H(t){if(t._disposed)return;t._disposed=!0;let n=t._parent;if(n&&!n._disposed&&n._children){if(!Array.isArray(n._children))n._children===t&&(n._children=null);else{let e=n._dead=(n._dead||0)+1;e>8&&e*2>n._children.length&&(n._children=n._children.filter(e=>!e._disposed),n._dead=0)}}if(t._context=null,e(t))P(t),t._fn=null,t._pure&&(t._v=void 0),t._state=0;else{I(t);let e=t._cleanups;if(e){t._cleanups=null;for(let t=e.length-1;t>=0;t--)e[t]()}}}function he(e){m=e}function U(e){i&&(i._cleanups||(i._cleanups=[])).push(e)}function ge(){return i}function _e(e,t){let n=r,a=i;r=null,i=e;try{return t()}finally{r=n,i=a}}function ve(e,t){e._err=t}const ye=void 0,be=void 0;function xe(e,t){let n=e;return!n._context&&t&&(n._context=new Map),n._context}function Se(e){if(!e)return null;let t=e;return{parent:t._parent,context:t._context,disposed:t._disposed}}const Ce=void 0;function we(e,t=((e,t)=>e===t)){let n=new Map,i=64,a=N(e);return B(()=>{let r=e();if(Object.is(r,a))return;let i=a;a=r;let o;n.forEach((e,a)=>{if(!e._subs){n.delete(a);return}(t(a,i)||t(a,r))&&(o=e,o&&b(o))})}),e=>{if(r){let t=n.get(e);t||(n.size>=i&&(n.forEach((e,t)=>{e._subs||n.delete(t)}),i=Math.max(64,n.size*2)),t=S(),n.set(e,t)),_(t)}return t(e,a)}}const W=Symbol(`warp.raw`),G=Symbol(`warp.iterate`),Te=new WeakMap,Ee=new WeakMap,K=new WeakMap;function q(e,t){if(!C())return;let n=K.get(e);n||K.set(e,n=new Map);let r=n.get(t);r||n.set(t,r=S()),x(r)}function J(e,t,n=!1,r){let i=K.get(e);i&&M(()=>{let a=e=>{e&&b(e)};if(a(i.get(t)),r)for(let e of r)a(i.get(e));n&&(a(i.get(G)),Array.isArray(e)&&a(i.get(`length`)))})}function Y(e){return e&&e[W]||e}function De(e){return!!(e&&e[W])}function X(e){if(!e||typeof e!=`object`||Object.isFrozen(e)||!Object.isExtensible(e))return!1;let t=Object.prototype.toString.call(e);return/^\[object (Object|Array|Map|Set|WeakMap|WeakSet)\]$/.test(t)}function Z(e,t){return t||!X(e)?e:$(e,!1)}const Q={};for(let e of[`push`,`pop`,`shift`,`unshift`,`splice`,`sort`,`reverse`])Q[e]=function(...t){let n=Y(this),r=n.length;t=t.map(Y);let i=M(()=>N(()=>Array.prototype[e].apply(n,t)));if(e===`sort`||e===`reverse`)J(n,G,!0,Array.from(n.keys(),String));else{let t=n.length,i=e===`push`?r:e===`pop`?t:0,a=Math.max(r,t),o=[];for(let e=i;e<a;e++)o.push(String(e));J(n,`length`,!0,o)}return i};for(let e of[`includes`,`indexOf`,`lastIndexOf`])Q[e]=function(...t){let n=Y(this);q(n,`length`);for(let e=0;e<n.length;e++)q(n,String(e));let r=Array.prototype[e],i=r.apply(n,t);return(i===-1||i===!1)&&t.length?r.apply(n,[Y(t[0]),...t.slice(1)]):i};function Oe(e){return{get(t,n,r){return n===W?t:Array.isArray(t)&&typeof n==`string`&&Object.prototype.hasOwnProperty.call(Q,n)?Q[n]:(q(t,n),Z(Reflect.get(t,n,r),e))},set(e,t,n,r){n=Y(n);let i=Object.prototype.hasOwnProperty.call(e,t),a=e[t],o=Array.isArray(e),s=o?e.length:0,c=Reflect.set(e,t,n,r);if(!i)J(e,t,!0);else if(!Object.is(a,n)){if(o&&t===`length`){let t=[];for(let e=n;e<s;e++)t.push(String(e));J(e,`length`,!0,t)}else J(e,t)}return o&&t!==`length`&&e.length!==s&&J(e,`length`,!0),c},deleteProperty(e,t){let n=Object.prototype.hasOwnProperty.call(e,t),r=Reflect.deleteProperty(e,t);return n&&r&&J(e,t,!0),r},has(e,t){return t!==W&&q(e,t),Reflect.has(e,t)},ownKeys(e){return q(e,G),Array.isArray(e)&&q(e,`length`),Reflect.ownKeys(e)}}}function ke(e,t){let n={get(t){let n=Y(this);return t=Y(t),q(n,t),Z(n.get(t),e)},has(e){let t=Y(this);return e=Y(e),q(t,e),t.has(e)},set(e,t){let n=Y(this);e=Y(e),t=Y(t);let r=n.has(e),i=n.get(e);return n.set(e,t),r?Object.is(i,t)||J(n,e):J(n,e,!0),this},add(e){let t=Y(this);return e=Y(e),t.has(e)||(t.add(e),J(t,e,!0)),this},delete(e){let t=Y(this);e=Y(e);let n=t.has(e),r=t.delete(e);return n&&J(t,e,!0),r},clear(){let e=Y(this),t=[...e.keys()],n=t.length>0;e.clear(),n&&J(e,G,!0,t)},forEach(t,n){let r=Y(this);q(r,G),r.forEach((r,i)=>t.call(n,Z(r,e),Z(i,e),this))}},r=t=>function(){let n=Y(this);q(n,G);let r=t===`entries`||t===Symbol.iterator&&n instanceof Map,i=n[t].call(n);return{next(){let t=i.next();if(t.done)return t;let n=t.value;return{done:!1,value:r?[Z(n[0],e),Z(n[1],e)]:Z(n,e)}},[Symbol.iterator](){return this}}};return t?(delete n.clear,delete n.forEach):(n.keys=r(`keys`),n.values=r(`values`),n.entries=r(`entries`),n[Symbol.iterator]=r(Symbol.iterator)),{get(e,r,i){return r===W?e:r===`size`&&!t?(q(e,G),Reflect.get(e,`size`,e)):Object.prototype.hasOwnProperty.call(n,r)?n[r]:Reflect.get(e,r,i)}}}function $(e,t){let n=Y(e),r=t?Ee:Te,i=r.get(n);if(i)return i;let a=n instanceof WeakMap||n instanceof WeakSet,o=a||n instanceof Map||n instanceof Set,s=new Proxy(n,o?ke(t,a):Oe(t));return r.set(n,s),s}function Ae(e){return X(e)?$(e,!1):e}function je(e){return X(e)?$(e,!0):e}export{t as WarpError,Ce as __DEV_graph,be as __DEV_onFlush,me as _childrenOf,pe as _disposeOwner,C as _hasListener,te as _lightSignal,S as _mkSignalNode,b as _notify,xe as _ownerContext,V as _rootRun,ye as _setOwnerDev,ve as _setOwnerError,x as _track,ne as _write,M as batch,de as computed,fe as createRoot,we as createSelector,B as effect,he as enableServerMode,le as flushSync,ge as getOwner,De as isReactive,U as onCleanup,Se as ownerView,Ae as reactive,ue as renderEffect,_e as runWithOwner,je as shallowReactive,ee as signal,Y as toRaw,N as untrack};
@@ -0,0 +1,94 @@
1
+ import type { SignalNode, State } from './types';
2
+ export interface Signal<T> {
3
+ (): T;
4
+ set(v: T | ((prev: T) => T)): void;
5
+ peek(): T;
6
+ }
7
+ export interface Owner {
8
+ readonly parent: Owner | null;
9
+ readonly context: Map<symbol, unknown> | null;
10
+ readonly disposed: boolean;
11
+ }
12
+ export interface SignalOptions<T> {
13
+ equals?: ((a: T, b: T) => boolean) | false;
14
+ name?: string;
15
+ }
16
+ export declare function signal<T>(v: T, opts?: SignalOptions<T>): Signal<T>;
17
+ /** 非 computed 的 signal 节点被外部(reactive)触发 */
18
+ export declare function _notify(n: SignalNode<any>): void;
19
+ export declare const _track: (n: SignalNode<any>) => void;
20
+ export declare function _mkSignalNode(): SignalNode<any>;
21
+ export declare function _hasListener(): boolean;
22
+ /** 内部:轻量信号(runtime-dom 行 item / index 用):只有节点 + 一个读闭包,写入走 _write,省去 set / peek 闭包(内存专项 M-1) */
23
+ export declare function _lightSignal<T>(v: T): {
24
+ read: () => T;
25
+ node: SignalNode<T>;
26
+ };
27
+ export declare const _write: <T>(node: SignalNode<T>, v: T) => void;
28
+ export declare function batch<T>(fn: () => T): T;
29
+ /** 同步刷新待处理 effect(测试与 HMR 用) */
30
+ export declare function flushSync(): void;
31
+ export declare function untrack<T>(fn: () => T): T;
32
+ export declare function effect(fn: (onCleanup: (f: () => void) => void) => void, opts?: {
33
+ name?: string;
34
+ }): () => void;
35
+ /** 渲染 effect:创建即同步执行,即使处于 flush / batch 中(runtime-dom `bind` 用;Solid createRenderEffect 语义,DC-23) */
36
+ export declare function renderEffect(fn: (onCleanup: (f: () => void) => void) => void, opts?: {
37
+ name?: string;
38
+ }): () => void;
39
+ export declare function computed<T>(fn: () => T, opts?: SignalOptions<T>): () => T;
40
+ export declare function createRoot<T>(fn: (dispose: () => void) => T, owner?: Owner | null | undefined): T;
41
+ /** 内部:在新 root 下运行 fn,返回 root 对象本身(不分配 dispose 闭包;runtime-dom 行用,R-M8) */
42
+ export declare function _rootRun<T>(fn: () => T, owner: Owner | null | undefined, out: {
43
+ root: Owner | null;
44
+ }): T;
45
+ export declare function _disposeOwner(o: Owner): void;
46
+ /** 内部(devtools / 测试):owner 子节点数组视图(单值形态时分配临时数组) */
47
+ export declare const _childrenOf: ((o: Owner) => readonly Owner[]) | undefined;
48
+ /**
49
+ * @internal 服务端模式开关(ADR-205)。`@warp-ts/server` 进程启动时 `enableServerMode(true)`;
50
+ * 测试用 `enableServerMode(false)` 还原。
51
+ */
52
+ export declare function enableServerMode(on: boolean): void;
53
+ export declare function onCleanup(f: () => void): void;
54
+ export declare function getOwner(): Owner | null;
55
+ export declare function runWithOwner<T>(owner: Owner | null, fn: () => T): T;
56
+ /** 内部:owner 上挂错误处理器(core 用) */
57
+ export declare function _setOwnerError(owner: Owner, h: ((e: unknown) => boolean | void) | null): void;
58
+ /** dev 下 owner 的元信息:组件名 / HMR 定位 / 根 DOM 节点(多根为 Node[]) */
59
+ export interface OwnerDevInfo {
60
+ name?: string | undefined;
61
+ hmrId?: string | undefined;
62
+ node?: unknown;
63
+ }
64
+ /**
65
+ * 内部:dev 下把组件元信息写到 owner(比照 `_setOwnerError`,REQ-LFE-003 RB-302)。
66
+ * 与 `__DEV_graph` 同形(prod 为 `undefined`)而不是空函数:prod 里连函数壳都不留(NFR-002 逐字节)。
67
+ */
68
+ export declare const _setOwnerDev: ((owner: Owner, info: OwnerDevInfo) => void) | undefined;
69
+ /** dev:flush 尾部回调登记,返回注销函数;prod 为 `undefined`(与 `__DEV_graph` 同口径) */
70
+ export declare const __DEV_onFlush: ((cb: () => void) => () => void) | undefined;
71
+ export declare function _ownerContext(owner: Owner, create: boolean): Map<symbol, unknown> | null;
72
+ export declare function ownerView(o: Owner | null): {
73
+ parent: Owner | null;
74
+ context: Map<symbol, unknown> | null;
75
+ disposed: boolean;
76
+ } | null;
77
+ export interface GraphSnapshot {
78
+ nodes: {
79
+ id: number;
80
+ kind: 'signal' | 'computed' | 'effect' | 'owner';
81
+ name?: string | undefined;
82
+ hmrId?: string | undefined;
83
+ state?: State;
84
+ value?: unknown;
85
+ }[];
86
+ edges: {
87
+ from: number;
88
+ to: number;
89
+ kind: 'dep' | 'own';
90
+ }[];
91
+ }
92
+ export declare const __DEV_graph: (() => GraphSnapshot) | undefined;
93
+ /** 返回 `(key) => boolean`:source 变化时只通知旧 key 与新 key 的订阅者,而非全部行(Solid 同名 API) */
94
+ export declare function createSelector<T, U = T>(source: () => T, equals?: (key: U, value: T) => boolean): (key: U) => boolean;