@e2e-dev/web 0.11.0-canary-20260928184528

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 (121) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +138 -0
  4. package/dist/.build.json +1 -0
  5. package/dist/actions.d.ts +23 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +174 -0
  8. package/dist/actions.js.map +1 -0
  9. package/dist/attempt-session.d.ts +77 -0
  10. package/dist/attempt-session.d.ts.map +1 -0
  11. package/dist/attempt-session.js +293 -0
  12. package/dist/attempt-session.js.map +1 -0
  13. package/dist/browser-connection.d.ts +34 -0
  14. package/dist/browser-connection.d.ts.map +1 -0
  15. package/dist/browser-connection.js +86 -0
  16. package/dist/browser-connection.js.map +1 -0
  17. package/dist/capture-scope.d.ts +21 -0
  18. package/dist/capture-scope.d.ts.map +1 -0
  19. package/dist/capture-scope.js +61 -0
  20. package/dist/capture-scope.js.map +1 -0
  21. package/dist/cdp-recovery.d.ts +29 -0
  22. package/dist/cdp-recovery.d.ts.map +1 -0
  23. package/dist/cdp-recovery.js +84 -0
  24. package/dist/cdp-recovery.js.map +1 -0
  25. package/dist/cdp-selectors.d.ts +15 -0
  26. package/dist/cdp-selectors.d.ts.map +1 -0
  27. package/dist/cdp-selectors.js +52 -0
  28. package/dist/cdp-selectors.js.map +1 -0
  29. package/dist/closed-shadow.d.ts +64 -0
  30. package/dist/closed-shadow.d.ts.map +1 -0
  31. package/dist/closed-shadow.js +142 -0
  32. package/dist/closed-shadow.js.map +1 -0
  33. package/dist/dialogs.d.ts +38 -0
  34. package/dist/dialogs.d.ts.map +1 -0
  35. package/dist/dialogs.js +87 -0
  36. package/dist/dialogs.js.map +1 -0
  37. package/dist/engine.d.ts +26 -0
  38. package/dist/engine.d.ts.map +1 -0
  39. package/dist/engine.js +176 -0
  40. package/dist/engine.js.map +1 -0
  41. package/dist/evaluation.d.ts +18 -0
  42. package/dist/evaluation.d.ts.map +1 -0
  43. package/dist/evaluation.js +35 -0
  44. package/dist/evaluation.js.map +1 -0
  45. package/dist/in-page/read-semantics.d.ts +28 -0
  46. package/dist/in-page/read-semantics.d.ts.map +1 -0
  47. package/dist/in-page/read-semantics.js +1178 -0
  48. package/dist/in-page/read-semantics.js.map +1 -0
  49. package/dist/index.d.ts +22 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +14 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/install.d.ts +40 -0
  54. package/dist/install.d.ts.map +1 -0
  55. package/dist/install.js +117 -0
  56. package/dist/install.js.map +1 -0
  57. package/dist/label-selector.d.ts +37 -0
  58. package/dist/label-selector.d.ts.map +1 -0
  59. package/dist/label-selector.js +53 -0
  60. package/dist/label-selector.js.map +1 -0
  61. package/dist/locators.d.ts +76 -0
  62. package/dist/locators.d.ts.map +1 -0
  63. package/dist/locators.js +289 -0
  64. package/dist/locators.js.map +1 -0
  65. package/dist/observation-capture.d.ts +12 -0
  66. package/dist/observation-capture.d.ts.map +1 -0
  67. package/dist/observation-capture.js +93 -0
  68. package/dist/observation-capture.js.map +1 -0
  69. package/dist/observation.d.ts +63 -0
  70. package/dist/observation.d.ts.map +1 -0
  71. package/dist/observation.js +280 -0
  72. package/dist/observation.js.map +1 -0
  73. package/dist/observe.d.ts +51 -0
  74. package/dist/observe.d.ts.map +1 -0
  75. package/dist/observe.js +105 -0
  76. package/dist/observe.js.map +1 -0
  77. package/dist/operation-budget.d.ts +11 -0
  78. package/dist/operation-budget.d.ts.map +1 -0
  79. package/dist/operation-budget.js +40 -0
  80. package/dist/operation-budget.js.map +1 -0
  81. package/dist/protected-app.d.ts +32 -0
  82. package/dist/protected-app.d.ts.map +1 -0
  83. package/dist/protected-app.js +39 -0
  84. package/dist/protected-app.js.map +1 -0
  85. package/dist/provider.d.ts +158 -0
  86. package/dist/provider.d.ts.map +1 -0
  87. package/dist/provider.js +311 -0
  88. package/dist/provider.js.map +1 -0
  89. package/dist/read-node.d.ts +152 -0
  90. package/dist/read-node.d.ts.map +1 -0
  91. package/dist/read-node.js +42 -0
  92. package/dist/read-node.js.map +1 -0
  93. package/dist/refs.d.ts +43 -0
  94. package/dist/refs.d.ts.map +1 -0
  95. package/dist/refs.js +85 -0
  96. package/dist/refs.js.map +1 -0
  97. package/dist/route-pattern.d.ts +13 -0
  98. package/dist/route-pattern.d.ts.map +1 -0
  99. package/dist/route-pattern.js +55 -0
  100. package/dist/route-pattern.js.map +1 -0
  101. package/dist/selector-engines.d.ts +6 -0
  102. package/dist/selector-engines.d.ts.map +1 -0
  103. package/dist/selector-engines.js +8 -0
  104. package/dist/selector-engines.js.map +1 -0
  105. package/dist/support.d.ts +147 -0
  106. package/dist/support.d.ts.map +1 -0
  107. package/dist/support.js +366 -0
  108. package/dist/support.js.map +1 -0
  109. package/dist/surface.d.ts +313 -0
  110. package/dist/surface.d.ts.map +1 -0
  111. package/dist/surface.js +691 -0
  112. package/dist/surface.js.map +1 -0
  113. package/dist/video.d.ts +59 -0
  114. package/dist/video.d.ts.map +1 -0
  115. package/dist/video.js +116 -0
  116. package/dist/video.js.map +1 -0
  117. package/dist/web.d.ts +191 -0
  118. package/dist/web.d.ts.map +1 -0
  119. package/dist/web.js +382 -0
  120. package/dist/web.js.map +1 -0
  121. package/package.json +67 -0
