Explicit and separate CJS and ESM entrypoints

Fixes #2671.

AVA now only has a default export: the test() function.
This commit is contained in:
Mark Wubben 2021-03-28 15:33:15 +02:00
parent cc4e622903
commit 5e0844452f
147 changed files with 174 additions and 206 deletions

7
ava.config.cjs Normal file
View file

@ -0,0 +1,7 @@
// 👉 Due to the package exports, XO's use of our ESLint plugin loads this
// file using the AVA code in the repository, but our self-hosted tests use the
// installed "test-ava" version.
module.exports = {
files: ['test/**', '!test/**/{fixtures,helpers}/**'],
ignoredByWatcher: ['{coverage,docs,media,test-d,test-tap}/**']
};

View file

@ -1,4 +0,0 @@
export default {
files: ['test/**', '!test/**/{fixtures,helpers}/**'],
ignoredByWatcher: ['{coverage,docs,media,test-d,test-tap}/**']
};

3
cli.js
View file

@ -1,3 +0,0 @@
#!/usr/bin/env node
'use strict';
require('./lib/cli').run();

3
entrypoints/cli.mjs Executable file
View file

@ -0,0 +1,3 @@
#!/usr/bin/env node
import * as cli from '../lib/cli.js'; // eslint-disable-line import/extensions
cli.run();

View file

@ -2,7 +2,7 @@
const v8 = require('v8');
const {Worker} = require('worker_threads');
const {classify, hasExtension, isHelperish, matches, normalizeFileForMatching, normalizePatterns} = require('./lib/globs');
const {classify, hasExtension, isHelperish, matches, normalizeFileForMatching, normalizePatterns} = require('../lib/globs');
const MAX_DATA_LENGTH_EXCLUSIVE = 100 * 1024; // Allocate 100 KiB to exchange globs.

2
entrypoints/main.cjs Normal file
View file

@ -0,0 +1,2 @@
'use strict';
module.exports = require('../lib/worker/main');

2
entrypoints/main.mjs Normal file
View file

@ -0,0 +1,2 @@
import test from '../lib/worker/main.js'; // eslint-disable-line import/extensions
export default test;

2
entrypoints/plugin.cjs Normal file
View file

@ -0,0 +1,2 @@
'use strict';
module.exports = require('../lib/worker/plugin');

4
entrypoints/plugin.mjs Normal file
View file

@ -0,0 +1,4 @@
'use strict';
import * as plugin from '../lib/worker/plugin.js'; // eslint-disable-line import/extensions
const {registerSharedWorker} = plugin;
export {registerSharedWorker};

30
index.d.ts vendored
View file

@ -683,33 +683,3 @@ declare const test: TestInterface;
/** Call to declare a test, or chain to declare hooks or test modifiers */
export default test;
/** Call to declare a hook that is run once, after all tests have passed, or chain to declare modifiers. */
export const after: AfterInterface;
/** Call to declare a hook that is run after each passing test, or chain to declare modifiers. */
export const afterEach: AfterInterface;
/** Call to declare a hook that is run once, before all tests, or chain to declare modifiers. */
export const before: BeforeInterface;
/** Call to declare a hook that is run before each test, or chain to declare modifiers. */
export const beforeEach: BeforeInterface;
/** Call to declare a test that is expected to fail, or chain to declare modifiers. */
export const failing: FailingInterface;
/** Call to declare a test that is run exclusively, along with other tests declared with `.only()`. */
export const only: OnlyInterface;
/** Call to declare a serial test, or chain to declare serial hooks or test modifiers. */
export const serial: SerialInterface;
/** Skip this test. */
export const skip: SkipInterface;
/** Declare a test that should be implemented later. */
export const todo: TodoDeclaration;
/** Meta data associated with the current process. */
export const meta: MetaInterface;

View file

@ -1,2 +0,0 @@
'use strict';
module.exports = require('./lib/worker/main');

View file

