diff --git a/packages/babel-plugin-transform-typescript/src/index.js b/packages/babel-plugin-transform-typescript/src/index.js index 149c7f1050..b558447733 100644 --- a/packages/babel-plugin-transform-typescript/src/index.js +++ b/packages/babel-plugin-transform-typescript/src/index.js @@ -137,7 +137,6 @@ export default declare((api, { jsxPragma = "React" }) => { path.remove(); return; } - if (node.abstract) node.abstract = null; }, Class(path) { @@ -146,6 +145,7 @@ export default declare((api, { jsxPragma = "React" }) => { if (node.typeParameters) node.typeParameters = null; if (node.superTypeParameters) node.superTypeParameters = null; if (node.implements) node.implements = null; + if (node.abstract) node.abstract = null; // Similar to the logic in `transform-flow-strip-types`, we need to // handle `TSParameterProperty` and `ClassProperty` here because the diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-method/input.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-method/input.mjs new file mode 100644 index 0000000000..c004b41cd8 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-method/input.mjs @@ -0,0 +1,5 @@ +import { computed } from 'mobx'; + +abstract class Foo { + @computed get id() {} +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-method/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-method/options.json new file mode 100644 index 0000000000..cd0f911709 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-method/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + "transform-typescript", + [ + "proposal-decorators", + { + "legacy": true + } + ] + ] +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-method/output.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-method/output.mjs new file mode 100644 index 0000000000..e3ef6d9da4 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-method/output.mjs @@ -0,0 +1,9 @@ +var _class; + +function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](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['define' + 'Property'](target, property, desc); desc = null; } return desc; } + +import { computed } from 'mobx'; +let Foo = (_class = class Foo { + get id() {} + +}, (_applyDecoratedDescriptor(_class.prototype, "id", [computed], Object.getOwnPropertyDescriptor(_class.prototype, "id"), _class.prototype)), _class); diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-parameter/input.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-parameter/input.mjs new file mode 100644 index 0000000000..d210c98e46 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-parameter/input.mjs @@ -0,0 +1,5 @@ +import { observable } from 'mobx'; + +abstract class Foo { + @observable id = null; +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-parameter/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-parameter/options.json new file mode 100644 index 0000000000..cd0f911709 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-parameter/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + "transform-typescript", + [ + "proposal-decorators", + { + "legacy": true + } + ] + ] +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-parameter/output.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-parameter/output.mjs new file mode 100644 index 0000000000..f595936988 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated-parameter/output.mjs @@ -0,0 +1,17 @@ +var _class, _descriptor; + +function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](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['define' + 'Property'](target, property, desc); desc = null; } return desc; } + +function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and set to use loose mode. ' + 'To use proposal-class-properties in spec mode with decorators, wait for ' + 'the next major version of decorators in stage 2.'); } + +import { observable } from 'mobx'; +let Foo = (_class = class Foo { + id = _initializerWarningHelper(_descriptor, this); +}, (_descriptor = _applyDecoratedDescriptor(_class.prototype, "id", [observable], { + configurable: true, + enumerable: true, + writable: true, + initializer: function () { + return null; + } +})), _class); diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated/input.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated/input.mjs new file mode 100644 index 0000000000..d1c59625af --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated/input.mjs @@ -0,0 +1,4 @@ +import { observer } from 'mobx-react'; + +@observer +abstract class Foo {} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated/options.json new file mode 100644 index 0000000000..cd0f911709 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + "transform-typescript", + [ + "proposal-decorators", + { + "legacy": true + } + ] + ] +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated/output.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated/output.mjs new file mode 100644 index 0000000000..7c0e001398 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/abstract-class-decorated/output.mjs @@ -0,0 +1,5 @@ +var _class; + +import { observer } from 'mobx-react'; + +let Foo = observer(_class = class Foo {}) || _class;