vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
128 lines (125 loc) • 6.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPlusFilesAll = getPlusFilesAll;
const utils_js_1 = require("../../utils.js");
const configDefinitionsBuiltIn_js_1 = require("./configDefinitionsBuiltIn.js");
const filesystemRouting_js_1 = require("./filesystemRouting.js");
const crawlPlusFiles_js_1 = require("./crawlPlusFiles.js");
const getConfigFileExport_js_1 = require("./getConfigFileExport.js");
const loadFileAtConfigTime_js_1 = require("./loadFileAtConfigTime.js");
const resolvePointerImport_js_1 = require("./resolvePointerImport.js");
const getFilePath_js_1 = require("../getFilePath.js");
const assertExtensions_js_1 = require("./assertExtensions.js");
async function getPlusFilesAll(userRootDir, esbuildCache) {
const plusFiles = await findPlusFiles(userRootDir);
const configFiles = [];
const valueFiles = [];
plusFiles.forEach((f) => {
if ((0, crawlPlusFiles_js_1.getPlusFileValueConfigName)(f.filePathAbsoluteFilesystem) === 'config') {
configFiles.push(f);
}
else {
valueFiles.push(f);
}
});
let plusFilesAll = {};
await Promise.all([
// Config files
...configFiles.map(async (filePath) => {
const { filePathAbsoluteUserRootDir } = filePath;
(0, utils_js_1.assert)(filePathAbsoluteUserRootDir);
const { configFile, extendsConfigs } = await (0, loadFileAtConfigTime_js_1.loadConfigFile)(filePath, userRootDir, [], false, esbuildCache);
(0, utils_js_1.assert)(filePath.filePathAbsoluteUserRootDir);
const locationId = (0, filesystemRouting_js_1.getLocationId)(filePathAbsoluteUserRootDir);
const plusFile = getPlusFileFromConfigFile(configFile, false, locationId, userRootDir);
plusFilesAll[locationId] = plusFilesAll[locationId] ?? [];
plusFilesAll[locationId].push(plusFile);
extendsConfigs.forEach((extendsConfig) => {
/* We purposely use the same locationId because the Vike extension's config should only apply to where it's being extended from, for example:
```js
// /pages/admin/+config.js
import vikeVue from 'vike-vue/config'
// Should only apply to /pages/admin/**
export default { extends: [vikeVue] }
```
```js
// /pages/marketing/+config.js
import vikeReact from 'vike-react/config'
// Should only apply to /pages/marketing/**
export default { extends: [vikeReact] }
```
*/
const plusFile = getPlusFileFromConfigFile(extendsConfig, true, locationId, userRootDir);
(0, assertExtensions_js_1.assertExtensionsConventions)(plusFile);
plusFilesAll[locationId].push(plusFile);
});
}),
// Value files
...valueFiles.map(async (filePath) => {
const { filePathAbsoluteUserRootDir } = filePath;
(0, utils_js_1.assert)(filePathAbsoluteUserRootDir);
const configName = (0, crawlPlusFiles_js_1.getPlusFileValueConfigName)(filePathAbsoluteUserRootDir);
(0, utils_js_1.assert)(configName);
const locationId = (0, filesystemRouting_js_1.getLocationId)(filePathAbsoluteUserRootDir);
const plusFile = {
locationId,
filePath,
isConfigFile: false,
isNotLoaded: true,
configName,
};
plusFilesAll[locationId] = plusFilesAll[locationId] ?? [];
plusFilesAll[locationId].push(plusFile);
// We don't have access to the custom config definitions defined by the user yet.
// - If `configDef` is `undefined` => we load the file +{configName}.js later.
// - We already need to load +meta.js here (to get the custom config definitions defined by the user)
await (0, loadFileAtConfigTime_js_1.loadValueFile)(plusFile, configDefinitionsBuiltIn_js_1.configDefinitionsBuiltIn, userRootDir, esbuildCache);
}),
]);
// Make lists element order deterministic
Object.entries(plusFilesAll).forEach(([_locationId, plusFiles]) => {
plusFiles.sort(sortMakeDeterministic);
});
assertPlusFiles(plusFilesAll);
return plusFilesAll;
}
function assertPlusFiles(plusFilesAll) {
const plusFiles = Object.values(plusFilesAll).flat();
// The earlier we call it the better, so that +require can be used by Vike extensions to depend on new Vike features
(0, assertExtensions_js_1.assertExtensionsRequire)(plusFiles);
}
function getPlusFileFromConfigFile(configFile, isExtensionConfig, locationId, userRootDir) {
const { fileExports, filePath, extendsFilePaths } = configFile;
const fileExportsByConfigName = {};
const pointerImportsByConfigName = {};
const fileExport = (0, getConfigFileExport_js_1.getConfigFileExport)(fileExports, filePath.filePathToShowToUser);
Object.entries(fileExport).forEach(([configName, configValue]) => {
fileExportsByConfigName[configName] = configValue;
const pointerImport = (0, resolvePointerImport_js_1.resolvePointerImport)(configValue, configFile.filePath, userRootDir, configName);
if (pointerImport) {
pointerImportsByConfigName[configName] = {
...pointerImport,
fileExportValueLoaded: false,
};
}
});
const plusFile = {
locationId,
filePath,
fileExportsByConfigName,
pointerImportsByConfigName,
isConfigFile: true,
isExtensionConfig,
extendsFilePaths,
};
return plusFile;
}
// Make order deterministic (no other purpose)
function sortMakeDeterministic(plusFile1, plusFile2) {
return plusFile1.filePath.filePathAbsoluteVite < plusFile2.filePath.filePathAbsoluteVite ? -1 : 1;
}
async function findPlusFiles(userRootDir) {
const files = await (0, crawlPlusFiles_js_1.crawlPlusFiles)(userRootDir);
const plusFiles = files.map(({ filePathAbsoluteUserRootDir }) => (0, getFilePath_js_1.getFilePathResolved)({ filePathAbsoluteUserRootDir, userRootDir }));
return plusFiles;
}