@@ -0,0 +1,366 @@
1
+ /** Shared error translation, filename, and swipe helpers for the Playwright engine. */
2
+ import { EngineError, withinCleanupBudget } from 'e2e/engine';
3
+ import { ConfigurationError, InfrastructureError, TestError } from 'e2e/engine';
4
+ export const DEFAULT_VIEWPORT = { width: 1280, height: 720 };
5
+ /**
6
+ * The page's viewport in CSS pixels: the emulated size when one is set, else
7
+ * the window's, measured in the page, since `viewport: null` follows the
8
+ * window and Playwright then reports no size of its own.
9
+ */
10
+ export async function currentViewport(page) {
11
+ const emulated = page.viewportSize();
12
+ if (emulated !== null)
13
+ return emulated;
14
+ return page.evaluate(() => ({ width: window.innerWidth, height: window.innerHeight }));
15
+ }
16
+ function centreOf(rect) {
17
+ return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };
18
+ }
19
+ function withinViewport(point, viewport) {
20
+ return point.x >= 0 && point.y >= 0 && point.x <= viewport.width && point.y <= viewport.height;
21
+ }
22
+ /** Narrows one action target to the shared Playwright action surface. */
23
+ export function asActionable(target) {
24
+ return target.kind === 'locator' ? target.locator : target.element;
25
+ }
26
+ /** Owning page of one action target. */
27
+ async function targetPage(target) {
28
+ if (target.kind === 'locator')
29
+ return target.locator.page();
30
+ const frame = await target.element.ownerFrame();
31
+ if (frame === null)
32
+ throw invalidState('element is detached from every frame');
33
+ return frame.page();
34
+ }
35
+ /**
36
+ * Bounding box of one action target. A locator waits up to `timeout` for its
37
+ * element to resolve; an element handle is already resolved, so its box is
38
+ * read immediately.
39
+ */
40
+ function targetBoundingBox(target, timeout) {
41
+ return target.kind === 'locator'
42
+ ? target.locator.boundingBox({ timeout })
43
+ : target.element.boundingBox();
44
+ }
45
+ /** Minimal scroll that brings one target into view, without centring it. */
46
+ async function scrollIntoViewNearest(target) {
47
+ const scroll = (el) => {
48
+ el.scrollIntoView({ block: 'nearest', inline: 'nearest' });
49
+ };
50
+ if (target.kind === 'locator')
51
+ await target.locator.evaluate(scroll);
52
+ else
53
+ await target.element.evaluate(scroll);
54
+ }
55
+ /**
56
+ * Drags one target onto another with the pointer.
57
+ *
58
+ * `Locator.dragTo` exists but takes a locator on both sides, and a node the
59
+ * agent reached through its observed reference is an element handle — which used
60
+ * to make the whole verb unavailable for exactly the elements that have no
61
+ * locator: an unlabelled thumbnail, an empty drop zone. Driving the pointer
62
+ * works for both kinds because a handle has a bounding box like anything else.
63
+ *
64
+ */
65
+ export async function performPointerDrag(source, destination, timeout) {
66
+ // Hover the source first: it auto-waits for actionability and scrolls the
67
+ // source into view, and the gesture starts there, so its position is the one
68
+ // that has to hold.
69
+ await asActionable(source).hover({ timeout });
70
+ const page = await targetPage(source);
71
+ const viewport = await currentViewport(page);
72
+ let from = await targetBoundingBox(source, timeout);
73
+ let to = await targetBoundingBox(destination, timeout);
74
+ // A pointer can only be put at a viewport coordinate, so a destination below
75
+ // the fold has to be brought into view — `Locator.dragTo` scrolls both sides,
76
+ // and a pointer sequence that skips it aims where no element is and drops
77
+ // nothing.
78
+ //
79
+ // Neither obvious tool fits. `scrollIntoViewIfNeeded` centres the destination,
80
+ // which pushes the source out and costs the position hovering just
81
+ // established. `mouse.wheel` does not wait for the scroll it causes, so the
82
+ // boxes read after it are a race. `scrollIntoView({ block: 'nearest' })`
83
+ // scrolls the smallest amount that reveals the element, synchronously, which
84
+ // keeps both endpoints on screen whenever they can be.
85
+ if (to !== null && !withinViewport(centreOf(to), viewport)) {
86
+ await scrollIntoViewNearest(destination);
87
+ from = await targetBoundingBox(source, timeout);
88
+ to = await targetBoundingBox(destination, timeout);
89
+ }
90
+ if (from === null || to === null) {
91
+ throw new EngineError('NOT_ACTIONABLE', 'a drag endpoint has no visible bounding box', {
92
+ retryable: false,
93
+ });
94
+ }
95
+ const start = centreOf(from);
96
+ const end = centreOf(to);
97
+ // Endpoints that cannot be on screen together are reported rather than dragged
98
+ // between: a pointer sequence aimed off-screen looks like a drag that ran and
99
+ // leaves the page untouched, which surfaces later as a confusing assertion
100
+ // instead of the drag failure it is.
101
+ for (const [label, point] of [
102
+ ['source', start],
103
+ ['destination', end],
104
+ ]) {
105
+ if (!withinViewport(point, viewport)) {
106
+ throw new EngineError('NOT_ACTIONABLE', `the drag ${label} is outside the viewport at (${Math.round(point.x)}, ${Math.round(point.y)}) ` +
107
+ `of ${viewport.width}x${viewport.height}: the two endpoints cannot be reached in one gesture`, { retryable: false });
108
+ }
109
+ }
110
+ await page.mouse.move(start.x, start.y);
111
+ await page.mouse.down();
112
+ // Two moves: HTML5 drag-and-drop commits on `dragover`, and one move into the
113
+ // destination does not always produce one.
114
+ await page.mouse.move(end.x, end.y, { steps: 2 });
115
+ await page.mouse.move(end.x, end.y);
116
+ await page.mouse.up();
117
+ }
118
+ /** Playwright colorizes call logs; escape codes are noise in reports. */
119
+ // oxlint-disable-next-line no-control-regex -- intentionally matches the ESC control character
120
+ const ANSI_PATTERN = /\u001b\[\d+(?:;\d+)*m/g;
121
+ /** A failure's message with terminal control sequences removed. */
122
+ export function message(cause) {
123
+ const text = cause instanceof Error ? cause.message : String(cause);
124
+ return text.replace(ANSI_PATTERN, '');
125
+ }
126
+ /** Constrains a caller-supplied artifact label to a safe filename. */
127
+ export function sanitizeFilename(name) {
128
+ return name.replaceAll(/[^A-Za-z0-9._-]/g, '_').slice(0, 64) || 'artifact';
129
+ }
130
+ export function isPwTimeout(cause) {
131
+ return cause instanceof Error && cause.name === 'TimeoutError';
132
+ }
133
+ export function invalidState(text) {
134
+ return new EngineError('INVALID_STATE', text, { retryable: false });
135
+ }
136
+ export function cancelled(text) {
137
+ return new EngineError('CANCELLED', text, { retryable: false });
138
+ }
139
+ /**
140
+ * Holds one error raised on a path nobody awaits - a native dialog nobody
141
+ * handled, a route handler that broke its contract - until the next step
142
+ * enters the surface, which then fails with the real cause, or until the
143
+ * attempt settles when no step follows. Rethrows once: the failure belongs
144
+ * to the step that observes it, not to every later one.
145
+ */
146
+ export class ErrorLatch {
147
+ pending = null;
148
+ running = new Map();
149
+ abandoned = false;
150
+ /** Latches an error; the first one wins until it is thrown. Dropped once `settle` gave up on a handler. */
151
+ latch(error) {
152
+ if (this.abandoned)
153
+ return;
154
+ this.pending ??= error;
155
+ }
156
+ /** Tracks one unawaited `kind` of path (a route or dialog handler) until it settles, so `settle` can wait for it. Its own rejection is the caller's to latch. */
157
+ track(kind, work) {
158
+ const tracked = work.then(() => undefined, () => undefined);
159
+ this.running.set(tracked, kind);
160
+ void tracked.then(() => this.running.delete(tracked));
161
+ }
162
+ /**
163
+ * Rethrows the latched error once; with none latched yet, first waits,
164
+ * within the budget, for the tracked paths running when it was called. One
165
+ * of those that outlives the budget fails closed: `CLEANUP_TIMEOUT` naming
166
+ * it, and whatever it throws afterwards is dropped here on purpose rather
167
+ * than landing on a verdict already reached. A path that starts during the
168
+ * wait is left to the next settle.
169
+ */
170
+ async settle(budget) {
171
+ this.throwPending();
172
+ if (!this.abandoned && this.running.size > 0) {
173
+ const waited = [...this.running.keys()];
174
+ await withinCleanupBudget(Promise.all(waited), budget);
175
+ const outlived = waited.filter((path) => this.running.has(path));
176
+ if (outlived.length > 0) {
177
+ const kinds = [...new Set(outlived.map((path) => this.running.get(path)))].toSorted().join(' and ');
178
+ this.running.clear();
179
+ this.abandoned = true;
180
+ this.throwPending();
181
+ throw new InfrastructureError('CLEANUP_TIMEOUT', `a ${kinds} handler was still running when the cleanup budget ended; anything it throws now is dropped`);
182
+ }
183
+ }
184
+ this.throwPending();
185
+ }
186
+ /** Rethrows the latched error once, if any. */
187
+ throwPending() {
188
+ if (this.pending !== null) {
189
+ const error = this.pending;
190
+ this.pending = null;
191
+ throw error;
192
+ }
193
+ }
194
+ }
195
+ /**
196
+ * The runner error classes as their `name` reads. A project loads this engine
197
+ * from its config file in one module realm (tsx) while the runner's core runs
198
+ * in another, so a runner error reaching the engine is often a `TestError`
199
+ * from a copy of `e2e` this module never imported: `instanceof` says no while
200
+ * `name` and `code` still tell the truth.
201
+ */
202
+ const CLASSIFIED_NAMES = new Set([
203
+ 'EngineError',
204
+ 'TestError',
205
+ 'ConfigurationError',
206
+ 'InfrastructureError',
207
+ ]);
208
+ /**
209
+ * True for an error that already carries its classification: an `EngineError`
210
+ * or a runner error (policy, validation, timeout) from any module copy. Those
211
+ * must cross the boundary untouched; re-wrapping one would turn a
212
+ * `POLICY_DENIED` into an infrastructure failure.
213
+ */
214
+ export function isClassified(cause) {
215
+ if (cause instanceof EngineError || cause instanceof TestError)
216
+ return true;
217
+ if (cause instanceof ConfigurationError || cause instanceof InfrastructureError)
218
+ return true;
219
+ return cause instanceof Error && CLASSIFIED_NAMES.has(cause.name);
220
+ }
221
+ /**
222
+ * True for a `TestError` carrying `code`, from this module copy or another.
223
+ * A matcher that reads a node it may be early for asks this before deciding
224
+ * whether the miss is one more poll or the assertion's failure.
225
+ */
226
+ export function isTestErrorCode(cause, code) {
227
+ return cause instanceof Error && cause.name === 'TestError' && cause.code === code;
228
+ }
229
+ /**
230
+ * How a Playwright failure maps onto the error contract. Every translator in
231
+ * this package and in `actions.ts` follows this table:
232
+ *
233
+ * | Playwright failure | Code |
234
+ * | --------------------------------------------------------------- | ------------------------- |
235
+ * | already an EngineError / runner error | passed through untouched |
236
+ * | `TimeoutError` on a read, navigation, or artifact call | OPERATION_TIMEOUT |
237
+ * | `TimeoutError` on an action, log ends before the input dispatch | NOT_ACTIONABLE |
238
+ * | `TimeoutError` on an action, log shows the dispatch started | ACTION_MAY_HAVE_COMMITTED |
239
+ * | element detached / not attached / no element / resolved hidden | NODE_STALE (retryable) |
240
+ * | execution context destroyed / frame detached by a navigation | NODE_STALE (retryable) |
241
+ * | not an input / not editable / not checkable | NOT_ACTIONABLE |
242
+ * | strict mode violation, anything else | ENGINE_FAILURE |
243
+ *
244
+ * The action split is read from the call log Playwright appends to a timeout
245
+ * message: `performing <x> action`, `<x> action done`, and `waiting for
246
+ * scheduled navigations to finish` are only logged once the input is being (or
247
+ * has been) dispatched, so a timeout whose log reaches them is uncertain and
248
+ * the harness must not blindly repeat it. Every earlier line (`waiting for
249
+ * element to be visible, enabled and stable`, `scrolling into view if
250
+ * needed`, `retrying <x> action`) precedes dispatch and is a plain
251
+ * actionability miss.
252
+ */
253
+ export const POST_DISPATCH_PATTERN = /performing \w+ action|\w+ action done|waiting for scheduled navigations to finish/i;
254
+ /** Translates an unexpected Playwright error at the contract boundary. */
255
+ export function translatePwError(cause, operation) {
256
+ if (isClassified(cause))
257
+ return cause;
258
+ if (isPwTimeout(cause)) {
259
+ return new EngineError('OPERATION_TIMEOUT', `${operation} timed out: ${message(cause)}`, {
260
+ retryable: false,
261
+ cause,
262
+ });
263
+ }
264
+ return new EngineError('ENGINE_FAILURE', `${operation} failed: ${message(cause)}`, {
265
+ retryable: false,
266
+ cause,
267
+ });
268
+ }
269
+ const STALE_PATTERN = /detached|not attached|resolved to hidden|no element|not found/i;
270
+ /**
271
+ * A read that raced a navigation: the document it was reading was replaced
272
+ * mid-flight. Nothing was dispatched, so the read is repeatable against the
273
+ * new document — the same condition as a stale node, reported as one.
274
+ */
275
+ const NAVIGATION_RACE_PATTERN = /execution context was destroyed|because of a navigation|navigating and changing the content|frame was detached|frame got detached|node is detached from document/i;
276
+ /** Whether a Playwright failure describes a read that lost its document to a navigation. */
277
+ function isNavigationRace(cause) {
278
+ return NAVIGATION_RACE_PATTERN.test(message(cause));
279
+ }
280
+ /**
281
+ * Like translatePwError, but a read that lost its document to a navigation
282
+ * becomes retryable NODE_STALE so the runner re-reads the new document instead
283
+ * of failing the call. Timeouts keep their meaning: an observation that cannot
284
+ * be captured in time is not a race.
285
+ */
286
+ export function navigationStaleOr(cause, operation) {
287
+ if (!isClassified(cause) && isNavigationRace(cause)) {
288
+ return new EngineError('NODE_STALE', `${operation}: ${message(cause)}`, {
289
+ retryable: true,
290
+ cause,
291
+ });
292
+ }
293
+ return translatePwError(cause, operation);
294
+ }
295
+ /**
296
+ * Like translatePwError, but detachment/miss failures become retryable
297
+ * NODE_STALE. A timeout stays a timeout: `locate` resolves once and never
298
+ * waits, so a `TimeoutError` there is a budget that ran out, not a miss.
299
+ */
300
+ export function staleOr(cause, operation) {
301
+ if (isClassified(cause))
302
+ return cause;
303
+ const text = message(cause);
304
+ if (STALE_PATTERN.test(text) || isNavigationRace(cause)) {
305
+ return new EngineError('NODE_STALE', `${operation}: ${text}`, { retryable: true, cause });
306
+ }
307
+ return translatePwError(cause, operation);
308
+ }
309
+ export async function performViewportSwipe(page, direction, momentum) {
310
+ const viewport = await currentViewport(page);
311
+ const distance = swipeDistance(direction === 'up' || direction === 'down' ? viewport.height : viewport.width, momentum);
312
+ const [deltaX, deltaY] = wheelDelta(direction, distance);
313
+ return page.mouse.wheel(deltaX, deltaY);
314
+ }
315
+ /**
316
+ * The browser truncates a fractional pointer coordinate, so a point composed
317
+ * from a fractional box (`tap({ position })` on a node at y 148.875) would
318
+ * land on the pixel before the one asked for; it is rounded to the nearest
319
+ * CSS pixel instead.
320
+ */
321
+ export function nearestPixel(point) {
322
+ return { x: Math.round(point.x), y: Math.round(point.y) };
323
+ }
324
+ /** A pointer drag from one viewport point to another, on whole pixels, with an intermediate move so drag handlers see motion. */
325
+ export async function performPointDrag(mouse, start, end) {
326
+ const from = nearestPixel(start);
327
+ const to = nearestPixel(end);
328
+ const middle = nearestPixel({ x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 });
329
+ await mouse.move(from.x, from.y);
330
+ await mouse.down();
331
+ await mouse.move(middle.x, middle.y);
332
+ await mouse.move(to.x, to.y);
333
+ await mouse.up();
334
+ }
335
+ export async function performElementSwipe(target, direction, momentum, timeout) {
336
+ // Hover first: it auto-waits for visibility on both target kinds, so the
337
+ // immediate box read below observes a settled element.
338
+ await asActionable(target).hover({ timeout });
339
+ const box = await targetBoundingBox(target, timeout);
340
+ if (box === null) {
341
+ throw new EngineError('NOT_ACTIONABLE', 'element has no visible bounding box', {
342
+ retryable: false,
343
+ });
344
+ }
345
+ const distance = swipeDistance(direction === 'up' || direction === 'down' ? box.height : box.width, momentum);
346
+ const [deltaX, deltaY] = wheelDelta(direction, distance);
347
+ const page = await targetPage(target);
348
+ await page.mouse.wheel(deltaX, deltaY);
349
+ }
350
+ function swipeDistance(extent, momentum) {
351
+ const ratio = momentum === 'fast' ? 1.5 : momentum === 'slow' ? 0.75 : 0.5;
352
+ return Math.round(extent * ratio);
353
+ }
354
+ function wheelDelta(direction, distance) {
355
+ switch (direction) {
356
+ case 'down':
357
+ return [0, distance];
358
+ case 'up':
359
+ return [0, -distance];
360
+ case 'right':
361
+ return [distance, 0];
362
+ case 'left':
363
+ return [-distance, 0];
364
+ }
365
+ }
366
+ //# sourceMappingURL=support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support.js","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"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"}