vitest 0.22.1 → 0.23.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 (46) hide show
  1. package/LICENSE.md +29 -29
  2. package/dist/browser.d.ts +5 -4
  3. package/dist/browser.mjs +11 -9
  4. package/dist/{chunk-api-setup.377c28aa.mjs → chunk-api-setup.5fc06d1d.mjs} +90 -87
  5. package/dist/{chunk-constants.71e8a211.mjs → chunk-constants.6196597b.mjs} +0 -0
  6. package/dist/{chunk-integrations-coverage.d205bd87.mjs → chunk-env-node.ceb43f1c.mjs} +31 -179
  7. package/dist/{chunk-install-pkg.3aa3eae6.mjs → chunk-install-pkg.e081fc1b.mjs} +3 -3
  8. package/dist/chunk-integrations-coverage.99c020eb.mjs +166 -0
  9. package/dist/{chunk-integrations-globals.60af7da3.mjs → chunk-integrations-globals.ef598c23.mjs} +6 -7
  10. package/dist/{chunk-magic-string.efe26975.mjs → chunk-magic-string.56b2b543.mjs} +30 -10
  11. package/dist/{chunk-mock-date.304e29b1.mjs → chunk-mock-date.0d86eaa5.mjs} +26 -5
  12. package/dist/{chunk-node-git.9a7e3153.mjs → chunk-node-git.6f289b0a.mjs} +18 -12
  13. package/dist/{chunk-runtime-chain.be610650.mjs → chunk-runtime-chain.2af36ddf.mjs} +507 -173
  14. package/dist/{chunk-runtime-error.1104e45a.mjs → chunk-runtime-error.ed9b4f70.mjs} +206 -75
  15. package/dist/{chunk-runtime-hooks.5d7073db.mjs → chunk-runtime-hooks.75ce0575.mjs} +18 -12
  16. package/dist/{chunk-runtime-mocker.49d21aa6.mjs → chunk-runtime-mocker.fc76f21d.mjs} +17 -10
  17. package/dist/{chunk-runtime-rpc.57586b73.mjs → chunk-runtime-rpc.3fe371e9.mjs} +1 -2
  18. package/dist/{chunk-utils-source-map.bbf3ad19.mjs → chunk-utils-source-map.70ee97e1.mjs} +11 -5
  19. package/dist/{chunk-vite-node-client.cddda63d.mjs → chunk-vite-node-client.74ebe3d5.mjs} +55 -13
  20. package/dist/{chunk-vite-node-debug.536c4c5b.mjs → chunk-vite-node-debug.2d8a1dc3.mjs} +1 -1
  21. package/dist/{chunk-vite-node-externalize.c843f497.mjs → chunk-vite-node-externalize.41bf722e.mjs} +483 -197
  22. package/dist/{chunk-vite-node-utils.b432150c.mjs → chunk-vite-node-utils.68573626.mjs} +24 -40
  23. package/dist/cli-wrapper.mjs +21 -17
  24. package/dist/cli.mjs +23 -15
  25. package/dist/config.cjs +2 -2
  26. package/dist/config.d.ts +4 -3
  27. package/dist/config.mjs +2 -2
  28. package/dist/entry.mjs +19 -14
  29. package/dist/environments.d.ts +23 -0
  30. package/dist/environments.mjs +3 -0
  31. package/dist/{global-fe52f84b.d.ts → global-ea084c9f.d.ts} +135 -19
  32. package/dist/{index-ea17aa0c.d.ts → index-5f09f4d0.d.ts} +3 -2
  33. package/dist/index.d.ts +6 -5
  34. package/dist/index.mjs +6 -7
  35. package/dist/loader.mjs +3 -4
  36. package/dist/node.d.ts +5 -4
  37. package/dist/node.mjs +14 -12
  38. package/dist/suite.mjs +5 -6
  39. package/dist/vendor-index.0557b03a.mjs +147 -0
  40. package/dist/{vendor-index.9d9196cc.mjs → vendor-index.13e3bda3.mjs} +0 -0
  41. package/dist/{vendor-index.fbec8a81.mjs → vendor-index.4aeeb598.mjs} +2 -2
  42. package/dist/{vendor-index.2ae8040a.mjs → vendor-index.62ce5c33.mjs} +0 -0
  43. package/dist/{vendor-index.29636037.mjs → vendor-index.731a22f2.mjs} +0 -0
  44. package/dist/worker.mjs +17 -15
  45. package/package.json +17 -10
  46. package/dist/chunk-utils-global.fa20c2f6.mjs +0 -5
