@rlabs-inc/signals 1.3.0 → 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.
Files changed (48) hide show
  1. package/README.md +114 -0
  2. package/dist/core/constants.d.ts +6 -0
  3. package/dist/core/constants.d.ts.map +1 -1
  4. package/dist/deep/proxy.d.ts.map +1 -1
  5. package/dist/index.d.ts +7 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +430 -56
  8. package/dist/index.mjs +430 -56
  9. package/dist/primitives/bind.d.ts.map +1 -1
  10. package/dist/primitives/effect.d.ts.map +1 -1
  11. package/dist/primitives/linked.d.ts +73 -0
  12. package/dist/primitives/linked.d.ts.map +1 -0
  13. package/dist/primitives/scope.d.ts +96 -0
  14. package/dist/primitives/scope.d.ts.map +1 -0
  15. package/dist/primitives/selector.d.ts +46 -0
  16. package/dist/primitives/selector.d.ts.map +1 -0
  17. package/dist/reactivity/scheduling.d.ts.map +1 -1
  18. package/dist/reactivity/tracking.d.ts +5 -0
  19. package/dist/reactivity/tracking.d.ts.map +1 -1
  20. package/dist/v2/bench-compare.d.ts +2 -0
  21. package/dist/v2/bench-compare.d.ts.map +1 -0
  22. package/dist/v2/bench.d.ts +5 -0
  23. package/dist/v2/bench.d.ts.map +1 -0
  24. package/dist/v2/bind.d.ts +94 -0
  25. package/dist/v2/bind.d.ts.map +1 -0
  26. package/dist/v2/collections.d.ts +133 -0
  27. package/dist/v2/collections.d.ts.map +1 -0
  28. package/dist/v2/compat-test.d.ts +2 -0
  29. package/dist/v2/compat-test.d.ts.map +1 -0
  30. package/dist/v2/debug-array.d.ts +2 -0
  31. package/dist/v2/debug-array.d.ts.map +1 -0
  32. package/dist/v2/debug-diamond.d.ts +2 -0
  33. package/dist/v2/debug-diamond.d.ts.map +1 -0
  34. package/dist/v2/index.d.ts +7 -0
  35. package/dist/v2/index.d.ts.map +1 -0
  36. package/dist/v2/primitives.d.ts +120 -0
  37. package/dist/v2/primitives.d.ts.map +1 -0
  38. package/dist/v2/proxy.d.ts +10 -0
  39. package/dist/v2/proxy.d.ts.map +1 -0
  40. package/dist/v2/registry.d.ts +35 -0
  41. package/dist/v2/registry.d.ts.map +1 -0
  42. package/dist/v2/stress.d.ts +7 -0
  43. package/dist/v2/stress.d.ts.map +1 -0
  44. package/dist/v2/test-suite.d.ts +2 -0
  45. package/dist/v2/test-suite.d.ts.map +1 -0
  46. package/dist/v2/test-v1.d.ts +2 -0
  47. package/dist/v2/test-v1.d.ts.map +1 -0
  48. 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,7 @@
1
+ /**
2
+ * @rlabs-inc/signals v2 - STRESS TEST
3
+ *
4
+ * Testing the parallel arrays architecture
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=stress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stress.d.ts","sourceRoot":"","sources":["../../src/v2/stress.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-suite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-suite.d.ts","sourceRoot":"","sources":["../../src/v2/test-suite.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-v1.d.ts.map
@@ -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.0",
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.",