vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
116 lines (115 loc) • 5.56 kB
JavaScript
export { loadPageConfigsLazyServerSideAndExecHook };
import { getPageFilesServerSide } from '../../../shared/getPageFiles.js';
import { resolveVikeConfigPublicPageLazy } from '../../../shared/page-configs/resolveVikeConfigPublic.js';
import { analyzePageClientSideInit } from '../../../shared/getPageFiles/analyzePageClientSide.js';
import { assert, assertUsage, assertWarning, hasProp, isArrayOfStrings, objectAssign, isArray, } from '../utils.js';
import { getPageAssets } from './getPageAssets.js';
import { debugPageFiles } from './debugPageFiles.js';
import { findPageConfig } from '../../../shared/page-configs/findPageConfig.js';
import { analyzePage } from './analyzePage.js';
import { loadConfigValues } from '../../../shared/page-configs/loadConfigValues.js';
import { execHookServer } from './execHookServer.js';
async function loadPageConfigsLazyServerSideAndExecHook(pageContext) {
const pageContextAddendum = await loadPageConfigsLazyServerSide(pageContext);
objectAssign(pageContext, pageContextAddendum);
await execHookServer('onCreatePageContext', pageContext);
return pageContext;
}
async function loadPageConfigsLazyServerSide(pageContext) {
const pageConfig = findPageConfig(pageContext._globalContext._pageConfigs, pageContext.pageId); // Make pageConfig globally available as pageContext._pageConfig ?
const globalContext = pageContext._globalContext;
const [{ pageFilesLoaded, pageContextExports }] = await Promise.all([
loadPageUserFiles(pageContext._globalContext._pageFilesAll, pageConfig, globalContext._pageConfigGlobal, pageContext.pageId, !globalContext._isProduction),
analyzePageClientSideInit(pageContext._globalContext._pageFilesAll, pageContext.pageId, {
sharedPageFilesAlreadyLoaded: true,
}),
]);
const { isHtmlOnly, isClientRouting, clientEntries, clientDependencies, pageFilesClientSide, pageFilesServerSide } = await analyzePage(pageContext._globalContext._pageFilesAll, pageConfig, pageContext.pageId, globalContext);
const isV1Design = !!pageConfig;
const passToClient = [];
const errMsg = ' should be an array of strings.';
if (!isV1Design) {
pageContextExports.exportsAll.passToClient?.forEach((e) => {
assertUsage(hasProp(e, 'exportValue', 'string[]'), `${e.exportSource}${errMsg}`);
passToClient.push(...e.exportValue);
});
}
else {
pageContextExports.configEntries.passToClient?.forEach((e) => {
const { configValue } = e;
assert(isArray(configValue));
const vals = configValue.flat(1);
// TODO: improve error message by using (upcoming) new data structure instead of configEntries
assertUsage(isArrayOfStrings(vals), `${e.configDefinedAt}${errMsg}`);
passToClient.push(...vals);
});
}
const pageContextAddendum = {};
objectAssign(pageContextAddendum, pageContextExports);
objectAssign(pageContextAddendum, {
Page: pageContextExports.exports.Page,
_isHtmlOnly: isHtmlOnly,
_passToClient: passToClient,
_pageFilePathsLoaded: pageFilesLoaded.map((p) => p.filePath),
});
objectAssign(pageContextAddendum, {
__getPageAssets: async () => {
if ('_pageAssets' in pageContext) {
return pageContext._pageAssets;
}
else {
const pageAssets = await getPageAssets(pageContext, clientDependencies, clientEntries);
objectAssign(pageContext, { _pageAssets: pageAssets });
return pageContext._pageAssets;
}
},
});
// TODO/v1-release: remove
Object.assign(pageContextAddendum, {
_getPageAssets: async () => {
assertWarning(false, 'pageContext._getPageAssets() deprecated, see https://vike.dev/preloading', {
onlyOnce: true,
showStackTrace: true,
});
const pageAssetsOldFormat = [];
(await pageContextAddendum.__getPageAssets()).forEach((p) => {
if (p.assetType === 'script' && p.isEntry) {
pageAssetsOldFormat.push({
src: p.src,
preloadType: null,
assetType: 'script',
mediaType: p.mediaType,
});
}
pageAssetsOldFormat.push({
src: p.src,
preloadType: p.assetType,
assetType: p.assetType === 'style' ? 'style' : 'preload',
mediaType: p.mediaType,
});
});
return pageAssetsOldFormat;
},
});
debugPageFiles({
pageContext,
isHtmlOnly,
isClientRouting,
pageFilesLoaded,
pageFilesClientSide,
pageFilesServerSide,
clientEntries,
clientDependencies,
});
return pageContextAddendum;
}
async function loadPageUserFiles(pageFilesAll, pageConfig, pageConfigGlobal, pageId, isDev) {
const pageFilesServerSide = getPageFilesServerSide(pageFilesAll, pageId);
const pageConfigLoaded = !pageConfig ? null : await loadConfigValues(pageConfig, isDev);
await Promise.all(pageFilesServerSide.map((p) => p.loadFile?.()));
const pageContextExports = resolveVikeConfigPublicPageLazy(pageFilesServerSide, pageConfigLoaded, pageConfigGlobal);
return {
pageContextExports,
pageFilesLoaded: pageFilesServerSide,
};
}