@vitest/runner 0.34.4 → 0.34.6

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/index.js CHANGED
@@ -5,6 +5,7 @@ import { createChainable, generateHash, calculateSuiteHash, someTasksAreOnly, in
5
5
  import { relative } from 'pathe';
6
6
 
7
7
  const fnMap = /* @__PURE__ */ new WeakMap();
8
+ const fixtureMap = /* @__PURE__ */ new WeakMap();
8
9
  const hooksMap = /* @__PURE__ */ new WeakMap();
9
10
  function setFn(key, fn) {
10
11
  fnMap.set(key, fn);
@@ -12,6 +13,12 @@ function setFn(key, fn) {
12
13
  function getFn(key) {
13
14
  return fnMap.get(key);
14
15
  }
16
+ function setFixture(key, fixture) {
17
+ fixtureMap.set(key, fixture);
18
+ }
19
+ function getFixture(key) {
20
+ return fixtureMap.get(key);
21
+ }
15
22
  function setHooks(key, hooks) {
16
23
  hooksMap.set(key, hooks);
17
24
  }
@@ -103,28 +110,70 @@ function mergeContextFixtures(fixtures, context = {}) {
103
110
  });
104
111
  return context;
105
112
  }
106
- function withFixtures(fn, fixtures, context) {
107
- if (!fixtures.length)
108
- return () => fn(context);
109
- const usedProps = getUsedProps(fn);
110
- if (!usedProps.length)
111
- return () => fn(context);
112
- const usedFixtures = fixtures.filter(({ prop }) => usedProps.includes(prop));
113
- const pendingFixtures = resolveDeps(usedFixtures);
114
- let cursor = 0;
115
- async function use(fixtureValue) {
116
- const { prop } = pendingFixtures[cursor++];
117
- context[prop] = fixtureValue;
118
- if (cursor < pendingFixtures.length)
119
- await next();
120
- else
121
- await fn(context);
122
- }
123
- async function next() {
124
- const { value } = pendingFixtures[cursor];
125
- typeof value === "function" ? await value(context, use) : await use(value);
126
- }
127
- return () => next();
113
+ const fixtureValueMap = /* @__PURE__ */ new Map();
114
+ const fixtureCleanupFnMap = /* @__PURE__ */ new Map();
115
+ async function callFixtureCleanup(id) {
116
+ const cleanupFnArray = fixtureCleanupFnMap.get(id);
117
+ if (!cleanupFnArray)
118
+ return;
119
+ for (const cleanup of cleanupFnArray.reverse())
120
+ await cleanup();
121
+ fixtureCleanupFnMap.delete(id);
122
+ }
123
+ function withFixtures(fn, testContext) {
124
+ return (hookContext) => {
125
+ const context = hookContext || testContext;
126
+ if (!context)
127
+ return fn({});
128
+ let cleanupFnArray = fixtureCleanupFnMap.get(context.task.suite.id);
129
+ if (!cleanupFnArray) {
130
+ cleanupFnArray = [];
131
+ fixtureCleanupFnMap.set(context.task.suite.id, cleanupFnArray);
132
+ }
133
+ const fixtures = getFixture(context);
134
+ if (!(fixtures == null ? void 0 : fixtures.length))
135
+ return fn(context);
136
+ const usedProps = getUsedProps(fn);
137
+ if (!usedProps.length)
138
+ return fn(context);
139
+ const usedFixtures = fixtures.filter(({ prop }) => usedProps.includes(prop));
140
+ const pendingFixtures = resolveDeps(usedFixtures);
141
+ let cursor = 0;
142
+ return new Promise((resolve, reject) => {
143
+ async function use(fixtureValue) {
144
+ const fixture = pendingFixtures[cursor++];
145
+ context[fixture.prop] = fixtureValue;
146
+ if (!fixtureValueMap.has(fixture)) {
147
+ fixtureValueMap.set(fixture, fixtureValue);
148
+ cleanupFnArray.unshift(() => {
149
+ fixtureValueMap.delete(fixture);
150
+ });
151
+ }
152
+ if (cursor < pendingFixtures.length) {
153
+ await next();
154
+ } else {
155
+ try {
156
+ resolve(await fn(context));
157
+ } catch (err) {
158
+ reject(err);
159
+ }
160
+ return new Promise((resolve2) => {
161
+ cleanupFnArray.push(resolve2);
162
+ });
163
+ }
164
+ }
165
+ async function next() {
166
+ const fixture = pendingFixtures[cursor];
167
+ const { isFn, value } = fixture;
168
+ if (fixtureValueMap.has(fixture))
169
+ return use(fixtureValueMap.get(fixture));
170
+ else
171
+ return isFn ? value(context, use) : use(value);
172
+ }
173
+ const setupFixturePromise = next();
174
+ cleanupFnArray.unshift(() => setupFixturePromise);
175
+ });
176
+ };
128
177
  }
129
178
  function resolveDeps(fixtures, depSet = /* @__PURE__ */ new Set(), pendingFixtures = []) {
130
179
  fixtures.forEach((fixture) => {
@@ -252,8 +301,9 @@ function createSuiteCollector(name, factory = () => {
252
301
  value: context,
253
302
  enumerable: false
254
303
  });
304
+ setFixture(context, this.fixtures);
255
305
  setFn(test3, withTimeout(
256
- this.fixtures ? withFixtures(fn, this.fixtures, context) : () => fn(context),
306
+ withFixtures(fn, context),
257
307
  (options == null ? void 0 : options.timeout) ?? runner.config.testTimeout
258
308
  ));
259
309
  tasks.push(test3);
@@ -626,7 +676,7 @@ async function runTest(test, runner) {
626
676
  test.result.state = "pass";
627
677
  }
628
678
  } catch (e) {
629
- failTask(test.result, e);
679
+ failTask(test.result, e, runner.config.diffOptions);
630
680
  }
631
681
  if (test.pending || ((_e = test.result) == null ? void 0 : _e.state) === "skip") {
632
682
  test.mode = "skip";
@@ -638,7 +688,7 @@ async function runTest(test, runner) {
638
688
  await callSuiteHook(test.suite, test, "afterEach", runner, [test.context, test.suite]);
639
689
  await callCleanupHooks(beforeEachCleanups);
640
690
  } catch (e) {
641
- failTask(test.result, e);
691
+ failTask(test.result, e, runner.config.diffOptions);
642
692
  }
643
693
  if (test.result.state === "pass")
644
694
  break;
@@ -668,7 +718,7 @@ async function runTest(test, runner) {
668
718
  await ((_g = runner.onAfterRunTest) == null ? void 0 : _g.call(runner, test));
669
719
  updateTask(test, runner);
670
720
  }
671
- function failTask(result, err) {
721
+ function failTask(result, err, diffOptions) {
672
722
  if (err instanceof PendingError) {
673
723
  result.state = "skip";
674
724
  return;
@@ -676,7 +726,7 @@ function failTask(result, err) {
676
726
  result.state = "fail";
677
727
  const errors = Array.isArray(err) ? err : [err];
678
728
  for (const e of errors) {
679
- const error = processError(e);
729
+ const error = processError(e, diffOptions);
680
730
  result.error ?? (result.error = error);
681
731
  result.errors ?? (result.errors = []);
682
732
  result.errors.push(error);
@@ -734,13 +784,14 @@ async function runSuite(suite, runner) {
734
784
  }
735
785
  }
736
786
  } catch (e) {
737
- failTask(suite.result, e);
787
+ failTask(suite.result, e, runner.config.diffOptions);
738
788
  }
739
789
  try {
790
+ await callFixtureCleanup(suite.id);
740
791
  await callSuiteHook(suite, suite, "afterAll", runner, [suite]);
741
792
  await callCleanupHooks(beforeAllCleanups);
742
793
  } catch (e) {
743
- failTask(suite.result, e);
794
+ failTask(suite.result, e, runner.config.diffOptions);
744
795
  }
745
796
  if (suite.mode === "run") {
746
797
  if (!hasTests(suite)) {
@@ -805,10 +856,10 @@ function afterAll(fn, timeout) {
805
856
  return getCurrentSuite().on("afterAll", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
806
857
  }
807
858
  function beforeEach(fn, timeout) {
808
- return getCurrentSuite().on("beforeEach", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
859
+ return getCurrentSuite().on("beforeEach", withTimeout(withFixtures(fn), timeout ?? getDefaultHookTimeout(), true));
809
860
  }
810
861
  function afterEach(fn, timeout) {
811
- return getCurrentSuite().on("afterEach", withTimeout(fn, timeout ?? getDefaultHookTimeout(), true));
862
+ return getCurrentSuite().on("afterEach", withTimeout(withFixtures(fn), timeout ?? getDefaultHookTimeout(), true));
812
863
  }
813
864
  const onTestFailed = createTestHook("onTestFailed", (test, handler) => {
814
865
  test.onFailed || (test.onFailed = []);
package/dist/types.d.ts CHANGED
@@ -2,6 +2,48 @@ import { t as SequenceHooks, u as SequenceSetupFiles, F as File, a as Test, S as
2
2
  export { D as DoneCallback, o as Fixtures, p as HookCleanupCallback, H as HookListener, O as OnTestFailedHandler, R as RunMode, r as RuntimeContext, d as SuiteAPI, f as SuiteCollector, q as SuiteFactory, g as SuiteHooks, T as Task, i as TaskBase, b as TaskCustom, j as TaskMeta, k as TaskResult, h as TaskState, e as TestAPI, m as TestFunction, n as TestOptions } from './tasks-e594cd24.js';
3
3
  import '@vitest/utils';
4
4
 
5
+ /**
6
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
7
+ *
8
+ * This source code is licensed under the MIT license found in the
9
+ * LICENSE file in the root directory of this source tree.
10
+ */
11
+
12
+
13
+ declare type CompareKeys =
14
+ | ((a: string, b: string) => number)
15
+ | null
16
+ | undefined;
17
+
18
+ /**
19
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
20
+ *
21
+ * This source code is licensed under the MIT license found in the
22
+ * LICENSE file in the root directory of this source tree.
23
+ */
24
+
25
+ type DiffOptionsColor = (arg: string) => string;
26
+ interface DiffOptions {
27
+ aAnnotation?: string;
28
+ aColor?: DiffOptionsColor;
29
+ aIndicator?: string;
30
+ bAnnotation?: string;
31
+ bColor?: DiffOptionsColor;
32
+ bIndicator?: string;
33
+ changeColor?: DiffOptionsColor;
34
+ changeLineTrailingSpaceColor?: DiffOptionsColor;
35
+ commonColor?: DiffOptionsColor;
36
+ commonIndicator?: string;
37
+ commonLineTrailingSpaceColor?: DiffOptionsColor;
38
+ contextLines?: number;
39
+ emptyFirstOrLastLinePlaceholder?: string;
40
+ expand?: boolean;
41
+ includeChangeCounts?: boolean;
42
+ omitAnnotationLines?: boolean;
43
+ patchColor?: DiffOptionsColor;
44
+ compareKeys?: CompareKeys;
45
+ }
46
+
5
47
  interface VitestRunnerConfig {
6
48
  root: string;
7
49
  setupFiles: string[] | string;
@@ -23,6 +65,7 @@ interface VitestRunnerConfig {
23
65
  testTimeout: number;
24
66
  hookTimeout: number;
25
67
  retry: number;
68
+ diffOptions?: DiffOptions;
26
69
  }
27
70
  type VitestRunnerImportSource = 'collect' | 'setup';
28
71
  interface VitestRunnerConstructor {
package/dist/utils.js CHANGED
@@ -50,8 +50,7 @@ function interpretTaskModes(suite, namePattern, onlyMode, parentIsOnly, allowOnl
50
50
  }
51
51
  }
52
52
  function getTaskFullName(task) {
53
- const fullName = task.suite ? getTaskFullName(task.suite) : null;
54
- return fullName ? `${fullName} ${task.name}` : task.name;
53
+ return `${task.suite ? `${getTaskFullName(task.suite)} ` : ""}${task.name}`;
55
54
  }
56
55
  function someTasksAreOnly(suite) {
57
56
  return suite.tasks.some((t) => t.mode === "only" || t.type === "suite" && someTasksAreOnly(t));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/runner",
3
3
  "type": "module",
4
- "version": "0.34.4",
4
+ "version": "0.34.6",
5
5
  "description": "Vitest test runner",
6
6
  "license": "MIT",
7
7
  "funding": "https://opencollective.com/vitest",
@@ -40,7 +40,7 @@
40
40
  "dependencies": {
41
41
  "p-limit": "^4.0.0",
42
42
  "pathe": "^1.1.1",
43
- "@vitest/utils": "0.34.4"
43
+ "@vitest/utils": "0.34.6"
44
44
  },
45
45
  "scripts": {
46
46
  "build": "rimraf dist && rollup -c",