@@ -0,0 +1,166 @@
1
+ import { importModule } from 'local-pkg';
2
+
3
+ /*
4
+ How it works:
5
+ `this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.
6
+ */
7
+
8
+ class Node {
9
+ value;
10
+ next;
11
+
12
+ constructor(value) {
13
+ this.value = value;
14
+ }
15
+ }
16
+
17
+ class Queue {
18
+ #head;
19
+ #tail;
20
+ #size;
21
+
22
+ constructor() {
23
+ this.clear();
24
+ }
25
+
26
+ enqueue(value) {
27
+ const node = new Node(value);
28
+
29
+ if (this.#head) {
30
+ this.#tail.next = node;
31
+ this.#tail = node;
32
+ } else {
33
+ this.#head = node;
34
+ this.#tail = node;
35
+ }
36
+
37
+ this.#size++;
38
+ }
39
+
40
+ dequeue() {
41
+ const current = this.#head;
42
+ if (!current) {
43
+ return;
44
+ }
45
+
46
+ this.#head = this.#head.next;
47
+ this.#size--;
48
+ return current.value;
49
+ }
50
+
51
+ clear() {
52
+ this.#head = undefined;
53
+ this.#tail = undefined;
54
+ this.#size = 0;
55
+ }
56
+
57
+ get size() {
58
+ return this.#size;
59
+ }
60
+
61
+ * [Symbol.iterator]() {
62
+ let current = this.#head;
63
+
64
+ while (current) {
65
+ yield current.value;
66
+ current = current.next;
67
+ }
68
+ }
69
+ }
70
+
71
+ function pLimit(concurrency) {
72
+ if (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {
73
+ throw new TypeError('Expected `concurrency` to be a number from 1 and up');
74
+ }
75
+
76
+ const queue = new Queue();
77
+ let activeCount = 0;
78
+
79
+ const next = () => {
80
+ activeCount--;
81
+
82
+ if (queue.size > 0) {
83
+ queue.dequeue()();
84
+ }
85
+ };
86
+
87
+ const run = async (fn, resolve, args) => {
88
+ activeCount++;
89
+
90
+ const result = (async () => fn(...args))();
91
+
92
+ resolve(result);
93
+
94
+ try {
95
+ await result;
96
+ } catch {}
97
+
98
+ next();
99
+ };
100
+
101
+ const enqueue = (fn, resolve, args) => {
102
+ queue.enqueue(run.bind(undefined, fn, resolve, args));
103
+
104
+ (async () => {
105
+ // This function needs to wait until the next microtask before comparing
106
+ // `activeCount` to `concurrency`, because `activeCount` is updated asynchronously
107
+ // when the run function is dequeued and called. The comparison in the if-statement
108
+ // needs to happen asynchronously as well to get an up-to-date value for `activeCount`.
109
+ await Promise.resolve();
110
+
111
+ if (activeCount < concurrency && queue.size > 0) {
112
+ queue.dequeue()();
113
+ }
114
+ })();
115
+ };
116
+
117
+ const generator = (fn, ...args) => new Promise(resolve => {
118
+ enqueue(fn, resolve, args);
119
+ });
120
+
121
+ Object.defineProperties(generator, {
122
+ activeCount: {
123
+ get: () => activeCount,
124
+ },
125
+ pendingCount: {
126
+ get: () => queue.size,
127
+ },
128
+ clearQueue: {
129
+ value: () => {
130
+ queue.clear();
131
+ },
132
+ },
133
+ });
134
+
135
+ return generator;
136
+ }
137
+
138
+ const CoverageProviderMap = {
139
+ c8: "@vitest/coverage-c8",
140
+ istanbul: "@vitest/coverage-istanbul"
141
+ };
142
+ async function resolveCoverageProvider(provider) {
143
+ if (typeof provider === "string") {
144
+ const pkg = CoverageProviderMap[provider];
145
+ if (!pkg)
146
+ throw new Error(`Unknown coverage provider: ${provider}`);
147
+ return await importModule(pkg);
148
+ } else {
149
+ return provider;
150
+ }
151
+ }
152
+ async function getCoverageProvider(options) {
153
+ if ((options == null ? void 0 : options.enabled) && (options == null ? void 0 : options.provider)) {
154
+ const { getProvider } = await resolveCoverageProvider(options.provider);
155
+ return await getProvider();
156
+ }
157
+ return null;
158
+ }
159
+ async function takeCoverageInsideWorker(options) {
160
+ if (options.enabled && options.provider) {
161
+ const { takeCoverage } = await resolveCoverageProvider(options.provider);
162
+ return await (takeCoverage == null ? void 0 : takeCoverage());
163
+ }
164
+ }
165
+
166
+ export { CoverageProviderMap as C, getCoverageProvider as g, pLimit as p, takeCoverageInsideWorker as t };
@@ -1,19 +1,18 @@
1
- import { k as globalApis } from './chunk-constants.71e8a211.mjs';
2
- import { i as index } from './chunk-runtime-hooks.5d7073db.mjs';
1
+ import { k as globalApis } from './chunk-constants.6196597b.mjs';
2
+ import { i as index } from './chunk-runtime-hooks.75ce0575.mjs';
3
3
  import 'tty';
4
4
  import 'url';
5
5
  import 'path';
6
- import './chunk-runtime-chain.be610650.mjs';
6
+ import './chunk-runtime-chain.2af36ddf.mjs';
7
7
  import 'util';
8
- import './chunk-mock-date.304e29b1.mjs';
8
+ import './chunk-mock-date.0d86eaa5.mjs';
9
9
  import 'local-pkg';
10
10
  import 'chai';
11
11
  import './vendor-_commonjsHelpers.4da45ef5.mjs';
12
- import './chunk-runtime-rpc.57586b73.mjs';
13
- import './chunk-utils-global.fa20c2f6.mjs';
12
+ import './chunk-runtime-rpc.3fe371e9.mjs';
14
13
  import './chunk-utils-timers.b48455ed.mjs';
15
14
  import 'fs';
16
- import './chunk-utils-source-map.bbf3ad19.mjs';
15
+ import './chunk-utils-source-map.70ee97e1.mjs';
17
16
  import './spy.mjs';
18
17
  import 'tinyspy';
19
18
 
@@ -219,15 +219,20 @@ class Chunk {
219
219
  }
220
220
  }
