@interfere/next 0.0.0-alpha.10 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +1 -0
  2. package/dist/__tests__/build/with-interfere-coverage.test.d.ts +2 -0
  3. package/dist/__tests__/build/with-interfere-coverage.test.d.ts.map +1 -0
  4. package/dist/__tests__/build/with-interfere-coverage.test.js +338 -0
  5. package/dist/__tests__/build/with-interfere-coverage.test.js.map +1 -0
  6. package/dist/__tests__/build/with-interfere.test.d.ts +2 -0
  7. package/dist/__tests__/build/with-interfere.test.d.ts.map +1 -0
  8. package/dist/__tests__/build/with-interfere.test.js +466 -0
  9. package/dist/__tests__/build/with-interfere.test.js.map +1 -0
  10. package/dist/__tests__/core/client.test.d.ts.map +1 -0
  11. package/dist/__tests__/core/client.test.js +373 -0
  12. package/dist/__tests__/core/client.test.js.map +1 -0
  13. package/dist/__tests__/core/encoders.test.d.ts.map +1 -0
  14. package/dist/{core → __tests__/core}/encoders.test.js +20 -19
  15. package/dist/__tests__/core/encoders.test.js.map +1 -0
  16. package/dist/__tests__/core/rage-click.test.d.ts +2 -0
  17. package/dist/__tests__/core/rage-click.test.d.ts.map +1 -0
  18. package/dist/__tests__/core/rage-click.test.js +121 -0
  19. package/dist/__tests__/core/rage-click.test.js.map +1 -0
  20. package/dist/__tests__/core/session-manager.test.d.ts +2 -0
  21. package/dist/__tests__/core/session-manager.test.d.ts.map +1 -0
  22. package/dist/__tests__/core/session-manager.test.js +1132 -0
  23. package/dist/__tests__/core/session-manager.test.js.map +1 -0
  24. package/dist/__tests__/integration/release-upload.test.d.ts +2 -0
  25. package/dist/__tests__/integration/release-upload.test.d.ts.map +1 -0
  26. package/dist/__tests__/integration/release-upload.test.js +173 -0
  27. package/dist/__tests__/integration/release-upload.test.js.map +1 -0
  28. package/dist/__tests__/session/persistence.test.d.ts +2 -0
  29. package/dist/__tests__/session/persistence.test.d.ts.map +1 -0
  30. package/dist/__tests__/session/persistence.test.js +129 -0
  31. package/dist/__tests__/session/persistence.test.js.map +1 -0
  32. package/dist/__tests__/session/session-summary.test.d.ts +2 -0
  33. package/dist/__tests__/session/session-summary.test.d.ts.map +1 -0
  34. package/dist/__tests__/session/session-summary.test.js +763 -0
  35. package/dist/__tests__/session/session-summary.test.js.map +1 -0
  36. package/dist/build/index.d.ts +3 -0
  37. package/dist/build/index.d.ts.map +1 -0
  38. package/dist/build/index.js +2 -0
  39. package/dist/build/index.js.map +1 -0
  40. package/dist/build/with-interfere.d.ts +54 -0
  41. package/dist/build/with-interfere.d.ts.map +1 -0
  42. package/dist/build/with-interfere.js +267 -0
  43. package/dist/build/with-interfere.js.map +1 -0
  44. package/dist/core/client-core.d.ts +27 -0
  45. package/dist/core/client-core.d.ts.map +1 -0
  46. package/dist/core/client-core.js +164 -0
  47. package/dist/core/client-core.js.map +1 -0
  48. package/dist/core/client.d.ts +70 -18
  49. package/dist/core/client.d.ts.map +1 -1
  50. package/dist/core/client.js +112 -104
  51. package/dist/core/client.js.map +1 -1
  52. package/dist/core/constants.d.ts +12 -0
  53. package/dist/core/constants.d.ts.map +1 -0
  54. package/dist/core/constants.js +17 -0
  55. package/dist/core/constants.js.map +1 -0
  56. package/dist/core/debug.d.ts +47 -0
  57. package/dist/core/debug.d.ts.map +1 -0
  58. package/dist/core/debug.js +79 -0
  59. package/dist/core/debug.js.map +1 -0
  60. package/dist/core/error-handlers.d.ts.map +1 -1
  61. package/dist/core/error-handlers.js +42 -41
  62. package/dist/core/error-handlers.js.map +1 -1
  63. package/dist/core/runtime.d.ts +7 -0
  64. package/dist/core/runtime.d.ts.map +1 -0
  65. package/dist/core/runtime.js +16 -0
  66. package/dist/core/runtime.js.map +1 -0
  67. package/dist/index.d.ts +10 -7
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +6 -7
  70. package/dist/index.js.map +1 -1
  71. package/dist/next/middleware.d.ts +1 -1
  72. package/dist/next/middleware.js +13 -13
  73. package/dist/persistence/storage.d.ts +5 -0
  74. package/dist/persistence/storage.d.ts.map +1 -0
  75. package/dist/persistence/storage.js +67 -0
  76. package/dist/persistence/storage.js.map +1 -0
  77. package/dist/react/provider.d.ts +9 -5
  78. package/dist/react/provider.d.ts.map +1 -1
  79. package/dist/react/provider.jsx +33 -10
  80. package/dist/react/provider.jsx.map +1 -1
  81. package/dist/session/constants.d.ts +19 -0
  82. package/dist/session/constants.d.ts.map +1 -0
  83. package/dist/session/constants.js +34 -0
  84. package/dist/session/constants.js.map +1 -0
  85. package/dist/session/persistence.d.ts +58 -0
  86. package/dist/session/persistence.d.ts.map +1 -0
  87. package/dist/session/persistence.js +180 -0
  88. package/dist/session/persistence.js.map +1 -0
  89. package/dist/session/rage-click.d.ts +17 -0
  90. package/dist/session/rage-click.d.ts.map +1 -0
  91. package/dist/session/rage-click.js +104 -0
  92. package/dist/session/rage-click.js.map +1 -0
  93. package/dist/session/replay.d.ts +2 -2
  94. package/dist/session/replay.d.ts.map +1 -1
  95. package/dist/session/replay.js +57 -24
  96. package/dist/session/replay.js.map +1 -1
  97. package/dist/session/session-manager.d.ts +126 -0
  98. package/dist/session/session-manager.d.ts.map +1 -0
  99. package/dist/session/session-manager.js +635 -0
  100. package/dist/session/session-manager.js.map +1 -0
  101. package/dist/session/session-summary.d.ts +2 -2
  102. package/dist/session/session-summary.d.ts.map +1 -1
  103. package/dist/session/session-summary.js +94 -47
  104. package/dist/session/session-summary.js.map +1 -1
  105. package/dist/types/storage.d.ts +7 -0
  106. package/dist/types/storage.d.ts.map +1 -0
  107. package/dist/types/storage.js +2 -0
  108. package/dist/types/storage.js.map +1 -0
  109. package/package.json +24 -7
  110. package/dist/core/client.test.d.ts.map +0 -1
  111. package/dist/core/client.test.js +0 -238
  112. package/dist/core/client.test.js.map +0 -1
  113. package/dist/core/encoders.test.d.ts.map +0 -1
  114. package/dist/core/encoders.test.js.map +0 -1
  115. package/dist/next/error-boundary.d.ts +0 -17
  116. package/dist/next/error-boundary.d.ts.map +0 -1
  117. package/dist/next/error-boundary.jsx +0 -32
  118. package/dist/next/error-boundary.jsx.map +0 -1
  119. /package/dist/{core → __tests__/core}/client.test.d.ts +0 -0
  120. /package/dist/{core → __tests__/core}/encoders.test.d.ts +0 -0
