vike 0.4.220-commit-af5c91f → 0.4.221-commit-8577456
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/__internal/index.js +5 -23
- package/dist/cjs/node/api/build.js +55 -11
- package/dist/cjs/node/api/prepareViteApiCall.js +20 -17
- package/dist/cjs/node/api/prerender.js +1 -0
- package/dist/cjs/node/api/utils.js +1 -0
- package/dist/cjs/node/plugin/index.js +2 -0
- package/dist/cjs/node/plugin/plugins/autoFullBuild.js +9 -20
- package/dist/cjs/node/plugin/plugins/baseUrls.js +1 -1
- package/dist/cjs/node/plugin/plugins/buildApp.js +72 -0
- package/dist/cjs/node/plugin/plugins/buildConfig/fixServerAssets.js +8 -10
- package/dist/cjs/node/plugin/plugins/buildConfig.js +5 -5
- package/dist/cjs/node/plugin/plugins/buildEntry/index.js +2 -2
- package/dist/cjs/node/plugin/plugins/commonConfig.js +1 -1
- package/dist/cjs/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +1 -1
- package/dist/cjs/node/plugin/plugins/importUserCode/index.js +8 -2
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{assertExtensions.js → getVikeConfig/assertExtensions.js} +31 -31
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +53 -21
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{getConfigFileExport.js → getVikeConfig/getConfigFileExport.js} +2 -2
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.js +159 -0
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +3 -3
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +205 -343
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{debug.js → virtual-files/debug.js} +1 -1
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigValuesAll.js → virtual-files/getVirtualFilePageConfigValuesAll.js} +7 -7
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigs.js → virtual-files/getVirtualFilePageConfigs.js} +3 -3
- package/dist/cjs/node/plugin/plugins/setGlobalContext.js +1 -4
- package/dist/cjs/node/plugin/shared/getFullBuildInlineConfig.js +20 -0
- package/dist/cjs/node/plugin/shared/getOutDirs.js +50 -38
- package/dist/cjs/node/prerender/runPrerender.js +29 -30
- package/dist/cjs/node/runtime/globalContext.js +186 -100
- package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +2 -3
- package/dist/cjs/node/runtime/html/injectAssets/getViteDevScript.js +2 -3
- package/dist/cjs/node/runtime/html/injectAssets.js +4 -4
- package/dist/cjs/node/runtime/html/renderHtml.js +4 -5
- package/dist/cjs/node/runtime/renderPage/analyzePage.js +2 -3
- package/dist/cjs/node/runtime/renderPage/getPageAssets/sortPageAssetsForEarlyHintsHeader.js +2 -4
- package/dist/cjs/node/runtime/renderPage/getPageAssets.js +4 -4
- package/dist/cjs/node/runtime/renderPage/handleErrorWithoutErrorPage.js +3 -5
- package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +5 -4
- package/dist/cjs/node/runtime/renderPage/log404/index.js +1 -2
- package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +10 -9
- package/dist/cjs/node/runtime/renderPage.js +27 -30
- package/dist/cjs/node/runtime/utils.js +1 -0
- package/dist/cjs/node/runtime-dev/createDevMiddleware.js +5 -3
- package/dist/cjs/node/shared/resolveBase.js +3 -5
- package/dist/cjs/shared/getPageConfigsRuntime.js +20 -0
- package/dist/cjs/shared/getPageFiles/parseGlobResults.js +4 -3
- package/dist/cjs/shared/getPageFiles.js +1 -3
- package/dist/cjs/shared/page-configs/getPageConfigUserFriendly.js +13 -4
- package/dist/cjs/shared/route/loadPageRoutes.js +1 -0
- package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
- package/dist/cjs/utils/assertSetup.js +1 -1
- package/dist/cjs/utils/debug.js +8 -6
- package/dist/cjs/utils/findFile.js +1 -0
- package/dist/cjs/utils/objectAssignSafe.js +7 -0
- package/dist/esm/__internal/index.d.ts +2 -2
- package/dist/esm/__internal/index.js +7 -26
- package/dist/esm/client/client-routing-runtime/createPageContext.js +5 -9
- package/dist/esm/client/server-routing-runtime/getPageContext.js +3 -4
- package/dist/esm/client/shared/loadUserFilesClientSide.js +3 -2
- package/dist/esm/node/api/build.js +23 -12
- package/dist/esm/node/api/prepareViteApiCall.d.ts +4 -2
- package/dist/esm/node/api/prepareViteApiCall.js +20 -17
- package/dist/esm/node/api/prerender.js +1 -0
- package/dist/esm/node/api/utils.d.ts +1 -0
- package/dist/esm/node/api/utils.js +1 -0
- package/dist/esm/node/plugin/index.js +2 -0
- package/dist/esm/node/plugin/plugins/autoFullBuild.js +10 -21
- package/dist/esm/node/plugin/plugins/baseUrls.js +1 -1
- package/dist/esm/node/plugin/plugins/buildApp.d.ts +3 -0
- package/dist/esm/node/plugin/plugins/buildApp.js +70 -0
- package/dist/esm/node/plugin/plugins/buildConfig/fixServerAssets.d.ts +0 -2
- package/dist/esm/node/plugin/plugins/buildConfig/fixServerAssets.js +8 -10
- package/dist/esm/node/plugin/plugins/buildConfig.js +6 -6
- package/dist/esm/node/plugin/plugins/buildEntry/index.js +2 -2
- package/dist/esm/node/plugin/plugins/commonConfig.d.ts +1 -1
- package/dist/esm/node/plugin/plugins/commonConfig.js +1 -1
- package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +1 -1
- package/dist/esm/node/plugin/plugins/importUserCode/index.js +8 -2
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/assertExtensions.d.ts +6 -0
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{assertExtensions.js → getVikeConfig/assertExtensions.js} +31 -31
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +2 -2
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +52 -20
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getConfigFileExport.js → getVikeConfig/getConfigFileExport.js} +2 -2
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.d.ts +39 -0
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.js +154 -0
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.d.ts +2 -2
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +3 -3
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +2 -38
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +208 -346
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{debug.js → virtual-files/debug.js} +1 -1
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigValuesAll.js → virtual-files/getVirtualFilePageConfigValuesAll.js} +7 -7
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigs.js → virtual-files/getVirtualFilePageConfigs.js} +3 -3
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{isRuntimeEnvMatch.d.ts → virtual-files/isRuntimeEnvMatch.d.ts} +1 -1
- package/dist/esm/node/plugin/plugins/setGlobalContext.js +2 -5
- package/dist/esm/node/plugin/shared/getFullBuildInlineConfig.d.ts +2 -0
- package/dist/esm/node/plugin/shared/getFullBuildInlineConfig.js +17 -0
- package/dist/esm/node/plugin/shared/getOutDirs.d.ts +1 -1
- package/dist/esm/node/plugin/shared/getOutDirs.js +50 -38
- package/dist/esm/node/plugin/shared/viteIsSSR.d.ts +2 -5
- package/dist/esm/node/prerender/runPrerender.d.ts +2 -2
- package/dist/esm/node/prerender/runPrerender.js +30 -31
- package/dist/esm/node/runtime/globalContext.d.ts +31 -29
- package/dist/esm/node/runtime/globalContext.js +186 -100
- package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.d.ts +1 -1
- package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +2 -3
- package/dist/esm/node/runtime/html/injectAssets/getViteDevScript.d.ts +4 -1
- package/dist/esm/node/runtime/html/injectAssets/getViteDevScript.js +2 -3
- package/dist/esm/node/runtime/html/injectAssets.d.ts +2 -0
- package/dist/esm/node/runtime/html/injectAssets.js +4 -4
- package/dist/esm/node/runtime/html/renderHtml.js +4 -5
- package/dist/esm/node/runtime/renderPage/analyzePage.d.ts +2 -1
- package/dist/esm/node/runtime/renderPage/analyzePage.js +2 -3
- package/dist/esm/node/runtime/renderPage/getPageAssets/sortPageAssetsForEarlyHintsHeader.d.ts +1 -1
- package/dist/esm/node/runtime/renderPage/getPageAssets/sortPageAssetsForEarlyHintsHeader.js +2 -4
- package/dist/esm/node/runtime/renderPage/getPageAssets.d.ts +2 -0
- package/dist/esm/node/runtime/renderPage/getPageAssets.js +4 -4
- package/dist/esm/node/runtime/renderPage/handleErrorWithoutErrorPage.d.ts +2 -0
- package/dist/esm/node/runtime/renderPage/handleErrorWithoutErrorPage.js +3 -5
- package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +2 -0
- package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +6 -5
- package/dist/esm/node/runtime/renderPage/log404/index.d.ts +2 -0
- package/dist/esm/node/runtime/renderPage/log404/index.js +1 -2
- package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +3 -0
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +21 -5
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +10 -9
- package/dist/esm/node/runtime/renderPage.js +28 -31
- package/dist/esm/node/runtime/utils.d.ts +1 -0
- package/dist/esm/node/runtime/utils.js +1 -0
- package/dist/esm/node/runtime-dev/createDevMiddleware.js +5 -3
- package/dist/esm/node/shared/resolveBase.d.ts +2 -1
- package/dist/esm/node/shared/resolveBase.js +3 -5
- package/dist/esm/shared/getPageConfigsRuntime.d.ts +13 -0
- package/dist/esm/shared/getPageConfigsRuntime.js +18 -0
- package/dist/esm/shared/getPageFiles/parseGlobResults.d.ts +1 -1
- package/dist/esm/shared/getPageFiles/parseGlobResults.js +4 -3
- package/dist/esm/shared/getPageFiles.d.ts +0 -1
- package/dist/esm/shared/getPageFiles.js +0 -1
- package/dist/esm/shared/page-configs/Config.d.ts +7 -0
- package/dist/esm/shared/page-configs/PageConfig.d.ts +9 -5
- package/dist/esm/shared/page-configs/getPageConfigUserFriendly.d.ts +5 -7
- package/dist/esm/shared/page-configs/getPageConfigUserFriendly.js +13 -4
- package/dist/esm/shared/route/loadPageRoutes.js +1 -0
- package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
- package/dist/esm/utils/PROJECT_VERSION.js +1 -1
- package/dist/esm/utils/assertSetup.js +1 -1
- package/dist/esm/utils/debug.d.ts +1 -1
- package/dist/esm/utils/debug.js +8 -6
- package/dist/esm/utils/findFile.js +1 -0
- package/dist/esm/utils/objectAssignSafe.d.ts +1 -0
- package/dist/esm/utils/objectAssignSafe.js +4 -0
- package/dist/esm/utils/projectInfo.d.ts +1 -1
- package/package.json +2 -2
- package/dist/cjs/shared/getPageFiles/getPageFiles.js +0 -48
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/assertExtensions.d.ts +0 -6
- package/dist/esm/shared/getPageFiles/getPageFiles.d.ts +0 -15
- package/dist/esm/shared/getPageFiles/getPageFiles.js +0 -46
- /package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{isRuntimeEnvMatch.js → virtual-files/isRuntimeEnvMatch.js} +0 -0
- /package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getConfigFileExport.d.ts → getVikeConfig/getConfigFileExport.d.ts} +0 -0
- /package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{debug.d.ts → virtual-files/debug.d.ts} +0 -0
- /package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigValuesAll.d.ts → virtual-files/getVirtualFilePageConfigValuesAll.d.ts} +0 -0
- /package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigs.d.ts → virtual-files/getVirtualFilePageConfigs.d.ts} +0 -0
- /package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{isRuntimeEnvMatch.js → virtual-files/isRuntimeEnvMatch.js} +0 -0
|
@@ -2,30 +2,26 @@ export { getVikeConfig };
|
|
|
2
2
|
export { getVikeConfig2 };
|
|
3
3
|
export { reloadVikeConfig };
|
|
4
4
|
export { vikeConfigDependencies };
|
|
5
|
-
export { isVikeConfigFile };
|
|
6
5
|
export { isV1Design };
|
|
7
6
|
export { getConfVal };
|
|
8
7
|
export { getConfigDefinitionOptional };
|
|
9
|
-
import { assertPosixPath, assert, isObject, assertUsage, assertWarning, objectEntries, hasProp, includes, assertIsNotProductionRuntime, getMostSimilar, joinEnglish,
|
|
10
|
-
import
|
|
11
|
-
import { configDefinitionsBuiltInAll } from './getVikeConfig/configDefinitionsBuiltIn.js';
|
|
8
|
+
import { assertPosixPath, assert, isObject, assertUsage, assertWarning, objectEntries, hasProp, includes, assertIsNotProductionRuntime, getMostSimilar, joinEnglish, assertKeys, objectKeys, objectFromEntries, unique, isCallable, makeFirst, lowerFirst } from '../../../utils.js';
|
|
9
|
+
import { configDefinitionsBuiltIn } from './getVikeConfig/configDefinitionsBuiltIn.js';
|
|
12
10
|
import { getLocationId, getFilesystemRouteString, getFilesystemRouteDefinedBy, isInherited, sortAfterInheritanceOrder, isGlobalLocation, applyFilesystemRoutingRootEffect } from './getVikeConfig/filesystemRouting.js';
|
|
13
|
-
import { isTemporaryBuildFile } from './getVikeConfig/transpileAndExecuteFile.js';
|
|
14
11
|
import { isConfigInvalid, isConfigInvalid_set } from '../../../../runtime/renderPage/isConfigInvalid.js';
|
|
15
12
|
import { getViteDevServer } from '../../../../runtime/globalContext.js';
|
|
16
13
|
import { logConfigError, logConfigErrorRecover } from '../../../shared/loggerNotProd.js';
|
|
17
14
|
import { removeSuperfluousViteLog_enable, removeSuperfluousViteLog_disable } from '../../../shared/loggerVite/removeSuperfluousViteLog.js';
|
|
18
15
|
import pc from '@brillout/picocolors';
|
|
19
16
|
import { getConfigDefinedAt } from '../../../../../shared/page-configs/getConfigDefinedAt.js';
|
|
20
|
-
import {
|
|
21
|
-
import { getConfigFileExport } from './getConfigFileExport.js';
|
|
22
|
-
import { loadConfigFile, loadPointerImport, loadValueFile } from './getVikeConfig/loadFileAtConfigTime.js';
|
|
17
|
+
import { loadPointerImport, loadValueFile } from './getVikeConfig/loadFileAtConfigTime.js';
|
|
23
18
|
import { resolvePointerImport } from './getVikeConfig/resolvePointerImport.js';
|
|
24
19
|
import { getFilePathResolved } from '../../../shared/getFilePath.js';
|
|
25
20
|
import { getConfigValueBuildTime } from '../../../../../shared/page-configs/getConfigValueBuildTime.js';
|
|
26
|
-
import { assertExtensionsRequire
|
|
21
|
+
import { assertExtensionsRequire } from './getVikeConfig/assertExtensions.js';
|
|
27
22
|
import { getPageConfigUserFriendlyNew } from '../../../../../shared/page-configs/getPageConfigUserFriendly.js';
|
|
28
23
|
import { getConfigValuesBase } from '../../../../../shared/page-configs/serialize/serializeConfigValues.js';
|
|
24
|
+
import { getPlusFilesAll } from './getVikeConfig/getPlusFilesAll.js';
|
|
29
25
|
assertIsNotProductionRuntime();
|
|
30
26
|
let restartVite = false;
|
|
31
27
|
let wasConfigInvalid = null;
|
|
@@ -94,106 +90,6 @@ async function isV1Design(config) {
|
|
|
94
90
|
const isV1Design = pageConfigs.length > 0;
|
|
95
91
|
return isV1Design;
|
|
96
92
|
}
|
|
97
|
-
async function loadInterfaceFiles(userRootDir, esbuildCache) {
|
|
98
|
-
const plusFiles = await findPlusFiles(userRootDir, null);
|
|
99
|
-
const configFiles = [];
|
|
100
|
-
const valueFiles = [];
|
|
101
|
-
plusFiles.forEach((f) => {
|
|
102
|
-
if (getConfigName(f.filePathAbsoluteFilesystem) === 'config') {
|
|
103
|
-
configFiles.push(f);
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
valueFiles.push(f);
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
let interfaceFilesAll = {};
|
|
110
|
-
await Promise.all([
|
|
111
|
-
// Config files
|
|
112
|
-
...configFiles.map(async (filePath) => {
|
|
113
|
-
const { filePathAbsoluteUserRootDir } = filePath;
|
|
114
|
-
assert(filePathAbsoluteUserRootDir);
|
|
115
|
-
const { configFile, extendsConfigs } = await loadConfigFile(filePath, userRootDir, [], false, esbuildCache);
|
|
116
|
-
assert(filePath.filePathAbsoluteUserRootDir);
|
|
117
|
-
const locationId = getLocationId(filePathAbsoluteUserRootDir);
|
|
118
|
-
const interfaceFile = getInterfaceFileFromConfigFile(configFile, false, locationId, userRootDir);
|
|
119
|
-
interfaceFilesAll[locationId] = interfaceFilesAll[locationId] ?? [];
|
|
120
|
-
interfaceFilesAll[locationId].push(interfaceFile);
|
|
121
|
-
extendsConfigs.forEach((extendsConfig) => {
|
|
122
|
-
/* We purposely use the same locationId because the Vike extension's config should only apply to where it's being extended from, for example:
|
|
123
|
-
```js
|
|
124
|
-
// /pages/admin/+config.js
|
|
125
|
-
|
|
126
|
-
import vikeVue from 'vike-vue/config'
|
|
127
|
-
// Should only apply to /pages/admin/**
|
|
128
|
-
export default { extends: [vikeVue] }
|
|
129
|
-
```
|
|
130
|
-
```js
|
|
131
|
-
// /pages/marketing/+config.js
|
|
132
|
-
|
|
133
|
-
import vikeReact from 'vike-react/config'
|
|
134
|
-
// Should only apply to /pages/marketing/**
|
|
135
|
-
export default { extends: [vikeReact] }
|
|
136
|
-
```
|
|
137
|
-
*/
|
|
138
|
-
const interfaceFile = getInterfaceFileFromConfigFile(extendsConfig, true, locationId, userRootDir);
|
|
139
|
-
assertExtensionsConventions(interfaceFile);
|
|
140
|
-
interfaceFilesAll[locationId].push(interfaceFile);
|
|
141
|
-
});
|
|
142
|
-
}),
|
|
143
|
-
// Value files
|
|
144
|
-
...valueFiles.map(async (filePath) => {
|
|
145
|
-
const { filePathAbsoluteUserRootDir } = filePath;
|
|
146
|
-
assert(filePathAbsoluteUserRootDir);
|
|
147
|
-
const configName = getConfigName(filePathAbsoluteUserRootDir);
|
|
148
|
-
assert(configName);
|
|
149
|
-
const locationId = getLocationId(filePathAbsoluteUserRootDir);
|
|
150
|
-
const interfaceFile = {
|
|
151
|
-
locationId,
|
|
152
|
-
filePath,
|
|
153
|
-
isConfigFile: false,
|
|
154
|
-
isValueFile: true,
|
|
155
|
-
isValueFileLoaded: false,
|
|
156
|
-
configName
|
|
157
|
-
};
|
|
158
|
-
interfaceFilesAll[locationId] = interfaceFilesAll[locationId] ?? [];
|
|
159
|
-
interfaceFilesAll[locationId].push(interfaceFile);
|
|
160
|
-
// We don't have access to the custom config definitions defined by the user yet.
|
|
161
|
-
// - If `configDef` is `undefined` => we load the file +{configName}.js later.
|
|
162
|
-
// - We already need to load +meta.js here (to get the custom config definitions defined by the user)
|
|
163
|
-
await loadValueFile(interfaceFile, configDefinitionsBuiltInAll, userRootDir, esbuildCache);
|
|
164
|
-
})
|
|
165
|
-
]);
|
|
166
|
-
assertKnownConfigs(interfaceFilesAll);
|
|
167
|
-
return interfaceFilesAll;
|
|
168
|
-
}
|
|
169
|
-
function getInterfaceFileFromConfigFile(configFile, isConfigExtension, locationId, userRootDir) {
|
|
170
|
-
const { fileExports, filePath, extendsFilePaths } = configFile;
|
|
171
|
-
const fileExportsByConfigName = {};
|
|
172
|
-
const pointerImportsByConfigName = {};
|
|
173
|
-
const fileExport = getConfigFileExport(fileExports, filePath.filePathToShowToUser);
|
|
174
|
-
Object.entries(fileExport).forEach(([configName, configValue]) => {
|
|
175
|
-
fileExportsByConfigName[configName] = configValue;
|
|
176
|
-
const pointerImport = resolvePointerImport(configValue, configFile.filePath, userRootDir, configName);
|
|
177
|
-
if (pointerImport) {
|
|
178
|
-
pointerImportsByConfigName[configName] = {
|
|
179
|
-
...pointerImport,
|
|
180
|
-
fileExportValueLoaded: false
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
const interfaceFile = {
|
|
185
|
-
locationId,
|
|
186
|
-
filePath,
|
|
187
|
-
fileExportsByConfigName,
|
|
188
|
-
pointerImportsByConfigName,
|
|
189
|
-
isConfigFile: true,
|
|
190
|
-
isValueFile: false,
|
|
191
|
-
isValueFileLoaded: true,
|
|
192
|
-
isConfigExtension,
|
|
193
|
-
extendsFilePaths
|
|
194
|
-
};
|
|
195
|
-
return interfaceFile;
|
|
196
|
-
}
|
|
197
93
|
async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePluginOptions, doNotRestartViteOnError) {
|
|
198
94
|
let hasError = false;
|
|
199
95
|
let ret;
|
|
@@ -238,9 +134,10 @@ async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePlug
|
|
|
238
134
|
}
|
|
239
135
|
async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
|
|
240
136
|
const esbuildCache = {};
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
-
const
|
|
137
|
+
const plusFilesAll = await getPlusFilesAll(userRootDir, esbuildCache);
|
|
138
|
+
assertKnownConfigs(plusFilesAll);
|
|
139
|
+
const configDefinitionsResolved = await resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache);
|
|
140
|
+
const { pageConfigGlobal, pageConfigs } = getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRootDir);
|
|
244
141
|
// interop vike(options) in vite.config.js
|
|
245
142
|
temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, userRootDir);
|
|
246
143
|
// global
|
|
@@ -248,19 +145,17 @@ async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
|
|
|
248
145
|
const global = getPageConfigUserFriendlyNew({ configValues });
|
|
249
146
|
return { pageConfigs, pageConfigGlobal, global };
|
|
250
147
|
}
|
|
251
|
-
async function resolveConfigDefinitions(
|
|
148
|
+
async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache) {
|
|
252
149
|
const configDefinitionsGlobal = getConfigDefinitions(
|
|
253
|
-
// We use `
|
|
254
|
-
|
|
255
|
-
(
|
|
256
|
-
await loadCustomConfigBuildTimeFiles(interfaceFilesAll, configDefinitionsGlobal, userRootDir, esbuildCache);
|
|
150
|
+
// We use `plusFilesAll` in order to allow local Vike extensions to create global configs.
|
|
151
|
+
sortForGlobal(plusFilesAll), (configDef) => !!configDef.global);
|
|
152
|
+
await loadCustomConfigBuildTimeFiles(plusFilesAll, configDefinitionsGlobal, userRootDir, esbuildCache);
|
|
257
153
|
const configDefinitionsLocal = {};
|
|
258
|
-
await Promise.all(objectEntries(
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
configDefinitionsLocal[locationId] = { configDefinitions, interfaceFiles, interfaceFilesRelevant };
|
|
154
|
+
await Promise.all(objectEntries(plusFilesAll).map(async ([locationId, plusFiles]) => {
|
|
155
|
+
const plusFilesRelevant = getPlusFilesRelevant(plusFilesAll, locationId);
|
|
156
|
+
const configDefinitions = getConfigDefinitions(plusFilesRelevant, (configDef) => configDef.global !== true);
|
|
157
|
+
await loadCustomConfigBuildTimeFiles(plusFiles, configDefinitions, userRootDir, esbuildCache);
|
|
158
|
+
configDefinitionsLocal[locationId] = { configDefinitions, plusFiles, plusFilesRelevant };
|
|
264
159
|
}));
|
|
265
160
|
const configDefinitionsResolved = {
|
|
266
161
|
configDefinitionsGlobal,
|
|
@@ -269,50 +164,48 @@ async function resolveConfigDefinitions(interfaceFilesAll, userRootDir, esbuildC
|
|
|
269
164
|
return configDefinitionsResolved;
|
|
270
165
|
}
|
|
271
166
|
// Load value files (with `env.config===true`) of *custom* configs.
|
|
272
|
-
// - The value files of *built-in* configs are already loaded at `
|
|
273
|
-
async function loadCustomConfigBuildTimeFiles(
|
|
274
|
-
const
|
|
275
|
-
await Promise.all(
|
|
276
|
-
if (
|
|
277
|
-
await loadValueFile(
|
|
167
|
+
// - The value files of *built-in* configs are already loaded at `getPlusFilesAll()`.
|
|
168
|
+
async function loadCustomConfigBuildTimeFiles(plusFiles, configDefinitions, userRootDir, esbuildCache) {
|
|
169
|
+
const plusFileList = Object.values(plusFiles).flat(1);
|
|
170
|
+
await Promise.all(plusFileList.map(async (plusFile) => {
|
|
171
|
+
if (!plusFile.isConfigFile) {
|
|
172
|
+
await loadValueFile(plusFile, configDefinitions, userRootDir, esbuildCache);
|
|
278
173
|
}
|
|
279
174
|
else {
|
|
280
|
-
await Promise.all(Object.entries(
|
|
175
|
+
await Promise.all(Object.entries(plusFile.pointerImportsByConfigName).map(async ([configName, pointerImport]) => {
|
|
281
176
|
await loadPointerImport(pointerImport, userRootDir, configName, configDefinitions, esbuildCache);
|
|
282
177
|
}));
|
|
283
178
|
}
|
|
284
179
|
}));
|
|
285
180
|
}
|
|
286
|
-
function
|
|
181
|
+
function getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRootDir) {
|
|
287
182
|
const pageConfigGlobal = {
|
|
288
183
|
configDefinitions: configDefinitionsResolved.configDefinitionsGlobal,
|
|
289
184
|
configValueSources: {}
|
|
290
185
|
};
|
|
291
186
|
objectEntries(configDefinitionsResolved.configDefinitionsGlobal).forEach(([configName, configDef]) => {
|
|
292
187
|
const sources = resolveConfigValueSources(configName, configDef,
|
|
293
|
-
// We use `
|
|
294
|
-
|
|
295
|
-
userRootDir, true);
|
|
188
|
+
// We use `plusFilesAll` in order to allow local Vike extensions to set the value of global configs (e.g. `vite`).
|
|
189
|
+
sortForGlobal(plusFilesAll), userRootDir, true);
|
|
296
190
|
if (sources.length === 0)
|
|
297
191
|
return;
|
|
298
192
|
pageConfigGlobal.configValueSources[configName] = sources;
|
|
299
193
|
});
|
|
300
|
-
assertPageConfigGlobal(pageConfigGlobal,
|
|
194
|
+
assertPageConfigGlobal(pageConfigGlobal, plusFilesAll);
|
|
301
195
|
const pageConfigs = objectEntries(configDefinitionsResolved.configDefinitionsLocal)
|
|
302
|
-
.filter(([_locationId, {
|
|
303
|
-
.map(([locationId, { configDefinitions,
|
|
196
|
+
.filter(([_locationId, { plusFiles }]) => isDefiningPage(plusFiles))
|
|
197
|
+
.map(([locationId, { configDefinitions, plusFilesRelevant }]) => {
|
|
304
198
|
const configDefinitionsLocal = configDefinitions;
|
|
305
|
-
|
|
199
|
+
const configValueSources = {};
|
|
306
200
|
objectEntries(configDefinitionsLocal)
|
|
307
201
|
.filter(([_configName, configDef]) => configDef.global !== true)
|
|
308
202
|
.forEach(([configName, configDef]) => {
|
|
309
|
-
const sources = resolveConfigValueSources(configName, configDef,
|
|
203
|
+
const sources = resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, false);
|
|
204
|
+
// sortConfigValueSources(sources, locationId)
|
|
310
205
|
if (sources.length === 0)
|
|
311
206
|
return;
|
|
312
|
-
// assertUsage(!isGlobalConfig(configName, configDefinitionsLocal, sources), 'TODO') // TODO/now
|
|
313
207
|
configValueSources[configName] = sources;
|
|
314
208
|
});
|
|
315
|
-
configValueSources = sortConfigValueSources(configValueSources, locationId);
|
|
316
209
|
const { routeFilesystem, isErrorPage } = determineRouteFilesystem(locationId, configValueSources);
|
|
317
210
|
applyEffectsAll(configValueSources, configDefinitionsLocal);
|
|
318
211
|
const configValuesComputed = getComputed(configValueSources, configDefinitionsLocal);
|
|
@@ -321,7 +214,7 @@ function getPageConfigs(configDefinitionsResolved, interfaceFilesAll, userRootDi
|
|
|
321
214
|
isErrorPage,
|
|
322
215
|
routeFilesystem,
|
|
323
216
|
configDefinitions: configDefinitionsLocal,
|
|
324
|
-
|
|
217
|
+
plusFiles: plusFilesRelevant,
|
|
325
218
|
configValueSources,
|
|
326
219
|
configValuesComputed
|
|
327
220
|
};
|
|
@@ -330,34 +223,34 @@ function getPageConfigs(configDefinitionsResolved, interfaceFilesAll, userRootDi
|
|
|
330
223
|
assertPageConfigs(pageConfigs);
|
|
331
224
|
return { pageConfigs, pageConfigGlobal };
|
|
332
225
|
}
|
|
333
|
-
function assertPageConfigGlobal(pageConfigGlobal,
|
|
226
|
+
function assertPageConfigGlobal(pageConfigGlobal, plusFilesAll) {
|
|
334
227
|
Object.entries(pageConfigGlobal.configValueSources).forEach(([configName, sources]) => {
|
|
335
|
-
assertGlobalConfigLocation(configName, sources,
|
|
228
|
+
assertGlobalConfigLocation(configName, sources, plusFilesAll, pageConfigGlobal.configDefinitions);
|
|
336
229
|
});
|
|
337
230
|
}
|
|
338
|
-
function assertGlobalConfigLocation(configName, sources,
|
|
339
|
-
const locationIdsAll = objectKeys(
|
|
231
|
+
function assertGlobalConfigLocation(configName, sources, plusFilesAll, configDefinitionsGlobal) {
|
|
232
|
+
const locationIdsAll = objectKeys(plusFilesAll);
|
|
340
233
|
// Determine existing global +config.js files
|
|
341
234
|
const configFilePathsGlobal = [];
|
|
342
|
-
const
|
|
343
|
-
|
|
235
|
+
const plusFilesGlobal = Object.values(objectFromEntries(objectEntries(plusFilesAll).filter(([locationId]) => isGlobalLocation(locationId, locationIdsAll)))).flat();
|
|
236
|
+
plusFilesGlobal
|
|
344
237
|
.filter((i) => i.isConfigFile)
|
|
345
|
-
.forEach((
|
|
346
|
-
const { filePathAbsoluteUserRootDir } =
|
|
238
|
+
.forEach((plusFile) => {
|
|
239
|
+
const { filePathAbsoluteUserRootDir } = plusFile.filePath;
|
|
347
240
|
if (filePathAbsoluteUserRootDir) {
|
|
348
241
|
configFilePathsGlobal.push(filePathAbsoluteUserRootDir);
|
|
349
242
|
}
|
|
350
243
|
});
|
|
351
244
|
// Call assertWarning()
|
|
352
245
|
sources.forEach((source) => {
|
|
353
|
-
const {
|
|
246
|
+
const { plusFile } = source;
|
|
354
247
|
// It's `null` when the config is defined by `vike(options)` in vite.config.js
|
|
355
|
-
assert(
|
|
356
|
-
const { filePathAbsoluteUserRootDir } =
|
|
248
|
+
assert(plusFile);
|
|
249
|
+
const { filePathAbsoluteUserRootDir } = plusFile.filePath;
|
|
357
250
|
// Allow local Vike extensions to set gloabl configs (`filePathAbsoluteUserRootDir===null` for Vike extension)
|
|
358
251
|
if (!filePathAbsoluteUserRootDir)
|
|
359
252
|
return;
|
|
360
|
-
assert(!
|
|
253
|
+
assert(!plusFile.isExtensionConfig);
|
|
361
254
|
if (!isGlobalLocation(source.locationId, locationIdsAll)) {
|
|
362
255
|
const configDef = configDefinitionsGlobal[configName];
|
|
363
256
|
assert(configDef);
|
|
@@ -424,10 +317,11 @@ function temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, use
|
|
|
424
317
|
assertWarning(Object.keys(vikeVitePluginOptions).length === 0, `Define Vike settings in +config.js instead of vite.config.js ${pc.underline('https://vike.dev/migration/settings')}`, { onlyOnce: true });
|
|
425
318
|
Object.entries(vikeVitePluginOptions).forEach(([configName, value]) => {
|
|
426
319
|
var _a;
|
|
427
|
-
assert(includes(objectKeys(
|
|
428
|
-
const configDef =
|
|
320
|
+
assert(includes(objectKeys(configDefinitionsBuiltIn), configName));
|
|
321
|
+
const configDef = configDefinitionsBuiltIn[configName];
|
|
429
322
|
const sources = ((_a = pageConfigGlobal.configValueSources)[configName] ?? (_a[configName] = []));
|
|
430
323
|
sources.push({
|
|
324
|
+
valueIsLoaded: true,
|
|
431
325
|
value,
|
|
432
326
|
configEnv: configDef.env,
|
|
433
327
|
definedAtFilePath: {
|
|
@@ -438,108 +332,130 @@ function temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, use
|
|
|
438
332
|
fileExportPathToShowToUser: null
|
|
439
333
|
},
|
|
440
334
|
locationId: '/',
|
|
441
|
-
|
|
335
|
+
plusFile: null,
|
|
442
336
|
isOverriden: configDef.cumulative ? false : sources.length > 0,
|
|
443
337
|
valueIsImportedAtRuntime: false,
|
|
444
338
|
valueIsDefinedByPlusFile: false
|
|
445
339
|
});
|
|
446
340
|
});
|
|
447
341
|
}
|
|
448
|
-
function
|
|
449
|
-
const
|
|
342
|
+
function getPlusFilesRelevant(plusFilesAll, locationIdPage) {
|
|
343
|
+
const plusFilesRelevant = Object.fromEntries(objectEntries(plusFilesAll)
|
|
450
344
|
.filter(([locationId]) => {
|
|
451
345
|
return isInherited(locationId, locationIdPage);
|
|
452
346
|
})
|
|
347
|
+
// Sort after config inheritance.
|
|
348
|
+
// - Together with getPlusFilesOrdered() this implements the whole order of config inheritance.
|
|
349
|
+
// - See sortForGlobal() for global configs order.
|
|
453
350
|
.sort(([locationId1], [locationId2]) => sortAfterInheritanceOrder(locationId1, locationId2, locationIdPage)));
|
|
454
|
-
return
|
|
351
|
+
return plusFilesRelevant;
|
|
352
|
+
}
|
|
353
|
+
function sortForGlobal(plusFilesAll) {
|
|
354
|
+
const locationIdsAll = objectKeys(plusFilesAll);
|
|
355
|
+
const plusFilesAllSorted = Object.fromEntries(objectEntries(plusFilesAll)
|
|
356
|
+
.sort(lowerFirst(([locationId]) => locationId.split('/').length))
|
|
357
|
+
.sort(makeFirst(([locationId]) => isGlobalLocation(locationId, locationIdsAll))));
|
|
358
|
+
return plusFilesAllSorted;
|
|
359
|
+
}
|
|
360
|
+
function resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, isGlobal) {
|
|
361
|
+
const plusFilesOrdered = getPlusFilesOrdered(configName, plusFilesRelevant);
|
|
362
|
+
let sources = plusFilesOrdered.map((plusFile, i) => {
|
|
363
|
+
const isHighestInheritancePrecedence = i === 0;
|
|
364
|
+
const configValueSource = getConfigValueSource(configName, plusFile, configDef, userRootDir, isHighestInheritancePrecedence);
|
|
365
|
+
return configValueSource;
|
|
366
|
+
});
|
|
367
|
+
if (isCallable(configDef.global)) {
|
|
368
|
+
const isGlobalValue = configDef.global;
|
|
369
|
+
assert(configDef.env.config);
|
|
370
|
+
sources = sources.filter((source) => {
|
|
371
|
+
assert(source.configEnv.config);
|
|
372
|
+
assert(source.valueIsLoaded);
|
|
373
|
+
const valueIsGlobal = isGlobalValue(source.value);
|
|
374
|
+
return isGlobal ? valueIsGlobal : !valueIsGlobal;
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
return sources;
|
|
455
378
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
const
|
|
465
|
-
assert(!visited.has(
|
|
466
|
-
visited.add(
|
|
467
|
-
|
|
468
|
-
interfaceFilesSource.push({ interfaceFile, isHighestInheritancePrecedence });
|
|
379
|
+
// Together with sortAfterInheritanceOrder() this implements the whole order of config inheritance.
|
|
380
|
+
function getPlusFilesOrdered(configName, plusFilesRelevant) {
|
|
381
|
+
const plusFilesOrdered = [];
|
|
382
|
+
// `plusFilesRelevant` is already sorted by sortAfterInheritanceOrder() at getPlusFilesRelevant()
|
|
383
|
+
// `plusFilesAtLocationId` is already sorted by sortMakeDeterministic() at getPlusFilesAll()
|
|
384
|
+
for (const plusFilesAtLocationId of Object.values(plusFilesRelevant)) {
|
|
385
|
+
const plusFilesForConfigName = plusFilesAtLocationId.filter((plusFile) => getDefiningConfigNames(plusFile).includes(configName));
|
|
386
|
+
// We populate `plusFilesOrdered` with inheritance order.
|
|
387
|
+
const populate = (plusFile) => {
|
|
388
|
+
assert(!visited.has(plusFile));
|
|
389
|
+
visited.add(plusFile);
|
|
390
|
+
plusFilesOrdered.push(plusFile);
|
|
469
391
|
};
|
|
470
|
-
|
|
392
|
+
const visited = new WeakSet();
|
|
393
|
+
// ========================
|
|
394
|
+
// User-land config (first)
|
|
395
|
+
// ========================
|
|
471
396
|
{
|
|
472
|
-
const
|
|
473
|
-
.filter((interfaceFile) => interfaceFile.isValueFile &&
|
|
397
|
+
const plusFilesValue = plusFilesForConfigName.filter((plusFile) => !plusFile.isConfigFile &&
|
|
474
398
|
// We consider side-effect configs (e.g. `export { frontmatter }` of .mdx files) later (i.e. with less priority)
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
.
|
|
479
|
-
// We consider values from extensions (e.g. vike-react) later (i.e. with less priority)
|
|
480
|
-
!interfaceFile.isConfigExtension)
|
|
481
|
-
.sort(makeOrderDeterministic);
|
|
482
|
-
const interfaceValueFile = interfaceValueFiles[0];
|
|
483
|
-
const interfaceConfigFile = interfaceConfigFiles[0];
|
|
399
|
+
plusFile.configName === configName);
|
|
400
|
+
const plusFilesConfig = plusFilesForConfigName.filter((plusFile) => plusFile.isConfigFile &&
|
|
401
|
+
// We consider extensions (e.g. vike-react) later (i.e. with less priority)
|
|
402
|
+
!plusFile.isExtensionConfig);
|
|
484
403
|
// Make this value:
|
|
485
404
|
// /pages/some-page/+{configName}.js > `export default`
|
|
486
405
|
// override that value:
|
|
487
406
|
// /pages/some-page/+config.js > `export default { someConfig }`
|
|
488
|
-
const
|
|
489
|
-
if (
|
|
490
|
-
const
|
|
491
|
-
// A user-land conflict of
|
|
492
|
-
|
|
493
|
-
[
|
|
494
|
-
|
|
407
|
+
const plusFileWinner = plusFilesValue[0] ?? plusFilesConfig[0];
|
|
408
|
+
if (plusFileWinner) {
|
|
409
|
+
const plusFilesOverriden = [...plusFilesValue, ...plusFilesConfig].filter((f) => f !== plusFileWinner);
|
|
410
|
+
// A user-land conflict of plusFiles with the same `locationId` (we are iterating over `plusFilesRelevant: PlusFilesByLocationId`) means that the user has superfluously defined the config twice; the user should remove such redundancy as it makes things unnecessarily ambiguous.
|
|
411
|
+
assertOverwrittenConfigFile(plusFileWinner, plusFilesOverriden, configName);
|
|
412
|
+
[plusFileWinner, ...plusFilesOverriden].forEach((plusFile) => {
|
|
413
|
+
assert(plusFile.filePath.filePathAbsoluteUserRootDir); // ensure it's a user-land plus file
|
|
414
|
+
populate(plusFile);
|
|
495
415
|
});
|
|
496
416
|
}
|
|
497
417
|
}
|
|
498
|
-
//
|
|
499
|
-
|
|
500
|
-
|
|
418
|
+
// ==========================
|
|
419
|
+
// Side-effect configs (next)
|
|
420
|
+
// ==========================
|
|
421
|
+
// - For example `export { frontmatter }` of `.mdx` files.
|
|
422
|
+
// - This only considers side-effect configs that are already loaded at build-time. (E.g. it actually doesn't consider `export { frontmatter }` of .mdx files since .mdx files are loaded only at runtime.)
|
|
423
|
+
plusFilesForConfigName
|
|
424
|
+
.filter((plusFile) => !plusFile.isConfigFile &&
|
|
501
425
|
// Is side-effect config
|
|
502
|
-
|
|
503
|
-
.forEach((
|
|
504
|
-
|
|
426
|
+
plusFile.configName !== configName)
|
|
427
|
+
.forEach((plusFile) => {
|
|
428
|
+
assert(plusFile.filePath.filePathAbsoluteUserRootDir); // ensure it's a user-land plus file
|
|
429
|
+
populate(plusFile);
|
|
505
430
|
});
|
|
506
|
-
//
|
|
507
|
-
|
|
508
|
-
|
|
431
|
+
// ========================
|
|
432
|
+
// Extensions config (last)
|
|
433
|
+
// ========================
|
|
434
|
+
plusFilesForConfigName
|
|
435
|
+
.filter((plusFile) => plusFile.isConfigFile && plusFile.isExtensionConfig)
|
|
509
436
|
// Extension config files are already sorted by inheritance order
|
|
510
|
-
.forEach((
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
interfaceFilesDefiningConfig.forEach((interfaceFile) => {
|
|
514
|
-
assert(visited.has(interfaceFile));
|
|
437
|
+
.forEach((plusFile) => {
|
|
438
|
+
assert(!plusFile.filePath.filePathAbsoluteUserRootDir); // ensure it isn't a user-land plus file
|
|
439
|
+
populate(plusFile);
|
|
515
440
|
});
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
if (isCallable(configDef.global)) {
|
|
522
|
-
const isGlobalValue = configDef.global;
|
|
523
|
-
assert(configDef.env.config);
|
|
524
|
-
sources = sources.filter((source) => {
|
|
525
|
-
assert(source.configEnv.config);
|
|
526
|
-
// TODO/now: source.valueIsDefined
|
|
527
|
-
assert('value' in source);
|
|
528
|
-
const valueIsGlobal = isGlobalValue(source.value);
|
|
529
|
-
return isGlobal ? valueIsGlobal : !valueIsGlobal;
|
|
441
|
+
// ======
|
|
442
|
+
// Assert we didn't miss any config.
|
|
443
|
+
// ======
|
|
444
|
+
plusFilesForConfigName.forEach((plusFile) => {
|
|
445
|
+
assert(visited.has(plusFile));
|
|
530
446
|
});
|
|
531
447
|
}
|
|
532
|
-
return
|
|
448
|
+
return plusFilesOrdered;
|
|
533
449
|
}
|
|
534
|
-
function getConfigValueSource(configName,
|
|
535
|
-
const confVal = getConfVal(
|
|
450
|
+
function getConfigValueSource(configName, plusFile, configDef, userRootDir, isHighestInheritancePrecedence) {
|
|
451
|
+
const confVal = getConfVal(plusFile, configName);
|
|
536
452
|
assert(confVal);
|
|
537
453
|
const configValueSourceCommon = {
|
|
538
|
-
locationId:
|
|
539
|
-
|
|
454
|
+
locationId: plusFile.locationId,
|
|
455
|
+
plusFile
|
|
540
456
|
};
|
|
541
457
|
const definedAtFilePath_ = {
|
|
542
|
-
...
|
|
458
|
+
...plusFile.filePath,
|
|
543
459
|
fileExportPathToShowToUser: ['default', configName]
|
|
544
460
|
};
|
|
545
461
|
const isOverriden = configDef.cumulative ? false : !isHighestInheritancePrecedence;
|
|
@@ -547,10 +463,10 @@ function getConfigValueSource(configName, interfaceFile, configDef, userRootDir,
|
|
|
547
463
|
if (configDef._valueIsFilePath) {
|
|
548
464
|
let definedAtFilePath;
|
|
549
465
|
let valueFilePath;
|
|
550
|
-
if (
|
|
466
|
+
if (plusFile.isConfigFile) {
|
|
551
467
|
// Defined over pointer import
|
|
552
468
|
assert(confVal.configValueLoaded);
|
|
553
|
-
const pointerImport = resolvePointerImport(confVal.configValue,
|
|
469
|
+
const pointerImport = resolvePointerImport(confVal.configValue, plusFile.filePath, userRootDir, configName);
|
|
554
470
|
const configDefinedAt = getConfigDefinedAt('Config', configName, definedAtFilePath_);
|
|
555
471
|
assertUsage(pointerImport, `${configDefinedAt} should be an import`);
|
|
556
472
|
valueFilePath = pointerImport.fileExportPath.filePathAbsoluteVite;
|
|
@@ -558,15 +474,16 @@ function getConfigValueSource(configName, interfaceFile, configDef, userRootDir,
|
|
|
558
474
|
}
|
|
559
475
|
else {
|
|
560
476
|
// Defined by value file, i.e. +{configName}.js
|
|
561
|
-
assert(
|
|
562
|
-
valueFilePath =
|
|
477
|
+
assert(!plusFile.isConfigFile);
|
|
478
|
+
valueFilePath = plusFile.filePath.filePathAbsoluteVite;
|
|
563
479
|
definedAtFilePath = {
|
|
564
|
-
...
|
|
480
|
+
...plusFile.filePath,
|
|
565
481
|
fileExportPathToShowToUser: []
|
|
566
482
|
};
|
|
567
483
|
}
|
|
568
484
|
const configValueSource = {
|
|
569
485
|
...configValueSourceCommon,
|
|
486
|
+
valueIsLoaded: true,
|
|
570
487
|
value: valueFilePath,
|
|
571
488
|
valueIsFilePath: true,
|
|
572
489
|
configEnv: configDef.env,
|
|
@@ -578,29 +495,35 @@ function getConfigValueSource(configName, interfaceFile, configDef, userRootDir,
|
|
|
578
495
|
return configValueSource;
|
|
579
496
|
}
|
|
580
497
|
// +config.js
|
|
581
|
-
if (
|
|
498
|
+
if (plusFile.isConfigFile) {
|
|
582
499
|
assert(confVal.configValueLoaded);
|
|
583
500
|
const { configValue } = confVal;
|
|
584
501
|
// Defined over pointer import
|
|
585
|
-
const pointerImport =
|
|
502
|
+
const pointerImport = plusFile.pointerImportsByConfigName[configName];
|
|
586
503
|
if (pointerImport) {
|
|
504
|
+
const value = pointerImport.fileExportValueLoaded
|
|
505
|
+
? {
|
|
506
|
+
valueIsLoaded: true,
|
|
507
|
+
value: pointerImport.fileExportValue
|
|
508
|
+
}
|
|
509
|
+
: {
|
|
510
|
+
valueIsLoaded: false
|
|
511
|
+
};
|
|
587
512
|
const configValueSource = {
|
|
588
513
|
...configValueSourceCommon,
|
|
514
|
+
...value,
|
|
589
515
|
configEnv: resolveConfigEnv(configDef.env, pointerImport.fileExportPath),
|
|
590
516
|
valueIsImportedAtRuntime: true,
|
|
591
517
|
valueIsDefinedByPlusFile: false,
|
|
592
518
|
isOverriden,
|
|
593
519
|
definedAtFilePath: pointerImport.fileExportPath
|
|
594
520
|
};
|
|
595
|
-
if (pointerImport.fileExportValueLoaded) {
|
|
596
|
-
configValueSource.value = pointerImport.fileExportValue;
|
|
597
|
-
assert('fileExportValue' in pointerImport);
|
|
598
|
-
}
|
|
599
521
|
return configValueSource;
|
|
600
522
|
}
|
|
601
523
|
// Defined inside +config.js
|
|
602
524
|
const configValueSource = {
|
|
603
525
|
...configValueSourceCommon,
|
|
526
|
+
valueIsLoaded: true,
|
|
604
527
|
value: configValue,
|
|
605
528
|
configEnv: configDef.env,
|
|
606
529
|
valueIsImportedAtRuntime: false,
|
|
@@ -611,53 +534,48 @@ function getConfigValueSource(configName, interfaceFile, configDef, userRootDir,
|
|
|
611
534
|
return configValueSource;
|
|
612
535
|
}
|
|
613
536
|
// Defined by value file, i.e. +{configName}.js
|
|
614
|
-
if (
|
|
615
|
-
const configEnvResolved = resolveConfigEnv(configDef.env,
|
|
537
|
+
if (!plusFile.isConfigFile) {
|
|
538
|
+
const configEnvResolved = resolveConfigEnv(configDef.env, plusFile.filePath);
|
|
616
539
|
const valueAlreadyLoaded = confVal.configValueLoaded;
|
|
617
540
|
assert(valueAlreadyLoaded === !!configEnvResolved.config);
|
|
541
|
+
const value = valueAlreadyLoaded
|
|
542
|
+
? {
|
|
543
|
+
valueIsLoaded: true,
|
|
544
|
+
value: confVal.configValue
|
|
545
|
+
}
|
|
546
|
+
: {
|
|
547
|
+
valueIsLoaded: false
|
|
548
|
+
};
|
|
618
549
|
const configValueSource = {
|
|
619
550
|
...configValueSourceCommon,
|
|
551
|
+
...value,
|
|
620
552
|
configEnv: configEnvResolved,
|
|
621
553
|
valueIsImportedAtRuntime: !valueAlreadyLoaded,
|
|
622
554
|
valueIsDefinedByPlusFile: true,
|
|
623
555
|
isOverriden,
|
|
624
556
|
definedAtFilePath: {
|
|
625
|
-
...
|
|
626
|
-
fileExportPathToShowToUser: configName ===
|
|
557
|
+
...plusFile.filePath,
|
|
558
|
+
fileExportPathToShowToUser: configName === plusFile.configName
|
|
627
559
|
? []
|
|
628
560
|
: // Side-effect config (e.g. `export { frontmatter }` of .md files)
|
|
629
561
|
[configName]
|
|
630
562
|
}
|
|
631
563
|
};
|
|
632
|
-
if (valueAlreadyLoaded) {
|
|
633
|
-
configValueSource.value = confVal.configValue;
|
|
634
|
-
}
|
|
635
564
|
return configValueSource;
|
|
636
565
|
}
|
|
637
566
|
assert(false);
|
|
638
567
|
}
|
|
639
|
-
function
|
|
640
|
-
|
|
641
|
-
const
|
|
642
|
-
|
|
643
|
-
assert(filePathAbsoluteUserRootDir);
|
|
644
|
-
return filePathAbsoluteUserRootDir.length;
|
|
645
|
-
})(interfaceFile1, interfaceFile2);
|
|
646
|
-
}
|
|
647
|
-
function warnOverridenConfigValues(interfaceFileWinner, interfaceFilesOverriden, configName) {
|
|
648
|
-
interfaceFilesOverriden.forEach((interfaceFileLoser) => {
|
|
649
|
-
const loserFilePath = interfaceFileLoser.filePath.filePathToShowToUser;
|
|
650
|
-
const winnerFilePath = interfaceFileWinner.filePath.filePathToShowToUser;
|
|
568
|
+
function assertOverwrittenConfigFile(plusFileWinner, plusFilesOverriden, configName) {
|
|
569
|
+
plusFilesOverriden.forEach((plusFileLoser) => {
|
|
570
|
+
const loserFilePath = plusFileLoser.filePath.filePathToShowToUser;
|
|
571
|
+
const winnerFilePath = plusFileWinner.filePath.filePathToShowToUser;
|
|
651
572
|
const confName = pc.cyan(configName);
|
|
652
573
|
assertWarning(false, `The value of the config ${confName} defined at ${loserFilePath} is always overwritten by the value defined at ${winnerFilePath}, remove the superfluous value defined at ${loserFilePath}`, { onlyOnce: true });
|
|
653
574
|
});
|
|
654
575
|
}
|
|
655
|
-
function
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
function isDefiningPage(interfaceFiles) {
|
|
659
|
-
for (const interfaceFile of interfaceFiles) {
|
|
660
|
-
const configNames = getDefiningConfigNames(interfaceFile);
|
|
576
|
+
function isDefiningPage(plusFiles) {
|
|
577
|
+
for (const plusFile of plusFiles) {
|
|
578
|
+
const configNames = getDefiningConfigNames(plusFile);
|
|
661
579
|
if (configNames.some((configName) => isDefiningPageConfig(configName))) {
|
|
662
580
|
return true;
|
|
663
581
|
}
|
|
@@ -667,37 +585,37 @@ function isDefiningPage(interfaceFiles) {
|
|
|
667
585
|
function isDefiningPageConfig(configName) {
|
|
668
586
|
return ['Page', 'route'].includes(configName);
|
|
669
587
|
}
|
|
670
|
-
function getDefiningConfigNames(
|
|
588
|
+
function getDefiningConfigNames(plusFile) {
|
|
671
589
|
let configNames = [];
|
|
672
|
-
if (
|
|
673
|
-
configNames.push(
|
|
590
|
+
if (!plusFile.isConfigFile) {
|
|
591
|
+
configNames.push(plusFile.configName);
|
|
674
592
|
}
|
|
675
|
-
if (
|
|
676
|
-
configNames.push(...Object.keys(
|
|
593
|
+
if (!plusFile.isNotLoaded) {
|
|
594
|
+
configNames.push(...Object.keys(plusFile.fileExportsByConfigName));
|
|
677
595
|
}
|
|
678
596
|
configNames = unique(configNames);
|
|
679
597
|
return configNames;
|
|
680
598
|
}
|
|
681
|
-
function getConfigDefinitions(
|
|
682
|
-
let configDefinitions = { ...
|
|
599
|
+
function getConfigDefinitions(plusFilesRelevant, filter) {
|
|
600
|
+
let configDefinitions = { ...configDefinitionsBuiltIn };
|
|
683
601
|
// Add user-land meta configs
|
|
684
|
-
Object.entries(
|
|
602
|
+
Object.entries(plusFilesRelevant)
|
|
685
603
|
.reverse()
|
|
686
|
-
.forEach(([_locationId,
|
|
687
|
-
|
|
688
|
-
const confVal = getConfVal(
|
|
604
|
+
.forEach(([_locationId, plusFiles]) => {
|
|
605
|
+
plusFiles.forEach((plusFile) => {
|
|
606
|
+
const confVal = getConfVal(plusFile, 'meta');
|
|
689
607
|
if (!confVal)
|
|
690
608
|
return;
|
|
691
609
|
assert(confVal.configValueLoaded);
|
|
692
610
|
const meta = confVal.configValue;
|
|
693
|
-
assertMetaUsage(meta, `Config ${pc.cyan('meta')} defined at ${
|
|
611
|
+
assertMetaUsage(meta, `Config ${pc.cyan('meta')} defined at ${plusFile.filePath.filePathToShowToUser}`);
|
|
694
612
|
// Set configDef._userEffectDefinedAtFilePath
|
|
695
613
|
Object.entries(meta).forEach(([configName, configDef]) => {
|
|
696
614
|
if (!configDef.effect)
|
|
697
615
|
return;
|
|
698
|
-
assert(
|
|
616
|
+
assert(plusFile.isConfigFile);
|
|
699
617
|
configDef._userEffectDefinedAtFilePath = {
|
|
700
|
-
...
|
|
618
|
+
...plusFile.filePath,
|
|
701
619
|
fileExportPathToShowToUser: ['default', 'meta', configName, 'effect']
|
|
702
620
|
};
|
|
703
621
|
});
|
|
@@ -829,66 +747,29 @@ function getComputed(configValueSources, configDefinitions) {
|
|
|
829
747
|
});
|
|
830
748
|
return configValuesComputed;
|
|
831
749
|
}
|
|
832
|
-
async function findPlusFiles(userRootDir, outDirRoot) {
|
|
833
|
-
const files = await crawlPlusFiles(userRootDir, outDirRoot);
|
|
834
|
-
const plusFiles = files.map(({ filePathAbsoluteUserRootDir }) => getFilePathResolved({ filePathAbsoluteUserRootDir, userRootDir }));
|
|
835
|
-
return plusFiles;
|
|
836
|
-
}
|
|
837
|
-
function getConfigName(filePath) {
|
|
838
|
-
assertPosixPath(filePath);
|
|
839
|
-
if (isTemporaryBuildFile(filePath))
|
|
840
|
-
return null;
|
|
841
|
-
const fileName = path.posix.basename(filePath);
|
|
842
|
-
// assertNoUnexpectedPlusSign(filePath, fileName)
|
|
843
|
-
const basename = fileName.split('.')[0];
|
|
844
|
-
if (!basename.startsWith('+')) {
|
|
845
|
-
return null;
|
|
846
|
-
}
|
|
847
|
-
else {
|
|
848
|
-
const configName = basename.slice(1);
|
|
849
|
-
assertUsage(configName !== '', `${filePath} Invalid filename ${fileName}`);
|
|
850
|
-
return configName;
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
/* https://github.com/vikejs/vike/issues/1407
|
|
854
|
-
function assertNoUnexpectedPlusSign(filePath: string, fileName: string) {
|
|
855
|
-
const dirs = path.posix.dirname(filePath).split('/')
|
|
856
|
-
dirs.forEach((dir, i) => {
|
|
857
|
-
const dirPath = dirs.slice(0, i + 1).join('/')
|
|
858
|
-
assertUsage(
|
|
859
|
-
!dir.includes('+'),
|
|
860
|
-
`Character '+' is a reserved character: remove '+' from the directory name ${dirPath}/`
|
|
861
|
-
)
|
|
862
|
-
})
|
|
863
|
-
assertUsage(
|
|
864
|
-
!fileName.slice(1).includes('+'),
|
|
865
|
-
`Character '+' is only allowed at the beginning of filenames: make sure ${filePath} doesn't contain any '+' in its filename other than its first letter`
|
|
866
|
-
)
|
|
867
|
-
}
|
|
868
|
-
*/
|
|
869
750
|
// Show error message upon unknown config
|
|
870
|
-
function assertKnownConfigs(
|
|
871
|
-
const configDefinitionsAll = getConfigDefinitions(
|
|
751
|
+
function assertKnownConfigs(plusFilesAll) {
|
|
752
|
+
const configDefinitionsAll = getConfigDefinitions(plusFilesAll);
|
|
872
753
|
const configNamesKnownAll = Object.keys(configDefinitionsAll);
|
|
873
|
-
objectEntries(
|
|
874
|
-
const
|
|
875
|
-
const configDefinitionsLocal = getConfigDefinitions(
|
|
754
|
+
objectEntries(plusFilesAll).forEach(([locationId, plusFiles]) => {
|
|
755
|
+
const plusFilesRelevant = getPlusFilesRelevant(plusFilesAll, locationId);
|
|
756
|
+
const configDefinitionsLocal = getConfigDefinitions(plusFilesRelevant);
|
|
876
757
|
const configNamesKnownLocal = Object.keys(configDefinitionsLocal);
|
|
877
|
-
|
|
878
|
-
const configNames = getDefiningConfigNames(
|
|
758
|
+
plusFiles.forEach((plusFile) => {
|
|
759
|
+
const configNames = getDefiningConfigNames(plusFile);
|
|
879
760
|
configNames.forEach((configName) => {
|
|
880
|
-
assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal,
|
|
761
|
+
assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal, plusFile);
|
|
881
762
|
assert(configNamesKnownLocal.includes(configName));
|
|
882
763
|
assert(configNamesKnownAll.includes(configName));
|
|
883
764
|
});
|
|
884
765
|
});
|
|
885
766
|
});
|
|
886
767
|
}
|
|
887
|
-
function assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal,
|
|
768
|
+
function assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal, plusFile) {
|
|
888
769
|
if (configNamesKnownLocal.includes(configName))
|
|
889
770
|
return;
|
|
890
771
|
const configNameColored = pc.cyan(configName);
|
|
891
|
-
const { locationId, filePath: { filePathToShowToUser } } =
|
|
772
|
+
const { locationId, filePath: { filePathToShowToUser } } = plusFile;
|
|
892
773
|
const errMsg = `${filePathToShowToUser} sets an unknown config ${configNameColored}`;
|
|
893
774
|
// Inheritance issue: config is known but isn't defined at `locationId`
|
|
894
775
|
if (configNamesKnownAll.includes(configName)) {
|
|
@@ -978,9 +859,6 @@ function determineIsErrorPage(routeFilesystem) {
|
|
|
978
859
|
assertPosixPath(routeFilesystem);
|
|
979
860
|
return routeFilesystem.split('/').includes('_error');
|
|
980
861
|
}
|
|
981
|
-
function isVikeConfigFile(filePath) {
|
|
982
|
-
return !!getConfigName(filePath);
|
|
983
|
-
}
|
|
984
862
|
function getConfigEnvValue(val, errMsgIntro) {
|
|
985
863
|
const errInvalidValue = `${errMsgIntro} an invalid value ${pc.cyan(JSON.stringify(val))}`;
|
|
986
864
|
// Legacy outdated values
|
|
@@ -1020,29 +898,13 @@ function getConfigEnvValue(val, errMsgIntro) {
|
|
|
1020
898
|
function getConfigDefinitionOptional(configDefinitions, configName) {
|
|
1021
899
|
return configDefinitions[configName] ?? null;
|
|
1022
900
|
}
|
|
1023
|
-
function
|
|
1024
|
-
|
|
1025
|
-
// Make order deterministic (no other purpose)
|
|
1026
|
-
.sort(([, [source1]], [, [source2]]) => source1.definedAtFilePath.filePathAbsoluteVite < source2.definedAtFilePath.filePathAbsoluteVite ? -1 : 1)
|
|
1027
|
-
// Sort after whether the config value was defined by an npm package
|
|
1028
|
-
.sort(makeFirst(([, [source]]) => {
|
|
1029
|
-
const { importPathAbsolute } = source.definedAtFilePath;
|
|
1030
|
-
return (!!importPathAbsolute &&
|
|
1031
|
-
isNpmPackageImport(importPathAbsolute, {
|
|
1032
|
-
// Vike config files don't support path aliases. (If they do one day, then Vike will/should be able to resolve path aliases.)
|
|
1033
|
-
cannotBePathAlias: true
|
|
1034
|
-
}));
|
|
1035
|
-
}))
|
|
1036
|
-
// Sort after the filesystem inheritance of the config value
|
|
1037
|
-
.sort(([, [source1]], [, [source2]]) => reverse(sortAfterInheritanceOrder(source1.locationId, source2.locationId, locationIdPage))));
|
|
1038
|
-
}
|
|
1039
|
-
function getConfVal(interfaceFile, configName) {
|
|
1040
|
-
const configNames = getDefiningConfigNames(interfaceFile);
|
|
901
|
+
function getConfVal(plusFile, configName) {
|
|
902
|
+
const configNames = getDefiningConfigNames(plusFile);
|
|
1041
903
|
if (!configNames.includes(configName))
|
|
1042
904
|
return null;
|
|
1043
|
-
if (
|
|
905
|
+
if (plusFile.isNotLoaded)
|
|
1044
906
|
return { configValueLoaded: false };
|
|
1045
|
-
const confVal = { configValue:
|
|
907
|
+
const confVal = { configValue: plusFile.fileExportsByConfigName[configName], configValueLoaded: true };
|
|
1046
908
|
return confVal;
|
|
1047
909
|
}
|
|
1048
910
|
function resolveConfigEnv(configEnv, filePath) {
|