Skip to content

Commit a742eed

Browse files
committed
Ensure ava/plugin works in a CJS environment
Refactor and deploy some tricks so that ava/plugin is usable in a CJS environment, even if the rest of AVA's internals become ESM.
1 parent 6525f4d commit a742eed

23 files changed

+60
-54
lines changed

entrypoints/plugin.cjs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
'use strict';
2-
module.exports = require('../lib/worker/plugin');
2+
module.exports = require('../lib/worker/plugin.cjs');
File renamed without changes.

lib/runner.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const parseTestArgs = require('./parse-test-args');
77
const snapshotManager = require('./snapshot-manager');
88
const serializeError = require('./serialize-error');
99
const Runnable = require('./test');
10+
const {waitForReady} = require('./worker/state.cjs');
1011

1112
class Runner extends Emittery {
1213
constructor(options = {}) {
@@ -53,7 +54,7 @@ class Runner extends Emittery {
5354
serial: [],
5455
todo: []
5556
};
56-
this.waitForReady = [];
57+
this.waitForReady = waitForReady;
5758

5859
const uniqueTestTitles = new Set();
5960
this.registerUniqueTitle = title => {

lib/test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const concordance = require('concordance');
33
const isPromise = require('is-promise');
44
const plur = require('plur');
55
const assert = require('./assert');
6-
const nowAndTimers = require('./now-and-timers');
6+
const nowAndTimers = require('./now-and-timers.cjs');
77
const parseTestArgs = require('./parse-test-args');
88
const concordanceOptions = require('./concordance-options').default;
99

lib/worker/base.js

+5-34
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,27 @@
11
'use strict';
22
const {pathToFileURL} = require('url');
3-
const path = require('path');
43
const currentlyUnhandled = require('currently-unhandled')();
5-
const {isRunningInThread, isRunningInChildProcess} = require('./utils');
4+
const {isRunningInThread, isRunningInChildProcess} = require('./utils.cjs');
65

7-
// Check if the test is being run without AVA cli
8-
if (!isRunningInChildProcess && !isRunningInThread) {
9-
const chalk = require('chalk'); // Use default Chalk instance.
10-
if (process.argv[1]) {
11-
const fp = path.relative('.', process.argv[1]);
12-
13-
console.log();
14-
console.error(`Test files must be run with the AVA CLI:\n\n ${chalk.grey.dim('$')} ${chalk.cyan('ava ' + fp)}\n`);
15-
16-
process.exit(1);
17-
} else {
18-
throw new Error('The ’ava’ module can only be imported in test files');
19-
}
20-
}
21-
22-
const channel = require('./channel');
6+
const channel = require('./channel.cjs');
237

248
const run = async options => {
25-
require('./options').set(options);
9+
require('./options.cjs').set(options);
2610
require('../chalk').set(options.chalkOptions);
2711

2812
if (options.chalkOptions.level > 0) {
2913
const {stdout, stderr} = process;
3014
global.console = Object.assign(global.console, new console.Console({stdout, stderr, colorMode: true}));
3115
}
3216

33-
const nowAndTimers = require('../now-and-timers');
17+
const nowAndTimers = require('../now-and-timers.cjs');
3418
const providerManager = require('../provider-manager');
3519
const Runner = require('../runner');
3620
const serializeError = require('../serialize-error');
3721
const dependencyTracking = require('./dependency-tracker');
3822
const lineNumberSelection = require('./line-numbers');
3923

40-
const sharedWorkerTeardowns = [];
24+
const {sharedWorkerTeardowns} = require('./state.cjs');
4125

4226
async function exit(code) {
4327
if (!process.exitCode) {
@@ -140,19 +124,6 @@ const run = async options => {
140124
return runner;
141125
};
142126

143-
exports.registerSharedWorker = (filename, initialData, teardown) => {
144-
const {channel: sharedWorkerChannel, forceUnref, ready} = channel.registerSharedWorker(filename, initialData);
145-
runner.waitForReady.push(ready);
146-
sharedWorkerTeardowns.push(async () => {
147-
try {
148-
await teardown();
149-
} finally {
150-
forceUnref();
151-
}
152-
});
153-
return sharedWorkerChannel;
154-
};
155-
156127
// Store value to prevent required modules from modifying it.
157128
const testPath = options.file;
158129

lib/worker/channel.js renamed to lib/worker/channel.cjs

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ const {MessageChannel} = require('worker_threads');
44

55
const pEvent = require('p-event');
66

7-
const timers = require('../now-and-timers');
8-
const {get: getOptions} = require('./options');
9-
const {isRunningInChildProcess, isRunningInThread} = require('./utils');
7+
const timers = require('../now-and-timers.cjs');
8+
const {get: getOptions} = require('./options.cjs');
9+
const {isRunningInChildProcess, isRunningInThread} = require('./utils.cjs');
1010

1111
const selectAvaMessage = type => message => message.ava && message.ava.type === type;
1212

lib/worker/dependency-tracker.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable node/no-deprecated-api */
22
'use strict';
3-
const channel = require('./channel');
3+
const channel = require('./channel.cjs');
44

55
const seenDependencies = new Set();
66
let newDependencies = [];

lib/worker/guard-environment.cjs

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict';
2+
const path = require('path');
3+
const {isRunningInThread, isRunningInChildProcess} = require('./utils.cjs');
4+
5+
// Check if the test is being run without AVA cli
6+
if (!isRunningInChildProcess && !isRunningInThread) {
7+
const chalk = require('chalk'); // Use default Chalk instance.
8+
if (process.argv[1]) {
9+
const fp = path.relative('.', process.argv[1]);
10+
11+
console.log();
12+
console.error(`Test files must be run with the AVA CLI:\n\n ${chalk.grey.dim('$')} ${chalk.cyan('ava ' + fp)}\n`);
13+
14+
process.exit(1); // eslint-disable-line unicorn/no-process-exit
15+
} else {
16+
throw new Error('The ’ava’ module can only be imported in test files');
17+
}
18+
}

lib/worker/main.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
'use strict';
2+
require('./guard-environment.cjs'); // eslint-disable-line import/no-unassigned-import
3+
24
const runner = require('./base').getRunner();
35
module.exports = runner.chain;
File renamed without changes.

lib/worker/plugin.js renamed to lib/worker/plugin.cjs

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
11
const pkg = require('../../package.json');
2-
const baseWorker = require('./base');
3-
const options = require('./options');
2+
const {registerSharedWorker: register} = require('./channel.cjs');
3+
const options = require('./options.cjs');
4+
const {sharedWorkerTeardowns, waitForReady} = require('./state.cjs');
5+
6+
require('./guard-environment.cjs'); // eslint-disable-line import/no-unassigned-import
47

58
const workers = new Map();
69
const workerTeardownFns = new WeakMap();
710

811
function createSharedWorker(filename, initialData, teardown) {
9-
const channel = baseWorker.registerSharedWorker(filename, initialData, teardown);
12+
const {channel, forceUnref, ready} = register(filename, initialData, teardown);
13+
waitForReady.push(ready);
14+
sharedWorkerTeardowns.push(async () => {
15+
try {
16+
await teardown();
17+
} finally {
18+
forceUnref();
19+
}
20+
});
1021

1122
class ReceivedMessage {
1223
constructor(id, data) {

lib/worker/state.cjs

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
'use strict';
2+
exports.sharedWorkerTeardowns = [];
3+
exports.waitForReady = [];
File renamed without changes.

test-tap/assert.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
require('../lib/chalk').set();
3-
require('../lib/worker/options').set({chalkOptions: {level: 0}});
3+
require('../lib/worker/options.cjs').set({chalkOptions: {level: 0}});
44

55
const path = require('path');
66
const stripAnsi = require('strip-ansi');

test-tap/hooks.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
require('../lib/chalk').set();
3-
require('../lib/worker/options').set({});
3+
require('../lib/worker/options.cjs').set({});
44

55
const {test} = require('tap');
66
const Runner = require('../lib/runner');

test-tap/promise.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
require('../lib/chalk').set({level: 0});
3-
require('../lib/worker/options').set({});
3+
require('../lib/worker/options.cjs').set({});
44

55
const {test} = require('tap');
66
const Test = require('../lib/test');

test-tap/runner.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
require('../lib/chalk').set();
3-
require('../lib/worker/options').set({});
3+
require('../lib/worker/options.cjs').set({});
44

55
const delay = require('delay');
66
const {test} = require('tap');

test-tap/serialize-error.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
require('../lib/chalk').set();
3-
require('../lib/worker/options').set({});
3+
require('../lib/worker/options.cjs').set({});
44

55
const {test} = require('tap');
66
const avaAssert = require('../lib/assert');

test-tap/test-try-commit.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
require('../lib/chalk').set();
3-
require('../lib/worker/options').set({chalkOptions: {level: 0}});
3+
require('../lib/worker/options.cjs').set({chalkOptions: {level: 0}});
44

55
const {test} = require('tap');
66
const delay = require('delay');

test-tap/test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
require('../lib/chalk').set({level: 0});
3-
require('../lib/worker/options').set({});
3+
require('../lib/worker/options.cjs').set({});
44

55
const path = require('path');
66
const {test} = require('tap');

test-tap/try-snapshot.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
require('../lib/chalk').set();
3-
require('../lib/worker/options').set({chalkOptions: {level: 0}});
3+
require('../lib/worker/options.cjs').set({chalkOptions: {level: 0}});
44

55
const path = require('path');
66
const {test} = require('tap');

test-tap/watcher.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const proxyquire = require('proxyquire');
88
const sinon = require('sinon');
99
const {test} = require('tap');
1010
const {normalizeGlobs} = require('../lib/globs');
11-
const {setImmediate} = require('../lib/now-and-timers');
11+
const {setImmediate} = require('../lib/now-and-timers.cjs');
1212

1313
require('../lib/chalk').set({});
1414

test/snapshot-regenerate-report/test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const fs = require('fs').promises;
55
const path = require('path');
66

77
require('../../lib/chalk').set({level: 0});
8-
require('../../lib/worker/options').set({});
8+
require('../../lib/worker/options.cjs').set({});
99
const {load} = require('../../lib/snapshot-manager');
1010

1111
test('snapshot report can be regenerated from .snap file', async t => {

0 commit comments

Comments
 (0)