@ng-org/alien-deepsignals 0.1.2-alpha.11 → 0.1.2-alpha.12

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 (47) hide show
  1. package/dist/core.d.ts +5 -1
  2. package/dist/core.d.ts.map +1 -1
  3. package/dist/core.js +11 -11
  4. package/dist/deepSignal.d.ts +1 -1
  5. package/dist/deepSignal.d.ts.map +1 -1
  6. package/dist/deepSignal.js +16 -27
  7. package/dist/hooks/react/index.js +2 -8
  8. package/dist/hooks/react/useDeepSignal.d.ts +2 -2
  9. package/dist/hooks/react/useDeepSignal.d.ts.map +1 -1
  10. package/dist/hooks/react/useDeepSignal.js +11 -13
  11. package/dist/hooks/svelte/index.js +2 -8
  12. package/dist/hooks/svelte/useDeepSignal.svelte.d.ts +1 -1
  13. package/dist/hooks/svelte/useDeepSignal.svelte.d.ts.map +1 -1
  14. package/dist/hooks/svelte/useDeepSignal.svelte.js +6 -9
  15. package/dist/hooks/svelte4/index.js +2 -8
  16. package/dist/hooks/svelte4/useDeepSignal.svelte.d.ts +1 -1
  17. package/dist/hooks/svelte4/useDeepSignal.svelte.d.ts.map +1 -1
  18. package/dist/hooks/svelte4/useDeepSignal.svelte.js +14 -17
  19. package/dist/hooks/vue/index.d.ts +1 -1
  20. package/dist/hooks/vue/index.d.ts.map +1 -1
  21. package/dist/hooks/vue/index.js +2 -8
  22. package/dist/hooks/vue/useDeepSignal.d.ts +1 -1
  23. package/dist/hooks/vue/useDeepSignal.d.ts.map +1 -1
  24. package/dist/hooks/vue/useDeepSignal.js +6 -9
  25. package/dist/index.d.ts +4 -4
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +4 -27
  28. package/dist/iteratorHelpers.js +2 -6
  29. package/dist/test/frontend/astro-app/src/components/ReactPanel.d.ts.map +1 -1
  30. package/dist/test/frontend/astro-app/src/components/ReactPanel.jsx +13 -51
  31. package/dist/test/frontend/playwright/crossFrameworkHooks.spec.js +24 -26
  32. package/dist/test/frontend/utils/mockData.js +16 -21
  33. package/dist/test/frontend/utils/paths.js +2 -6
  34. package/dist/test/frontend/utils/renderMetrics.js +5 -12
  35. package/dist/test/frontend/utils/state.d.ts +1 -1
  36. package/dist/test/frontend/utils/state.js +13 -17
  37. package/dist/test/lib/deepSignalOptions.test.js +66 -68
  38. package/dist/test/lib/index.test.js +373 -375
  39. package/dist/test/lib/misc.test.js +98 -100
  40. package/dist/test/lib/watch.test.js +355 -357
  41. package/dist/types.d.ts +1 -1
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/types.js +1 -2
  44. package/dist/watch.d.ts +1 -1
  45. package/dist/watch.d.ts.map +1 -1
  46. package/dist/watch.js +6 -9
  47. package/package.json +2 -1
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  // Copyright (c) 2025 Laurin Weger, Par le Peuple, NextGraph.org developers
3
2
  // All rights reserved.
4
3
  // Licensed under the Apache License, Version 2.0
@@ -8,66 +7,65 @@
8
7
  // notice may not be copied, modified, or distributed except
9
8
  // according to those terms.
