UNPKG

vike

Version:

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

128 lines (125 loc) 6.34 kB
"use strict"; 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; }