How to list what transforms #babel/preset-env includes? - babeljs

I like how I can use http://browserl.ist/ to see what browsers the targets query will target in #babel/preset-env.
Is there any similar tools to list what Babel plugins (transforms etc.) the env preset actually includes?
I'm using Webpack as my bundler if it matters.

try add debug:true in #babel/preset-env options, it will list all plugin in use
{
"presets": [
[
"#babel/preset-env",
{
"debug": true,
"targets": {
"chrome": 49,
"firefox": 64,
"safari": 9,
"edge": 13,
"ios": 9
}
}
]
]
}

You can always check out the source for #babel/preset-env, namely the available-plugins.js file lists the available plugins in the preset.

It's just a simple config in your .babelrc or babel.config.js file.
"#babel/preset-env",
{
useBuiltIns: "usage",
debug: true, // this will make babel output actual transform plugins and polyfills in terminal
targets: {
chrome: "53",
},
corejs: 3,
},
But this will not work when you use webpack

As pointed out by #rabidpug, available-plugins.js lists all plugins.
However, which ones are being used depend on your config.
E.g.:
The shippedProposals config option is false by default. As per index.js, this already eliminates all files as listed in data/shipped-proposals.js.
Similarly, the recently added bugfixes option adds more plugins (until babel#8 comes along), listed in #babel/compat-data/plugin-bugfixes.
Solution
Luckily, preset-env has a debug option that just prints out all plugins used when the preset is invoked.
Just add debug to your preset-env options and it will list all plugins (and more).
For convinience, I wrote this little script that independently debugs your plugins list (given a custom set of preset-env options). Run it using node list-preset-env-plugins.js in a folder where you have babel installed:
// list-preset-env-plugins.js
const babelCore = require('#babel/core');
const presetEnv = require('#babel/preset-env').default;
/**
* Your preset-env options.
* #see https://babeljs.io/docs/en/babel-preset-env#options
*/
const presetEnvOptions = {
shippedProposals: true,
debug: true
};
/**
* #see https://github.com/babel/babel/blob/master/packages/babel-helper-plugin-utils/src/index.js
*/
const apiStub = {
version: babelCore.version,
assertVersion() { }
};
// invoke the preset
presetEnv(apiStub, presetEnvOptions);

Related

How to pass options to babel plugin transform-modules-commonjs?

I create a Vue 2 project by Vue-Cli 5, then I want to remove "use strick" in the complied code.
As I Know, the #babel/plugin-transform-strick-mode may be enabled via #babel/plugin-transform-modules-commonjs, and the plugin is included in #babel/preset-env under the modules option.
But the Vue-Cli used a preset #vue/babel-preset-app by a plugin #vue/cli-plugin-babel for babel.
So my question is How pass strictMode: false as an option to the transform-modules-commonjs by #vue/babel-preset-app which preset is in the #vue/cli-plugin-babel ?
module.exports = {
presets: [["#vue/cli-plugin-babel/preset", { modules: "auto" }]],
plugins: [
// I tried this way, but it throw many errors like:
/**
ERROR in ./node_modules/axios/dist/node/axios.cjs 11:15-32
Module not found: Error: Can't resolve 'stream' in 'D:\workspace\cqset_offical_website\node_modules\axios\dist\node'
BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.
If you want to include a polyfill, you need to:
- add a fallback 'resolve.fallback: { "stream": require.resolve("stream-browserify") }'
- install 'stream-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
resolve.fallback: { "stream": false }
*/
["#babel/plugin-transform-modules-commonjs", {}],
[
"component",
{
libraryName: "element-ui",
styleLibraryName: "theme-chalk",
},
],
],
};

Babel giving Plugin/Preset did not return an object after adding #babel/helper-annotate-as-pure

I've recently added #babel/helper-annotate-as-pure to my list of babel plugins:
require('babel-plugin-macros'),
require('#babel/helper-annotate-as-pure').default,
require('babel-plugin-dev-expression'),
[
require('#babel/plugin-proposal-class-properties').default,
{
loose: true,
},
],
[require('#babel/plugin-proposal-decorators').default, { legacy: true }],
require('#babel/plugin-proposal-numeric-separator').default,
[
require('#babel/plugin-transform-runtime').default,
{
corejs: false,
helpers: true,
version: require('#babel/runtime/package.json').version,
regenerator: true,
useESModules: moduleFormat === 'esm',
} as RuntimeOptions,
],
require('#babel/plugin-syntax-dynamic-import').default,
require('#babel/plugin-proposal-optional-chaining').default,
require('#babel/plugin-proposal-nullish-coalescing-operator').default,
isDevelopment && require.resolve('react-refresh/babel'),
I previously used 'babel-plugin-annotate-pure-calls' but after adding the plugin I continually get the same error at different points:
Plugin/Preset did not return an object
If I comment out the plugin, everything works
#babel/helper-annotate-as-pure is a helper utility module that is part of Babel itself, it is not a plugin, so it cannot be used in the plugins array. All plugins in the #babel namespace start with plugin- in their name.
You'd have to see if babel-plugin-annotate-pure-calls, the original plugin you used, works properly.

how to clear babel cache?

I am seeing my eslint rules applied in VSCode however they are not working in Babel.
I believe that I need to clear the cache, but I don't know how to do it.
Could you tell me how to do this?
rules
"#typescript-eslint/camelcase": ["warn"],
"camelcase": "off"
Babel output
vscode output
If you are using a babel.config.js file which looks like below. You can turn off the cache by passing false to api.cache(false)
module.exports = function (api) {
const presets = [
[
'#babel/preset-env',
{
useBuiltIns: 'usage',
corejs: { version: 3, proposals: true }
}
],
'#babel/preset-react',
'#babel/preset-flow'
];
const plugins = [
'lodash',
['#babel/plugin-transform-spread', { loose: true }],
['#babel/plugin-proposal-class-properties', { loose: true }],
'#babel/plugin-transform-runtime'
];
/** this is just for minimal working purposes,
* for testing larger applications it is
* advisable to cache the transpiled modules in
* node_modules/.bin/.cache/#babel/register* */
api.cache(false);
return {
presets,
plugins
};
};
You should delete .babel_cache folder that's create parallel to your output folder.

Babel polyfill includes all polyfills no matter which targets are set

I am using Babel 7.1 together with rollup (v0.67). This is my rollup config:
{
input: 'src/svg.js',
output: {
file: 'dist/myBundle.js',
name: 'myBundle',
sourceMap: true,
format: 'iife'
},
plugins: [
resolve({browser: true}),
commonjs(),
babel({
include: 'src/**',
runtimeHelpers: true,
babelrc: false,
presets: [["#babel/preset-env", {
modules: false,
targets: {
firefox: "63"
},
useBuiltIns: "usage"
}]],
plugins: [["#babel/plugin-transform-runtime", {
corejs: false,
helpers: true,
regenerator: true,
useESModules: true
}]]
})
]
}
I want to polyfill older browsers. According to the docs, I need to include babel-polyfill in my entry point which I did. Now babel should include only the polyfills needed (because of useBuiltIns: "usage"). However, even when specifying the newest Browsers as target, I get the full load of code into my bundle (10000 lines of code).
What I tried:
I tried useBuiltIns: "entry" which fixes it for newer browsers but its not what I want (it just includes all polyfills which are potentially needed by the browser no matter if they are actually used in the code).
change the order of the rollup plugins
not include the babel-polyfill import
I have no idea why this is happening. It would be great if someone could solve this issue. Its driving me crazy!
And if someone knows as a bonus why no sourcemap is generated I dont mind getting an answer for that, too
Hey I made a repo which explores a good babel/rollup setup utilising preset-env and useBuiltIns 'usage'.
// Rollup plugins
import babel from 'rollup-plugin-babel';
import commonjs from 'rollup-plugin-commonjs';
import resolve from 'rollup-plugin-node-resolve';
export default {
input : 'main.js',
output : {
file : 'app.js',
format : 'iife',
name : 'PROJECT'
},
plugins : [
resolve(),
babel({
exclude : 'node_modules/**',
presets : [[
'#babel/env', {
useBuiltIns : 'usage'
}
]],
plugins : [
'#babel/plugin-transform-runtime'
],
runtimeHelpers : true
}),
commonjs()
]
};
Take a look https://github.com/matt3224/rollup-babel7
If you can figure out how to reduce the output further submit a PR

Is there a way to use loose modules when using es2015 preset in babel 6?

I tried to use following babelrcs:
{
"presets": [
["es2015", { "transform-es2015-modules-commonjs": { "loose": true } }]
]
}
fails with "Invalid options type for foreign"
{
"presets": ["es2015"],
"plugins": [
["transform-es2015-modules-commonjs", { "loose": true }]
]
}
ignores the "loose" option
{
"plugins": [
["transform-es2015-modules-commonjs", { "loose": true }]
]
}
does not use the preset
By enabling es2015, you are asking for non-loose-mode modules. If you want loose module modes in Babel v6 (at least at the moment), you would need to explicitly list the plugins you wish to use by listing everything that is part of es2015.
I ended up creating a preset es2015-mod for this same purpose - an exact copy of Babel's es2015 with loose modules enabled.
babel-preset-es2015-loose package has been deprecated. With babel-preset-es2015 v6.13.0+, you can now configure your .babelrc like so:
{ presets: [ ["es2015", {"loose": true}] ] }
For me it was an old babel-core version. You need at least 6.13+
NEW: Using es2015-loose preset
es2015-loose is a preset that uses modify-babel-preset to modify es2015 preset and enable loose mode where available.
Use it like that:
{
"presets": ["es2015-loose"]
}
Make sure to install both es2015 and es2015-loose packages:
$ npm install --save-dev babel-preset-es2015-loose babel-preset-es2015
PS: There are other loose presets for example if you target node versions >= 4 you can use es2015-node4-loose preset.