ava 4.0.0-rc.1 → 4.0.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.
@@ -1,3 +1 @@
1
- import test from '../lib/worker/main.cjs';
2
-
3
- export default test;
1
+ export {default} from '../lib/worker/main.cjs';
package/lib/api.js CHANGED
@@ -232,10 +232,13 @@ export default class Api extends Emittery {
232
232
  }
233
233
  });
234
234
 
235
- const providerStates = (await Promise.all(providers.map(async ({type, main}) => {
235
+ const providerStates = [];
236
+ await Promise.all(providers.map(async ({type, main}) => {
236
237
  const state = await main.compile({cacheDir: this._createCacheDir(), files: testFiles});
237
- return state === null ? null : {type, state};
238
- }))).filter(state => state !== null);
238
+ if (state !== null) {
239
+ providerStates.push({type, state});
240
+ }
241
+ }));
239
242
 
240
243
  // Resolve the correct concurrency value.
241
244
  let concurrency = Math.min(os.cpus().length, isCi ? 2 : Number.POSITIVE_INFINITY);
package/lib/chalk.js CHANGED
@@ -1,9 +1,8 @@
1
- import chalk from 'chalk';
1
+ import {Chalk} from 'chalk'; // eslint-disable-line unicorn/import-style
2
2
 
3
- let instance = new chalk.Instance(); // eslint-disable-line import/no-mutable-exports
4
- export default instance;
3
+ let chalk = new Chalk(); // eslint-disable-line import/no-mutable-exports
5
4
 
6
- export {instance as chalk};
5
+ export {chalk};
7
6
 
8
7
  let configured = false;
9
8
  export function set(options) {
@@ -12,5 +11,5 @@ export function set(options) {
12
11
  }
13
12
 
14
13
  configured = true;
15
- instance = new chalk.Instance(options);
14
+ chalk = new Chalk(options);
16
15
  }
package/lib/cli.js CHANGED
@@ -87,7 +87,7 @@ const FLAGS = {
87
87
  verbose: {
88
88
  alias: 'v',
89
89
  coerce: coerceLastValue,
90
- description: 'Enable verbose output (no-op)',
90
+ description: 'Enable verbose output (default)',
91
91
  type: 'boolean',
92
92
  },
93
93
  watch: {
@@ -231,7 +231,12 @@ export default async function loadCli() { // eslint-disable-line complexity
231
231
  }
232
232
  }
233
233
 
234
- const chalkOptions = {level: combined.color === false ? 0 : (await import('chalk')).level}; // eslint-disable-line node/no-unsupported-features/es-syntax
234
+ const chalkOptions = {level: 0};
235
+ if (combined.color !== false) {
236
+ const {supportsColor: {level}} = await import('chalk'); // eslint-disable-line node/no-unsupported-features/es-syntax, unicorn/import-style
237
+ chalkOptions.level = level;
238
+ }
239
+
235
240
  const {set: setChalk} = await import('./chalk.js'); // eslint-disable-line node/no-unsupported-features/es-syntax
236
241
  setChalk(chalkOptions);
237
242
 
@@ -2,7 +2,6 @@ import fs from 'node:fs';
2
2
 
3
3
  import truncate from 'cli-truncate';
4
4
  import codeExcerpt from 'code-excerpt';
5
- import equalLength from 'equal-length';
6
5
 
7
6
  import {chalk} from './chalk.js';
8
7
 
@@ -34,20 +33,15 @@ export default function exceptCode(source, options = {}) {
34
33
  value: truncate(item.value, maxWidth - String(line).length - 5),
35
34
  }));
36
35
 
37
- const joinedLines = lines.map(line => line.value).join('\n');
38
- const extendedLines = equalLength(joinedLines).split('\n');
36
+ const extendedWidth = Math.max(...lines.map(item => item.value.length));
39
37
 
40
38
  return lines
