@praxisjs/core 0.3.0 → 0.4.1

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 (64) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/__tests__/batch.test.d.ts +2 -0
  3. package/dist/__tests__/batch.test.d.ts.map +1 -0
  4. package/dist/__tests__/batch.test.js +26 -0
  5. package/dist/__tests__/batch.test.js.map +1 -0
  6. package/dist/__tests__/component.test.d.ts +2 -0
  7. package/dist/__tests__/component.test.d.ts.map +1 -0
  8. package/dist/__tests__/component.test.js +48 -0
  9. package/dist/__tests__/component.test.js.map +1 -0
  10. package/dist/__tests__/computed.test.d.ts +2 -0
  11. package/dist/__tests__/computed.test.d.ts.map +1 -0
  12. package/dist/__tests__/computed.test.js +79 -0
  13. package/dist/__tests__/computed.test.js.map +1 -0
  14. package/dist/__tests__/effect.test.d.ts +2 -0
  15. package/dist/__tests__/effect.test.d.ts.map +1 -0
  16. package/dist/__tests__/effect.test.js +49 -0
  17. package/dist/__tests__/effect.test.js.map +1 -0
  18. package/dist/__tests__/peek.test.d.ts +2 -0
  19. package/dist/__tests__/peek.test.d.ts.map +1 -0
  20. package/dist/__tests__/peek.test.js +26 -0
  21. package/dist/__tests__/peek.test.js.map +1 -0
  22. package/dist/__tests__/persisted-signal.test.d.ts +2 -0
  23. package/dist/__tests__/persisted-signal.test.d.ts.map +1 -0
  24. package/dist/__tests__/persisted-signal.test.js +74 -0
  25. package/dist/__tests__/persisted-signal.test.js.map +1 -0
  26. package/dist/__tests__/reactive.test.d.ts +2 -0
  27. package/dist/__tests__/reactive.test.d.ts.map +1 -0
  28. package/dist/__tests__/reactive.test.js +181 -0
  29. package/dist/__tests__/reactive.test.js.map +1 -0
  30. package/dist/__tests__/resource.test.d.ts +2 -0
  31. package/dist/__tests__/resource.test.d.ts.map +1 -0
  32. package/dist/__tests__/resource.test.js +84 -0
  33. package/dist/__tests__/resource.test.js.map +1 -0
  34. package/dist/__tests__/signal.test.d.ts +2 -0
  35. package/dist/__tests__/signal.test.d.ts.map +1 -0
  36. package/dist/__tests__/signal.test.js +64 -0
  37. package/dist/__tests__/signal.test.js.map +1 -0
  38. package/dist/__tests__/track.test.d.ts +2 -0
  39. package/dist/__tests__/track.test.d.ts.map +1 -0
  40. package/dist/__tests__/track.test.js +54 -0
  41. package/dist/__tests__/track.test.js.map +1 -0
  42. package/dist/reactive/reactive.d.ts.map +1 -1
  43. package/dist/reactive/reactive.js +8 -1
  44. package/dist/reactive/reactive.js.map +1 -1
  45. package/dist/signal/computed.d.ts.map +1 -1
  46. package/dist/signal/computed.js +1 -2
  47. package/dist/signal/computed.js.map +1 -1
  48. package/dist/signal/persisted.d.ts.map +1 -1
  49. package/dist/signal/persisted.js +10 -12
  50. package/dist/signal/persisted.js.map +1 -1
  51. package/package.json +1 -1
  52. package/src/__tests__/batch.test.ts +29 -0
  53. package/src/__tests__/component.test.ts +58 -0
  54. package/src/__tests__/computed.test.ts +89 -0
  55. package/src/__tests__/effect.test.ts +54 -0
  56. package/src/__tests__/peek.test.ts +31 -0
  57. package/src/__tests__/persisted-signal.test.ts +87 -0
  58. package/src/__tests__/reactive.test.ts +210 -0
  59. package/src/__tests__/resource.test.ts +97 -0
  60. package/src/__tests__/signal.test.ts +74 -0
  61. package/src/__tests__/track.test.ts +61 -0
  62. package/src/reactive/reactive.ts +9 -1
  63. package/src/signal/computed.ts +1 -3
  64. package/src/signal/persisted.ts +12 -14
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @praxisjs/core
2
2
 
