From 5c9dbb96ad0beb7521e5051390478493250ba6b0 Mon Sep 17 00:00:00 2001 From: Raul Date: Sun, 23 Aug 2020 11:44:41 +0200 Subject: [PATCH] Experimentally configure module formats for test files Fixes #2345. Co-authored-by: Mark Wubben --- ava.config.js | 7 +- docs/06-configuration.md | 23 +++++- lib/cli.js | 14 ++-- lib/extensions.js | 5 +- lib/load-config.js | 2 +- lib/module-types.js | 75 ++++++++++++++++++ test/configurable-module-format/commonjs.js | 26 ++++++ test/configurable-module-format/custom.js | 16 ++++ .../experimental.js | 10 +++ .../fixtures/array-custom.config.js | 3 + .../fixtures/array-extensions.config.js | 3 + .../fixtures/bad-custom-type.config.js | 9 +++ .../fixtures/change-cjs-loading.config.js | 8 ++ .../fixtures/change-js-loading.config.js | 8 ++ .../fixtures/change-mjs-loading.config.js | 8 ++ .../fixtures/not-enabled.config.js | 7 ++ .../fixtures/object-custom.config.js | 9 +++ .../fixtures/object-extensions.config.js | 10 +++ .../fixtures/package.json | 1 + .../fixtures/test.cjs | 5 ++ .../fixtures/test.js | 5 ++ .../fixtures/test.mjs | 5 ++ .../fixtures/test.ts | 8 ++ .../invalid-configurations.js | 24 ++++++ test/configurable-module-format/module.js | 23 ++++++ .../snapshots/experimental.js.md | 11 +++ .../snapshots/experimental.js.snap | Bin 0 -> 177 bytes .../snapshots/invalid-configurations.js.md | 29 +++++++ .../snapshots/invalid-configurations.js.snap | Bin 0 -> 270 bytes xo.config.js | 2 +- 30 files changed, 345 insertions(+), 11 deletions(-) create mode 100644 lib/module-types.js create mode 100644 test/configurable-module-format/commonjs.js create mode 100644 test/configurable-module-format/custom.js create mode 100644 test/configurable-module-format/experimental.js create mode 100644 test/configurable-module-format/fixtures/array-custom.config.js create mode 100644 test/configurable-module-format/fixtures/array-extensions.config.js create mode 100644 test/configurable-module-format/fixtures/bad-custom-type.config.js create mode 100644 test/configurable-module-format/fixtures/change-cjs-loading.config.js create mode 100644 test/configurable-module-format/fixtures/change-js-loading.config.js create mode 100644 test/configurable-module-format/fixtures/change-mjs-loading.config.js create mode 100644 test/configurable-module-format/fixtures/not-enabled.config.js create mode 100644 test/configurable-module-format/fixtures/object-custom.config.js create mode 100644 test/configurable-module-format/fixtures/object-extensions.config.js create mode 100644 test/configurable-module-format/fixtures/package.json create mode 100644 test/configurable-module-format/fixtures/test.cjs create mode 100644 test/configurable-module-format/fixtures/test.js create mode 100644 test/configurable-module-format/fixtures/test.mjs create mode 100644 test/configurable-module-format/fixtures/test.ts create mode 100644 test/configurable-module-format/invalid-configurations.js create mode 100644 test/configurable-module-format/module.js create mode 100644 test/configurable-module-format/snapshots/experimental.js.md create mode 100644 test/configurable-module-format/snapshots/experimental.js.snap create mode 100644 test/configurable-module-format/snapshots/invalid-configurations.js.md create mode 100644 test/configurable-module-format/snapshots/invalid-configurations.js.snap diff --git a/ava.config.js b/ava.config.js index 363e4279f..b667ffd2b 100644 --- a/ava.config.js +++ b/ava.config.js @@ -1,4 +1,9 @@ +const skipTests = []; +if (process.versions.node < '12.14.0') { + skipTests.push('!test/configurable-module-format/module.js'); +} + export default { - files: ['test/**', '!test/**/{fixtures,helpers}/**'], + files: ['test/**', '!test/**/{fixtures,helpers}/**', ...skipTests], ignoredByWatcher: ['{coverage,docs,media,test-d,test-tap}/**'] }; diff --git a/docs/06-configuration.md b/docs/06-configuration.md index eb2c48ace..75d9f1c08 100644 --- a/docs/06-configuration.md +++ b/docs/06-configuration.md @@ -52,7 +52,7 @@ Arguments passed to the CLI will always take precedence over the CLI options con - `tap`: if `true`, enables the [TAP reporter](./05-command-line.md#tap-reporter) - `verbose`: if `true`, enables verbose output - `snapshotDir`: specifies a fixed location for storing snapshot files. Use this if your snapshots are ending up in the wrong location -- `extensions`: extensions of test files. Setting this overrides the default `["cjs", "mjs", "js"]` value, so make sure to include those extensions in the list +- `extensions`: extensions of test files. Setting this overrides the default `["cjs", "mjs", "js"]` value, so make sure to include those extensions in the list. [Experimentally you can configure how files are loaded](#configuring-module-formats) - `require`: extra modules to require before tests are run. Modules are required in the [worker processes](./01-writing-tests.md#process-isolation) - `timeout`: Timeouts in AVA behave differently than in other test frameworks. AVA resets a timer after each test, forcing tests to quit if no new test results were received within the specified timeout. This can be used to handle stalled tests. See our [timeout documentation](./07-test-timeouts.md) for more options. - `nodeArguments`: Configure Node.js arguments used to launch worker processes. @@ -213,6 +213,27 @@ export default { }; ``` +### Configuring module formats + +Node.js can only load non-standard extension as ES Modules when using [experimental loaders](https://nodejs.org/docs/latest/api/esm.html#esm_experimental_loaders). To use this you'll also have to configure AVA to `import()` your test file. + +This is still an experimental feature. You can opt in to it by enabling the `configurableModuleFormat` experiment. Afterwards, you'll be able to specify per-extension module formats using an object form. + +As with the array form, you need to explicitly list `js`, `cjs`, and `mjs` extensions. These **must** be set using the `true` value; other extensions are configurable using either `'commonjs'` or `'module'`: + +`ava.config.js`: +```js +export default { + nonSemVerExperiments: { + configurableModuleFormat: true + }, + extensions: { + js: true, + ts: 'module' + } +}; +``` + ## Node arguments The `nodeArguments` configuration may be used to specify additional arguments for launching worker processes. These are combined with `--node-arguments` passed on the CLI and any arguments passed to the `node` binary when starting AVA. diff --git a/lib/cli.js b/lib/cli.js index fc80e1ee9..7e83bb1bd 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -284,6 +284,7 @@ exports.run = async () => { // eslint-disable-line complexity const TapReporter = require('./reporters/tap'); const Watcher = require('./watcher'); const normalizeExtensions = require('./extensions'); + const normalizeModuleTypes = require('./module-types'); const {normalizeGlobs, normalizePattern} = require('./globs'); const normalizeNodeArguments = require('./node-arguments'); const validateEnvironmentVariables = require('./environment-variables'); @@ -301,12 +302,6 @@ exports.run = async () => { // eslint-disable-line complexity const {type: defaultModuleType = 'commonjs'} = pkg || {}; - const moduleTypes = { - cjs: 'commonjs', - mjs: 'module', - js: defaultModuleType - }; - const providers = []; if (Reflect.has(conf, 'babel')) { try { @@ -348,6 +343,13 @@ exports.run = async () => { // eslint-disable-line complexity exit(error.message); } + let moduleTypes; + try { + moduleTypes = normalizeModuleTypes(conf.extensions, defaultModuleType, experiments); + } catch (error) { + exit(error.message); + } + let globs; try { globs = normalizeGlobs({files: conf.files, ignoredByWatcher: conf.ignoredByWatcher, extensions, providers}); diff --git a/lib/extensions.js b/lib/extensions.js index b6b3077b2..8ee05c3f7 100644 --- a/lib/extensions.js +++ b/lib/extensions.js @@ -2,8 +2,11 @@ module.exports = (configuredExtensions, providers = []) => { // Combine all extensions possible for testing. Remove duplicate extensions. const duplicates = new Set(); const seen = new Set(); + + const normalize = extensions => Array.isArray(extensions) ? extensions : Object.keys(extensions); + const combine = extensions => { - for (const ext of extensions) { + for (const ext of normalize(extensions)) { if (seen.has(ext)) { duplicates.add(ext); } else { diff --git a/lib/load-config.js b/lib/load-config.js index 77fd7e92f..7d349344a 100644 --- a/lib/load-config.js +++ b/lib/load-config.js @@ -7,7 +7,7 @@ const pkgConf = require('pkg-conf'); const NO_SUCH_FILE = Symbol('no ava.config.js file'); const MISSING_DEFAULT_EXPORT = Symbol('missing default export'); -const EXPERIMENTS = new Set(['disableSnapshotsInHooks', 'reverseTeardowns']); +const EXPERIMENTS = new Set(['configurableModuleFormat', 'disableSnapshotsInHooks', 'reverseTeardowns']); // *Very* rudimentary support for loading ava.config.js files containing an `export default` statement. const evaluateJsConfig = configFile => { diff --git a/lib/module-types.js b/lib/module-types.js new file mode 100644 index 000000000..087d5d1e2 --- /dev/null +++ b/lib/module-types.js @@ -0,0 +1,75 @@ +const requireTrueValue = value => { + if (value !== true) { + throw new TypeError('When specifying module types, use `true` for ’cjs’, ’mjs’ and ’js’ extensions'); + } +}; + +const normalize = (extension, type, defaultModuleType) => { + switch (extension) { + case 'cjs': + requireTrueValue(type); + return 'commonjs'; + case 'mjs': + requireTrueValue(type); + return 'module'; + case 'js': + requireTrueValue(type); + return defaultModuleType; + default: + if (type !== 'commonjs' && type !== 'module') { + throw new TypeError(`Module type for ’${extension}’ must be ’commonjs’ or ’module’`); + } + + return type; + } +}; + +const deriveFromObject = (extensionsObject, defaultModuleType) => { + const moduleTypes = {}; + for (const [extension, type] of Object.entries(extensionsObject)) { + moduleTypes[extension] = normalize(extension, type, defaultModuleType); + } + + return moduleTypes; +}; + +const deriveFromArray = (extensions, defaultModuleType) => { + const moduleTypes = {}; + for (const extension of extensions) { + switch (extension) { + case 'cjs': + moduleTypes.cjs = 'commonjs'; + break; + case 'mjs': + moduleTypes.mjs = 'module'; + break; + case 'js': + moduleTypes.js = defaultModuleType; + break; + default: + moduleTypes[extension] = 'commonjs'; + } + } + + return moduleTypes; +}; + +module.exports = (configuredExtensions, defaultModuleType, experiments) => { + if (configuredExtensions === undefined) { + return { + cjs: 'commonjs', + mjs: 'module', + js: defaultModuleType + }; + } + + if (Array.isArray(configuredExtensions)) { + return deriveFromArray(configuredExtensions, defaultModuleType); + } + + if (!experiments.configurableModuleFormat) { + throw new Error('You must enable the `configurableModuleFormat` experiment in order to specify module types'); + } + + return deriveFromObject(configuredExtensions, defaultModuleType); +}; diff --git a/test/configurable-module-format/commonjs.js b/test/configurable-module-format/commonjs.js new file mode 100644 index 000000000..41c312466 --- /dev/null +++ b/test/configurable-module-format/commonjs.js @@ -0,0 +1,26 @@ +const test = require('@ava/test'); +const exec = require('../helpers/exec'); + +test('load js and cjs as commonjs (default configuration)', async t => { + const result = await exec.fixture(['*.js', '*.cjs']); + const files = new Set(result.stats.passed.map(({file}) => file)); + t.is(files.size, 2); + t.true(files.has('test.cjs')); + t.true(files.has('test.js')); +}); + +test('load js and cjs as commonjs (using an extensions array)', async t => { + const result = await exec.fixture(['*.js', '*.cjs', '--config', 'array-extensions.config.js']); + const files = new Set(result.stats.passed.map(({file}) => file)); + t.is(files.size, 2); + t.true(files.has('test.cjs')); + t.true(files.has('test.js')); +}); + +test('load js and cjs as commonjs (using an extensions object)', async t => { + const result = await exec.fixture(['*.js', '*.cjs', '--config', 'object-extensions.config.js']); + const files = new Set(result.stats.passed.map(({file}) => file)); + t.is(files.size, 2); + t.true(files.has('test.cjs')); + t.true(files.has('test.js')); +}); diff --git a/test/configurable-module-format/custom.js b/test/configurable-module-format/custom.js new file mode 100644 index 000000000..3f5d6c3e4 --- /dev/null +++ b/test/configurable-module-format/custom.js @@ -0,0 +1,16 @@ +const test = require('@ava/test'); +const exec = require('../helpers/exec'); + +test('load ts as commonjs (using an extensions array)', async t => { + const result = await exec.fixture(['*.ts', '--config', 'array-custom.config.js']); + const files = new Set(result.stats.passed.map(({file}) => file)); + t.is(files.size, 1); + t.true(files.has('test.ts')); +}); + +test('load ts as commonjs (using an extensions object)', async t => { + const result = await exec.fixture(['*.ts', '--config', 'object-custom.config.js']); + const files = new Set(result.stats.passed.map(({file}) => file)); + t.is(files.size, 1); + t.true(files.has('test.ts')); +}); diff --git a/test/configurable-module-format/experimental.js b/test/configurable-module-format/experimental.js new file mode 100644 index 000000000..37d297028 --- /dev/null +++ b/test/configurable-module-format/experimental.js @@ -0,0 +1,10 @@ +const test = require('@ava/test'); +const exec = require('../helpers/exec'); + +const stripLeadingFigures = string => string.replace(/^\W+/, ''); + +test('opt-in is required', async t => { + const result = await t.throwsAsync(exec.fixture(['--config', 'not-enabled.config.js'])); + t.is(result.exitCode, 1); + t.snapshot(stripLeadingFigures(result.stderr.trim())); +}); diff --git a/test/configurable-module-format/fixtures/array-custom.config.js b/test/configurable-module-format/fixtures/array-custom.config.js new file mode 100644 index 000000000..8452365f9 --- /dev/null +++ b/test/configurable-module-format/fixtures/array-custom.config.js @@ -0,0 +1,3 @@ +export default { + extensions: ['js', 'ts'] +}; diff --git a/test/configurable-module-format/fixtures/array-extensions.config.js b/test/configurable-module-format/fixtures/array-extensions.config.js new file mode 100644 index 000000000..ca91b839a --- /dev/null +++ b/test/configurable-module-format/fixtures/array-extensions.config.js @@ -0,0 +1,3 @@ +export default { + extensions: ['js', 'cjs', 'mjs'] +}; diff --git a/test/configurable-module-format/fixtures/bad-custom-type.config.js b/test/configurable-module-format/fixtures/bad-custom-type.config.js new file mode 100644 index 000000000..ad3db25c0 --- /dev/null +++ b/test/configurable-module-format/fixtures/bad-custom-type.config.js @@ -0,0 +1,9 @@ +export default { + extensions: { + js: true, + ts: 'cjs' + }, + nonSemVerExperiments: { + configurableModuleFormat: true + } +}; diff --git a/test/configurable-module-format/fixtures/change-cjs-loading.config.js b/test/configurable-module-format/fixtures/change-cjs-loading.config.js new file mode 100644 index 000000000..c21d1fdb1 --- /dev/null +++ b/test/configurable-module-format/fixtures/change-cjs-loading.config.js @@ -0,0 +1,8 @@ +export default { + extensions: { + cjs: 'module' + }, + nonSemVerExperiments: { + configurableModuleFormat: true + } +}; diff --git a/test/configurable-module-format/fixtures/change-js-loading.config.js b/test/configurable-module-format/fixtures/change-js-loading.config.js new file mode 100644 index 000000000..4200e3f9c --- /dev/null +++ b/test/configurable-module-format/fixtures/change-js-loading.config.js @@ -0,0 +1,8 @@ +export default { + extensions: { + js: 'module' + }, + nonSemVerExperiments: { + configurableModuleFormat: true + } +}; diff --git a/test/configurable-module-format/fixtures/change-mjs-loading.config.js b/test/configurable-module-format/fixtures/change-mjs-loading.config.js new file mode 100644 index 000000000..2437790ff --- /dev/null +++ b/test/configurable-module-format/fixtures/change-mjs-loading.config.js @@ -0,0 +1,8 @@ +export default { + extensions: { + mjs: 'commonjs' + }, + nonSemVerExperiments: { + configurableModuleFormat: true + } +}; diff --git a/test/configurable-module-format/fixtures/not-enabled.config.js b/test/configurable-module-format/fixtures/not-enabled.config.js new file mode 100644 index 000000000..5088cbaac --- /dev/null +++ b/test/configurable-module-format/fixtures/not-enabled.config.js @@ -0,0 +1,7 @@ +export default { + extensions: { + js: true, + cjs: true, + mjs: true + } +}; diff --git a/test/configurable-module-format/fixtures/object-custom.config.js b/test/configurable-module-format/fixtures/object-custom.config.js new file mode 100644 index 000000000..094ca3877 --- /dev/null +++ b/test/configurable-module-format/fixtures/object-custom.config.js @@ -0,0 +1,9 @@ +export default { + extensions: { + js: true, + ts: 'commonjs' + }, + nonSemVerExperiments: { + configurableModuleFormat: true + } +}; diff --git a/test/configurable-module-format/fixtures/object-extensions.config.js b/test/configurable-module-format/fixtures/object-extensions.config.js new file mode 100644 index 000000000..dd7d62356 --- /dev/null +++ b/test/configurable-module-format/fixtures/object-extensions.config.js @@ -0,0 +1,10 @@ +export default { + extensions: { + js: true, + cjs: true, + mjs: true + }, + nonSemVerExperiments: { + configurableModuleFormat: true + } +}; diff --git a/test/configurable-module-format/fixtures/package.json b/test/configurable-module-format/fixtures/package.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/test/configurable-module-format/fixtures/package.json @@ -0,0 +1 @@ +{} diff --git a/test/configurable-module-format/fixtures/test.cjs b/test/configurable-module-format/fixtures/test.cjs new file mode 100644 index 000000000..d7dd4fe69 --- /dev/null +++ b/test/configurable-module-format/fixtures/test.cjs @@ -0,0 +1,5 @@ +const test = require('ava'); + +test('always passing test', t => { + t.pass(); +}); diff --git a/test/configurable-module-format/fixtures/test.js b/test/configurable-module-format/fixtures/test.js new file mode 100644 index 000000000..d7dd4fe69 --- /dev/null +++ b/test/configurable-module-format/fixtures/test.js @@ -0,0 +1,5 @@ +const test = require('ava'); + +test('always passing test', t => { + t.pass(); +}); diff --git a/test/configurable-module-format/fixtures/test.mjs b/test/configurable-module-format/fixtures/test.mjs new file mode 100644 index 000000000..b9c488ebb --- /dev/null +++ b/test/configurable-module-format/fixtures/test.mjs @@ -0,0 +1,5 @@ +import test from 'ava'; + +test('always passing test', t => { + t.pass(); +}); diff --git a/test/configurable-module-format/fixtures/test.ts b/test/configurable-module-format/fixtures/test.ts new file mode 100644 index 000000000..93d621261 --- /dev/null +++ b/test/configurable-module-format/fixtures/test.ts @@ -0,0 +1,8 @@ +// eslint-disable-next-line ava/no-ignored-test-files +const test = require('ava'); + +test('always passing test', t => { + const numberWithTypes = 0; + + t.is(numberWithTypes, 0); +}); diff --git a/test/configurable-module-format/invalid-configurations.js b/test/configurable-module-format/invalid-configurations.js new file mode 100644 index 000000000..a780e13db --- /dev/null +++ b/test/configurable-module-format/invalid-configurations.js @@ -0,0 +1,24 @@ +const test = require('@ava/test'); +const exec = require('../helpers/exec'); + +const stripLeadingFigures = string => string.replace(/^\W+/, ''); + +test('cannot configure how js extensions should be loaded', async t => { + const result = await t.throwsAsync(exec.fixture(['--config', 'change-js-loading.config.js'])); + t.snapshot(stripLeadingFigures(result.stderr.trim())); +}); + +test('cannot configure how cjs extensions should be loaded', async t => { + const result = await t.throwsAsync(exec.fixture(['--config', 'change-cjs-loading.config.js'])); + t.snapshot(stripLeadingFigures(result.stderr.trim())); +}); + +test('cannot configure how mjs extensions should be loaded', async t => { + const result = await t.throwsAsync(exec.fixture(['--config', 'change-mjs-loading.config.js'])); + t.snapshot(stripLeadingFigures(result.stderr.trim())); +}); + +test('custom extensions must be either commonjs or module', async t => { + const result = await t.throwsAsync(exec.fixture(['--config', 'bad-custom-type.config.js'])); + t.snapshot(stripLeadingFigures(result.stderr.trim())); +}); diff --git a/test/configurable-module-format/module.js b/test/configurable-module-format/module.js new file mode 100644 index 000000000..9b07beb08 --- /dev/null +++ b/test/configurable-module-format/module.js @@ -0,0 +1,23 @@ +const test = require('@ava/test'); +const exec = require('../helpers/exec'); + +test('load mjs as module (default configuration)', async t => { + const result = await exec.fixture(['*.mjs']); + const files = new Set(result.stats.passed.map(({file}) => file)); + t.is(files.size, 1); + t.true(files.has('test.mjs')); +}); + +test('load mjs as module (using an extensions array)', async t => { + const result = await exec.fixture(['*.mjs', '--config', 'array-extensions.config.js']); + const files = new Set(result.stats.passed.map(({file}) => file)); + t.is(files.size, 1); + t.true(files.has('test.mjs')); +}); + +test('load mjs as module (using an extensions object)', async t => { + const result = await exec.fixture(['*.mjs', '--config', 'object-extensions.config.js']); + const files = new Set(result.stats.passed.map(({file}) => file)); + t.is(files.size, 1); + t.true(files.has('test.mjs')); +}); diff --git a/test/configurable-module-format/snapshots/experimental.js.md b/test/configurable-module-format/snapshots/experimental.js.md new file mode 100644 index 000000000..fdd39f4bb --- /dev/null +++ b/test/configurable-module-format/snapshots/experimental.js.md @@ -0,0 +1,11 @@ +# Snapshot report for `test/configurable-module-format/experimental.js` + +The actual snapshot is saved in `experimental.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## opt-in is required + +> Snapshot 1 + + 'You must enable the `configurableModuleFormat` experiment in order to specify module types' diff --git a/test/configurable-module-format/snapshots/experimental.js.snap b/test/configurable-module-format/snapshots/experimental.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..4b56cc63f54b51cbe9b2b261544a71608f6b3d62 GIT binary patch literal 177 zcmV;i08alwRzVw|>;24IYfE&umtETOW%E00000000A1 zU|?Wi1mZmxTOyXKJW`#0e#KdB8;}SCLk18tGq8i%jI0cTj8T#Kr3$&F#U%=7_*=5#Rij(wtPc{G!~%k_3g+ih|Ul%-qzx5{1k>h5VwF)FOqF fe1+nI)a1;xN`+joVug~*g4ALFP!bR%hyVZpssl^z literal 0 HcmV?d00001 diff --git a/test/configurable-module-format/snapshots/invalid-configurations.js.md b/test/configurable-module-format/snapshots/invalid-configurations.js.md new file mode 100644 index 000000000..61c38084e --- /dev/null +++ b/test/configurable-module-format/snapshots/invalid-configurations.js.md @@ -0,0 +1,29 @@ +# Snapshot report for `test/configurable-module-format/invalid-configurations.js` + +The actual snapshot is saved in `invalid-configurations.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## cannot configure how cjs extensions should be loaded + +> Snapshot 1 + + 'When specifying module types, use `true` for ’cjs’, ’mjs’ and ’js’ extensions' + +## cannot configure how js extensions should be loaded + +> Snapshot 1 + + 'When specifying module types, use `true` for ’cjs’, ’mjs’ and ’js’ extensions' + +## cannot configure how mjs extensions should be loaded + +> Snapshot 1 + + 'When specifying module types, use `true` for ’cjs’, ’mjs’ and ’js’ extensions' + +## custom extensions must be either commonjs or module + +> Snapshot 1 + + 'Module type for ’ts’ must be ’commonjs’ or ’module’' diff --git a/test/configurable-module-format/snapshots/invalid-configurations.js.snap b/test/configurable-module-format/snapshots/invalid-configurations.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..100a0f7b99b72642dcc572f0d41bdb3fd21465c8 GIT binary patch literal 270 zcmV+p0rCDpRzVexTY5#hb!>Ri_C7`i5J(4NvvRfQvU&Pzwzq8DV;yr_h!HG$4v52e z*(Nkgoa0jPT_Luj#_KO5Skx4#wKJkRT&m)(NXj9u$*bpFPhbR#HUTj+13TDcMpgzv z#>nuD)I5dag4E>9w93r9bcNjfl+v73g_6pG)M6cl(&AKwgp#7t)C7gJ{33-%4KtIo zih-mKh?xs!DkSEmfOrs2YDGzEUU6oAUhy!t#@-iUEX<@5u!h{y;u3|VRIt(cxw-jy U5OW|(AdUet0P?bwbMOHG0RE+W{{R30 literal 0 HcmV?d00001 diff --git a/xo.config.js b/xo.config.js index 75eb391c7..bb009d6c6 100644 --- a/xo.config.js +++ b/xo.config.js @@ -44,7 +44,7 @@ module.exports = { } }, { - files: ['test-tap/fixture/**/*.js', 'test/**/fixtures/**/*.js'], + files: ['test-tap/fixture/**', 'test/**/fixtures/**'], rules: { 'import/no-extraneous-dependencies': 'off' }