41
- .map((item, index) => ({
42
- line: item.line,
43
- value: extendedLines[index],
44
- }))
45
39
  .map(item => {
46
40
  const isErrorSource = item.line === line;
47
41
 
48
42
  const lineNumber = formatLineNumber(item.line, line) + ':';
49
43
  const coloredLineNumber = isErrorSource ? lineNumber : chalk.grey(lineNumber);
50
- const result = ` ${coloredLineNumber} ${item.value}`;
44
+ const result = ` ${coloredLineNumber} ${item.value.padEnd(extendedWidth)}`;
51
45
 
52
46
  return isErrorSource ? chalk.bgRed(result) : result;
53
47
  })
@@ -1,11 +1,12 @@
1
1
  import {inspect} from 'node:util';
2
2
 
3
3
  import ansiStyles from 'ansi-styles';
4
+ import {Chalk} from 'chalk'; // eslint-disable-line unicorn/import-style
4
5
  import stripAnsi from 'strip-ansi';
5
6
 
6
7
  import {chalk} from './chalk.js';
7
8
 
8
- const forceColor = new chalk.Instance({level: Math.max(chalk.level, 1)});
9
+ const forceColor = new Chalk({level: Math.max(chalk.level, 1)});
9
10
 
10
11
  const colorTheme = {
11
12
  boolean: ansiStyles.yellow,
package/lib/fork.js CHANGED
@@ -4,7 +4,7 @@ import {fileURLToPath} from 'node:url';
4
4
  import {Worker} from 'node:worker_threads';
5
5
 
6
6
  import Emittery from 'emittery';
7
- import pEvent from 'p-event';
7
+ import {pEvent} from 'p-event';
8
8
 
9
9
  import {controlFlow} from './ipc-flow-control.cjs';
10
10
  import serializeError from './serialize-error.js';
package/lib/globs.js CHANGED
@@ -4,27 +4,23 @@ import path from 'node:path';
4
4
  import {globby, globbySync} from 'globby';
5
5
 
6
6
  import {
7
- classify,
8
7
  defaultIgnorePatterns,
9
8
  hasExtension,
10
- isHelperish,
11
- matches,
12
9
  normalizeFileForMatching,
13
- normalizePattern,
14
10
  normalizePatterns,
15
11
  processMatchingPatterns,
16
12
  } from './glob-helpers.cjs';
17
13
 
18
14
  export {
19
15
  classify,
20
- defaultIgnorePatterns,
21
- hasExtension,
22
16
  isHelperish,
23
17
  matches,
24
- normalizeFileForMatching,
25
18
  normalizePattern,
19
+ defaultIgnorePatterns,
20
+ hasExtension,
21
+ normalizeFileForMatching,
26
22
  normalizePatterns,
27
- };
23
+ } from './glob-helpers.cjs';
28
24
 
