Skip to content

Commit f4d4edd

Browse files
committed
Evaluate ava.config.js scripts in current context
Fixes #2405.
1 parent 8831f54 commit f4d4edd

File tree

3 files changed

+6
-36
lines changed

3 files changed

+6
-36
lines changed

lib/load-config.js

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,15 @@ const NO_SUCH_FILE = Symbol('no ava.config.js file');
99
const MISSING_DEFAULT_EXPORT = Symbol('missing default export');
1010
const EXPERIMENTS = new Set(['tryAssertion']);
1111

12-
class LegacyCommonJsAccessError extends Error {
13-
constructor(thing, fileForErrorMessage) {
14-
super(`${thing} is not available in ${fileForErrorMessage}. Use a .cjs file instead`);
15-
this.name = 'LegacyCommonJsAccessError';
16-
}
17-
}
18-
1912
// *Very* rudimentary support for loading ava.config.js files containing an `export default` statement.
20-
const evaluateJsConfig = (configFile, fileForErrorMessage) => {
13+
const evaluateJsConfig = configFile => {
2114
const contents = fs.readFileSync(configFile, 'utf8');
2215
const script = new vm.Script(`'use strict';(()=>{let __export__;\n${contents.replace(/export default/g, '__export__ =')};return __export__;})()`, {
2316
filename: configFile,
2417
lineOffset: -1
2518
});
2619
return {
27-
default: script.runInNewContext({
28-
console,
29-
process,
30-
get __dirname() {
31-
throw new LegacyCommonJsAccessError('__dirname', fileForErrorMessage);
32-
},
33-
get __filename() {
34-
throw new LegacyCommonJsAccessError('__filename', fileForErrorMessage);
35-
},
36-
get module() {
37-
throw new LegacyCommonJsAccessError('module', fileForErrorMessage);
38-
},
39-
get exports() {
40-
throw new LegacyCommonJsAccessError('exports', fileForErrorMessage);
41-
},
42-
get require() {
43-
throw new LegacyCommonJsAccessError('require()', fileForErrorMessage);
44-
}
45-
})
20+
default: script.runInThisContext()
4621
};
4722
};
4823

@@ -55,17 +30,13 @@ const loadJsConfig = ({projectDir, configFile = path.join(projectDir, 'ava.confi
5530

5631
let config;
5732
try {
58-
({default: config = MISSING_DEFAULT_EXPORT} = evaluateJsConfig(configFile, fileForErrorMessage));
33+
({default: config = MISSING_DEFAULT_EXPORT} = evaluateJsConfig(configFile));
5934
} catch (error) {
6035
if (error.code === 'ENOENT') {
6136
return null;
6237
}
6338

64-
if (error.name === 'LegacyCommonJsAccessError') {
65-
throw error;
66-
} else {
67-
throw Object.assign(new Error(`Error loading ${fileForErrorMessage}`), {parent: error});
68-
}
39+
throw Object.assign(new Error(`Error loading ${fileForErrorMessage}: ${error.message}`), {parent: error});
6940
}
7041

7142
if (config === MISSING_DEFAULT_EXPORT) {

test/integration/config.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ const fs = require('fs');
33
const path = require('path');
44
const {test} = require('tap');
55
const execa = require('execa');
6-
const figures = require('figures');
76
const tempy = require('tempy');
87
const {execCli} = require('../helper/cli');
98

@@ -13,7 +12,7 @@ test('formats errors from ava.config.js', t => {
1312

1413
const lines = stderr.split('\n');
1514
t.is(lines[0], '');
16-
t.is(lines[1], ' ' + figures.cross + ' Error loading ava.config.js');
15+
t.match(lines[1], /Error loading ava\.config\.js:/);
1716
t.is(lines[2], '');
1817
t.match(lines[3], /ava\.config\.js/);
1918
t.match(lines[4], /foo/);

test/load-config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ test('loads config from factory function', t => {
8080

8181
test('does not support require() inside config.js files', t => {
8282
changeDir('require');
83-
t.throws(loadConfig, /require\(\) is not available in ava\.config\.js\. Use a \.cjs file instead/);
83+
t.throws(loadConfig, /Error loading ava\.config\.js: require is not defined/);
8484
t.end();
8585
});
8686

0 commit comments

Comments
 (0)