UNPKG

vike

Version:

The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.

148 lines (147 loc) 5.94 kB
"use strict"; 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; }