UNPKG

@tscc/tscc

Version:

A typescript transpiler and bundler that wires up tsickle and closure compiler seamlessly

47 lines (46 loc) 2.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const ts = require("typescript"); const ts_helper_transformer_1 = require("./ts_helper_transformer"); function decoratorPropertyTransformer(tsickleHost) { return (context) => { return (sf) => { return new RestHelperTransformer(tsickleHost, context, sf).transformSourceFile(); }; }; } exports.default = decoratorPropertyTransformer; class RestHelperTransformer extends ts_helper_transformer_1.default { constructor() { super(...arguments); this.HELPER_NAME = "__rest"; } /** * Rest helper call signature: * __rest(<target>, [propertiesArray]) */ onHelperCall(node, googReflectImport) { let caller = node.expression; let target = node.arguments[0]; let propertiesArray = node.arguments[1]; // Create new array with goog.reflect.objectProperty // Note that for computed properties, Typescript creates a temp variable // that stores the computed value (_p), and put // ``` // typeof _p === 'symbol' ? _c : _c + "" // ``` const convertedArray = ts.setTextRange(this.factory.createArrayLiteralExpression(propertiesArray.elements.map((propNameLiteral) => { if (!ts.isStringLiteral(propNameLiteral)) return propNameLiteral; const googReflectObjectProperty = ts.setTextRange(this.factory.createCallExpression(this.factory.createPropertyAccessExpression(googReflectImport, this.factory.createIdentifier('objectProperty')), undefined, [ this.factory.createStringLiteral(propNameLiteral.text), ts.getMutableClone(target) ]), propNameLiteral); return googReflectObjectProperty; })), propertiesArray); const restArgs = node.arguments.slice(); restArgs.splice(1, 1, convertedArray); const newCallExpression = this.factory.createCallExpression(caller, undefined, restArgs); return newCallExpression; } }