UNPKG

loadable-ts-transformer

Version:

TypeScript custom transformer for lodable-components SSR

116 lines (115 loc) 4.84 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var vm_1 = __importDefault(require("vm")); var typescript_1 = __importDefault(require("typescript")); var util_1 = require("../util"); var JS_PATH_REGEXP = /^[./]+|(\.js$)/g; var MATCH_LEFT_HYPHENS_REPLACE_REGEX = /^-/g; // https://github.com/webpack/webpack/blob/master/lib/Template.js var WEBPACK_CHUNK_NAME_REGEXP = /webpackChunkName/; var WEBPACK_PATH_NAME_NORMALIZE_REPLACE_REGEX = /[^a-zA-Z0-9_!§$()=\-^°]+/g; var WEBPACK_MATCH_PADDED_HYPHENS_REPLACE_REGEX = /^-|-$/g; function readWebpackCommentValues(str) { try { var values = vm_1.default.runInNewContext("(function(){return {" + str + "};})()"); return values; } catch (e) { throw Error("compilation error while processing: /*" + str + "*/: " + e.message); } } function writeWebpackCommentValues(values) { try { var str = Object.keys(values) .map(function (key) { return key + ": " + JSON.stringify(values[key]); }) .join(', '); return " " + str + " "; } catch (e) { throw Error("compilation error while processing: /*" + values + "*/: " + e.message); } } function getChunkNameComment(importArg) { var comments = util_1.getLeadingComments(importArg); if (!comments.length) return null; return comments.find(function (comment) { return WEBPACK_CHUNK_NAME_REGEXP.test(comment); }); } function getRawChunkNameFromCommments(importArg) { var chunkNameComment = getChunkNameComment(importArg); if (!chunkNameComment) return null; return readWebpackCommentValues(chunkNameComment); } function moduleToChunk(str) { if (typeof str !== 'string') return ''; return str .replace(JS_PATH_REGEXP, '') .replace(WEBPACK_PATH_NAME_NORMALIZE_REPLACE_REGEX, '-') .replace(WEBPACK_MATCH_PADDED_HYPHENS_REPLACE_REGEX, ''); } function generateChunkNameNode(callPath) { var importArg = util_1.getImportArg(callPath); if (typescript_1.default.isTemplateExpression(importArg)) { throw new Error('not implementd'); // return t.templateLiteral( // importArg.node.quasis.map((quasi, index) => // transformQuasi( // quasi, // index === 0, // importArg.node.quasis.length === 1, // ), // ), // importArg.node.expressions, // ) } else if (typescript_1.default.isStringLiteral(importArg) || typescript_1.default.isNoSubstitutionTemplateLiteral(importArg)) { return typescript_1.default.createStringLiteral(moduleToChunk(importArg.text)); } return importArg; } function getExistingChunkNameComment(callNode) { var importArg = util_1.getImportArg(callNode); var values = getRawChunkNameFromCommments(importArg); return values; } function isAgressiveImport(callNode) { var importArg = util_1.getImportArg(callNode); return typescript_1.default.isTemplateExpression(importArg) && importArg.templateSpans.length > 0; } function addOrReplaceChunkNameComment(callNode, ctx, values) { var importArg = util_1.getImportArg(callNode); util_1.removeMatchingLeadingComments(importArg, ctx, WEBPACK_CHUNK_NAME_REGEXP); typescript_1.default.addSyntheticLeadingComment(importArg, typescript_1.default.SyntaxKind.MultiLineCommentTrivia, writeWebpackCommentValues(values), false); } function replaceChunkName(_a) { var callNode = _a.callNode, ctx = _a.ctx; var agressiveImport = isAgressiveImport(callNode); var values = getExistingChunkNameComment(callNode); if (!agressiveImport && values) { addOrReplaceChunkNameComment(callNode, ctx, values); return typescript_1.default.createStringLiteral(values.webpackChunkName); } var chunkNameNode = generateChunkNameNode(callNode); var webpackChunkName; // if (t.isTemplateLiteral(chunkNameNode)) { // webpackChunkName = chunkNameFromTemplateLiteral(chunkNameNode) // chunkNameNode = sanitizeChunkNameTemplateLiteral(chunkNameNode) // } else { if (typescript_1.default.isStringLiteral(chunkNameNode) || typescript_1.default.isNoSubstitutionTemplateLiteral(chunkNameNode)) { webpackChunkName = chunkNameNode.text; } else { webpackChunkName = ''; } addOrReplaceChunkNameComment(callNode, ctx, { webpackChunkName: webpackChunkName }); return chunkNameNode; } function chunkNameProperty(options) { return util_1.createObjectMethod('chunkName', [], typescript_1.default.createBlock([typescript_1.default.createReturn(replaceChunkName(options))], true)); } exports.default = chunkNameProperty;