@prosopo/procaptcha-react 2.9.97 → 2.9.99

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 (66) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +8 -8
  2. package/.turbo/turbo-build$colon$tsc.log +21 -21
  3. package/.turbo/turbo-build.log +8 -8
  4. package/CHANGELOG.md +30 -0
  5. package/dist/cjs/components/CaptchaComponent.cjs +4 -5
  6. package/dist/cjs/components/CaptchaWidget.cjs +4 -12
  7. package/dist/cjs/components/ProcaptchaWidget.cjs +8 -6
  8. package/dist/components/CaptchaComponent.d.ts.map +1 -1
  9. package/dist/components/CaptchaComponent.js +4 -5
  10. package/dist/components/CaptchaComponent.js.map +1 -1
  11. package/dist/components/CaptchaWidget.d.ts.map +1 -1
  12. package/dist/components/CaptchaWidget.js +4 -12
  13. package/dist/components/CaptchaWidget.js.map +1 -1
  14. package/dist/components/ProcaptchaWidget.d.ts.map +1 -1
  15. package/dist/components/ProcaptchaWidget.js +8 -6
  16. package/dist/components/ProcaptchaWidget.js.map +1 -1
  17. package/dist/tests/button.unit.test.d.ts +2 -0
  18. package/dist/tests/button.unit.test.d.ts.map +1 -0
  19. package/dist/tests/button.unit.test.js +113 -0
  20. package/dist/tests/button.unit.test.js.map +1 -0
  21. package/dist/tests/captchaComponent.unit.test.d.ts +2 -0
  22. package/dist/tests/captchaComponent.unit.test.d.ts.map +1 -0
  23. package/dist/tests/captchaComponent.unit.test.js +141 -0
  24. package/dist/tests/captchaComponent.unit.test.js.map +1 -0
  25. package/dist/tests/captchaWidget.unit.test.d.ts +2 -0
  26. package/dist/tests/captchaWidget.unit.test.d.ts.map +1 -0
  27. package/dist/tests/captchaWidget.unit.test.js +191 -0
  28. package/dist/tests/captchaWidget.unit.test.js.map +1 -0
  29. package/dist/tests/collector.unit.test.d.ts +2 -0
  30. package/dist/tests/collector.unit.test.d.ts.map +1 -0
  31. package/dist/tests/collector.unit.test.js +109 -0
  32. package/dist/tests/collector.unit.test.js.map +1 -0
  33. package/dist/tests/harness.d.ts +12 -0
  34. package/dist/tests/harness.d.ts.map +1 -0
  35. package/dist/tests/harness.js +69 -0
  36. package/dist/tests/harness.js.map +1 -0
  37. package/dist/tests/modal.unit.test.d.ts +2 -0
  38. package/dist/tests/modal.unit.test.d.ts.map +1 -0
  39. package/dist/tests/modal.unit.test.js +72 -0
  40. package/dist/tests/modal.unit.test.js.map +1 -0
  41. package/dist/tests/procaptcha.unit.test.d.ts +2 -0
  42. package/dist/tests/procaptcha.unit.test.d.ts.map +1 -0
  43. package/dist/tests/procaptcha.unit.test.js +57 -0
  44. package/dist/tests/procaptcha.unit.test.js.map +1 -0
  45. package/dist/tests/procaptchaReact.test-d.d.ts +2 -0
  46. package/dist/tests/procaptchaReact.test-d.d.ts.map +1 -0
  47. package/dist/tests/procaptchaReact.test-d.js +72 -0
  48. package/dist/tests/procaptchaReact.test-d.js.map +1 -0
  49. package/dist/tests/procaptchaWidget.unit.test.d.ts +2 -0
  50. package/dist/tests/procaptchaWidget.unit.test.d.ts.map +1 -0
  51. package/dist/tests/procaptchaWidget.unit.test.js +403 -0
  52. package/dist/tests/procaptchaWidget.unit.test.js.map +1 -0
  53. package/dist/tests/render.d.ts +23 -0
  54. package/dist/tests/render.d.ts.map +1 -0
  55. package/dist/tests/render.js +77 -0
  56. package/dist/tests/render.js.map +1 -0
  57. package/dist/tests/setup.d.ts +5 -0
  58. package/dist/tests/setup.d.ts.map +1 -0
  59. package/dist/tests/setup.js +3 -0
  60. package/dist/tests/setup.js.map +1 -0
  61. package/dist/tests/util.unit.test.d.ts +2 -0
  62. package/dist/tests/util.unit.test.d.ts.map +1 -0
  63. package/dist/tests/util.unit.test.js +84 -0
  64. package/dist/tests/util.unit.test.js.map +1 -0
  65. package/package.json +9 -5
  66. package/vite.test.config.ts +28 -0
