vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
150 lines (149 loc) • 7.22 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.pluginAutoFullBuild = pluginAutoFullBuild;
exports.isPrerenderForceExit = isPrerenderForceExit;
const vite_1 = require("vite");
const utils_js_1 = require("../../utils.js");
const context_js_1 = require("../../../prerender/context.js");
const isViteCliCall_js_1 = require("../../shared/isViteCliCall.js");
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
const logErrorHint_js_1 = require("../../../runtime/renderPage/logErrorHint.js");
const pluginBuildConfig_js_1 = require("./pluginBuildConfig.js");
const resolveVikeConfigInternal_js_1 = require("../../shared/resolveVikeConfigInternal.js");
const context_js_2 = require("../../../api/context.js");
const handleAssetsManifest_js_1 = require("./handleAssetsManifest.js");
const isViteServerBuild_js_1 = require("../../shared/isViteServerBuild.js");
const runPrerenderEntry_js_1 = require("../../../prerender/runPrerenderEntry.js");
(0, utils_js_1.assertIsSingleModuleInstance)('build/pluginAutoFullBuild.ts');
let forceExit = false;
function pluginAutoFullBuild() {
let config;
return [
{
name: 'vike:build:pluginAutoFullBuild',
apply: 'build',
enforce: 'pre',
async configResolved(config_) {
config = config_;
await abortViteBuildSsr();
},
writeBundle: {
/* We can't use this because it breaks Vite's logging. TO-DO/eventually: try again with latest Vite version.
sequential: true,
order: 'pre',
*/
async handler(options, bundle) {
try {
await (0, handleAssetsManifest_js_1.handleAssetsManifest)(config, this.environment, options, bundle);
await triggerFullBuild(config, this.environment, bundle);
}
catch (err) {
// We use try-catch also because:
// - Vite/Rollup swallows errors thrown inside the writeBundle() hook. (It doesn't swallow errors thrown inside the first writeBundle() hook while building the client-side, but it does swallow errors thrown inside the second writeBundle() while building the server-side triggered after Vike calls Vite's `build()` API.)
// - Avoid Rollup prefixing the error with [vike:build:pluginAutoFullBuild], see for example https://github.com/vikejs/vike/issues/472#issuecomment-1276274203
console.error(err);
(0, logErrorHint_js_1.logErrorHint)(err);
process.exit(1);
}
},
},
},
{
name: 'vike:build:pluginAutoFullBuild:post',
apply: 'build',
enforce: 'post',
closeBundle: {
sequential: true,
order: 'post',
async handler() {
(0, utils_js_1.onSetupBuild)();
(0, handleAssetsManifest_js_1.handleAssetsManifest_assertUsageCssTarget)(config);
const vikeConfig = await (0, resolveVikeConfigInternal_js_1.getVikeConfigInternal)();
if (forceExit &&
// Let vike:build:pluginBuildApp force exit
!vikeConfig.config.vite6BuilderApp) {
(0, runPrerenderEntry_js_1.runPrerender_forceExit)();
(0, utils_js_1.assert)(false);
}
},
},
},
];
}
async function triggerFullBuild(config, viteEnv, bundle) {
const vikeConfig = await (0, resolveVikeConfigInternal_js_1.getVikeConfigInternal)();
// Whether builder.buildApp() is being used, see plugin:build:pluginBuildApp
const isBuilderApp = vikeConfig.config.vite6BuilderApp;
// If builder.buildApp() => trigger at end of `this.environment.name === 'ssr'`.
// Else => trigger at end of client-side build.
if (isBuilderApp ? !(0, isViteServerBuild_js_1.isViteServerBuild_onlySsrEnv)(config, viteEnv) : !(0, isViteServerBuild_js_1.isViteClientBuild)(config, viteEnv))
return;
if (isEntirelyDisabled(vikeConfig))
return;
// Workaround for @vitejs/plugin-legacy
// - The legacy plugin triggers its own Rollup build for the client-side.
// - The legacy plugin doesn't generate a manifest => we can use that to detect the legacy plugin build.
// - Issue & reproduction: https://github.com/vikejs/vike/issues/1154#issuecomment-1965954636
if (!bundle[pluginBuildConfig_js_1.manifestTempFile])
return;
const configInline = getFullBuildInlineConfig(config);
if (!isBuilderApp) {
await (0, vite_1.build)(setSSR(configInline));
}
else {
// The server build is already called by builder.buildApp()
}
if ((0, context_js_1.isPrerenderAutoRunEnabled)(vikeConfig)) {
const res = await (0, runPrerenderEntry_js_1.runPrerenderFromAutoRun)(configInline);
forceExit = res.forceExit;
(0, utils_js_1.assert)((0, context_js_1.wasPrerenderRun)());
}
}
function setSSR(configInline) {
return {
...configInline,
build: {
...configInline.build,
ssr: true,
},
};
}
async function abortViteBuildSsr() {
const vikeConfig = await (0, resolveVikeConfigInternal_js_1.getVikeConfigInternal)();
if (vikeConfig.config.disableAutoFullBuild !== true && (0, isViteCliCall_js_1.isViteCliCall)() && (0, isViteCliCall_js_1.getViteConfigFromCli)()?.build.ssr) {
(0, utils_js_1.assertWarning)(false, `The CLI call ${picocolors_1.default.cyan('$ vite build --ssr')} is superfluous since ${picocolors_1.default.cyan('$ vite build')} also builds the server-side. If you want two separate build steps then use https://vike.dev/disableAutoFullBuild or use Vite's ${picocolors_1.default.cyan('build()')} API.`, { onlyOnce: true });
process.exit(0);
}
}
function isEntirelyDisabled(vikeConfig) {
const { disableAutoFullBuild } = vikeConfig.config;
if (disableAutoFullBuild === undefined || disableAutoFullBuild === 'prerender') {
const isUserUsingViteApi = !(0, isViteCliCall_js_1.isViteCliCall)() && !(0, context_js_2.isVikeCliOrApi)();
return isUserUsingViteApi;
}
else {
return disableAutoFullBuild;
}
}
function isPrerenderForceExit() {
return forceExit;
}
function getFullBuildInlineConfig(config) {
const configFromCli = !(0, isViteCliCall_js_1.isViteCliCall)() ? null : (0, isViteCliCall_js_1.getViteConfigFromCli)();
if (config._viteConfigFromUserEnhanced) {
return config._viteConfigFromUserEnhanced;
}
else {
return {
...configFromCli,
configFile: configFromCli?.configFile || config.configFile,
root: config.root,
build: {
...configFromCli?.build,
},
};
}
}