From 854313a759b26f615d1d1715e131ec2c4b0309b1 Mon Sep 17 00:00:00 2001 From: Yuri Karadzhov Date: Fri, 25 Jan 2019 00:07:56 +0100 Subject: [PATCH] Correctly visit param decorators to prevent their imports being removed in typescript transform (#8738) * Remove types on program exit in typescript transform * Revert changes to typescript transform * Correctly add visitors for param decorators * Fix plugin for node 6 --- .../imports/parameter-decorators/input.mjs | 6 +++ .../imports/parameter-decorators/options.json | 12 +++++ .../imports/parameter-decorators/output.mjs | 9 ++++ .../imports/parameter-decorators/plugin.js | 54 +++++++++++++++++++ packages/babel-types/src/definitions/core.js | 2 +- .../babel-types/src/definitions/es2015.js | 8 ++- 6 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/input.mjs create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/options.json create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/output.mjs create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/plugin.js diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/input.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/input.mjs new file mode 100644 index 0000000000..8f6ad6135d --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/input.mjs @@ -0,0 +1,6 @@ +import { NgModule, Optional, SkipSelf } from '@angular/core'; + +@NgModule({}) +export class CoreModule { + constructor(@Optional() @SkipSelf() parentModule) { } +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/options.json new file mode 100644 index 0000000000..dcdc6eed36 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/options.json @@ -0,0 +1,12 @@ +{ + "plugins": [ + "transform-typescript", + [ + "proposal-decorators", + { + "legacy": true + } + ], + "./plugin" + ] +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/output.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/output.mjs new file mode 100644 index 0000000000..24111bc8df --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/output.mjs @@ -0,0 +1,9 @@ +var _dec, _class; + +import { NgModule, Optional, SkipSelf } from '@angular/core'; +export let CoreModule = (_dec = NgModule({}), _dec(_class = class CoreModule { + constructor(_parentModule) { + var _parentModule2 = Optional()(SkipSelf()(_parentModule)); + } + +}) || _class); diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/plugin.js b/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/plugin.js new file mode 100644 index 0000000000..a066043915 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/parameter-decorators/plugin.js @@ -0,0 +1,54 @@ +"use strict"; +// https://github.com/benderTheCrime/babel-plugin-transform-function-parameter-decorators/ + +Object.defineProperty(exports, "__esModule", { + value: true, +}); + +exports.default = function(_ref) { + var types = _ref.types; + + return { + visitor: { + Function: function parseFunctionPath(path) { + (path.get("params") || []) + .slice() + .reverse() + .forEach(function(param) { + var name = param.node.name; + var paramUidName = path.scope.generateUidIdentifier(name).name; + var resultantDecorator = void 0; + + (param.node.decorators || []) + .slice() + .reverse() + .forEach(function(decorator) { + resultantDecorator = types.callExpression( + decorator.expression, + [resultantDecorator || types.Identifier(paramUidName)] + ); + }); + + if (resultantDecorator) { + var decoratedParamUidName = path.scope.generateUidIdentifier(name) + .name; + + path.scope.rename(name, decoratedParamUidName); + param.parentPath + .get("body") + .unshiftContainer( + "body", + types.variableDeclaration("var", [ + types.variableDeclarator( + types.Identifier(decoratedParamUidName), + resultantDecorator + ), + ]) + ); + param.replaceWith(types.Identifier(paramUidName)); + } + }); + }, + }, + }; +}; diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js index d6a5630b36..671e896144 100644 --- a/packages/babel-types/src/definitions/core.js +++ b/packages/babel-types/src/definitions/core.js @@ -388,7 +388,7 @@ export const patternLikeCommon = { defineType("Identifier", { builder: ["name"], - visitor: ["typeAnnotation"], + visitor: ["typeAnnotation", "decorators" /* for legacy param decorators */], aliases: ["Expression", "PatternLike", "LVal", "TSEntityName"], fields: { ...patternLikeCommon, diff --git a/packages/babel-types/src/definitions/es2015.js b/packages/babel-types/src/definitions/es2015.js index 182dee469d..f9766935cd 100644 --- a/packages/babel-types/src/definitions/es2015.js +++ b/packages/babel-types/src/definitions/es2015.js @@ -13,7 +13,7 @@ import { } from "./core"; defineType("AssignmentPattern", { - visitor: ["left", "right"], + visitor: ["left", "right", "decorators" /* for legacy param decorators */], builder: ["left", "right"], aliases: ["Pattern", "PatternLike", "LVal"], fields: { @@ -472,7 +472,11 @@ defineType("ClassMethod", { }); defineType("ObjectPattern", { - visitor: ["properties", "typeAnnotation"], + visitor: [ + "properties", + "typeAnnotation", + "decorators" /* for legacy param decorators */, + ], builder: ["properties"], aliases: ["Pattern", "PatternLike", "LVal"], fields: {