vitest 0.0.15 → 0.0.16

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,19 +1,24 @@
1
- import { File, Reporter, RunnerContext, Suite, Task } from '../types';
1
+ import Listr from 'listr';
2
+ import { Reporter, RunnerContext, Task } from '../types';
3
+ interface TaskPromise {
4
+ promise: Promise<void>;
5
+ resolve: () => void;
6
+ reject: (e: unknown) => void;
7
+ }
2
8
  export declare class DefaultReporter implements Reporter {
3
9
  indent: number;
4
10
  start: number;
5
11
  end: number;
12
+ listr: Listr | null;
13
+ listrPromise: Promise<void> | null;
14
+ taskMap: Map<Task, TaskPromise>;
6
15
  onStart(): void;
7
- onCollected(): void;
8
- onSuiteBegin(suite: Suite): void;
9
- onSuiteEnd(suite: Suite): void;
10
- onFileBegin(file: File): void;
11
- onFileEnd(): void;
12
- onTaskBegin(task: Task): void;
16
+ onCollected(ctx: RunnerContext): void;
13
17
  onTaskEnd(task: Task): void;
14
- onFinished({ files }: RunnerContext): void;
18
+ onFinished({ files }: RunnerContext): Promise<void>;
15
19
  private getIndent;
16
20
  private log;
17
21
  private error;
18
22
  onSnapshotUpdate(): void;
19
23
  }
24
+ export {};
@@ -1,69 +1,75 @@
1
- import { relative } from 'path';
2
1
  import { performance } from 'perf_hooks';
2
+ import { relative } from 'path';
3
3
  import c from 'picocolors';
