st-bundle
Version:
CLI for watching and bundling SpringType projects.
171 lines (170 loc) • 6.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("../utils/utils");
const browserField_1 = require("./browserField");
const fileLookup_1 = require("./fileLookup");
const nodeModuleLookup_1 = require("./nodeModuleLookup");
const pathsLookup_1 = require("./pathsLookup");
const polyfills_1 = require("./polyfills");
var ImportType;
(function (ImportType) {
ImportType[ImportType["REQUIRE"] = 0] = "REQUIRE";
ImportType[ImportType["FROM"] = 1] = "FROM";
ImportType[ImportType["RAW_IMPORT"] = 2] = "RAW_IMPORT";
ImportType[ImportType["DYNAMIC"] = 3] = "DYNAMIC";
})(ImportType = exports.ImportType || (exports.ImportType = {}));
function isExternalModule(props) {
if (/^https?:/.test(props.target)) {
return {
isExternal: true,
};
}
}
function replaceAliases(props) {
let forceReplacement = false;
let target = props.target;
for (const key in props.alias) {
const regex = utils_1.path2Regex(key);
const value = props.alias[key];
if (regex.test(target)) {
target = target.replace(regex, value);
return { target, forceReplacement: true };
}
}
return { target, forceReplacement };
}
function resolveModule(props) {
const external = isExternalModule(props);
if (external) {
return external;
}
const isBrowserBuild = props.buildTarget === 'browser';
const isServerBuild = props.buildTarget === 'server';
const isElectronBuild = props.buildTarget === 'electron';
const isUniversalBuild = props.buildTarget === 'universal';
let target = props.target;
let forcedStatement;
let forceReplacement = false;
let lookupResult;
// replace aliaes
// props.target will be updated
if (props.alias) {
const res = replaceAliases(props);
forceReplacement = res.forceReplacement;
target = res.target;
}
// handle typescript paths
// in this cases it should always send a forceStatement
if (props.typescriptPaths) {
lookupResult = pathsLookup_1.pathsLookup({
isDev: props.isDev,
baseURL: props.typescriptPaths.baseURL,
cachePaths: props.cache,
homeDir: props.homeDir,
paths: props.typescriptPaths.paths,
target: target,
});
if (lookupResult) {
forceReplacement = true;
}
}
const browserFieldLookup = props.packageMeta && isBrowserBuild && props.packageMeta.browser && typeof props.packageMeta.browser === 'object';
// continue looking for the file
if (!lookupResult) {
let moduleParsed = nodeModuleLookup_1.isNodeModule(target);
if (moduleParsed) {
// first check if we need to bundle it at all;
if (!isUniversalBuild && isServerBuild && polyfills_1.isServerPolyfill(moduleParsed.name)) {
return { skip: true };
}
if (!isUniversalBuild && isElectronBuild && polyfills_1.isElectronPolyfill(moduleParsed.name)) {
return { skip: true };
}
if (browserFieldLookup) {
if (props.packageMeta.browser[moduleParsed.name] === false) {
forcedStatement = 'fuse-empty-package';
moduleParsed = { name: forcedStatement };
forceReplacement = true;
}
}
const pkg = nodeModuleLookup_1.nodeModuleLookup(props, moduleParsed);
if (pkg.error) {
return { error: pkg.error };
}
const aliasForced = forceReplacement && target;
return {
forcedStatement: forcedStatement ? forcedStatement : pkg.forcedStatement ? pkg.forcedStatement : aliasForced,
package: pkg,
};
}
else {
lookupResult = fileLookup_1.fileLookup({
isDev: props.isDev,
filePath: props.filePath,
target: target,
javascriptFirst: props.javascriptFirst,
});
}
}
if (!lookupResult.fileExists) {
return;
}
if (props.packageMeta) {
if (isBrowserBuild && props.packageMeta.browser && typeof props.packageMeta.browser === 'object') {
// a match should direct according to the specs
const override = browserField_1.handleBrowserField(props.packageMeta, lookupResult.absPath);
if (override) {
forceReplacement = true;
lookupResult.absPath = override;
}
}
}
if (lookupResult.customIndex) {
forceReplacement = true;
}
if (props.importType && props.importType === ImportType.DYNAMIC) {
forceReplacement = true;
}
const extension = lookupResult.extension;
const absPath = lookupResult.absPath;
let fuseBoxPath;
if (props.packageMeta) {
if (props.packageMeta.packageAltRoots) {
if (absPath.includes(props.packageMeta.packageRoot)) {
fuseBoxPath = utils_1.makeFuseBoxPath(props.packageMeta.packageRoot, absPath);
}
else {
for (const root of props.packageMeta.packageAltRoots) {
if (absPath.includes(root)) {
fuseBoxPath = utils_1.makeFuseBoxPath(root, absPath);
break;
}
}
}
}
else {
fuseBoxPath = utils_1.makeFuseBoxPath(props.packageMeta.packageRoot, absPath);
}
}
else {
fuseBoxPath = utils_1.makeFuseBoxPath(props.homeDir, absPath);
}
if (forceReplacement) {
if (props.packageMeta) {
forcedStatement = `${props.packageMeta.name}/${fuseBoxPath}`;
}
else {
forcedStatement = `~/${fuseBoxPath}`;
}
}
lookupResult.tsConfigAtPath;
return {
tsConfigAtPath: lookupResult.tsConfigAtPath,
monorepoModulesPath: lookupResult.monorepoModulesPaths,
extension,
absPath,
fuseBoxPath,
forcedStatement,
};
}
exports.resolveModule = resolveModule;