@praxisjs/composables 1.2.1 → 1.2.3
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/CHANGELOG.md +25 -0
- package/dist/browser.d.ts +41 -18
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +114 -114
- package/dist/browser.js.map +1 -1
- package/dist/dom.d.ts +24 -16
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +75 -84
- package/dist/dom.js.map +1 -1
- package/dist/list.d.ts +4 -1
- package/dist/list.d.ts.map +1 -1
- package/dist/list.js +29 -11
- package/dist/list.js.map +1 -1
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +32 -12
- package/dist/upload.js.map +1 -1
- package/dist/utilities.d.ts +13 -1
- package/dist/utilities.d.ts.map +1 -1
- package/dist/utilities.js +88 -26
- package/dist/utilities.js.map +1 -1
- package/package.json +14 -5
- package/src/browser.ts +129 -115
- package/src/dom.ts +77 -85
- package/src/list.ts +29 -10
- package/src/upload.ts +30 -11
- package/src/utilities.ts +101 -24
- package/dist/__tests__/browser.test.d.ts +0 -2
- package/dist/__tests__/browser.test.d.ts.map +0 -1
- package/dist/__tests__/browser.test.js +0 -350
- package/dist/__tests__/browser.test.js.map +0 -1
- package/dist/__tests__/dom.test.d.ts +0 -2
- package/dist/__tests__/dom.test.d.ts.map +0 -1
- package/dist/__tests__/dom.test.js +0 -463
- package/dist/__tests__/dom.test.js.map +0 -1
- package/dist/__tests__/list.test.d.ts +0 -2
- package/dist/__tests__/list.test.d.ts.map +0 -1
- package/dist/__tests__/list.test.js +0 -156
- package/dist/__tests__/list.test.js.map +0 -1
- package/dist/__tests__/upload.test.d.ts +0 -2
- package/dist/__tests__/upload.test.d.ts.map +0 -1
- package/dist/__tests__/upload.test.js +0 -531
- package/dist/__tests__/upload.test.js.map +0 -1
- package/dist/__tests__/utilities.test.d.ts +0 -2
- package/dist/__tests__/utilities.test.d.ts.map +0 -1
- package/dist/__tests__/utilities.test.js +0 -251
- package/dist/__tests__/utilities.test.js.map +0 -1
- package/src/__tests__/browser.test.ts +0 -414
- package/src/__tests__/dom.test.ts +0 -567
- package/src/__tests__/list.test.ts +0 -210
- package/src/__tests__/upload.test.ts +0 -639
- package/src/__tests__/utilities.test.ts +0 -327
- package/tsconfig.json +0 -8
|
@@ -1,463 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
3
|
-
import { effect } from "@praxisjs/core/internal";
|
|
4
|
-
import { WindowSize, ScrollPosition, ElementSize, Intersection, Focus } from "../dom";
|
|
5
|
-
// ── WindowSize ────────────────────────────────────────────────────────────────
|
|
6
|
-
describe("WindowSize", () => {
|
|
7
|
-
it("reads initial window dimensions", () => {
|
|
8
|
-
Object.defineProperty(window, "innerWidth", { value: 1024, configurable: true });
|
|
9
|
-
Object.defineProperty(window, "innerHeight", { value: 768, configurable: true });
|
|
10
|
-
const ws = new WindowSize();
|
|
11
|
-
const { width, height } = ws.setup();
|
|
12
|
-
expect(width()).toBe(1024);
|
|
13
|
-
expect(height()).toBe(768);
|
|
14
|
-
});
|
|
15
|
-
it("updates on resize event", () => {
|
|
16
|
-
Object.defineProperty(window, "innerWidth", { value: 800, configurable: true });
|
|
17
|
-
Object.defineProperty(window, "innerHeight", { value: 600, configurable: true });
|
|
18
|
-
const ws = new WindowSize();
|
|
19
|
-
const { width, height } = ws.setup();
|
|
20
|
-
Object.defineProperty(window, "innerWidth", { value: 1280, configurable: true });
|
|
21
|
-
Object.defineProperty(window, "innerHeight", { value: 900, configurable: true });
|
|
22
|
-
window.dispatchEvent(new Event("resize"));
|
|
23
|
-
expect(width()).toBe(1280);
|
|
24
|
-
expect(height()).toBe(900);
|
|
25
|
-
});
|
|
26
|
-
it("removes listener on unmount", () => {
|
|
27
|
-
const remove = vi.spyOn(window, "removeEventListener");
|
|
28
|
-
const ws = new WindowSize();
|
|
29
|
-
ws.setup();
|
|
30
|
-
ws.onUnmount();
|
|
31
|
-
expect(remove).toHaveBeenCalledWith("resize", expect.any(Function));
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
// ── ScrollPosition ────────────────────────────────────────────────────────────
|
|
35
|
-
describe("ScrollPosition", () => {
|
|
36
|
-
it("starts at (0, 0)", () => {
|
|
37
|
-
const sp = new ScrollPosition(window);
|
|
38
|
-
const { x, y } = sp.setup();
|
|
39
|
-
expect(x()).toBe(0);
|
|
40
|
-
expect(y()).toBe(0);
|
|
41
|
-
});
|
|
42
|
-
it("updates on scroll event for window", () => {
|
|
43
|
-
const sp = new ScrollPosition(window);
|
|
44
|
-
const { x, y } = sp.setup();
|
|
45
|
-
sp.onMount();
|
|
46
|
-
Object.defineProperty(window, "scrollX", { value: 100, configurable: true });
|
|
47
|
-
Object.defineProperty(window, "scrollY", { value: 200, configurable: true });
|
|
48
|
-
window.dispatchEvent(new Event("scroll"));
|
|
49
|
-
expect(x()).toBe(100);
|
|
50
|
-
expect(y()).toBe(200);
|
|
51
|
-
});
|
|
52
|
-
it("updates on scroll event for element", () => {
|
|
53
|
-
const el = document.createElement("div");
|
|
54
|
-
const sp = new ScrollPosition(el);
|
|
55
|
-
const { x, y } = sp.setup();
|
|
56
|
-
sp.onMount();
|
|
57
|
-
Object.defineProperty(el, "scrollLeft", { value: 50, configurable: true });
|
|
58
|
-
Object.defineProperty(el, "scrollTop", { value: 75, configurable: true });
|
|
59
|
-
el.dispatchEvent(new Event("scroll"));
|
|
60
|
-
expect(x()).toBe(50);
|
|
61
|
-
expect(y()).toBe(75);
|
|
62
|
-
});
|
|
63
|
-
it("removes listener on unmount", () => {
|
|
64
|
-
const el = document.createElement("div");
|
|
65
|
-
const remove = vi.spyOn(el, "removeEventListener");
|
|
66
|
-
const sp = new ScrollPosition(el);
|
|
67
|
-
sp.setup();
|
|
68
|
-
sp.onMount();
|
|
69
|
-
sp.onUnmount();
|
|
70
|
-
expect(remove).toHaveBeenCalledWith("scroll", expect.any(Function));
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
// ── ElementSize ───────────────────────────────────────────────────────────────
|
|
74
|
-
describe("ElementSize", () => {
|
|
75
|
-
let observerCallback;
|
|
76
|
-
beforeEach(() => {
|
|
77
|
-
vi.stubGlobal("ResizeObserver", class {
|
|
78
|
-
constructor(cb) { observerCallback = cb; }
|
|
79
|
-
observe = vi.fn();
|
|
80
|
-
disconnect = vi.fn();
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
it("starts at (0, 0) with no element", () => {
|
|
84
|
-
const ref = { current: null };
|
|
85
|
-
const es = new ElementSize(ref);
|
|
86
|
-
const { width, height } = es.setup();
|
|
87
|
-
expect(width()).toBe(0);
|
|
88
|
-
expect(height()).toBe(0);
|
|
89
|
-
});
|
|
90
|
-
it("updates via ResizeObserver callback", () => {
|
|
91
|
-
const el = document.createElement("div");
|
|
92
|
-
const ref = { current: el };
|
|
93
|
-
const es = new ElementSize(ref);
|
|
94
|
-
const { width, height } = es.setup();
|
|
95
|
-
observerCallback([{ contentRect: { width: 300, height: 150 } }], {});
|
|
96
|
-
expect(width()).toBe(300);
|
|
97
|
-
expect(height()).toBe(150);
|
|
98
|
-
});
|
|
99
|
-
it("disconnects observer on unmount", () => {
|
|
100
|
-
const disconnect = vi.fn();
|
|
101
|
-
vi.stubGlobal("ResizeObserver", class {
|
|
102
|
-
constructor(cb) { observerCallback = cb; }
|
|
103
|
-
observe = vi.fn();
|
|
104
|
-
disconnect = disconnect;
|
|
105
|
-
});
|
|
106
|
-
const ref = { current: null };
|
|
107
|
-
const es = new ElementSize(ref);
|
|
108
|
-
es.setup();
|
|
109
|
-
es.onUnmount();
|
|
110
|
-
expect(disconnect).toHaveBeenCalled();
|
|
111
|
-
});
|
|
112
|
-
it("onMount() with null ref is a no-op", () => {
|
|
113
|
-
const ref = { current: null };
|
|
114
|
-
const es = new ElementSize(ref);
|
|
115
|
-
es.setup();
|
|
116
|
-
expect(() => es.onMount()).not.toThrow();
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
// ── Intersection ──────────────────────────────────────────────────────────────
|
|
120
|
-
describe("Intersection", () => {
|
|
121
|
-
let observerCallback;
|
|
122
|
-
beforeEach(() => {
|
|
123
|
-
vi.stubGlobal("IntersectionObserver", class {
|
|
124
|
-
constructor(cb) { observerCallback = cb; }
|
|
125
|
-
observe = vi.fn();
|
|
126
|
-
disconnect = vi.fn();
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
it("starts as not visible", () => {
|
|
130
|
-
const ref = { current: null };
|
|
131
|
-
const int = new Intersection(ref);
|
|
132
|
-
const { visible } = int.setup();
|
|
133
|
-
expect(visible()).toBe(false);
|
|
134
|
-
});
|
|
135
|
-
it("becomes visible when intersecting", () => {
|
|
136
|
-
const el = document.createElement("div");
|
|
137
|
-
const ref = { current: el };
|
|
138
|
-
const int = new Intersection(ref);
|
|
139
|
-
const { visible } = int.setup();
|
|
140
|
-
observerCallback([{ isIntersecting: true }], {});
|
|
141
|
-
expect(visible()).toBe(true);
|
|
142
|
-
});
|
|
143
|
-
it("disconnects on unmount", () => {
|
|
144
|
-
const disconnect = vi.fn();
|
|
145
|
-
vi.stubGlobal("IntersectionObserver", class {
|
|
146
|
-
constructor(cb) { observerCallback = cb; }
|
|
147
|
-
observe = vi.fn();
|
|
148
|
-
disconnect = disconnect;
|
|
149
|
-
});
|
|
150
|
-
const ref = { current: null };
|
|
151
|
-
const int = new Intersection(ref);
|
|
152
|
-
int.setup();
|
|
153
|
-
int.onUnmount();
|
|
154
|
-
expect(disconnect).toHaveBeenCalled();
|
|
155
|
-
});
|
|
156
|
-
it("onMount() calls observe() with the element", () => {
|
|
157
|
-
const observeFn = vi.fn();
|
|
158
|
-
vi.stubGlobal("IntersectionObserver", class {
|
|
159
|
-
constructor(cb) { observerCallback = cb; }
|
|
160
|
-
observe = observeFn;
|
|
161
|
-
disconnect = vi.fn();
|
|
162
|
-
});
|
|
163
|
-
const el = document.createElement("div");
|
|
164
|
-
const ref = { current: el };
|
|
165
|
-
const int = new Intersection(ref);
|
|
166
|
-
int.setup();
|
|
167
|
-
int.onMount();
|
|
168
|
-
expect(observeFn).toHaveBeenCalledWith(el);
|
|
169
|
-
});
|
|
170
|
-
it("onMount() does nothing when ref is null", () => {
|
|
171
|
-
const observeFn = vi.fn();
|
|
172
|
-
vi.stubGlobal("IntersectionObserver", class {
|
|
173
|
-
constructor(cb) { observerCallback = cb; }
|
|
174
|
-
observe = observeFn;
|
|
175
|
-
disconnect = vi.fn();
|
|
176
|
-
});
|
|
177
|
-
const ref = { current: null };
|
|
178
|
-
const int = new Intersection(ref);
|
|
179
|
-
int.setup();
|
|
180
|
-
expect(() => int.onMount()).not.toThrow();
|
|
181
|
-
expect(observeFn).not.toHaveBeenCalled();
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
// ── ElementSize (additional) ──────────────────────────────────────────────────
|
|
185
|
-
describe("ElementSize (additional)", () => {
|
|
186
|
-
it("ref.current changes to a new element: old observer is disconnected and new one started", () => {
|
|
187
|
-
const disconnectFn = vi.fn();
|
|
188
|
-
const observeFn = vi.fn();
|
|
189
|
-
vi.stubGlobal("ResizeObserver", class {
|
|
190
|
-
observe = observeFn;
|
|
191
|
-
disconnect = disconnectFn;
|
|
192
|
-
});
|
|
193
|
-
const el1 = document.createElement("div");
|
|
194
|
-
const ref = { current: el1 };
|
|
195
|
-
const es = new ElementSize(ref);
|
|
196
|
-
es.setup();
|
|
197
|
-
es.onMount();
|
|
198
|
-
// Disconnect old observer and create new one for el2
|
|
199
|
-
es.onUnmount();
|
|
200
|
-
expect(disconnectFn).toHaveBeenCalled();
|
|
201
|
-
const el2 = document.createElement("div");
|
|
202
|
-
ref.current = el2;
|
|
203
|
-
const es2 = new ElementSize(ref);
|
|
204
|
-
es2.setup();
|
|
205
|
-
es2.onMount();
|
|
206
|
-
expect(observeFn).toHaveBeenCalledWith(el2);
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
// ── Intersection (additional) ─────────────────────────────────────────────────
|
|
210
|
-
describe("Intersection (additional)", () => {
|
|
211
|
-
let observerCallback;
|
|
212
|
-
beforeEach(() => {
|
|
213
|
-
vi.stubGlobal("IntersectionObserver", class {
|
|
214
|
-
constructor(cb) { observerCallback = cb; }
|
|
215
|
-
observe = vi.fn();
|
|
216
|
-
disconnect = vi.fn();
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
it("visibility toggles false after being true", () => {
|
|
220
|
-
const el = document.createElement("div");
|
|
221
|
-
const ref = { current: el };
|
|
222
|
-
const int = new Intersection(ref);
|
|
223
|
-
const { visible } = int.setup();
|
|
224
|
-
observerCallback([{ isIntersecting: true }], {});
|
|
225
|
-
expect(visible()).toBe(true);
|
|
226
|
-
observerCallback([{ isIntersecting: false }], {});
|
|
227
|
-
expect(visible()).toBe(false);
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
// ── ScrollPosition (ref-based) ────────────────────────────────────────────────
|
|
231
|
-
describe("ScrollPosition (ref-based)", () => {
|
|
232
|
-
it("accepts a ref object and reads scrollLeft/scrollTop from it", () => {
|
|
233
|
-
const el = document.createElement("div");
|
|
234
|
-
const ref = { current: el };
|
|
235
|
-
const sp = new ScrollPosition(ref);
|
|
236
|
-
const { x, y } = sp.setup();
|
|
237
|
-
sp.onMount();
|
|
238
|
-
Object.defineProperty(el, "scrollLeft", { value: 30, configurable: true });
|
|
239
|
-
Object.defineProperty(el, "scrollTop", { value: 60, configurable: true });
|
|
240
|
-
el.dispatchEvent(new Event("scroll"));
|
|
241
|
-
expect(x()).toBe(30);
|
|
242
|
-
expect(y()).toBe(60);
|
|
243
|
-
});
|
|
244
|
-
it("uses ref.current at mount time — subsequent current changes do not affect the listener target", () => {
|
|
245
|
-
const el = document.createElement("div");
|
|
246
|
-
const ref = { current: el };
|
|
247
|
-
const sp = new ScrollPosition(ref);
|
|
248
|
-
sp.setup();
|
|
249
|
-
sp.onMount();
|
|
250
|
-
const remove = vi.spyOn(el, "removeEventListener");
|
|
251
|
-
sp.onUnmount();
|
|
252
|
-
expect(remove).toHaveBeenCalledWith("scroll", expect.any(Function));
|
|
253
|
-
});
|
|
254
|
-
it("falls back to window when ref.current is null at mount time", () => {
|
|
255
|
-
const ref = { current: null };
|
|
256
|
-
const sp = new ScrollPosition(ref);
|
|
257
|
-
sp.setup();
|
|
258
|
-
// Should not throw; _target falls back to window
|
|
259
|
-
expect(() => sp.onMount()).not.toThrow();
|
|
260
|
-
sp.onUnmount();
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
// ── ScrollPosition (additional) ───────────────────────────────────────────────
|
|
264
|
-
describe("ScrollPosition (additional)", () => {
|
|
265
|
-
it("onMount() called twice registers only one scroll listener", () => {
|
|
266
|
-
const el = document.createElement("div");
|
|
267
|
-
const add = vi.spyOn(el, "addEventListener");
|
|
268
|
-
const sp = new ScrollPosition(el);
|
|
269
|
-
sp.setup();
|
|
270
|
-
sp.onMount();
|
|
271
|
-
sp.onMount(); // second call must be a no-op
|
|
272
|
-
const scrollCalls = add.mock.calls.filter((c) => c[0] === "scroll").length;
|
|
273
|
-
expect(scrollCalls).toBe(1);
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
// ── Focus ─────────────────────────────────────────────────────────────────────
|
|
277
|
-
describe("Focus", () => {
|
|
278
|
-
it("starts as not focused", () => {
|
|
279
|
-
const el = document.createElement("input");
|
|
280
|
-
const ref = { current: el };
|
|
281
|
-
const focus = new Focus(ref);
|
|
282
|
-
const { focused } = focus.setup();
|
|
283
|
-
expect(focused()).toBe(false);
|
|
284
|
-
});
|
|
285
|
-
it("sets focused=true on focus event", () => {
|
|
286
|
-
const el = document.createElement("input");
|
|
287
|
-
document.body.appendChild(el);
|
|
288
|
-
const ref = { current: el };
|
|
289
|
-
const focus = new Focus(ref);
|
|
290
|
-
const { focused } = focus.setup();
|
|
291
|
-
focus.onMount();
|
|
292
|
-
el.dispatchEvent(new Event("focus"));
|
|
293
|
-
expect(focused()).toBe(true);
|
|
294
|
-
document.body.removeChild(el);
|
|
295
|
-
});
|
|
296
|
-
it("sets focused=false on blur event", () => {
|
|
297
|
-
const el = document.createElement("input");
|
|
298
|
-
document.body.appendChild(el);
|
|
299
|
-
const ref = { current: el };
|
|
300
|
-
const focus = new Focus(ref);
|
|
301
|
-
const { focused } = focus.setup();
|
|
302
|
-
focus.onMount();
|
|
303
|
-
el.dispatchEvent(new Event("focus"));
|
|
304
|
-
el.dispatchEvent(new Event("blur"));
|
|
305
|
-
expect(focused()).toBe(false);
|
|
306
|
-
document.body.removeChild(el);
|
|
307
|
-
});
|
|
308
|
-
it("does not throw when ref is null", () => {
|
|
309
|
-
const ref = { current: null };
|
|
310
|
-
const focus = new Focus(ref);
|
|
311
|
-
expect(() => focus.setup()).not.toThrow();
|
|
312
|
-
});
|
|
313
|
-
it("onMount() with null ref is a no-op", () => {
|
|
314
|
-
const ref = { current: null };
|
|
315
|
-
const focus = new Focus(ref);
|
|
316
|
-
focus.setup();
|
|
317
|
-
expect(() => focus.onMount()).not.toThrow();
|
|
318
|
-
});
|
|
319
|
-
it("onUnmount() with null ref is a no-op", () => {
|
|
320
|
-
const ref = { current: null };
|
|
321
|
-
const focus = new Focus(ref);
|
|
322
|
-
focus.setup();
|
|
323
|
-
expect(() => focus.onUnmount()).not.toThrow();
|
|
324
|
-
});
|
|
325
|
-
it("removes focus/blur listeners on unmount", () => {
|
|
326
|
-
const el = document.createElement("input");
|
|
327
|
-
document.body.appendChild(el);
|
|
328
|
-
const ref = { current: el };
|
|
329
|
-
const focus = new Focus(ref);
|
|
330
|
-
focus.setup();
|
|
331
|
-
focus.onMount();
|
|
332
|
-
const remove = vi.spyOn(el, "removeEventListener");
|
|
333
|
-
focus.onUnmount();
|
|
334
|
-
expect(remove).toHaveBeenCalledWith("focus", expect.any(Function));
|
|
335
|
-
expect(remove).toHaveBeenCalledWith("blur", expect.any(Function));
|
|
336
|
-
document.body.removeChild(el);
|
|
337
|
-
});
|
|
338
|
-
it("onMount() called twice registers only one listener pair", () => {
|
|
339
|
-
const el = document.createElement("input");
|
|
340
|
-
document.body.appendChild(el);
|
|
341
|
-
const add = vi.spyOn(el, "addEventListener");
|
|
342
|
-
const ref = { current: el };
|
|
343
|
-
const focus = new Focus(ref);
|
|
344
|
-
focus.setup();
|
|
345
|
-
focus.onMount();
|
|
346
|
-
focus.onMount(); // second call must be a no-op
|
|
347
|
-
const focusCalls = add.mock.calls.filter((c) => c[0] === "focus").length;
|
|
348
|
-
expect(focusCalls).toBe(1);
|
|
349
|
-
document.body.removeChild(el);
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
// ── WindowSize (additional) ───────────────────────────────────────────────────
|
|
353
|
-
describe("WindowSize (additional)", () => {
|
|
354
|
-
it("setup() called twice returns the same view object", () => {
|
|
355
|
-
const ws = new WindowSize();
|
|
356
|
-
const view1 = ws.setup();
|
|
357
|
-
const view2 = ws.setup();
|
|
358
|
-
expect(view1).toBe(view2);
|
|
359
|
-
ws.onUnmount();
|
|
360
|
-
});
|
|
361
|
-
it("setup() called twice registers only one resize listener", () => {
|
|
362
|
-
const add = vi.spyOn(window, "addEventListener");
|
|
363
|
-
const ws = new WindowSize();
|
|
364
|
-
ws.setup();
|
|
365
|
-
ws.setup();
|
|
366
|
-
const resizeCalls = add.mock.calls.filter((c) => c[0] === "resize").length;
|
|
367
|
-
expect(resizeCalls).toBe(1);
|
|
368
|
-
ws.onUnmount();
|
|
369
|
-
vi.restoreAllMocks();
|
|
370
|
-
});
|
|
371
|
-
});
|
|
372
|
-
// ── ElementSize (cache) ───────────────────────────────────────────────────────
|
|
373
|
-
describe("ElementSize (cache)", () => {
|
|
374
|
-
it("setup() called twice returns the same view object", () => {
|
|
375
|
-
const el = document.createElement("div");
|
|
376
|
-
document.body.appendChild(el);
|
|
377
|
-
const ref = { current: el };
|
|
378
|
-
const es = new ElementSize(ref);
|
|
379
|
-
const view1 = es.setup();
|
|
380
|
-
const view2 = es.setup();
|
|
381
|
-
expect(view1).toBe(view2);
|
|
382
|
-
es.onUnmount();
|
|
383
|
-
document.body.removeChild(el);
|
|
384
|
-
});
|
|
385
|
-
});
|
|
386
|
-
// ── Intersection (cache) ──────────────────────────────────────────────────────
|
|
387
|
-
describe("Intersection (cache)", () => {
|
|
388
|
-
it("setup() called twice returns the same view object", () => {
|
|
389
|
-
const el = document.createElement("div");
|
|
390
|
-
document.body.appendChild(el);
|
|
391
|
-
const ref = { current: el };
|
|
392
|
-
const inter = new Intersection(ref);
|
|
393
|
-
const view1 = inter.setup();
|
|
394
|
-
const view2 = inter.setup();
|
|
395
|
-
expect(view1).toBe(view2);
|
|
396
|
-
inter.onUnmount();
|
|
397
|
-
document.body.removeChild(el);
|
|
398
|
-
});
|
|
399
|
-
});
|
|
400
|
-
// ── ScrollPosition (_staticTarget ?? window fallback) ─────────────────────────
|
|
401
|
-
describe("ScrollPosition (_staticTarget fallback)", () => {
|
|
402
|
-
it("falls back to window when _staticTarget is undefined", () => {
|
|
403
|
-
// Default constructor sets _staticTarget = window. After construction we
|
|
404
|
-
// forcibly clear it to undefined (bypassing TypeScript's `private readonly`)
|
|
405
|
-
// so _resolveTarget() exercises the final `return window` branch.
|
|
406
|
-
const sp = new ScrollPosition();
|
|
407
|
-
sp._staticTarget = undefined;
|
|
408
|
-
sp.setup();
|
|
409
|
-
const addSpy = vi.spyOn(window, "addEventListener");
|
|
410
|
-
sp.onMount();
|
|
411
|
-
const scrollCall = addSpy.mock.calls.find((c) => c[0] === "scroll");
|
|
412
|
-
expect(scrollCall).toBeDefined(); // proves _resolveTarget() hit the window fallback
|
|
413
|
-
addSpy.mockRestore();
|
|
414
|
-
sp.onUnmount();
|
|
415
|
-
});
|
|
416
|
-
});
|
|
417
|
-
describe("paired updates re-run dependents once per event", () => {
|
|
418
|
-
function countRuns(read) {
|
|
419
|
-
let runs = 0;
|
|
420
|
-
effect(() => {
|
|
421
|
-
read();
|
|
422
|
-
runs++;
|
|
423
|
-
});
|
|
424
|
-
runs = 0;
|
|
425
|
-
return () => runs;
|
|
426
|
-
}
|
|
427
|
-
it("WindowSize", () => {
|
|
428
|
-
const ws = new WindowSize();
|
|
429
|
-
const { width, height } = ws.setup();
|
|
430
|
-
const runs = countRuns(() => { void width(); void height(); });
|
|
431
|
-
Object.defineProperty(window, "innerWidth", { value: 111, configurable: true });
|
|
432
|
-
Object.defineProperty(window, "innerHeight", { value: 222, configurable: true });
|
|
433
|
-
window.dispatchEvent(new Event("resize"));
|
|
434
|
-
expect(runs()).toBe(1);
|
|
435
|
-
ws.onUnmount();
|
|
436
|
-
});
|
|
437
|
-
it("ScrollPosition", () => {
|
|
438
|
-
const sp = new ScrollPosition(window);
|
|
439
|
-
const { x, y } = sp.setup();
|
|
440
|
-
sp.onMount();
|
|
441
|
-
const runs = countRuns(() => { void x(); void y(); });
|
|
442
|
-
Object.defineProperty(window, "scrollX", { value: 7, configurable: true });
|
|
443
|
-
Object.defineProperty(window, "scrollY", { value: 9, configurable: true });
|
|
444
|
-
window.dispatchEvent(new Event("scroll"));
|
|
445
|
-
expect(runs()).toBe(1);
|
|
446
|
-
sp.onUnmount();
|
|
447
|
-
});
|
|
448
|
-
it("ElementSize", () => {
|
|
449
|
-
let callback;
|
|
450
|
-
vi.stubGlobal("ResizeObserver", class {
|
|
451
|
-
constructor(cb) { callback = cb; }
|
|
452
|
-
observe = vi.fn();
|
|
453
|
-
disconnect = vi.fn();
|
|
454
|
-
});
|
|
455
|
-
const es = new ElementSize({ current: document.createElement("div") });
|
|
456
|
-
const { width, height } = es.setup();
|
|
457
|
-
const runs = countRuns(() => { void width(); void height(); });
|
|
458
|
-
callback([{ contentRect: { width: 10, height: 20 } }], {});
|
|
459
|
-
expect(runs()).toBe(1);
|
|
460
|
-
vi.unstubAllGlobals();
|
|
461
|
-
});
|
|
462
|
-
});
|
|
463
|
-
//# sourceMappingURL=dom.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dom.test.js","sourceRoot":"","sources":["../../src/__tests__/dom.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/list.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import { describe, it, expect, vi } from "vitest";
|
|
3
|
-
import { signal } from "@praxisjs/core/internal";
|
|
4
|
-
// Import from index to cover re-exports
|
|
5
|
-
import { VirtualList } from "../index";
|
|
6
|
-
function makeItems(count) {
|
|
7
|
-
return Array.from({ length: count }, (_, i) => ({ id: i }));
|
|
8
|
-
}
|
|
9
|
-
// ── VirtualList ───────────────────────────────────────────────────────────────
|
|
10
|
-
describe("VirtualList", () => {
|
|
11
|
-
const ITEM_HEIGHT = 50;
|
|
12
|
-
const VIEW_HEIGHT = 600;
|
|
13
|
-
const BUFFER = 3;
|
|
14
|
-
it("setup() returns computed signals for all four properties", () => {
|
|
15
|
-
const ref = { current: null };
|
|
16
|
-
const vl = new VirtualList(ref, () => makeItems(10), ITEM_HEIGHT);
|
|
17
|
-
const view = vl.setup();
|
|
18
|
-
expect(typeof view.visibleItems).toBe("function");
|
|
19
|
-
expect(typeof view.totalHeight).toBe("function");
|
|
20
|
-
expect(typeof view.offsetTop).toBe("function");
|
|
21
|
-
expect(typeof view.offsetBottom).toBe("function");
|
|
22
|
-
});
|
|
23
|
-
it("totalHeight = items.length * itemHeight", () => {
|
|
24
|
-
const ref = { current: null };
|
|
25
|
-
const vl = new VirtualList(ref, () => makeItems(100), ITEM_HEIGHT);
|
|
26
|
-
const { totalHeight } = vl.setup();
|
|
27
|
-
expect(totalHeight()).toBe(100 * ITEM_HEIGHT);
|
|
28
|
-
});
|
|
29
|
-
it("offsetTop = 0 when scrolled to top", () => {
|
|
30
|
-
const ref = { current: null };
|
|
31
|
-
const vl = new VirtualList(ref, () => makeItems(100), ITEM_HEIGHT);
|
|
32
|
-
const { offsetTop } = vl.setup();
|
|
33
|
-
expect(offsetTop()).toBe(0);
|
|
34
|
-
});
|
|
35
|
-
it("visibleItems starts at index 0 with buffer window", () => {
|
|
36
|
-
const ref = { current: null };
|
|
37
|
-
// default viewHeight=600, buffer=3, scrollTop=0
|
|
38
|
-
// startIdx = max(0, floor(0/50) - 3) = 0
|
|
39
|
-
// endIdx = min(99, ceil((0+600)/50) + 3) = min(99, 12+3) = 15
|
|
40
|
-
const vl = new VirtualList(ref, () => makeItems(100), ITEM_HEIGHT, BUFFER);
|
|
41
|
-
const { visibleItems } = vl.setup();
|
|
42
|
-
const items = visibleItems();
|
|
43
|
-
expect(items[0].index).toBe(0);
|
|
44
|
-
expect(items[items.length - 1].index).toBe(15);
|
|
45
|
-
});
|
|
46
|
-
it("visibleItems contains the correct item references", () => {
|
|
47
|
-
const source = makeItems(20);
|
|
48
|
-
const ref = { current: null };
|
|
49
|
-
const vl = new VirtualList(ref, () => source, ITEM_HEIGHT, 0);
|
|
50
|
-
const { visibleItems } = vl.setup();
|
|
51
|
-
const items = visibleItems();
|
|
52
|
-
expect(items[0].item).toBe(source[0]);
|
|
53
|
-
expect(items[0].index).toBe(0);
|
|
54
|
-
});
|
|
55
|
-
it("offsetBottom reflects the hidden rows below the window", () => {
|
|
56
|
-
const ref = { current: null };
|
|
57
|
-
// startIdx=0, endIdx=15, total=100
|
|
58
|
-
// offsetBottom = max(0, 100-1-15) * 50 = 84 * 50 = 4200
|
|
59
|
-
const vl = new VirtualList(ref, () => makeItems(100), ITEM_HEIGHT, BUFFER);
|
|
60
|
-
const { offsetBottom } = vl.setup();
|
|
61
|
-
expect(offsetBottom()).toBe((100 - 1 - 15) * ITEM_HEIGHT);
|
|
62
|
-
});
|
|
63
|
-
it("empty list: all offsets are 0 and visibleItems is empty", () => {
|
|
64
|
-
const ref = { current: null };
|
|
65
|
-
const vl = new VirtualList(ref, () => [], ITEM_HEIGHT);
|
|
66
|
-
const { visibleItems, totalHeight, offsetTop, offsetBottom } = vl.setup();
|
|
67
|
-
expect(visibleItems()).toHaveLength(0);
|
|
68
|
-
expect(totalHeight()).toBe(0);
|
|
69
|
-
expect(offsetTop()).toBe(0);
|
|
70
|
-
expect(offsetBottom()).toBe(0);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
// ── VirtualList — onMount ─────────────────────────────────────────────────────
|
|
74
|
-
describe("VirtualList — onMount", () => {
|
|
75
|
-
const ITEM_HEIGHT = 50;
|
|
76
|
-
it("onMount() with null ref is a no-op", () => {
|
|
77
|
-
const ref = { current: null };
|
|
78
|
-
const vl = new VirtualList(ref, () => makeItems(10), ITEM_HEIGHT);
|
|
79
|
-
vl.setup();
|
|
80
|
-
expect(() => vl.onMount()).not.toThrow();
|
|
81
|
-
});
|
|
82
|
-
it("onMount() sets viewHeight from container's clientHeight when > 0", () => {
|
|
83
|
-
const el = document.createElement("div");
|
|
84
|
-
Object.defineProperty(el, "clientHeight", { value: 400, configurable: true });
|
|
85
|
-
const ref = { current: el };
|
|
86
|
-
const vl = new VirtualList(ref, () => makeItems(100), ITEM_HEIGHT, 0);
|
|
87
|
-
const { visibleItems } = vl.setup();
|
|
88
|
-
vl.onMount();
|
|
89
|
-
// With viewHeight=400 and no buffer: endIdx = min(99, ceil(400/50)-1) = 7
|
|
90
|
-
// Visible range [0..7] = 8 items
|
|
91
|
-
const items = visibleItems();
|
|
92
|
-
expect(items.length).toBeLessThan(100);
|
|
93
|
-
expect(items.length).toBeGreaterThan(0);
|
|
94
|
-
// Specifically: ceil((0+400)/50) + 0 = 8; min(99, 8) = 8 → indices 0..8 = 9 items
|
|
95
|
-
expect(items[items.length - 1].index).toBe(8);
|
|
96
|
-
});
|
|
97
|
-
it("onMount() does not override default viewHeight when clientHeight is 0", () => {
|
|
98
|
-
const el = document.createElement("div");
|
|
99
|
-
Object.defineProperty(el, "clientHeight", { value: 0, configurable: true });
|
|
100
|
-
const ref = { current: el };
|
|
101
|
-
const vl = new VirtualList(ref, () => makeItems(100), ITEM_HEIGHT, 0);
|
|
102
|
-
const { visibleItems } = vl.setup();
|
|
103
|
-
vl.onMount();
|
|
104
|
-
// Default viewHeight=600 preserved; endIdx = min(99, ceil(600/50)) = 12
|
|
105
|
-
const items = visibleItems();
|
|
106
|
-
expect(items[items.length - 1].index).toBe(12);
|
|
107
|
-
});
|
|
108
|
-
it("onMount() registers a scroll listener that updates the window", () => {
|
|
109
|
-
const el = document.createElement("div");
|
|
110
|
-
Object.defineProperty(el, "clientHeight", { value: 0, configurable: true });
|
|
111
|
-
const ref = { current: el };
|
|
112
|
-
const vl = new VirtualList(ref, () => makeItems(100), ITEM_HEIGHT, 0);
|
|
113
|
-
const { offsetTop } = vl.setup();
|
|
114
|
-
vl.onMount();
|
|
115
|
-
expect(offsetTop()).toBe(0);
|
|
116
|
-
Object.defineProperty(el, "scrollTop", { value: 500, configurable: true });
|
|
117
|
-
el.dispatchEvent(new Event("scroll"));
|
|
118
|
-
// scrollTop=500, buffer=0: startIdx = floor(500/50) = 10; offsetTop = 10*50 = 500
|
|
119
|
-
expect(offsetTop()).toBe(500);
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
// ── VirtualList — onUnmount ───────────────────────────────────────────────────
|
|
123
|
-
describe("VirtualList — onUnmount", () => {
|
|
124
|
-
const ITEM_HEIGHT = 50;
|
|
125
|
-
it("onUnmount() removes the scroll listener", () => {
|
|
126
|
-
const el = document.createElement("div");
|
|
127
|
-
const remove = vi.spyOn(el, "removeEventListener");
|
|
128
|
-
const ref = { current: el };
|
|
129
|
-
const vl = new VirtualList(ref, () => makeItems(50), ITEM_HEIGHT);
|
|
130
|
-
vl.setup();
|
|
131
|
-
vl.onMount();
|
|
132
|
-
vl.onUnmount();
|
|
133
|
-
expect(remove).toHaveBeenCalledWith("scroll", expect.any(Function));
|
|
134
|
-
});
|
|
135
|
-
it("onUnmount() without prior onMount() does not throw", () => {
|
|
136
|
-
const ref = { current: null };
|
|
137
|
-
const vl = new VirtualList(ref, () => makeItems(10), ITEM_HEIGHT);
|
|
138
|
-
vl.setup();
|
|
139
|
-
expect(() => vl.onUnmount()).not.toThrow();
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
// ── VirtualList — reactive getItems ──────────────────────────────────────────
|
|
143
|
-
describe("VirtualList — reactive getItems", () => {
|
|
144
|
-
it("visibleItems updates when the source signal changes", () => {
|
|
145
|
-
const itemsSignal = signal(makeItems(5));
|
|
146
|
-
const ref = { current: null };
|
|
147
|
-
const vl = new VirtualList(ref, () => itemsSignal(), 50);
|
|
148
|
-
const { visibleItems, totalHeight } = vl.setup();
|
|
149
|
-
expect(totalHeight()).toBe(250);
|
|
150
|
-
expect(visibleItems()).toHaveLength(5);
|
|
151
|
-
itemsSignal.set(makeItems(10));
|
|
152
|
-
expect(totalHeight()).toBe(500);
|
|
153
|
-
expect(visibleItems()).toHaveLength(10);
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
//# sourceMappingURL=list.test.js.map
|