vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
148 lines (147 loc) • 5.94 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getOutDirs = getOutDirs;
exports.resolveOutDir = resolveOutDir;
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
const utils_js_1 = require("../utils.js");
const isViteServerBuild_js_1 = require("./isViteServerBuild.js");
const debug = (0, utils_js_1.createDebugger)('vike:outDir');
function getOutDirs(configGlobal, viteEnv) {
const configEnv = viteEnv?.config ?? configGlobal;
debug('getOutDirs()', new Error().stack);
const outDir = getOutDirFromViteResolvedConfig(configEnv);
if (!isOutDirRoot(outDir))
assertOutDirResolved(outDir, configEnv);
const outDirs = getOutDirsAll(outDir, configEnv.root);
return outDirs;
}
/** Appends `client/` or `server/` to `config.build.outDir` */
function resolveOutDir(config, isSSR) {
debug('resolveOutDir()', new Error().stack);
const isServerSide = (0, isViteServerBuild_js_1.isViteServerBuild)(config) || isSSR;
debug('isServerSide', isServerSide);
const outDir = getOutDirFromViteUserConfig(config) || 'dist';
debug('outDir', outDir);
/* outDir may already be resolved when using Telefunc + Vike (because both Telefunc and Vike use this logic)
assert(isOutDirRoot(outDir))
*/
const { outDirClient, outDirServer } = getOutDirsAll(outDir);
if (isServerSide) {
debug('outDirServer', 'outDirServer');
return outDirServer;
}
else {
debug('outDirClient', 'outDirClient');
return outDirClient;
}
}
function determineOutDirs(outDirRoot) {
(0, utils_js_1.assertPosixPath)(outDirRoot);
(0, utils_js_1.assert)(isOutDirRoot(outDirRoot));
const outDirClient = (0, utils_js_1.pathJoin)(outDirRoot, 'client');
const outDirServer = (0, utils_js_1.pathJoin)(outDirRoot, 'server');
assertIsNotOutDirRoot(outDirClient);
assertIsNotOutDirRoot(outDirServer);
return { outDirClient, outDirServer };
}
function getOutDirsAll(outDir, root) {
let outDirRoot;
{
if (isOutDirRoot(outDir)) {
outDirRoot = outDir;
}
else {
(0, utils_js_1.assert)(outDir.endsWith('/server') || outDir.endsWith('/client'));
(0, utils_js_1.assert)('/client'.length === '/server'.length);
outDirRoot = outDir.slice(0, -1 * '/client'.length);
}
}
debug('outDirRoot', outDirRoot);
let outDirs;
if (root) {
outDirs = getOutDirsAllFromRootNormalized(outDirRoot, root);
}
else {
outDirs = getOutDirsAllFromRoot(outDirRoot);
}
debug('outDirs', outDirs);
return outDirs;
}
function getOutDirsAllFromRoot(outDirRoot) {
let { outDirClient, outDirServer } = determineOutDirs(outDirRoot);
return { outDirRoot, outDirClient, outDirServer };
}
function getOutDirsAllFromRootNormalized(outDirRoot, root) {
if (root && !outDirIsAbsolutePath(outDirRoot)) {
(0, utils_js_1.assertPosixPath)(outDirRoot);
(0, utils_js_1.assertPosixPath)(root);
outDirRoot = (0, utils_js_1.pathJoin)(root, outDirRoot);
}
let { outDirClient, outDirServer } = determineOutDirs(outDirRoot);
outDirRoot = outDirRoot + '/';
outDirClient = outDirClient + '/';
outDirServer = outDirServer + '/';
assertNormalization(outDirRoot);
assertNormalization(outDirClient);
assertNormalization(outDirServer);
return { outDirRoot, outDirClient, outDirServer };
}
function assertNormalization(outDirAny) {
(0, utils_js_1.assertPosixPath)(outDirAny);
(0, utils_js_1.assert)(outDirIsAbsolutePath(outDirAny));
(0, utils_js_1.assert)(outDirAny.endsWith('/'));
(0, utils_js_1.assert)(!outDirAny.endsWith('//'));
}
function isOutDirRoot(outDirRot) {
const p = outDirRot.split('/').filter(Boolean);
const lastDir = p[p.length - 1];
return lastDir !== 'client' && lastDir !== 'server';
}
function assertIsNotOutDirRoot(outDir) {
(0, utils_js_1.assert)(outDir.endsWith('/client') || outDir.endsWith('/server'));
}
/** Assert that `outDir` ends with `/server` or `/client` */
function assertOutDirResolved(outDir, config) {
(0, utils_js_1.assertPosixPath)(outDir);
assertIsNotOutDirRoot(outDir);
(0, utils_js_1.assert)('/client'.length === '/server'.length);
const outDirCorrected = outDir.slice(0, -1 * '/client'.length);
const wrongUsage = `You've set Vite's config.build.outDir to ${picocolors_1.default.cyan(outDir)} but you should set it to ${picocolors_1.default.cyan(outDirCorrected)} instead.`;
if ((0, isViteServerBuild_js_1.isViteServerBuild)(config)) {
(0, utils_js_1.assertUsage)(outDir.endsWith('/server'), wrongUsage);
}
else {
(0, utils_js_1.assertUsage)(outDir.endsWith('/client'), wrongUsage);
}
}
function getOutDirFromViteUserConfig(config) {
let outDir = config.build?.outDir;
if (outDir === undefined)
return undefined;
outDir = normalizeOutDir(outDir);
return outDir;
}
function getOutDirFromViteResolvedConfig(config) {
let outDir = config.build.outDir;
(0, utils_js_1.assert)(outDir);
outDir = normalizeOutDir(outDir);
return outDir;
}
function normalizeOutDir(outDir) {
outDir = (0, utils_js_1.toPosixPath)(outDir);
outDir = outDir.replace(/\/+$/, ''); // remove trailing slashes
return outDir;
}
function outDirIsAbsolutePath(outDir) {
// There doesn't seem to be a better alternative to determine whether `outDir` is an absolute path
// - Very unlikely that `outDir`'s first dir matches the filesystem's first dir
// - Although more likely to happen with Docker
return getFirstDir(outDir) === getFirstDir(process.cwd());
}
function getFirstDir(p) {
const firstDir = p.split(/\/|\\/).filter(Boolean)[0];
return firstDir;
}