UNPKG

loadable-transformer-ts5

Version:
128 lines (127 loc) 5.36 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) { var values; try { values = vm_1.default.runInNewContext("(function(){return {".concat(str, "};})()")); } catch (e) { if (!(e instanceof Error)) { throw Error("compilation error while processing: /*".concat(str, "*/: ").concat(new Error(e).message)); } throw Error("compilation error while processing: /*".concat(str, "*/: ").concat(e.message)); } finally { return values; } } function writeWebpackCommentValues(values) { var str = ''; try { str = Object.keys(values) .map(function (key) { return "".concat(key, ": ").concat(JSON.stringify(values[key])); }) .join(', '); } catch (e) { if (!(e instanceof Error)) { throw Error("compilation error while processing: /*".concat(values, "*/: ").concat(new Error(e).message)); } throw Error("compilation error while processing: /*".concat(values, "*/: ").concat(e.message)); } finally { return " ".concat(str, " "); } } function getChunkNameComment(importArg) { var comments = (0, 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 = (0, 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.factory.createStringLiteral(moduleToChunk(importArg.text)); } return importArg; } function getExistingChunkNameComment(callNode) { var importArg = (0, util_1.getImportArg)(callNode); var values = getRawChunkNameFromCommments(importArg); return values; } function isAgressiveImport(callNode) { var importArg = (0, util_1.getImportArg)(callNode); return typescript_1.default.isTemplateExpression(importArg) && importArg.templateSpans.length > 0; } function addOrReplaceChunkNameComment(callNode, ctx, values) { var importArg = (0, util_1.getImportArg)(callNode); (0, 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.factory.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 (0, util_1.createObjectMethod)('chunkName', [], typescript_1.default.factory.createBlock([typescript_1.default.factory.createReturnStatement(replaceChunkName(options))], true)); } exports.default = chunkNameProperty;