From aa82ab6358a5026ff70a08b683e05166a5941e1d Mon Sep 17 00:00:00 2001 From: "James C. Davis" Date: Thu, 30 Jul 2020 14:06:45 -0400 Subject: [PATCH] Typescript: always strip declare from class fields (#11747) * test: add failing test for decorated declare * fix: always strip declare from class fields * test: add decorated-declare-properties test --- .../src/index.js | 1 + .../test/fixtures/class/declare/input.ts | 3 ++- .../test/fixtures/class/declare/options.json | 5 ++++- .../test/fixtures/class/declare/output.js | 5 ++++- .../decorated-declare-properties/input.ts | 3 +++ .../decorated-declare-properties/options.json | 7 +++++++ .../decorated-declare-properties/output.js | 21 +++++++++++++++++++ 7 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/input.ts create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/options.json create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/class/decorated-declare-properties/output.js diff --git a/packages/babel-plugin-transform-typescript/src/index.js b/packages/babel-plugin-transform-typescript/src/index.js index 4aa2fcaa7a..bc2dab189a 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 7ab37b71fb..396b74629b 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 a6d406a50e..1cc5b96414 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 a869c28495..04c54f970b 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 0000000000..5f0bc188e6 --- /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 0000000000..8f17a06793 --- /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 0000000000..f0e0fb4d9f --- /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);