221
221
 
222
- let btoa = () => {
223
- throw new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');
224
- };
225
- if (typeof window !== 'undefined' && typeof window.btoa === 'function') {
226
- btoa = (str) => window.btoa(unescape(encodeURIComponent(str)));
227
- } else if (typeof Buffer === 'function') {
228
- btoa = (str) => Buffer.from(str, 'utf-8').toString('base64');
222
+ function getBtoa () {
223
+ if (typeof window !== 'undefined' && typeof window.btoa === 'function') {
224
+ return (str) => window.btoa(unescape(encodeURIComponent(str)));
225
+ } else if (typeof Buffer === 'function') {
226
+ return (str) => Buffer.from(str, 'utf-8').toString('base64');
227
+ } else {
228
+ return () => {
229
+ throw new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');
230
+ };
231
+ }
229
232
  }
230
233
 
234
+ const btoa = /*#__PURE__*/ getBtoa();
235
+
231
236
  class SourceMap {
232
237
  constructor(properties) {
233
238
  this.version = 3;
@@ -419,7 +424,7 @@ class MagicString {
419
424
  indentExclusionRanges: { writable: true, value: options.indentExclusionRanges },
420
425
  sourcemapLocations: { writable: true, value: new BitSet() },
421
426
  storedNames: { writable: true, value: {} },
422
- indentStr: { writable: true, value: guessIndent(string) },
427
+ indentStr: { writable: true, value: undefined },
423
428
  });
424
429
 
425
430
  this.byStart[0] = chunk;
@@ -549,7 +554,19 @@ class MagicString {
549
554
  return new SourceMap(this.generateDecodedMap(options));
550
555
  }
551
556
 
557
+ _ensureindentStr() {
558
+ if (this.indentStr === undefined) {
559
+ this.indentStr = guessIndent(this.original);
560
+ }
561
+ }
562
+
563
+ _getRawIndentString() {
564
+ this._ensureindentStr();
565
+ return this.indentStr;
566
+ }
567
+
552
568
  getIndentString() {
569
+ this._ensureindentStr();
553
570
  return this.indentStr === null ? '\t' : this.indentStr;
554
571
  }
555
572
 
@@ -561,7 +578,10 @@ class MagicString {
561
578
  indentStr = undefined;
562
579
  }
563
580
 
564
- indentStr = indentStr !== undefined ? indentStr : this.indentStr || '\t';
581
+ if (indentStr === undefined) {
582
+ this._ensureindentStr();
583
+ indentStr = this.indentStr || '\t';
584
+ }
565
585
 
566
586
  if (indentStr === '') return this; // noop
567
587
 
@@ -1277,7 +1297,7 @@ class Bundle {
1277
1297
  const indentStringCounts = {};
1278
1298
 
1279
1299
  this.sources.forEach((source) => {
1280
- const indentStr = source.content.indentStr;
1300
+ const indentStr = source.content._getRawIndentString();
1281
1301
 
1282
1302
  if (indentStr === null) return;
1283
1303
 
@@ -1,5 +1,5 @@
1
1
  import { relative } from 'path';
2
- import { r as relative$1, p as picocolors, E as EXIT_CODE_RESTART } from './chunk-constants.71e8a211.mjs';
2
+ import { r as relative$1, p as picocolors, E as EXIT_CODE_RESTART } from './chunk-constants.6196597b.mjs';
3
3
  import { isPackageExists } from 'local-pkg';
4
4
 
5
5
  const RealDate = Date;
@@ -178,14 +178,17 @@ function shuffle(array, seed = RealDate.now()) {
178
178
  return array;
179
179
  }
180
180
 
181
+ function isAtomTest(s) {
182
+ return s.type === "test" || s.type === "benchmark";
183
+ }
181
184
  function getTests(suite) {
182
- return toArray(suite).flatMap((s) => s.type === "test" ? [s] : s.tasks.flatMap((c) => c.type === "test" ? [c] : getTests(c)));
185
+ return toArray(suite).flatMap((s) => isAtomTest(s) ? [s] : s.tasks.flatMap((c) => isAtomTest(c) ? [c] : getTests(c)));
183
186
  }
184
187
  function getSuites(suite) {
185
188
  return toArray(suite).flatMap((s) => s.type === "suite" ? [s, ...getSuites(s.tasks)] : []);
186
189
  }
187
190
  function hasTests(suite) {
188
- return toArray(suite).some((s) => s.tasks.some((c) => c.type === "test" || hasTests(c)));
191
+ return toArray(suite).some((s) => s.tasks.some((c) => isAtomTest(c) || hasTests(c)));
189
192
  }
190
193
  function hasFailed(suite) {
191
194
  return toArray(suite).some((s) => {
@@ -211,10 +214,17 @@ function getNames(task) {
211
214
  return names;
212
215
  }
213
216
 
217
+ function getWorkerState() {
218
+ return globalThis.__vitest_worker__;
219
+ }
220
+
214
221
  var _a;
215
222
  const isNode = typeof process < "u" && typeof process.stdout < "u" && !((_a = process.versions) == null ? void 0 : _a.deno) && !globalThis.window;
216
223
  const isBrowser = typeof window !== "undefined";
217
224
  const isWindows = isNode && process.platform === "win32";
225
+ const getRunMode = () => getWorkerState().config.mode;
226
+ const isRunningInTest = () => getRunMode() === "test";
227
+ const isRunningInBenchmark = () => getRunMode() === "benchmark";
218
228
  const relativePath = isBrowser ? relative : relative$1;
219
229
  function partitionSuiteChildren(suite) {
220
230
  let tasksGroup = [];
@@ -263,7 +273,7 @@ async function ensurePackageInstalled(dependency, root) {
263
273
  message: picocolors.exports.reset(`Do you want to install ${picocolors.exports.green(dependency)}?`)
264
274
  });
265
275
  if (install) {
266
- await (await import('./chunk-install-pkg.3aa3eae6.mjs')).installPackage(dependency, { dev: true });
276
+ await (await import('./chunk-install-pkg.e081fc1b.mjs')).installPackage(dependency, { dev: true });
267
277
  process.stderr.write(picocolors.exports.yellow(`
268
278
  Package ${dependency} installed, re-run the command to start.
269
279
  `));
@@ -307,5 +317,16 @@ class AggregateErrorPonyfill extends Error {
307
317
  this.errors = [...errors];
308
318
  }
309
319
  }
320
+ function createDefer() {
321
+ let resolve2 = null;
322
+ let reject = null;
323
+ const p = new Promise((_resolve, _reject) => {
324
+ resolve2 = _resolve;
325
+ reject = _reject;
326
+ });
327
+ p.resolve = resolve2;
328
+ p.reject = reject;
329
+ return p;
330
+ }
310
331
 
311
- export { AggregateErrorPonyfill as A, stdout as B, isWindows as C, mergeSlashes as D, getAllMockableProperties as E, RealDate as R, resetModules as a, getNames as b, assertTypes as c, getFullName as d, notNullish as e, deepClone as f, getCallLastIndex as g, getType as h, isObject as i, isNode as j, relativePath as k, isBrowser as l, mockDate as m, noop as n, shuffle as o, partitionSuiteChildren as p, hasTests as q, resetDate as r, slash as s, toArray as t, hasFailed as u, getTests as v, hasFailedSnapshot as w, getSuites as x, deepMerge as y, ensurePackageInstalled as z };
332
+ export { AggregateErrorPonyfill as A, hasFailedSnapshot as B, getSuites as C, deepMerge as D, ensurePackageInstalled as E, stdout as F, isWindows as G, mergeSlashes as H, getAllMockableProperties as I, RealDate as R, resetModules as a, getCallLastIndex as b, getNames as c, assertTypes as d, getFullName as e, isRunningInTest as f, getWorkerState as g, isRunningInBenchmark as h, isObject as i, notNullish as j, deepClone as k, getType as l, mockDate as m, noop as n, isNode as o, relativePath as p, isBrowser as q, resetDate as r, slash as s, toArray as t, partitionSuiteChildren as u, shuffle as v, hasTests as w, hasFailed as x, createDefer as y, getTests as z };
@@ -1,18 +1,18 @@
1
- import { a as resolve } from './chunk-constants.71e8a211.mjs';
2
- import { e as execa } from './vendor-index.fbec8a81.mjs';
1
+ import { a as resolve } from './chunk-constants.6196597b.mjs';
2
+ import { e as execa } from './vendor-index.4aeeb598.mjs';
3
3
  import 'tty';
4
4
  import 'url';
5
5
  import 'path';
6
6
  import 'buffer';
7
7
  import 'child_process';
8
8
  import 'process';
9
- import './vendor-index.2ae8040a.mjs';
9
+ import './vendor-index.62ce5c33.mjs';
10
10
  import './vendor-_commonjsHelpers.4da45ef5.mjs';
11
11
  import 'fs';
12
12
  import 'stream';
13
13
  import 'util';
14
14
  import 'os';
15
- import './vendor-index.29636037.mjs';
15
+ import './vendor-index.731a22f2.mjs';
16
16
  import 'assert';
17
17
  import 'events';
18
18
 
@@ -51,18 +51,24 @@ class VitestGit {
51
51
  return [...staged, ...unstaged];
52
52
  }
53
53
  getFilesSince(hash) {
54
- return this.resolveFilesWithGitCommand(["diff", "--name-only", `${hash}...HEAD`]);
54
+ return this.resolveFilesWithGitCommand(
55
+ ["diff", "--name-only", `${hash}...HEAD`]
56
+ );
55
57
  }
56
58
  getStagedFiles() {
57
- return this.resolveFilesWithGitCommand(["diff", "--cached", "--name-only"]);
59
+ return this.resolveFilesWithGitCommand(
60
+ ["diff", "--cached", "--name-only"]
61
+ );
58
62
  }
59
63
  getUnstagedFiles() {
60
- return this.resolveFilesWithGitCommand([
61
- "ls-files",
62
- "--other",
63
- "--modified",
64
- "--exclude-standard"
65
- ]);
64
+ return this.resolveFilesWithGitCommand(
65
+ [
66
+ "ls-files",
67
+ "--other",
68
+ "--modified",
69
+ "--exclude-standard"
70
+ ]
71
+ );
66
72
  }
67
73
  async getRoot(cwd) {
68
74
  const options = ["rev-parse", "--show-cdup"];