UNPKG

vike

Version:

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

99 lines (98 loc) 5 kB
export { parseVirtualFileExports }; // TODO/v1-release: remove old design code, and remove all assertions. import { assert, hasProp, isCallable, isObject, cast, isArray } from '../utils.js'; import { assertExportValues } from './assert_exports_old_design.js'; import { getPageFileObject } from './getPageFileObject.js'; import { fileTypes } from './fileTypes.js'; import { parsePageConfigs } from '../page-configs/serialize/parsePageConfigs.js'; function parseVirtualFileExports(virtualFileExports) { assert(hasProp(virtualFileExports, 'pageFilesLazy', 'object')); assert(hasProp(virtualFileExports, 'pageFilesEager', 'object')); assert(hasProp(virtualFileExports, 'pageFilesExportNamesLazy', 'object')); assert(hasProp(virtualFileExports, 'pageFilesExportNamesEager', 'object')); assert(hasProp(virtualFileExports.pageFilesLazy, '.page')); assert(hasProp(virtualFileExports.pageFilesLazy, '.page.client') || hasProp(virtualFileExports.pageFilesLazy, '.page.server')); assert(hasProp(virtualFileExports, 'pageFilesList', 'string[]')); assert(hasProp(virtualFileExports, 'pageConfigsSerialized')); assert(hasProp(virtualFileExports, 'pageConfigGlobalSerialized')); const { pageConfigsSerialized, pageConfigGlobalSerialized } = virtualFileExports; assertPageConfigsSerialized(pageConfigsSerialized); assertPageConfigGlobalSerialized(pageConfigGlobalSerialized); const { pageConfigs, pageConfigGlobal } = parsePageConfigs(pageConfigsSerialized, pageConfigGlobalSerialized); const pageFilesMap = {}; parseGlobResult(virtualFileExports.pageFilesLazy).forEach(({ filePath, pageFile, globValue }) => { pageFile = pageFilesMap[filePath] = pageFilesMap[filePath] ?? pageFile; const loadModule = globValue; assertLoadModule(loadModule); pageFile.loadFile = async () => { if (!('fileExports' in pageFile)) { pageFile.fileExports = await loadModule(); assertExportValues(pageFile); } }; }); parseGlobResult(virtualFileExports.pageFilesExportNamesLazy).forEach(({ filePath, pageFile, globValue }) => { pageFile = pageFilesMap[filePath] = pageFilesMap[filePath] ?? pageFile; const loadModule = globValue; assertLoadModule(loadModule); pageFile.loadExportNames = async () => { if (!('exportNames' in pageFile)) { const moduleExports = await loadModule(); assert(hasProp(moduleExports, 'exportNames', 'string[]'), pageFile.filePath); pageFile.exportNames = moduleExports.exportNames; } }; }); // `pageFilesEager` contains `.page.route.js` files parseGlobResult(virtualFileExports.pageFilesEager).forEach(({ filePath, pageFile, globValue }) => { pageFile = pageFilesMap[filePath] = pageFilesMap[filePath] ?? pageFile; const moduleExports = globValue; assert(isObject(moduleExports)); pageFile.fileExports = moduleExports; }); parseGlobResult(virtualFileExports.pageFilesExportNamesEager).forEach(({ filePath, pageFile, globValue }) => { pageFile = pageFilesMap[filePath] = pageFilesMap[filePath] ?? pageFile; const moduleExports = globValue; assert(isObject(moduleExports)); assert(hasProp(moduleExports, 'exportNames', 'string[]'), pageFile.filePath); pageFile.exportNames = moduleExports.exportNames; }); virtualFileExports.pageFilesList.forEach((filePath) => { pageFilesMap[filePath] = pageFilesMap[filePath] ?? getPageFileObject(filePath); }); const pageFilesAll = Object.values(pageFilesMap); pageFilesAll.forEach(({ filePath }) => { assert(!filePath.includes('\\')); }); return { pageFilesAll, pageConfigs, pageConfigGlobal }; } function parseGlobResult(globObject) { const ret = []; Object.entries(globObject).forEach(([fileType, globFiles]) => { cast(fileType); assert(fileTypes.includes(fileType)); assert(isObject(globFiles)); Object.entries(globFiles).forEach(([filePath, globValue]) => { const pageFile = getPageFileObject(filePath); assert(pageFile.fileType === fileType); ret.push({ filePath, pageFile, globValue }); }); }); return ret; } function assertLoadModule(globValue) { assert(isCallable(globValue)); } function assertPageConfigsSerialized(pageConfigsSerialized) { assert(isArray(pageConfigsSerialized)); pageConfigsSerialized.forEach((pageConfigSerialized) => { assert(isObject(pageConfigSerialized)); assert(hasProp(pageConfigSerialized, 'pageId', 'string')); assert(hasProp(pageConfigSerialized, 'routeFilesystem')); assert(hasProp(pageConfigSerialized, 'configValuesSerialized')); }); } function assertPageConfigGlobalSerialized(pageConfigGlobalSerialized) { assert(hasProp(pageConfigGlobalSerialized, 'configValuesSerialized')); }