webpack-chunk-report-plugin
Version:
Webpack Chunk Report Plugin
49 lines (48 loc) • 3.37 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformReactComponentSource = transformReactComponentSource;
const typescript_1 = __importDefault(require("typescript"));
const path_1 = __importDefault(require("path"));
const constants_1 = require("./constants");
function transformReactComponentSource() {
return (context) => {
const visitor = (node) => {
if (typescript_1.default.isJsxSelfClosingElement(node) || typescript_1.default.isJsxOpeningElement(node)) {
const tagName = node.tagName.getText();
// Only apply to PascalCase components
if (/^[a-z]/.test(tagName))
return node;
const attributes = node.attributes.properties;
const alreadyHasSource = attributes.some(attr => typescript_1.default.isJsxAttribute(attr) &&
"text" in attr.name &&
attr.name.text === constants_1.METADATA_KEY);
if (alreadyHasSource)
return node;
const sourceFile = node.getSourceFile();
const { line, character } = typescript_1.default.getLineAndCharacterOfPosition(sourceFile, node.getStart());
const fileName = path_1.default.relative(process.cwd(), sourceFile.fileName);
const sourceProp = typescript_1.default.factory.createJsxAttribute(typescript_1.default.factory.createIdentifier(constants_1.METADATA_KEY), typescript_1.default.factory.createJsxExpression(undefined, typescript_1.default.factory.createObjectLiteralExpression([
typescript_1.default.factory.createPropertyAssignment(typescript_1.default.factory.createIdentifier("fileName"), typescript_1.default.factory.createStringLiteral(fileName)),
typescript_1.default.factory.createPropertyAssignment(typescript_1.default.factory.createIdentifier("lineNumber"), typescript_1.default.factory.createNumericLiteral((line + 1).toString())),
typescript_1.default.factory.createPropertyAssignment(typescript_1.default.factory.createIdentifier("columnNumber"), typescript_1.default.factory.createNumericLiteral((character + 1).toString())),
typescript_1.default.factory.createPropertyAssignment(typescript_1.default.factory.createIdentifier("componentName"), typescript_1.default.factory.createStringLiteral(tagName)),
])));
const newAttributes = typescript_1.default.factory.createJsxAttributes([
...attributes,
sourceProp,
]);
if (typescript_1.default.isJsxSelfClosingElement(node)) {
return typescript_1.default.factory.updateJsxSelfClosingElement(node, node.tagName, node.typeArguments, newAttributes);
}
return typescript_1.default.factory.updateJsxOpeningElement(node, node.tagName, node.typeArguments, newAttributes);
}
return typescript_1.default.visitEachChild(node, visitor, context);
};
return (sourceFile) => {
return typescript_1.default.visitNode(sourceFile, visitor);
};
};
}