@@ -0,0 +1,373 @@
1
+ import { v7 as uuidv7 } from "uuid";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { capture, flush, getSessionId, init } from "../../core/client.js";
4
+ const SESSION_ID_REGEX = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/;
5
+ // Test defaults for required fields
6
+ const DEFAULT_TEST_CONFIG = {
7
+ buildId: "test-build-123",
8
+ releaseId: "test-release-456",
9
+ };
10
+ describe("client", () => {
11
+ beforeEach(() => {
12
+ vi.resetModules();
13
+ vi.clearAllMocks();
14
+ vi.clearAllTimers();
15
+ vi.useFakeTimers();
16
+ });
17
+ afterEach(() => {
18
+ vi.useRealTimers();
19
+ });
20
+ describe("init", () => {
21
+ it("initializes with required config", () => {
22
+ const client = init({
23
+ surface: "if_p_test",
24
+ options: DEFAULT_TEST_CONFIG,
25
+ });
26
+ expect(client).toBeDefined();
27
+ });
28
+ it("uses default endpoint", () => {
29
+ const fetchSpy = vi
30
+ .spyOn(global, "fetch")
31
+ .mockResolvedValue(new Response());
32
+ init({
33
+ surface: "if_p_test",
34
+ options: DEFAULT_TEST_CONFIG,
35
+ });
36
+ capture("error", { test: true });
37
+ flush();
38
+ expect(fetchSpy).toHaveBeenCalledWith("https://api.interfere.com/ingest/v0", expect.any(Object));
39
+ });
40
+ it("uses custom endpoint", () => {
41
+ const fetchSpy = vi
42
+ .spyOn(global, "fetch")
43
+ .mockResolvedValue(new Response());
44
+ init({
45
+ surface: "if_p_test",
46
+ options: {
47
+ ...DEFAULT_TEST_CONFIG,
48
+ endpointUrl: "http://localhost:3001",
49
+ },
50
+ });
51
+ capture("error", { test: true });
52
+ flush();
53
+ expect(fetchSpy).toHaveBeenCalledWith("http://localhost:3001/ingest/v0", expect.any(Object));
54
+ });
55
+ });
56
+ describe("capture", () => {
57
+ it("throws if not initialized", async () => {
58
+ vi.resetModules();
59
+ const { capture: freshCapture } = await import("../../core/client.js");
60
+ expect(() => freshCapture("error", {})).toThrow("[Interfere] Not initialized");
61
+ });
62
+ it("queues events", () => {
63
+ const fetchSpy = vi
64
+ .spyOn(global, "fetch")
65
+ .mockResolvedValue(new Response());
66
+ init({
67
+ surface: "if_p_test",
68
+ options: DEFAULT_TEST_CONFIG,
69
+ });
70
+ capture("ui_event", { action: "click" });
71
+ capture("error", { message: "test error" });
72
+ // In server mode, each capture auto-flushes
73
+ // So we expect 2 fetch calls
74
+ expect(fetchSpy).toHaveBeenCalledTimes(2);
75
+ const call1 = fetchSpy.mock.calls[0];
76
+ const call2 = fetchSpy.mock.calls[1];
77
+ if (!(call1?.[1] && call2?.[1])) {
78
+ throw new Error("Expected 2 fetch calls");
79
+ }
80
+ const body1 = JSON.parse(call1[1].body);
81
+ const body2 = JSON.parse(call2[1].body);
82
+ expect(body1).toHaveLength(1);
83
+ expect(body1[0].type).toBe("ui_event");
84
+ expect(body2).toHaveLength(1);
85
+ expect(body2[0].type).toBe("error");
86
+ });
87
+ it("auto-flushes after 10 events", () => {
88
+ const fetchSpy = vi
89
+ .spyOn(global, "fetch")
90
+ .mockResolvedValue(new Response());
91
+ init({
92
+ surface: "if_p_test",
93
+ options: DEFAULT_TEST_CONFIG,
94
+ });
95
+ // In server mode, each capture triggers a flush
96
+ for (let i = 0; i < 10; i++) {
97
+ capture("ui_event", { index: i });
98
+ }
99
+ // Each capture causes a flush in server mode
100
+ expect(fetchSpy).toHaveBeenCalledTimes(10);
101
+ });
102
+ it("includes correct envelope structure", () => {
103
+ const fetchSpy = vi
104
+ .spyOn(global, "fetch")
105
+ .mockResolvedValue(new Response());
106
+ init({
107
+ surface: "if_p_test",
108
+ options: { ...DEFAULT_TEST_CONFIG, env: "production" },
109
+ });
110
+ capture("network", { url: "/api/test" });
111
+ flush();
112
+ const call = fetchSpy.mock.calls[0];
113
+ if (!call?.[1]) {
114
+ throw new Error("Expected fetch call");
115
+ }
116
+ const body = JSON.parse(call[1].body);
117
+ const envelope = body[0];
118
+ expect(envelope.v).toBe(0);
119
+ expect(envelope.runtime).toBe("server"); // Default in test environment
120
+ expect(envelope.surface).toBe("if_p_test");
121
+ expect(envelope.env).toBe("production");
122
+ expect(envelope.clientTs).toBeGreaterThan(0);
123
+ expect(envelope.sessionId).toMatch(SESSION_ID_REGEX);
124
+ expect(envelope.seq).toBe(1);
125
+ expect(envelope.type).toBe("network");
126
+ expect(envelope.payload).toBeDefined();
127
+ });
128
+ });
129
+ describe("flush", () => {
130
+ it("does nothing with empty queue", () => {
131
+ const fetchSpy = vi
132
+ .spyOn(global, "fetch")
133
+ .mockResolvedValue(new Response());
134
+ init({
135
+ surface: "if_p_test",
136
+ options: DEFAULT_TEST_CONFIG,
137
+ });
138
+ flush();
139
+ expect(fetchSpy).not.toHaveBeenCalled();
140
+ });
141
+ it("clears queue after flush", () => {
142
+ const fetchSpy = vi
143
+ .spyOn(global, "fetch")
144
+ .mockResolvedValue(new Response());
145
+ init({
146
+ surface: "if_p_test",
147
+ options: DEFAULT_TEST_CONFIG,
148
+ });
149
+ capture("error", { test: true });
150
+ flush();
151
+ expect(fetchSpy).toHaveBeenCalledTimes(1);
152
+ flush(); // Second flush should do nothing
153
+ expect(fetchSpy).toHaveBeenCalledTimes(1);
154
+ });
155
+ it("handles fetch errors in debug mode", async () => {
156
+ const fetchSpy = vi
157
+ .spyOn(global, "fetch")
158
+ .mockRejectedValue(new Error("Network error"));
159
+ init({
160
+ surface: "if_p_test",
161
+ options: { ...DEFAULT_TEST_CONFIG, debug: true },
162
+ });
163
+ capture("error", { test: true });
164
+ // Should not throw
165
+ expect(() => flush()).not.toThrow();
166
+ await vi.waitFor(() => {
167
+ expect(fetchSpy).toHaveBeenCalled();
168
+ });
169
+ });
170
+ });
171
+ describe("getSessionId", () => {
172
+ it("throws if not initialized", async () => {
173
+ vi.resetModules();
174
+ const { getSessionId: freshGetSessionId } = await import("../../core/client.js");
175
+ expect(() => freshGetSessionId()).toThrow("[Interfere] Not initialized");
176
+ });
177
+ it("returns consistent session ID", () => {
178
+ init({
179
+ surface: "if_p_test",
180
+ options: DEFAULT_TEST_CONFIG,
181
+ });
182
+ const id1 = getSessionId();
183
+ const id2 = getSessionId();
184
+ expect(id1).toBe(id2);
185
+ expect(id1).toMatch(SESSION_ID_REGEX);
186
+ });
187
+ it("uses provided session ID", () => {
188
+ const customId = uuidv7();
189
+ init({
190
+ surface: "if_p_test",
191
+ options: { ...DEFAULT_TEST_CONFIG, sessionId: customId },
192
+ });
193
+ expect(getSessionId()).toBe(customId);
194
+ });
195
+ });
196
+ describe("runtime detection", () => {
197
+ it("detects server runtime by default", () => {
198
+ const fetchSpy = vi
199
+ .spyOn(global, "fetch")
200
+ .mockResolvedValue(new Response());
201
+ init({
202
+ surface: "if_p_test",
203
+ options: DEFAULT_TEST_CONFIG,
204
+ });
205
+ capture("server_req", {});
206
+ flush();
207
+ const call = fetchSpy.mock.calls[0];
208
+ if (!call?.[1]) {
209
+ throw new Error("Expected fetch call");
210
+ }
211
+ const body = JSON.parse(call[1].body);
212
+ expect(body[0].runtime).toBe("server");
213
+ });
214
+ it("detects client runtime with window", async () => {
215
+ const originalWindow = global.window;
216
+ global.window = {
217
+ addEventListener: vi.fn(),
218
+ };
219
+ vi.resetModules();
220
+ const { init: freshInit, capture: freshCapture, flush: freshFlush, } = await import("../../core/client.js");
221
+ const fetchSpy = vi
222
+ .spyOn(global, "fetch")
223
+ .mockResolvedValue(new Response());
224
+ freshInit({
225
+ surface: "if_p_test",
226
+ options: DEFAULT_TEST_CONFIG,
227
+ });
228
+ freshCapture("ui_event", {});
229
+ // Client mode doesn't auto-flush
230
+ expect(fetchSpy).not.toHaveBeenCalled();
231
+ freshFlush();
232
+ const call = fetchSpy.mock.calls[0];
233
+ if (!call?.[1]) {
234
+ throw new Error("Expected fetch call");
235
+ }
236
+ const body = JSON.parse(call[1].body);
237
+ expect(body[0].runtime).toBe("client");
238
+ global.window = originalWindow;
239
+ });
240
+ });
241
+ describe("client mode features", () => {
242
+ it("uses fetch with keepalive when sendBeacon is available", async () => {
243
+ const originalWindow = global.window;
244
+ const fetchSpy = vi.fn().mockResolvedValue(new Response());
245
+ const sendBeaconSpy = vi.fn().mockReturnValue(true);
246
+ // Create a proper mock window with sendBeacon on it
247
+ global.window = {
248
+ addEventListener: vi.fn(),
249
+ navigator: {
250
+ sendBeacon: sendBeaconSpy,
251
+ },
252
+ };
253
+ global.fetch = fetchSpy;
254
+ vi.resetModules();
255
+ const { init: freshInit, capture: freshCapture, flush: freshFlush, } = await import("../../core/client.js");
256
+ freshInit({
257
+ surface: "if_p_test",
258
+ options: DEFAULT_TEST_CONFIG,
259
+ });
260
+ freshCapture("ui_event", {});
261
+ freshFlush();
262
+ // Should use fetch with keepalive, not sendBeacon
263
+ expect(sendBeaconSpy).not.toHaveBeenCalled();
264
+ expect(fetchSpy).toHaveBeenCalledWith("https://api.interfere.com/ingest/v0", expect.objectContaining({
265
+ method: "POST",
266
+ keepalive: true,
267
+ headers: expect.any(Headers),
268
+ body: expect.any(String),
269
+ }));
270
+ global.window = originalWindow;
271
+ global.fetch = fetch;
272
+ });
273
+ it("sets up auto-flush timer in client mode", async () => {
274
+ const originalWindow = global.window;
275
+ global.window = { addEventListener: vi.fn() };
276
+ vi.resetModules();
277
+ const { init: freshInit } = await import("../../core/client.js");
278
+ freshInit({
279
+ surface: "if_p_test",
280
+ options: { ...DEFAULT_TEST_CONFIG, flushInterval: 1000 },
281
+ });
282
+ expect(global.window.addEventListener).toHaveBeenCalledWith("beforeunload", expect.any(Function));
283
+ global.window = originalWindow;
284
+ });
285
+ });
286
+ describe("background events", () => {
287
+ beforeEach(() => {
288
+ vi.clearAllMocks();
289
+ });
290
+ it("should not update session activity for replay_chunk events", () => {
291
+ const client = init({
292
+ surface: "if_p_test",
293
+ options: DEFAULT_TEST_CONFIG,
294
+ });
295
+ // Mock the session manager to spy on checkAndGetSessionAndWindowId calls
296
+ const sessionManager = client
297
+ .sessionManager;
298
+ if (!sessionManager) {
299
+ throw new Error("Session manager not found");
300
+ }
301
+ const checkAndGetSpy = vi.spyOn(sessionManager, "checkAndGetSessionAndWindowId");
302
+ // Capture a background event
303
+ capture("replay_chunk", { events: [] });
304
+ // Should be called with readOnly = true
305
+ expect(checkAndGetSpy).toHaveBeenCalledWith(true);
306
+ });
307
+ it("should not update session activity for session_summary events", () => {
308
+ const client = init({
309
+ surface: "if_p_test",
310
+ options: DEFAULT_TEST_CONFIG,
311
+ });
312
+ const sessionManager = client
313
+ .sessionManager;
314
+ if (!sessionManager) {
315
+ throw new Error("Session manager not found");
316
+ }
317
+ const checkAndGetSpy = vi.spyOn(sessionManager, "checkAndGetSessionAndWindowId");
318
+ // Capture a background event
319
+ capture("session_summary", { summary: "test" });
320
+ // Should be called with readOnly = true
321
+ expect(checkAndGetSpy).toHaveBeenCalledWith(true);
322
+ });
323
+ it("should update session activity for user events", () => {
324
+ const client = init({
325
+ surface: "if_p_test",
326
+ options: DEFAULT_TEST_CONFIG,
327
+ });
328
+ const sessionManager = client
329
+ .sessionManager;
330
+ if (!sessionManager) {
331
+ throw new Error("Session manager not found");
332
+ }
333
+ const checkAndGetSpy = vi.spyOn(sessionManager, "checkAndGetSessionAndWindowId");
334
+ // Capture a user event
335
+ capture("ui_event", { action: "click" });
336
+ // Should be called with readOnly = false
337
+ expect(checkAndGetSpy).toHaveBeenCalledWith(false);
338
+ });
339
+ it("should update session activity for error events", () => {
340
+ const client = init({
341
+ surface: "if_p_test",
342
+ options: DEFAULT_TEST_CONFIG,
343
+ });
344
+ const sessionManager = client
345
+ .sessionManager;
346
+ if (!sessionManager) {
347
+ throw new Error("Session manager not found");
348
+ }
349
+ const checkAndGetSpy = vi.spyOn(sessionManager, "checkAndGetSessionAndWindowId");
350
+ // Capture an error event
351
+ capture("error", { message: "test error" });
352
+ // Should be called with readOnly = false
353
+ expect(checkAndGetSpy).toHaveBeenCalledWith(false);
354
+ });
355
+ it("should update session activity for custom events", () => {
356
+ const client = init({
357
+ surface: "if_p_test",
358
+ options: DEFAULT_TEST_CONFIG,
359
+ });
360
+ const sessionManager = client
361
+ .sessionManager;
362
+ if (!sessionManager) {
363
+ throw new Error("Session manager not found");
364
+ }
365
+ const checkAndGetSpy = vi.spyOn(sessionManager, "checkAndGetSessionAndWindowId");
366
+ // Capture a custom event
367
+ capture("custom", { action: "user_signup" });
368
+ // Should be called with readOnly = false
369
+ expect(checkAndGetSpy).toHaveBeenCalledWith(false);
370
+ });
371
+ });
372
+ });
373
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../src/__tests__/core/client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,gBAAgB,GACpB,4FAA4F,CAAC;AAE/F,oCAAoC;AACpC,MAAM,mBAAmB,GAAG;IAC1B,OAAO,EAAE,gBAAgB;IACzB,SAAS,EAAE,kBAAkB;CAC9B,CAAC;AAEF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,cAAc,EAAE,CAAC;QACpB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,QAAQ,GAAG,EAAE;iBAChB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;iBACtB,iBAAiB,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjC,KAAK,EAAE,CAAC;YAER,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,qCAAqC,EACrC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,MAAM,QAAQ,GAAG,EAAE;iBAChB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;iBACtB,iBAAiB,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE;oBACP,GAAG,mBAAmB;oBACtB,WAAW,EAAE,uBAAuB;iBACrC;aACF,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjC,KAAK,EAAE,CAAC;YAER,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,iCAAiC,EACjC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,EAAE,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YACvE,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAC7C,6BAA6B,CAC9B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;YACvB,MAAM,QAAQ,GAAG,EAAE;iBAChB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;iBACtB,iBAAiB,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YACH,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;YAE5C,4CAA4C;YAC5C,6BAA6B;YAC7B,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAE1C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAE,KAAK,CAAC,CAAC,CAAiB,CAAC,IAAc,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAE,KAAK,CAAC,CAAC,CAAiB,CAAC,IAAc,CAAC,CAAC;YAEnE,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEvC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,QAAQ,GAAG,EAAE;iBAChB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;iBACtB,iBAAiB,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YAEH,gDAAgD;YAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,OAAO,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;YAED,6CAA6C;YAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,QAAQ,GAAG,EAAE;iBAChB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;iBACtB,iBAAiB,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,EAAE,GAAG,mBAAmB,EAAE,GAAG,EAAE,YAAY,EAAE;aACvD,CAAC,CAAC;YACH,OAAO,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;YACzC,KAAK,EAAE,CAAC;YAER,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAE,IAAI,CAAC,CAAC,CAAiB,CAAC,IAAc,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAEzB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,8BAA8B;YACvE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACrD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,QAAQ,GAAG,EAAE;iBAChB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;iBACtB,iBAAiB,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YACH,KAAK,EAAE,CAAC;YAER,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,QAAQ,GAAG,EAAE;iBAChB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;iBACtB,iBAAiB,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjC,KAAK,EAAE,CAAC;YAER,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAE1C,KAAK,EAAE,CAAC,CAAC,iCAAiC;YAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,QAAQ,GAAG,EAAE;iBAChB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;iBACtB,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YAEjD,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,EAAE,GAAG,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE;aACjD,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAEjC,mBAAmB;YACnB,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAEpC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBACpB,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,EAAE,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CACtD,sBAAsB,CACvB,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;YAE3B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEtB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC;YAE1B,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,EAAE,GAAG,mBAAmB,EAAE,SAAS,EAAE,QAAQ,EAAE;aACzD,CAAC,CAAC;YAEH,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,QAAQ,GAAG,EAAE;iBAChB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;iBACtB,iBAAiB,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YACH,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAC1B,KAAK,EAAE,CAAC;YAER,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAE,IAAI,CAAC,CAAC,CAAiB,CAAC,IAAc,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;YACrC,MAAM,CAAC,MAAM,GAAG;gBACd,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;aACe,CAAC;YAE3C,EAAE,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,EACJ,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,UAAU,GAClB,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAEzC,MAAM,QAAQ,GAAG,EAAE;iBAChB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;iBACtB,iBAAiB,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAErC,SAAS,CAAC;gBACR,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YACH,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAE7B,iCAAiC;YACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAExC,UAAU,EAAE,CAAC;YAEb,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAE,IAAI,CAAC,CAAC,CAAiB,CAAC,IAAc,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEvC,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;YACrC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAEpD,oDAAoD;YACpD,MAAM,CAAC,MAAM,GAAG;gBACd,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;gBACzB,SAAS,EAAE;oBACT,UAAU,EAAE,aAAa;iBAC1B;aACuC,CAAC;YAC3C,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;YAExB,EAAE,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,EACJ,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,UAAU,GAClB,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAEzC,SAAS,CAAC;gBACR,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YACH,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC7B,UAAU,EAAE,CAAC;YAEb,kDAAkD;YAClD,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,qCAAqC,EACrC,MAAM,CAAC,gBAAgB,CAAC;gBACtB,MAAM,EAAE,MAAM;gBACd,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;gBAC5B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;aACzB,CAAC,CACH,CAAC;YAEF,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC;YAC/B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;YACrC,MAAM,CAAC,MAAM,GAAG,EAAE,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,EACxB,CAAC;YAEpB,EAAE,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAEjE,SAAS,CAAC;gBACR,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,EAAE,GAAG,mBAAmB,EAAE,aAAa,EAAE,IAAI,EAAE;aACzD,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CACzD,cAAc,EACd,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;YAEF,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,UAAU,CAAC,GAAG,EAAE;YACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,MAAM,GAAG,IAAI,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YAEH,yEAAyE;YACzE,MAAM,cAAc,GAAI,MAAiD;iBACtE,cAAc,CAAC;YAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,cAAc,GAAG,EAAE,CAAC,KAAK,CAC7B,cAEC,EACD,+BAA+B,CAChC,CAAC;YAEF,6BAA6B;YAC7B,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAExC,wCAAwC;YACxC,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,MAAM,GAAG,IAAI,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YAEH,MAAM,cAAc,GAAI,MAAiD;iBACtE,cAAc,CAAC;YAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,cAAc,GAAG,EAAE,CAAC,KAAK,CAC7B,cAEC,EACD,+BAA+B,CAChC,CAAC;YAEF,6BAA6B;YAC7B,OAAO,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAEhD,wCAAwC;YACxC,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YAEH,MAAM,cAAc,GAAI,MAAiD;iBACtE,cAAc,CAAC;YAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,cAAc,GAAG,EAAE,CAAC,KAAK,CAC7B,cAEC,EACD,+BAA+B,CAChC,CAAC;YAEF,uBAAuB;YACvB,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAEzC,yCAAyC;YACzC,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YAEH,MAAM,cAAc,GAAI,MAAiD;iBACtE,cAAc,CAAC;YAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,cAAc,GAAG,EAAE,CAAC,KAAK,CAC7B,cAEC,EACD,+BAA+B,CAChC,CAAC;YAEF,yBAAyB;YACzB,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;YAE5C,yCAAyC;YACzC,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;YAEH,MAAM,cAAc,GAAI,MAAiD;iBACtE,cAAc,CAAC;YAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,cAAc,GAAG,EAAE,CAAC,KAAK,CAC7B,cAEC,EACD,+BAA+B,CAChC,CAAC;YAEF,yBAAyB;YACzB,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;YAE7C,yCAAyC;YACzC,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoders.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/core/encoders.test.ts"],"names":[],"mappings":""}
@@ -1,39 +1,40 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { decode, encode } from './encoders.js';
3
- describe('encoders', () => {
4
- describe('encode', () => {
5
- it('encodes strings to Uint8Array', () => {
6
- const result = encode('hello');
1
+ /** biome-ignore-all lint/style/noMagicNumbers: Self-explanatory */
2
+ import { describe, expect, it } from "vitest";
3
+ import { decode, encode } from "../../core/encoders.js";
4
+ describe("encoders", () => {
5
+ describe("encode", () => {
6
+ it("encodes strings to Uint8Array", () => {
7
+ const result = encode("hello");
7
8
  expect(result).toBeInstanceOf(Uint8Array);
8
9
  expect(new TextDecoder().decode(result)).toBe('"hello"');
9
10
  });
10
- it('encodes objects to Uint8Array', () => {
11
- const obj = { foo: 'bar', num: 123 };
11
+ it("encodes objects to Uint8Array", () => {
12
+ const obj = { foo: "bar", num: 123 };
12
13
  const result = encode(obj);
13
14
  expect(result).toBeInstanceOf(Uint8Array);
14
15
  expect(new TextDecoder().decode(result)).toBe('{"foo":"bar","num":123}');
15
16
  });
16
- it('encodes arrays to Uint8Array', () => {
17
+ it("encodes arrays to Uint8Array", () => {
17
18
  const arr = [1, 2, 3];
18
19
  const result = encode(arr);
19
20
  expect(result).toBeInstanceOf(Uint8Array);
20
- expect(new TextDecoder().decode(result)).toBe('[1,2,3]');
21
+ expect(new TextDecoder().decode(result)).toBe("[1,2,3]");
21
22
  });
22
- it('encodes null', () => {
23
- expect(new TextDecoder().decode(encode(null))).toBe('null');
23
+ it("encodes null", () => {
24
+ expect(new TextDecoder().decode(encode(null))).toBe("null");
24
25
  });
25
- it('handles undefined by encoding as null', () => {
26
+ it("handles undefined by encoding as null", () => {
26
27
  // JSON.stringify(undefined) returns undefined, which becomes empty string
27
28
  // This is expected behavior for JSON
28
29
  const result = encode(undefined);
29
30
  expect(result).toBeInstanceOf(Uint8Array);
30
31
  });
31
32
  });
32
- describe('decode', () => {
33
- it('decodes Uint8Array back to original values', () => {
33
+ describe("decode", () => {
34
+ it("decodes Uint8Array back to original values", () => {
34
35
  const testCases = [
35
- 'hello',
36
- { foo: 'bar', num: 123 },
36
+ "hello",
37
+ { foo: "bar", num: 123 },
37
38
  [1, 2, 3],
38
39
  null,
39
40
  true,
@@ -46,8 +47,8 @@ describe('encoders', () => {
46
47
  expect(decoded).toEqual(original);
47
48
  }
48
49
  });
49
- it('throws on invalid JSON', () => {
50
- const invalidJson = new TextEncoder().encode('not valid json');
50
+ it("throws on invalid JSON", () => {
51
+ const invalidJson = new TextEncoder().encode("not valid json");
51
52
  expect(() => decode(invalidJson)).toThrow();
52
53
  });
53
54
  });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoders.test.js","sourceRoot":"","sources":["../../../src/__tests__/core/encoders.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rage-click.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rage-click.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/core/rage-click.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import RageClick from "../../session/rage-click.js";
3
+ // Test constants
4
+ const TEST_X = 100;
5
+ const TEST_Y = 100;
6
+ const SMALL_OFFSET = 5;
7
+ const MEDIUM_OFFSET = 10;
8
+ const MEDIUM_LARGE_OFFSET = 15;
9
+ const LARGE_OFFSET = 50;
10
+ const VERY_LARGE_OFFSET = 100;
11
+ const SHORT_DELAY = 100;
12
+ const MEDIUM_DELAY = 200;
13
+ const LONG_DELAY = 300;
14
+ const VERY_LONG_DELAY = 400;
15
+ const CUSTOM_TIMEOUT = 500;
16
+ const VERY_LATE_DELAY = 1500;
17
+ const MUCH_LATER_DELAY = 3000;
18
+ const MAX_TEXT_TEST_LENGTH = 150;
19
+ const EXPECTED_TRUNCATED_LENGTH = 100;
20
+ describe("RageClick", () => {
21
+ it("should detect rage click with default settings", () => {
22
+ const detector = new RageClick();
23
+ const baseTime = Date.now();
24
+ // First two clicks should not trigger
25
+ expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
26
+ expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, baseTime + SHORT_DELAY)).toBe(false);
27
+ // Third click should trigger rage click
28
+ expect(detector.isRageClick(TEST_X - SMALL_OFFSET, TEST_Y - SMALL_OFFSET, baseTime + MEDIUM_DELAY)).toBe(true);
29
+ });
30
+ it("should not detect rage click if clicks are too far apart", () => {
31
+ const detector = new RageClick();
32
+ const baseTime = Date.now();
33
+ // Clicks outside the radius threshold (default 30px)
34
+ expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
35
+ expect(detector.isRageClick(TEST_X + LARGE_OFFSET, TEST_Y, baseTime + SHORT_DELAY)).toBe(false);
36
+ expect(detector.isRageClick(TEST_X, TEST_Y + LARGE_OFFSET, baseTime + MEDIUM_DELAY)).toBe(false);
37
+ // Should not trigger even with more clicks
38
+ expect(detector.isRageClick(TEST_X + VERY_LARGE_OFFSET, TEST_Y, baseTime + LONG_DELAY)).toBe(false);
39
+ });
40
+ it("should not detect rage click if clicks are too slow", () => {
41
+ const detector = new RageClick();
42
+ const baseTime = Date.now();
43
+ // Spread clicks over a longer time period so they don't form a rage click
44
+ expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
45
+ expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, baseTime + VERY_LATE_DELAY)).toBe(false); // Gap too large
46
+ expect(detector.isRageClick(TEST_X - SMALL_OFFSET, TEST_Y - SMALL_OFFSET, baseTime + MUCH_LATER_DELAY)).toBe(false); // Gap too large
47
+ });
48
+ it("should use static configuration values", () => {
49
+ const detector = new RageClick();
50
+ const baseTime = Date.now();
51
+ // Static config uses 3 clicks within 1000ms and 30px radius
52
+ // First click
53
+ expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
54
+ // Second click
55
+ expect(detector.isRageClick(TEST_X + MEDIUM_OFFSET, TEST_Y + MEDIUM_OFFSET, baseTime + MEDIUM_DELAY)).toBe(false);
56
+ // Third click should trigger rage click
57
+ expect(detector.isRageClick(TEST_X + MEDIUM_LARGE_OFFSET, TEST_Y + MEDIUM_LARGE_OFFSET, baseTime + VERY_LONG_DELAY)).toBe(true);
58
+ });
59
+ it("should reset after detecting rage click", () => {
60
+ const detector = new RageClick();
61
+ const baseTime = Date.now();
62
+ // Trigger first rage click
63
+ expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
64
+ expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, baseTime + SHORT_DELAY)).toBe(false);
65
+ expect(detector.isRageClick(TEST_X - SMALL_OFFSET, TEST_Y - SMALL_OFFSET, baseTime + MEDIUM_DELAY)).toBe(true);
66
+ // Should reset and require 3 new clicks
67
+ expect(detector.isRageClick(TEST_X, TEST_Y, baseTime + LONG_DELAY)).toBe(false);
68
+ expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, baseTime + VERY_LONG_DELAY)).toBe(false);
69
+ expect(detector.isRageClick(TEST_X - SMALL_OFFSET, TEST_Y - SMALL_OFFSET, baseTime + CUSTOM_TIMEOUT)).toBe(true);
70
+ });
71
+ it("should filter out old clicks", () => {
72
+ const detector = new RageClick();
73
+ const baseTime = Date.now();
74
+ // Add some old clicks
75
+ expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
76
+ expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, baseTime + SHORT_DELAY)).toBe(false);
77
+ // Wait longer than timeout, then add new clicks
78
+ const laterTime = baseTime + VERY_LATE_DELAY; // After timeout window
79
+ expect(detector.isRageClick(TEST_X, TEST_Y, laterTime)).toBe(false);
80
+ expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, laterTime + SHORT_DELAY)).toBe(false);
81
+ expect(detector.isRageClick(TEST_X - SMALL_OFFSET, TEST_Y - SMALL_OFFSET, laterTime + MEDIUM_DELAY)).toBe(true);
82
+ });
83
+ it("should extract element information correctly", () => {
84
+ const detector = new RageClick();
85
+ // Mock DOM element
86
+ const mockElement = {
87
+ tagName: "BUTTON",
88
+ className: "test-class",
89
+ id: "test-id",
90
+ innerText: "Click me!",
91
+ getAttribute: (attr) => attr === "aria-label" ? "Test Button" : null,
92
+ };
93
+ const elementInfo = detector.getElementInfo(mockElement);
94
+ expect(elementInfo).toEqual({
95
+ tagName: "button",
96
+ className: "test-class",
97
+ id: "test-id",
98
+ text: "Click me!",
99
+ ariaLabel: "Test Button",
100
+ });
101
+ });
102
+ it("should handle null element gracefully", () => {
103
+ const detector = new RageClick();
104
+ const elementInfo = detector.getElementInfo(null);
105
+ expect(elementInfo).toEqual({});
106
+ });
107
+ it("should truncate long text", () => {
108
+ const detector = new RageClick();
109
+ // Mock element with long text
110
+ const longText = "a".repeat(MAX_TEXT_TEST_LENGTH);
111
+ const mockElement = {
112
+ tagName: "DIV",
113
+ innerText: longText,
114
+ getAttribute: () => null,
115
+ };
116
+ const elementInfo = detector.getElementInfo(mockElement);
117
+ expect(elementInfo.text).toHaveLength(EXPECTED_TRUNCATED_LENGTH);
118
+ expect(elementInfo.text).toBe("a".repeat(EXPECTED_TRUNCATED_LENGTH));
119
+ });
120
+ });
121
+ //# sourceMappingURL=rage-click.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rage-click.test.js","sourceRoot":"","sources":["../../../src/__tests__/core/rage-click.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/core/session-manager.test.ts"],"names":[],"mappings":""}