@prosopo/procaptcha-audio 0.0.0-stage → 0.2.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 (68) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +52 -0
  2. package/.turbo/turbo-build$colon$tsc.log +53 -0
  3. package/.turbo/turbo-build.log +54 -0
  4. package/CHANGELOG.md +35 -0
  5. package/LICENSE +201 -0
  6. package/dist/_virtual/_rolldown/runtime.js +3 -0
  7. package/dist/cjs/components/audioPlayer.cjs +275 -0
  8. package/dist/cjs/components/procaptchaAudio.cjs +7 -0
  9. package/dist/cjs/components/procaptchaWidget.cjs +195 -0
  10. package/dist/cjs/index.cjs +8 -0
  11. package/dist/cjs/services/Manager.cjs +218 -0
  12. package/dist/components/audioPlayer.d.ts +18 -0
  13. package/dist/components/audioPlayer.d.ts.map +1 -0
  14. package/dist/components/audioPlayer.js +275 -0
  15. package/dist/components/audioPlayer.js.map +1 -0
  16. package/dist/components/procaptchaAudio.d.ts +7 -0
  17. package/dist/components/procaptchaAudio.d.ts.map +1 -0
  18. package/dist/components/procaptchaAudio.js +6 -0
  19. package/dist/components/procaptchaAudio.js.map +1 -0
  20. package/dist/components/procaptchaWidget.d.ts +7 -0
  21. package/dist/components/procaptchaWidget.d.ts.map +1 -0
  22. package/dist/components/procaptchaWidget.js +195 -0
  23. package/dist/components/procaptchaWidget.js.map +1 -0
  24. package/dist/index.d.ts +4 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +5 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/services/Manager.d.ts +10 -0
  29. package/dist/services/Manager.d.ts.map +1 -0
  30. package/dist/services/Manager.js +217 -0
  31. package/dist/services/Manager.js.map +1 -0
  32. package/dist/tests/audioPlayer.unit.test.d.ts +2 -0
  33. package/dist/tests/audioPlayer.unit.test.d.ts.map +1 -0
  34. package/dist/tests/audioPlayer.unit.test.js +341 -0
  35. package/dist/tests/audioPlayer.unit.test.js.map +1 -0
  36. package/dist/tests/domHarness.d.ts +20 -0
  37. package/dist/tests/domHarness.d.ts.map +1 -0
  38. package/dist/tests/domHarness.js +56 -0
  39. package/dist/tests/domHarness.js.map +1 -0
  40. package/dist/tests/manager.unit.test.d.ts +2 -0
  41. package/dist/tests/manager.unit.test.d.ts.map +1 -0
  42. package/dist/tests/manager.unit.test.js +627 -0
  43. package/dist/tests/manager.unit.test.js.map +1 -0
  44. package/dist/tests/managerHarness.d.ts +21 -0
  45. package/dist/tests/managerHarness.d.ts.map +1 -0
  46. package/dist/tests/managerHarness.js +67 -0
  47. package/dist/tests/managerHarness.js.map +1 -0
  48. package/dist/tests/procaptchaAudio.test-d.d.ts +2 -0
  49. package/dist/tests/procaptchaAudio.test-d.d.ts.map +1 -0
  50. package/dist/tests/procaptchaAudio.test-d.js +103 -0
  51. package/dist/tests/procaptchaAudio.test-d.js.map +1 -0
  52. package/dist/tests/procaptchaAudio.unit.test.d.ts +2 -0
  53. package/dist/tests/procaptchaAudio.unit.test.d.ts.map +1 -0
  54. package/dist/tests/procaptchaAudio.unit.test.js +93 -0
  55. package/dist/tests/procaptchaAudio.unit.test.js.map +1 -0
  56. package/dist/tests/procaptchaWidget.unit.test.d.ts +2 -0
  57. package/dist/tests/procaptchaWidget.unit.test.d.ts.map +1 -0
  58. package/dist/tests/procaptchaWidget.unit.test.js +597 -0
  59. package/dist/tests/procaptchaWidget.unit.test.js.map +1 -0
  60. package/dist/tests/setup.d.ts +2 -0
  61. package/dist/tests/setup.d.ts.map +1 -0
  62. package/dist/tests/setup.js +12 -0
  63. package/dist/tests/setup.js.map +1 -0
  64. package/package.json +70 -3
  65. package/vite.cjs.config.ts +22 -0
  66. package/vite.esm.config.ts +20 -0
  67. package/vite.test.config.ts +26 -0
  68. package/README.md +0 -3
