loadable-transformer-ts5
Version:
TypeScript custom transformer for lodable-components SSR
128 lines (127 loc) • 5.36 kB
JavaScript
;
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;