3
+ ## 0.4.1
4
+
5
+ ### Patch Changes
6
+
7
+ - fe39901: fix(core): fix effect subscription leak in `when()` when source is immediately truthy
8
+
9
+ When `source()` returned a truthy value on the first synchronous effect run, `stop` was still `undefined` at that point. The `stop?.()` call inside the callback was a no-op, leaving the effect subscribed forever — any future change to the source kept triggering the effect (which returned early via `disposed`, but still maintained its reactive tracking).
10
+
11
+ The implementation was refactored to use a `ref` object (`{ cancel }`) to hold the cancellation function. This allows `stop` to be declared as `const`, removes the optional chain on a non-nullable type, and ensures the effect is properly cancelled via `if (disposed) stop()` after the first synchronous run.
12
+
13
+ ## 0.4.0
14
+
15
+ ### Minor Changes
16
+
17
+ - f52354d: Add `@Computed()` decorator to `@praxisjs/decorators` for declaring read-only reactive getters backed by a cached `computed()` signal. The getter recomputes automatically when any `@State` or `@Prop` dependency changes, and the result is cached until a dependency is invalidated — unlike a plain getter which recalculates on every read.
18
+
19
+ `@Debug()` in `@praxisjs/devtools` now supports `@Computed()` getters (`ClassGetterDecoratorContext`) in addition to fields and methods, allowing computed values to be tracked and historized in the devtools panel.
20
+
21
+ Also fixes a bug in the `computed()` primitive where an erroneous `track(recompute)` call caused premature dependency tracking on signal creation.
22
+
3
23
  ## 0.3.0
4
24
 
