loadable-transformer-ts5
Version:
TypeScript custom transformer for lodable-components SSR
97 lines (96 loc) • 3.96 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadableTransformer = void 0;
var ts = __importStar(require("typescript"));
var chunk_name_1 = __importDefault(require("./properties/chunk-name"));
var require_async_1 = __importDefault(require("./properties/require-async"));
var require_sync_1 = __importDefault(require("./properties/require-sync"));
var is_ready_1 = __importDefault(require("./properties/is-ready"));
var resolve_1 = __importDefault(require("./properties/resolve"));
function isLoadableNode(node) {
if (!ts.isCallExpression(node))
return false;
var identifier = node.expression;
if (!ts.isIdentifier(identifier))
return false;
if (identifier.text !== 'loadable')
return false;
return true;
}
function collectImports(loadableCallExpressionNode, ctx) {
var ret = [];
function visit(node) {
if (node.kind === ts.SyntaxKind.ImportKeyword) {
ret.push(node.parent);
return node;
}
return ts.visitEachChild(node, visit, ctx);
}
ts.visitNodes(loadableCallExpressionNode.arguments, visit);
return ret;
}
function getFuncNode(loadableCallExpressionNode) {
var arg = loadableCallExpressionNode.arguments[0];
if (!arg)
return;
if (!ts.isArrowFunction(arg) && !ts.isFunctionExpression(arg))
return;
return arg;
}
function loadableTransformer(ctx) {
function visitNode(node) {
if (!isLoadableNode(node))
return ts.visitEachChild(node, visitNode, ctx);
var funcNode = getFuncNode(node);
if (!funcNode)
return node;
// Collect dynamic import call expressions such as `import('./foo')`
var imports = collectImports(node, ctx);
// Ignore loadable function that does not have any "import" call
if (imports.length === 0)
return node;
// Multiple imports call is not supported
if (imports.length > 1) {
throw new Error('loadable: multiple import calls inside `loadable()` function are not supported.');
}
var callNode = imports[0];
var obj = ts.factory.createObjectLiteralExpression([
(0, chunk_name_1.default)({ ctx: ctx, callNode: callNode, funcNode: funcNode }),
(0, is_ready_1.default)(ctx),
(0, require_async_1.default)(funcNode),
(0, require_sync_1.default)(ctx),
(0, resolve_1.default)(callNode),
], true);
return ts.factory.updateCallExpression(node, node.expression, undefined, [obj]);
}
return function (source) {
return ts.factory.updateSourceFile(source, ts.visitNodes(source.statements, visitNode));
};
}
exports.loadableTransformer = loadableTransformer;