reboost
Version:
A super fast dev server for rapid web development
135 lines (134 loc) • 7.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveImports = exports.resolveDependency = void 0;
const tslib_1 = require("tslib");
const chalk_1 = (0, tslib_1.__importDefault)(require("chalk"));
const estree_toolkit_1 = require("estree-toolkit");
const processor_1 = require("./processor");
const utils_1 = require("../utils");
const resolveDependency = async (instance, pathToResolve, relativeTo) => {
for (const hook of (0, processor_1.getPluginHooks)(instance).resolveHooks) {
const resolvedPath = await hook(pathToResolve, relativeTo);
if (resolvedPath)
return resolvedPath;
}
instance.log('info', chalk_1.default.red(`Unable to resolve path "${pathToResolve}" of "${relativeTo}"`));
return null;
};
exports.resolveDependency = resolveDependency;
const isPathRouted = (path) => path.startsWith('#/');
const pathFromRouted = (path) => path.substring(1);
const resolveImports = async (instance, programPath, filePath) => {
let error = false;
const imports = [];
const resolveDeclaration = async (nodePath) => {
if (nodePath.has('source')) {
const sourcePath = nodePath.get('source');
const source = sourcePath.node.value;
if (source === 'reboost/hmr' || source === 'reboost/hot') {
// TODO: Remove it in v1.0
if (source === 'reboost/hmr') {
instance.log('info', chalk_1.default.yellow(`Warning ${filePath}: "reboost/hmr" is deprecated, please use "reboost/hot"`));
}
sourcePath.replaceWith(estree_toolkit_1.builders.literal(`/hot?q=${encodeURIComponent(filePath)}`));
}
else {
let finalPath = null;
let routed = false;
if (isPathRouted(source)) {
finalPath = pathFromRouted(source);
routed = true;
}
else {
const resolvedPath = await (0, exports.resolveDependency)(instance, source, filePath);
if (resolvedPath) {
if (isPathRouted(resolvedPath)) {
finalPath = pathFromRouted(resolvedPath);
routed = true;
}
else {
finalPath = resolvedPath;
imports.push(finalPath);
}
}
else {
error = true;
}
}
sourcePath.replaceWith(estree_toolkit_1.builders.literal(routed
? finalPath
: finalPath
? `/transformed?q=${encodeURIComponent(finalPath)}`
: `/unresolved?import=${encodeURIComponent(source)}&importer=${encodeURIComponent(filePath)}`));
}
}
};
const promiseExecutors = [];
let hasImportMeta = false;
programPath.traverse({
ImportDeclaration(path) {
promiseExecutors.push(() => resolveDeclaration(path));
},
ExportDeclaration(path) {
promiseExecutors.push(() => resolveDeclaration(path));
},
CallExpression(path) {
if (estree_toolkit_1.is.identifier(path.node.callee, { name: '__reboost_resolve' })) {
promiseExecutors.push(async () => {
const toResolve = path.node.arguments[0].value;
if (isPathRouted(toResolve)) {
path.replaceWith(estree_toolkit_1.builders.literal(pathFromRouted(toResolve)));
}
else {
const resolvedPath = await (0, exports.resolveDependency)(instance, toResolve, filePath);
if (resolvedPath) {
path.replaceWith(estree_toolkit_1.builders.literal(resolvedPath));
}
}
});
}
},
ImportExpression(path) {
// Rewrite dynamic imports
const importerIdentifier = estree_toolkit_1.builders.identifier(`importer_${(0, utils_1.uniqueID)(6)}`);
const importerDeclaration = estree_toolkit_1.builders.importDeclaration([
estree_toolkit_1.builders.importDefaultSpecifier(importerIdentifier)
], estree_toolkit_1.builders.literal('/importer'));
programPath.unshiftContainer('body', [importerDeclaration])[0].skip(); // Don't traverse the import declaration
path.replaceWith(estree_toolkit_1.builders.callExpression(estree_toolkit_1.builders.memberExpression(estree_toolkit_1.builders.identifier(importerIdentifier.name), estree_toolkit_1.builders.identifier('Dynamic')), [
path.node.source,
estree_toolkit_1.builders.literal(filePath)
]));
},
MetaProperty(path) {
if (estree_toolkit_1.is.identifier(path.node.meta, { name: 'import' }) &&
estree_toolkit_1.is.identifier(path.node.property, { name: 'meta' })) {
hasImportMeta = true;
}
}
});
if (hasImportMeta) {
const importMeta = estree_toolkit_1.builders.metaProperty(estree_toolkit_1.builders.identifier('import'), estree_toolkit_1.builders.identifier('meta'));
const importMetaUrl = estree_toolkit_1.builders.memberExpression(importMeta, estree_toolkit_1.builders.identifier('url'));
const localHotIdentifier = estree_toolkit_1.builders.identifier('Hot_' + (0, utils_1.uniqueID)(4));
programPath.unshiftContainer('body', [
estree_toolkit_1.builders.importDeclaration([estree_toolkit_1.builders.importSpecifier(estree_toolkit_1.builders.identifier('Hot'), localHotIdentifier)], estree_toolkit_1.builders.literal('/runtime')),
estree_toolkit_1.builders.expressionStatement(estree_toolkit_1.builders.assignmentExpression('=', estree_toolkit_1.builders.memberExpression(importMeta, estree_toolkit_1.builders.identifier('reboost')), estree_toolkit_1.builders.literal(true))),
estree_toolkit_1.builders.expressionStatement(estree_toolkit_1.builders.assignmentExpression('=', estree_toolkit_1.builders.memberExpression(importMeta, estree_toolkit_1.builders.identifier('absoluteUrl')), importMetaUrl)),
estree_toolkit_1.builders.expressionStatement(estree_toolkit_1.builders.assignmentExpression('=', importMetaUrl, estree_toolkit_1.builders.literal(filePath))),
estree_toolkit_1.builders.expressionStatement(estree_toolkit_1.builders.assignmentExpression('=', estree_toolkit_1.builders.memberExpression(importMeta, estree_toolkit_1.builders.identifier('hot')), estree_toolkit_1.builders.newExpression(localHotIdentifier, [estree_toolkit_1.builders.literal(filePath)])))
]);
}
for (const execute of promiseExecutors)
await execute();
if (imports.length) {
programPath.pushContainer('body', [
estree_toolkit_1.builders.expressionStatement(estree_toolkit_1.builders.callExpression(estree_toolkit_1.builders.memberExpression(estree_toolkit_1.builders.memberExpression(estree_toolkit_1.builders.identifier('Reboost'), estree_toolkit_1.builders.literal('[[Private]]'), true), estree_toolkit_1.builders.identifier('setDependencies')), [
estree_toolkit_1.builders.literal(filePath),
estree_toolkit_1.builders.arrayExpression(imports.map((s) => estree_toolkit_1.builders.literal(s)))
]))
]);
}
return error;
};
exports.resolveImports = resolveImports;