UNPKG

@avensia-oss/ts-transform-glitz-displayname

Version:

A TypeScript custom transformer that adds a displayName to all Glitz components with a VariableStatement.

76 lines (75 loc) 3.7 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultOptions = void 0; exports.default = transformer; var ts = require("typescript"); // Use a factory alias compatible across TS versions (<=3.9 and >=4) var f = (_a = ts.factory) !== null && _a !== void 0 ? _a : ts; exports.defaultOptions = {}; function transformer(program, options) { if (options === void 0) { options = exports.defaultOptions; } options = __assign(__assign({}, exports.defaultOptions), options); if (!program) { throw new Error('No ts.Program was passed to the transformer factory'); } return function (context) { return function (file) { return visitSourceFile(file, program, context, options); }; }; } function visitSourceFile(sourceFile, program, context, options) { var transformedSourceFile = ts.visitEachChild(visitNode(sourceFile, sourceFile, program, context, options), function (childNode) { return visitNodeAndChildren(childNode, sourceFile, program, context, options); }, context); return transformedSourceFile; } function visitNodeAndChildren(node, sourceFile, program, context, options) { var visitedNode = visitNode(node, sourceFile, program, context, options); var visitedChildNode = ts.visitEachChild(visitedNode, function (childNode) { return visitNodeAndChildren(childNode, sourceFile, program, context, options); }, context); return visitedChildNode; } function isVariableDeclaration(node) { return node.kind === ts.SyntaxKind.VariableDeclaration; } function visitNode(node, sourceFile, program, context, options) { if (ts.isVariableStatement(node)) { var decl = node.declarationList.declarations[0]; // Styled HTML component if (decl.initializer && ts.isIdentifier(decl.name) && ts.isCallExpression(decl.initializer) && ts.isPropertyAccessExpression(decl.initializer.expression) && decl.initializer.expression.expression && ts.isIdentifier(decl.initializer.expression.expression) && decl.initializer.expression.expression.escapedText === 'styled') { var variableDeclarationName = decl.name.escapedText.toString(); return [ node, f.createExpressionStatement(f.createBinaryExpression(f.createPropertyAccessExpression(f.createIdentifier(variableDeclarationName), 'displayName'), f.createToken(ts.SyntaxKind.EqualsToken), f.createStringLiteral(variableDeclarationName))), ]; } // Wrapped glitz component if (decl.initializer && ts.isIdentifier(decl.name) && ts.isCallExpression(decl.initializer) && ts.isIdentifier(decl.initializer.expression) && decl.initializer.expression.escapedText === 'styled' && decl.initializer.arguments.length > 0) { var variableDeclarationName = decl.name.escapedText.toString(); return [ node, f.createExpressionStatement(f.createBinaryExpression(f.createPropertyAccessExpression(f.createIdentifier(variableDeclarationName), 'displayName'), f.createToken(ts.SyntaxKind.EqualsToken), f.createStringLiteral(variableDeclarationName))), ]; } } return node; }