diff --git a/lib/plugins/eslint.js b/lib/plugins/eslint.js index 4bf4e3ae..58c33a58 100644 --- a/lib/plugins/eslint.js +++ b/lib/plugins/eslint.js @@ -40,6 +40,7 @@ If you prefer to create a ${chalk.yellow('.eslintrc.js')} file by yourself, here ${chalk.yellow(`// .eslintrc.js module.exports = { + root: true, parser: '@babel/eslint-parser', extends: ['eslint:recommended'], } @@ -51,13 +52,37 @@ Install ${chalk.yellow('@babel/eslint-parser')} to prevent potential parsing iss const babelConfig = babelLoaderUtil.getLoaders(webpackConfig)[0].options; // cacheDirectory is a custom loader option, not a Babel option delete babelConfig['cacheDirectory']; + + (babelConfig['presets'] || []).forEach(preset => { + if (!Array.isArray(preset)) { + return; + } + + if (typeof preset[0] === 'string' && preset[0].includes('@babel') && preset[0].includes('preset-env')) { + // The goal is to replace the preset string with a require.resolve() call, executed at runtime. + // Since we output the Babel config as JSON, we need to replace it with a placeholder. + preset[0] = '__PATH_TO_BABEL_PRESET_ENV__'; + + // The option "targets" is not necessary + delete preset[1]['targets']; + + // If needed, specify the core-js version to use + if (preset[1]['corejs'] === null) { + preset[1]['corejs'] = packageHelper.getPackageVersion('core-js'); + } + } + }); + message += ` You will also need to specify your Babel config in a separate file. The current configuration Encore has been adding for your is: ${chalk.yellow(`// babel.config.js -module.exports = ${JSON.stringify(babelConfig, null, 4)} +module.exports = ${ + JSON.stringify(babelConfig, null, 4) + .replace('"__PATH_TO_BABEL_PRESET_ENV__"', 'require.resolve("@babel/preset-env")') +} `)}`; if (webpackConfig.babelConfigurationCallback) {