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