loadable-ts-transformer
Version:
TypeScript custom transformer for lodable-components SSR
116 lines (115 loc) • 4.84 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) {
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;