@praxisjs/core 2.1.0 → 2.3.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 (126) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/component/internals.d.ts +12 -2
  3. package/dist/component/internals.d.ts.map +1 -1
  4. package/dist/component/internals.js +25 -7
  5. package/dist/component/internals.js.map +1 -1
  6. package/dist/internal.d.ts +3 -2
  7. package/dist/internal.d.ts.map +1 -1
  8. package/dist/internal.js +3 -2
  9. package/dist/internal.js.map +1 -1
  10. package/dist/reactive/history.d.ts +2 -0
  11. package/dist/reactive/history.d.ts.map +1 -1
  12. package/dist/reactive/history.js +2 -1
  13. package/dist/reactive/history.js.map +1 -1
  14. package/dist/signal/batch.d.ts +1 -3
  15. package/dist/signal/batch.d.ts.map +1 -1
  16. package/dist/signal/batch.js +4 -16
  17. package/dist/signal/batch.js.map +1 -1
  18. package/dist/signal/computed.d.ts.map +1 -1
  19. package/dist/signal/computed.js +19 -61
  20. package/dist/signal/computed.js.map +1 -1
  21. package/dist/signal/effect.d.ts +6 -12
  22. package/dist/signal/effect.d.ts.map +1 -1
  23. package/dist/signal/effect.js +11 -74
  24. package/dist/signal/effect.js.map +1 -1
  25. package/dist/signal/graph.d.ts +111 -0
  26. package/dist/signal/graph.d.ts.map +1 -0
  27. package/dist/signal/graph.js +513 -0
  28. package/dist/signal/graph.js.map +1 -0
  29. package/dist/signal/index.d.ts +2 -1
  30. package/dist/signal/index.d.ts.map +1 -1
  31. package/dist/signal/index.js +1 -0
  32. package/dist/signal/index.js.map +1 -1
  33. package/dist/signal/peek.d.ts.map +1 -1
  34. package/dist/signal/peek.js +2 -9
  35. package/dist/signal/peek.js.map +1 -1
  36. package/dist/signal/persisted.d.ts +11 -1
  37. package/dist/signal/persisted.d.ts.map +1 -1
  38. package/dist/signal/persisted.js +39 -5
  39. package/dist/signal/persisted.js.map +1 -1
  40. package/dist/signal/selector.d.ts +5 -0
  41. package/dist/signal/selector.d.ts.map +1 -0
  42. package/dist/signal/selector.js +128 -0
  43. package/dist/signal/selector.js.map +1 -0
  44. package/dist/signal/signal.d.ts +0 -5
  45. package/dist/signal/signal.d.ts.map +1 -1
  46. package/dist/signal/signal.js +11 -81
  47. package/dist/signal/signal.js.map +1 -1
  48. package/package.json +13 -4
  49. package/src/component/internals.ts +35 -10
  50. package/src/internal.ts +27 -0
  51. package/src/reactive/history.ts +4 -1
  52. package/src/signal/batch.ts +5 -19
  53. package/src/signal/computed.ts +20 -63
  54. package/src/signal/effect.ts +12 -83
  55. package/src/signal/graph.ts +562 -0
  56. package/src/signal/index.ts +2 -1
  57. package/src/signal/peek.ts +2 -8
  58. package/src/signal/persisted.ts +54 -5
  59. package/src/signal/selector.ts +140 -0
  60. package/src/signal/signal.ts +11 -79
  61. package/dist/__tests__/batch.test.d.ts +0 -2
  62. package/dist/__tests__/batch.test.d.ts.map +0 -1
  63. package/dist/__tests__/batch.test.js +0 -73
  64. package/dist/__tests__/batch.test.js.map +0 -1
  65. package/dist/__tests__/component.test.d.ts +0 -2
  66. package/dist/__tests__/component.test.d.ts.map +0 -1
  67. package/dist/__tests__/component.test.js +0 -124
  68. package/dist/__tests__/component.test.js.map +0 -1
  69. package/dist/__tests__/computed.test.d.ts +0 -2
  70. package/dist/__tests__/computed.test.d.ts.map +0 -1
  71. package/dist/__tests__/computed.test.js +0 -252
  72. package/dist/__tests__/computed.test.js.map +0 -1
  73. package/dist/__tests__/effect.test.d.ts +0 -2
  74. package/dist/__tests__/effect.test.d.ts.map +0 -1
  75. package/dist/__tests__/effect.test.js +0 -189
  76. package/dist/__tests__/effect.test.js.map +0 -1
  77. package/dist/__tests__/peek.test.d.ts +0 -2
  78. package/dist/__tests__/peek.test.d.ts.map +0 -1
  79. package/dist/__tests__/peek.test.js +0 -26
  80. package/dist/__tests__/peek.test.js.map +0 -1
  81. package/dist/__tests__/persisted-signal.test.d.ts +0 -2
  82. package/dist/__tests__/persisted-signal.test.d.ts.map +0 -1
  83. package/dist/__tests__/persisted-signal.test.js +0 -156
  84. package/dist/__tests__/persisted-signal.test.js.map +0 -1
  85. package/dist/__tests__/reactive.test.d.ts +0 -2
  86. package/dist/__tests__/reactive.test.d.ts.map +0 -1
  87. package/dist/__tests__/reactive.test.js +0 -264
  88. package/dist/__tests__/reactive.test.js.map +0 -1
  89. package/dist/__tests__/resource-focus.test.d.ts +0 -2
  90. package/dist/__tests__/resource-focus.test.d.ts.map +0 -1
  91. package/dist/__tests__/resource-focus.test.js +0 -50
  92. package/dist/__tests__/resource-focus.test.js.map +0 -1
  93. package/dist/__tests__/resource-server-pass.test.d.ts +0 -2
  94. package/dist/__tests__/resource-server-pass.test.d.ts.map +0 -1
  95. package/dist/__tests__/resource-server-pass.test.js +0 -78
  96. package/dist/__tests__/resource-server-pass.test.js.map +0 -1
  97. package/dist/__tests__/resource.test.d.ts +0 -2
  98. package/dist/__tests__/resource.test.d.ts.map +0 -1
  99. package/dist/__tests__/resource.test.js +0 -336
  100. package/dist/__tests__/resource.test.js.map +0 -1
  101. package/dist/__tests__/signal.test.d.ts +0 -2
  102. package/dist/__tests__/signal.test.d.ts.map +0 -1
  103. package/dist/__tests__/signal.test.js +0 -186
  104. package/dist/__tests__/signal.test.js.map +0 -1
  105. package/dist/__tests__/synced.test.d.ts +0 -2
  106. package/dist/__tests__/synced.test.d.ts.map +0 -1
  107. package/dist/__tests__/synced.test.js +0 -142
  108. package/dist/__tests__/synced.test.js.map +0 -1
  109. package/dist/__tests__/track.test.d.ts +0 -2
  110. package/dist/__tests__/track.test.d.ts.map +0 -1
  111. package/dist/__tests__/track.test.js +0 -54
  112. package/dist/__tests__/track.test.js.map +0 -1
  113. package/src/__tests__/batch.test.ts +0 -87
  114. package/src/__tests__/component.test.ts +0 -165
  115. package/src/__tests__/computed.test.ts +0 -290
  116. package/src/__tests__/effect.test.ts +0 -226
  117. package/src/__tests__/peek.test.ts +0 -31
  118. package/src/__tests__/persisted-signal.test.ts +0 -194
  119. package/src/__tests__/reactive.test.ts +0 -305
  120. package/src/__tests__/resource-focus.test.ts +0 -61
  121. package/src/__tests__/resource-server-pass.test.ts +0 -90
  122. package/src/__tests__/resource.test.ts +0 -421
  123. package/src/__tests__/signal.test.ts +0 -213
  124. package/src/__tests__/synced.test.ts +0 -173
  125. package/src/__tests__/track.test.ts +0 -61
  126. package/tsconfig.json +0 -8