@ -1,20 +1,3 @@
'use strict';
const runner = require('./base').getRunner();
const makeCjsExport = () => {
function test(...args) {
return runner.chain(...args);
}
return Object.assign(test, runner.chain);
};
// Support CommonJS modules by exporting a test function that can be fully
// chained. Also support ES module loaders by exporting __esModule and a
// default. Support `import * as ava from 'ava'` use cases by exporting a
// `test` member. Do all this whilst preventing `test.test.test() or
// `test.default.test()` chains, though in CommonJS `test.test()` is
// unavoidable.
module.exports = Object.assign(makeCjsExport(), {
__esModule: true,
default: runner.chain
});
module.exports = runner.chain;

2
package-lock.json generated
View file

@ -65,7 +65,7 @@
"yargs": "^16.2.0"
},
"bin": {
"ava": "cli.js"
"ava": "entrypoints/cli.mjs"
},
"devDependencies": {
"@ava/babel": "^1.0.1",

View file

@ -6,7 +6,18 @@
"repository": "avajs/ava",
"homepage": "https://avajs.dev",
"bin": {
"ava": "cli.js"
"ava": "./entrypoints/cli.mjs"
},
"exports": {
".": {
"import": "./entrypoints/main.mjs",
"require": "./entrypoints/main.cjs"
},
"./eslint-plugin-helper": "./entrypoints/eslint-plugin-helper.cjs",
"./plugin": {
"import": "./entrypoints/plugin.mjs",
"require": "./entrypoints/plugin.cjs"
}
},
"engines": {
"node": ">=12.20 <13 || >=14.15 <15 || >=15"
@ -16,10 +27,8 @@
"test": "xo && tsd && npm run -s cover"
},
"files": [
"entrypoints",
"lib",
"*.js",
"!*.config.js",
"index.d.ts",
"*.d.ts"
],
"keywords": [

View file

@ -1,2 +0,0 @@
'use strict';
module.exports = require('./lib/worker/plugin');

View file

@ -1,5 +1,5 @@
import {expectType} from 'tsd';
import test from '..';
import test from '..'; // eslint-disable-line import/no-unresolved
type Expected = {foo: 'bar'};
const expected: Expected = {foo: 'bar'};

View file

@ -1,5 +1,5 @@
import {expectError, expectType} from 'tsd';
import anyTest, {Macro, TestInterface} from '..';
import anyTest, {Macro, TestInterface} from '..'; // eslint-disable-line import/no-unresolved
interface Context {
foo: string;

View file

@ -1,4 +1,4 @@
import test from '..';
import test from '..'; // eslint-disable-line import/no-unresolved
test('like', t => {
t.like({

View file

@ -1,5 +1,5 @@
import {expectType} from 'tsd';
import test, {ExecutionContext, Macro} from '..';
import test, {ExecutionContext, Macro} from '..'; // eslint-disable-line import/no-unresolved
// Explicitly type as a macro.
{

View file

@ -1,5 +1,5 @@
import {expectType} from 'tsd';
import * as plugin from '../plugin';
import * as plugin from '../plugin'; // eslint-disable-line import/no-unresolved
expectType<plugin.SharedWorker.Plugin.Experimental.Protocol>(plugin.registerSharedWorker({filename: '', supportedProtocols: ['experimental']}));

View file

@ -1,5 +1,5 @@
import {expectError} from 'tsd';
import test from '..';
import test from '..'; // eslint-disable-line import/no-unresolved
test('snapshot', t => {
t.snapshot({foo: 'bar'});

View file

@ -1,5 +1,5 @@
import {expectType} from 'tsd';
import test from '..';
import test from '..'; // eslint-disable-line import/no-unresolved
class CustomError extends Error {
foo: string;

View file

@ -1,5 +1,5 @@
import {expectType} from 'tsd';
import test, {ExecutionContext, Macro} from '..';
import test, {ExecutionContext, Macro} from '..'; // eslint-disable-line import/no-unresolved
test('attempt', async t => {
const attempt = await t.try(

View file

@ -43,7 +43,7 @@ for (const opt of opts) {
});
return api.run({files: [path.join(__dirname, 'fixture', 'meta.js')]})
.then(runStatus => {
t.is(runStatus.stats.passedTests, 3);
t.is(runStatus.stats.passedTests, 2);
});
});

View file

@ -2,7 +2,7 @@
const path = require('path');
const {test} = require('tap');
const {load} = require('../eslint-plugin-helper');
const {load} = require('../entrypoints/eslint-plugin-helper.cjs');
const projectDir = path.join(__dirname, 'fixture/eslint-plugin-helper');
const overrideDir = path.join(__dirname, 'fixture/eslint-plugin-helper/for-overriding');

View file

@ -5,7 +5,7 @@ const babel = require('@babel/core');
const transformed = babel.transform(`
import {mapFile} from 'source-map-fixtures';
import test from '../../';
import test from '../../entrypoints/main.cjs';
const fixture = mapFile('throws').require();

View file

@ -1,4 +1,4 @@
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
test('test', t => {
t.true(2 + 2 === 4);

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('pass', t => {
t.pass();

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
const foo = 'foo';

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
const getAnonymousFn = () => () => {
throw new Error();

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('test', t => {
t.pass();

View file

@ -1,4 +1,4 @@
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
const one = {one: 1};
const two = {two: 2};

View file

@ -1,3 +1,3 @@
require('../../../..'); // eslint-disable-line import/no-unassigned-import
require('../../../../entrypoints/main.cjs'); // eslint-disable-line import/no-unassigned-import
process.exit(1); // eslint-disable-line unicorn/no-process-exit

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('first pass', t => {
t.pass();

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('first pass', t => {
t.pass();

View file

@ -1,6 +1,6 @@
const {parentPort} = require('worker_threads');
const pEvent = require('p-event');
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test.serial('first pass', async t => {
t.pass();

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('first pass', t => {
t.pass();

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('first pass', t => {
t.pass();

View file

@ -1,5 +1,5 @@
const delay = require('delay');
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('slow pass', async t => {
await delay(1000);

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('first pass', t => {
t.pass();

View file

@ -1,3 +1,3 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('pass', t => t.pass());

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
setTimeout(() => {
test.serial('pass', t => t.pass());

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('test', t => {
t.deepEqual({foo: 1}, {foo: 2});

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test.before(() => {
throw new Error('should not run');

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('test', t => {
t.pass();

View file

@ -1,3 +1,3 @@
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
test('pass', t => t.pass());

View file

@ -1,4 +1,4 @@
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
test('test', t => {
try {

View file

@ -1,4 +1,4 @@
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
test('test', t => {
try {

View file

@ -1,4 +1,4 @@
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
test('test', t => {
try {

View file

@ -1,4 +1,4 @@
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
test('test', t => {
try {

View file

@ -1,4 +1,4 @@
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
test('test', t => {
try {

View file

@ -1,4 +1,4 @@
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
test('test', t => {
return Promise.resolve().then(() => {

View file

@ -1,4 +1,4 @@
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
test('test', t => {
t.throws(throwSync());

View file

@ -1,5 +1,5 @@
const delay = require('delay');
const test = require('../../..');
const test = require('../../../entrypoints/main.cjs');
test('test', async t => {
Promise.resolve().then(() => {

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
Error.stackTraceLimit = 1;

View file

@ -1,5 +1,5 @@
const delay = require('delay');
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('slow', async t => {
await delay(5000);

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('this test will match', t => {
t.pass();

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('foo', t => {
t.pass();

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('foo', t => {
t.pass();

View file

@ -1,14 +1,10 @@
const {default: test, meta} = require('../..');
test('meta is test.meta', t => {
t.is(meta, test.meta);
});
const test = require('../../entrypoints/main.cjs');
test('meta.file', t => {
t.is(meta.file, __filename);
t.is(test.meta.file, __filename);
});
test('meta.snapshotDirectory', t => {
t.regex(meta.snapshotDirectory, /snapshot-fixture/);
t.regex(test.meta.snapshotDirectory, /snapshot-fixture/);
});

View file

@ -1,4 +1,4 @@
import test from '../../index.js'; // eslint-disable-line import/extensions
import test from '../../entrypoints/main.mjs';
test('pass', t => {
t.pass();

View file

@ -1 +1 @@
require('../..'); // eslint-disable-line import/no-unassigned-import
require('../../entrypoints/main.cjs'); // eslint-disable-line import/no-unassigned-import

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('NODE_ENV is foo', t => {
t.plan(1);

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('NODE_ENV is test', t => {
t.plan(1);

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('at expected index', t => {
t.is(process.env.CI_NODE_INDEX, '0');

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('at expected index', t => {
t.is(process.env.CI_NODE_INDEX, '1');

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('at expected index', t => {
t.is(process.env.CI_NODE_INDEX, '1');

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('at expected index', t => {
t.is(process.env.CI_NODE_INDEX, '0');

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('at expected index', t => {
t.is(process.env.CI_NODE_INDEX, '0');

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('at expected index', t => {
t.is(process.env.CI_NODE_INDEX, '0');

View file

@ -1,5 +1,5 @@
/* eslint-disable unicorn/filename-case */
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('at expected index', t => {
t.is(process.env.CI_NODE_INDEX, '1');

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('at expected index', t => {
t.is(process.env.CI_NODE_INDEX, '1');

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('at expected index', t => {
t.is(process.env.CI_NODE_INDEX, '2');

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('at expected index', t => {
t.is(process.env.CI_NODE_INDEX, '2');

View file

@ -1,3 +1,3 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('test', () => {});

View file

@ -1,4 +1,4 @@
import test from '../../../index.js'; // eslint-disable-line import/extensions
import test from '../../../entrypoints/main.mjs';
test('pass', t => {
t.pass();

View file

@ -1,6 +1,6 @@
const path = require('path');
const pkgConf = require('pkg-conf');
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('test', t => {
const conf = pkgConf.sync('ava');

View file

@ -1,4 +1,4 @@
const test = require('../..');
const test = require('../../entrypoints/main.cjs');
test('test', t => {
t.is(process.cwd(), __dirname);

View file

@ -1,3 +1,3 @@
To run these tests directly, `cd` into the respective directories and invoke via `node ../../../../cli.js`.
To run these tests directly, `cd` into the respective directories and invoke via `node ../../../../entrypoints/cli.mjs`.
Note that the `report` helper sorts the test files before running tests.

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
const fn = do {
t => t.pass();

View file

@ -1 +1 @@
require('../../../..'); // eslint-disable-line import/no-unassigned-import
require('../../../../entrypoints/main.cjs'); // eslint-disable-line import/no-unassigned-import

View file

@ -1,3 +1,3 @@
const {test} = require('../../../..');
const {test} = require('../../../../entrypoints/main.cjs');
test('pass', t => t.pass());

View file

@ -1,3 +1,3 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('passes', t => t.pass());

View file

@ -1,3 +1,3 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('fails', t => t.fail());

View file

@ -1,3 +1,3 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('passes', t => t.pass());

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('fails', t => t.fail());
test('passes', t => t.pass());

View file

@ -1,3 +1,3 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('passes', t => t.pass());

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test.only('only', t => t.pass());

View file

@ -1,3 +1,3 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('passes', t => t.pass());

View file

@ -1,3 +1,3 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test.serial.test('passes', t => t.pass());

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
const util = require('util'); // eslint-disable-line unicorn/import-style
util.inspect.defaultOptions.depth = 4;

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test.before(() => {});

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('passes', t => t.pass());

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
function throwError() {
throw new Error('uh-oh');

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('passes', t => {
setImmediate(() => {

View file

@ -1,4 +1,4 @@
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
const passes = t => {
Promise.reject(new Error('Can’t catch me'));

View file

@ -1,5 +1,5 @@
const delay = require('delay');
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('a passes', t => t.pass());

View file

@ -1,5 +1,5 @@
const delay = require('delay');
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('b passes', t => t.pass());

View file

@ -1,5 +1,5 @@
const delay = require('delay');
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('passes', t => t.pass());

View file

@ -1,5 +1,5 @@
const delay = require('delay');
const test = require('../../../..');
const test = require('../../../../entrypoints/main.cjs');
test('passes needle', t => t.pass());

Some files were not shown because too many files have changed in this diff Show more