4
- import ora from 'ora';
5
- const DOT = '· ';
6
- const CHECK = '✔ ';
7
- const CROSS = '⤫ ';
4
+ import Listr from 'listr';
5
+ const CROSS = ' ';
8
6
  export class DefaultReporter {
9
7
  constructor() {
10
8
  this.indent = 0;
11
9
  this.start = 0;
12
10
  this.end = 0;
11
+ this.listr = null;
12
+ this.listrPromise = null;
13
+ this.taskMap = new Map();
13
14
  }
14
15
  onStart() {
15
16
  this.indent = 0;
16
17
  }
17
- onCollected() {
18
+ onCollected(ctx) {
18
19
  this.start = performance.now();
19
- }
20
- onSuiteBegin(suite) {
21
- if (suite.name) {
22
- this.indent += 1;
23
- const name = DOT + suite.name;
24
- if (suite.mode === 'skip')
25
- this.log(c.dim(c.yellow(`${name} (skipped)`)));
26
- else if (suite.mode === 'todo')
27
- this.log(c.dim(`${name} (todo)`));
28
- else
29
- this.log(name);
30
- }
31
- }
32
- onSuiteEnd(suite) {
33
- if (suite.name)
34
- this.indent -= 1;
35
- }
36
- onFileBegin(file) {
37
- this.log(`- ${relative(process.cwd(), file.filepath)} ${c.dim(`(${file.suites.flatMap(i => i.tasks).length} tests)`)}`);
38
- }
39
- onFileEnd() {
40
- this.log();
41
- }
42
- onTaskBegin(task) {
43
- this.indent += 1;
44
- // @ts-expect-error
45
- task.__ora = ora({ text: task.name, prefixText: this.getIndent().slice(1), spinner: 'arc' }).start();
20
+ this.taskMap = new Map();
21
+ const tasks = ctx.files.reduce((acc, file) => acc.concat(file.suites.flatMap(i => i.tasks)), []);
22
+ tasks.forEach((t) => {
23
+ const obj = {};
24
+ obj.promise = new Promise((resolve, reject) => {
25
+ obj.resolve = resolve;
26
+ obj.reject = reject;
27
+ });
28
+ this.taskMap.set(t, obj);
29
+ });
30
+ const createTasksListr = (tasks) => {
31
+ return tasks.map((task) => {
32
+ return {
33
+ title: task.name,
34
+ skip: () => task.mode === 'skip',
35
+ task: async () => {
36
+ var _a;
37
+ return await ((_a = this.taskMap.get(task)) === null || _a === void 0 ? void 0 : _a.promise);
38
+ },
39
+ };
40
+ });
41
+ };
42
+ const listrOptions = {
43
+ exitOnError: false,
44
+ };
45
+ this.listr = new Listr(ctx.files.map((file) => {
46
+ return {
47
+ title: relative(process.cwd(), file.filepath),
48
+ task: () => {
49
+ return new Listr(file.suites.flatMap((suite) => {
50
+ if (!suite.name)
51
+ return createTasksListr(suite.tasks);
52
+ return [{
53
+ title: suite.name,
54
+ skip: () => suite.mode !== 'run',
55
+ task: () => new Listr(createTasksListr(suite.tasks), listrOptions),
56
+ }];
57
+ }), listrOptions);
58
+ },
59
+ };
60
+ }), listrOptions);
61
+ this.listrPromise = this.listr.run().catch(() => { });
46
62
  }
47
63
  onTaskEnd(task) {
48
- var _a;
49
- // @ts-expect-error
50
- (_a = task.__ora) === null || _a === void 0 ? void 0 : _a.stop();
51
- if (task.state === 'pass') {
52
- this.log(`${c.green(CHECK + task.name)}`);
53
- }
54
- else if (task.state === 'skip') {
55
- this.log(c.dim(c.yellow(`${DOT + task.name} (skipped)`)));
56
- }
57
- else if (task.state === 'todo') {
58
- this.log(c.dim(`${DOT + task.name} (todo)`));
59
- }
60
- else {
61
- this.error(`${c.red(`${CROSS}${task.name}`)}`);
62
- process.exitCode = 1;
63
- }
64
- this.indent -= 1;
64
+ var _a, _b;
65
+ if (task.state === 'fail')
66
+ (_a = this.taskMap.get(task)) === null || _a === void 0 ? void 0 : _a.reject(task.error);
67
+ else
68
+ (_b = this.taskMap.get(task)) === null || _b === void 0 ? void 0 : _b.resolve();
65
69
  }
66
- onFinished({ files }) {
70
+ async onFinished({ files }) {
71
+ await this.listrPromise;
72
+ this.log();
67
73
  this.end = performance.now();
68
74
  const failedFiles = files.filter(i => i.error);
69
75
  const tasks = files.reduce((acc, file) => acc.concat(file.suites.flatMap(i => i.tasks)), []);
@@ -85,14 +91,14 @@ export class DefaultReporter {
85
91
  this.error(c.bold(`\nFailed Tests (${failed.length})`));
86
92
  failed.forEach((task) => {
87
93
  var _a;
88
- this.error(`\n${CROSS + c.inverse(c.red(' FAIL '))} ${[task.suite.name, task.name].filter(Boolean).join(' > ')} ${c.gray(`${(_a = task.file) === null || _a === void 0 ? void 0 : _a.filepath}`)}`);
94
+ this.error(`\n${CROSS + c.inverse(c.red(' FAIL '))} ${[task.suite.name, task.name].filter(Boolean).join(' > ')} ${c.gray(c.dim(`${(_a = task.file) === null || _a === void 0 ? void 0 : _a.filepath}`))}`);
89
95
  console.error(task.error || 'Unknown error');
90
96
  this.log();
91
97
  });
92
98
  }
93
- this.log(c.green(`Passed ${passed.length} / ${runable.length}`));
99
+ this.log(c.bold(c.green(`Passed ${passed.length} / ${runable.length}`)));
94
100
  if (failed.length)
95
- this.log(c.red(`Failed ${failed.length} / ${runable.length}`));
101
+ this.log(c.bold(c.red(`Failed ${failed.length} / ${runable.length}`)));
96
102
  if (skipped.length)
97
103
  this.log(c.yellow(`Skipped ${skipped.length}`));
98
104
  if (todo.length)
package/dist/run.js CHANGED
@@ -72,23 +72,26 @@ function interpretOnlyMode(items) {
72
72
  }
73
73
  }
74
74
  export async function runFile(file, ctx) {
75
- var _a, _b, _c, _d;
75
+ var _a, _b;
76
76
  const { reporter } = ctx;
77
77
  const runableSuites = file.suites.filter(i => i.mode === 'run');
78
78
  if (runableSuites.length === 0)
79
79
  return;
80
80
  await ((_a = reporter.onFileBegin) === null || _a === void 0 ? void 0 : _a.call(reporter, file, ctx));
81
81
  await beforeFileHook.fire(file);
82
- for (const suite of file.suites) {
83
- await ((_b = reporter.onSuiteBegin) === null || _b === void 0 ? void 0 : _b.call(reporter, suite, ctx));
82
+ // TODO: support toggling parallel or serial
83
+ await Promise.all(file.suites.map(async (suite) => {
84
+ var _a, _b;
85
+ await ((_a = reporter.onSuiteBegin) === null || _a === void 0 ? void 0 : _a.call(reporter, suite, ctx));
84
86
  await beforeSuiteHook.fire(suite);
85
- for (const t of suite.tasks)
86
- await runTask(t, ctx);
87
+ await Promise.all(suite.tasks.map(i => runTask(i, ctx)));
88
+ // for (const t of suite.tasks)
89
+ // await runTask(t, ctx)
87
90
  await afterSuiteHook.fire(suite);
88
- await ((_c = reporter.onSuiteEnd) === null || _c === void 0 ? void 0 : _c.call(reporter, suite, ctx));
89
- }
91
+ await ((_b = reporter.onSuiteEnd) === null || _b === void 0 ? void 0 : _b.call(reporter, suite, ctx));
92
+ }));
90
93
  await afterFileHook.fire(file);
91
- await ((_d = reporter.onFileEnd) === null || _d === void 0 ? void 0 : _d.call(reporter, file, ctx));
94
+ await ((_b = reporter.onFileEnd) === null || _b === void 0 ? void 0 : _b.call(reporter, file, ctx));
92
95
  }
93
96
  export async function run(config) {
94
97
  var _a, _b, _c, _d;
package/dist/types.d.ts CHANGED
@@ -71,14 +71,14 @@ export interface GlobalContext {
71
71
  currentSuite: SuiteCollector | null;
72
72
  }
73
73
  export interface Reporter {
74
- onStart: (userOptions: Config) => Awaitable<void>;
75
- onCollected: (ctx: RunnerContext) => Awaitable<void>;
76
- onFinished: (ctx: RunnerContext) => Awaitable<void>;
77
- onSuiteBegin: (suite: Suite, ctx: RunnerContext) => Awaitable<void>;
78
- onSuiteEnd: (suite: Suite, ctx: RunnerContext) => Awaitable<void>;
79
- onFileBegin: (file: File, ctx: RunnerContext) => Awaitable<void>;
80
- onFileEnd: (file: File, ctx: RunnerContext) => Awaitable<void>;
81
- onTaskBegin: (task: Task, ctx: RunnerContext) => Awaitable<void>;
82
- onTaskEnd: (task: Task, ctx: RunnerContext) => Awaitable<void>;
83
- onSnapshotUpdate: () => Awaitable<void>;
74
+ onStart?: (userOptions: Config) => Awaitable<void>;
75
+ onCollected?: (ctx: RunnerContext) => Awaitable<void>;
76
+ onFinished?: (ctx: RunnerContext) => Awaitable<void>;
77
+ onSuiteBegin?: (suite: Suite, ctx: RunnerContext) => Awaitable<void>;
78
+ onSuiteEnd?: (suite: Suite, ctx: RunnerContext) => Awaitable<void>;
79
+ onFileBegin?: (file: File, ctx: RunnerContext) => Awaitable<void>;
80
+ onFileEnd?: (file: File, ctx: RunnerContext) => Awaitable<void>;
81
+ onTaskBegin?: (task: Task, ctx: RunnerContext) => Awaitable<void>;
82
+ onTaskEnd?: (task: Task, ctx: RunnerContext) => Awaitable<void>;
83
+ onSnapshotUpdate?: () => Awaitable<void>;
84
84
  }
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './dist/index'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vitest",
3
- "version": "0.0.15",
3
+ "version": "0.0.16",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/antfu/vitest#readme",
@@ -53,6 +53,7 @@
53
53
  "jest-snapshot": "^27.4.2",
54
54
  "jest-util": "^27.4.2",
55
55
  "jsdom": "^19.0.0",
56
+ "listr": "^0.14.3",
56
57
  "minimist": "^1.2.5",
57
58
  "ora": "^6.0.1",
58
59
  "picocolors": "^1.0.0",
@@ -63,6 +64,7 @@
63
64
  "@antfu/eslint-config": "^0.11.1",
64
65
  "@antfu/ni": "^0.11.0",
65
66
  "@types/jsdom": "^16.2.13",
67
+ "@types/listr": "^0.14.4",
66
68
  "@types/minimist": "^1.2.2",
67
69
  "@types/node": "^16.11.11",
68
70
  "@types/sinon": "^10.0.6",