vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
74 lines (73 loc) • 4.11 kB
JavaScript
export { resolvePrerenderConfigGlobal };
export { resolvePrerenderConfigLocal };
import { assert, assertUsage } from '../../utils/assert.js';
import { isArray } from '../../utils/isArray.js';
import { isObject } from '../../utils/isObject.js';
import { objectAssign } from '../../utils/objectAssign.js';
import { getConfigValueBuildTime } from '../../shared-server-client/page-configs/getConfigValueBuildTime.js';
import { getConfigDefinedAt } from '../../shared-server-client/page-configs/getConfigDefinedAt.js';
import { isCallable } from '../../utils/isCallable.js';
// +prerender is callable but getGlobalContext() cannot be used (see https://github.com/vikejs/vike/issues/3002#issuecomment-3703878380) but it's still useful (see https://github.com/vikejs/vike/issues/3002#issuecomment-3704141813)
// When setting +prerender to an object => it activates pre-rendering
const defaultValueForObject = true;
async function resolvePrerenderConfigGlobal(vikeConfig) {
const prerenderConfigs = vikeConfig.config.prerender || [];
const prerenderConfigsResolved = await Promise.all(prerenderConfigs.map((config) => (isCallable(config) ? config() : config)));
const prerenderSettings = prerenderConfigsResolved.filter(isObject2);
const prerenderConfigGlobal = {
partial: pickFirst(prerenderSettings.map((c) => c.partial)) ?? false,
redirects: pickFirst(prerenderSettings.map((c) => c.redirects)) ?? null,
noExtraDir: pickFirst(prerenderSettings.map((c) => c.noExtraDir)) ?? null,
keepDistServer: pickFirst(prerenderSettings.map((c) => c.keepDistServer)) ?? false,
parallel: pickFirst(prerenderSettings.map((c) => c.parallel)) ?? true,
disableAutoRun: pickFirst(prerenderSettings.map((c) => c.disableAutoRun)) ?? false,
};
let defaultLocalValue = false;
{
const valueFirst = prerenderConfigsResolved.filter((p) => !isObject(p) || p.enable !== null)[0];
if (valueFirst === true || (isObject(valueFirst) && (valueFirst.enable ?? defaultValueForObject))) {
defaultLocalValue = true;
}
}
// TO-DO/next-major-release: remove
// Backwards compatibility for `vike({prerender:true})` in vite.config.js
{
const valuesWithDefinedAt = vikeConfig._from.configsCumulative.prerender?.values ?? [];
if (valuesWithDefinedAt.some((v) => v.definedAt.includes('vite.config.js') && v.value)) {
defaultLocalValue = true;
}
}
const pageConfigs = vikeConfig._pageConfigs;
const prerenderConfigLocalList = await Promise.all(pageConfigs.map(resolvePrerenderConfigLocal));
const isEnable = (prerenderConfigLocal) => prerenderConfigLocal?.value ?? defaultLocalValue;
objectAssign(prerenderConfigGlobal, {
defaultLocalValue,
isPrerenderingEnabledForAllPages: pageConfigs.length > 0 && prerenderConfigLocalList.every(isEnable),
isPrerenderingEnabled: pageConfigs.length > 0 && prerenderConfigLocalList.some(isEnable),
});
// TO-DO/next-major-release: remove
if (vikeConfig._pageConfigs.length === 0 && defaultLocalValue)
prerenderConfigGlobal.isPrerenderingEnabled = true;
return prerenderConfigGlobal;
}
async function resolvePrerenderConfigLocal(pageConfig) {
const configValue = getConfigValueBuildTime(pageConfig, 'prerender');
if (!configValue)
return null;
const values = configValue.value;
assert(isArray(values));
let value = values[0];
if (isCallable(value))
value = await value();
assert(isArray(configValue.definedAtData));
const configDefinedAt = getConfigDefinedAt('Config', 'prerender', configValue.definedAtData);
assertUsage(typeof value === 'boolean', `${configDefinedAt} must be a boolean (or a function that returns a boolean) because it's defined as a page setting (not as a global setting)`);
const prerenderConfigLocal = { value };
return prerenderConfigLocal;
}
function isObject2(value) {
return typeof value === 'object' && value !== null;
}
function pickFirst(arr) {
return arr.filter((v) => v !== undefined)[0];
}