diff --git a/packages/babel-plugin-transform-typescript/src/index.js b/packages/babel-plugin-transform-typescript/src/index.js index 95cb76b166ea..915eafb42def 100644 --- a/packages/babel-plugin-transform-typescript/src/index.js +++ b/packages/babel-plugin-transform-typescript/src/index.js @@ -93,6 +93,7 @@ export default declare( if (node.optional) node.optional = null; if (node.typeAnnotation) node.typeAnnotation = null; if (node.definite) node.definite = null; + if (node.declare) node.declare = null; }, method({ node }) { if (node.accessibility) node.accessibility = null; diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/input.ts b/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/input.ts index 7ab37b71fb39..396b74629b04 100644 --- a/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/input.ts +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/input.ts @@ -1,3 +1,4 @@ class A { declare x; -} \ No newline at end of file + @foo declare y: string; +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/options.json index a6d406a50e49..1cc5b964144a 100644 --- a/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/options.json +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/options.json @@ -1,3 +1,6 @@ { - "plugins": [["transform-typescript", { "allowDeclareFields": true }]] + "plugins": [ + ["transform-typescript", { "allowDeclareFields": true }], + ["syntax-decorators", { "legacy": true }] + ] } diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/output.js b/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/output.js index a869c2849526..04c54f970bb2 100644 --- a/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/output.js +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/declare/output.js @@ -1 +1,4 @@ -class A {} +class A { + @foo + y; +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/input.ts b/packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/input.ts new file mode 100644 index 000000000000..5f0bc188e6e8 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/input.ts @@ -0,0 +1,3 @@ +class Foo { + @decorator declare bar: string; +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/options.json new file mode 100644 index 000000000000..8f17a067939d --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + ["transform-typescript", { "allowDeclareFields": true }], + ["proposal-decorators", { "legacy": true }], + ["proposal-class-properties"] + ] +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/output.js b/packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/output.js new file mode 100644 index 000000000000..f0e0fb4d9f64 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/output.js @@ -0,0 +1,21 @@ +var _class, _descriptor, _temp; + +function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +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; } + +function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); } + +let Foo = (_class = (_temp = class Foo { + constructor() { + _initializerDefineProperty(this, "bar", _descriptor, this); + } + +}, _temp), (_descriptor = _applyDecoratedDescriptor(_class.prototype, "bar", [decorator], { + configurable: true, + enumerable: true, + writable: true, + initializer: null +})), _class);