@rlabs-inc/signals 1.2.1 → 1.4.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/README.md +114 -0
- package/dist/collections/map.d.ts.map +1 -1
- package/dist/collections/set.d.ts.map +1 -1
- package/dist/core/constants.d.ts +6 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/deep/proxy.d.ts.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +504 -61
- package/dist/index.mjs +504 -61
- package/dist/primitives/bind.d.ts.map +1 -1
- package/dist/primitives/derived.d.ts.map +1 -1
- package/dist/primitives/effect.d.ts.map +1 -1
- package/dist/primitives/linked.d.ts +73 -0
- package/dist/primitives/linked.d.ts.map +1 -0
- package/dist/primitives/scope.d.ts +96 -0
- package/dist/primitives/scope.d.ts.map +1 -0
- package/dist/primitives/selector.d.ts +46 -0
- package/dist/primitives/selector.d.ts.map +1 -0
- package/dist/primitives/signal.d.ts +5 -0
- package/dist/primitives/signal.d.ts.map +1 -1
- package/dist/reactivity/scheduling.d.ts.map +1 -1
- package/dist/reactivity/tracking.d.ts +5 -0
- package/dist/reactivity/tracking.d.ts.map +1 -1
- package/dist/v2/bench-compare.d.ts +2 -0
- package/dist/v2/bench-compare.d.ts.map +1 -0
- package/dist/v2/bench.d.ts +5 -0
- package/dist/v2/bench.d.ts.map +1 -0
- package/dist/v2/bind.d.ts +94 -0
- package/dist/v2/bind.d.ts.map +1 -0
- package/dist/v2/collections.d.ts +133 -0
- package/dist/v2/collections.d.ts.map +1 -0
- package/dist/v2/compat-test.d.ts +2 -0
- package/dist/v2/compat-test.d.ts.map +1 -0
- package/dist/v2/debug-array.d.ts +2 -0
- package/dist/v2/debug-array.d.ts.map +1 -0
- package/dist/v2/debug-diamond.d.ts +2 -0
- package/dist/v2/debug-diamond.d.ts.map +1 -0
- package/dist/v2/index.d.ts +7 -0
- package/dist/v2/index.d.ts.map +1 -0
- package/dist/v2/primitives.d.ts +120 -0
- package/dist/v2/primitives.d.ts.map +1 -0
- package/dist/v2/proxy.d.ts +10 -0
- package/dist/v2/proxy.d.ts.map +1 -0
- package/dist/v2/registry.d.ts +35 -0
- package/dist/v2/registry.d.ts.map +1 -0
- package/dist/v2/stress.d.ts +7 -0
- package/dist/v2/stress.d.ts.map +1 -0
- package/dist/v2/test-suite.d.ts +2 -0
- package/dist/v2/test-suite.d.ts.map +1 -0
- package/dist/v2/test-v1.d.ts +2 -0
- package/dist/v2/test-v1.d.ts.map +1 -0
- package/package.json +7 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { defaultEquals, type EqualsFn } from './registry.js';
|
|
2
|
+
export interface Signal<T> {
|
|
3
|
+
value: T;
|
|
4
|
+
}
|
|
5
|
+
export interface ReadonlySignal<T> {
|
|
6
|
+
readonly value: T;
|
|
7
|
+
}
|
|
8
|
+
export interface SignalOptions<T> {
|
|
9
|
+
equals?: EqualsFn;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a reactive signal.
|
|
13
|
+
*
|
|
14
|
+
* For primitives: creates a simple reactive value
|
|
15
|
+
* For objects/arrays: creates a deep reactive proxy with fine-grained tracking
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* // Primitive
|
|
20
|
+
* const count = signal(0)
|
|
21
|
+
* count.value++
|
|
22
|
+
*
|
|
23
|
+
* // Object (automatically deep reactive)
|
|
24
|
+
* const user = signal({ name: 'Rusty', age: 43 })
|
|
25
|
+
* user.value.age = 44 // Fine-grained update
|
|
26
|
+
*
|
|
27
|
+
* // Array
|
|
28
|
+
* const items = signal([1, 2, 3])
|
|
29
|
+
* items.value.push(4) // Tracked
|
|
30
|
+
* items.value[0] = 10 // Fine-grained
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function signal<T>(initial: T, options?: SignalOptions<T>): Signal<T>;
|
|
34
|
+
export { signal as state };
|
|
35
|
+
/**
|
|
36
|
+
* Create a derived (computed) signal.
|
|
37
|
+
*
|
|
38
|
+
* Deriveds are lazy - they only compute when read.
|
|
39
|
+
* They cache their value and recompute when dependencies change.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* const count = signal(1)
|
|
44
|
+
* const doubled = derived(() => count.value * 2)
|
|
45
|
+
*
|
|
46
|
+
* console.log(doubled.value) // 2
|
|
47
|
+
* count.value = 5
|
|
48
|
+
* console.log(doubled.value) // 10
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function derived<T>(fn: () => T, options?: SignalOptions<T>): ReadonlySignal<T>;
|
|
52
|
+
export declare namespace derived {
|
|
53
|
+
var by: typeof derived;
|
|
54
|
+
}
|
|
55
|
+
export interface EffectOptions {
|
|
56
|
+
/** Run synchronously instead of scheduling */
|
|
57
|
+
sync?: boolean;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create a reactive effect.
|
|
61
|
+
*
|
|
62
|
+
* Effects run whenever their dependencies change.
|
|
63
|
+
* Return a cleanup function to run before re-execution.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* const count = signal(0)
|
|
68
|
+
*
|
|
69
|
+
* const dispose = effect(() => {
|
|
70
|
+
* console.log('Count is', count.value)
|
|
71
|
+
* return () => console.log('Cleanup')
|
|
72
|
+
* })
|
|
73
|
+
*
|
|
74
|
+
* count.value = 1 // Logs: "Cleanup", then "Count is 1"
|
|
75
|
+
* dispose() // Stops the effect
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function effect(fn: () => void | (() => void), options?: EffectOptions): () => void;
|
|
79
|
+
export declare namespace effect {
|
|
80
|
+
var pre: (fn: () => void | (() => void)) => () => void;
|
|
81
|
+
var root: (fn: () => void | (() => void)) => () => void;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Batch multiple updates into a single flush.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* batch(() => {
|
|
89
|
+
* count.value++
|
|
90
|
+
* name.value = 'new'
|
|
91
|
+
* // Effects only run once after batch completes
|
|
92
|
+
* })
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare function batch<T>(fn: () => T): T;
|
|
96
|
+
/**
|
|
97
|
+
* Read values without creating dependencies.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```ts
|
|
101
|
+
* effect(() => {
|
|
102
|
+
* // This creates a dependency
|
|
103
|
+
* const a = count.value
|
|
104
|
+
*
|
|
105
|
+
* // This does NOT create a dependency
|
|
106
|
+
* const b = untrack(() => other.value)
|
|
107
|
+
* })
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export declare function untrack<T>(fn: () => T): T;
|
|
111
|
+
/**
|
|
112
|
+
* Synchronously flush all pending effects.
|
|
113
|
+
*/
|
|
114
|
+
export declare function flushSync(): void;
|
|
115
|
+
export { defaultEquals };
|
|
116
|
+
/** Never equal - always triggers updates */
|
|
117
|
+
export declare function neverEquals(): boolean;
|
|
118
|
+
/** Shallow equality for objects/arrays */
|
|
119
|
+
export declare function shallowEquals(a: unknown, b: unknown): boolean;
|
|
120
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/v2/primitives.ts"],"names":[],"mappings":"AAKA,OAAO,EAeL,aAAa,EACb,KAAK,QAAQ,EACd,MAAM,eAAe,CAAA;AA0BtB,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,KAAK,EAAE,CAAC,CAAA;CACT;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAClB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,QAAQ,CAAA;CAClB;AAUD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CA4C3E;AAGD,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,CAAA;AAM1B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAarF;yBAbe,OAAO;;;AAsBvB,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,IAAI,CAezF;yBAfe,MAAM;kBAqBc,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAG,MAAM,IAAI;mBAQpC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAG,MAAM,IAAI;;AAU5E;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAOvC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEzC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAMD,OAAO,EAAE,aAAa,EAAE,CAAA;AAExB,4CAA4C;AAC5C,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED,0CAA0C;AAC1C,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAiB7D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const TARGET_SYMBOL: unique symbol;
|
|
2
|
+
export declare const PROXY_SYMBOL: unique symbol;
|
|
3
|
+
export declare function isProxied(value: unknown): boolean;
|
|
4
|
+
export declare function createProxy<T extends object>(target: T): T;
|
|
5
|
+
/**
|
|
6
|
+
* Get the raw target object from a proxy.
|
|
7
|
+
* Useful when you need the original object without reactivity.
|
|
8
|
+
*/
|
|
9
|
+
export declare function toRaw<T>(value: T): T;
|
|
10
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/v2/proxy.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,aAAa,eAA4B,CAAA;AACtD,eAAO,MAAM,YAAY,eAA2B,CAAA;AAgBpD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEjD;AA6BD,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAoK1D;AAmGD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAKpC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare const enum NodeType {
|
|
2
|
+
SOURCE = 0,
|
|
3
|
+
DERIVED = 1,
|
|
4
|
+
EFFECT = 2
|
|
5
|
+
}
|
|
6
|
+
export declare const enum Flags {
|
|
7
|
+
CLEAN = 0,
|
|
8
|
+
MAYBE_DIRTY = 1,
|
|
9
|
+
DIRTY = 2,
|
|
10
|
+
RUNNING = 4,
|
|
11
|
+
NOTIFIED = 8,
|
|
12
|
+
DEAD = 16
|
|
13
|
+
}
|
|
14
|
+
export type EqualsFn = (a: unknown, b: unknown) => boolean;
|
|
15
|
+
export declare function allocateId(): number;
|
|
16
|
+
export declare function releaseId(id: number): void;
|
|
17
|
+
export declare function defaultEquals(a: unknown, b: unknown): boolean;
|
|
18
|
+
export declare function createSource(value: unknown, equals?: EqualsFn): number;
|
|
19
|
+
export declare function createDerived(fn: () => unknown, equals?: EqualsFn): number;
|
|
20
|
+
export declare function createEffect(fn: () => void | (() => void), parentId?: number): number;
|
|
21
|
+
export declare function getActiveEffect(): number;
|
|
22
|
+
export declare function getActiveReaction(): number;
|
|
23
|
+
export declare function isCurrentlyTracking(): boolean;
|
|
24
|
+
export declare function getValue(id: number): unknown;
|
|
25
|
+
export declare function setValue(id: number, value: unknown): void;
|
|
26
|
+
export declare function runEffect(id: number): void;
|
|
27
|
+
export declare function destroyNode(id: number): void;
|
|
28
|
+
export declare function scheduleEffectRun(id: number): void;
|
|
29
|
+
export declare function flushSync(): void;
|
|
30
|
+
export declare function startBatch(): void;
|
|
31
|
+
export declare function endBatch(): void;
|
|
32
|
+
export declare function untrack<T>(fn: () => T): T;
|
|
33
|
+
export declare function getNodeInfo(id: number): object;
|
|
34
|
+
export declare function getStats(): object;
|
|
35
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/v2/registry.ts"],"names":[],"mappings":"AASA,0BAAkB,QAAQ;IACxB,MAAM,IAAI;IACV,OAAO,IAAI;IACX,MAAM,IAAI;CACX;AAED,0BAAkB,KAAK;IACrB,KAAK,IAAI;IACT,WAAW,IAAI;IACf,KAAK,IAAI;IACT,OAAO,IAAI;IACX,QAAQ,IAAI;IACZ,IAAI,KAAK;CACV;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,KAAK,OAAO,CAAA;AA0F1D,wBAAgB,UAAU,IAAI,MAAM,CAOnC;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAgC1C;AAMD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAE7D;AAMD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,GAAE,QAAwB,GAAG,MAAM,CAiBrF;AAMD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,OAAO,EAAE,MAAM,GAAE,QAAwB,GAAG,MAAM,CAqBzF;AA4CD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,QAAQ,GAAE,MAAqB,GAAG,MAAM,CAuBnG;AA4DD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAMD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAY5C;AAqBD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAYzD;AA6KD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CA2C1C;AAaD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAiC5C;AA2ED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAQlD;AA4BD,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAMD,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAM/B;AAMD,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAQzC;AAMD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAW9C;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAOjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stress.d.ts","sourceRoot":"","sources":["../../src/v2/stress.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-suite.d.ts","sourceRoot":"","sources":["../../src/v2/test-suite.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-v1.d.ts","sourceRoot":"","sources":["../../src/v2/test-v1.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rlabs-inc/signals",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Production-grade fine-grained reactivity for TypeScript. A complete standalone mirror of Svelte 5's reactivity system - signals, effects, derived values, deep reactivity, reactive collections, and reactive bindings.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -40,7 +40,13 @@
|
|
|
40
40
|
"bind",
|
|
41
41
|
"binding",
|
|
42
42
|
"two-way-binding",
|
|
43
|
+
"linkedSignal",
|
|
44
|
+
"createSelector",
|
|
45
|
+
"effectScope",
|
|
43
46
|
"svelte",
|
|
47
|
+
"angular",
|
|
48
|
+
"solid",
|
|
49
|
+
"vue",
|
|
44
50
|
"typescript"
|
|
45
51
|
],
|
|
46
52
|
"author": "RLabs Inc.",
|