@@ -0,0 +1,403 @@
1
+ import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
+ import { ModeEnum, } from "@prosopo/types";
3
+ import { act } from "react";
4
+ import { afterEach, beforeEach, describe, expect, test, vi, vitest, } from "vitest";
5
+ import ProcaptchaWidget from "../components/ProcaptchaWidget.js";
6
+ import { challengeResponse, config, frictionless } from "./harness.js";
7
+ import { fire, mount } from "./render.js";
8
+ const start = vi.fn(() => Promise.resolve());
9
+ const cancel = vi.fn();
10
+ const submit = vi.fn(() => Promise.resolve());
11
+ const select = vi.fn();
12
+ const nextRound = vi.fn();
13
+ const reload = vi.fn(() => Promise.resolve());
14
+ let update;
15
+ let readHoneypot;
16
+ const managerArgs = [];
17
+ vi.mock("@prosopo/procaptcha", () => ({
18
+ Manager: (...args) => {
19
+ managerArgs.push(args);
20
+ update = args[2];
21
+ readHoneypot = args[5];
22
+ return { start, cancel, submit, select, nextRound, reload };
23
+ },
24
+ }));
25
+ const changeLanguage = vi.fn(() => Promise.resolve());
26
+ const loadI18next = vi.fn(() => Promise.resolve());
27
+ vi.mock("@prosopo/locale", async (importOriginal) => {
28
+ const actual = await importOriginal();
29
+ return {
30
+ ...actual,
31
+ useTranslation: () => ({ t: (key) => key, ready: true }),
32
+ loadI18next: (sync, language) => loadI18next(sync, language),
33
+ };
34
+ });
35
+ let mounted;
36
+ const i18n = (language) => ({ language, changeLanguage });
37
+ const render = (overrides = {}) => {
38
+ mounted.render(_jsx(ProcaptchaWidget, { config: config(), callbacks: {}, i18n: undefined, ...overrides }));
39
+ };
40
+ const openChallenge = () => ({
41
+ challenge: challengeResponse(),
42
+ solutions: [[]],
43
+ });
44
+ const setState = (next) => {
45
+ act(() => {
46
+ update?.(next);
47
+ });
48
+ };
49
+ const checkbox = () => {
50
+ const element = mounted.container.querySelector('[data-cy="captcha-checkbox"]');
51
+ if (!element)
52
+ throw new Error("expected the checkbox to be rendered");
53
+ return element;
54
+ };
55
+ const modalText = () => document.querySelector(".prosopo-modalOuter")?.textContent ?? "";
56
+ const flush = async () => {
57
+ await act(async () => {
58
+ await Promise.resolve();
59
+ });
60
+ };
61
+ beforeEach(() => {
62
+ vi.clearAllMocks();
63
+ managerArgs.length = 0;
64
+ update = undefined;
65
+ readHoneypot = undefined;
66
+ start.mockImplementation(() => Promise.resolve());
67
+ mounted = mount();
68
+ });
69
+ afterEach(() => {
70
+ mounted.unmount();
71
+ vi.useRealTimers();
72
+ });
73
+ describe("what the user sees at rest", () => {
74
+ test("shows the checkbox for a visible widget", () => {
75
+ render();
76
+ expect(checkbox()).toBeDefined();
77
+ });
78
+ test("labels the checkbox with the translated prompt", () => {
79
+ render();
80
+ expect(checkbox().getAttribute("aria-label")).toBe("WIDGET.I_AM_HUMAN");
81
+ });
82
+ test("keeps the modal closed until there is something to show", () => {
83
+ render();
84
+ const outer = document.querySelector(".prosopo-modalOuter");
85
+ expect(outer?.style.display).toBe("none");
86
+ });
87
+ test("says so when the modal opens with no challenge", () => {
88
+ render();
89
+ setState({ showModal: true });
90
+ expect(modalText()).toContain("No challenge set.");
91
+ });
92
+ test("shows no honeypot unless the provider asked for one", () => {
93
+ render();
94
+ expect(document.querySelector("input[type='text']")).toBeNull();
95
+ });
96
+ test("warns when configured with a reserved test site key", () => {
97
+ render({ config: config({ account: { address: "0" } }) });
98
+ expect(mounted.container.querySelector('[data-cy="test-mode-banner"]')).toBeDefined();
99
+ });
100
+ });
101
+ describe("invisible mode", () => {
102
+ const invisible = () => ({
103
+ config: config({ mode: ModeEnum.invisible }),
104
+ });
105
+ test("renders no checkbox for the user to click", () => {
106
+ render(invisible());
107
+ expect(mounted.container.querySelector('[data-cy="captcha-checkbox"]')).toBeNull();
108
+ });
109
+ test("renders no widget chrome at all", () => {
110
+ render(invisible());
111
+ expect(mounted.container.querySelector(".image-captcha")).toBeNull();
112
+ });
113
+ test("stays silent rather than announcing a missing challenge", () => {
114
+ render(invisible());
115
+ setState({ showModal: true });
116
+ expect(modalText()).toBe("");
117
+ });
118
+ test("still shows the challenge when one arrives", () => {
119
+ render(invisible());
120
+ setState({ showModal: true, ...openChallenge() });
121
+ expect(modalText()).toContain("WIDGET.SELECT_ALL");
122
+ });
123
+ });
124
+ describe("the honeypot", () => {
125
+ test("is rendered when the frictionless flow supplies a question", () => {
126
+ render({ frictionlessState: frictionless({ hp: btoa("dit dah") }) });
127
+ expect(document.body.textContent).toContain("dit dah");
128
+ });
129
+ test("gives the manager a way to read whatever a bot typed", () => {
130
+ render({ frictionlessState: frictionless({ hp: btoa("dit dah") }) });
131
+ const input = document.querySelector("input:not([data-cy='captcha-checkbox'])");
132
+ if (!input)
133
+ throw new Error("expected the honeypot input");
134
+ input.value = "answered";
135
+ expect(readHoneypot?.()).toBe("answered");
136
+ });
137
+ test("reads as undefined while the honeypot is untouched", () => {
138
+ render({ frictionlessState: frictionless({ hp: btoa("dit dah") }) });
139
+ expect(readHoneypot?.()).toBeUndefined();
140
+ });
141
+ test("reads as undefined when there is no honeypot at all", () => {
142
+ render();
143
+ expect(readHoneypot?.()).toBeUndefined();
144
+ });
145
+ });
146
+ describe("clicking the checkbox", () => {
147
+ test("starts the challenge where the user clicked", () => {
148
+ render();
149
+ fire(checkbox(), "click", { clientX: 11, clientY: 22 });
150
+ expect(start).toHaveBeenCalledWith(11, 22);
151
+ });
152
+ test("ignores a synthetic click", () => {
153
+ render();
154
+ fire(checkbox(), "click", { trusted: false });
155
+ expect(start).not.toHaveBeenCalled();
156
+ });
157
+ test("only starts once while a start is still in flight", () => {
158
+ let finish;
159
+ start.mockImplementation(() => new Promise((resolve) => {
160
+ finish = resolve;
161
+ }));
162
+ render();
163
+ fire(checkbox(), "click", { clientX: 1, clientY: 1 });
164
+ expect(mounted.container.querySelector('[aria-label="Loading spinner"]')).not.toBeNull();
165
+ expect(start).toHaveBeenCalledTimes(1);
166
+ finish?.();
167
+ });
168
+ test("shows the checkbox again once the start resolves", async () => {
169
+ render();
170
+ fire(checkbox(), "click");
171
+ await flush();
172
+ expect(checkbox()).toBeDefined();
173
+ });
174
+ test("shows the checkbox again when the start fails", async () => {
175
+ start.mockImplementation(() => Promise.reject(new Error("network down")));
176
+ render();
177
+ fire(checkbox(), "click");
178
+ await flush();
179
+ expect(mounted.container.querySelector('[aria-label="Loading spinner"]')).toBeNull();
180
+ });
181
+ test("reflects a verified user as a ticked box", () => {
182
+ render();
183
+ setState({ isHuman: true });
184
+ expect(checkbox().checked).toBe(true);
185
+ });
186
+ });
187
+ describe("the challenge", () => {
188
+ const withChallenge = () => {
189
+ render();
190
+ setState({ showModal: true, ...openChallenge() });
191
+ };
192
+ test("wires the grid to the manager's select", () => {
193
+ withChallenge();
194
+ const image = document.querySelector(".prosopo-modalOuter img");
195
+ if (!image)
196
+ throw new Error("expected a captcha image");
197
+ fire(image, "click", { clientX: 3, clientY: 4 });
198
+ expect(select).toHaveBeenCalledWith("hash-1", 3, 4);
199
+ });
200
+ test("wires cancel to the manager", () => {
201
+ withChallenge();
202
+ const cancelButton = document.querySelector('.prosopo-modalOuter button[aria-label="WIDGET.CANCEL"]');
203
+ if (!cancelButton)
204
+ throw new Error("expected a cancel button");
205
+ fire(cancelButton, "click");
206
+ expect(cancel).toHaveBeenCalledTimes(1);
207
+ });
208
+ test("wires submit to the manager on the last round", () => {
209
+ withChallenge();
210
+ const submitButton = document.querySelector('.prosopo-modalOuter button[aria-label="WIDGET.SUBMIT"]');
211
+ if (!submitButton)
212
+ throw new Error("expected a submit button");
213
+ fire(submitButton, "click");
214
+ expect(submit).toHaveBeenCalledTimes(1);
215
+ });
216
+ });
217
+ describe("recovering from an error", () => {
218
+ test("stops the spinner so the user can try again", () => {
219
+ render();
220
+ fire(checkbox(), "click");
221
+ setState({ error: { message: "boom", key: "CAPTCHA.UNKNOWN" } });
222
+ expect(mounted.container.querySelector('[aria-label="Loading spinner"]')).toBeNull();
223
+ });
224
+ test("shows the error text against the checkbox", () => {
225
+ render();
226
+ setState({ error: { message: "boom", key: "CAPTCHA.UNKNOWN" } });
227
+ expect(mounted.container.textContent).toContain("boom");
228
+ });
229
+ test("asks the host to re-mint an invalidated session", () => {
230
+ const onSessionInvalidated = vi.fn();
231
+ render({ onSessionInvalidated });
232
+ fire(checkbox(), "click", { clientX: 7, clientY: 8 });
233
+ setState({
234
+ error: { message: "gone", key: "CAPTCHA.NO_SESSION_FOUND" },
235
+ });
236
+ expect(onSessionInvalidated).toHaveBeenCalledWith(7, 8);
237
+ });
238
+ test("asks only once, however often the error re-renders", () => {
239
+ const onSessionInvalidated = vi.fn();
240
+ render({ onSessionInvalidated });
241
+ setState({ error: { message: "gone", key: "CAPTCHA.NO_SESSION_FOUND" } });
242
+ setState({
243
+ error: { message: "gone again", key: "CAPTCHA.NO_SESSION_FOUND" },
244
+ });
245
+ expect(onSessionInvalidated).toHaveBeenCalledTimes(1);
246
+ });
247
+ test("reports no coordinates when the user never clicked", () => {
248
+ const onSessionInvalidated = vi.fn();
249
+ render({ onSessionInvalidated });
250
+ setState({ error: { message: "gone", key: "CAPTCHA.NO_SESSION_FOUND" } });
251
+ expect(onSessionInvalidated).toHaveBeenCalledWith(undefined, undefined);
252
+ });
253
+ test("falls back to restarting the frictionless flow", () => {
254
+ vi.useFakeTimers();
255
+ const restart = vi.fn();
256
+ render({ frictionlessState: frictionless({ restart }) });
257
+ setState({ error: { message: "gone", key: "CAPTCHA.NO_SESSION_FOUND" } });
258
+ expect(restart).not.toHaveBeenCalled();
259
+ act(() => {
260
+ vi.advanceTimersByTime(100);
261
+ });
262
+ expect(restart).toHaveBeenCalledTimes(1);
263
+ });
264
+ test("leaves an ordinary error to the host, restarting nothing", () => {
265
+ vi.useFakeTimers();
266
+ const restart = vi.fn();
267
+ render({ frictionlessState: frictionless({ restart }) });
268
+ setState({ error: { message: "boom", key: "CAPTCHA.UNKNOWN" } });
269
+ act(() => {
270
+ vi.advanceTimersByTime(1000);
271
+ });
272
+ expect(restart).not.toHaveBeenCalled();
273
+ });
274
+ });
275
+ describe("starting without a click", () => {
276
+ test("does nothing on mount by default", () => {
277
+ render();
278
+ expect(start).not.toHaveBeenCalled();
279
+ });
280
+ test("starts on mount when the host asked it to", () => {
281
+ render({ autoStart: true });
282
+ expect(start).toHaveBeenCalledWith(0, 0);
283
+ });
284
+ test("resumes at the coordinates the user already clicked", () => {
285
+ render({ autoStart: true, startCoords: { x: 5, y: 6 } });
286
+ expect(start).toHaveBeenCalledWith(5, 6);
287
+ });
288
+ test("remembers those coordinates for a session re-mint", () => {
289
+ const onSessionInvalidated = vi.fn();
290
+ render({
291
+ autoStart: true,
292
+ startCoords: { x: 5, y: 6 },
293
+ onSessionInvalidated,
294
+ });
295
+ setState({ error: { message: "gone", key: "CAPTCHA.NO_SESSION_FOUND" } });
296
+ expect(onSessionInvalidated).toHaveBeenCalledWith(5, 6);
297
+ });
298
+ test("clears the spinner when an auto start fails", async () => {
299
+ start.mockImplementation(() => Promise.reject(new Error("network down")));
300
+ render({ autoStart: true });
301
+ await flush();
302
+ expect(mounted.container.querySelector('[aria-label="Loading spinner"]')).toBeNull();
303
+ });
304
+ });
305
+ describe("the execute event", () => {
306
+ const execute = () => {
307
+ act(() => {
308
+ document.dispatchEvent(new Event("procaptcha:execute"));
309
+ });
310
+ };
311
+ test("opens the modal", () => {
312
+ render();
313
+ execute();
314
+ expect(document.querySelector(".prosopo-modalOuter")?.style.display).toBe("flex");
315
+ });
316
+ test("fetches a challenge when there is none", () => {
317
+ render();
318
+ execute();
319
+ expect(start).toHaveBeenCalledTimes(1);
320
+ });
321
+ test("does not re-fetch when a challenge is already open", () => {
322
+ render();
323
+ setState(openChallenge());
324
+ execute();
325
+ expect(start).not.toHaveBeenCalled();
326
+ });
327
+ test("survives a manager that throws on start", () => {
328
+ start.mockImplementation(() => {
329
+ throw new Error("no provider");
330
+ });
331
+ const consoleError = vi
332
+ .spyOn(console, "error")
333
+ .mockImplementation(() => undefined);
334
+ render();
335
+ expect(() => execute()).not.toThrow();
336
+ expect(consoleError).toHaveBeenCalled();
337
+ consoleError.mockRestore();
338
+ });
339
+ test("stops listening once the widget is gone", () => {
340
+ render();
341
+ mounted.unmount();
342
+ document.dispatchEvent(new Event("procaptcha:execute"));
343
+ expect(start).not.toHaveBeenCalled();
344
+ mounted = mount();
345
+ });
346
+ });
347
+ describe("language", () => {
348
+ test("leaves i18n alone when the site pins no language", () => {
349
+ render();
350
+ expect(loadI18next).not.toHaveBeenCalled();
351
+ expect(changeLanguage).not.toHaveBeenCalled();
352
+ });
353
+ test("switches a supplied i18n instance to the configured language", () => {
354
+ render({ config: config({ language: "fr" }), i18n: i18n("en") });
355
+ expect(changeLanguage).toHaveBeenCalledWith("fr");
356
+ });
357
+ test("leaves a matching i18n instance alone", () => {
358
+ render({ config: config({ language: "fr" }), i18n: i18n("fr") });
359
+ expect(changeLanguage).not.toHaveBeenCalled();
360
+ });
361
+ test("boots i18n itself for a direct React consumer", () => {
362
+ render({ config: config({ language: "de" }) });
363
+ expect(loadI18next).toHaveBeenCalledWith(false, "de");
364
+ });
365
+ });
366
+ describe("theming", () => {
367
+ test("passes the manager the parsed config, not the raw props", () => {
368
+ render({ config: config({ theme: "dark" }) });
369
+ expect(managerArgs[0]?.[0].theme).toBe("dark");
370
+ });
371
+ test("defaults an unthemed widget to the light palette", () => {
372
+ render();
373
+ setState({ showModal: true, ...openChallenge() });
374
+ const panel = document.querySelector(".prosopo-modalInner > div");
375
+ expect(panel?.style.backgroundColor).toBe("rgb(255, 255, 255)");
376
+ });
377
+ });
378
+ describe("the manager itself", () => {
379
+ test("is built once, so the click coordinates survive a re-render", () => {
380
+ render();
381
+ const first = managerArgs.length;
382
+ setState({ isHuman: true });
383
+ expect(vitest.isMockFunction(start)).toBe(true);
384
+ expect(managerArgs.length).toBeGreaterThanOrEqual(first);
385
+ fire(checkbox(), "click", { clientX: 9, clientY: 9 });
386
+ expect(start).toHaveBeenCalledWith(9, 9);
387
+ });
388
+ test("is given the frictionless state so it can reuse the session", () => {
389
+ const frictionlessState = frictionless();
390
+ render({ frictionlessState });
391
+ expect(managerArgs[0]?.[4]).toBe(frictionlessState);
392
+ });
393
+ test("is given the host's callbacks", () => {
394
+ const callbacks = { onHuman: vi.fn() };
395
+ render({ callbacks });
396
+ expect(managerArgs[0]?.[3]).toBe(callbacks);
397
+ });
398
+ test("is given an empty callback set when the host passes none", () => {
399
+ render({ callbacks: undefined });
400
+ expect(managerArgs[0]?.[3]).toEqual({});
401
+ });
402
+ });
403
+ //# sourceMappingURL=procaptchaWidget.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procaptchaWidget.unit.test.js","sourceRoot":"","sources":["../../src/tests/procaptchaWidget.unit.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ReactElement } from "react";
2
+ import { type Root } from "react-dom/client";
3
+ export interface Mounted {
4
+ container: HTMLDivElement;
5
+ root: Root;
6
+ render: (element: ReactElement) => void;
7
+ unmount: () => void;
8
+ }
9
+ export declare const mount: () => Mounted;
10
+ interface ClickOptions {
11
+ trusted?: boolean;
12
+ clientX?: number;
13
+ clientY?: number;
14
+ touches?: {
15
+ clientX: number;
16
+ clientY: number;
17
+ }[];
18
+ }
19
+ export declare const fire: (element: Element, type: string, options?: ClickOptions) => void;
20
+ export declare const fireAndReturn: (element: Element, type: string, options?: ClickOptions) => MouseEvent;
21
+ export declare const asRgb: (hex: string) => string;
22
+ export {};
23
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/tests/render.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,KAAK,IAAI,EAAc,MAAM,kBAAkB,CAAC;AAQzD,MAAM,WAAW,OAAO;IACvB,SAAS,EAAE,cAAc,CAAC;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,KAAK,QAAO,OAwBxB,CAAC;AAEF,UAAU,YAAY;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjD;AA8BD,eAAO,MAAM,IAAI,YACP,OAAO,QACV,MAAM,YACH,YAAY,KACnB,IAcF,CAAC;AAIF,eAAO,MAAM,aAAa,YAChB,OAAO,QACV,MAAM,YACH,YAAY,KACnB,UAOF,CAAC;AAMF,eAAO,MAAM,KAAK,QAAS,MAAM,KAAG,MAanC,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { act } from "react";
2
+ import { createRoot } from "react-dom/client";
3
+ export const mount = () => {
4
+ const container = document.createElement("div");
5
+ document.body.appendChild(container);
6
+ let root;
7
+ act(() => {
8
+ root = createRoot(container);
9
+ });
10
+ if (!root)
11
+ throw new Error("expected a react root");
12
+ const created = root;
13
+ return {
14
+ container,
15
+ root: created,
16
+ render: (element) => {
17
+ act(() => {
18
+ created.render(element);
19
+ });
20
+ },
21
+ unmount: () => {
22
+ act(() => {
23
+ created.unmount();
24
+ });
25
+ container.remove();
26
+ },
27
+ };
28
+ };
29
+ const setTrusted = (event, trusted) => {
30
+ for (const symbol of Object.getOwnPropertySymbols(event)) {
31
+ const impl = Reflect.get(event, symbol);
32
+ if (impl && typeof impl === "object" && "isTrusted" in impl) {
33
+ Object.defineProperty(impl, "isTrusted", {
34
+ configurable: true,
35
+ get: () => trusted,
36
+ set: () => undefined,
37
+ });
38
+ return;
39
+ }
40
+ }
41
+ throw new Error("could not reach the jsdom event implementation");
42
+ };
43
+ export const fire = (element, type, options = {}) => {
44
+ const event = new MouseEvent(type, {
45
+ bubbles: true,
46
+ cancelable: true,
47
+ clientX: options.clientX ?? 0,
48
+ clientY: options.clientY ?? 0,
49
+ });
50
+ setTrusted(event, options.trusted ?? true);
51
+ if (options.touches) {
52
+ Object.defineProperty(event, "touches", { value: options.touches });
53
+ }
54
+ act(() => {
55
+ element.dispatchEvent(event);
56
+ });
57
+ };
58
+ export const fireAndReturn = (element, type, options = {}) => {
59
+ const event = new MouseEvent(type, { bubbles: true, cancelable: true });
60
+ setTrusted(event, options.trusted ?? true);
61
+ act(() => {
62
+ element.dispatchEvent(event);
63
+ });
64
+ return event;
65
+ };
66
+ export const asRgb = (hex) => {
67
+ const short = hex.replace("#", "");
68
+ const value = short.length === 3
69
+ ? short
70
+ .split("")
71
+ .map((c) => c + c)
72
+ .join("")
73
+ : short;
74
+ const channel = (start) => Number.parseInt(value.slice(start, start + 2), 16);
75
+ return `rgb(${channel(0)}, ${channel(2)}, ${channel(4)})`;
76
+ };
77
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/tests/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ declare global {
2
+ var IS_REACT_ACT_ENVIRONMENT: boolean;
3
+ }
4
+ export {};
5
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/tests/setup.ts"],"names":[],"mappings":"AAcA,OAAO,CAAC,MAAM,CAAC;IAEd,IAAI,wBAAwB,EAAE,OAAO,CAAC;CACtC"}
@@ -0,0 +1,3 @@
1
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
2
+ export {};
3
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/tests/setup.ts"],"names":[],"mappings":"AAqBA,UAAU,CAAC,wBAAwB,GAAG,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=util.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/util.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ import { afterEach, describe, expect, test } from "vitest";
2
+ import addDataAttr from "../util/index.js";
3
+ const withNodeEnv = (value, run) => {
4
+ const previous = process.env.NODE_ENV;
5
+ if (value === undefined) {
6
+ Reflect.deleteProperty(process.env, "NODE_ENV");
7
+ }
8
+ else {
9
+ process.env.NODE_ENV = value;
10
+ }
11
+ try {
12
+ run();
13
+ }
14
+ finally {
15
+ if (previous === undefined) {
16
+ Reflect.deleteProperty(process.env, "NODE_ENV");
17
+ }
18
+ else {
19
+ process.env.NODE_ENV = previous;
20
+ }
21
+ }
22
+ };
23
+ afterEach(() => {
24
+ process.env.NODE_ENV = "test";
25
+ });
26
+ describe("addDataAttr", () => {
27
+ test("prefixes every general key with data-", () => {
28
+ expect(addDataAttr({ general: { cy: "widget", role: "box" } })).toEqual({
29
+ "data-cy": "widget",
30
+ "data-role": "box",
31
+ });
32
+ });
33
+ test("returns nothing at all when handed nothing", () => {
34
+ expect(addDataAttr({})).toEqual({});
35
+ });
36
+ test("treats an empty general map as no attributes", () => {
37
+ expect(addDataAttr({ general: {} })).toEqual({});
38
+ });
39
+ test("keeps an empty string value rather than dropping the key", () => {
40
+ expect(addDataAttr({ general: { cy: "" } })).toEqual({ "data-cy": "" });
41
+ });
42
+ test("emits dev attributes outside production", () => {
43
+ withNodeEnv("development", () => {
44
+ expect(addDataAttr({ dev: { cy: "button-next" } })).toEqual({
45
+ "data-cy": "button-next",
46
+ });
47
+ });
48
+ });
49
+ test("drops dev attributes in a production build", () => {
50
+ withNodeEnv("production", () => {
51
+ expect(addDataAttr({ dev: { cy: "button-next" } })).toEqual({});
52
+ });
53
+ });
54
+ test("keeps general attributes in production", () => {
55
+ withNodeEnv("production", () => {
56
+ expect(addDataAttr({ general: { cy: "widget" } })).toEqual({
57
+ "data-cy": "widget",
58
+ });
59
+ });
60
+ });
61
+ test("treats an unset NODE_ENV as non-production", () => {
62
+ withNodeEnv(undefined, () => {
63
+ expect(addDataAttr({ dev: { cy: "button-next" } })).toEqual({
64
+ "data-cy": "button-next",
65
+ });
66
+ });
67
+ });
68
+ test("lets a dev attribute override the general one of the same name", () => {
69
+ withNodeEnv("development", () => {
70
+ expect(addDataAttr({ general: { cy: "general" }, dev: { cy: "dev" } })).toEqual({ "data-cy": "dev" });
71
+ });
72
+ });
73
+ test("leaves the general value in place once dev entries are stripped", () => {
74
+ withNodeEnv("production", () => {
75
+ expect(addDataAttr({ general: { cy: "general" }, dev: { cy: "dev" } })).toEqual({ "data-cy": "general" });
76
+ });
77
+ });
78
+ test("does not mutate the map it was given", () => {
79
+ const general = { cy: "widget" };
80
+ addDataAttr({ general });
81
+ expect(general).toEqual({ cy: "widget" });
82
+ });
83
+ });
84
+ //# sourceMappingURL=util.unit.test.js.map