5
25
  ### Minor Changes
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=batch.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/batch.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { batch } from "../signal/batch";
3
+ import { signal } from "../signal/signal";
4
+ describe("batch", () => {
5
+ it("executes the wrapped function", () => {
6
+ const s = signal(0);
7
+ batch(() => {
8
+ s.set(5);
9
+ s.set(10);
10
+ });
11
+ expect(s()).toBe(10);
12
+ });
13
+ it("does not throw when no effects are tracking", () => {
14
+ const s = signal(0);
15
+ expect(() => { batch(() => { s.set(1); }); }).not.toThrow();
16
+ expect(s()).toBe(1);
17
+ });
18
+ it("propagates errors thrown inside the batch", () => {
19
+ expect(() => {
20
+ batch(() => {
21
+ throw new Error("inside batch");
22
+ });
23
+ }).toThrow("inside batch");
24
+ });
25
+ });
26
+ //# sourceMappingURL=batch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.test.js","sourceRoot":"","sources":["../../src/__tests__/batch.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,KAAK,CAAC,GAAG,EAAE;YACT,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACT,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC5D,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,EAAE;YACR,KAAK,CAAC,GAAG,EAAE;gBACX,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QAAC,CAAC,CACN,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=component.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/component.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { RootComponent } from "../component/base";
3
+ import { StatefulComponent } from "../component/stateful";
4
+ class ConcreteRoot extends RootComponent {
5
+ render() { return null; }
6
+ }
7
+ class ConcreteStateful extends StatefulComponent {
8
+ render() { return null; }
9
+ }
10
+ describe("RootComponent", () => {
11
+ it("stores props on _rawProps", () => {
12
+ const c = new ConcreteRoot({ name: "Alice" });
13
+ expect(c._rawProps.name).toBe("Alice");
14
+ });
15
+ it("exposes props via .props getter", () => {
16
+ const c = new ConcreteRoot({ name: "Bob" });
17
+ expect(c.props.name).toBe("Bob");
18
+ });
19
+ it("_mounted starts as false", () => {
20
+ const c = new ConcreteRoot({ name: "" });
21
+ expect(c._mounted).toBe(false);
22
+ });
23
+ it("_anchor starts as undefined", () => {
24
+ const c = new ConcreteRoot({ name: "" });
25
+ expect(c._anchor).toBeUndefined();
26
+ });
27
+ it("defaults to empty object when no props given", () => {
28
+ const c = new ConcreteRoot();
29
+ expect(c._rawProps).toEqual({});
30
+ });
31
+ });
32
+ describe("StatefulComponent", () => {
33
+ it("_defaults starts as empty object", () => {
34
+ const c = new ConcreteStateful();
35
+ expect(c._defaults).toEqual({});
36
+ });
37
+ it("_stateDirty starts as false", () => {
38
+ const c = new ConcreteStateful();
39
+ expect(c._stateDirty).toBe(false);
40
+ });
41
+ it("_setProps replaces _rawProps contents", () => {
42
+ const c = new ConcreteStateful({ x: 1 });
43
+ c._setProps({ y: 2 });
44
+ expect((c._rawProps).x).toBeUndefined();
45
+ expect((c._rawProps).y).toBe(2);
46
+ });
47
+ });
48
+ //# sourceMappingURL=component.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.test.js","sourceRoot":"","sources":["../../src/__tests__/component.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=computed.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computed.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/computed.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { computed } from "../signal/computed";
3
+ import { signal } from "../signal/signal";
4
+ describe("computed", () => {
5
+ it("derives value from signal", () => {
6
+ const s = signal(4);
7
+ const doubled = computed(() => s() * 2);
8
+ expect(doubled()).toBe(8);
9
+ });
10
+ it("updates when source signal changes", () => {
11
+ const s = signal(3);
12
+ const triple = computed(() => s() * 3);
13
+ s.set(5);
14
+ expect(triple()).toBe(15);
15
+ });
16
+ it("is lazy — does not recompute until accessed", () => {
17
+ const s = signal(1);
18
+ const fn = vi.fn(() => s() + 1);
19
+ const c = computed(fn);
20
+ expect(fn).not.toHaveBeenCalled();
21
+ c();
22
+ expect(fn).toHaveBeenCalledOnce();
23
+ });
24
+ it("caches value between reads when source has not changed", () => {
25
+ const s = signal(2);
26
+ const fn = vi.fn(() => s() * 10);
27
+ const c = computed(fn);
28
+ c();
29
+ c();
30
+ expect(fn).toHaveBeenCalledOnce();
31
+ });
32
+ it("recomputes after source change", () => {
33
+ const s = signal(1);
34
+ const fn = vi.fn(() => s() + 100);
35
+ const c = computed(fn);
36
+ c();
37
+ s.set(2);
38
+ c();
39
+ expect(fn).toHaveBeenCalledTimes(2);
40
+ });
41
+ it("marks __isComputed = true", () => {
42
+ const c = computed(() => 42);
43
+ expect(c.__isComputed).toBe(true);
44
+ });
45
+ it("chained computed values update correctly", () => {
46
+ const s = signal(1);
47
+ const doubled = computed(() => s() * 2);
48
+ const quadrupled = computed(() => doubled() * 2);
49
+ expect(quadrupled()).toBe(4);
50
+ s.set(3);
51
+ expect(quadrupled()).toBe(12);
52
+ });
53
+ it("subscribe fires immediately with computed value", () => {
54
+ const s = signal(5);
55
+ const c = computed(() => s() + 1);
56
+ const received = [];
57
+ c.subscribe((v) => received.push(v));
58
+ expect(received).toEqual([6]);
59
+ });
60
+ it("subscribe fires when source changes", () => {
61
+ const s = signal(0);
62
+ const c = computed(() => s() * 3);
63
+ const received = [];
64
+ c.subscribe((v) => received.push(v));
65
+ s.set(2);
66
+ s.set(4);
67
+ expect(received).toEqual([0, 6, 12]);
68
+ });
69
+ it("unsubscribe stops receiving updates", () => {
70
+ const s = signal(0);
71
+ const c = computed(() => s() + 1);
72
+ const received = [];
73
+ const unsub = c.subscribe((v) => received.push(v));
74
+ unsub();
75
+ s.set(10);
76
+ expect(received).toEqual([1]);
77
+ });
78
+ });
79
+ //# sourceMappingURL=computed.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computed.test.js","sourceRoot":"","sources":["../../src/__tests__/computed.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=effect.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/effect.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { effect } from "../signal/effect";
3
+ import { signal } from "../signal/signal";
4
+ describe("effect", () => {
5
+ it("runs immediately on creation", () => {
6
+ const ran = vi.fn();
7
+ effect(ran);
8
+ expect(ran).toHaveBeenCalledOnce();
9
+ });
10
+ it("re-runs when a tracked signal changes", () => {
11
+ const s = signal(1);
12
+ const values = [];
13
+ effect(() => {
14
+ values.push(s());
15
+ });
16
+ s.set(2);
17
+ s.set(3);
18
+ expect(values).toEqual([1, 2, 3]);
19
+ });
20
+ it("stop() calls the cleanup function", () => {
21
+ const cleanupFn = vi.fn();
22
+ const stop = effect(() => cleanupFn);
23
+ stop();
24
+ expect(cleanupFn).toHaveBeenCalledOnce();
25
+ });
26
+ it("calls cleanup function before re-run", () => {
27
+ const s = signal(0);
28
+ const order = [];
29
+ effect(() => {
30
+ const v = s();
31
+ order.push(`run:${v}`);
32
+ return () => order.push(`cleanup`);
33
+ });
34
+ s.set(1);
35
+ expect(order).toEqual(["run:0", "cleanup", "run:1"]);
36
+ });
37
+ it("tracks multiple signals", () => {
38
+ const a = signal(1);
39
+ const b = signal(10);
40
+ const sums = [];
41
+ effect(() => {
42
+ sums.push(a() + b());
43
+ });
44
+ a.set(2);
45
+ b.set(20);
46
+ expect(sums).toEqual([11, 12, 22]);
47
+ });
48
+ });
49
+ //# sourceMappingURL=effect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.test.js","sourceRoot":"","sources":["../../src/__tests__/effect.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACT,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACT,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,EAAE,CAAC;QACP,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACT,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACT,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACV,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=peek.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peek.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/peek.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { computed } from "../signal/computed";
3
+ import { effect } from "../signal/effect";
4
+ import { peek } from "../signal/peek";
5
+ import { signal } from "../signal/signal";
6
+ describe("peek", () => {
7
+ it("returns the current value without tracking", () => {
8
+ const s = signal(42);
9
+ expect(peek(s)).toBe(42);
10
+ });
11
+ it("does not subscribe the active effect when peeked", () => {
12
+ const s = signal(1);
13
+ const runs = [];
14
+ effect(() => {
15
+ runs.push(peek(s)); // peek — should not subscribe
16
+ });
17
+ s.set(99); // should NOT trigger re-run
18
+ expect(runs).toEqual([1]);
19
+ });
20
+ it("works with computed values", () => {
21
+ const s = signal(5);
22
+ const c = computed(() => s() * 2);
23
+ expect(peek(c)).toBe(10);
24
+ });
25
+ });
26
+ //# sourceMappingURL=peek.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peek.test.js","sourceRoot":"","sources":["../../src/__tests__/peek.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,MAAM,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,8BAA8B;QACpD,CAAC,CAAC,CAAC;QAEH,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,4BAA4B;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=persisted-signal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persisted-signal.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/persisted-signal.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ // @vitest-environment jsdom
2
+ import { describe, it, expect, beforeEach, vi } from "vitest";
3
+ import { persistedSignal } from "../signal/persisted";
4
+ beforeEach(() => {
5
+ localStorage.clear();
6
+ });
7
+ describe("persistedSignal", () => {
8
+ it("returns initialValue when nothing is stored", () => {
9
+ const s = persistedSignal("key1", 42);
10
+ expect(s()).toBe(42);
11
+ });
12
+ it("reads existing value from localStorage", () => {
13
+ localStorage.setItem("key2", "99");
14
+ const s = persistedSignal("key2", 0);
15
+ expect(s()).toBe(99);
16
+ });
17
+ it("persists set() to localStorage", () => {
18
+ const s = persistedSignal("key3", 0);
19
+ s.set(7);
20
+ expect(localStorage.getItem("key3")).toBe("7");
21
+ expect(s()).toBe(7);
22
+ });
23
+ it("persists update() to localStorage", () => {
24
+ const s = persistedSignal("key4", 10);
25
+ s.update((v) => v + 5);
26
+ expect(localStorage.getItem("key4")).toBe("15");
27
+ expect(s()).toBe(15);
28
+ });
29
+ it("removes the key when set to null", () => {
30
+ const s = persistedSignal("key5", "hello");
31
+ s.set(null);
32
+ expect(localStorage.getItem("key5")).toBeNull();
33
+ });
34
+ it("marks __isSignal = true", () => {
35
+ const s = persistedSignal("key6", 0);
36
+ expect(s.__isSignal).toBe(true);
37
+ });
38
+ it("supports custom serialize/deserialize", () => {
39
+ const s = persistedSignal("key7", { x: 1 }, {
40
+ serialize: (v) => JSON.stringify(v),
41
+ deserialize: (raw) => JSON.parse(raw),
42
+ });
43
+ s.set({ x: 99 });
44
+ expect(localStorage.getItem("key7")).toBe('{"x":99}');
45
+ const s2 = persistedSignal("key7", { x: 0 }, {
46
+ serialize: JSON.stringify,
47
+ deserialize: (raw) => JSON.parse(raw),
48
+ });
49
+ expect(s2().x).toBe(99);
50
+ });
51
+ it("falls back to initialValue when deserialization fails", () => {
52
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
53
+ localStorage.setItem("key8", "{ bad json");
54
+ const s = persistedSignal("key8", 42);
55
+ expect(s()).toBe(42);
56
+ warn.mockRestore();
57
+ });
58
+ it("syncs from storage event on other tab", () => {
59
+ const s = persistedSignal("key9", 1);
60
+ window.dispatchEvent(new StorageEvent("storage", {
61
+ key: "key9",
62
+ newValue: "55",
63
+ storageArea: localStorage,
64
+ }));
65
+ expect(s()).toBe(55);
66
+ });
67
+ it("syncTabs=false does not add storage listener", () => {
68
+ const s = persistedSignal("key10", 1, { syncTabs: false });
69
+ s.set(5);
70
+ // Just verify it works without errors
71
+ expect(s()).toBe(5);
72
+ });
73
+ });
74
+ //# sourceMappingURL=persisted-signal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persisted-signal.test.js","sourceRoot":"","sources":["../../src/__tests__/persisted-signal.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reactive.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/reactive.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,181 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { history } from "../reactive/history";
3
+ import { when, until, debounced } from "../reactive/reactive";
4
+ import { computed } from "../signal/computed";
5
+ import { signal } from "../signal/signal";
6
+ // ---------- when ----------
7
+ describe("when", () => {
8
+ it("calls fn immediately when source is already truthy", () => {
9
+ const s = signal(5);
10
+ const fn = vi.fn();
11
+ when(s, fn);
12
+ expect(fn).toHaveBeenCalledWith(5);
13
+ });
14
+ it("calls fn once the source becomes truthy", () => {
15
+ const s = signal(0);
16
+ const fn = vi.fn();
17
+ when(s, fn);
18
+ expect(fn).not.toHaveBeenCalled();
19
+ s.set(1);
20
+ expect(fn).toHaveBeenCalledWith(1);
21
+ });
22
+ it("only fires once, even if source changes again", () => {
23
+ const s = signal(0);
24
+ const fn = vi.fn();
25
+ when(s, fn);
26
+ s.set(1);
27
+ s.set(2);
28
+ expect(fn).toHaveBeenCalledTimes(1);
29
+ });
30
+ it("does not re-fire after immediate truthy source changes again", () => {
31
+ // Regression: when source is truthy on first run, stop?.() was a no-op
32
+ // because `stop` hadn't been assigned yet. The effect must be cancelled
33
+ // after firing so further source changes do not re-trigger fn.
34
+ const s = signal(1); // immediately truthy
35
+ const fn = vi.fn();
36
+ when(s, fn);
37
+ expect(fn).toHaveBeenCalledTimes(1);
38
+ s.set(2);
39
+ s.set(3);
40
+ expect(fn).toHaveBeenCalledTimes(1); // must still be 1
41
+ });
42
+ it("does not call fn when source stays falsy", () => {
43
+ const s = signal(0);
44
+ const fn = vi.fn();
45
+ when(s, fn);
46
+ s.set(0);
47
+ expect(fn).not.toHaveBeenCalled();
48
+ });
49
+ });
50
+ // ---------- until ----------
51
+ describe("until", () => {
52
+ it("resolves immediately when source is already truthy", async () => {
53
+ const s = signal(42);
54
+ const value = await until(s);
55
+ expect(value).toBe(42);
56
+ });
57
+ it("resolves when source becomes truthy", async () => {
58
+ const s = signal(0);
59
+ const promise = until(s);
60
+ s.set(7);
61
+ expect(await promise).toBe(7);
62
+ });
63
+ });
64
+ // ---------- debounced ----------
65
+ describe("debounced", () => {
66
+ it("returns initial value immediately", () => {
67
+ vi.useFakeTimers();
68
+ const s = signal(1);
69
+ const d = debounced(s, 100);
70
+ expect(d()).toBe(1);
71
+ vi.useRealTimers();
72
+ });
73
+ it("debounces rapid updates", () => {
74
+ vi.useFakeTimers();
75
+ const s = signal(1);
76
+ const d = debounced(s, 100);
77
+ s.set(2);
78
+ s.set(3);
79
+ s.set(4);
80
+ expect(d()).toBe(1); // not yet updated
81
+ vi.advanceTimersByTime(100);
82
+ expect(d()).toBe(4); // settled on last value
83
+ vi.useRealTimers();
84
+ });
85
+ it("emits each value when updates are spaced apart", () => {
86
+ vi.useFakeTimers();
87
+ const s = signal(0);
88
+ const d = debounced(s, 50);
89
+ s.set(1);
90
+ vi.advanceTimersByTime(50);
91
+ expect(d()).toBe(1);
92
+ s.set(2);
93
+ vi.advanceTimersByTime(50);
94
+ expect(d()).toBe(2);
95
+ vi.useRealTimers();
96
+ });
97
+ });
98
+ // ---------- history ----------
99
+ describe("history", () => {
100
+ it("current reflects signal value", () => {
101
+ const s = signal("a");
102
+ const h = history(s);
103
+ expect(h.current()).toBe("a");
104
+ });
105
+ it("canUndo is false initially", () => {
106
+ const s = signal(0);
107
+ const h = history(s);
108
+ expect(h.canUndo()).toBe(false);
109
+ });
110
+ it("canUndo becomes true after a change", () => {
111
+ const s = signal(0);
112
+ const h = history(s);
113
+ s.set(1);
114
+ expect(h.canUndo()).toBe(true);
115
+ });
116
+ it("undo reverts to previous value", () => {
117
+ const s = signal(0);
118
+ const h = history(s);
119
+ s.set(1);
120
+ s.set(2);
121
+ h.undo();
122
+ expect(h.current()).toBe(1);
123
+ expect(s()).toBe(1);
124
+ });
125
+ it("redo re-applies reverted value", () => {
126
+ const s = signal(0);
127
+ const h = history(s);
128
+ s.set(1);
129
+ h.undo();
130
+ expect(h.canRedo()).toBe(true);
131
+ h.redo();
132
+ expect(h.current()).toBe(1);
133
+ expect(s()).toBe(1);
134
+ });
135
+ it("values() returns full timeline", () => {
136
+ const s = signal("a");
137
+ const h = history(s);
138
+ s.set("b");
139
+ s.set("c");
140
+ expect(h.values()).toEqual(["a", "b", "c"]);
141
+ });
142
+ it("clear removes past and future", () => {
143
+ const s = signal(0);
144
+ const h = history(s);
145
+ s.set(1);
146
+ s.set(2);
147
+ h.clear();
148
+ expect(h.canUndo()).toBe(false);
149
+ expect(h.canRedo()).toBe(false);
150
+ });
151
+ it("undo does nothing when there is no history", () => {
152
+ const s = signal(5);
153
+ const h = history(s);
154
+ h.undo();
155
+ expect(h.current()).toBe(5);
156
+ });
157
+ it("redo does nothing when there is no future", () => {
158
+ const s = signal(5);
159
+ const h = history(s);
160
+ s.set(10);
161
+ h.redo();
162
+ expect(h.current()).toBe(10);
163
+ });
164
+ it("works with computed source (read-only — no signal.set)", () => {
165
+ const s = signal(1);
166
+ const c = computed(() => s() * 2);
167
+ const h = history(c);
168
+ s.set(2);
169
+ expect(h.current()).toBe(4);
170
+ expect(h.canUndo()).toBe(true);
171
+ });
172
+ it("respects limit — oldest entries are dropped", () => {
173
+ const s = signal(0);
174
+ const h = history(s, 3);
175
+ for (let i = 1; i <= 5; i++)
176
+ s.set(i);
177
+ // past holds at most 3, plus current = 4 values total
178
+ expect(h.values().length).toBeLessThanOrEqual(4);
179
+ });
180
+ });
181
+ //# sourceMappingURL=reactive.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive.test.js","sourceRoot":"","sources":["../../src/__tests__/reactive.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resource.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resource.test.ts"],"names":[],"mappings":""}