From 8d938afdd52d603e75341747a7b49e02c7fc8af1 Mon Sep 17 00:00:00 2001 From: Thiago Arrais Date: Mon, 5 Aug 2019 13:32:29 -0300 Subject: [PATCH 1/2] Decorators legacy: register inserted declaration For compatibility with the Typescript plugin Fixes #10264 --- .../src/transformer-legacy.js | 9 ++++++--- .../class-decorators/output.mjs | 4 ++-- .../method-decorators/output.mjs | 8 ++++---- .../test/fixtures/legacy-regression/10264/input.mjs | 4 ++++ .../test/fixtures/legacy-regression/10264/options.json | 6 ++++++ .../test/fixtures/legacy-regression/10264/output.mjs | 7 +++++++ 6 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/input.mjs create mode 100644 packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/options.json create mode 100644 packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/output.mjs diff --git a/packages/babel-plugin-proposal-decorators/src/transformer-legacy.js b/packages/babel-plugin-proposal-decorators/src/transformer-legacy.js index 0eb0ebdbd87a..9748dfedec1b 100644 --- a/packages/babel-plugin-proposal-decorators/src/transformer-legacy.js +++ b/packages/babel-plugin-proposal-decorators/src/transformer-legacy.js @@ -237,15 +237,18 @@ export default { const replacement = decoratedClassToExpression(decl); if (replacement) { - path.replaceWithMultiple([ - replacement, + path.replaceWith(replacement); + path.insertAfter( t.exportNamedDeclaration(null, [ t.exportSpecifier( t.cloneNode(replacement.declarations[0].id), t.identifier("default"), ), ]), - ]); + ); + if (!decl.node.id) { + path.scope.registerDeclaration(path.get("declarations.0")); + } } }, ClassDeclaration(path) { diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/class-decorators/output.mjs b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/class-decorators/output.mjs index 66908980096c..b69c4b68231a 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/class-decorators/output.mjs +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/class-decorators/output.mjs @@ -1,7 +1,7 @@ var _class, _class2; -let A = dec(_class2 = class A {}) || _class2; +let A = dec(_class = class A {}) || _class; export { A as default }; -let B = dec(_class = class B {}) || _class; +let B = dec(_class2 = class B {}) || _class2; diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs index 4db262f67a2a..1318198d342e 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs @@ -2,12 +2,12 @@ var _class, _class2; function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } -let A = (_class2 = class A { +let A = (_class = class A { foo() {} -}, (_applyDecoratedDescriptor(_class2.prototype, "foo", [dec], Object.getOwnPropertyDescriptor(_class2.prototype, "foo"), _class2.prototype)), _class2); +}, (_applyDecoratedDescriptor(_class.prototype, "foo", [dec], Object.getOwnPropertyDescriptor(_class.prototype, "foo"), _class.prototype)), _class); export { A as default }; -let B = (_class = class B { +let B = (_class2 = class B { foo() {} -}, (_applyDecoratedDescriptor(_class.prototype, "foo", [dec], Object.getOwnPropertyDescriptor(_class.prototype, "foo"), _class.prototype)), _class); +}, (_applyDecoratedDescriptor(_class2.prototype, "foo", [dec], Object.getOwnPropertyDescriptor(_class2.prototype, "foo"), _class2.prototype)), _class2); diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/input.mjs b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/input.mjs new file mode 100644 index 000000000000..90ba5e106f57 --- /dev/null +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/input.mjs @@ -0,0 +1,4 @@ +function myDecorator(decoratee) {} + +@myDecorator +export default class {} diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/options.json b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/options.json new file mode 100644 index 000000000000..51aa897d2c31 --- /dev/null +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "transform-typescript", + [ "proposal-decorators", { "legacy": true } ] + ] +} diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/output.mjs b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/output.mjs new file mode 100644 index 000000000000..5e99551db44a --- /dev/null +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/10264/output.mjs @@ -0,0 +1,7 @@ +var _class2; + +function myDecorator(decoratee) {} + +let _class = myDecorator(_class2 = class {}) || _class2; + +export { _class as default }; From 1a770d7d1a90a2195814d6424b8d74558a7ca35a Mon Sep 17 00:00:00 2001 From: Thiago Arrais Date: Wed, 7 Aug 2019 13:13:11 -0300 Subject: [PATCH 2/2] Register declaration but also keep replaceWithMultiple --- .../src/transformer-legacy.js | 9 +++++---- .../class-decorators/output.mjs | 4 ++-- .../method-decorators/output.mjs | 8 ++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/babel-plugin-proposal-decorators/src/transformer-legacy.js b/packages/babel-plugin-proposal-decorators/src/transformer-legacy.js index 9748dfedec1b..53cfe47df91d 100644 --- a/packages/babel-plugin-proposal-decorators/src/transformer-legacy.js +++ b/packages/babel-plugin-proposal-decorators/src/transformer-legacy.js @@ -237,17 +237,18 @@ export default { const replacement = decoratedClassToExpression(decl); if (replacement) { - path.replaceWith(replacement); - path.insertAfter( + const [varDeclPath] = path.replaceWithMultiple([ + replacement, t.exportNamedDeclaration(null, [ t.exportSpecifier( t.cloneNode(replacement.declarations[0].id), t.identifier("default"), ), ]), - ); + ]); + if (!decl.node.id) { - path.scope.registerDeclaration(path.get("declarations.0")); + path.scope.registerDeclaration(varDeclPath); } } }, diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/class-decorators/output.mjs b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/class-decorators/output.mjs index b69c4b68231a..66908980096c 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/class-decorators/output.mjs +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/class-decorators/output.mjs @@ -1,7 +1,7 @@ var _class, _class2; -let A = dec(_class = class A {}) || _class; +let A = dec(_class2 = class A {}) || _class2; export { A as default }; -let B = dec(_class2 = class B {}) || _class2; +let B = dec(_class = class B {}) || _class; diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs index 1318198d342e..4db262f67a2a 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs @@ -2,12 +2,12 @@ var _class, _class2; function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } -let A = (_class = class A { +let A = (_class2 = class A { foo() {} -}, (_applyDecoratedDescriptor(_class.prototype, "foo", [dec], Object.getOwnPropertyDescriptor(_class.prototype, "foo"), _class.prototype)), _class); +}, (_applyDecoratedDescriptor(_class2.prototype, "foo", [dec], Object.getOwnPropertyDescriptor(_class2.prototype, "foo"), _class2.prototype)), _class2); export { A as default }; -let B = (_class2 = class B { +let B = (_class = class B { foo() {} -}, (_applyDecoratedDescriptor(_class2.prototype, "foo", [dec], Object.getOwnPropertyDescriptor(_class2.prototype, "foo"), _class2.prototype)), _class2); +}, (_applyDecoratedDescriptor(_class.prototype, "foo", [dec], Object.getOwnPropertyDescriptor(_class.prototype, "foo"), _class.prototype)), _class);