@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.
@@ -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"}
@@ -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"}
@@ -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,6 @@
1
+ import type { Resource } from './types.js';
2
+ export declare function resource<T>(fetcher: () => Promise<T>, options?: {
3
+ initialValue?: T;
4
+ onError?: (error: Error) => void;
5
+ }): Resource<T>;
6
+ //# sourceMappingURL=resource.d.ts.map
@@ -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"}
@@ -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"}
@@ -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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"}
@@ -0,0 +1,4 @@
1
+ import type { Store } from './types.js';
2
+ export declare function createStore<T extends object>(initialValue: T): Store<T>;
3
+ export declare function isStore(value: unknown): value is Store<object>;
4
+ //# sourceMappingURL=store.d.ts.map
@@ -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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"}
@@ -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,3 @@
1
+ // Core types for the reactivity system
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -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
+ }