UNPKG

vike

Version:

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

259 lines (258 loc) 11 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getPageConfigUserFriendly = getPageConfigUserFriendly; exports.getPageConfigUserFriendly_oldDesign = getPageConfigUserFriendly_oldDesign; exports.getPageConfigGlobalUserFriendly = getPageConfigGlobalUserFriendly; const assert_exports_old_design_js_1 = require("../getPageFiles/assert_exports_old_design.js"); const getConfigDefinedAt_js_1 = require("./getConfigDefinedAt.js"); const helpers_js_1 = require("./helpers.js"); const utils_js_1 = require("../utils.js"); const picocolors_1 = __importDefault(require("@brillout/picocolors")); function getPageConfigUserFriendly(pageConfigGlobalValues, pageConfig, pageConfigValues) { const pageConfigUserFriendly = getPageConfigUserFriendly_public({ pageConfigGlobalValues, pageConfigValues }); let page; if (!pageConfig.isErrorPage) { const route = pageConfigUserFriendly.config.route ?? pageConfig.routeFilesystem.routeString; page = { ...pageConfigUserFriendly, route }; } else { page = { ...pageConfigUserFriendly, isErrorPage: true }; } return [pageConfig.pageId, page]; } function getPageConfigUserFriendly_public({ pageConfigGlobalValues, pageConfigValues }) { const pageConfigUserFriendly = getPageConfigUserFriendly_base({ pageConfigGlobalValues, pageConfigValues }); return getPublicCopy(pageConfigUserFriendly); } function getPublicCopy(pageConfigUserFriendly) { const p = pageConfigUserFriendly; return { config: p.config, _source: p.source, _sources: p.sources, _from: p.from }; } function getPageConfigUserFriendly_base({ pageConfigGlobalValues, pageConfigValues }) { const configValues = { ...pageConfigGlobalValues, ...pageConfigValues }; return getPageConfigUserFriendly_V1Design({ configValues }); } function getPageConfigGlobalUserFriendly({ pageConfigGlobalValues }) { const pageConfigGlobalUserFriendly = getPageConfigUserFriendly_V1Design({ configValues: pageConfigGlobalValues }); return getPublicCopy(pageConfigGlobalUserFriendly); } function getPageConfigUserFriendly_oldDesign(pageFiles, pageConfig, pageConfigGlobal) { const config = {}; const configEntries = {}; // TODO/v1-release: remove const exportsAll = {}; // TODO/v1-release: remove // V0.4 design // TODO/v1-release: remove pageFiles.forEach((pageFile) => { const exportValues = getExportValues(pageFile); exportValues.forEach(({ exportName, exportValue, isFromDefaultExport }) => { (0, utils_js_1.assert)(exportName !== 'default'); exportsAll[exportName] = exportsAll[exportName] ?? []; exportsAll[exportName].push({ exportValue, exportSource: `${pageFile.filePath} > ${isFromDefaultExport ? `\`export default { ${exportName} }\`` : `\`export { ${exportName} }\``}`, filePath: pageFile.filePath, _filePath: pageFile.filePath, // TODO/next-major-release: remove _fileType: pageFile.fileType, _isFromDefaultExport: isFromDefaultExport }); }); }); let source; let sources; let from; if (pageConfig) { const res = getPageConfigUserFriendly_base({ pageConfigGlobalValues: pageConfigGlobal.configValues, pageConfigValues: pageConfig.configValues }); source = res.source; sources = res.sources; from = res.from; Object.assign(config, res.config); Object.assign(configEntries, res.configEntries); Object.assign(exportsAll, res.exportsAll); } else { source = {}; sources = {}; from = { configsStandard: {}, configsCumulative: {}, configsComputed: {} }; } const pageExports = createObjectWithDeprecationWarning(); const exports = {}; Object.entries(exportsAll).forEach(([exportName, values]) => { values.forEach(({ exportValue, _fileType, _isFromDefaultExport }) => { exports[exportName] = exports[exportName] ?? exportValue; // Legacy pageContext.pageExports if (_fileType === '.page' && !_isFromDefaultExport) { if (!(exportName in pageExports)) { pageExports[exportName] = exportValue; } } }); }); (0, utils_js_1.assert)(!('default' in exports)); (0, utils_js_1.assert)(!('default' in exportsAll)); const pageContextExports = { config: config, from, source, sources, // TODO/eventually: deprecate/remove every prop below configEntries, exports, exportsAll, pageExports }; return pageContextExports; } // V1 design function getPageConfigUserFriendly_V1Design(pageConfig) { const config = {}; const configEntries = {}; const exportsAll = {}; const source = {}; const sources = {}; const from = { configsStandard: {}, configsCumulative: {}, configsComputed: {} }; const addSrc = (src, configName) => { source[configName] = src; sources[configName] ?? (sources[configName] = []); sources[configName].push(src); }; Object.entries(pageConfig.configValues).forEach(([configName, configValue]) => { const { value } = configValue; const configValueFilePathToShowToUser = (0, helpers_js_1.getConfigValueFilePathToShowToUser)(configValue.definedAtData); const configDefinedAt = (0, getConfigDefinedAt_js_1.getConfigDefinedAtOptional)('Config', configName, configValue.definedAtData); config[configName] = config[configName] ?? value; configEntries[configName] = configEntries[configName] ?? []; // Currently each configName has only one entry. Adding an entry for each overriden config value isn't implemented yet. (This is an isomorphic file and it isn't clear whether this can/should be implemented on the client-side. We should load a minimum amount of code on the client-side.) (0, utils_js_1.assert)(configEntries[configName].length === 0); configEntries[configName].push({ configValue: value, configDefinedAt, configDefinedByFile: configValueFilePathToShowToUser }); if (configValue.type === 'standard') { const src = { type: 'configsStandard', value: configValue.value, definedAt: (0, getConfigDefinedAt_js_1.getDefinedAtString)(configValue.definedAtData, configName) }; addSrc(src, configName); from.configsStandard[configName] = src; } if (configValue.type === 'cumulative') { const src = { type: 'configsCumulative', values: configValue.value.map((value, i) => { const definedAtFile = configValue.definedAtData[i]; (0, utils_js_1.assert)(definedAtFile); const definedAt = (0, getConfigDefinedAt_js_1.getDefinedAtString)(definedAtFile, configName); return { value, definedAt }; }) }; addSrc(src, configName); from.configsCumulative[configName] = src; } if (configValue.type === 'computed') { const src = { type: 'configsComputed', value: configValue.value }; addSrc(src, configName); from.configsComputed[configName] = src; } // TODO/v1-release: remove const exportName = configName; exportsAll[exportName] = exportsAll[exportName] ?? []; exportsAll[exportName].push({ exportValue: value, exportSource: configDefinedAt, filePath: configValueFilePathToShowToUser, _filePath: configValueFilePathToShowToUser, _fileType: null, _isFromDefaultExport: null }); }); return { config: config, configEntries, exportsAll, source, sources, from }; } function getExportValues(pageFile) { const { filePath, fileExports } = pageFile; (0, utils_js_1.assert)(fileExports); // assume pageFile.loadFile() was called (0, utils_js_1.assert)((0, utils_js_1.isScriptFile)(filePath)); const exportValues = []; Object.entries(fileExports) .sort((0, utils_js_1.makeLast)(([exportName]) => exportName === 'default')) // `export { bla }` should override `export default { bla }` .forEach(([exportName, exportValue]) => { let isFromDefaultExport = exportName === 'default'; if (isFromDefaultExport) { if ((0, utils_js_1.isTemplateFile)(filePath)) { exportName = 'Page'; } else { (0, utils_js_1.assertUsage)((0, utils_js_1.isObject)(exportValue), `The ${picocolors_1.default.cyan('export default')} of ${filePath} should be an object.`); Object.entries(exportValue).forEach(([defaultExportName, defaultExportValue]) => { (0, assert_exports_old_design_js_1.assertDefaultExports)(defaultExportName, filePath); exportValues.push({ exportName: defaultExportName, exportValue: defaultExportValue, isFromDefaultExport }); }); return; } } exportValues.push({ exportName, exportValue, isFromDefaultExport }); }); exportValues.forEach(({ exportName, isFromDefaultExport }) => { (0, utils_js_1.assert)(!(isFromDefaultExport && assert_exports_old_design_js_1.forbiddenDefaultExports.includes(exportName))); }); return exportValues; } // TODO/v1-release: remove function createObjectWithDeprecationWarning() { return new Proxy({}, { get(...args) { // We only show the warning in Node.js because when using Client Routing Vue integration uses `Object.assign(pageContextReactive, pageContext)` which will wrongully trigger the warning. There is no cross-browser way to catch whether the property accessor was initiated by an `Object.assign()` call. if (!(0, utils_js_1.isBrowser)()) { (0, utils_js_1.assertWarning)(false, '`pageContext.pageExports` is outdated. Use `pageContext.exports` instead, see https://vike.dev/exports', { onlyOnce: true, showStackTrace: true }); } return Reflect.get(...args); } }); }