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;
}
Activity
babel-bot commentedon Dec 22, 2020
Hey @ertrzyiks! We really appreciate you taking the time to report an issue. The collaborators on this project attempt to help as many people as possible, but we're a limited number of volunteers, so it's possible this won't be addressed swiftly.
If you need any help, or just have general Babel or JavaScript questions, we have a vibrant Slack community that typically always has someone willing to help. You can sign-up here for an invite."
nicolo-ribaudo commentedon Dec 22, 2020
We could use this to handle both the cases:
I'm marking this as a good first issue since it shouldn't be too hard to fix it, but it gives the opportunity to setup the repo and learn how our tests work, and fixing it has a good impact since currently the whole
useBuiltIns: "entry"
feature is probably broken.If it is the first time that you contribute to Babel, follow these steps: (you need to have
make
andyarn
available on your machine)git clone https://github.com/<YOUR_USERNAME>/babel.git && cd babel
make bootstrap
to install deps and setup the monorepomake watch
(ormake build
whenever you change a file)input.js
/input.mjs
;output.js
will be automatically generated)yarn jest preset-env
to run the testsoutput.js
files and run the tests againOVERWRITE=true yarn jest preset-env
and they will be automatically updated.make test
to run all the testsgit push
and open a PR!ertrzyiks commentedon Dec 22, 2020
Thanks @nicolo-ribaudo , I can work on a PR tomorrow morning
nicolo-ribaudo commentedon Dec 22, 2020
Thanks! 🧡
ertrzyiks commentedon Dec 23, 2020
I narrowed it down even further. In the demo I show it breaks when used with
react-app
preset. The minimum breaking setup is the following:so we have two different versions of the preset applied.
I'm not sure how to write a good regression test for this case.
ertrzyiks commentedon Dec 23, 2020
I've submitted a PR with just the code change. I tried to write a regression test but it works properly when only one version of the preset is used. I'm open for suggestions on how to approach it. If you think it makes sense to add a specific version of the preset to the dependencies and have a test anyway, I can try to make it happen.
Also, that change broke some other scenarios, so I'm not sure if I'm looking at the correct place. Need more digging.
Edit: I think the breaking scenarios are valid without the extension, so 👌
ghost commentedon Feb 15, 2021
Why does it always happen to me that it doesn't let me convert to ES6 nor with
.babelrc
apparently well configured? I don’t know that it can do it because I’ve seen how others have done it.8 remaining items