UNPKG

webpack-chunk-report-plugin

Version:

Webpack Chunk Report Plugin

49 lines (48 loc) 3.37 kB
"use strict"; 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); }; }; }