Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Babel 7 fails with single plugin saying "Duplicate plugin/preset detected."

The plugin that fails is @babel/plugin-transform-regenerator (no marginal plugin, 1.6 milion downloads / week).

This is my entire .babelrc:

{
  "presets": [],
  "plugins": [
    "@babel/plugin-transform-regenerator"
  ]
}

When I try to transpile it with parcel using parcel build source/main/index.html --no-source-maps --out-dir build I get the following error:

/path/to/index.js: Duplicate plugin/preset detected.
If you'd like to use two separate instances of a plugin,
they need separate names, e.g.

plugins: [
  ['some-plugin', {}],
  ['some-plugin', {}, 'some unique name'],
]

at assertNoDuplicates (/.../node_modules/@babel/core/lib/config/config-descriptors.js:205:13)
at createDescriptors (/.../node_modules/@babel/core/lib/config/config-descriptors.js:114:3)
at createPluginDescriptors (/.../node_modules/@babel/core/lib/config/config-descriptors.js:105:10)
at alias (/.../node_modules/@babel/core/lib/config/config-descriptors.js:63:49)
at cachedFunction (/.../node_modules/@babel/core/lib/config/caching.js:33:19)
at plugins.plugins (/.../node_modules/@babel/core/lib/config/config-descriptors.js:28:77)
at mergeChainOpts (/.../node_modules/@babel/core/lib/config/config-chain.js:314:26)
at /.../node_modules/@babel/core/lib/config/config-chain.js:278:7
at buildRootChain (/.../node_modules/@babel/core/lib/config/config-chain.js:68:29)
at loadPrivatePartialConfig (/.../node_modules/@babel/core/lib/config/partial.js:85:55)

Here are my versions from package.json:

"@babel/core": "^7.1.2",
"@babel/plugin-transform-regenerator": "^7.0.0",

Any ideas?

like image 241
Rasto Avatar asked Oct 14 '18 02:10

Rasto


2 Answers

This is a babel error basically saying that you have defined your plugin @babel/plugin-transform-regenerator twice - more or less indirectly.

Parcel Bundler transpiles your code by default with the Babel preset @babel/preset-env. These presets in general are just shareable list of plugins. As you can see here, preset-env already includes "@babel/plugin-transform-regenerator" in Babel 7.

Simple solution: just delete "@babel/plugin-transform-regenerator" from your plugins config in .babelrc.

PS: had a similar experience, after migrating from version 6 to 7. My old config looked like this (valid in Babel 6)

  "plugins": [
    "react-hot-loader/babel", 
    "transform-object-rest-spread", 
    "transform-class-properties", 
    "transform-runtime",
    "transform-async-generator-functions",
    "transform-async-to-generator"
  ],
  "presets": ["env", "react"]

I had to remove plugins transform-object-rest-spread, transform-async-generator-functions and transform-async-to-generator, which - as said - are included in env (here explicitely specified).

Babel offers a fantastic upgrade tool called babel-upgrade (surprise, surprise), that did get the job done well to rename the plugins, but unfortunately it left my alone with these "duplicates".

Hope, that helps.

like image 113
ford04 Avatar answered Oct 19 '22 00:10

ford04


After doing some research, the most likely cause of the error mentioned is that you have one or more default plugins that are also used internally by this plugin.

The easiest way to solve the issue is to do what the error tells you: Add a unique name to the plugin:

"plugins": ["@babel/plugin-transform-regenerator", {}, 'unique-name']

like image 8
icecub Avatar answered Oct 19 '22 01:10

icecub