@praxisjs/decorators 0.4.1 → 0.4.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.
Files changed (63) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/__tests__/component.test.d.ts +2 -0
  3. package/dist/__tests__/component.test.d.ts.map +1 -0
  4. package/dist/__tests__/component.test.js +137 -0
  5. package/dist/__tests__/component.test.js.map +1 -0
  6. package/dist/__tests__/events.test.d.ts +2 -0
  7. package/dist/__tests__/events.test.d.ts.map +1 -0
  8. package/dist/__tests__/events.test.js +190 -0
  9. package/dist/__tests__/events.test.js.map +1 -0
  10. package/dist/__tests__/functions.test.d.ts +2 -0
  11. package/dist/__tests__/functions.test.d.ts.map +1 -0
  12. package/dist/__tests__/functions.test.js +427 -0
  13. package/dist/__tests__/functions.test.js.map +1 -0
  14. package/dist/__tests__/lazy.test.d.ts +2 -0
  15. package/dist/__tests__/lazy.test.d.ts.map +1 -0
  16. package/dist/__tests__/lazy.test.js +165 -0
  17. package/dist/__tests__/lazy.test.js.map +1 -0
  18. package/dist/__tests__/memo.test.d.ts +2 -0
  19. package/dist/__tests__/memo.test.d.ts.map +1 -0
  20. package/dist/__tests__/memo.test.js +79 -0
  21. package/dist/__tests__/memo.test.js.map +1 -0
  22. package/dist/__tests__/properties-browser.test.d.ts +2 -0
  23. package/dist/__tests__/properties-browser.test.d.ts.map +1 -0
  24. package/dist/__tests__/properties-browser.test.js +178 -0
  25. package/dist/__tests__/properties-browser.test.js.map +1 -0
  26. package/dist/__tests__/properties.test.d.ts +2 -0
  27. package/dist/__tests__/properties.test.d.ts.map +1 -0
  28. package/dist/__tests__/properties.test.js +571 -0
  29. package/dist/__tests__/properties.test.js.map +1 -0
  30. package/dist/__tests__/slot.test.d.ts +2 -0
  31. package/dist/__tests__/slot.test.d.ts.map +1 -0
  32. package/dist/__tests__/slot.test.js +115 -0
  33. package/dist/__tests__/slot.test.js.map +1 -0
  34. package/dist/__tests__/virtual.test.d.ts +2 -0
  35. package/dist/__tests__/virtual.test.d.ts.map +1 -0
  36. package/dist/__tests__/virtual.test.js +201 -0
  37. package/dist/__tests__/virtual.test.js.map +1 -0
  38. package/dist/component/lazy.d.ts +1 -1
  39. package/dist/component/lazy.d.ts.map +1 -1
  40. package/dist/component/lazy.js +4 -1
  41. package/dist/component/lazy.js.map +1 -1
  42. package/dist/component/virtual.d.ts +1 -1
  43. package/dist/component/virtual.d.ts.map +1 -1
  44. package/dist/functions/watch.d.ts.map +1 -1
  45. package/dist/functions/watch.js +10 -2
  46. package/dist/functions/watch.js.map +1 -1
  47. package/dist/properties/history.d.ts.map +1 -1
  48. package/dist/properties/history.js +4 -8
  49. package/dist/properties/history.js.map +1 -1
  50. package/package.json +2 -2
  51. package/src/__tests__/component.test.ts +156 -0
  52. package/src/__tests__/events.test.ts +236 -0
  53. package/src/__tests__/functions.test.ts +549 -0
  54. package/src/__tests__/lazy.test.ts +220 -0
  55. package/src/__tests__/memo.test.ts +90 -0
  56. package/src/__tests__/properties-browser.test.ts +234 -0
  57. package/src/__tests__/properties.test.ts +725 -0
  58. package/src/__tests__/slot.test.ts +141 -0
  59. package/src/__tests__/virtual.test.ts +241 -0
  60. package/src/component/lazy.ts +4 -2
  61. package/src/component/virtual.tsx +1 -1
  62. package/src/functions/watch.ts +11 -2
  63. package/src/properties/history.ts +4 -8
