UNPKG

reboost

Version:

A super fast dev server for rapid web development

135 lines (134 loc) 7.86 kB
"use strict"; 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;