@@ -0,0 +1,341 @@
1
+ import { lightTheme } from "@prosopo/widget-skeleton";
2
+ import { afterEach, beforeEach, describe, expect, test, vi, } from "vitest";
3
+ import { mountAudioPlayer, } from "../components/audioPlayer.js";
4
+ import { settle } from "./domHarness.js";
5
+ import { CLIP_URI } from "./managerHarness.js";
6
+ const OTHER_CLIP_URI = "data:audio/wav;base64,UklGRiQAAABXQVZFZm10";
7
+ let player;
8
+ let onComplete;
9
+ const translator = () => ({
10
+ t: (key) => key,
11
+ isReady: () => true,
12
+ subscribe: () => () => undefined,
13
+ i18n: {},
14
+ });
15
+ const props = (overrides = {}) => ({
16
+ clip: CLIP_URI,
17
+ characterCount: 5,
18
+ onComplete,
19
+ showRetry: false,
20
+ submitting: false,
21
+ theme: lightTheme,
22
+ translator: translator(),
23
+ ...overrides,
24
+ });
25
+ const render = (playerProps) => {
26
+ if (player) {
27
+ player.update(playerProps);
28
+ }
29
+ else {
30
+ player = mountAudioPlayer(playerProps);
31
+ }
32
+ };
33
+ const overlay = () => document.body;
34
+ const find = (selector) => {
35
+ const element = overlay().querySelector(selector);
36
+ if (!element)
37
+ throw new Error(`expected ${selector} to be rendered`);
38
+ return element;
39
+ };
40
+ const clip = () => find('[data-cy="prosopo-audio-clip"]');
41
+ const playButton = () => find('[data-cy="prosopo-audio-play"]');
42
+ const submitButton = () => find('[data-cy="prosopo-audio-submit"]');
43
+ const answerInput = () => find('[data-cy="prosopo-audio-answer"]');
44
+ const liveRegion = () => find('[aria-live="polite"]');
45
+ const click = (element) => {
46
+ element.dispatchEvent(new MouseEvent("click", { bubbles: true }));
47
+ };
48
+ const type = (value) => {
49
+ const input = answerInput();
50
+ input.value = value;
51
+ input.dispatchEvent(new Event("input", { bubbles: true }));
52
+ };
53
+ const pressEnter = () => {
54
+ answerInput().dispatchEvent(new KeyboardEvent("keydown", { key: "Enter", bubbles: true }));
55
+ };
56
+ let play;
57
+ beforeEach(() => {
58
+ vi.clearAllMocks();
59
+ onComplete =
60
+ vi.fn();
61
+ play = vi.fn();
62
+ play.mockResolvedValue(undefined);
63
+ Object.defineProperty(HTMLMediaElement.prototype, "play", {
64
+ configurable: true,
65
+ writable: true,
66
+ value: play,
67
+ });
68
+ vi.spyOn(window, "requestAnimationFrame").mockImplementation((callback) => {
69
+ callback(0);
70
+ return 0;
71
+ });
72
+ player = undefined;
73
+ });
74
+ afterEach(() => {
75
+ player?.destroy();
76
+ player = undefined;
77
+ vi.useRealTimers();
78
+ vi.restoreAllMocks();
79
+ });
80
+ describe("what it renders", () => {
81
+ test("asks for the number of characters the challenge carries", () => {
82
+ render(props({ characterCount: 6 }));
83
+ expect(overlay().textContent).toContain("WIDGET.AUDIO_INSTRUCTIONS");
84
+ });
85
+ test("loads the clip it was handed", () => {
86
+ render(props());
87
+ expect(clip().getAttribute("src")).toBe(CLIP_URI);
88
+ });
89
+ test("suppresses the browser's own controls, which can offer a download", () => {
90
+ render(props());
91
+ expect(clip().hasAttribute("controls")).toBe(false);
92
+ });
93
+ test("labels the input so a screen reader says what to type", () => {
94
+ render(props());
95
+ expect(answerInput().getAttribute("aria-label")).toBe("WIDGET.AUDIO_INPUT_LABEL");
96
+ });
97
+ test("names the dialog region so it is announced as its own thing", () => {
98
+ render(props());
99
+ expect(overlay().querySelector('[role="dialog"][aria-label="WIDGET.AUDIO_CHALLENGE_LABEL"]')).not.toBeNull();
100
+ });
101
+ test("carries a polite live region rather than an interrupting one", () => {
102
+ render(props());
103
+ expect(liveRegion().getAttribute("aria-live")).toBe("polite");
104
+ });
105
+ test("keeps the field free of autofill, which would offer the last answer", () => {
106
+ render(props());
107
+ expect(answerInput().getAttribute("autocomplete")).toBe("off");
108
+ });
109
+ test("takes the numeric keypad without the number-input behaviour", () => {
110
+ render(props());
111
+ expect(answerInput().getAttribute("type")).toBe("text");
112
+ expect(answerInput().getAttribute("inputmode")).toBe("numeric");
113
+ });
114
+ test("allows slack for separators without letting the field run away", () => {
115
+ render(props({ characterCount: 5 }));
116
+ expect(answerInput().maxLength).toBe(10);
117
+ });
118
+ test("focuses the input, so a keyboard user lands on the work", () => {
119
+ render(props());
120
+ expect(document.activeElement).toBe(answerInput());
121
+ });
122
+ });
123
+ describe("playback", () => {
124
+ test("never autoplays — the user presses play", () => {
125
+ render(props());
126
+ expect(play).not.toHaveBeenCalled();
127
+ });
128
+ test("plays the clip when asked", async () => {
129
+ render(props());
130
+ click(playButton());
131
+ await settle();
132
+ expect(play).toHaveBeenCalledTimes(1);
133
+ expect(liveRegion().textContent).toBe("WIDGET.AUDIO_PLAYING");
134
+ });
135
+ test("restarts from the beginning on a replay", async () => {
136
+ render(props());
137
+ click(playButton());
138
+ await settle();
139
+ clip().currentTime = 2;
140
+ click(playButton());
141
+ await settle();
142
+ expect(clip().currentTime).toBe(0);
143
+ });
144
+ test("says so when the browser refuses to play", async () => {
145
+ play.mockRejectedValue(new Error("blocked"));
146
+ render(props());
147
+ click(playButton());
148
+ await settle();
149
+ expect(liveRegion().textContent).toBe("WIDGET.AUDIO_PLAYBACK_FAILED");
150
+ });
151
+ test("announces the clip finishing", async () => {
152
+ render(props());
153
+ click(playButton());
154
+ await settle();
155
+ clip().dispatchEvent(new Event("ended"));
156
+ expect(liveRegion().textContent).toBe("WIDGET.AUDIO_FINISHED");
157
+ });
158
+ });
159
+ describe("answering", () => {
160
+ test("will not submit an empty answer", () => {
161
+ render(props());
162
+ expect(submitButton().disabled).toBe(true);
163
+ click(submitButton());
164
+ expect(onComplete).not.toHaveBeenCalled();
165
+ });
166
+ test("submits what the user typed", () => {
167
+ render(props());
168
+ type("96475");
169
+ click(submitButton());
170
+ expect(onComplete).toHaveBeenCalledWith("96475", 0, expect.any(Array));
171
+ });
172
+ test("submits on Enter, so the answer can be finished from the keyboard", () => {
173
+ render(props());
174
+ type("96475");
175
+ pressEnter();
176
+ expect(onComplete).toHaveBeenCalledWith("96475", 0, expect.any(Array));
177
+ });
178
+ test("passes separators through for the provider to normalise", () => {
179
+ render(props());
180
+ type("9 6 4 7 5");
181
+ click(submitButton());
182
+ expect(onComplete).toHaveBeenCalledWith("9 6 4 7 5", 0, expect.any(Array));
183
+ });
184
+ test("reports the replays, not the plays", async () => {
185
+ render(props());
186
+ click(playButton());
187
+ await settle();
188
+ click(playButton());
189
+ await settle();
190
+ click(playButton());
191
+ await settle();
192
+ type("96475");
193
+ click(submitButton());
194
+ expect(onComplete).toHaveBeenCalledWith("96475", 2, expect.any(Array));
195
+ });
196
+ test("reports the playback and keystroke trail", async () => {
197
+ render(props());
198
+ click(playButton());
199
+ await settle();
200
+ type("9");
201
+ type("96");
202
+ click(submitButton());
203
+ const events = onComplete.mock.calls[0]?.[2];
204
+ if (!events)
205
+ throw new Error("expected an event trail");
206
+ expect(events.map((event) => event.kind)).toEqual([
207
+ "play",
208
+ "key",
209
+ "key",
210
+ ]);
211
+ expect(events.every((event) => event.t >= 0)).toBe(true);
212
+ });
213
+ test("does not resubmit while a submission is in flight", () => {
214
+ render(props());
215
+ type("96475");
216
+ render(props({ submitting: true }));
217
+ click(submitButton());
218
+ expect(onComplete).not.toHaveBeenCalled();
219
+ expect(answerInput().disabled).toBe(true);
220
+ });
221
+ });
222
+ describe("a wrong answer", () => {
223
+ test("says so, where a screen reader will hear it", () => {
224
+ render(props());
225
+ render(props({ showRetry: true }));
226
+ expect(liveRegion().textContent).toBe("WIDGET.AUDIO_INCORRECT");
227
+ });
228
+ test("clears the typed answer when a fresh clip arrives", () => {
229
+ render(props());
230
+ type("11111");
231
+ render(props({ clip: OTHER_CLIP_URI, showRetry: true }));
232
+ expect(answerInput().value).toBe("");
233
+ });
234
+ test("starts the replay count over, so telemetry is per challenge", async () => {
235
+ render(props());
236
+ click(playButton());
237
+ await settle();
238
+ click(playButton());
239
+ await settle();
240
+ render(props({ clip: OTHER_CLIP_URI, showRetry: true }));
241
+ click(playButton());
242
+ await settle();
243
+ type("96475");
244
+ click(submitButton());
245
+ expect(onComplete).toHaveBeenCalledWith("96475", 0, expect.any(Array));
246
+ });
247
+ test("stops the outgoing clip rather than letting it play over the new one", () => {
248
+ const pause = vi.fn();
249
+ Object.defineProperty(HTMLMediaElement.prototype, "pause", {
250
+ configurable: true,
251
+ writable: true,
252
+ value: pause,
253
+ });
254
+ render(props());
255
+ render(props({ clip: OTHER_CLIP_URI, showRetry: true }));
256
+ expect(pause).toHaveBeenCalled();
257
+ });
258
+ });
259
+ describe("the play button's label", () => {
260
+ test("offers to play before anything has been heard", () => {
261
+ render(props());
262
+ expect(playButton().textContent).toBe("WIDGET.AUDIO_PLAY");
263
+ });
264
+ test("says the clip is playing once the browser has started it", async () => {
265
+ render(props());
266
+ click(playButton());
267
+ await settle();
268
+ expect(playButton().textContent).toBe("WIDGET.AUDIO_PLAYING");
269
+ });
270
+ test("offers a replay once the clip has finished", async () => {
271
+ render(props());
272
+ click(playButton());
273
+ await settle();
274
+ clip().dispatchEvent(new Event("ended"));
275
+ expect(playButton().textContent).toBe("WIDGET.AUDIO_REPLAY");
276
+ });
277
+ });
278
+ describe("arriving as a retry", () => {
279
+ test("announces the miss on a player mounted straight into a retry", () => {
280
+ render(props({ showRetry: true }));
281
+ expect(liveRegion().textContent).toBe("WIDGET.AUDIO_INCORRECT");
282
+ expect(overlay().textContent).toContain("WIDGET.AUDIO_INCORRECT");
283
+ });
284
+ test("the shake stops on its own and leaves the player usable", () => {
285
+ vi.useFakeTimers();
286
+ render(props({ showRetry: true }));
287
+ vi.advanceTimersByTime(600);
288
+ type("96475");
289
+ click(submitButton());
290
+ expect(onComplete).toHaveBeenCalledTimes(1);
291
+ });
292
+ });
293
+ describe("closing it", () => {
294
+ test("Escape asks the widget to dismiss the challenge", () => {
295
+ const onDismiss = vi.fn();
296
+ render(props({ onDismiss }));
297
+ document.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape", bubbles: true }));
298
+ expect(onDismiss).toHaveBeenCalledTimes(1);
299
+ });
300
+ test("tearing it down removes the dialog and silences the clip", () => {
301
+ const pause = vi.fn();
302
+ Object.defineProperty(HTMLMediaElement.prototype, "pause", {
303
+ configurable: true,
304
+ writable: true,
305
+ value: pause,
306
+ });
307
+ render(props());
308
+ player?.destroy();
309
+ player = undefined;
310
+ expect(pause).toHaveBeenCalled();
311
+ expect(overlay().querySelector('[data-cy="prosopo-audio-clip"]')).toBeNull();
312
+ });
313
+ test("a torn-down player no longer submits", () => {
314
+ render(props());
315
+ type("96475");
316
+ const submit = submitButton();
317
+ player?.destroy();
318
+ player = undefined;
319
+ click(submit);
320
+ expect(onComplete).not.toHaveBeenCalled();
321
+ });
322
+ });
323
+ describe("test hooks", () => {
324
+ test("are withheld from a production build", () => {
325
+ const originalNodeEnv = process.env.NODE_ENV;
326
+ process.env.NODE_ENV = "production";
327
+ try {
328
+ render(props());
329
+ expect(overlay().querySelector('[data-cy^="prosopo-audio"]')).toBeNull();
330
+ }
331
+ finally {
332
+ if (undefined === originalNodeEnv) {
333
+ Reflect.deleteProperty(process.env, "NODE_ENV");
334
+ }
335
+ else {
336
+ process.env.NODE_ENV = originalNodeEnv;
337
+ }
338
+ }
339
+ });
340
+ });
341
+ //# sourceMappingURL=audioPlayer.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioPlayer.unit.test.js","sourceRoot":"","sources":["../../src/tests/audioPlayer.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface Mounted {
2
+ container: HTMLDivElement;
3
+ unmount: () => void;
4
+ }
5
+ export declare const mount: () => Mounted;
6
+ interface FireOptions {
7
+ trusted?: boolean;
8
+ clientX?: number;
9
+ clientY?: number;
10
+ touches?: {
11
+ clientX: number;
12
+ clientY: number;
13
+ }[];
14
+ key?: string;
15
+ }
16
+ export declare const fire: (element: Element, type: string, options?: FireOptions) => void;
17
+ export declare const fireAndReturn: (element: Element, type: string, options?: FireOptions) => Event;
18
+ export declare const settle: () => Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=domHarness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domHarness.d.ts","sourceRoot":"","sources":["../../src/tests/domHarness.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,OAAO;IACvB,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,KAAK,QAAO,OASxB,CAAC;AAEF,UAAU,WAAW;IACpB,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;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AA0CD,eAAO,MAAM,IAAI,YACP,OAAO,QACV,MAAM,YACH,WAAW,KAClB,IAEF,CAAC;AAGF,eAAO,MAAM,aAAa,YAChB,OAAO,QACV,MAAM,YACH,WAAW,KAClB,KAQF,CAAC;AAGF,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,IAAI,CAG3C,CAAC"}
@@ -0,0 +1,56 @@
1
+ export const mount = () => {
2
+ const container = document.createElement("div");
3
+ document.body.appendChild(container);
4
+ return {
5
+ container,
6
+ unmount: () => {
7
+ container.remove();
8
+ },
9
+ };
10
+ };
11
+ const setTrusted = (event, trusted) => {
12
+ for (const symbol of Object.getOwnPropertySymbols(event)) {
13
+ const impl = Reflect.get(event, symbol);
14
+ if (impl && typeof impl === "object" && "isTrusted" in impl) {
15
+ Object.defineProperty(impl, "isTrusted", {
16
+ configurable: true,
17
+ get: () => trusted,
18
+ set: () => undefined,
19
+ });
20
+ return;
21
+ }
22
+ }
23
+ throw new Error("could not reach the jsdom event implementation");
24
+ };
25
+ const build = (type, options) => {
26
+ if (undefined !== options.key) {
27
+ return new KeyboardEvent(type, {
28
+ bubbles: true,
29
+ cancelable: true,
30
+ key: options.key,
31
+ });
32
+ }
33
+ return new MouseEvent(type, {
34
+ bubbles: true,
35
+ cancelable: true,
36
+ clientX: options.clientX ?? 0,
37
+ clientY: options.clientY ?? 0,
38
+ });
39
+ };
40
+ export const fire = (element, type, options = {}) => {
41
+ fireAndReturn(element, type, options);
42
+ };
43
+ export const fireAndReturn = (element, type, options = {}) => {
44
+ const event = build(type, options);
45
+ setTrusted(event, options.trusted ?? true);
46
+ if (options.touches) {
47
+ Object.defineProperty(event, "touches", { value: options.touches });
48
+ }
49
+ element.dispatchEvent(event);
50
+ return event;
51
+ };
52
+ export const settle = async () => {
53
+ await new Promise((resolve) => setTimeout(resolve, 0));
54
+ await Promise.resolve();
55
+ };
56
+ //# sourceMappingURL=domHarness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domHarness.js","sourceRoot":"","sources":["../../src/tests/domHarness.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,KAAK,GAAG,GAAY,EAAE;IAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO;QACN,SAAS;QACT,OAAO,EAAE,GAAG,EAAE;YACb,SAAS,CAAC,MAAM,EAAE,CAAC;QACpB,CAAC;KACD,CAAC;AACH,CAAC,CAAC;AAcF,MAAM,UAAU,GAAG,CAAC,KAAY,EAAE,OAAgB,EAAQ,EAAE;IAC3D,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAY,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YAE7D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE;gBACxC,YAAY,EAAE,IAAI;gBAClB,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;gBAClB,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;aACpB,CAAC,CAAC;YACH,OAAO;QACR,CAAC;IACF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,OAAoB,EAAS,EAAE;IAC3D,IAAI,SAAS,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/B,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE;YAC9B,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;SAChB,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE;QAC3B,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC;QAC7B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC;KAC7B,CAAC,CAAC;AACJ,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,IAAI,GAAG,CACnB,OAAgB,EAChB,IAAY,EACZ,UAAuB,EAAE,EAClB,EAAE;IACT,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC5B,OAAgB,EAChB,IAAY,EACZ,UAAuB,EAAE,EACjB,EAAE;IACV,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IAC3C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;IAC/C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAmB,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;AACzB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=manager.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/manager.unit.test.ts"],"names":[],"mappings":""}