UNPKG

vike

Version:

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

116 lines (115 loc) 5.56 kB
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, }; }