diff --git a/packages/next/babel.ts b/packages/next/babel.ts index 7297bb80f78a7..7136e99e0141f 100644 --- a/packages/next/babel.ts +++ b/packages/next/babel.ts @@ -3,6 +3,39 @@ */ module.exports = function (api, options) { api.assertVersion(7); + // When running from Jest with babel-jest, remove @babel/plugin-syntax-import-assertions since babel-jest-preset + // comes with @babel/plugin-syntax-import-attributes. These plugins are incompatible. If we don't remove the + // conflicting plugin from `next/babel`, then an error will be thrown. + // e.g. "Cannot combine importAssertions and importAttributes plugins" + // NOTE: We don't want to do this outside of Jest since it may affect `next build`--although the default is SWC anyway. + if (process.env.JEST_WORKER_ID) { + const nextBabel = require('next/babel').default; + const { + presets: nextBabelPresets, + plugins: nextBabelPlugins, + ...rest + } = nextBabel(api, options); + api.assertVersion(7); + + try { + const conflictingPlugin = + require('next/dist/compiled/babel/plugin-syntax-import-assertions').default; + return { + ...rest, + presets: nextBabelPresets, + plugins: [ + ...nextBabelPlugins.filter((p) => p.default !== conflictingPlugin), + [ + require.resolve('@babel/plugin-proposal-decorators'), + { legacy: true }, + ], + ], + }; + } catch { + // If this plugin cannot be import, continue as usual. It could be removed in future versions of Next.js. + } + } + return { presets: [['next/babel', options]], plugins: [