@rstest/core 0.6.0 → 0.6.2

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.
package/dist/0~470.js ADDED
@@ -0,0 +1,382 @@
1
+ import 'module';
2
+ /*#__PURE__*/ import.meta.url;
3
+ import { __webpack_require__ } from "./runtime.js";
4
+ import { getTestEntries, getSetupFiles, isTTY, clearScreen, src_logger } from "./857.js";
5
+ import { createCoverageProvider } from "./603.js";
6
+ import { prepareRsbuild, createPool, createRsbuildServer } from "./0~814.js";
7
+ const picocolors = __webpack_require__("../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js");
8
+ var picocolors_default = /*#__PURE__*/ __webpack_require__.n(picocolors);
9
+ const isCliShortcutsEnabled = ()=>isTTY('stdin');
10
+ async function setupCliShortcuts({ closeServer, runAll, updateSnapshot, runFailedTests, runWithTestNamePattern, runWithFileFilters }) {
11
+ const { createInterface, emitKeypressEvents } = await import("./0~610.js").then(__webpack_require__.bind(__webpack_require__, "node:readline"));
12
+ const rl = createInterface({
13
+ input: process.stdin,
14
+ output: process.stdout
15
+ });
16
+ emitKeypressEvents(process.stdin);
17
+ process.stdin.setRawMode(true);
18
+ process.stdin.resume();
19
+ process.stdin.setEncoding('utf8');
20
+ let isPrompting = false;
21
+ const clearCurrentInputLine = ()=>{
22
+ try {
23
+ process.stdout.write('\r\x1b[2K');
24
+ } catch {}
25
+ };
26
+ const promptInput = async (promptText, onComplete)=>{
27
+ if (isPrompting) return;
28
+ isPrompting = true;
29
+ let buffer = '';
30
+ const render = ()=>{
31
+ process.stdout.write(`\r\x1b[2K${promptText}${buffer}`);
32
+ };
33
+ render();
34
+ const onPromptKey = async (str, key)=>{
35
+ if (!isPrompting) return;
36
+ if (key.ctrl && 'c' === key.name) process.exit(0);
37
+ if ('return' === key.name || 'enter' === key.name) {
38
+ process.stdin.off('keypress', onPromptKey);
39
+ process.stdout.write('\n');
40
+ const value = '' === buffer.trim() ? void 0 : buffer.trim();
41
+ isPrompting = false;
42
+ await onComplete(value);
43
+ return;
44
+ }
45
+ if ('escape' === key.name) {
46
+ clearCurrentInputLine();
47
+ process.stdin.off('keypress', onPromptKey);
48
+ isPrompting = false;
49
+ return;
50
+ }
51
+ if ('backspace' === key.name) {
52
+ buffer = buffer.slice(0, -1);
53
+ render();
54
+ return;
55
+ }
56
+ if ('string' == typeof str && 1 === str.length) {
57
+ buffer += str;
58
+ render();
59
+ }
60
+ };
61
+ process.stdin.on('keypress', onPromptKey);
62
+ };
63
+ const shortcuts = [
64
+ {
65
+ key: 'f',
66
+ description: `${picocolors_default().bold('f')} ${picocolors_default().dim('rerun failed tests')}`,
67
+ action: async ()=>{
68
+ await runFailedTests();
69
+ }
70
+ },
71
+ {
72
+ key: 'a',
73
+ description: `${picocolors_default().bold('a')} ${picocolors_default().dim('rerun all tests')}`,
74
+ action: async ()=>{
75
+ await runAll();
76
+ }
77
+ },
78
+ {
79
+ key: 'u',
80
+ description: `${picocolors_default().bold('u')} ${picocolors_default().dim('update snapshot')}`,
81
+ action: async ()=>{
82
+ await updateSnapshot();
83
+ }
84
+ },
85
+ {
86
+ key: 't',
87
+ description: `${picocolors_default().bold('t')} ${picocolors_default().dim('filter by a test name regex pattern')}`,
88
+ action: async ()=>{
89
+ clearCurrentInputLine();
90
+ await promptInput('Enter test name pattern (empty to clear): ', async (pattern)=>{
91
+ await runWithTestNamePattern(pattern);
92
+ });
93
+ }
94
+ },
95
+ {
96
+ key: 'p',
97
+ description: `${picocolors_default().bold('p')} ${picocolors_default().dim('filter by a filename regex pattern')}`,
98
+ action: async ()=>{
99
+ clearCurrentInputLine();
100
+ await promptInput('Enter file name pattern (empty to clear): ', async (input)=>{
101
+ const filters = input ? input.split(/\s+/).filter(Boolean) : void 0;
102
+ await runWithFileFilters(filters);
103
+ });
104
+ }
105
+ },
106
+ {
107
+ key: 'c',
108
+ description: `${picocolors_default().bold('c')} ${picocolors_default().dim('clear screen')}`,
109
+ action: ()=>{
110
+ clearScreen(true);
111
+ }
112
+ },
113
+ {
114
+ key: 'q',
115
+ description: `${picocolors_default().bold('q')} ${picocolors_default().dim('quit process')}`,
116
+ action: async ()=>{
117
+ try {
118
+ await closeServer();
119
+ } finally{
120
+ process.exit(0);
121
+ }
122
+ }
123
+ }
124
+ ];
125
+ const handleKeypress = (str, key)=>{
126
+ if (isPrompting) return;
127
+ if (key.ctrl && 'c' === key.name) process.exit(0);
128
+ for (const shortcut of shortcuts)if (str === shortcut.key) {
129
+ clearCurrentInputLine();
130
+ shortcut.action();
131
+ return;
132
+ }
133
+ if ('h' === str) {
134
+ clearCurrentInputLine();
135
+ let message = ` ${picocolors_default().bold(picocolors_default().blue('Shortcuts:'))}\n`;
136
+ for (const shortcut of shortcuts)message += ` ${shortcut.description}\n`;
137
+ src_logger.log(message);
138
+ }
139
+ };
140
+ process.stdin.on('keypress', handleKeypress);
141
+ return ()=>{
142
+ try {
143
+ process.stdin.setRawMode(false);
144
+ process.stdin.pause();
145
+ } catch {}
146
+ process.stdin.off('keypress', handleKeypress);
147
+ rl.close();
148
+ };
149
+ }
150
+ async function runTests(context) {
151
+ const { rootPath, reporters, projects, snapshotManager, command, normalizedConfig: { coverage } } = context;
152
+ const entriesCache = new Map();
153
+ const globTestSourceEntries = async (name)=>{
154
+ const { include, exclude, includeSource, root } = projects.find((p)=>p.environmentName === name).normalizedConfig;
155
+ const entries = await getTestEntries({
156
+ include,
157
+ exclude: exclude.patterns,
158
+ includeSource,
159
+ rootPath,
160
+ projectRoot: root,
161
+ fileFilters: context.fileFilters || []
162
+ });
163
+ entriesCache.set(name, {
164
+ entries,
165
+ fileFilters: context.fileFilters
166
+ });
167
+ return entries;
168
+ };
169
+ const setupFiles = Object.fromEntries(context.projects.map((project)=>{
170
+ const { environmentName, rootPath, normalizedConfig: { setupFiles } } = project;
171
+ return [
172
+ environmentName,
173
+ getSetupFiles(setupFiles, rootPath)
174
+ ];
175
+ }));
176
+ const rsbuildInstance = await prepareRsbuild(context, globTestSourceEntries, setupFiles);
177
+ const { getRsbuildStats, closeServer } = await createRsbuildServer({
178
+ inspectedConfig: {
179
+ ...context.normalizedConfig,
180
+ projects: context.projects.map((p)=>p.normalizedConfig)
181
+ },
182
+ globTestSourceEntries: 'watch' === command ? globTestSourceEntries : async (name)=>{
183
+ if (entriesCache.has(name)) return entriesCache.get(name).entries;
184
+ return globTestSourceEntries(name);
185
+ },
186
+ setupFiles,
187
+ rsbuildInstance,
188
+ rootPath
189
+ });
190
+ const recommendWorkerCount = 'watch' === command ? 1 / 0 : Array.from(entriesCache.values()).reduce((acc, entry)=>acc + Object.keys(entry.entries).length, 0);
191
+ const pool = await createPool({
192
+ context,
193
+ recommendWorkerCount
194
+ });
195
+ const coverageProvider = coverage.enabled ? await createCoverageProvider(coverage, context.rootPath) : null;
196
+ if (coverageProvider) src_logger.log(` ${picocolors_default().gray('Coverage enabled with')} %s\n`, picocolors_default().yellow(coverage.provider));
197
+ const run = async ({ fileFilters, mode = 'all', buildStart = Date.now() } = {})=>{
198
+ let testStart;
199
+ const currentEntries = [];
200
+ const currentDeletedEntries = [];
201
+ const returns = await Promise.all(context.projects.map(async (p)=>{
202
+ const { assetNames, entries, setupEntries, getAssetFiles, getSourceMaps, affectedEntries, deletedEntries } = await getRsbuildStats({
203
+ environmentName: p.environmentName,
204
+ fileFilters
205
+ });
206
+ testStart ??= Date.now();
207
+ currentDeletedEntries.push(...deletedEntries);
208
+ let finalEntries = entries;
209
+ if ('on-demand' === mode) {
210
+ if (0 === affectedEntries.length) src_logger.debug(picocolors_default().yellow(`No test files need re-run in project(${p.environmentName}).`));
211
+ else src_logger.debug(picocolors_default().yellow(`Test files to re-run in project(${p.environmentName}):\n`) + affectedEntries.map((e)=>e.testPath).join('\n') + '\n');
212
+ finalEntries = affectedEntries;
213
+ } else src_logger.debug(picocolors_default().yellow(fileFilters?.length ? `Run filtered tests in project(${p.environmentName}).\n` : `Run all tests in project(${p.environmentName}).\n`));
214
+ currentEntries.push(...finalEntries);
215
+ const { results, testResults } = await pool.runTests({
216
+ entries: finalEntries,
217
+ getSourceMaps,
218
+ setupEntries,
219
+ getAssetFiles,
220
+ project: p,
221
+ updateSnapshot: context.snapshotManager.options.updateSnapshot
222
+ });
223
+ return {
224
+ results,
225
+ testResults,
226
+ assetNames,
227
+ getSourceMaps
228
+ };
229
+ }));
230
+ const buildTime = testStart - buildStart;
231
+ const testTime = Date.now() - testStart;
232
+ const duration = {
233
+ totalTime: testTime + buildTime,
234
+ buildTime,
235
+ testTime
236
+ };
237
+ const results = returns.flatMap((r)=>r.results);
238
+ const testResults = returns.flatMap((r)=>r.testResults);
239
+ context.updateReporterResultState(results, testResults, currentDeletedEntries);
240
+ if (0 === results.length) {
241
+ if ('watch' === command) if ('on-demand' === mode) src_logger.log(picocolors_default().yellow('No test files need re-run.'));
242
+ else src_logger.log(picocolors_default().yellow('No test files found.'));
243
+ else {
244
+ const code = context.normalizedConfig.passWithNoTests ? 0 : 1;
245
+ src_logger.log(picocolors_default()[code ? 'red' : 'yellow'](`No test files found, exiting with code ${code}.`));
246
+ process.exitCode = code;
247
+ }
248
+ if ('all' === mode) {
249
+ if (context.fileFilters?.length) src_logger.log(picocolors_default().gray('filter: '), context.fileFilters.join(picocolors_default().gray(', ')));
250
+ context.projects.forEach((p)=>{
251
+ if (context.projects.length > 1) {
252
+ src_logger.log('');
253
+ src_logger.log(picocolors_default().gray('project:'), p.name);
254
+ }
255
+ src_logger.log(picocolors_default().gray('include:'), p.normalizedConfig.include.join(picocolors_default().gray(', ')));
256
+ src_logger.log(picocolors_default().gray('exclude:'), p.normalizedConfig.exclude.patterns.join(picocolors_default().gray(', ')));
257
+ });
258
+ }
259
+ }
260
+ const isFailure = results.some((r)=>'fail' === r.status);
261
+ if (isFailure) process.exitCode = 1;
262
+ for (const reporter of reporters)await reporter.onTestRunEnd?.({
263
+ results: context.reporterResults.results,
264
+ testResults: context.reporterResults.testResults,
265
+ snapshotSummary: snapshotManager.summary,
266
+ duration,
267
+ getSourcemap: async (name)=>{
268
+ const resource = returns.find((r)=>r.assetNames.includes(name));
269
+ const sourceMap = (await resource?.getSourceMaps([
270
+ name
271
+ ]))?.[name];
272
+ return sourceMap ? JSON.parse(sourceMap) : null;
273
+ },
274
+ filterRerunTestPaths: currentEntries.length ? currentEntries.map((e)=>e.testPath) : void 0
275
+ });
276
+ if (coverageProvider && (!isFailure || coverage.reportOnFailure)) {
277
+ const { generateCoverage } = await import("./0~204.js").then((mod)=>({
278
+ generateCoverage: mod.generateCoverage
279
+ }));
280
+ await generateCoverage(context, results, coverageProvider);
281
+ }
282
+ };
283
+ if ('watch' === command) {
284
+ const enableCliShortcuts = isCliShortcutsEnabled();
285
+ const afterTestsWatchRun = ()=>{
286
+ src_logger.log(picocolors_default().green(' Waiting for file changes...'));
287
+ if (enableCliShortcuts) if (snapshotManager.summary.unmatched) src_logger.log(` ${picocolors_default().dim('press')} ${picocolors_default().yellow(picocolors_default().bold('u'))} ${picocolors_default().dim('to update snapshot')}${picocolors_default().dim(', press')} ${picocolors_default().bold('h')} ${picocolors_default().dim('to show help')}\n`);
288
+ else src_logger.log(` ${picocolors_default().dim('press')} ${picocolors_default().bold('h')} ${picocolors_default().dim('to show help')}${picocolors_default().dim(', press')} ${picocolors_default().bold('q')} ${picocolors_default().dim('to quit')}\n`);
289
+ };
290
+ const { onBeforeRestart } = await import("./0~365.js").then((mod)=>({
291
+ onBeforeRestart: mod.onBeforeRestart
292
+ }));
293
+ onBeforeRestart(async ()=>{
294
+ await pool.close();
295
+ await closeServer();
296
+ });
297
+ let buildStart;
298
+ rsbuildInstance.onBeforeDevCompile(({ isFirstCompile })=>{
299
+ buildStart = Date.now();
300
+ if (!isFirstCompile) clearScreen();
301
+ });
302
+ rsbuildInstance.onAfterDevCompile(async ({ isFirstCompile })=>{
303
+ snapshotManager.clear();
304
+ await run({
305
+ buildStart,
306
+ mode: isFirstCompile ? 'all' : 'on-demand'
307
+ });
308
+ buildStart = void 0;
309
+ if (isFirstCompile && enableCliShortcuts) {
310
+ const closeCliShortcuts = await setupCliShortcuts({
311
+ closeServer: async ()=>{
312
+ await pool.close();
313
+ await closeServer();
314
+ },
315
+ runAll: async ()=>{
316
+ clearScreen();
317
+ snapshotManager.clear();
318
+ context.normalizedConfig.testNamePattern = void 0;
319
+ context.fileFilters = void 0;
320
+ await run({
321
+ mode: 'all'
322
+ });
323
+ afterTestsWatchRun();
324
+ },
325
+ runWithTestNamePattern: async (pattern)=>{
326
+ clearScreen();
327
+ context.normalizedConfig.testNamePattern = pattern;
328
+ if (pattern) src_logger.log(`\n${picocolors_default().dim('Applied testNamePattern:')} ${picocolors_default().bold(pattern)}\n`);
329
+ else src_logger.log(`\n${picocolors_default().dim('Cleared testNamePattern filter')}\n`);
330
+ snapshotManager.clear();
331
+ await run();
332
+ afterTestsWatchRun();
333
+ },
334
+ runWithFileFilters: async (filters)=>{
335
+ clearScreen();
336
+ if (filters && filters.length > 0) src_logger.log(`\n${picocolors_default().dim('Applied file filters:')} ${picocolors_default().bold(filters.join(', '))}\n`);
337
+ else src_logger.log(`\n${picocolors_default().dim('Cleared file filters')}\n`);
338
+ snapshotManager.clear();
339
+ context.fileFilters = filters;
340
+ const entries = await Promise.all(projects.map(async (p)=>globTestSourceEntries(p.environmentName))).then((entries)=>entries.reduce((acc, entry)=>acc.concat(...Object.values(entry)), []));
341
+ if (!entries.length) return void src_logger.log(filters ? picocolors_default().yellow(`\nNo matching test files to run with current file filters: ${filters.join(',')}\n`) : picocolors_default().yellow('\nNo matching test files to run.\n'));
342
+ await run({
343
+ fileFilters: entries
344
+ });
345
+ afterTestsWatchRun();
346
+ },
347
+ runFailedTests: async ()=>{
348
+ const failedTests = context.reporterResults.results.filter((result)=>'fail' === result.status).map((r)=>r.testPath);
349
+ if (!failedTests.length) return void src_logger.log(picocolors_default().yellow('\nNo failed tests were found that needed to be rerun.'));
350
+ clearScreen();
351
+ snapshotManager.clear();
352
+ await run({
353
+ fileFilters: failedTests,
354
+ mode: 'all'
355
+ });
356
+ afterTestsWatchRun();
357
+ },
358
+ updateSnapshot: async ()=>{
359
+ if (!snapshotManager.summary.unmatched) return void src_logger.log(picocolors_default().yellow('\nNo snapshots were found that needed to be updated.'));
360
+ const failedTests = context.reporterResults.results.filter((result)=>result.snapshotResult?.unmatched).map((r)=>r.testPath);
361
+ clearScreen();
362
+ const originalUpdateSnapshot = snapshotManager.options.updateSnapshot;
363
+ snapshotManager.clear();
364
+ snapshotManager.options.updateSnapshot = 'all';
365
+ await run({
366
+ fileFilters: failedTests
367
+ });
368
+ afterTestsWatchRun();
369
+ snapshotManager.options.updateSnapshot = originalUpdateSnapshot;
370
+ }
371
+ });
372
+ onBeforeRestart(closeCliShortcuts);
373
+ }
374
+ afterTestsWatchRun();
375
+ });
376
+ } else {
377
+ await run();
378
+ await pool.close();
379
+ await closeServer();
380
+ }
381
+ }
382
+ export { runTests };
package/dist/0~535.js ADDED
@@ -0,0 +1,10 @@
1
+ import 'module';
2
+ /*#__PURE__*/ import.meta.url;
3
+ import { __webpack_require__ } from "./runtime.js";
4
+ __webpack_require__.add({
5
+ "node:vm?8d7d": function(module) {
6
+ module.exports = import("node:vm").then(function(module) {
7
+ return module;
8
+ });
9
+ }
10
+ });
package/dist/0~607.js ADDED
@@ -0,0 +1,119 @@
1
+ import 'module';
2
+ /*#__PURE__*/ import.meta.url;
3
+ import { __webpack_require__ } from "./runtime.js";
4
+ import { AssertionError, strict } from "node:assert";
5
+ import { Console } from "node:console";
6
+ import { prettyTime } from "./857.js";
7
+ const external_node_util_ = __webpack_require__("node:util");
8
+ const picocolors = __webpack_require__("../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js");
9
+ var picocolors_default = /*#__PURE__*/ __webpack_require__.n(picocolors);
10
+ const RealDate = Date;
11
+ function createCustomConsole({ rpc, testPath, printConsoleTrace }) {
12
+ const getConsoleTrace = ()=>{
13
+ const limit = Error.stackTraceLimit;
14
+ Error.stackTraceLimit = 4;
15
+ const stack = new Error('STACK_TRACE').stack;
16
+ const trace = stack?.split('\n').slice(4).join('\n');
17
+ Error.stackTraceLimit = limit;
18
+ return trace;
19
+ };
20
+ class CustomConsole extends Console {
21
+ _counters = {};
22
+ _timers = {};
23
+ _groupDepth = 0;
24
+ Console = Console;
25
+ getPrettyName(type) {
26
+ switch(type){
27
+ case 'error':
28
+ return picocolors_default().red(type);
29
+ case 'warn':
30
+ return picocolors_default().yellow(type);
31
+ case 'info':
32
+ return picocolors_default().cyan(type);
33
+ default:
34
+ return picocolors_default().gray(type);
35
+ }
36
+ }
37
+ _log(name, message, type = 'stdout') {
38
+ rpc.onConsoleLog({
39
+ content: ' '.repeat(this._groupDepth) + message,
40
+ name: this.getPrettyName(name),
41
+ testPath,
42
+ type,
43
+ trace: printConsoleTrace ? getConsoleTrace() : void 0
44
+ });
45
+ }
46
+ assert(value, message) {
47
+ try {
48
+ strict(value, message);
49
+ } catch (error) {
50
+ if (!(error instanceof AssertionError)) throw error;
51
+ this._log('assert', error.toString().replaceAll(/:\n\n.*\n/gs, ''), 'stderr');
52
+ }
53
+ }
54
+ count(label = 'default') {
55
+ if (!this._counters[label]) this._counters[label] = 0;
56
+ this._log('count', (0, external_node_util_.format)(`${label}: ${++this._counters[label]}`));
57
+ }
58
+ countReset(label = 'default') {
59
+ this._counters[label] = 0;
60
+ }
61
+ debug(firstArg, ...args) {
62
+ this._log('debug', (0, external_node_util_.format)(firstArg, ...args));
63
+ }
64
+ dir(firstArg, options = {}) {
65
+ const representation = (0, external_node_util_.inspect)(firstArg, options);
66
+ this._log('dir', (0, external_node_util_.formatWithOptions)(options, representation));
67
+ }
68
+ dirxml(firstArg, ...args) {
69
+ this._log('dirxml', (0, external_node_util_.format)(firstArg, ...args));
70
+ }
71
+ error(firstArg, ...args) {
72
+ this._log('error', (0, external_node_util_.format)(firstArg, ...args), 'stderr');
73
+ }
74
+ group(title, ...args) {
75
+ this._groupDepth++;
76
+ if (null != title || args.length > 0) this._log('group', picocolors_default().bold((0, external_node_util_.format)(title, ...args)));
77
+ }
78
+ groupCollapsed(title, ...args) {
79
+ this._groupDepth++;
80
+ if (null != title || args.length > 0) this._log('groupCollapsed', picocolors_default().bold((0, external_node_util_.format)(title, ...args)));
81
+ }
82
+ groupEnd() {
83
+ if (this._groupDepth > 0) this._groupDepth--;
84
+ }
85
+ info(firstArg, ...args) {
86
+ this._log('info', (0, external_node_util_.format)(firstArg, ...args));
87
+ }
88
+ log(firstArg, ...args) {
89
+ this._log('log', (0, external_node_util_.format)(firstArg, ...args));
90
+ }
91
+ time(label = 'default') {
92
+ if (null != this._timers[label]) return;
93
+ this._timers[label] = new RealDate();
94
+ }
95
+ timeEnd(label = 'default') {
96
+ const startTime = this._timers[label];
97
+ if (null != startTime) {
98
+ const endTime = RealDate.now();
99
+ const time = endTime - startTime.getTime();
100
+ this._log('time', (0, external_node_util_.format)(`${label}: ${prettyTime(time)}`));
101
+ delete this._timers[label];
102
+ }
103
+ }
104
+ timeLog(label = 'default', ...data) {
105
+ const startTime = this._timers[label];
106
+ if (null != startTime) {
107
+ const endTime = new RealDate();
108
+ const time = endTime.getTime() - startTime.getTime();
109
+ this._log('time', (0, external_node_util_.format)(`${label}: ${prettyTime(time)}`, ...data));
110
+ }
111
+ }
112
+ warn(firstArg, ...args) {
113
+ this._log('warn', (0, external_node_util_.format)(firstArg, ...args), 'stderr');
114
+ }
115
+ getBuffer() {}
116
+ }
117
+ return new CustomConsole(process.stdout, process.stderr);
118
+ }
119
+ export { createCustomConsole };
package/dist/0~610.js ADDED
@@ -0,0 +1,10 @@
1
+ import 'module';
2
+ /*#__PURE__*/ import.meta.url;
3
+ import { __webpack_require__ } from "./runtime.js";
4
+ __webpack_require__.add({
5
+ "node:readline": function(module) {
6
+ module.exports = import("node:readline").then(function(module) {
7
+ return module;
8
+ });
9
+ }
10
+ });
package/dist/0~673.js ADDED
@@ -0,0 +1,10 @@
1
+ import 'module';
2
+ /*#__PURE__*/ import.meta.url;
3
+ import { __webpack_require__ } from "./runtime.js";
4
+ __webpack_require__.add({
5
+ jsdom: function(module) {
6
+ module.exports = import("jsdom").then(function(module) {
7
+ return module;
8
+ });
9
+ }
10
+ });