@@ -1,156 +0,0 @@
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
- it("warns and falls back to initialValue when serialize throws on set", () => {
74
- const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
75
- const s = persistedSignal("key11", { x: 1 }, {
76
- serialize: () => { throw new Error("serialize fail"); },
77
- deserialize: JSON.parse,
78
- });
79
- expect(() => s.set({ x: 2 })).not.toThrow();
80
- expect(warn).toHaveBeenCalledWith(expect.stringContaining("Failed to serialize"), expect.any(Error));
81
- warn.mockRestore();
82
- });
83
- it("syncs to initialValue when storage event has newValue=null (key removed)", () => {
84
- const s = persistedSignal("key12", 42);
85
- s.set(99);
86
- window.dispatchEvent(new StorageEvent("storage", {
87
- key: "key12",
88
- newValue: null, // key removed in another tab
89
- storageArea: localStorage,
90
- }));
91
- expect(s()).toBe(42); // falls back to initialValue
92
- });
93
- it("warns and falls back to initialValue when storage event deserialization fails", () => {
94
- const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
95
- const s = persistedSignal("key13", 0, {
96
- deserialize: () => { throw new Error("bad"); },
97
- });
98
- window.dispatchEvent(new StorageEvent("storage", {
99
- key: "key13",
100
- newValue: "invalid",
101
- storageArea: localStorage,
102
- }));
103
- expect(s()).toBe(0);
104
- expect(warn).toHaveBeenCalledWith(expect.stringContaining("Failed to deserialize"), expect.any(Error));
105
- warn.mockRestore();
106
- });
107
- it("ignores storage events from other keys", () => {
108
- const s = persistedSignal("key14", 1);
109
- window.dispatchEvent(new StorageEvent("storage", {
110
- key: "other-key",
111
- newValue: "999",
112
- storageArea: localStorage,
113
- }));
114
- expect(s()).toBe(1);
115
- });
116
- it("set(undefined) removes the key from localStorage", () => {
117
- const s = persistedSignal("key15", 5);
118
- s.set(undefined);
119
- expect(localStorage.getItem("key15")).toBeNull();
120
- });
121
- it("localStorage.setItem throws QuotaExceededError — signal state is updated but no crash", () => {
122
- const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
123
- const setItemSpy = vi.spyOn(Storage.prototype, "setItem").mockImplementation(() => {
124
- const err = new DOMException("QuotaExceededError", "QuotaExceededError");
125
- throw err;
126
- });
127
- const s = persistedSignal("key16", 0);
128
- expect(() => s.set(42)).not.toThrow();
129
- // The in-memory signal value is still updated despite storage failure
130
- expect(s()).toBe(42);
131
- setItemSpy.mockRestore();
132
- warn.mockRestore();
133
- });
134
- it("syncTabs=true — storage event with empty string newValue is handled", () => {
135
- const s = persistedSignal("key17", 99);
136
- window.dispatchEvent(new StorageEvent("storage", {
137
- key: "key17",
138
- newValue: "",
139
- storageArea: localStorage,
140
- }));
141
- // Empty string is falsy, so falls back to initialValue
142
- expect(s()).toBe(99);
143
- });
144
- it("syncTabs=true — storage event from sessionStorage is ignored", () => {
145
- const s = persistedSignal("key18", 10);
146
- s.set(20);
147
- window.dispatchEvent(new StorageEvent("storage", {
148
- key: "key18",
149
- newValue: "999",
150
- storageArea: sessionStorage,
151
- }));
152
- // Should stay at 20 since the event is from sessionStorage, not localStorage
153
- expect(s()).toBe(20);
154
- });
155
- });
156
- //# sourceMappingURL=persisted-signal.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persisted-signal.test.js","sourceRoot":"","sources":["../../src/__tests__/persisted-signal.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=reactive.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reactive.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/reactive.test.ts"],"names":[],"mappings":""}
@@ -1,264 +0,0 @@
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
- it("with source that fires immediately on subscription does not crash", () => {
50
- const s = signal(1); // immediately truthy
51
- const fn = vi.fn();
52
- expect(() => when(s, fn)).not.toThrow();
53
- expect(fn).toHaveBeenCalledWith(1);
54
- });
55
- });
56
- // ---------- until ----------
57
- describe("until", () => {
58
- it("resolves immediately when source is already truthy", async () => {
59
- const s = signal(42);
60
- const value = await until(s);
61
- expect(value).toBe(42);
62
- });
63
- it("resolves when source becomes truthy", async () => {
64
- const s = signal(0);
65
- const promise = until(s);
66
- s.set(7);
67
- expect(await promise).toBe(7);
68
- });
69
- it("the promise remains pending if source is always falsy (no-timeout behavior)", async () => {
70
- const s = signal(0);
71
- let resolved = false;
72
- until(s).then(() => { resolved = true; });
73
- // Never set a truthy value
74
- await new Promise((res) => setTimeout(res, 10));
75
- expect(resolved).toBe(false);
76
- });
77
- });
78
- // ---------- debounced ----------
79
- describe("debounced", () => {
80
- it("returns initial value immediately", () => {
81
- vi.useFakeTimers();
82
- const s = signal(1);
83
- const d = debounced(s, 100);
84
- expect(d()).toBe(1);
85
- vi.useRealTimers();
86
- });
87
- it("debounces rapid updates", () => {
88
- vi.useFakeTimers();
89
- const s = signal(1);
90
- const d = debounced(s, 100);
91
- s.set(2);
92
- s.set(3);
93
- s.set(4);
94
- expect(d()).toBe(1); // not yet updated
95
- vi.advanceTimersByTime(100);
96
- expect(d()).toBe(4); // settled on last value
97
- vi.useRealTimers();
98
- });
99
- it("emits each value when updates are spaced apart", () => {
100
- vi.useFakeTimers();
101
- const s = signal(0);
102
- const d = debounced(s, 50);
103
- s.set(1);
104
- vi.advanceTimersByTime(50);
105
- expect(d()).toBe(1);
106
- s.set(2);
107
- vi.advanceTimersByTime(50);
108
- expect(d()).toBe(2);
109
- vi.useRealTimers();
110
- });
111
- it("delay=0 fires synchronously after setTimeout(0)", () => {
112
- vi.useFakeTimers();
113
- const s = signal("a");
114
- const d = debounced(s, 0);
115
- s.set("b");
116
- expect(d()).toBe("a"); // not yet
117
- vi.advanceTimersByTime(0);
118
- expect(d()).toBe("b");
119
- vi.useRealTimers();
120
- });
121
- it("the inner effect is cleaned up when stop is called (no leak)", () => {
122
- vi.useFakeTimers();
123
- const s = signal(0);
124
- const d = debounced(s, 100);
125
- s.set(1);
126
- // Stop the debounced effect before the timer fires
127
- d.stop();
128
- // Advance time — the timer should not fire and update the signal
129
- vi.advanceTimersByTime(200);
130
- expect(d()).toBe(0); // still initial value, effect was stopped
131
- vi.useRealTimers();
132
- });
133
- });
134
- // ---------- history ----------
135
- describe("history", () => {
136
- it("current reflects signal value", () => {
137
- const s = signal("a");
138
- const h = history(s);
139
- expect(h.current()).toBe("a");
140
- });
141
- it("canUndo is false initially", () => {
142
- const s = signal(0);
143
- const h = history(s);
144
- expect(h.canUndo()).toBe(false);
145
- });
146
- it("canUndo becomes true after a change", () => {
147
- const s = signal(0);
148
- const h = history(s);
149
- s.set(1);
150
- expect(h.canUndo()).toBe(true);
151
- });
152
- it("undo reverts to previous value", () => {
153
- const s = signal(0);
154
- const h = history(s);
155
- s.set(1);
156
- s.set(2);
157
- h.undo();
158
- expect(h.current()).toBe(1);
159
- expect(s()).toBe(1);
160
- });
161
- it("redo re-applies reverted value", () => {
162
- const s = signal(0);
163
- const h = history(s);
164
- s.set(1);
165
- h.undo();
166
- expect(h.canRedo()).toBe(true);
167
- h.redo();
168
- expect(h.current()).toBe(1);
169
- expect(s()).toBe(1);
170
- });
171
- it("values() returns full timeline", () => {
172
- const s = signal("a");
173
- const h = history(s);
174
- s.set("b");
175
- s.set("c");
176
- expect(h.values()).toEqual(["a", "b", "c"]);
177
- });
178
- it("clear removes past and future", () => {
179
- const s = signal(0);
180
- const h = history(s);
181
- s.set(1);
182
- s.set(2);
183
- h.clear();
184
- expect(h.canUndo()).toBe(false);
185
- expect(h.canRedo()).toBe(false);
186
- });
187
- it("undo does nothing when there is no history", () => {
188
- const s = signal(5);
189
- const h = history(s);
190
- h.undo();
191
- expect(h.current()).toBe(5);
192
- });
193
- it("redo does nothing when there is no future", () => {
194
- const s = signal(5);
195
- const h = history(s);
196
- s.set(10);
197
- h.redo();
198
- expect(h.current()).toBe(10);
199
- });
200
- it("works with computed source (read-only — no signal.set)", async () => {
201
- const s = signal(1);
202
- const c = computed(() => s() * 2);
203
- const h = history(c);
204
- s.set(2);
205
- await Promise.resolve();
206
- expect(h.current()).toBe(4);
207
- expect(h.canUndo()).toBe(true);
208
- });
209
- it("respects limit — oldest entries are dropped", () => {
210
- const s = signal(0);
211
- const h = history(s, 3);
212
- for (let i = 1; i <= 5; i++)
213
- s.set(i);
214
- // past holds at most 3, plus current = 4 values total
215
- expect(h.values().length).toBeLessThanOrEqual(4);
216
- });
217
- it("limit=1 allows only one past entry", () => {
218
- const s = signal(0);
219
- const h = history(s, 1);
220
- s.set(1);
221
- s.set(2);
222
- s.set(3);
223
- // values = [past(1 entry max), current] → at most 2 entries
224
- expect(h.values().length).toBeLessThanOrEqual(2);
225
- expect(h.current()).toBe(3);
226
- });
227
- it("clear() after undo removes both past and future", () => {
228
- const s = signal(0);
229
- const h = history(s);
230
- s.set(1);
231
- s.set(2);
232
- h.undo();
233
- expect(h.canRedo()).toBe(true);
234
- h.clear();
235
- expect(h.canUndo()).toBe(false);
236
- expect(h.canRedo()).toBe(false);
237
- });
238
- it("undo() called more times than history entries — state stays consistent", () => {
239
- const s = signal(0);
240
- const h = history(s);
241
- s.set(1);
242
- h.undo();
243
- // No more history — undo is a no-op
244
- h.undo();
245
- h.undo();
246
- expect(h.current()).toBe(0);
247
- expect(h.canUndo()).toBe(false);
248
- });
249
- it("values() returns a snapshot — each call after source change yields a fresh array", () => {
250
- const s = signal("a");
251
- const h = history(s);
252
- s.set("b");
253
- s.set("c");
254
- const snapshot1 = h.values();
255
- expect(snapshot1).toEqual(["a", "b", "c"]);
256
- // Trigger a change so the computed re-evaluates on next read
257
- s.set("d");
258
- const snapshot2 = h.values();
259
- expect(snapshot2).toEqual(["a", "b", "c", "d"]);
260
- // snapshot1 and snapshot2 are different array instances
261
- expect(snapshot1).not.toBe(snapshot2);
262
- });
263
- });
264
- //# sourceMappingURL=reactive.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reactive.test.js","sourceRoot":"","sources":["../../src/__tests__/reactive.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=resource-focus.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource-focus.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resource-focus.test.ts"],"names":[],"mappings":""}
@@ -1,50 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect, vi, beforeEach } from "vitest";
3
- import { resource } from "../async/resource";
4
- import { _clearCache } from "../async/resource-cache";
5
- describe("resource — refetchOnFocus", () => {
6
- beforeEach(() => { _clearCache(); });
7
- it("refetches when document becomes visible", async () => {
8
- let call = 0;
9
- const fetcher = vi.fn(() => Promise.resolve(++call));
10
- const r = resource(fetcher, { refetchOnFocus: true });
11
- await vi.waitFor(() => r.status() === "success");
12
- expect(fetcher).toHaveBeenCalledTimes(1);
13
- Object.defineProperty(document, "visibilityState", {
14
- configurable: true,
15
- get: () => "visible",
16
- });
17
- document.dispatchEvent(new Event("visibilitychange"));
18
- await vi.waitFor(() => r.data() === 2);
19
- expect(fetcher).toHaveBeenCalledTimes(2);
20
- r.destroy();
21
- });
22
- it("does not refetch when document becomes hidden", async () => {
23
- const fetcher = vi.fn(() => Promise.resolve(1));
24
- const r = resource(fetcher, { refetchOnFocus: true });
25
- await vi.waitFor(() => r.status() === "success");
26
- Object.defineProperty(document, "visibilityState", {
27
- configurable: true,
28
- get: () => "hidden",
29
- });
30
- document.dispatchEvent(new Event("visibilitychange"));
31
- await new Promise((res) => setTimeout(res, 10));
32
- expect(fetcher).toHaveBeenCalledTimes(1);
33
- r.destroy();
34
- });
35
- it("destroy() removes the visibilitychange listener", async () => {
36
- let call = 0;
37
- const fetcher = vi.fn(() => Promise.resolve(++call));
38
- const r = resource(fetcher, { refetchOnFocus: true });
39
- await vi.waitFor(() => r.status() === "success");
40
- r.destroy();
41
- Object.defineProperty(document, "visibilityState", {
42
- configurable: true,
43
- get: () => "visible",
44
- });
45
- document.dispatchEvent(new Event("visibilitychange"));
46
- await new Promise((res) => setTimeout(res, 10));
47
- expect(fetcher).toHaveBeenCalledTimes(1); // no refetch after destroy
48
- });
49
- });
50
- //# sourceMappingURL=resource-focus.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource-focus.test.js","sourceRoot":"","sources":["../../src/__tests__/resource-focus.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=resource-server-pass.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource-server-pass.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resource-server-pass.test.ts"],"names":[],"mappings":""}
@@ -1,78 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
- import { flushPendingResources, resource } from "../async/resource";
3
- import { _clearCache, getPendingResources } from "../async/resource-cache";
4
- import { setServerRenderPass, isServerRenderPass } from "../async/server-mode";
5
- describe("server render pass — flushPendingResources", () => {
6
- beforeEach(() => { _clearCache(); });
7
- afterEach(() => { setServerRenderPass(false); });
8
- it("is a no-op when no server pass is active", async () => {
9
- setServerRenderPass(false);
10
- const r = resource(() => new Promise(() => { }));
11
- expect(getPendingResources().size).toBe(0);
12
- await flushPendingResources();
13
- // Untouched — resource() never settled and flush didn't wait for it.
14
- expect(r.status()).toBe("pending");
15
- });
16
- it("resolves immediately when nothing is pending", async () => {
17
- setServerRenderPass(true);
18
- await expect(flushPendingResources()).resolves.toBeUndefined();
19
- });
20
- it("tracks isServerRenderPass() state via the setter", () => {
21
- expect(isServerRenderPass()).toBe(false);
22
- setServerRenderPass(true);
23
- expect(isServerRenderPass()).toBe(true);
24
- });
25
- it("awaits an unkeyed resource() (e.g. @Collection) before returning", async () => {
26
- setServerRenderPass(true);
27
- const r = resource(() => new Promise((res) => { setTimeout(() => { res("content"); }, 5); }));
28
- await flushPendingResources();
29
- expect(r.status()).toBe("success");
30
- expect(r.data()).toBe("content");
31
- });
32
- it("awaits a keyed resource() too", async () => {
33
- setServerRenderPass(true);
34
- const r = resource(() => Promise.resolve("keyed-value"), { key: "ssg-key" });
35
- await flushPendingResources();
36
- expect(r.status()).toBe("success");
37
- expect(r.data()).toBe("keyed-value");
38
- });
39
- it("awaits multiple concurrently pending resources", async () => {
40
- setServerRenderPass(true);
41
- const r1 = resource(() => new Promise((res) => { setTimeout(() => { res(1); }, 5); }));
42
- const r2 = resource(() => new Promise((res) => { setTimeout(() => { res(2); }, 10); }));
43
- await flushPendingResources();
44
- expect(r1.data()).toBe(1);
45
- expect(r2.data()).toBe(2);
46
- });
47
- it("fixed-point loop: awaits a resource created while an earlier one settles", async () => {
48
- setServerRenderPass(true);
49
- let second;
50
- // Simulates a component that, upon its first resource resolving, creates a
51
- // second resource (e.g. a detail page fetching related content) — the new
52
- // promise must still be picked up even though it didn't exist yet when
53
- // flushPendingResources() started its first pass.
54
- const first = resource(() => new Promise((res) => {
55
- setTimeout(() => {
56
- res("first");
57
- second = resource(() => new Promise((res2) => { setTimeout(() => { res2("second"); }, 5); }));
58
- }, 5);
59
- }));
60
- await flushPendingResources();
61
- expect(first.status()).toBe("success");
62
- expect(second?.status()).toBe("success");
63
- expect(second?.data()).toBe("second");
64
- });
65
- it("does not leave stale entries after resources settle", async () => {
66
- setServerRenderPass(true);
67
- resource(() => Promise.resolve("done"));
68
- await flushPendingResources();
69
- expect(getPendingResources().size).toBe(0);
70
- });
71
- it("a rejected resource does not hang the flush", async () => {
72
- setServerRenderPass(true);
73
- const r = resource(() => Promise.reject(new Error("boom")));
74
- await expect(flushPendingResources()).resolves.toBeUndefined();
75
- expect(r.status()).toBe("error");
76
- });
77
- });
78
- //# sourceMappingURL=resource-server-pass.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource-server-pass.test.js","sourceRoot":"","sources":["../../src/__tests__/resource-server-pass.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=resource.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resource.test.ts"],"names":[],"mappings":""}