@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 +82 -31
- package/dist/types.d.ts +43 -0
- package/dist/utils.js +1 -2
- package/package.json +2 -2
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
|
-
|
107
|
-
|
108
|
-
|
109
|
-
const
|
110
|
-
if (!
|
111
|
-
return
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
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
|
-
|
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
|
-
|
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
|
+
"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.
|
43
|
+
"@vitest/utils": "0.34.6"
|
44
44
|
},
|
45
45
|
"scripts": {
|
46
46
|
"build": "rimraf dist && rollup -c",
|