@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
JavaScript
;
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;
}