@@ -0,0 +1,427 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { Bind } from "../functions/bind";
3
+ import { Debounce } from "../functions/debounce";
4
+ import { Log } from "../functions/log";
5
+ import { Once } from "../functions/once";
6
+ import { Retry } from "../functions/retry";
7
+ import { Throttle } from "../functions/throttle";
8
+ // Helpers to simulate TC39 decorator context
9
+ function mockMethodContext(name) {
10
+ const initializers = [];
11
+ const ctx = {
12
+ name,
13
+ kind: "method",
14
+ addInitializer(fn) {
15
+ initializers.push(fn);
16
+ },
17
+ runInitializers(instance) {
18
+ initializers.forEach((fn) => { fn.call(instance); });
19
+ },
20
+ };
21
+ return ctx;
22
+ }
23
+ // ── Once ─────────────────────────────────────────────────────────────────────
24
+ describe("Once", () => {
25
+ it("only calls the original function once", () => {
26
+ const original = vi.fn(() => 42);
27
+ const ctx = mockMethodContext("doSomething");
28
+ const wrapped = Once()(original, ctx);
29
+ const obj = {};
30
+ expect(wrapped.call(obj)).toBe(42);
31
+ expect(wrapped.call(obj)).toBe(42);
32
+ expect(original).toHaveBeenCalledTimes(1);
33
+ });
34
+ it("returns the same result on subsequent calls", () => {
35
+ let counter = 0;
36
+ const original = () => ++counter;
37
+ const ctx = mockMethodContext("inc");
38
+ const wrapped = Once()(original, ctx);
39
+ const obj = {};
40
+ wrapped.call(obj);
41
+ wrapped.call(obj);
42
+ wrapped.call(obj);
43
+ expect(counter).toBe(1);
44
+ });
45
+ it("is per-instance — different instances call independently", () => {
46
+ const original = vi.fn(() => "result");
47
+ const ctx = mockMethodContext("fn");
48
+ const wrapped = Once()(original, ctx);
49
+ const a = {};
50
+ const b = {};
51
+ wrapped.call(a);
52
+ wrapped.call(b);
53
+ expect(original).toHaveBeenCalledTimes(2);
54
+ });
55
+ });
56
+ // ── Retry ─────────────────────────────────────────────────────────────────────
57
+ describe("Retry", () => {
58
+ it("returns result if the first attempt succeeds", async () => {
59
+ const original = vi.fn(async () => "ok");
60
+ const ctx = mockMethodContext("fetch");
61
+ const wrapped = Retry(3)(original, ctx);
62
+ const result = await wrapped.call({});
63
+ expect(result).toBe("ok");
64
+ expect(original).toHaveBeenCalledTimes(1);
65
+ });
66
+ it("retries and succeeds on a later attempt", async () => {
67
+ let attempt = 0;
68
+ const original = vi.fn(async () => {
69
+ attempt++;
70
+ if (attempt < 3)
71
+ throw new Error("fail");
72
+ return "success";
73
+ });
74
+ const ctx = mockMethodContext("call");
75
+ const wrapped = Retry(3)(original, ctx);
76
+ const result = await wrapped.call({});
77
+ expect(result).toBe("success");
78
+ expect(original).toHaveBeenCalledTimes(3);
79
+ });
80
+ it("throws after exhausting all attempts", async () => {
81
+ const original = vi.fn(async () => {
82
+ throw new Error("always fails");
83
+ });
84
+ const ctx = mockMethodContext("bad");
85
+ const wrapped = Retry(3)(original, ctx);
86
+ await expect(wrapped.call({})).rejects.toThrow("always fails");
87
+ expect(original).toHaveBeenCalledTimes(3);
88
+ });
89
+ it("applies delay+backoff between retries", async () => {
90
+ vi.useFakeTimers();
91
+ const original = vi.fn(async () => { throw new Error("fail"); });
92
+ const ctx = mockMethodContext("delayed");
93
+ const wrapped = Retry(3, { delay: 100, backoff: 2 })(original, ctx);
94
+ const p = wrapped.call({});
95
+ const rejection = expect(p).rejects.toThrow("fail");
96
+ await vi.runAllTimersAsync();
97
+ await rejection;
98
+ expect(original).toHaveBeenCalledTimes(3);
99
+ vi.useRealTimers();
100
+ });
101
+ it("calls onRetry callback for each failed attempt (except last)", async () => {
102
+ const onRetry = vi.fn();
103
+ const original = vi.fn(async () => {
104
+ throw new Error("err");
105
+ });
106
+ const ctx = mockMethodContext("op");
107
+ const wrapped = Retry(3, { onRetry })(original, ctx);
108
+ await expect(wrapped.call({})).rejects.toThrow();
109
+ expect(onRetry).toHaveBeenCalledTimes(2); // attempts 1 and 2, not the last
110
+ });
111
+ it("maxAttempts=1 fails immediately without retrying", async () => {
112
+ const original = vi.fn(async () => { throw new Error("instant fail"); });
113
+ const ctx = mockMethodContext("once");
114
+ const wrapped = Retry(1)(original, ctx);
115
+ await expect(wrapped.call({})).rejects.toThrow("instant fail");
116
+ expect(original).toHaveBeenCalledTimes(1);
117
+ });
118
+ it("non-Error throw is wrapped in an Error", async () => {
119
+ const original = vi.fn(async () => {
120
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
121
+ throw "string error";
122
+ });
123
+ const ctx = mockMethodContext("strThrow");
124
+ const wrapped = Retry(1)(original, ctx);
125
+ await expect(wrapped.call({})).rejects.toThrow("string error");
126
+ });
127
+ it("maxAttempts=0 throws immediately without calling the function", async () => {
128
+ const original = vi.fn(async () => "ok");
129
+ const ctx = mockMethodContext("never");
130
+ const wrapped = Retry(0)(original, ctx);
131
+ await expect(wrapped.call({})).rejects.toThrow("Unknown error");
132
+ expect(original).not.toHaveBeenCalled();
133
+ });
134
+ it("onRetry receives the correct attempt number", async () => {
135
+ const attempts = [];
136
+ const original = vi.fn(async () => { throw new Error("fail"); });
137
+ const ctx = mockMethodContext("numbered");
138
+ const wrapped = Retry(3, {
139
+ onRetry: (_err, attempt) => { attempts.push(attempt); },
140
+ })(original, ctx);
141
+ await expect(wrapped.call({})).rejects.toThrow();
142
+ expect(attempts).toEqual([1, 2]); // attempt 1 failed → onRetry(1), attempt 2 failed → onRetry(2)
143
+ });
144
+ it("backoff multiplies delay correctly", async () => {
145
+ vi.useFakeTimers();
146
+ const callTimes = [];
147
+ const original = vi.fn(async () => {
148
+ callTimes.push(Date.now());
149
+ throw new Error("fail");
150
+ });
151
+ const ctx = mockMethodContext("backoffTest");
152
+ const wrapped = Retry(3, { delay: 100, backoff: 2 })(original, ctx);
153
+ const p = wrapped.call({});
154
+ const rejection = expect(p).rejects.toThrow("fail");
155
+ await vi.runAllTimersAsync();
156
+ await rejection;
157
+ expect(callTimes.length).toBe(3);
158
+ // Attempt 2 runs 100ms after attempt 1
159
+ expect(callTimes[1] - callTimes[0]).toBeGreaterThanOrEqual(100);
160
+ // Attempt 3 runs 200ms after attempt 2 (backoff × 2)
161
+ expect(callTimes[2] - callTimes[1]).toBeGreaterThanOrEqual(200);
162
+ vi.useRealTimers();
163
+ });
164
+ });
165
+ // ── Log ──────────────────────────────────────────────────────────────────────
166
+ describe("Log", () => {
167
+ it("calls the original function and returns its value", () => {
168
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
169
+ const original = vi.fn(() => 99);
170
+ const ctx = mockMethodContext("myMethod");
171
+ const wrapped = Log({ args: false, result: false })(original, ctx);
172
+ class Dummy {
173
+ }
174
+ const result = wrapped.call(new Dummy());
175
+ expect(result).toBe(99);
176
+ spy.mockRestore();
177
+ });
178
+ it("logs args when args=true", () => {
179
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
180
+ const original = vi.fn((x) => x);
181
+ const ctx = mockMethodContext("greet");
182
+ const wrapped = Log({ args: true, result: false })(original, ctx);
183
+ class Foo {
184
+ }
185
+ wrapped.call(new Foo(), "hello");
186
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("args:"), ["hello"]);
187
+ spy.mockRestore();
188
+ });
189
+ it("does not log in production when devOnly=true", () => {
190
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
191
+ const original = vi.fn(() => "value");
192
+ const ctx = mockMethodContext("prod");
193
+ const wrapped = Log({ devOnly: true })(original, ctx);
194
+ const prevEnv = process.env.NODE_ENV;
195
+ process.env.NODE_ENV = "production";
196
+ class App {
197
+ }
198
+ wrapped.call(new App());
199
+ expect(spy).not.toHaveBeenCalled();
200
+ process.env.NODE_ENV = prevEnv;
201
+ spy.mockRestore();
202
+ });
203
+ it("handles async functions — logs resolved value", async () => {
204
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
205
+ const original = vi.fn(async () => "async-result");
206
+ const ctx = mockMethodContext("load");
207
+ const wrapped = Log({ args: false, result: true })(original, ctx);
208
+ class Svc {
209
+ }
210
+ await wrapped.call(new Svc());
211
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("resolved:"), "async-result", expect.any(String));
212
+ spy.mockRestore();
213
+ });
214
+ it("handles async rejection — logs rejected value and re-throws", async () => {
215
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
216
+ const original = vi.fn(async () => { throw new Error("async-error"); });
217
+ const ctx = mockMethodContext("failing");
218
+ const wrapped = Log({ args: false, result: true })(original, ctx);
219
+ class Svc {
220
+ }
221
+ await expect(wrapped.call(new Svc())).rejects.toThrow("async-error");
222
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("rejected:"), expect.any(Error));
223
+ spy.mockRestore();
224
+ });
225
+ });
226
+ // ── Log (additional branches) ─────────────────────────────────────────────────
227
+ describe("Log — time option", () => {
228
+ it("includes elapsed time in sync result log when time=true", () => {
229
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
230
+ const original = vi.fn(() => "value");
231
+ const ctx = mockMethodContext("timed");
232
+ const wrapped = Log({ args: false, result: true, time: true })(original, ctx);
233
+ class Svc {
234
+ }
235
+ wrapped.call(new Svc());
236
+ // Third argument should be a string containing "ms"
237
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("returned:"), "value", expect.stringContaining("ms"));
238
+ spy.mockRestore();
239
+ });
240
+ it("includes elapsed time in async result log when time=true", async () => {
241
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
242
+ const original = vi.fn(async () => "async-val");
243
+ const ctx = mockMethodContext("asyncTimed");
244
+ const wrapped = Log({ args: false, result: true, time: true })(original, ctx);
245
+ class Svc {
246
+ }
247
+ await wrapped.call(new Svc());
248
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("resolved:"), "async-val", expect.stringContaining("ms"));
249
+ spy.mockRestore();
250
+ });
251
+ it("skips result log when result=false", () => {
252
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
253
+ const original = vi.fn(() => 42);
254
+ const ctx = mockMethodContext("noResult");
255
+ const wrapped = Log({ args: false, result: false })(original, ctx);
256
+ class Svc {
257
+ }
258
+ wrapped.call(new Svc());
259
+ // Should not log a "returned:" line
260
+ const calls = spy.mock.calls.flat().join(" ");
261
+ expect(calls).not.toContain("returned:");
262
+ spy.mockRestore();
263
+ });
264
+ });
265
+ // ── Bind ─────────────────────────────────────────────────────────────────────
266
+ describe("Bind", () => {
267
+ it("binds method to the instance so 'this' is preserved", () => {
268
+ class Counter {
269
+ value = 10;
270
+ getValue() {
271
+ return this.value;
272
+ }
273
+ }
274
+ const ctx = mockMethodContext("getValue");
275
+ Bind()(Counter.prototype.getValue, ctx);
276
+ const c = new Counter();
277
+ ctx.runInitializers(c);
278
+ const detached = c.getValue;
279
+ expect(detached()).toBe(10);
280
+ });
281
+ });
282
+ // ── Debounce ─────────────────────────────────────────────────────────────────
283
+ describe("Debounce", () => {
284
+ it("defers execution until after the wait period", () => {
285
+ vi.useFakeTimers();
286
+ const fn = vi.fn();
287
+ const ctx = mockMethodContext("search");
288
+ Debounce(100)(fn, ctx);
289
+ const obj = {};
290
+ ctx.runInitializers(obj);
291
+ const method = obj.search;
292
+ method("a");
293
+ method("b");
294
+ method("c");
295
+ expect(fn).not.toHaveBeenCalled();
296
+ vi.advanceTimersByTime(100);
297
+ expect(fn).toHaveBeenCalledTimes(1);
298
+ expect(fn).toHaveBeenCalledWith("c");
299
+ vi.useRealTimers();
300
+ });
301
+ it("resets the timer on each call", () => {
302
+ vi.useFakeTimers();
303
+ const fn = vi.fn();
304
+ const ctx = mockMethodContext("onInput");
305
+ Debounce(50)(fn, ctx);
306
+ const obj = {};
307
+ ctx.runInitializers(obj);
308
+ const method = obj.onInput;
309
+ method("x");
310
+ vi.advanceTimersByTime(30);
311
+ method("y");
312
+ vi.advanceTimersByTime(30); // 30ms since last call — not enough
313
+ expect(fn).not.toHaveBeenCalled();
314
+ vi.advanceTimersByTime(20); // now 50ms since "y"
315
+ expect(fn).toHaveBeenCalledOnce();
316
+ vi.useRealTimers();
317
+ });
318
+ it("multiple instances have independent timers", () => {
319
+ vi.useFakeTimers();
320
+ const fn = vi.fn();
321
+ const ctx = mockMethodContext("act");
322
+ Debounce(100)(fn, ctx);
323
+ const obj1 = {};
324
+ const obj2 = {};
325
+ ctx.runInitializers(obj1);
326
+ ctx.runInitializers(obj2);
327
+ const m1 = obj1.act;
328
+ const m2 = obj2.act;
329
+ m1("from-1");
330
+ m2("from-2");
331
+ vi.advanceTimersByTime(100);
332
+ // Both timers fire independently
333
+ expect(fn).toHaveBeenCalledTimes(2);
334
+ expect(fn).toHaveBeenCalledWith("from-1");
335
+ expect(fn).toHaveBeenCalledWith("from-2");
336
+ vi.useRealTimers();
337
+ });
338
+ it("delay=0 fires after the next macrotask", () => {
339
+ vi.useFakeTimers();
340
+ const fn = vi.fn();
341
+ const ctx = mockMethodContext("instant");
342
+ Debounce(0)(fn, ctx);
343
+ const obj = {};
344
+ ctx.runInitializers(obj);
345
+ const method = obj.instant;
346
+ method("a");
347
+ expect(fn).not.toHaveBeenCalled();
348
+ vi.advanceTimersByTime(0);
349
+ expect(fn).toHaveBeenCalledTimes(1);
350
+ expect(fn).toHaveBeenCalledWith("a");
351
+ vi.useRealTimers();
352
+ });
353
+ });
354
+ // ── Throttle ─────────────────────────────────────────────────────────────────
355
+ describe("Throttle", () => {
356
+ it("executes the first call immediately", () => {
357
+ vi.useFakeTimers();
358
+ const fn = vi.fn(() => "first");
359
+ const ctx = mockMethodContext("save");
360
+ Throttle(100)(fn, ctx);
361
+ const obj = {};
362
+ ctx.runInitializers(obj);
363
+ const method = obj.save;
364
+ method();
365
+ expect(fn).toHaveBeenCalledTimes(1);
366
+ vi.useRealTimers();
367
+ });
368
+ it("ignores calls within the throttle window", () => {
369
+ vi.useFakeTimers();
370
+ const fn = vi.fn();
371
+ const ctx = mockMethodContext("scroll");
372
+ Throttle(100)(fn, ctx);
373
+ const obj = {};
374
+ ctx.runInitializers(obj);
375
+ const method = obj.scroll;
376
+ method();
377
+ method();
378
+ method();
379
+ expect(fn).toHaveBeenCalledTimes(1);
380
+ vi.useRealTimers();
381
+ });
382
+ it("allows a new call after the window expires", () => {
383
+ vi.useFakeTimers();
384
+ const fn = vi.fn();
385
+ const ctx = mockMethodContext("resize");
386
+ Throttle(100)(fn, ctx);
387
+ const obj = {};
388
+ ctx.runInitializers(obj);
389
+ const method = obj.resize;
390
+ method();
391
+ vi.advanceTimersByTime(100);
392
+ method();
393
+ expect(fn).toHaveBeenCalledTimes(2);
394
+ vi.useRealTimers();
395
+ });
396
+ it("passes the first call's arguments to the underlying function", () => {
397
+ vi.useFakeTimers();
398
+ const fn = vi.fn();
399
+ const ctx = mockMethodContext("click");
400
+ Throttle(100)(fn, ctx);
401
+ const obj = {};
402
+ ctx.runInitializers(obj);
403
+ const method = obj.click;
404
+ method("first-arg");
405
+ method("second-arg");
406
+ expect(fn).toHaveBeenCalledWith("first-arg");
407
+ vi.useRealTimers();
408
+ });
409
+ it("multiple instances throttle independently", () => {
410
+ vi.useFakeTimers();
411
+ const fn = vi.fn();
412
+ const ctx = mockMethodContext("ping");
413
+ Throttle(100)(fn, ctx);
414
+ const obj1 = {};
415
+ const obj2 = {};
416
+ ctx.runInitializers(obj1);
417
+ ctx.runInitializers(obj2);
418
+ const m1 = obj1.ping;
419
+ const m2 = obj2.ping;
420
+ m1("a");
421
+ m2("b");
422
+ // Both first calls go through
423
+ expect(fn).toHaveBeenCalledTimes(2);
424
+ vi.useRealTimers();
425
+ });
426
+ });
427
+ //# sourceMappingURL=functions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.test.js","sourceRoot":"","sources":["../../src/__tests__/functions.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,6CAA6C;AAC7C,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,YAAY,GAAkC,EAAE,CAAC;IACvD,MAAM,GAAG,GAAG;QACV,IAAI;QACJ,IAAI,EAAE,QAAiB;QACvB,cAAc,CAAC,EAA0B;YACvC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QACD,eAAe,CAAC,QAAgB;YAC9B,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAEhF,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAEhF,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC;QACjC,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAEhF,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAEhF,MAAM,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAElF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAChC,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAElF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAElF,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAClD,QAAQ,EACR,GAA6C,CAC9C,CAAC;QACF,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,SAAS,CAAC;QAChB,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC1C,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAE/F,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAElF,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAChC,+DAA+D;YAC/D,MAAM,cAAc,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAElF,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAElF,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE;YACvB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SACxD,CAAC,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAE5D,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,+DAA+D;IACnG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAChC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAClD,QAAQ,EACR,GAA6C,CAC9C,CAAC;QAEF,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,SAAS,CAAC;QAEhB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,uCAAuC;QACvC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAChE,qDAAqD;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAChE,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CACjD,QAAQ,EACR,GAA6C,CAC9C,CAAC;QAEF,MAAM,KAAK;SAAG;QACd,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAChD,QAAQ,EACR,GAA6C,CAC9C,CAAC;QAEF,MAAM,GAAG;SAAG;QACZ,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9E,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CACpC,QAAQ,EACR,GAA6C,CAC9C,CAAC;QAEF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;QAEpC,MAAM,GAAG;SAAG;QACZ,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEnC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC/B,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAChD,QAAQ,EACR,GAA6C,CAC9C,CAAC;QAEF,MAAM,GAAG;SAAG;QACZ,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC9B,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,EACpC,cAAc,EACd,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACF,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAChD,QAAQ,EACR,GAA6C,CAC9C,CAAC;QACF,MAAM,GAAG;SAAG;QACZ,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC9B,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,EACpC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAClB,CAAC;QACF,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAC5D,QAAQ,EACR,GAA6C,CAC9C,CAAC;QAEF,MAAM,GAAG;SAAG;QACZ,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACxB,oDAAoD;QACpD,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC9B,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,EACpC,OAAO,EACP,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAC9B,CAAC;QACF,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAC5D,QAAQ,EACR,GAA6C,CAC9C,CAAC;QAEF,MAAM,GAAG;SAAG;QACZ,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC9B,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,EACpC,WAAW,EACX,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAC9B,CAAC;QACF,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CACjD,QAAQ,EACR,GAA6C,CAC9C,CAAC;QAEF,MAAM,GAAG;SAAG;QACZ,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACxB,oCAAoC;QACpC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACzC,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,OAAO;YACX,KAAK,GAAG,EAAE,CAAC;YACX,QAAQ;gBACN,OAAO,IAAI,CAAC,KAAK,CAAC;YACpB,CAAC;SACF;QACD,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QAElF,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEvB,MAAM,QAAQ,GAAI,CAA6C,CAAC,QAAQ,CAAC;QACzE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACxC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAA6C,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,MAAM,GAAI,GAAiD,CAAC,MAAM,CAAC;QAEzE,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAElC,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACrC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAA6C,CAAC,CAAC;QAEhE,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,MAAM,GAAI,GAAiD,CAAC,OAAO,CAAC;QAE1E,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,oCAAoC;QAChE,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAElC,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB;QACjD,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAClC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACrC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAA6C,CAAC,CAAC;QAEjE,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE1B,MAAM,EAAE,GAAI,IAAkD,CAAC,GAAG,CAAC;QACnE,MAAM,EAAE,GAAI,IAAkD,CAAC,GAAG,CAAC;QAEnE,EAAE,CAAC,QAAQ,CAAC,CAAC;QACb,EAAE,CAAC,QAAQ,CAAC,CAAC;QAEb,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,iCAAiC;QACjC,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC1C,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAA6C,CAAC,CAAC;QAE/D,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,MAAM,GAAI,GAAiD,CAAC,OAAO,CAAC;QAE1E,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAClC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACrC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAA6C,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,MAAM,GAAI,GAAiD,CAAC,IAAI,CAAC;QAEvE,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACxC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAA6C,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,MAAM,GAAI,GAAiD,CAAC,MAAM,CAAC;QAEzE,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACxC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAA6C,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,MAAM,GAAI,GAAiD,CAAC,MAAM,CAAC;QAEzE,MAAM,EAAE,CAAC;QACT,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAA6C,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,MAAM,GAAI,GAAiD,CAAC,KAAK,CAAC;QAExE,MAAM,CAAC,WAAW,CAAC,CAAC;QACpB,MAAM,CAAC,YAAY,CAAC,CAAC;QACrB,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAC7C,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAA6C,CAAC,CAAC;QAEjE,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE1B,MAAM,EAAE,GAAI,IAAkD,CAAC,IAAI,CAAC;QACpE,MAAM,EAAE,GAAI,IAAkD,CAAC,IAAI,CAAC;QAEpE,EAAE,CAAC,GAAG,CAAC,CAAC;QACR,EAAE,CAAC,GAAG,CAAC,CAAC;QACR,8BAA8B;QAC9B,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lazy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/lazy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,165 @@
1
+ // @vitest-environment jsdom
2
+ import { beforeEach, afterEach, describe, it, expect, vi } from "vitest";
3
+ import { StatefulComponent } from "@praxisjs/core";
4
+ import { Lazy } from "../component/lazy";
5
+ function applyLazy(cls, placeholder) {
6
+ return placeholder !== undefined
7
+ ? Lazy(placeholder)(cls, {})
8
+ : Lazy()(cls, {});
9
+ }
10
+ class BaseComp extends StatefulComponent {
11
+ render() {
12
+ return document.createTextNode("content");
13
+ }
14
+ }
15
+ describe("Lazy decorator", () => {
16
+ let intersectionCallback = () => { };
17
+ let mockObserve;
18
+ let mockDisconnect;
19
+ beforeEach(() => {
20
+ intersectionCallback = () => { };
21
+ mockObserve = vi.fn();
22
+ mockDisconnect = vi.fn();
23
+ globalThis.IntersectionObserver = class {
24
+ constructor(cb) {
25
+ intersectionCallback = cb;
26
+ }
27
+ observe = mockObserve;
28
+ disconnect = mockDisconnect;
29
+ };
30
+ });
31
+ afterEach(() => {
32
+ // @ts-expect-error – removing test stub
33
+ delete globalThis.IntersectionObserver;
34
+ });
35
+ it("returns null from render before visibility", () => {
36
+ const Wrapped = applyLazy(BaseComp);
37
+ const instance = new Wrapped();
38
+ expect(instance.render()).toBeNull();
39
+ });
40
+ it("sets _lazyVisible to true when IntersectionObserver is not supported", () => {
41
+ // Remove IntersectionObserver to simulate unsupported environment
42
+ // @ts-expect-error – removing test stub
43
+ delete globalThis.IntersectionObserver;
44
+ const Wrapped = applyLazy(BaseComp);
45
+ const instance = new Wrapped();
46
+ // Simulate anchor with parent element
47
+ const parent = document.createElement("div");
48
+ document.body.appendChild(parent);
49
+ const anchor = document.createComment("end");
50
+ parent.appendChild(anchor);
51
+ instance._anchor = anchor;
52
+ instance.onMount?.();
53
+ // Without IntersectionObserver, _lazyVisible should be set to true
54
+ const lazyVisible = instance._lazyVisible;
55
+ expect(lazyVisible()).toBe(true);
56
+ document.body.removeChild(parent);
57
+ });
58
+ it("sets minHeight placeholder on mount", () => {
59
+ const Wrapped = applyLazy(BaseComp, 300);
60
+ const instance = new Wrapped();
61
+ const parent = document.createElement("div");
62
+ document.body.appendChild(parent);
63
+ const anchor = document.createComment("end");
64
+ parent.appendChild(anchor);
65
+ instance._anchor = anchor;
66
+ instance.onMount?.();
67
+ expect(parent.style.minHeight).toBe("300px");
68
+ document.body.removeChild(parent);
69
+ });
70
+ it("sets _lazyVisible and clears minHeight when intersecting", () => {
71
+ const Wrapped = applyLazy(BaseComp, 200);
72
+ const instance = new Wrapped();
73
+ const parent = document.createElement("div");
74
+ document.body.appendChild(parent);
75
+ const anchor = document.createComment("end");
76
+ parent.appendChild(anchor);
77
+ instance._anchor = anchor;
78
+ instance.onMount?.();
79
+ expect(instance.render()).toBeNull();
80
+ intersectionCallback([{ isIntersecting: true }], null);
81
+ expect(parent.style.minHeight).toBe("");
82
+ const lazyVisible = instance._lazyVisible;
83
+ expect(lazyVisible()).toBe(true);
84
+ expect(mockDisconnect).toHaveBeenCalled();
85
+ document.body.removeChild(parent);
86
+ });
87
+ it("does nothing when _anchor has no parent", () => {
88
+ const Wrapped = applyLazy(BaseComp);
89
+ const instance = new Wrapped();
90
+ const anchor = document.createComment("end");
91
+ instance._anchor = anchor;
92
+ // Should not throw even though anchor has no parent
93
+ expect(() => instance.onMount?.()).not.toThrow();
94
+ });
95
+ it("disconnects observer on unmount", () => {
96
+ const Wrapped = applyLazy(BaseComp);
97
+ const instance = new Wrapped();
98
+ const parent = document.createElement("div");
99
+ document.body.appendChild(parent);
100
+ const anchor = document.createComment("end");
101
+ parent.appendChild(anchor);
102
+ instance._anchor = anchor;
103
+ instance.onMount?.();
104
+ instance.onUnmount?.();
105
+ expect(mockDisconnect).toHaveBeenCalled();
106
+ document.body.removeChild(parent);
107
+ });
108
+ it("onMount does nothing when _anchor is undefined", () => {
109
+ const Wrapped = applyLazy(BaseComp);
110
+ const instance = new Wrapped();
111
+ // _anchor is undefined by default
112
+ expect(() => instance.onMount?.()).not.toThrow();
113
+ });
114
+ it("render() returns original content after becoming visible", () => {
115
+ const Wrapped = applyLazy(BaseComp, 200);
116
+ const instance = new Wrapped();
117
+ const parent = document.createElement("div");
118
+ document.body.appendChild(parent);
119
+ const anchor = document.createComment("end");
120
+ parent.appendChild(anchor);
121
+ instance._anchor = anchor;
122
+ instance.onMount?.();
123
+ expect(instance.render()).toBeNull(); // not yet visible
124
+ intersectionCallback([{ isIntersecting: true }], null);
125
+ // Now visible: render() must delegate to the original render()
126
+ const result = instance.render();
127
+ expect(result).not.toBeNull();
128
+ document.body.removeChild(parent);
129
+ });
130
+ it("observer stays active and minHeight is preserved when entry is not intersecting", () => {
131
+ const Wrapped = applyLazy(BaseComp, 200);
132
+ const instance = new Wrapped();
133
+ const parent = document.createElement("div");
134
+ document.body.appendChild(parent);
135
+ const anchor = document.createComment("end");
136
+ parent.appendChild(anchor);
137
+ instance._anchor = anchor;
138
+ instance.onMount?.();
139
+ // Fire callback with isIntersecting=false — should be a no-op
140
+ intersectionCallback([{ isIntersecting: false }], null);
141
+ expect(instance.render()).toBeNull();
142
+ expect(mockDisconnect).not.toHaveBeenCalled();
143
+ expect(parent.style.minHeight).toBe("200px");
144
+ document.body.removeChild(parent);
145
+ });
146
+ it("does not re-apply minHeight on remount when already visible", () => {
147
+ const Wrapped = applyLazy(BaseComp, 300);
148
+ const instance = new Wrapped();
149
+ const parent = document.createElement("div");
150
+ document.body.appendChild(parent);
151
+ const anchor = document.createComment("end");
152
+ parent.appendChild(anchor);
153
+ instance._anchor = anchor;
154
+ // First mount — become visible
155
+ instance.onMount?.();
156
+ intersectionCallback([{ isIntersecting: true }], null);
157
+ instance.onUnmount?.();
158
+ // Second mount — _lazyVisible is already true
159
+ instance.onMount?.();
160
+ // minHeight must NOT be re-applied because _lazyVisible() is true
161
+ expect(parent.style.minHeight).toBe("");
162
+ document.body.removeChild(parent);
163
+ });
164
+ });
165
+ //# sourceMappingURL=lazy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.test.js","sourceRoot":"","sources":["../../src/__tests__/lazy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memo.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/memo.test.ts"],"names":[],"mappings":""}