10
9
  // SPDX-License-Identifier: Apache-2.0 OR MIT
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- const vitest_1 = require("vitest");
13
- const deepSignal_1 = require("../../deepSignal");
14
- const watch_1 = require("../../watch");
15
- (0, vitest_1.describe)("watch advanced", () => {
16
- (0, vitest_1.it)("basic patch watcher fires on deep mutations", async () => {
17
- const st = (0, deepSignal_1.deepSignal)({ a: { b: { c: 1 } } });
10
+ import { describe, it, expect, vi } from "vitest";
11
+ import { deepSignal, getDeepSignalRootId } from "../../deepSignal.js";
12
+ import { watch } from "../../watch.js";
13
+ describe("watch advanced", () => {
14
+ it("basic patch watcher fires on deep mutations", async () => {
15
+ const st = deepSignal({ a: { b: { c: 1 } } });
18
16
  let batches = 0;
19
- (0, watch_1.watch)(st, ({ patches }) => {
17
+ watch(st, ({ patches }) => {
20
18
  if (patches.length)
21
19
  batches++;
22
20
  });
23
21
  st.a.b.c = 2;
24
22
  st.a.b = { c: 3 };
25
23
  await Promise.resolve();
26
- (0, vitest_1.expect)(batches).toBeGreaterThan(0);
24
+ expect(batches).toBeGreaterThan(0);
27
25
  });
28
- (0, vitest_1.it)("watch once option still stops after first batch", async () => {
29
- const st = (0, deepSignal_1.deepSignal)({ a: 1 });
26
+ it("watch once option still stops after first batch", async () => {
27
+ const st = deepSignal({ a: 1 });
30
28
  let count = 0;
31
- (0, watch_1.watch)(st, () => {
29
+ watch(st, () => {
32
30
  count++;
33
31
  }, { once: true, immediate: true });
34
32
  st.a = 2;
35
33
  st.a = 3;
36
34
  await Promise.resolve();
37
- (0, vitest_1.expect)(count).toBe(1);
35
+ expect(count).toBe(1);
38
36
  });
39
37
  });
40
- (0, vitest_1.describe)("patches & root ids", () => {
41
- (0, vitest_1.it)("root ids are unique", () => {
42
- const a = (0, deepSignal_1.deepSignal)({});
43
- const b = (0, deepSignal_1.deepSignal)({});
44
- (0, vitest_1.expect)((0, deepSignal_1.getDeepSignalRootId)(a)).not.toBe((0, deepSignal_1.getDeepSignalRootId)(b));
38
+ describe("patches & root ids", () => {
39
+ it("root ids are unique", () => {
40
+ const a = deepSignal({});
41
+ const b = deepSignal({});
42
+ expect(getDeepSignalRootId(a)).not.toBe(getDeepSignalRootId(b));
45
43
  });
46
44
  // legacy watchPatches API removed; patch mode only valid for deepSignal roots
47
- (0, vitest_1.it)("watch throws on non-deepSignal input", () => {
48
- (0, vitest_1.expect)(() => (0, watch_1.watch)({}, () => { })).toThrow();
45
+ it("watch throws on non-deepSignal input", () => {
46
+ expect(() => watch({}, () => { })).toThrow();
49
47
  });
50
- (0, vitest_1.it)("Map unsupported does not emit patches", async () => {
48
+ it("Map unsupported does not emit patches", async () => {
51
49
  const m = new Map();
52
- const st = (0, deepSignal_1.deepSignal)({ m });
50
+ const st = deepSignal({ m });
53
51
  const patches = [];
54
- const { stopListening: stop } = (0, watch_1.watch)(st, ({ patches: batch }) => patches.push(batch));
52
+ const { stopListening: stop } = watch(st, ({ patches: batch }) => patches.push(batch));
55
53
  m.set("a", 1);
56
54
  await Promise.resolve();
57
55
  await Promise.resolve();
58
- (0, vitest_1.expect)(patches.length).toBe(0);
56
+ expect(patches.length).toBe(0);
59
57
  stop();
60
58
  });
61
59
  });
62
- (0, vitest_1.describe)("Set iteration variants", () => {
63
- (0, vitest_1.it)("entries() iteration proxies nested mutation", async () => {
64
- const st = (0, deepSignal_1.deepSignal)({ s: new Set() }, {
60
+ describe("Set iteration variants", () => {
61
+ it("entries() iteration proxies nested mutation", async () => {
62
+ const st = deepSignal({ s: new Set() }, {
65
63
  syntheticIdPropertyName: "id",
66
64
  propGenerator: ({ object }) => ({ syntheticId: object.id }),
67
65
  });
68
66
  st.s.add({ id: "eEnt", inner: { v: 1 } });
69
67
  const paths = [];
70
- const { stopListening: stop } = (0, watch_1.watch)(st, ({ patches }) => paths.push(...patches.map((pp) => pp.path.join("."))));
68
+ const { stopListening: stop } = watch(st, ({ patches }) => paths.push(...patches.map((pp) => pp.path.join("."))));
71
69
  for (const [val] of st.s.entries()) {
72
70
  val.inner.v;
73
71
  } // ensure proxy
@@ -76,16 +74,16 @@ const watch_1 = require("../../watch");
76
74
  }
77
75
  await Promise.resolve();
78
76
  await Promise.resolve();
79
- (0, vitest_1.expect)(paths.some((p) => p.endsWith("eEnt.inner.v"))).toBe(true);
77
+ expect(paths.some((p) => p.endsWith("eEnt.inner.v"))).toBe(true);
80
78
  stop();
81
79
  });
82
- (0, vitest_1.it)("forEach iteration proxies nested mutation", async () => {
83
- const st = (0, deepSignal_1.deepSignal)({ s: new Set() }, {
80
+ it("forEach iteration proxies nested mutation", async () => {
81
+ const st = deepSignal({ s: new Set() }, {
84
82
  syntheticIdPropertyName: "id",
85
83
  propGenerator: ({ object }) => ({ syntheticId: object.id }),
86
84
  });
87
85
  st.s.add({ id: "fe1", data: { n: 1 } });
88
- const { stopListening: stop } = (0, watch_1.watch)(st, () => { });
86
+ const { stopListening: stop } = watch(st, () => { });
89
87
  st.s.forEach((e) => e.data.n); // access
90
88
  st.s.forEach((e) => {
91
89
  e.data.n = 2;
@@ -94,13 +92,13 @@ const watch_1 = require("../../watch");
94
92
  await Promise.resolve();
95
93
  stop();
96
94
  });
97
- (0, vitest_1.it)("keys() iteration returns proxies", async () => {
98
- const st = (0, deepSignal_1.deepSignal)({ s: new Set() }, {
95
+ it("keys() iteration returns proxies", async () => {
96
+ const st = deepSignal({ s: new Set() }, {
99
97
  syntheticIdPropertyName: "id",
100
98
  propGenerator: ({ object }) => ({ syntheticId: object.id }),
101
99
  });
102
100
  st.s.add({ id: "k1", foo: { x: 1 } });
103
- const { stopListening: stop } = (0, watch_1.watch)(st, () => { });
101
+ const { stopListening: stop } = watch(st, () => { });
104
102
  for (const e of st.s.keys()) {
105
103
  e.foo.x = 2;
106
104
  }
@@ -108,41 +106,41 @@ const watch_1 = require("../../watch");
108
106
  await Promise.resolve();
109
107
  stop();
110
108
  });
111
- (0, vitest_1.it)("iterator helpers exist on Set iterators and the root Set", () => {
112
- const st = (0, deepSignal_1.deepSignal)({ s: new Set([1, 2, 3]) });
109
+ it("iterator helpers exist on Set iterators and the root Set", () => {
110
+ const st = deepSignal({ s: new Set([1, 2, 3]) });
113
111
  const viaIterator = st.s
114
112
  .values()
115
113
  .map((value) => value * 2)
116
114
  .filter((value) => value > 2)
117
115
  .toArray();
118
- (0, vitest_1.expect)(viaIterator).to.deep.equal([4, 6]);
116
+ expect(viaIterator).to.deep.equal([4, 6]);
119
117
  const viaRoot = st.s
120
118
  .map((value) => value + 1)
121
119
  .take(2)
122
120
  .toArray();
123
- (0, vitest_1.expect)(viaRoot).to.deep.equal([2, 3]);
121
+ expect(viaRoot).to.deep.equal([2, 3]);
124
122
  });
125
- (0, vitest_1.it)("set iterator helpers return proxied objects", async () => {
126
- const st = (0, deepSignal_1.deepSignal)({ s: new Set() }, {
123
+ it("set iterator helpers return proxied objects", async () => {
124
+ const st = deepSignal({ s: new Set() }, {
127
125
  syntheticIdPropertyName: "id",
128
126
  propGenerator: ({ object }) => ({ syntheticId: object.id }),
129
127
  });
130
128
  st.s.add({ id: "obj1", nested: { value: 1 } });
131
129
  const [entry] = st.s.map((value) => value).toArray();
132
130
  const paths = [];
133
- const { stopListening: stop } = (0, watch_1.watch)(st, ({ patches }) => paths.push(...patches.map((pp) => pp.path.join("."))));
131
+ const { stopListening: stop } = watch(st, ({ patches }) => paths.push(...patches.map((pp) => pp.path.join("."))));
134
132
  entry.nested.value = 5;
135
133
  await Promise.resolve();
136
134
  await Promise.resolve();
137
- (0, vitest_1.expect)(paths.some((p) => p.endsWith("obj1.nested.value"))).to.equal(true);
135
+ expect(paths.some((p) => p.endsWith("obj1.nested.value"))).to.equal(true);
138
136
  stop();
139
137
  });
140
138
  });
141
- (0, vitest_1.describe)("external subscribers", () => {
142
- (0, vitest_1.it)("onGet / onSet are called for basic types", () => {
143
- const onGet = vitest_1.vi.fn(() => { });
144
- const onSet = vitest_1.vi.fn(() => { });
145
- const ds = (0, deepSignal_1.deepSignal)({
139
+ describe("external subscribers", () => {
140
+ it("onGet / onSet are called for basic types", () => {
141
+ const onGet = vi.fn(() => { });
142
+ const onSet = vi.fn(() => { });
143
+ const ds = deepSignal({
146
144
  s1: "str",
147
145
  o1: {
148
146
  i1: 1,
@@ -152,92 +150,92 @@ const watch_1 = require("../../watch");
152
150
  let setCount = 0;
153
151
  let getCount = 0;
154
152
  ds.o1;
155
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 1));
156
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes(setCount);
153
+ expect(onGet).toHaveBeenCalledTimes((getCount += 1));
154
+ expect(onSet).toHaveBeenCalledTimes(setCount);
157
155
  ds.o1.b1;
158
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 2));
159
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes(setCount);
156
+ expect(onGet).toHaveBeenCalledTimes((getCount += 2));
157
+ expect(onSet).toHaveBeenCalledTimes(setCount);
160
158
  ds.s1 = "new string";
161
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes(getCount);
159
+ expect(onGet).toHaveBeenCalledTimes(getCount);
162
160
  // We didn't track s1 yet so set won't be called.
163
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes(setCount);
161
+ expect(onSet).toHaveBeenCalledTimes(setCount);
164
162
  ds.s1;
165
163
  ds.s1 = "new string2";
166
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 1));
167
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 1));
164
+ expect(onGet).toHaveBeenCalledTimes((getCount += 1));
165
+ expect(onSet).toHaveBeenCalledTimes((setCount += 1));
168
166
  ds.o1 = { b1: true, i1: 2 };
169
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes(getCount);
170
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 1));
167
+ expect(onGet).toHaveBeenCalledTimes(getCount);
168
+ expect(onSet).toHaveBeenCalledTimes((setCount += 1));
171
169
  });
172
- (0, vitest_1.it)("onGet / onSet are called for sets", () => {
173
- const onGet = vitest_1.vi.fn(() => {
170
+ it("onGet / onSet are called for sets", () => {
171
+ const onGet = vi.fn(() => {
174
172
  // No op
175
173
  let a;
176
174
  });
177
- const onSet = vitest_1.vi.fn(() => {
175
+ const onSet = vi.fn(() => {
178
176
  // no op
179
177
  let a;
180
178
  });
181
- const createSubscriber = vitest_1.vi.fn(() => ({ onGet, onSet }));
182
- const ds = (0, deepSignal_1.deepSignal)({
179
+ const createSubscriber = vi.fn(() => ({ onGet, onSet }));
180
+ const ds = deepSignal({
183
181
  set1: new Set([{ s1: "s1 in set" }]),
184
182
  set2: new Set([1, 2, 3]),
185
183
  }, { subscriberFactories: new Set([createSubscriber]) });
186
184
  let setCount = 0;
187
185
  let getCount = 0;
188
186
  ds.set1.first().s1;
189
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 3));
190
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 0));
187
+ expect(onGet).toHaveBeenCalledTimes((getCount += 3));
188
+ expect(onSet).toHaveBeenCalledTimes((setCount += 0));
191
189
  ds.set1.first().s1 = "s1 new value";
192
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 2));
193
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 1));
190
+ expect(onGet).toHaveBeenCalledTimes((getCount += 2));
191
+ expect(onSet).toHaveBeenCalledTimes((setCount += 1));
194
192
  ds.set1.add({ s1: "s1.2 in set" });
195
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 2));
196
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 1));
193
+ expect(onGet).toHaveBeenCalledTimes((getCount += 2));
194
+ expect(onSet).toHaveBeenCalledTimes((setCount += 1));
197
195
  ds.set2.size; // Track.
198
196
  ds.set2.delete(2);
199
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 4));
200
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 1));
197
+ expect(onGet).toHaveBeenCalledTimes((getCount += 4));
198
+ expect(onSet).toHaveBeenCalledTimes((setCount += 1));
201
199
  ds.set2.delete(2);
202
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 1));
203
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 0));
200
+ expect(onGet).toHaveBeenCalledTimes((getCount += 1));
201
+ expect(onSet).toHaveBeenCalledTimes((setCount += 0));
204
202
  ds.set2.add(4);
205
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 2));
206
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 1));
203
+ expect(onGet).toHaveBeenCalledTimes((getCount += 2));
204
+ expect(onSet).toHaveBeenCalledTimes((setCount += 1));
207
205
  ds.set2.add(4);
208
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 1));
209
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 0));
210
- (0, vitest_1.expect)(ds.set2.has(4)).toBe(true);
211
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 2));
212
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 0));
206
+ expect(onGet).toHaveBeenCalledTimes((getCount += 1));
207
+ expect(onSet).toHaveBeenCalledTimes((setCount += 0));
208
+ expect(ds.set2.has(4)).toBe(true);
209
+ expect(onGet).toHaveBeenCalledTimes((getCount += 2));
210
+ expect(onSet).toHaveBeenCalledTimes((setCount += 0));
213
211
  const isDisjoint = ds.set2.isDisjointFrom(new Set([8]));
214
- (0, vitest_1.expect)(isDisjoint).toBe(true);
215
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 2));
216
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 0));
217
- (0, vitest_1.expect)(ds.set1.size).toBe(2);
218
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 2));
219
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 0));
220
- (0, vitest_1.expect)(ds.set1.getById("")).toBe(undefined);
221
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 1));
222
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 0));
212
+ expect(isDisjoint).toBe(true);
213
+ expect(onGet).toHaveBeenCalledTimes((getCount += 2));
214
+ expect(onSet).toHaveBeenCalledTimes((setCount += 0));
215
+ expect(ds.set1.size).toBe(2);
216
+ expect(onGet).toHaveBeenCalledTimes((getCount += 2));
217
+ expect(onSet).toHaveBeenCalledTimes((setCount += 0));
218
+ expect(ds.set1.getById("")).toBe(undefined);
219
+ expect(onGet).toHaveBeenCalledTimes((getCount += 1));
220
+ expect(onSet).toHaveBeenCalledTimes((setCount += 0));
223
221
  ds.set2.clear();
224
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 2));
225
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 1));
222
+ expect(onGet).toHaveBeenCalledTimes((getCount += 2));
223
+ expect(onSet).toHaveBeenCalledTimes((setCount += 1));
226
224
  ds.set2.clear();
227
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 1));
228
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 0));
225
+ expect(onGet).toHaveBeenCalledTimes((getCount += 1));
226
+ expect(onSet).toHaveBeenCalledTimes((setCount += 0));
229
227
  let counter = 0;
230
228
  for (const _item of ds.set1) {
231
229
  counter += 1;
232
230
  }
233
- (0, vitest_1.expect)(counter).toBe(2);
234
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 2));
235
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 0));
231
+ expect(counter).toBe(2);
232
+ expect(onGet).toHaveBeenCalledTimes((getCount += 2));
233
+ expect(onSet).toHaveBeenCalledTimes((setCount += 0));
236
234
  let concatenated = ds.set1.reduce((previous, current) => {
237
235
  return `${previous}_${current.s1}`;
238
236
  }, "");
239
- (0, vitest_1.expect)(concatenated).toBe("_s1 new value_s1.2 in set");
240
- (0, vitest_1.expect)(onGet).toHaveBeenCalledTimes((getCount += 4));
241
- (0, vitest_1.expect)(onSet).toHaveBeenCalledTimes((setCount += 0));
237
+ expect(concatenated).toBe("_s1 new value_s1.2 in set");
238
+ expect(onGet).toHaveBeenCalledTimes((getCount += 4));
239
+ expect(onSet).toHaveBeenCalledTimes((setCount += 0));
242
240
  });
243
241
  });