vitest 0.9.2 → 0.10.0

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 (30) hide show
  1. package/LICENSE.md +7 -0
  2. package/dist/{chunk-api-setup.7290422e.js → chunk-api-setup.d70fc960.js} +5 -5
  3. package/dist/{chunk-constants.e59013dc.js → chunk-constants.d540b1d1.js} +1 -1
  4. package/dist/{chunk-defaults.9aa0ce42.js → chunk-defaults.04d5d90b.js} +1 -1
  5. package/dist/{chunk-install-pkg.7dd40977.js → chunk-install-pkg.73b84ae1.js} +113 -115
  6. package/dist/chunk-integrations-globals.d2c09cd2.js +29 -0
  7. package/dist/chunk-integrations-spy.f036df6f.js +102 -0
  8. package/dist/{chunk-runtime-chain.94cf66a4.js → chunk-runtime-chain.f863f182.js} +934 -897
  9. package/dist/{chunk-runtime-mocker.7f4b1850.js → chunk-runtime-mocker.111ac858.js} +3 -3
  10. package/dist/{chunk-runtime-rpc.4b80b6bd.js → chunk-runtime-rpc.8f648236.js} +1 -1
  11. package/dist/{chunk-utils-global.10dcdfa6.js → chunk-utils-global.37a7c822.js} +8 -10
  12. package/dist/{chunk-utils-timers.4800834c.js → chunk-utils-timers.12bc05d1.js} +1404 -1057
  13. package/dist/{chunk-vite-node-externalize.ddf2a6fb.js → chunk-vite-node-externalize.5c678054.js} +1773 -4417
  14. package/dist/{chunk-vite-node-utils.7f0053fb.js → chunk-vite-node-utils.33447cc0.js} +71 -71
  15. package/dist/cli.js +13 -13
  16. package/dist/entry.js +15 -919
  17. package/dist/index.d.ts +92 -25
  18. package/dist/index.js +8 -8
  19. package/dist/node.d.ts +25 -7
  20. package/dist/node.js +12 -12
  21. package/dist/spy.js +2 -102
  22. package/dist/vendor-_commonjsHelpers.addc3445.js +3 -0
  23. package/dist/vendor-entry.369fd6c9.js +949 -0
  24. package/dist/vendor-index.405e58ef.js +6291 -0
  25. package/dist/{vendor-index.87b2fc14.js → vendor-index.40be925a.js} +167 -152
  26. package/dist/worker.js +6 -6
  27. package/package.json +11 -11
  28. package/dist/chunk-integrations-globals.c040aaa9.js +0 -23
  29. package/dist/vendor-_commonjsHelpers.34b404ce.js +0 -7
  30. package/dist/vendor-index.ee829ed6.js +0 -5707
