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