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.
- package/entrypoints/main.mjs +1 -3
- package/lib/api.js +6 -3
- package/lib/chalk.js +4 -5
- package/lib/cli.js +7 -2
- package/lib/code-excerpt.js +2 -8
- package/lib/concordance-options.js +2 -1
- package/lib/fork.js +1 -1
- package/lib/globs.js +8 -10
- package/lib/load-config.js +4 -2
- package/lib/snapshot-manager.js +3 -1
- package/lib/worker/base.js +5 -5
- package/lib/worker/channel.cjs +34 -2
- package/lib/worker/guard-environment.cjs +1 -2
- package/package.json +19 -20
- package/readme.md +1 -4
package/entrypoints/main.mjs
CHANGED
package/lib/api.js
CHANGED
|
@@ -232,10 +232,13 @@ export default class Api extends Emittery {
|
|
|
232
232
|
}
|
|
233
233
|
});
|
|
234
234
|
|
|
235
|
-
const providerStates =
|
|
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
|
-
|
|
238
|
-
|
|
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
|
|
1
|
+
import {Chalk} from 'chalk'; // eslint-disable-line unicorn/import-style
|
|
2
2
|
|
|
3
|
-
let
|
|
4
|
-
export default instance;
|
|
3
|
+
let chalk = new Chalk(); // eslint-disable-line import/no-mutable-exports
|
|
5
4
|
|
|
6
|
-
export {
|
|
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
|
-
|
|
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 (
|
|
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:
|
|
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
|
|
package/lib/code-excerpt.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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}) {
|
package/lib/load-config.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
])
|
|
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);
|
package/lib/snapshot-manager.js
CHANGED
|
@@ -398,7 +398,9 @@ const resolveSourceFile = mem(file => {
|
|
|
398
398
|
return file;
|
|
399
399
|
}
|
|
400
400
|
|
|
401
|
-
return
|
|
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}) => {
|
package/lib/worker/base.js
CHANGED
|
@@ -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 =
|
|
126
|
+
const providers = [];
|
|
127
|
+
await Promise.all(providerStates.map(async ({type, state}) => {
|
|
127
128
|
if (type === 'typescript') {
|
|
128
|
-
|
|
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 => {
|
package/lib/worker/channel.cjs
CHANGED
|
@@ -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 $
|
|
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
|
|
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.
|
|
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
|
|
80
|
-
"chalk": "^
|
|
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.
|
|
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.
|
|
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": "^
|
|
106
|
-
"p-map": "^5.
|
|
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": "^
|
|
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.
|
|
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.
|
|
117
|
+
"yargs": "^17.3.1"
|
|
119
118
|
},
|
|
120
119
|
"devDependencies": {
|
|
121
120
|
"@ava/test": "github:avajs/test",
|
|
122
|
-
"@ava/typescript": "^
|
|
123
|
-
"@sinonjs/fake-timers": "^8.0
|
|
121
|
+
"@ava/typescript": "^3.0.1",
|
|
122
|
+
"@sinonjs/fake-timers": "^8.1.0",
|
|
124
123
|
"ansi-escapes": "^5.0.0",
|
|
125
|
-
"c8": "^7.
|
|
124
|
+
"c8": "^7.11.0",
|
|
126
125
|
"delay": "^5.0.0",
|
|
127
|
-
"execa": "^
|
|
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": "^
|
|
132
|
-
"tap": "^15.
|
|
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.
|
|
135
|
+
"tsd": "^0.19.1",
|
|
137
136
|
"typescript": "^4.4.4",
|
|
138
|
-
"xo": "^0.
|
|
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
|
-

|
|
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
|
|