Skip to content

Commit

Permalink
Ensure ava/plugin works in a CJS environment
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
novemberborn committed Apr 26, 2021
1 parent 6525f4d commit a742eed
Show file tree
Hide file tree
Showing 23 changed files with 60 additions and 54 deletions.
2 changes: 1 addition & 1 deletion entrypoints/plugin.cjs
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
'use strict';
module.exports = require('../lib/worker/plugin');
module.exports = require('../lib/worker/plugin.cjs');
File renamed without changes.
3 changes: 2 additions & 1 deletion lib/runner.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const parseTestArgs = require('./parse-test-args');
const snapshotManager = require('./snapshot-manager');
const serializeError = require('./serialize-error');
const Runnable = require('./test');
const {waitForReady} = require('./worker/state.cjs');

class Runner extends Emittery {
constructor(options = {}) {
Expand Down Expand Up @@ -53,7 +54,7 @@ class Runner extends Emittery {
serial: [],
todo: []
};
this.waitForReady = [];
this.waitForReady = waitForReady;

const uniqueTestTitles = new Set();
this.registerUniqueTitle = title => {
Expand Down
2 changes: 1 addition & 1 deletion lib/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const concordance = require('concordance');
const isPromise = require('is-promise');
const plur = require('plur');
const assert = require('./assert');
const nowAndTimers = require('./now-and-timers');
const nowAndTimers = require('./now-and-timers.cjs');
const parseTestArgs = require('./parse-test-args');
const concordanceOptions = require('./concordance-options').default;

Expand Down
39 changes: 5 additions & 34 deletions lib/worker/base.js
Original file line number Diff line number Diff line change
@@ -1,43 +1,27 @@
'use strict';
const {pathToFileURL} = require('url');
const path = require('path');
const currentlyUnhandled = require('currently-unhandled')();
const {isRunningInThread, isRunningInChildProcess} = require('./utils');
const {isRunningInThread, isRunningInChildProcess} = require('./utils.cjs');

// Check if the test is being run without AVA cli
if (!isRunningInChildProcess && !isRunningInThread) {
const chalk = require('chalk'); // Use default Chalk instance.
if (process.argv[1]) {
const fp = path.relative('.', process.argv[1]);

console.log();
console.error(`Test files must be run with the AVA CLI:\n\n ${chalk.grey.dim('$')} ${chalk.cyan('ava ' + fp)}\n`);

process.exit(1);
} else {
throw new Error('The ’ava’ module can only be imported in test files');
}
}

const channel = require('./channel');
const channel = require('./channel.cjs');

const run = async options => {
require('./options').set(options);
require('./options.cjs').set(options);
require('../chalk').set(options.chalkOptions);

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

const nowAndTimers = require('../now-and-timers');
const nowAndTimers = require('../now-and-timers.cjs');
const providerManager = require('../provider-manager');
const Runner = require('../runner');
const serializeError = require('../serialize-error');
const dependencyTracking = require('./dependency-tracker');
const lineNumberSelection = require('./line-numbers');

const sharedWorkerTeardowns = [];
const {sharedWorkerTeardowns} = require('./state.cjs');

async function exit(code) {
if (!process.exitCode) {
Expand Down Expand Up @@ -140,19 +124,6 @@ const run = async options => {
return runner;
};

exports.registerSharedWorker = (filename, initialData, teardown) => {
const {channel: sharedWorkerChannel, forceUnref, ready} = channel.registerSharedWorker(filename, initialData);
runner.waitForReady.push(ready);
sharedWorkerTeardowns.push(async () => {
try {
await teardown();
} finally {
forceUnref();
}
});
return sharedWorkerChannel;
};

// Store value to prevent required modules from modifying it.
const testPath = options.file;

Expand Down
6 changes: 3 additions & 3 deletions lib/worker/channel.js → lib/worker/channel.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ const {MessageChannel} = require('worker_threads');

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

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

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

Expand Down
2 changes: 1 addition & 1 deletion lib/worker/dependency-tracker.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* eslint-disable node/no-deprecated-api */
'use strict';
const channel = require('./channel');
const channel = require('./channel.cjs');

const seenDependencies = new Set();
let newDependencies = [];
Expand Down
18 changes: 18 additions & 0 deletions lib/worker/guard-environment.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'use strict';
const path = require('path');
const {isRunningInThread, isRunningInChildProcess} = require('./utils.cjs');

// Check if the test is being run without AVA cli
if (!isRunningInChildProcess && !isRunningInThread) {
const chalk = require('chalk'); // Use default Chalk instance.
if (process.argv[1]) {
const fp = path.relative('.', process.argv[1]);

console.log();
console.error(`Test files must be run with the AVA CLI:\n\n ${chalk.grey.dim('$')} ${chalk.cyan('ava ' + fp)}\n`);

process.exit(1); // eslint-disable-line unicorn/no-process-exit
} else {
throw new Error('The ’ava’ module can only be imported in test files');
}
}
2 changes: 2 additions & 0 deletions lib/worker/main.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
'use strict';
require('./guard-environment.cjs'); // eslint-disable-line import/no-unassigned-import

const runner = require('./base').getRunner();
module.exports = runner.chain;
File renamed without changes.
17 changes: 14 additions & 3 deletions lib/worker/plugin.js → lib/worker/plugin.cjs
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
const pkg = require('../../package.json');
const baseWorker = require('./base');
const options = require('./options');
const {registerSharedWorker: register} = require('./channel.cjs');
const options = require('./options.cjs');
const {sharedWorkerTeardowns, waitForReady} = require('./state.cjs');

require('./guard-environment.cjs'); // eslint-disable-line import/no-unassigned-import

const workers = new Map();
const workerTeardownFns = new WeakMap();

function createSharedWorker(filename, initialData, teardown) {
const channel = baseWorker.registerSharedWorker(filename, initialData, teardown);
const {channel, forceUnref, ready} = register(filename, initialData, teardown);
waitForReady.push(ready);
sharedWorkerTeardowns.push(async () => {
try {
await teardown();
} finally {
forceUnref();
}
});

class ReceivedMessage {
constructor(id, data) {
Expand Down
3 changes: 3 additions & 0 deletions lib/worker/state.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
'use strict';
exports.sharedWorkerTeardowns = [];
exports.waitForReady = [];
File renamed without changes.
2 changes: 1 addition & 1 deletion test-tap/assert.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';
require('../lib/chalk').set();
require('../lib/worker/options').set({chalkOptions: {level: 0}});
require('../lib/worker/options.cjs').set({chalkOptions: {level: 0}});

const path = require('path');
const stripAnsi = require('strip-ansi');
Expand Down
2 changes: 1 addition & 1 deletion test-tap/hooks.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';
require('../lib/chalk').set();
require('../lib/worker/options').set({});
require('../lib/worker/options.cjs').set({});

const {test} = require('tap');
const Runner = require('../lib/runner');
Expand Down
2 changes: 1 addition & 1 deletion test-tap/promise.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';
require('../lib/chalk').set({level: 0});
require('../lib/worker/options').set({});
require('../lib/worker/options.cjs').set({});

const {test} = require('tap');
const Test = require('../lib/test');
Expand Down
2 changes: 1 addition & 1 deletion test-tap/runner.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';
require('../lib/chalk').set();
require('../lib/worker/options').set({});
require('../lib/worker/options.cjs').set({});

const delay = require('delay');
const {test} = require('tap');
Expand Down
2 changes: 1 addition & 1 deletion test-tap/serialize-error.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';
require('../lib/chalk').set();
require('../lib/worker/options').set({});
require('../lib/worker/options.cjs').set({});

const {test} = require('tap');
const avaAssert = require('../lib/assert');
Expand Down
2 changes: 1 addition & 1 deletion test-tap/test-try-commit.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';
require('../lib/chalk').set();
require('../lib/worker/options').set({chalkOptions: {level: 0}});
require('../lib/worker/options.cjs').set({chalkOptions: {level: 0}});

const {test} = require('tap');
const delay = require('delay');
Expand Down
2 changes: 1 addition & 1 deletion test-tap/test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';
require('../lib/chalk').set({level: 0});
require('../lib/worker/options').set({});
require('../lib/worker/options.cjs').set({});

const path = require('path');
const {test} = require('tap');
Expand Down
2 changes: 1 addition & 1 deletion test-tap/try-snapshot.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';
require('../lib/chalk').set();
require('../lib/worker/options').set({chalkOptions: {level: 0}});
require('../lib/worker/options.cjs').set({chalkOptions: {level: 0}});

const path = require('path');
const {test} = require('tap');
Expand Down
2 changes: 1 addition & 1 deletion test-tap/watcher.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const proxyquire = require('proxyquire');
const sinon = require('sinon');
const {test} = require('tap');
const {normalizeGlobs} = require('../lib/globs');
const {setImmediate} = require('../lib/now-and-timers');
const {setImmediate} = require('../lib/now-and-timers.cjs');

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

Expand Down
2 changes: 1 addition & 1 deletion test/snapshot-regenerate-report/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const fs = require('fs').promises;
const path = require('path');

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

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

0 comments on commit a742eed

Please sign in to comment.