@@ -0,0 +1,949 @@
1
+ import { promises } from 'fs';
2
+ import { b as getWorkerState, t as toArray, m as relative, D as partitionSuiteChildren, E as hasTests, u as hasFailed, q as getFullName, r as resetModules } from './chunk-utils-global.37a7c822.js';
3
+ import { Console } from 'console';
4
+ import { Writable } from 'stream';
5
+ import { importModule } from 'local-pkg';
6
+ import { s as suite, t as test, d as describe, i as it, r as runOnce, a as isFirstRun, b as beforeAll, c as afterAll, e as beforeEach, f as afterEach, w as withCallback, g as createExpect, h as expect, v as vitest, j as vi, k as getRunningMode, l as isWatchMode, m as resetRunOnceCounter, R as RealDate, n as clearCollectorContext, o as defaultSuite, p as setHooks, q as getHooks, u as collectorContext, x as getSnapshotClient, y as setState, z as getFn, A as getState } from './chunk-runtime-chain.f863f182.js';
7
+ import chai, { assert, should } from 'chai';
8
+ import { r as rpc } from './chunk-runtime-rpc.8f648236.js';
9
+ import { d as clearTimeout, c as setTimeout, s as stringify } from './chunk-utils-timers.12bc05d1.js';
10
+ import { t as takeCoverage } from './chunk-defaults.04d5d90b.js';
11
+ import { createHash } from 'crypto';
12
+ import { format } from 'util';
13
+
14
+ var index = /*#__PURE__*/Object.freeze({
15
+ __proto__: null,
16
+ suite: suite,
17
+ test: test,
18
+ describe: describe,
19
+ it: it,
20
+ runOnce: runOnce,
21
+ isFirstRun: isFirstRun,
22
+ beforeAll: beforeAll,
23
+ afterAll: afterAll,
24
+ beforeEach: beforeEach,
25
+ afterEach: afterEach,
26
+ withCallback: withCallback,
27
+ assert: assert,
28
+ should: should,
29
+ createExpect: createExpect,
30
+ chai: chai,
31
+ expect: expect,
32
+ vitest: vitest,
33
+ vi: vi,
34
+ getRunningMode: getRunningMode,
35
+ isWatchMode: isWatchMode
36
+ });
37
+
38
+ var node = {
39
+ name: "node",
40
+ async setup() {
41
+ return {
42
+ teardown() {
43
+ }
44
+ };
45
+ }
46
+ };
47
+
48
+ const LIVING_KEYS = [
49
+ "DOMException",
50
+ "URL",
51
+ "URLSearchParams",
52
+ "EventTarget",
53
+ "NamedNodeMap",
54
+ "Node",
55
+ "Attr",
56
+ "Element",
57
+ "DocumentFragment",
58
+ "DOMImplementation",
59
+ "Document",
60
+ "XMLDocument",
61
+ "CharacterData",
62
+ "Text",
63
+ "CDATASection",
64
+ "ProcessingInstruction",
65
+ "Comment",
66
+ "DocumentType",
67
+ "NodeList",
68
+ "HTMLCollection",
69
+ "HTMLOptionsCollection",
70
+ "DOMStringMap",
71
+ "DOMTokenList",
72
+ "StyleSheetList",
73
+ "HTMLElement",
74
+ "HTMLHeadElement",
75
+ "HTMLTitleElement",
76
+ "HTMLBaseElement",
77
+ "HTMLLinkElement",
78
+ "HTMLMetaElement",
79
+ "HTMLStyleElement",
80
+ "HTMLBodyElement",
81
+ "HTMLHeadingElement",
82
+ "HTMLParagraphElement",
83
+ "HTMLHRElement",
84
+ "HTMLPreElement",
85
+ "HTMLUListElement",
86
+ "HTMLOListElement",
87
+ "HTMLLIElement",
88
+ "HTMLMenuElement",
89
+ "HTMLDListElement",
90
+ "HTMLDivElement",
91
+ "HTMLAnchorElement",
92
+ "HTMLAreaElement",
93
+ "HTMLBRElement",
94
+ "HTMLButtonElement",
95
+ "HTMLCanvasElement",
96
+ "HTMLDataElement",
97
+ "HTMLDataListElement",
98
+ "HTMLDetailsElement",
99
+ "HTMLDialogElement",
100
+ "HTMLDirectoryElement",
101
+ "HTMLFieldSetElement",
102
+ "HTMLFontElement",
103
+ "HTMLFormElement",
104
+ "HTMLHtmlElement",
105
+ "HTMLImageElement",
106
+ "HTMLInputElement",
107
+ "HTMLLabelElement",
108
+ "HTMLLegendElement",
109
+ "HTMLMapElement",
110
+ "HTMLMarqueeElement",
111
+ "HTMLMediaElement",
112
+ "HTMLMeterElement",
113
+ "HTMLModElement",
114
+ "HTMLOptGroupElement",
115
+ "HTMLOptionElement",
116
+ "HTMLOutputElement",
117
+ "HTMLPictureElement",
118
+ "HTMLProgressElement",
119
+ "HTMLQuoteElement",
120
+ "HTMLScriptElement",
121
+ "HTMLSelectElement",
122
+ "HTMLSlotElement",
123
+ "HTMLSourceElement",
124
+ "HTMLSpanElement",
125
+ "HTMLTableCaptionElement",
126
+ "HTMLTableCellElement",
127
+ "HTMLTableColElement",
128
+ "HTMLTableElement",
129
+ "HTMLTimeElement",
130
+ "HTMLTableRowElement",
131
+ "HTMLTableSectionElement",
132
+ "HTMLTemplateElement",
133
+ "HTMLTextAreaElement",
134
+ "HTMLUnknownElement",
135
+ "HTMLFrameElement",
136
+ "HTMLFrameSetElement",
137
+ "HTMLIFrameElement",
138
+ "HTMLEmbedElement",
139
+ "HTMLObjectElement",
140
+ "HTMLParamElement",
141
+ "HTMLVideoElement",
142
+ "HTMLAudioElement",
143
+ "HTMLTrackElement",
144
+ "SVGElement",
145
+ "SVGGraphicsElement",
146
+ "SVGSVGElement",
147
+ "SVGTitleElement",
148
+ "SVGAnimatedString",
149
+ "SVGNumber",
150
+ "SVGStringList",
151
+ "Event",
152
+ "CloseEvent",
153
+ "CustomEvent",
154
+ "MessageEvent",
155
+ "ErrorEvent",
156
+ "HashChangeEvent",
157
+ "PopStateEvent",
158
+ "StorageEvent",
159
+ "ProgressEvent",
160
+ "PageTransitionEvent",
161
+ "UIEvent",
162
+ "FocusEvent",
163
+ "InputEvent",
164
+ "MouseEvent",
165
+ "KeyboardEvent",
166
+ "TouchEvent",
167
+ "CompositionEvent",
168
+ "WheelEvent",
169
+ "BarProp",
170
+ "External",
171
+ "Location",
172
+ "History",
173
+ "Screen",
174
+ "Performance",
175
+ "Navigator",
176
+ "PluginArray",
177
+ "MimeTypeArray",
178
+ "Plugin",
179
+ "MimeType",
180
+ "FileReader",
181
+ "Blob",
182
+ "File",
183
+ "FileList",
184
+ "ValidityState",
185
+ "DOMParser",
186
+ "XMLSerializer",
187
+ "FormData",
188
+ "XMLHttpRequestEventTarget",
189
+ "XMLHttpRequestUpload",
190
+ "XMLHttpRequest",
191
+ "WebSocket",
192
+ "NodeFilter",
193
+ "NodeIterator",
194
+ "TreeWalker",
195
+ "AbstractRange",
196
+ "Range",
197
+ "StaticRange",
198
+ "Selection",
199
+ "Storage",
200
+ "CustomElementRegistry",
201
+ "ShadowRoot",
202
+ "MutationObserver",
203
+ "MutationRecord",
204
+ "Headers",
205
+ "AbortController",
206
+ "AbortSignal",
207
+ "Image"
208
+ ];
209
+ const OTHER_KEYS = [
210
+ "addEventListener",
211
+ "alert",
212
+ "atob",
213
+ "blur",
214
+ "btoa",
215
+ "close",
216
+ "confirm",
217
+ "createPopup",
218
+ "dispatchEvent",
219
+ "document",
220
+ "focus",
221
+ "frames",
222
+ "getComputedStyle",
223
+ "history",
224
+ "innerHeight",
225
+ "innerWidth",
226
+ "length",
227
+ "location",
228
+ "matchMedia",
229
+ "moveBy",
230
+ "moveTo",
231
+ "name",
232
+ "navigator",
233
+ "open",
234
+ "outerHeight",
235
+ "outerWidth",
236
+ "pageXOffset",
237
+ "pageYOffset",
238
+ "parent",
239
+ "postMessage",
240
+ "print",
241
+ "prompt",
242
+ "removeEventListener",
243
+ "resizeBy",
244
+ "resizeTo",
245
+ "screen",
246
+ "screenLeft",
247
+ "screenTop",
248
+ "screenX",
249
+ "screenY",
250
+ "scroll",
251
+ "scrollBy",
252
+ "scrollLeft",
253
+ "scrollTo",
254
+ "scrollTop",
255
+ "scrollX",
256
+ "scrollY",
257
+ "self",
258
+ "stop",
259
+ "top",
260
+ "Window",
261
+ "window"
262
+ ];
263
+ const KEYS = LIVING_KEYS.concat(OTHER_KEYS);
264
+
265
+ const allowRewrite = /* @__PURE__ */ new Set([
266
+ "Event",
267
+ "EventTarget"
268
+ ]);
269
+ function getWindowKeys(global, win) {
270
+ const keys = new Set(KEYS.concat(Object.getOwnPropertyNames(win)).filter((k) => {
271
+ if (k.startsWith("_"))
272
+ return false;
273
+ if (k in global)
274
+ return allowRewrite.has(k);
275
+ return true;
276
+ }));
277
+ return keys;
278
+ }
279
+
280
+ var __defProp$1 = Object.defineProperty;
281
+ var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
282
+ var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
283
+ var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
284
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
285
+ var __spreadValues$1 = (a, b) => {
286
+ for (var prop in b || (b = {}))
287
+ if (__hasOwnProp$1.call(b, prop))
288
+ __defNormalProp$1(a, prop, b[prop]);
289
+ if (__getOwnPropSymbols$1)
290
+ for (var prop of __getOwnPropSymbols$1(b)) {
291
+ if (__propIsEnum$1.call(b, prop))
292
+ __defNormalProp$1(a, prop, b[prop]);
293
+ }
294
+ return a;
295
+ };
296
+ var __objRest = (source, exclude) => {
297
+ var target = {};
298
+ for (var prop in source)
299
+ if (__hasOwnProp$1.call(source, prop) && exclude.indexOf(prop) < 0)
300
+ target[prop] = source[prop];
301
+ if (source != null && __getOwnPropSymbols$1)
302
+ for (var prop of __getOwnPropSymbols$1(source)) {
303
+ if (exclude.indexOf(prop) < 0 && __propIsEnum$1.call(source, prop))
304
+ target[prop] = source[prop];
305
+ }
306
+ return target;
307
+ };
308
+ var jsdom = {
309
+ name: "jsdom",
310
+ async setup(global, { jsdom = {} }) {
311
+ const {
312
+ CookieJar,
313
+ JSDOM,
314
+ ResourceLoader,
315
+ VirtualConsole
316
+ } = await importModule("jsdom");
317
+ const _a = jsdom, {
318
+ html = "<!DOCTYPE html>",
319
+ userAgent,
320
+ url = "http://localhost:3000",
321
+ contentType = "text/html",
322
+ pretendToBeVisual = true,
323
+ includeNodeLocations = false,
324
+ runScripts = "dangerously",
325
+ resources,
326
+ console = false,
327
+ cookieJar = false
328
+ } = _a, restOptions = __objRest(_a, [
329
+ "html",
330
+ "userAgent",
331
+ "url",
332
+ "contentType",
333
+ "pretendToBeVisual",
334
+ "includeNodeLocations",
335
+ "runScripts",
336
+ "resources",
337
+ "console",
338
+ "cookieJar"
339
+ ]);
340
+ const dom = new JSDOM(html, __spreadValues$1({
341
+ pretendToBeVisual,
342
+ resources: resources ?? (userAgent ? new ResourceLoader({ userAgent }) : void 0),
343
+ runScripts,
344
+ url,
345
+ virtualConsole: console && global.console ? new VirtualConsole().sendTo(global.console) : void 0,
346
+ cookieJar: cookieJar ? new CookieJar() : void 0,
347
+ includeNodeLocations,
348
+ contentType,
349
+ userAgent
350
+ }, restOptions));
351
+ const keys = getWindowKeys(global, dom.window);
352
+ const overrideObject = /* @__PURE__ */ new Map();
353
+ for (const key of keys) {
354
+ Object.defineProperty(global, key, {
355
+ get() {
356
+ if (overrideObject.has(key))
357
+ return overrideObject.get(key);
358
+ return dom.window[key];
359
+ },
360
+ set(v) {
361
+ overrideObject.set(key, v);
362
+ },
363
+ configurable: true
364
+ });
365
+ }
366
+ return {
367
+ teardown(global2) {
368
+ keys.forEach((key) => delete global2[key]);
369
+ }
370
+ };
371
+ }
372
+ };
373
+
374
+ var happy = {
375
+ name: "happy-dom",
376
+ async setup(global) {
377
+ const { Window } = await importModule("happy-dom");
378
+ const win = new Window();
379
+ const keys = getWindowKeys(global, win);
380
+ const overrideObject = /* @__PURE__ */ new Map();
381
+ for (const key of keys) {
382
+ Object.defineProperty(global, key, {
383
+ get() {
384
+ if (overrideObject.has(key))
385
+ return overrideObject.get(key);
386
+ return win[key];
387
+ },
388
+ set(v) {
389
+ overrideObject.set(key, v);
390
+ },
391
+ configurable: true
392
+ });
393
+ }
394
+ return {
395
+ teardown(global2) {
396
+ win.happyDOM.cancelAsync();
397
+ keys.forEach((key) => delete global2[key]);
398
+ }
399
+ };
400
+ }
401
+ };
402
+
403
+ const environments = {
404
+ node,
405
+ jsdom,
406
+ "happy-dom": happy
407
+ };
408
+
409
+ let globalSetup = false;
410
+ async function setupGlobalEnv(config) {
411
+ resetRunOnceCounter();
412
+ Object.defineProperty(globalThis, "__vitest_index__", {
413
+ value: index,
414
+ enumerable: false
415
+ });
416
+ setupDefines(config.defines);
417
+ if (globalSetup)
418
+ return;
419
+ globalSetup = true;
420
+ setupConsoleLogSpy();
421
+ if (config.globals)
422
+ (await import('./chunk-integrations-globals.d2c09cd2.js')).registerApiGlobally();
423
+ }
424
+ function setupDefines(defines) {
425
+ for (const key in defines)
426
+ globalThis[key] = defines[key];
427
+ }
428
+ function setupConsoleLogSpy() {
429
+ const stdoutBuffer = /* @__PURE__ */ new Map();
430
+ const stderrBuffer = /* @__PURE__ */ new Map();
431
+ const timers = /* @__PURE__ */ new Map();
432
+ const unknownTestId = "__vitest__unknown_test__";
433
+ function schedule(taskId) {
434
+ const timer = timers.get(taskId);
435
+ const { stdoutTime, stderrTime } = timer;
436
+ clearTimeout(timer.timer);
437
+ timer.timer = setTimeout(() => {
438
+ if (stderrTime < stdoutTime) {
439
+ sendStderr(taskId);
440
+ sendStdout(taskId);
441
+ } else {
442
+ sendStdout(taskId);
443
+ sendStderr(taskId);
444
+ }
445
+ });
446
+ }
447
+ function sendStdout(taskId) {
448
+ const buffer = stdoutBuffer.get(taskId);
449
+ if (buffer) {
450
+ const timer = timers.get(taskId);
451
+ rpc().onUserConsoleLog({
452
+ type: "stdout",
453
+ content: buffer.map((i) => String(i)).join(""),
454
+ taskId,
455
+ time: timer.stdoutTime || RealDate.now(),
456
+ size: buffer.length
457
+ });
458
+ stdoutBuffer.set(taskId, []);
459
+ timer.stdoutTime = 0;
460
+ }
461
+ }
462
+ function sendStderr(taskId) {
463
+ const buffer = stderrBuffer.get(taskId);
464
+ if (buffer) {
465
+ const timer = timers.get(taskId);
466
+ rpc().onUserConsoleLog({
467
+ type: "stderr",
468
+ content: buffer.map((i) => String(i)).join(""),
469
+ taskId,
470
+ time: timer.stderrTime || RealDate.now(),
471
+ size: buffer.length
472
+ });
473
+ stderrBuffer.set(taskId, []);
474
+ timer.stderrTime = 0;
475
+ }
476
+ }
477
+ const stdout = new Writable({
478
+ write(data, encoding, callback) {
479
+ var _a, _b;
480
+ const id = ((_b = (_a = getWorkerState()) == null ? void 0 : _a.current) == null ? void 0 : _b.id) ?? unknownTestId;
481
+ let timer = timers.get(id);
482
+ if (timer) {
483
+ timer.stdoutTime = timer.stdoutTime || RealDate.now();
484
+ } else {
485
+ timer = { stdoutTime: RealDate.now(), stderrTime: RealDate.now(), timer: 0 };
486
+ timers.set(id, timer);
487
+ }
488
+ let buffer = stdoutBuffer.get(id);
489
+ if (!buffer) {
490
+ buffer = [];
491
+ stdoutBuffer.set(id, buffer);
492
+ }
493
+ buffer.push(data);
494
+ schedule(id);
495
+ callback();
496
+ }
497
+ });
498
+ const stderr = new Writable({
499
+ write(data, encoding, callback) {
500
+ var _a, _b;
501
+ const id = ((_b = (_a = getWorkerState()) == null ? void 0 : _a.current) == null ? void 0 : _b.id) ?? unknownTestId;
502
+ let timer = timers.get(id);
503
+ if (timer) {
504
+ timer.stderrTime = timer.stderrTime || RealDate.now();
505
+ } else {
506
+ timer = { stderrTime: RealDate.now(), stdoutTime: RealDate.now(), timer: 0 };
507
+ timers.set(id, timer);
508
+ }
509
+ let buffer = stderrBuffer.get(id);
510
+ if (!buffer) {
511
+ buffer = [];
512
+ stderrBuffer.set(id, buffer);
513
+ }
514
+ buffer.push(data);
515
+ schedule(id);
516
+ callback();
517
+ }
518
+ });
519
+ globalThis.console = new Console({
520
+ stdout,
521
+ stderr,
522
+ colorMode: true,
523
+ groupIndentation: 2
524
+ });
525
+ }
526
+ async function withEnv(name, options, fn) {
527
+ const env = await environments[name].setup(globalThis, options);
528
+ try {
529
+ await fn();
530
+ } finally {
531
+ await env.teardown(globalThis);
532
+ }
533
+ }
534
+ async function runSetupFiles(config) {
535
+ const files = toArray(config.setupFiles);
536
+ await Promise.all(files.map(async (file) => {
537
+ getWorkerState().moduleCache.delete(file);
538
+ await import(file);
539
+ }));
540
+ }
541
+
542
+ const OBJECT_PROTO = Object.getPrototypeOf({});
543
+ function serializeError(val, seen = /* @__PURE__ */ new WeakMap()) {
544
+ if (!val || typeof val === "string")
545
+ return val;
546
+ if (typeof val === "function")
547
+ return `Function<${val.name}>`;
548
+ if (typeof val !== "object")
549
+ return val;
550
+ if (val instanceof Promise || "then" in val || val.constructor && val.constructor.prototype === "AsyncFunction")
551
+ return "Promise";
552
+ if (typeof Element !== "undefined" && val instanceof Element)
553
+ return val.tagName;
554
+ if (typeof val.asymmetricMatch === "function")
555
+ return `${val.toString()} ${format(val.sample)}`;
556
+ if (seen.has(val))
557
+ return seen.get(val);
558
+ if (Array.isArray(val)) {
559
+ const clone = new Array(val.length);
560
+ seen.set(val, clone);
561
+ val.forEach((e, i) => {
562
+ clone[i] = serializeError(e, seen);
563
+ });
564
+ return clone;
565
+ } else {
566
+ const clone = /* @__PURE__ */ Object.create(null);
567
+ seen.set(val, clone);
568
+ let obj = val;
569
+ while (obj && obj !== OBJECT_PROTO) {
570
+ Object.getOwnPropertyNames(obj).forEach((key) => {
571
+ if (!(key in clone))
572
+ clone[key] = serializeError(obj[key], seen);
573
+ });
574
+ obj = Object.getPrototypeOf(obj);
575
+ }
576
+ return clone;
577
+ }
578
+ }
579
+ function processError(err) {
580
+ if (!err)
581
+ return err;
582
+ if (err.stack)
583
+ err.stackStr = String(err.stack);
584
+ if (err.name)
585
+ err.nameStr = String(err.name);
586
+ if (typeof err.expected !== "string")
587
+ err.expected = stringify(err.expected);
588
+ if (typeof err.actual !== "string")
589
+ err.actual = stringify(err.actual);
590
+ try {
591
+ return serializeError(err);
592
+ } catch (e) {
593
+ return serializeError(new Error(`Failed to fully serialize error: ${e == null ? void 0 : e.message}.
594
+ Inner error message: ${err == null ? void 0 : err.message}`));
595
+ }
596
+ }
597
+
598
+ const now$1 = Date.now;
599
+ function hash(str, length = 10) {
600
+ return createHash("md5").update(str).digest("hex").slice(0, length);
601
+ }
602
+ async function collectTests(paths, config) {
603
+ const files = [];
604
+ for (const filepath of paths) {
605
+ const path = relative(config.root, filepath);
606
+ const file = {
607
+ id: hash(path),
608
+ name: path,
609
+ type: "suite",
610
+ mode: "run",
611
+ filepath,
612
+ tasks: []
613
+ };
614
+ clearCollectorContext();
615
+ try {
616
+ await runSetupFiles(config);
617
+ await import(filepath);
618
+ const defaultTasks = await defaultSuite.collect(file);
619
+ setHooks(file, getHooks(defaultTasks));
620
+ for (const c of [...defaultTasks.tasks, ...collectorContext.tasks]) {
621
+ if (c.type === "test") {
622
+ file.tasks.push(c);
623
+ } else if (c.type === "suite") {
624
+ file.tasks.push(c);
625
+ } else {
626
+ const start = now$1();
627
+ const suite = await c.collect(file);
628
+ file.collectDuration = now$1() - start;
629
+ if (suite.name || suite.tasks.length)
630
+ file.tasks.push(suite);
631
+ }
632
+ }
633
+ } catch (e) {
634
+ file.result = {
635
+ state: "fail",
636
+ error: processError(e)
637
+ };
638
+ process.stdout.write("\0");
639
+ }
640
+ calculateHash(file);
641
+ const hasOnlyTasks = someTasksAreOnly(file);
642
+ interpretTaskModes(file, config.testNamePattern, hasOnlyTasks, false, config.allowOnly);
643
+ files.push(file);
644
+ }
645
+ return files;
646
+ }
647
+ function interpretTaskModes(suite, namePattern, onlyMode, parentIsOnly, allowOnly) {
648
+ const suiteIsOnly = parentIsOnly || suite.mode === "only";
649
+ suite.tasks.forEach((t) => {
650
+ const includeTask = suiteIsOnly || t.mode === "only";
651
+ if (onlyMode) {
652
+ if (t.type === "suite" && (includeTask || someTasksAreOnly(t))) {
653
+ if (t.mode === "only") {
654
+ checkAllowOnly(t, allowOnly);
655
+ t.mode = "run";
656
+ }
657
+ } else if (t.mode === "run" && !includeTask) {
658
+ t.mode = "skip";
659
+ } else if (t.mode === "only") {
660
+ checkAllowOnly(t, allowOnly);
661
+ t.mode = "run";
662
+ }
663
+ }
664
+ if (t.type === "test") {
665
+ if (namePattern && !getTaskFullName(t).match(namePattern))
666
+ t.mode = "skip";
667
+ } else if (t.type === "suite") {
668
+ if (t.mode === "skip")
669
+ skipAllTasks(t);
670
+ else
671
+ interpretTaskModes(t, namePattern, onlyMode, includeTask, allowOnly);
672
+ }
673
+ });
674
+ if (suite.mode === "run") {
675
+ if (suite.tasks.length && suite.tasks.every((i) => i.mode !== "run"))
676
+ suite.mode = "skip";
677
+ }
678
+ }
679
+ function getTaskFullName(task) {
680
+ return `${task.suite ? `${getTaskFullName(task.suite)} ` : ""}${task.name}`;
681
+ }
682
+ function someTasksAreOnly(suite) {
683
+ return suite.tasks.some((t) => t.mode === "only" || t.type === "suite" && someTasksAreOnly(t));
684
+ }
685
+ function skipAllTasks(suite) {
686
+ suite.tasks.forEach((t) => {
687
+ if (t.mode === "run") {
688
+ t.mode = "skip";
689
+ if (t.type === "suite")
690
+ skipAllTasks(t);
691
+ }
692
+ });
693
+ }
694
+ function checkAllowOnly(task, allowOnly) {
695
+ if (allowOnly)
696
+ return;
697
+ task.result = {
698
+ state: "fail",
699
+ error: processError(new Error("[Vitest] Unexpected .only modifier. Remove it or pass --allowOnly argument to bypass this error"))
700
+ };
701
+ }
702
+ function calculateHash(parent) {
703
+ parent.tasks.forEach((t, idx) => {
704
+ t.id = `${parent.id}_${idx}`;
705
+ if (t.type === "suite")
706
+ calculateHash(t);
707
+ });
708
+ }
709
+
710
+ var __defProp = Object.defineProperty;
711
+ var __defProps = Object.defineProperties;
712
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
713
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
714
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
715
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
716
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
717
+ var __spreadValues = (a, b) => {
718
+ for (var prop in b || (b = {}))
719
+ if (__hasOwnProp.call(b, prop))
720
+ __defNormalProp(a, prop, b[prop]);
721
+ if (__getOwnPropSymbols)
722
+ for (var prop of __getOwnPropSymbols(b)) {
723
+ if (__propIsEnum.call(b, prop))
724
+ __defNormalProp(a, prop, b[prop]);
725
+ }
726
+ return a;
727
+ };
728
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
729
+ const now = Date.now;
730
+ function updateSuiteHookState(suite, name, state) {
731
+ var _a;
732
+ if (!suite.result)
733
+ suite.result = { state: "run" };
734
+ if (!((_a = suite.result) == null ? void 0 : _a.hooks))
735
+ suite.result.hooks = {};
736
+ const suiteHooks = suite.result.hooks;
737
+ if (suiteHooks) {
738
+ suiteHooks[name] = state;
739
+ updateTask(suite);
740
+ }
741
+ }
742
+ async function callSuiteHook(suite, currentTask, name, args) {
743
+ const callbacks = [];
744
+ if (name === "beforeEach" && suite.suite) {
745
+ callbacks.push(...await callSuiteHook(suite.suite, currentTask, name, args));
746
+ }
747
+ updateSuiteHookState(currentTask, name, "run");
748
+ callbacks.push(...await Promise.all(getHooks(suite)[name].map((fn) => fn(...args))));
749
+ updateSuiteHookState(currentTask, name, "pass");
750
+ if (name === "afterEach" && suite.suite) {
751
+ callbacks.push(...await callSuiteHook(suite.suite, currentTask, name, args));
752
+ }
753
+ return callbacks;
754
+ }
755
+ const packs = /* @__PURE__ */ new Map();
756
+ let updateTimer;
757
+ let previousUpdate;
758
+ function updateTask(task) {
759
+ packs.set(task.id, task.result);
760
+ clearTimeout(updateTimer);
761
+ updateTimer = setTimeout(() => {
762
+ previousUpdate = sendTasksUpdate();
763
+ }, 10);
764
+ }
765
+ async function sendTasksUpdate() {
766
+ clearTimeout(updateTimer);
767
+ await previousUpdate;
768
+ if (packs.size) {
769
+ const p = rpc().onTaskUpdate(Array.from(packs));
770
+ packs.clear();
771
+ return p;
772
+ }
773
+ }
774
+ async function runTest(test) {
775
+ var _a, _b;
776
+ if (test.mode !== "run")
777
+ return;
778
+ if (((_a = test.result) == null ? void 0 : _a.state) === "fail") {
779
+ updateTask(test);
780
+ return;
781
+ }
782
+ const start = now();
783
+ test.result = {
784
+ state: "run",
785
+ startTime: start
786
+ };
787
+ updateTask(test);
788
+ clearModuleMocks();
789
+ await getSnapshotClient().setTest(test);
790
+ const workerState = getWorkerState();
791
+ workerState.current = test;
792
+ let beforeEachCleanups = [];
793
+ try {
794
+ beforeEachCleanups = await callSuiteHook(test.suite, test, "beforeEach", [test.context, test.suite]);
795
+ setState({
796
+ assertionCalls: 0,
797
+ isExpectingAssertions: false,
798
+ isExpectingAssertionsError: null,
799
+ expectedAssertionsNumber: null,
800
+ expectedAssertionsNumberErrorGen: null,
801
+ testPath: (_b = test.suite.file) == null ? void 0 : _b.filepath,
802
+ currentTestName: getFullName(test)
803
+ });
804
+ await getFn(test)();
805
+ const { assertionCalls, expectedAssertionsNumber, expectedAssertionsNumberErrorGen, isExpectingAssertions, isExpectingAssertionsError } = getState();
806
+ if (expectedAssertionsNumber !== null && assertionCalls !== expectedAssertionsNumber)
807
+ throw expectedAssertionsNumberErrorGen();
808
+ if (isExpectingAssertions === true && assertionCalls === 0)
809
+ throw isExpectingAssertionsError;
810
+ test.result.state = "pass";
811
+ } catch (e) {
812
+ test.result.state = "fail";
813
+ test.result.error = processError(e);
814
+ }
815
+ try {
816
+ await callSuiteHook(test.suite, test, "afterEach", [test.context, test.suite]);
817
+ await Promise.all(beforeEachCleanups.map((i) => i == null ? void 0 : i()));
818
+ } catch (e) {
819
+ test.result.state = "fail";
820
+ test.result.error = processError(e);
821
+ }
822
+ if (test.fails) {
823
+ if (test.result.state === "pass") {
824
+ test.result.state = "fail";
825
+ test.result.error = processError(new Error("Expect test to fail"));
826
+ } else {
827
+ test.result.state = "pass";
828
+ test.result.error = void 0;
829
+ }
830
+ }
831
+ getSnapshotClient().clearTest();
832
+ test.result.duration = now() - start;
833
+ workerState.current = void 0;
834
+ updateTask(test);
835
+ }
836
+ function markTasksAsSkipped(suite) {
837
+ suite.tasks.forEach((t) => {
838
+ t.mode = "skip";
839
+ t.result = __spreadProps(__spreadValues({}, t.result), { state: "skip" });
840
+ updateTask(t);
841
+ if (t.type === "suite")
842
+ markTasksAsSkipped(t);
843
+ });
844
+ }
845
+ async function runSuite(suite) {
846
+ var _a;
847
+ if (((_a = suite.result) == null ? void 0 : _a.state) === "fail") {
848
+ markTasksAsSkipped(suite);
849
+ updateTask(suite);
850
+ return;
851
+ }
852
+ const start = now();
853
+ suite.result = {
854
+ state: "run",
855
+ startTime: start
856
+ };
857
+ updateTask(suite);
858
+ if (suite.mode === "skip") {
859
+ suite.result.state = "skip";
860
+ } else if (suite.mode === "todo") {
861
+ suite.result.state = "todo";
862
+ } else {
863
+ try {
864
+ const beforeAllCleanups = await callSuiteHook(suite, suite, "beforeAll", [suite]);
865
+ for (const tasksGroup of partitionSuiteChildren(suite)) {
866
+ if (tasksGroup[0].concurrent === true) {
867
+ await Promise.all(tasksGroup.map((c) => runSuiteChild(c)));
868
+ } else {
869
+ for (const c of tasksGroup)
870
+ await runSuiteChild(c);
871
+ }
872
+ }
873
+ await callSuiteHook(suite, suite, "afterAll", [suite]);
874
+ await Promise.all(beforeAllCleanups.map((i) => i == null ? void 0 : i()));
875
+ } catch (e) {
876
+ suite.result.state = "fail";
877
+ suite.result.error = processError(e);
878
+ }
879
+ }
880
+ suite.result.duration = now() - start;
881
+ if (suite.mode === "run") {
882
+ if (!hasTests(suite)) {
883
+ suite.result.state = "fail";
884
+ if (!suite.result.error)
885
+ suite.result.error = new Error(`No test found in suite ${suite.name}`);
886
+ } else if (hasFailed(suite)) {
887
+ suite.result.state = "fail";
888
+ } else {
889
+ suite.result.state = "pass";
890
+ }
891
+ }
892
+ updateTask(suite);
893
+ }
894
+ async function runSuiteChild(c) {
895
+ return c.type === "test" ? runTest(c) : runSuite(c);
896
+ }
897
+ async function runFiles(files, config) {
898
+ var _a;
899
+ for (const file of files) {
900
+ if (!file.tasks.length && !config.passWithNoTests) {
901
+ if (!((_a = file.result) == null ? void 0 : _a.error)) {
902
+ file.result = {
903
+ state: "fail",
904
+ error: new Error(`No test suite found in file ${file.filepath}`)
905
+ };
906
+ }
907
+ }
908
+ await runSuite(file);
909
+ }
910
+ }
911
+ async function startTests(paths, config) {
912
+ const files = await collectTests(paths, config);
913
+ rpc().onCollected(files);
914
+ getSnapshotClient().clear();
915
+ await runFiles(files, config);
916
+ takeCoverage();
917
+ await getSnapshotClient().saveCurrent();
918
+ await sendTasksUpdate();
919
+ }
920
+ function clearModuleMocks() {
921
+ const { clearMocks, mockReset, restoreMocks } = getWorkerState().config;
922
+ if (restoreMocks)
923
+ vi.restoreAllMocks();
924
+ else if (mockReset)
925
+ vi.resetAllMocks();
926
+ else if (clearMocks)
927
+ vi.clearAllMocks();
928
+ }
929
+
930
+ async function run(files, config) {
931
+ var _a;
932
+ await setupGlobalEnv(config);
933
+ const workerState = getWorkerState();
934
+ for (const file of files) {
935
+ workerState.mockMap.clear();
936
+ resetModules();
937
+ const code = await promises.readFile(file, "utf-8");
938
+ const env = ((_a = code.match(/@(?:vitest|jest)-environment\s+?([\w-]+)\b/)) == null ? void 0 : _a[1]) || config.environment || "node";
939
+ if (!["node", "jsdom", "happy-dom"].includes(env))
940
+ throw new Error(`Unsupported environment: ${env}`);
941
+ workerState.filepath = file;
942
+ await withEnv(env, config.environmentOptions || {}, async () => {
943
+ await startTests([file], config);
944
+ });
945
+ workerState.filepath = void 0;
946
+ }
947
+ }
948
+
949
+ export { index as i, run as r };