diff --git a/packages/babel-plugin-transform-spread/src/index.js b/packages/babel-plugin-transform-spread/src/index.js index dcd933a1fa7e..3bacc1f677fc 100644 --- a/packages/babel-plugin-transform-spread/src/index.js +++ b/packages/babel-plugin-transform-spread/src/index.js @@ -97,7 +97,13 @@ export default declare((api, options) => { const calleePath = skipTransparentExprWrappers(path.get("callee")); - if (calleePath.isSuper()) return; + if (calleePath.isSuper()) { + // NOTE: spread and classes have almost the same compat data, so this is very unlikely to happen in practice. + throw path.buildCodeFrameError( + "It's not possible to compile spread arguments in `super()` without compiling classes.\n" + + "Please add '@babel/plugin-transform-classes' to your Babel configuration.", + ); + } let contextLiteral = scope.buildUndefinedNode(); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/input.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/input.js new file mode 100644 index 000000000000..d68270209a6b --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/input.js @@ -0,0 +1,5 @@ +class A extends B { + constructor() { + super(...foo); + } +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/options.json b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/options.json new file mode 100644 index 000000000000..1271efa2901b --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "transform-spread", + "transform-classes" + ] +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/output.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/output.js new file mode 100644 index 000000000000..8b058b76862a --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/output.js @@ -0,0 +1,14 @@ +let A = /*#__PURE__*/function (_B) { + "use strict"; + + babelHelpers.inherits(A, _B); + + var _super = babelHelpers.createSuper(A); + + function A() { + babelHelpers.classCallCheck(this, A); + return _super.call.apply(_super, [this].concat(babelHelpers.toConsumableArray(foo))); + } + + return A; +}(B); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/input.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/input.js new file mode 100644 index 000000000000..d68270209a6b --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/input.js @@ -0,0 +1,5 @@ +class A extends B { + constructor() { + super(...foo); + } +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/options.json b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/options.json new file mode 100644 index 000000000000..b99834520858 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "transform-classes", + "transform-spread" + ] +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/output.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/output.js new file mode 100644 index 000000000000..8b058b76862a --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/output.js @@ -0,0 +1,14 @@ +let A = /*#__PURE__*/function (_B) { + "use strict"; + + babelHelpers.inherits(A, _B); + + var _super = babelHelpers.createSuper(A); + + function A() { + babelHelpers.classCallCheck(this, A); + return _super.call.apply(_super, [this].concat(babelHelpers.toConsumableArray(foo))); + } + + return A; +}(B); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/input.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/input.js new file mode 100644 index 000000000000..d68270209a6b --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/input.js @@ -0,0 +1,5 @@ +class A extends B { + constructor() { + super(...foo); + } +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/options.json b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/options.json new file mode 100644 index 000000000000..9286e543ef3a --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "transform-spread" + ], + "throws": "It's not possible to compile spread arguments in `super()` without compiling classes." +}