@zylaris/reactivity 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/computed.d.ts +7 -0
- package/dist/computed.d.ts.map +1 -0
- package/dist/computed.js +58 -0
- package/dist/computed.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/resource.d.ts +6 -0
- package/dist/resource.d.ts.map +1 -0
- package/dist/resource.js +44 -0
- package/dist/resource.js.map +1 -0
- package/dist/signal.d.ts +10 -0
- package/dist/signal.d.ts.map +1 -0
- package/dist/signal.js +180 -0
- package/dist/signal.js.map +1 -0
- package/dist/store.d.ts +4 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +91 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Computed, SignalNode } from './types.js';
|
|
2
|
+
export declare function computed<T>(fn: () => T): Computed<T>;
|
|
3
|
+
export declare function getCurrentComputed(): {
|
|
4
|
+
deps: Set<SignalNode<unknown>>;
|
|
5
|
+
markDirty: () => void;
|
|
6
|
+
} | null;
|
|
7
|
+
//# sourceMappingURL=computed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKvD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CA0DpD;AAGD,wBAAgB,kBAAkB;UA/DL,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;eAAa,MAAM,IAAI;SAiE3E"}
|
package/dist/computed.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Global context for computed tracking
|
|
2
|
+
let currentComputed = null;
|
|
3
|
+
export function computed(fn) {
|
|
4
|
+
const node = {
|
|
5
|
+
value: undefined,
|
|
6
|
+
observers: new Set(),
|
|
7
|
+
version: 0,
|
|
8
|
+
};
|
|
9
|
+
let dirty = true;
|
|
10
|
+
const markDirty = () => {
|
|
11
|
+
if (!dirty) {
|
|
12
|
+
dirty = true;
|
|
13
|
+
// Notify observers
|
|
14
|
+
for (const observer of node.observers) {
|
|
15
|
+
observer.scheduled = true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
function compute() {
|
|
20
|
+
// Cleanup and re-track dependencies
|
|
21
|
+
const prevComputed = currentComputed;
|
|
22
|
+
const deps = new Set();
|
|
23
|
+
currentComputed = { deps, markDirty };
|
|
24
|
+
try {
|
|
25
|
+
node.value = fn();
|
|
26
|
+
node.version++;
|
|
27
|
+
dirty = false;
|
|
28
|
+
// Subscribe to all dependencies
|
|
29
|
+
for (const dep of deps) {
|
|
30
|
+
dep.observers.add({ fn: markDirty });
|
|
31
|
+
}
|
|
32
|
+
return node.value;
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
currentComputed = prevComputed;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function read() {
|
|
39
|
+
if (dirty || node.version === 0) {
|
|
40
|
+
return compute();
|
|
41
|
+
}
|
|
42
|
+
return node.value;
|
|
43
|
+
}
|
|
44
|
+
return Object.assign(read, {
|
|
45
|
+
set: () => { throw new Error('Cannot set computed signal'); },
|
|
46
|
+
update: () => { throw new Error('Cannot update computed signal'); },
|
|
47
|
+
peek: () => node.value,
|
|
48
|
+
subscribe: (fn) => {
|
|
49
|
+
fn(read());
|
|
50
|
+
return () => { };
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Export for signal.ts to use
|
|
55
|
+
export function getCurrentComputed() {
|
|
56
|
+
return currentComputed;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=computed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computed.js","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAEA,uCAAuC;AACvC,IAAI,eAAe,GAAqE,IAAI,CAAC;AAE7F,MAAM,UAAU,QAAQ,CAAI,EAAW;IACrC,MAAM,IAAI,GAAkB;QAC1B,KAAK,EAAE,SAAc;QACrB,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,OAAO,EAAE,CAAC;KACX,CAAC;IAEF,IAAI,KAAK,GAAG,IAAI,CAAC;IAEjB,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,CAAC;YACb,mBAAmB;YACnB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,OAAO;QACd,oCAAoC;QACpC,MAAM,YAAY,GAAG,eAAe,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;QAE5C,eAAe,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAEtC,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,GAAG,KAAK,CAAC;YAEd,gCAAgC;YAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,SAAS,EAAS,CAAC,CAAC;YAC9C,CAAC;YAED,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,eAAe,GAAG,YAAY,CAAC;QACjC,CAAC;IACH,CAAC;IAED,SAAS,IAAI;QACX,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QACzB,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;QACtB,SAAS,EAAE,CAAC,EAAsB,EAAE,EAAE;YACpC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YACX,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QAClB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,kBAAkB;IAChC,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { signal, createEffect, batch, onMount, onCleanup, flushSync } from './signal.js';
|
|
2
|
+
export { computed } from './computed.js';
|
|
3
|
+
export { resource } from './resource.js';
|
|
4
|
+
export { createStore, isStore } from './store.js';
|
|
5
|
+
export type { Signal, Computed, Resource, ResourceState, Store, EffectFn, Effect, SignalNode, } from './types.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EACV,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,KAAK,EACL,QAAQ,EACR,MAAM,EACN,UAAU,GACX,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Zylaris Reactivity System
|
|
2
|
+
// Fine-grained signals for optimal performance
|
|
3
|
+
export { signal, createEffect, batch, onMount, onCleanup, flushSync } from './signal.js';
|
|
4
|
+
export { computed } from './computed.js';
|
|
5
|
+
export { resource } from './resource.js';
|
|
6
|
+
export { createStore, isStore } from './store.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,+CAA+C;AAE/C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAG1D,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,GACA,QAAQ,CAAC,CAAC,CAAC,CAiDb"}
|
package/dist/resource.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { signal } from './signal.js';
|
|
2
|
+
export function resource(fetcher, options) {
|
|
3
|
+
const initialValue = options?.initialValue;
|
|
4
|
+
const state = signal({
|
|
5
|
+
status: 'pending',
|
|
6
|
+
...(initialValue !== undefined && {
|
|
7
|
+
data: initialValue,
|
|
8
|
+
}),
|
|
9
|
+
});
|
|
10
|
+
let currentPromise = null;
|
|
11
|
+
async function load() {
|
|
12
|
+
// Cancel previous request (in real implementation, use AbortController)
|
|
13
|
+
if (currentPromise) {
|
|
14
|
+
// Abort previous
|
|
15
|
+
}
|
|
16
|
+
state.set({ status: 'pending', data: initialValue });
|
|
17
|
+
const promise = fetcher()
|
|
18
|
+
.then((data) => {
|
|
19
|
+
state.set({ status: 'success', data });
|
|
20
|
+
})
|
|
21
|
+
.catch((error) => {
|
|
22
|
+
state.set({ status: 'error', error });
|
|
23
|
+
options?.onError?.(error);
|
|
24
|
+
});
|
|
25
|
+
currentPromise = promise;
|
|
26
|
+
await promise;
|
|
27
|
+
}
|
|
28
|
+
// Auto-load on creation
|
|
29
|
+
load();
|
|
30
|
+
function read() {
|
|
31
|
+
return state();
|
|
32
|
+
}
|
|
33
|
+
return Object.assign(read, {
|
|
34
|
+
set: state.set,
|
|
35
|
+
update: state.update,
|
|
36
|
+
peek: state.peek,
|
|
37
|
+
subscribe: state.subscribe,
|
|
38
|
+
refetch: load,
|
|
39
|
+
mutate: (data) => {
|
|
40
|
+
state.set({ status: 'success', data });
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,QAAQ,CACtB,OAAyB,EACzB,OAGC;IAED,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAmB;QACrC,MAAM,EAAE,SAAS;QACjB,GAAG,CAAC,YAAY,KAAK,SAAS,IAAI;YAChC,IAAI,EAAE,YAAY;SACnB,CAAC;KACiB,CAAC,CAAC;IAEvB,IAAI,cAAc,GAAyB,IAAI,CAAC;IAEhD,KAAK,UAAU,IAAI;QACjB,wEAAwE;QACxE,IAAI,cAAc,EAAE,CAAC;YACnB,iBAAiB;QACnB,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAsB,CAAC,CAAC;QAEzE,MAAM,OAAO,GAAG,OAAO,EAAE;aACtB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEL,cAAc,GAAG,OAAO,CAAC;QACzB,MAAM,OAAO,CAAC;IAChB,CAAC;IAED,wBAAwB;IACxB,IAAI,EAAE,CAAC;IAEP,SAAS,IAAI;QACX,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QACzB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,CAAC,IAAO,EAAE,EAAE;YAClB,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/signal.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Signal, Effect, EffectFn } from './types.js';
|
|
2
|
+
declare let currentObserver: Effect | null;
|
|
3
|
+
export declare function signal<T>(initialValue: T): Signal<T>;
|
|
4
|
+
export declare function createEffect(fn: EffectFn): () => void;
|
|
5
|
+
export declare function flushSync(): void;
|
|
6
|
+
export declare function batch<T>(fn: () => T): T;
|
|
7
|
+
export declare function onMount(fn: () => void | (() => void)): void;
|
|
8
|
+
export declare function onCleanup(fn: () => void): void;
|
|
9
|
+
export { currentObserver };
|
|
10
|
+
//# sourceMappingURL=signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIvE,QAAA,IAAI,eAAe,EAAE,MAAM,GAAG,IAAW,CAAC;AAW1C,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CA4CpD;AAaD,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,IAAI,CAarD;AA0ED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAmBvC;AAGD,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAQ3D;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAQ9C;AAGD,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/signal.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { getCurrentComputed } from './computed.js';
|
|
2
|
+
// Global context for tracking dependencies
|
|
3
|
+
let currentObserver = null;
|
|
4
|
+
const effectStack = [];
|
|
5
|
+
// Effect scheduling queue
|
|
6
|
+
const effectQueue = [];
|
|
7
|
+
let isFlushing = false;
|
|
8
|
+
// Track if we're in batch mode
|
|
9
|
+
let batchDepth = 0;
|
|
10
|
+
const pendingEffects = new Set();
|
|
11
|
+
export function signal(initialValue) {
|
|
12
|
+
const node = {
|
|
13
|
+
value: initialValue,
|
|
14
|
+
observers: new Set(),
|
|
15
|
+
version: 0,
|
|
16
|
+
};
|
|
17
|
+
function read() {
|
|
18
|
+
// Track dependency if inside an effect
|
|
19
|
+
if (currentObserver) {
|
|
20
|
+
node.observers.add(currentObserver);
|
|
21
|
+
currentObserver.sources = currentObserver.sources || new Set();
|
|
22
|
+
currentObserver.sources.add(node);
|
|
23
|
+
}
|
|
24
|
+
// Track dependency if inside computed
|
|
25
|
+
const computed = getCurrentComputed();
|
|
26
|
+
if (computed) {
|
|
27
|
+
computed.deps.add(node);
|
|
28
|
+
}
|
|
29
|
+
return node.value;
|
|
30
|
+
}
|
|
31
|
+
function set(value) {
|
|
32
|
+
if (Object.is(node.value, value))
|
|
33
|
+
return;
|
|
34
|
+
node.value = value;
|
|
35
|
+
node.version++;
|
|
36
|
+
notifyObservers(node);
|
|
37
|
+
}
|
|
38
|
+
function update(fn) {
|
|
39
|
+
set(fn(node.value));
|
|
40
|
+
}
|
|
41
|
+
function peek() {
|
|
42
|
+
return node.value;
|
|
43
|
+
}
|
|
44
|
+
function subscribe(fn) {
|
|
45
|
+
return createEffect(() => fn(read()));
|
|
46
|
+
}
|
|
47
|
+
return Object.assign(read, { set, update, peek, subscribe });
|
|
48
|
+
}
|
|
49
|
+
function notifyObservers(node) {
|
|
50
|
+
const observers = Array.from(node.observers);
|
|
51
|
+
for (const effect of observers) {
|
|
52
|
+
if (batchDepth > 0) {
|
|
53
|
+
pendingEffects.add(effect);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
scheduleEffect(effect);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function createEffect(fn) {
|
|
61
|
+
const effect = {
|
|
62
|
+
fn,
|
|
63
|
+
dependencies: new Set(),
|
|
64
|
+
version: 0,
|
|
65
|
+
scheduled: false,
|
|
66
|
+
sources: new Set(),
|
|
67
|
+
};
|
|
68
|
+
// Initial run
|
|
69
|
+
runEffect(effect);
|
|
70
|
+
return () => disposeEffect(effect);
|
|
71
|
+
}
|
|
72
|
+
function runEffect(effect) {
|
|
73
|
+
// Cleanup previous dependencies
|
|
74
|
+
cleanupEffect(effect);
|
|
75
|
+
// Push to stack
|
|
76
|
+
effectStack.push(effect);
|
|
77
|
+
const prevObserver = currentObserver;
|
|
78
|
+
currentObserver = effect;
|
|
79
|
+
try {
|
|
80
|
+
const cleanup = effect.fn();
|
|
81
|
+
if (typeof cleanup === 'function') {
|
|
82
|
+
effect.cleanup = cleanup;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
// Pop from stack
|
|
87
|
+
effectStack.pop();
|
|
88
|
+
currentObserver = prevObserver;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function cleanupEffect(effect) {
|
|
92
|
+
// Remove this effect from all signal observers
|
|
93
|
+
if (effect.sources) {
|
|
94
|
+
for (const source of effect.sources) {
|
|
95
|
+
source.observers.delete(effect);
|
|
96
|
+
}
|
|
97
|
+
effect.sources.clear();
|
|
98
|
+
}
|
|
99
|
+
effect.dependencies.clear();
|
|
100
|
+
// Run cleanup function if exists
|
|
101
|
+
if (effect.cleanup) {
|
|
102
|
+
effect.cleanup();
|
|
103
|
+
effect.cleanup = undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function disposeEffect(effect) {
|
|
107
|
+
cleanupEffect(effect);
|
|
108
|
+
// Remove from queue if scheduled
|
|
109
|
+
const index = effectQueue.indexOf(effect);
|
|
110
|
+
if (index !== -1) {
|
|
111
|
+
effectQueue.splice(index, 1);
|
|
112
|
+
}
|
|
113
|
+
pendingEffects.delete(effect);
|
|
114
|
+
}
|
|
115
|
+
function scheduleEffect(effect) {
|
|
116
|
+
if (effect.scheduled)
|
|
117
|
+
return;
|
|
118
|
+
effect.scheduled = true;
|
|
119
|
+
effectQueue.push(effect);
|
|
120
|
+
if (!isFlushing && batchDepth === 0) {
|
|
121
|
+
isFlushing = true;
|
|
122
|
+
queueMicrotask(flushEffects);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function flushEffects() {
|
|
126
|
+
isFlushing = true;
|
|
127
|
+
while (effectQueue.length > 0) {
|
|
128
|
+
const effect = effectQueue.shift();
|
|
129
|
+
effect.scheduled = false;
|
|
130
|
+
runEffect(effect);
|
|
131
|
+
}
|
|
132
|
+
isFlushing = false;
|
|
133
|
+
}
|
|
134
|
+
// Export for testing - force synchronous flush
|
|
135
|
+
export function flushSync() {
|
|
136
|
+
flushEffects();
|
|
137
|
+
}
|
|
138
|
+
export function batch(fn) {
|
|
139
|
+
batchDepth++;
|
|
140
|
+
try {
|
|
141
|
+
return fn();
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
batchDepth--;
|
|
145
|
+
if (batchDepth === 0) {
|
|
146
|
+
// Flush all pending effects
|
|
147
|
+
const effects = Array.from(pendingEffects);
|
|
148
|
+
pendingEffects.clear();
|
|
149
|
+
for (const effect of effects) {
|
|
150
|
+
scheduleEffect(effect);
|
|
151
|
+
}
|
|
152
|
+
if (!isFlushing && effectQueue.length > 0) {
|
|
153
|
+
isFlushing = true;
|
|
154
|
+
queueMicrotask(flushEffects);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Lifecycle hooks
|
|
160
|
+
export function onMount(fn) {
|
|
161
|
+
if (typeof window !== 'undefined') {
|
|
162
|
+
createEffect(() => {
|
|
163
|
+
fn();
|
|
164
|
+
// Only run once
|
|
165
|
+
return () => { };
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
export function onCleanup(fn) {
|
|
170
|
+
if (currentObserver) {
|
|
171
|
+
const prevCleanup = currentObserver.cleanup;
|
|
172
|
+
currentObserver.cleanup = () => {
|
|
173
|
+
prevCleanup?.();
|
|
174
|
+
fn();
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Export for computed.ts
|
|
179
|
+
export { currentObserver };
|
|
180
|
+
//# sourceMappingURL=signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMxC,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAuEvE;AA6BD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAI9D"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { signal } from './signal.js';
|
|
2
|
+
// Use a string key instead of Symbol for cross-realm compatibility
|
|
3
|
+
const STORE_MARKER = '__zylaris_store__';
|
|
4
|
+
export function createStore(initialValue) {
|
|
5
|
+
const state = signal(initialValue);
|
|
6
|
+
const subscribers = new Map();
|
|
7
|
+
function notify(key) {
|
|
8
|
+
const subs = subscribers.get(key);
|
|
9
|
+
if (subs) {
|
|
10
|
+
for (const sub of subs) {
|
|
11
|
+
sub();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
// Create store object with marker
|
|
16
|
+
const storeBase = {
|
|
17
|
+
...initialValue,
|
|
18
|
+
[STORE_MARKER]: true
|
|
19
|
+
};
|
|
20
|
+
const proxy = new Proxy(storeBase, {
|
|
21
|
+
get(target, key) {
|
|
22
|
+
if (key === STORE_MARKER)
|
|
23
|
+
return true;
|
|
24
|
+
if (key === '$set')
|
|
25
|
+
return (value) => state.set(value);
|
|
26
|
+
const value = target[key];
|
|
27
|
+
// Skip internal keys
|
|
28
|
+
if (key === Symbol.toStringTag || key === 'constructor') {
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
// Return reactive wrapper for nested objects
|
|
32
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
33
|
+
return createNestedProxy(value, () => notify(key));
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
},
|
|
37
|
+
set(target, key, value) {
|
|
38
|
+
const oldValue = target[key];
|
|
39
|
+
if (Object.is(oldValue, value))
|
|
40
|
+
return true;
|
|
41
|
+
target[key] = value;
|
|
42
|
+
notify(key);
|
|
43
|
+
// Update underlying signal
|
|
44
|
+
state.set({ ...target });
|
|
45
|
+
return true;
|
|
46
|
+
},
|
|
47
|
+
has(target, key) {
|
|
48
|
+
return key in target || key === STORE_MARKER;
|
|
49
|
+
},
|
|
50
|
+
ownKeys(target) {
|
|
51
|
+
return Reflect.ownKeys(target);
|
|
52
|
+
},
|
|
53
|
+
getOwnPropertyDescriptor(target, key) {
|
|
54
|
+
if (key === STORE_MARKER) {
|
|
55
|
+
return {
|
|
56
|
+
value: true,
|
|
57
|
+
writable: false,
|
|
58
|
+
enumerable: false,
|
|
59
|
+
configurable: true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return Reflect.getOwnPropertyDescriptor(target, key);
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
return proxy;
|
|
66
|
+
}
|
|
67
|
+
function createNestedProxy(target, notify) {
|
|
68
|
+
return new Proxy(target, {
|
|
69
|
+
get(target, key) {
|
|
70
|
+
const value = target[key];
|
|
71
|
+
if (typeof value === 'object' && value !== null) {
|
|
72
|
+
return createNestedProxy(value, notify);
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
},
|
|
76
|
+
set(target, key, value) {
|
|
77
|
+
const oldValue = target[key];
|
|
78
|
+
if (Object.is(oldValue, value))
|
|
79
|
+
return true;
|
|
80
|
+
target[key] = value;
|
|
81
|
+
notify();
|
|
82
|
+
return true;
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
export function isStore(value) {
|
|
87
|
+
return typeof value === 'object' &&
|
|
88
|
+
value !== null &&
|
|
89
|
+
STORE_MARKER in value;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface Signal<T> {
|
|
2
|
+
(): T;
|
|
3
|
+
set(value: T): void;
|
|
4
|
+
update(fn: (value: T) => T): void;
|
|
5
|
+
peek(): T;
|
|
6
|
+
subscribe(fn: (value: T) => void): () => void;
|
|
7
|
+
}
|
|
8
|
+
export interface Computed<T> extends Signal<T> {
|
|
9
|
+
}
|
|
10
|
+
export type ResourceState<T> = {
|
|
11
|
+
status: 'pending';
|
|
12
|
+
data?: undefined;
|
|
13
|
+
error?: undefined;
|
|
14
|
+
} | {
|
|
15
|
+
status: 'success';
|
|
16
|
+
data: T;
|
|
17
|
+
error?: undefined;
|
|
18
|
+
} | {
|
|
19
|
+
status: 'error';
|
|
20
|
+
data?: undefined;
|
|
21
|
+
error: Error;
|
|
22
|
+
};
|
|
23
|
+
export interface Resource<T> extends Signal<ResourceState<T>> {
|
|
24
|
+
refetch(): Promise<void>;
|
|
25
|
+
mutate(data: T): void;
|
|
26
|
+
}
|
|
27
|
+
export type EffectFn = () => void | (() => void);
|
|
28
|
+
export interface Effect {
|
|
29
|
+
fn: EffectFn;
|
|
30
|
+
dependencies: Set<SignalNode<unknown>>;
|
|
31
|
+
sources?: Set<SignalNode<unknown>>;
|
|
32
|
+
version: number;
|
|
33
|
+
scheduled: boolean;
|
|
34
|
+
cleanup?: () => void;
|
|
35
|
+
}
|
|
36
|
+
export interface SignalNode<T> {
|
|
37
|
+
value: T;
|
|
38
|
+
observers: Set<Effect>;
|
|
39
|
+
version: number;
|
|
40
|
+
}
|
|
41
|
+
export type Store<T> = T & {
|
|
42
|
+
$set(value: T): void;
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,IAAI,CAAC,CAAC;IACN,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAClC,IAAI,IAAI,CAAC,CAAC;IACV,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;CAAG;AAEjD,MAAM,MAAM,aAAa,CAAC,CAAC,IACvB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GAC1D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAExD,MAAM,WAAW,QAAQ,CAAC,CAAC,CAAE,SAAQ,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAEjD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;CACtB,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,uCAAuC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zylaris/reactivity",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Fine-grained reactivity system for Zylaris",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"dev": "tsc --watch",
|
|
21
|
+
"test": "vitest run --passWithNoTests",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"clean": "rm -rf dist"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"typescript": "^5.3.3",
|
|
28
|
+
"vitest": "^1.2.0"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"reactivity",
|
|
32
|
+
"signals",
|
|
33
|
+
"zylaris"
|
|
34
|
+
],
|
|
35
|
+
"license": "MIT"
|
|
36
|
+
}
|