29
25
  const defaultIgnoredByWatcherPatterns = [
30
26
  '**/*.snap.md', // No need to rerun tests when the Markdown files change.
@@ -120,11 +116,13 @@ const globDirectoriesSync = (cwd, patterns) => {
120
116
  };
121
117
 
122
118
  export async function findFiles({cwd, extensions, filePatterns}) {
123
- return (await globFiles(cwd, filePatterns)).filter(file => hasExtension(extensions, file));
119
+ const files = await globFiles(cwd, filePatterns);
120
+ return files.filter(file => hasExtension(extensions, file));
124
121
  }
125
122
 
126
123
  export async function findTests({cwd, extensions, filePatterns}) {
127
- return (await findFiles({cwd, extensions, filePatterns})).filter(file => !path.basename(file).startsWith('_'));
124
+ const files = await findFiles({cwd, extensions, filePatterns});
125
+ return files.filter(file => !path.basename(file).startsWith('_'));
128
126
  }
129
127
 
130
128
  export function getChokidarIgnorePatterns({ignoredByWatcherPatterns}) {
@@ -86,11 +86,13 @@ export async function loadConfig({configFile, resolveFrom = process.cwd(), defau
86
86
  let searchDir = projectDir;
87
87
  const stopAt = path.dirname(repoRoot);
88
88
  do {
89
- [{config: fileConf, fileForErrorMessage, configFile} = {config: NO_SUCH_FILE, fileForErrorMessage: undefined}, ...conflicting] = (await Promise.all([ // eslint-disable-line no-await-in-loop
89
+ const results = await Promise.all([ // eslint-disable-line no-await-in-loop
90
90
  loadConfigFile({projectDir, configFile: path.join(searchDir, 'ava.config.js')}),
91
91
  loadConfigFile({projectDir, configFile: path.join(searchDir, 'ava.config.cjs')}),
92
92
  loadConfigFile({projectDir, configFile: path.join(searchDir, 'ava.config.mjs')}),
93
- ])).filter(result => result !== null);
93
+ ]);
94
+
95
+ [{config: fileConf, fileForErrorMessage, configFile} = {config: NO_SUCH_FILE, fileForErrorMessage: undefined}, ...conflicting] = results.filter(result => result !== null);
94
96
 
95
97
  searchDir = path.dirname(searchDir);
96
98
  } while (fileConf === NO_SUCH_FILE && searchDir !== stopAt);
@@ -398,7 +398,9 @@ const resolveSourceFile = mem(file => {
398
398
  return file;
399
399
  }
400
400
 
401
- return fileURLToPath(payload.sources[0]);
401
+ return payload.sources[0].startsWith('file://')
402
+ ? fileURLToPath(payload.sources[0])
403
+ : payload.sources[0];
402
404
  });
403
405
 
404
406
  export const determineSnapshotDir = mem(({file, fixedLocation, projectDir}) => {
@@ -123,13 +123,13 @@ const run = async options => {
123
123
  // Install before processing options.require, so if helpers are added to the
124
124
  // require configuration the *compiled* helper will be loaded.
125
125
  const {projectDir, providerStates = []} = options;
126
- const providers = (await Promise.all(providerStates.map(async ({type, state}) => {
126
+ const providers = [];
127
+ await Promise.all(providerStates.map(async ({type, state}) => {
127
128
  if (type === 'typescript') {
128
- return (await providerManager.typescript(projectDir)).worker({extensionsToLoadAsModules, state});
129
+ const provider = await providerManager.typescript(projectDir);
130
+ providers.push(provider.worker({extensionsToLoadAsModules, state}));
129
131
  }
130
-
131
- return null;
132
- }))).filter(provider => provider !== null);
132
+ }));
133
133
 
134
134
  const require = createRequire(import.meta.url);
135
135
  const load = async ref => {
@@ -3,12 +3,44 @@ const events = require('events');
3
3
  const process = require('process');
4
4
  const {MessageChannel, threadId} = require('worker_threads');
5
5
 
6
- const pEvent = require('p-event');
7
-
8
6
  const timers = require('../now-and-timers.cjs');
9
7
 
10
8
  const {isRunningInChildProcess, isRunningInThread} = require('./utils.cjs');
11
9
 
10
+ let pEvent = async (emitter, event, options) => {
11
+ // We need to import p-event, but import() is asynchronous. Buffer any events
12
+ // emitted in the meantime. Don't handle errors.
13
+ const buffer = [];
14
+ const addToBuffer = (...args) => buffer.push(args);
15
+ emitter.on(event, addToBuffer);
16
+
17
+ try {
18
+ ({pEvent} = await import('p-event')); // eslint-disable-line node/no-unsupported-features/es-syntax
19
+ } finally {
20
+ emitter.off(event, addToBuffer);
21
+ }
22
+
23
+ if (buffer.length === 0) {
24
+ return pEvent(emitter, event, options);
25
+ }
26
+
27
+ // Now replay buffered events.
28
+ const replayEmitter = new events.EventEmitter();
29
+ const promise = pEvent(replayEmitter, event, options);
30
+ for (const args of buffer) {
31
+ replayEmitter.emit(event, ...args);
32
+ }
33
+
34
+ const replay = (...args) => replayEmitter.emit(event, ...args);
35
+ emitter.on(event, replay);
36
+
37
+ try {
38
+ return await promise;
39
+ } finally {
40
+ emitter.off(event, replay);
41
+ }
42
+ };
43
+
12
44
  const selectAvaMessage = type => message => message.ava && message.ava.type === type;
13
45
 
14
46
  class RefCounter {
@@ -6,12 +6,11 @@ const {isRunningInThread, isRunningInChildProcess} = require('./utils.cjs');
6
6
 
7
7
  // Check if the test is being run without AVA cli
8
8
  if (!isRunningInChildProcess && !isRunningInThread) {
9
- const chalk = require('chalk'); // Use default Chalk instance.
10
9
  if (process.argv[1]) {
11
10
  const fp = path.relative('.', process.argv[1]);
12
11
 
13
12
  console.log();
14
- console.error(`Test files must be run with the AVA CLI:\n\n ${chalk.grey.dim('$')} ${chalk.cyan('ava ' + fp)}\n`);
13
+ console.error(`Test files must be run with the AVA CLI:\n\n $ ava ${fp}\n`);
15
14
 
16
15
  process.exit(1); // eslint-disable-line unicorn/no-process-exit
17
16
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ava",
3
- "version": "4.0.0-rc.1",
3
+ "version": "4.0.0",
4
4
  "description": "Node.js test runner that lets you develop with confidence.",
5
5
  "license": "MIT",
6
6
  "repository": "avajs/ava",
@@ -70,17 +70,17 @@
70
70
  "typescript"
71
71
  ],
72
72
  "dependencies": {
73
- "acorn": "^8.5.0",
73
+ "acorn": "^8.7.0",
74
74
  "acorn-walk": "^8.2.0",
75
75
  "ansi-styles": "^6.1.0",
76
76
  "arrgv": "^1.0.2",
77
77
  "arrify": "^3.0.0",
78
78
  "callsites": "^4.0.0",
79
- "cbor": "^8.0.2",
80
- "chalk": "^4.1.2",
79
+ "cbor": "^8.1.0",
80
+ "chalk": "^5.0.0",
81
81
  "chokidar": "^3.5.2",
82
82
  "chunkd": "^2.0.1",
83
- "ci-info": "^3.2.0",
83
+ "ci-info": "^3.3.0",
84
84
  "ci-parallel-vars": "^1.0.1",
85
85
  "clean-yaml-object": "^0.1.0",
86
86
  "cli-truncate": "^3.1.0",
@@ -88,10 +88,9 @@
88
88
  "common-path-prefix": "^3.0.0",
89
89
  "concordance": "^5.0.4",
90
90
  "currently-unhandled": "^0.4.1",
91
- "debug": "^4.3.2",
91
+ "debug": "^4.3.3",
92
92
  "del": "^6.0.0",
93
93
  "emittery": "^0.10.0",
94
- "equal-length": "^1.0.1",
95
94
  "figures": "^4.0.0",
96
95
  "globby": "^12.0.2",
97
96
  "ignore-by-default": "^2.0.0",
@@ -102,40 +101,40 @@
102
101
  "matcher": "^5.0.0",
103
102
  "mem": "^9.0.1",
104
103
  "ms": "^2.1.3",
105
- "p-event": "^4.2.0",
106
- "p-map": "^5.2.0",
104
+ "p-event": "^5.0.1",
105
+ "p-map": "^5.3.0",
107
106
  "picomatch": "^2.3.0",
108
107
  "pkg-conf": "^4.0.0",
109
- "plur": "^4.0.0",
108
+ "plur": "^5.1.0",
110
109
  "pretty-ms": "^7.0.1",
111
110
  "resolve-cwd": "^3.0.0",
112
111
  "slash": "^3.0.0",
113
- "stack-utils": "^2.0.3",
112
+ "stack-utils": "^2.0.5",
114
113
  "strip-ansi": "^7.0.1",
115
114
  "supertap": "^2.0.0",
116
115
  "temp-dir": "^2.0.0",
117
116
  "write-file-atomic": "^3.0.3",
118
- "yargs": "^17.2.1"
117
+ "yargs": "^17.3.1"
119
118
  },
120
119
  "devDependencies": {
121
120
  "@ava/test": "github:avajs/test",
122
- "@ava/typescript": "^2.0.0",
123
- "@sinonjs/fake-timers": "^8.0.1",
121
+ "@ava/typescript": "^3.0.1",
122
+ "@sinonjs/fake-timers": "^8.1.0",
124
123
  "ansi-escapes": "^5.0.0",
125
- "c8": "^7.10.0",
124
+ "c8": "^7.11.0",
126
125
  "delay": "^5.0.0",
127
- "execa": "^5.1.1",
126
+ "execa": "^6.0.0",
128
127
  "fs-extra": "^10.0.0",
129
128
  "get-stream": "^6.0.1",
130
129
  "replace-string": "^4.0.0",
131
- "sinon": "^11.1.2",
132
- "tap": "^15.0.10",
130
+ "sinon": "^12.0.1",
131
+ "tap": "^15.1.5",
133
132
  "temp-write": "^5.0.0",
134
133
  "tempy": "^2.0.0",
135
134
  "touch": "^3.1.0",
136
- "tsd": "^0.18.0",
135
+ "tsd": "^0.19.1",
137
136
  "typescript": "^4.4.4",
138
- "xo": "^0.46.3",
137
+ "xo": "^0.47.0",
139
138
  "zen-observable": "^0.8.15"
140
139
  },
141
140
  "peerDependencies": {
package/readme.md CHANGED
@@ -6,7 +6,7 @@ Follow the [AVA Twitter account](https://twitter.com/ava__js) for updates.
6
6
 
7
7
  Read our [contributing guide](.github/CONTRIBUTING.md) if you're looking to contribute (issues / PRs / etc).
8
8
 
9
- ![](media/mini-reporter.gif)
9
+ ![](media/verbose-reporter.png)
10
10
 
11
11
 
12
12
  Translations: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/readme.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/readme.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/readme.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/readme.md), [한국어](https://github.com/avajs/ava-docs/blob/master/ko_KR/readme.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/readme.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/readme.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/readme.md)
@@ -147,9 +147,7 @@ We have a growing list of [common pitfalls](docs/08-common-pitfalls.md) you may
147
147
  - [When to use `t.plan()`](docs/recipes/when-to-use-plan.md)
148
148
  - [Browser testing](docs/recipes/browser-testing.md)
149
149
  - [TypeScript](docs/recipes/typescript.md)
150
- - [Using ES modules](docs/recipes/es-modules.md)
151
150
  - [Passing arguments to your test files](docs/recipes/passing-arguments-to-your-test-files.md)
152
- - [Testing React components](docs/recipes/react.md)
153
151
  - [Testing Vue.js components](docs/recipes/vue.md)
154
152
  - [Debugging tests with Chrome DevTools](docs/recipes/debugging-with-chrome-devtools.md)
155
153
  - [Debugging tests with VSCode](docs/recipes/debugging-with-vscode.md)
@@ -188,7 +186,6 @@ It's the [Andromeda galaxy](https://simple.wikipedia.org/wiki/Andromeda_galaxy).
188
186
 
189
187
  - [eslint-plugin-ava](https://github.com/avajs/eslint-plugin-ava) — Lint rules for AVA tests
190
188
  - [@ava/typescript](https://github.com/avajs/typescript) — Test TypeScript projects
191
- - [@ava/babel](https://github.com/avajs/babel) — Compile test files using Babel, for AVA 3
192
189
  - [@ava/cooperate](https://github.com/avajs/cooperate) — Low-level primitives to enable cooperation between test files
193
190
  - [@ava/get-port](https://github.com/avajs/get-port) — Reserve a port while testing
194
191