Description
Bug Report
Current behavior
No core-js polyfills in the final bundle.
Since #10862 the core-js polyfill paths always have .js
extension.
In shouldReplace
function
babel/packages/babel-preset-env/src/polyfills/corejs3/entry-plugin.js
Lines 52 to 64 in 4108524
the module path is compared with the source. In my application the comparison happens between
core-js/modules/es.symbol
and core-js/modules/es.symbol.js
causing the function to return different value than expected.
- Repo to reproduce the problem: https://github.com/ertrzyiks/babel-loader-lost-polyfills-demo
Input Code
import 'core-js'
console.log([1, [2]].flat())
Expected behavior
Importing core-js includes polyfill to the final bundle
Babel Configuration (babel.config.js, .babelrc, package.json#babel, cli command, .eslintrc)
- Filename:
babel.config.js
module.exports = {
mode: 'production',
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
cacheDirectory: false,
presets: [
['@babel/preset-env', { corejs: 3, useBuiltIns: 'entry' }],
'react-app'
]
}
}
}
]
}
};
Environment
npx envinfo --preset babel
npx: installed 1 in 1.147s
System:
OS: macOS 10.15.4
Binaries:
Node: 12.16.1 - ~/.nvm/versions/node/v12.16.1/bin/node
Yarn: 1.22.4 - ~/.nvm/versions/node/v12.16.1/bin/yarn
npm: 5.1.0 - ~/workspace/app/node_modules/.bin/npm
npmPackages:
@babel/core: ^7.0.0 => 7.12.10
@babel/preset-env: ^7.12.11 => 7.12.11
babel-loader: 8.2.2 => 8.2.2
babel-preset-react-app: ^10.0.0 => 10.0.0
webpack: ^4.44.2 => 4.44.2
- How you are using Babel: webpack
Possible Solution
Make the comparison ignore module path extension. My application compiles correctly if I alter the condition to exclude the extension. (note hardcoded string slice)
function shouldReplace(source, modules) {
if (!modules) return false;
if (modules.length === 1 && polyfills.has(modules[0]) && available.has(modules[0]) && (0, _utils.getModulePath)(modules[0]).slice(0, -3) === source) {
return false;
}
return true;
}