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

Rasto picture Rasto · Oct 14, 2018 · Viewed 9k times · Source

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?

Answer

ford04 picture ford04 · Nov 29, 2018

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.