@vitest/runner 0.29.8 → 0.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import { format, deepClone, stringify, getOwnProperties, getType, toArray } from '@vitest/utils';
2
+ import { unifiedDiff } from '@vitest/utils/diff';
2
3
 
3
4
  function partitionSuiteChildren(suite) {
4
5
  let tasksGroup = [];
@@ -18,7 +19,9 @@ function partitionSuiteChildren(suite) {
18
19
 
19
20
  const IS_RECORD_SYMBOL = "@@__IMMUTABLE_RECORD__@@";
20
21
  const IS_COLLECTION_SYMBOL = "@@__IMMUTABLE_ITERABLE__@@";
21
- const isImmutable = (v) => v && (v[IS_COLLECTION_SYMBOL] || v[IS_RECORD_SYMBOL]);
22
+ function isImmutable(v) {
23
+ return v && (v[IS_COLLECTION_SYMBOL] || v[IS_RECORD_SYMBOL]);
24
+ }
22
25
  const OBJECT_PROTO = Object.getPrototypeOf({});
23
26
  function getUnserializableMessage(err) {
24
27
  if (err instanceof Error)
@@ -90,13 +93,12 @@ function processError(err, options = {}) {
90
93
  const clonedActual = deepClone(err.actual);
91
94
  const clonedExpected = deepClone(err.expected);
92
95
  const { replacedActual, replacedExpected } = replaceAsymmetricMatcher(clonedActual, clonedExpected);
93
- err.actual = replacedActual;
94
- err.expected = replacedExpected;
95
- const maxDiffSize = options.outputDiffMaxSize ?? 1e4;
96
+ if (err.showDiff || err.showDiff === void 0 && err.expected !== void 0 && err.actual !== void 0)
97
+ err.diff = unifiedDiff(replacedActual, replacedExpected, options);
96
98
  if (typeof err.expected !== "string")
97
- err.expected = stringify(err.expected, 10, { maxLength: maxDiffSize });
99
+ err.expected = stringify(err.expected, 10);
98
100
  if (typeof err.actual !== "string")
99
- err.actual = stringify(err.actual, 10, { maxLength: maxDiffSize });
101
+ err.actual = stringify(err.actual, 10);
100
102
  try {
101
103
  if (typeof err.message === "string")
102
104
  err.message = normalizeErrorMessage(err.message);
package/dist/index.d.ts CHANGED
@@ -1,25 +1,27 @@
1
- import { V as VitestRunner } from './runner-b9659804.js';
2
- export { V as VitestRunner, a as VitestRunnerConfig, c as VitestRunnerConstructor, b as VitestRunnerImportSource } from './runner-b9659804.js';
3
- import { T as Task, F as File, S as SuiteAPI, a as TestAPI, b as SuiteCollector, c as SuiteHooks, H as HookListener, d as TestContext, e as Suite, f as HookCleanupCallback, O as OnTestFailedHandler, g as Test } from './tasks-3fbb29e4.js';
4
- export { D as DoneCallback, F as File, f as HookCleanupCallback, H as HookListener, O as OnTestFailedHandler, R as RunMode, p as RuntimeContext, q as SequenceHooks, r as SequenceSetupFiles, e as Suite, S as SuiteAPI, b as SuiteCollector, o as SuiteFactory, c as SuiteHooks, T as Task, i as TaskBase, j as TaskCustom, k as TaskResult, l as TaskResultPack, h as TaskState, g as Test, a as TestAPI, d as TestContext, m as TestFunction, n as TestOptions } from './tasks-3fbb29e4.js';
1
+ import { V as VitestRunner } from './runner-3b8473ea.js';
2
+ export { a as VitestRunnerConfig, c as VitestRunnerConstructor, b as VitestRunnerImportSource } from './runner-3b8473ea.js';
3
+ import { T as Task, F as File, S as SuiteAPI, a as TestAPI, b as SuiteCollector, c as SuiteHooks, O as OnTestFailedHandler, d as Test } from './tasks-c965d7f6.js';
4
+ export { D as DoneCallback, m as HookCleanupCallback, H as HookListener, R as RunMode, o as RuntimeContext, q as SequenceHooks, r as SequenceSetupFiles, j as Suite, n as SuiteFactory, f as TaskBase, g as TaskCustom, h as TaskResult, i as TaskResultPack, e as TaskState, p as TestContext, k as TestFunction, l as TestOptions } from './tasks-c965d7f6.js';
5
5
  import { Awaitable } from '@vitest/utils';
6
6
 
7
7
  declare function updateTask(task: Task, runner: VitestRunner): void;
8
8
  declare function startTests(paths: string[], runner: VitestRunner): Promise<File[]>;
9
9
 
10
- declare const suite: SuiteAPI<{}>;
11
- declare const test: TestAPI<{}>;
12
- declare const describe: SuiteAPI<{}>;
13
- declare const it: TestAPI<{}>;
10
+ declare const suite: SuiteAPI;
11
+ declare const test: TestAPI;
12
+ declare const describe: SuiteAPI;
13
+ declare const it: TestAPI;
14
14
  declare function getCurrentSuite<ExtraContext = {}>(): SuiteCollector<ExtraContext>;
15
15
 
16
- declare const beforeAll: (fn: SuiteHooks['beforeAll'][0], timeout?: number) => void;
17
- declare const afterAll: (fn: SuiteHooks['afterAll'][0], timeout?: number) => void;
18
- declare const beforeEach: <ExtraContext = {}>(fn: HookListener<[TestContext & ExtraContext, Suite], HookCleanupCallback>, timeout?: number) => void;
19
- declare const afterEach: <ExtraContext = {}>(fn: HookListener<[TestContext & ExtraContext, Suite], void>, timeout?: number) => void;
16
+ declare function beforeAll(fn: SuiteHooks['beforeAll'][0], timeout?: number): void;
17
+ declare function afterAll(fn: SuiteHooks['afterAll'][0], timeout?: number): void;
18
+ declare function beforeEach<ExtraContext = {}>(fn: SuiteHooks<ExtraContext>['beforeEach'][0], timeout?: number): void;
19
+ declare function afterEach<ExtraContext = {}>(fn: SuiteHooks<ExtraContext>['afterEach'][0], timeout?: number): void;
20
20
  declare const onTestFailed: (fn: OnTestFailedHandler) => void;
21
21
 
22
22
  declare function setFn(key: Test, fn: (() => Awaitable<void>)): void;
23
23
  declare function getFn<Task = Test>(key: Task): (() => Awaitable<void>);
24
24
 
25
- export { afterAll, afterEach, beforeAll, beforeEach, describe, getCurrentSuite, getFn, it, onTestFailed, setFn, startTests, suite, test, updateTask };
25
+ declare function getCurrentTest(): Test<{}> | undefined;
26
+
27
+ export { File, OnTestFailedHandler, SuiteAPI, SuiteCollector, SuiteHooks, Task, Test, TestAPI, VitestRunner, afterAll, afterEach, beforeAll, beforeEach, describe, getCurrentSuite, getCurrentTest, getFn, it, onTestFailed, setFn, startTests, suite, test, updateTask };
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ import limit from 'p-limit';
2
2
  import { getSafeTimers, format, isObject, objDisplay, objectAttr, noop, toArray, shuffle } from '@vitest/utils';
3
3
  import { c as createChainable, g as generateHash, p as processError, a as calculateSuiteHash, s as someTasksAreOnly, i as interpretTaskModes, b as partitionSuiteChildren, h as hasTests, d as hasFailed } from './chunk-tasks.js';
4
4
  import { relative } from 'pathe';
5
+ import '@vitest/utils/diff';
5
6
 
6
7
  const fnMap = /* @__PURE__ */ new WeakMap();
7
8
  const hooksMap = /* @__PURE__ */ new WeakMap();
@@ -247,7 +248,11 @@ function formatTitle(template, items, idx) {
247
248
  if (isObject(items[0])) {
248
249
  formatted = formatted.replace(
249
250
  /\$([$\w_.]+)/g,
250
- (_, key) => objDisplay(objectAttr(items[0], key))
251
+ (_, key) => {
252
+ var _a;
253
+ return objDisplay(objectAttr(items[0], key), (_a = runner == null ? void 0 : runner.config) == null ? void 0 : _a.chaiConfig);
254
+ }
255
+ // https://github.com/chaijs/chai/pull/1490
251
256
  );
252
257
  }
253
258
  return formatted;
@@ -285,7 +290,7 @@ async function collectTests(paths, runner) {
285
290
  for (const filepath of paths) {
286
291
  const path = relative(config.root, filepath);
287
292
  const file = {
288
- id: generateHash(path),
293
+ id: generateHash(`${path}${config.name || ""}`),
289
294
  name: path,
290
295
  type: "suite",
291
296
  mode: "run",
@@ -405,13 +410,13 @@ async function sendTasksUpdate(runner) {
405
410
  return p;
406
411
  }
407
412
  }
408
- const callCleanupHooks = async (cleanups) => {
413
+ async function callCleanupHooks(cleanups) {
409
414
  await Promise.all(cleanups.map(async (fn) => {
410
415
  if (typeof fn !== "function")
411
416
  return;
412
417
  await fn();
413
418
  }));
414
- };
419
+ }
415
420
  async function runTest(test, runner) {
416
421
  var _a, _b, _c, _d, _e, _f;
417
422
  await ((_a = runner.onBeforeRunTest) == null ? void 0 : _a.call(runner, test));
@@ -443,6 +448,12 @@ async function runTest(test, runner) {
443
448
  throw new Error("Test function is not found. Did you add it using `setFn`?");
444
449
  await fn();
445
450
  }
451
+ if (test.promises) {
452
+ const result = await Promise.allSettled(test.promises);
453
+ const errors = result.map((r) => r.status === "rejected" ? r.reason : void 0).filter(Boolean);
454
+ if (errors.length)
455
+ throw errors;
456
+ }
446
457
  await ((_d = runner.onAfterTryTest) == null ? void 0 : _d.call(runner, test, retryCount));
447
458
  test.result.state = "pass";
448
459
  } catch (e) {
@@ -479,10 +490,13 @@ async function runTest(test, runner) {
479
490
  }
480
491
  function failTask(result, err) {
481
492
  result.state = "fail";
482
- const error = processError(err);
483
- result.error = error;
484
- result.errors ?? (result.errors = []);
485
- result.errors.push(error);
493
+ const errors = Array.isArray(err) ? err : [err];
494
+ for (const e of errors) {
495
+ const error = processError(e);
496
+ result.error ?? (result.error = error);
497
+ result.errors ?? (result.errors = []);
498
+ result.errors.push(error);
499
+ }
486
500
  }
487
501
  function markTasksAsSkipped(suite, runner) {
488
502
  suite.tasks.forEach((t) => {
@@ -597,11 +611,21 @@ async function startTests(paths, runner) {
597
611
  return files;
598
612
  }
599
613
 
600
- const getDefaultHookTimeout = () => getRunner().config.hookTimeout;
601
- const beforeAll = (fn, timeout) => getCurrentSuite().on("beforeAll", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
602
- const afterAll = (fn, timeout) => getCurrentSuite().on("afterAll", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
603
- const beforeEach = (fn, timeout) => getCurrentSuite().on("beforeEach", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
604
- const afterEach = (fn, timeout) => getCurrentSuite().on("afterEach", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
614
+ function getDefaultHookTimeout() {
615
+ return getRunner().config.hookTimeout;
616
+ }
617
+ function beforeAll(fn, timeout) {
618
+ return getCurrentSuite().on("beforeAll", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
619
+ }
620
+ function afterAll(fn, timeout) {
621
+ return getCurrentSuite().on("afterAll", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
622
+ }
623
+ function beforeEach(fn, timeout) {
624
+ return getCurrentSuite().on("beforeEach", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
625
+ }
626
+ function afterEach(fn, timeout) {
627
+ return getCurrentSuite().on("afterEach", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
628
+ }
605
629
  const onTestFailed = createTestHook("onTestFailed", (test, handler) => {
606
630
  test.onFailed || (test.onFailed = []);
607
631
  test.onFailed.push(handler);
@@ -615,4 +639,4 @@ function createTestHook(name, handler) {
615
639
  };
616
640
  }
617
641
 
618
- export { afterAll, afterEach, beforeAll, beforeEach, describe, getCurrentSuite, getFn, it, onTestFailed, setFn, startTests, suite, test, updateTask };
642
+ export { afterAll, afterEach, beforeAll, beforeEach, describe, getCurrentSuite, getCurrentTest, getFn, it, onTestFailed, setFn, startTests, suite, test, updateTask };
@@ -1,4 +1,4 @@
1
- import { q as SequenceHooks, r as SequenceSetupFiles, F as File, g as Test, e as Suite, k as TaskResult, d as TestContext } from './tasks-3fbb29e4.js';
1
+ import { q as SequenceHooks, r as SequenceSetupFiles, F as File, d as Test, j as Suite, h as TaskResult, p as TestContext } from './tasks-c965d7f6.js';
2
2
 
3
3
  interface VitestRunnerConfig {
4
4
  root: string;
@@ -13,6 +13,9 @@ interface VitestRunnerConfig {
13
13
  hooks: SequenceHooks;
14
14
  setupFiles: SequenceSetupFiles;
15
15
  };
16
+ chaiConfig?: {
17
+ truncateThreshold?: number;
18
+ };
16
19
  maxConcurrency: number;
17
20
  testTimeout: number;
18
21
  hookTimeout: number;
@@ -1,4 +1,4 @@
1
- import { Awaitable } from '@vitest/utils';
1
+ import { ErrorWithDiff, Awaitable } from '@vitest/utils';
2
2
 
3
3
  type ChainableFunction<T extends string, Args extends any[], R = any, E = {}> = {
4
4
  (...args: Args): R;
@@ -9,35 +9,6 @@ type ChainableFunction<T extends string, Args extends any[], R = any, E = {}> =
9
9
  } & E;
10
10
  declare function createChainable<T extends string, Args extends any[], R = any, E = {}>(keys: T[], fn: (this: Record<T, boolean | undefined>, ...args: Args) => R): ChainableFunction<T, Args, R, E>;
11
11
 
12
- interface ParsedStack {
13
- method: string;
14
- file: string;
15
- line: number;
16
- column: number;
17
- }
18
- interface ErrorWithDiff extends Error {
19
- name: string;
20
- nameStr?: string;
21
- stack?: string;
22
- stackStr?: string;
23
- stacks?: ParsedStack[];
24
- showDiff?: boolean;
25
- actual?: any;
26
- expected?: any;
27
- operator?: string;
28
- type?: string;
29
- frame?: string;
30
- }
31
- declare function serializeError(val: any, seen?: WeakMap<object, any>): any;
32
- interface ProcessErrorOptions {
33
- outputDiffMaxSize?: number;
34
- }
35
- declare function processError(err: any, options?: ProcessErrorOptions): any;
36
- declare function replaceAsymmetricMatcher(actual: any, expected: any, actualReplaced?: WeakSet<object>, expectedReplaced?: WeakSet<object>): {
37
- replacedActual: any;
38
- replacedExpected: any;
39
- };
40
-
41
12
  type RunMode = 'run' | 'skip' | 'only' | 'todo';
42
13
  type TaskState = RunMode | 'pass' | 'fail';
43
14
  interface TaskBase {
@@ -88,6 +59,10 @@ interface Test<ExtraContext = {}> extends TaskBase {
88
59
  fails?: boolean;
89
60
  context: TestContext & ExtraContext;
90
61
  onFailed?: OnTestFailedHandler[];
62
+ /**
63
+ * Store promises (from async expects) to wait for them before finishing the test
64
+ */
65
+ promises?: Promise<any>[];
91
66
  }
92
67
  type Task = Test | Suite | TaskCustom | File;
93
68
  type DoneCallback = (error?: any) => void;
@@ -193,4 +168,4 @@ type OnTestFailedHandler = (result: TaskResult) => Awaitable<void>;
193
168
  type SequenceHooks = 'stack' | 'list' | 'parallel';
194
169
  type SequenceSetupFiles = 'list' | 'parallel';
195
170
 
196
- export { ChainableFunction as C, DoneCallback as D, ErrorWithDiff as E, File as F, HookListener as H, OnTestFailedHandler as O, ParsedStack as P, RunMode as R, SuiteAPI as S, Task as T, TestAPI as a, SuiteCollector as b, SuiteHooks as c, TestContext as d, Suite as e, HookCleanupCallback as f, Test as g, TaskState as h, TaskBase as i, TaskCustom as j, TaskResult as k, TaskResultPack as l, TestFunction as m, TestOptions as n, SuiteFactory as o, RuntimeContext as p, SequenceHooks as q, SequenceSetupFiles as r, createChainable as s, serializeError as t, processError as u, replaceAsymmetricMatcher as v };
171
+ export { ChainableFunction as C, DoneCallback as D, File as F, HookListener as H, OnTestFailedHandler as O, RunMode as R, SuiteAPI as S, Task as T, TestAPI as a, SuiteCollector as b, SuiteHooks as c, Test as d, TaskState as e, TaskBase as f, TaskCustom as g, TaskResult as h, TaskResultPack as i, Suite as j, TestFunction as k, TestOptions as l, HookCleanupCallback as m, SuiteFactory as n, RuntimeContext as o, TestContext as p, SequenceHooks as q, SequenceSetupFiles as r, createChainable as s };
package/dist/types.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { D as DoneCallback, F as File, f as HookCleanupCallback, H as HookListener, O as OnTestFailedHandler, R as RunMode, p as RuntimeContext, q as SequenceHooks, r as SequenceSetupFiles, e as Suite, S as SuiteAPI, b as SuiteCollector, o as SuiteFactory, c as SuiteHooks, T as Task, i as TaskBase, j as TaskCustom, k as TaskResult, l as TaskResultPack, h as TaskState, g as Test, a as TestAPI, d as TestContext, m as TestFunction, n as TestOptions } from './tasks-3fbb29e4.js';
2
- export { V as VitestRunner, a as VitestRunnerConfig, c as VitestRunnerConstructor, b as VitestRunnerImportSource } from './runner-b9659804.js';
1
+ export { D as DoneCallback, F as File, m as HookCleanupCallback, H as HookListener, O as OnTestFailedHandler, R as RunMode, o as RuntimeContext, q as SequenceHooks, r as SequenceSetupFiles, j as Suite, S as SuiteAPI, b as SuiteCollector, n as SuiteFactory, c as SuiteHooks, T as Task, f as TaskBase, g as TaskCustom, h as TaskResult, i as TaskResultPack, e as TaskState, d as Test, a as TestAPI, p as TestContext, k as TestFunction, l as TestOptions } from './tasks-c965d7f6.js';
2
+ export { V as VitestRunner, a as VitestRunnerConfig, c as VitestRunnerConstructor, b as VitestRunnerImportSource } from './runner-3b8473ea.js';
3
3
  import '@vitest/utils';
package/dist/utils.d.ts CHANGED
@@ -1,6 +1,15 @@
1
- import { e as Suite, T as Task, g as Test, j as TaskCustom } from './tasks-3fbb29e4.js';
2
- export { C as ChainableFunction, E as ErrorWithDiff, P as ParsedStack, s as createChainable, u as processError, v as replaceAsymmetricMatcher, t as serializeError } from './tasks-3fbb29e4.js';
1
+ import { j as Suite, T as Task, d as Test, g as TaskCustom } from './tasks-c965d7f6.js';
2
+ export { C as ChainableFunction, s as createChainable } from './tasks-c965d7f6.js';
3
3
  import { Arrayable } from '@vitest/utils';
4
+ export { ErrorWithDiff, ParsedStack } from '@vitest/utils';
5
+ import { DiffOptions } from '@vitest/utils/diff';
6
+
7
+ declare function serializeError(val: any, seen?: WeakMap<object, any>): any;
8
+ declare function processError(err: any, options?: DiffOptions): any;
9
+ declare function replaceAsymmetricMatcher(actual: any, expected: any, actualReplaced?: WeakSet<object>, expectedReplaced?: WeakSet<object>): {
10
+ replacedActual: any;
11
+ replacedExpected: any;
12
+ };
4
13
 
5
14
  /**
6
15
  * If any tasks been marked as `only`, mark all other tasks as `skip`.
@@ -22,4 +31,4 @@ declare function hasTests(suite: Arrayable<Suite>): boolean;
22
31
  declare function hasFailed(suite: Arrayable<Task>): boolean;
23
32
  declare function getNames(task: Task): string[];
24
33
 
25
- export { calculateSuiteHash, generateHash, getNames, getSuites, getTasks, getTests, hasFailed, hasTests, interpretTaskModes, partitionSuiteChildren, someTasksAreOnly };
34
+ export { calculateSuiteHash, generateHash, getNames, getSuites, getTasks, getTests, hasFailed, hasTests, interpretTaskModes, partitionSuiteChildren, processError, replaceAsymmetricMatcher, serializeError, someTasksAreOnly };
package/dist/utils.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { a as calculateSuiteHash, c as createChainable, g as generateHash, k as getNames, j as getSuites, f as getTasks, e as getTests, d as hasFailed, h as hasTests, i as interpretTaskModes, b as partitionSuiteChildren, p as processError, r as replaceAsymmetricMatcher, l as serializeError, s as someTasksAreOnly } from './chunk-tasks.js';
2
2
  import '@vitest/utils';
3
+ import '@vitest/utils/diff';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/runner",
3
3
  "type": "module",
4
- "version": "0.29.8",
4
+ "version": "0.30.1",
5
5
  "description": "Vitest test runner",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -33,9 +33,10 @@
33
33
  "*.d.ts"
34
34
  ],
35
35
  "dependencies": {
36
+ "concordance": "^5.0.4",
36
37
  "p-limit": "^4.0.0",
37
38
  "pathe": "^1.1.0",
38
- "@vitest/utils": "0.29.8"
39
+ "@vitest/utils": "0.30.1"
39
40
  },
40
41
  "scripts": {
41
42
  "build": "rimraf dist && rollup -c",