vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
99 lines (98 loc) • 5 kB
JavaScript
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'));
}