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
@@ -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, lowerFirst, assertKeys, objectKeys, objectFromEntries, makeFirst, isNpmPackageImport, reverse, unique, isCallable } from '../../../utils.js';
10
- import path from 'path';
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 { crawlPlusFiles } from './getVikeConfig/crawlPlusFiles.js';
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, assertExtensionsConventions } from './assertExtensions.js';
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 interfaceFilesAll = await loadInterfaceFiles(userRootDir, esbuildCache);
242
- const configDefinitionsResolved = await resolveConfigDefinitions(interfaceFilesAll, userRootDir, esbuildCache);
243
- const { pageConfigGlobal, pageConfigs } = getPageConfigs(configDefinitionsResolved, interfaceFilesAll, userRootDir);
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(interfaceFilesAll, userRootDir, esbuildCache) {
148
+ async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache) {
252
149
  const configDefinitionsGlobal = getConfigDefinitions(
253
- // We use `interfaceFilesAll` in order to allow local Vike extensions to create global configs.
254
- interfaceFilesAll, // TODO/now sort
255
- (configDef) => !!configDef.global);
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(interfaceFilesAll).map(async ([locationId, interfaceFiles]) => {
259
- const interfaceFilesRelevant = getInterfaceFilesRelevant(interfaceFilesAll, locationId);
260
- // configDefinitions = getConfigDefinitions(interfaceFilesRelevant, (configDef) => configDef.global !== true) // TODO/now
261
- const configDefinitions = getConfigDefinitions(interfaceFilesRelevant);
262
- await loadCustomConfigBuildTimeFiles(interfaceFiles, configDefinitions, userRootDir, esbuildCache);
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 `loadInterfaceFiles()`.
273
- async function loadCustomConfigBuildTimeFiles(interfaceFiles, configDefinitions, userRootDir, esbuildCache) {
274
- const interfaceFileList = Object.values(interfaceFiles).flat(1);
275
- await Promise.all(interfaceFileList.map(async (interfaceFile) => {
276
- if (interfaceFile.isValueFile) {
277
- await loadValueFile(interfaceFile, configDefinitions, userRootDir, esbuildCache);
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(interfaceFile.pointerImportsByConfigName).map(async ([configName, pointerImport]) => {
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 getPageConfigs(configDefinitionsResolved, interfaceFilesAll, userRootDir) {
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 `interfaceFilesAll` in order to allow local Vike extensions to set the value of global configs (e.g. `vite`).
294
- interfaceFilesAll, // TODO/now check sort order
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, interfaceFilesAll);
194
+ assertPageConfigGlobal(pageConfigGlobal, plusFilesAll);
301
195
  const pageConfigs = objectEntries(configDefinitionsResolved.configDefinitionsLocal)
302
- .filter(([_locationId, { interfaceFiles }]) => isDefiningPage(interfaceFiles))
303
- .map(([locationId, { configDefinitions, interfaceFilesRelevant }]) => {
196
+ .filter(([_locationId, { plusFiles }]) => isDefiningPage(plusFiles))
197
+ .map(([locationId, { configDefinitions, plusFilesRelevant }]) => {
304
198
  const configDefinitionsLocal = configDefinitions;
305
- let configValueSources = {};
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, interfaceFilesRelevant, userRootDir, false);
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
- interfaceFiles: interfaceFilesRelevant,
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, interfaceFilesAll) {
226
+ function assertPageConfigGlobal(pageConfigGlobal, plusFilesAll) {
334
227
  Object.entries(pageConfigGlobal.configValueSources).forEach(([configName, sources]) => {
335
- assertGlobalConfigLocation(configName, sources, interfaceFilesAll, pageConfigGlobal.configDefinitions);
228
+ assertGlobalConfigLocation(configName, sources, plusFilesAll, pageConfigGlobal.configDefinitions);
336
229
  });
337
230
  }
338
- function assertGlobalConfigLocation(configName, sources, interfaceFilesAll, configDefinitionsGlobal) {
339
- const locationIdsAll = objectKeys(interfaceFilesAll);
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 interfaceFilesGlobal = Object.values(objectFromEntries(objectEntries(interfaceFilesAll).filter(([locationId]) => isGlobalLocation(locationId, locationIdsAll)))).flat();
343
- interfaceFilesGlobal
235
+ const plusFilesGlobal = Object.values(objectFromEntries(objectEntries(plusFilesAll).filter(([locationId]) => isGlobalLocation(locationId, locationIdsAll)))).flat();
236
+ plusFilesGlobal
344
237
  .filter((i) => i.isConfigFile)
345
- .forEach((interfaceFile) => {
346
- const { filePathAbsoluteUserRootDir } = interfaceFile.filePath;
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 { interfaceFile } = source;
246
+ const { plusFile } = source;
354
247
  // It's `null` when the config is defined by `vike(options)` in vite.config.js
355
- assert(interfaceFile);
356
- const { filePathAbsoluteUserRootDir } = interfaceFile.filePath;
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(!interfaceFile.isConfigExtension);
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(configDefinitionsBuiltInAll), configName));
428
- const configDef = configDefinitionsBuiltInAll[configName];
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
- interfaceFile: null,
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 getInterfaceFilesRelevant(interfaceFilesAll, locationIdPage) {
449
- const interfaceFilesRelevant = Object.fromEntries(objectEntries(interfaceFilesAll)
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 interfaceFilesRelevant;
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
- function resolveConfigValueSources(configName, configDef, interfaceFilesRelevant, userRootDir, isGlobal) {
457
- const interfaceFilesSource = [];
458
- // interfaceFilesRelevant is sorted by sortAfterInheritanceOrder()
459
- for (const interfaceFiles of Object.values(interfaceFilesRelevant)) {
460
- const interfaceFilesDefiningConfig = interfaceFiles.filter((interfaceFile) => getDefiningConfigNames(interfaceFile).includes(configName));
461
- if (interfaceFilesDefiningConfig.length === 0)
462
- continue;
463
- const visited = new WeakSet();
464
- const add = (interfaceFile) => {
465
- assert(!visited.has(interfaceFile));
466
- visited.add(interfaceFile);
467
- const isHighestInheritancePrecedence = interfaceFilesSource.length === 0;
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
- // Main resolution logic
392
+ const visited = new WeakSet();
393
+ // ========================
394
+ // User-land config (first)
395
+ // ========================
471
396
  {
472
- const interfaceValueFiles = interfaceFilesDefiningConfig
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
- interfaceFile.configName === configName)
476
- .sort(makeOrderDeterministic);
477
- const interfaceConfigFiles = interfaceFilesDefiningConfig
478
- .filter((interfaceFile) => interfaceFile.isConfigFile &&
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 interfaceFileWinner = interfaceValueFile ?? interfaceConfigFile;
489
- if (interfaceFileWinner) {
490
- const interfaceFilesOverriden = [...interfaceValueFiles, ...interfaceConfigFiles].filter((f) => f !== interfaceFileWinner);
491
- // 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
492
- warnOverridenConfigValues(interfaceFileWinner, interfaceFilesOverriden, configName);
493
- [interfaceFileWinner, ...interfaceFilesOverriden].forEach((interfaceFile) => {
494
- add(interfaceFile);
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
- // Side-effect configs such as `export { frontmatter }` in .mdx files
499
- interfaceFilesDefiningConfig
500
- .filter((interfaceFile) => interfaceFile.isValueFile &&
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
- interfaceFile.configName !== configName)
503
- .forEach((interfaceValueFileSideEffect) => {
504
- add(interfaceValueFileSideEffect);
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
- // extends
507
- interfaceFilesDefiningConfig
508
- .filter((interfaceFile) => interfaceFile.isConfigFile && interfaceFile.isConfigExtension)
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((interfaceFile) => {
511
- add(interfaceFile);
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
- let sources = interfaceFilesSource.map(({ interfaceFile, isHighestInheritancePrecedence }) => {
518
- const configValueSource = getConfigValueSource(configName, interfaceFile, configDef, userRootDir, isHighestInheritancePrecedence);
519
- return configValueSource;
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 sources;
448
+ return plusFilesOrdered;
533
449
  }
534
- function getConfigValueSource(configName, interfaceFile, configDef, userRootDir, isHighestInheritancePrecedence) {
535
- const confVal = getConfVal(interfaceFile, configName);
450
+ function getConfigValueSource(configName, plusFile, configDef, userRootDir, isHighestInheritancePrecedence) {
451
+ const confVal = getConfVal(plusFile, configName);
536
452
  assert(confVal);
537
453
  const configValueSourceCommon = {
538
- locationId: interfaceFile.locationId,
539
- interfaceFile
454
+ locationId: plusFile.locationId,
455
+ plusFile
540
456
  };
541
457
  const definedAtFilePath_ = {
542
- ...interfaceFile.filePath,
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 (interfaceFile.isConfigFile) {
466
+ if (plusFile.isConfigFile) {
551
467
  // Defined over pointer import
552
468
  assert(confVal.configValueLoaded);
553
- const pointerImport = resolvePointerImport(confVal.configValue, interfaceFile.filePath, userRootDir, configName);
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(interfaceFile.isValueFile);
562
- valueFilePath = interfaceFile.filePath.filePathAbsoluteVite;
477
+ assert(!plusFile.isConfigFile);
478
+ valueFilePath = plusFile.filePath.filePathAbsoluteVite;
563
479
  definedAtFilePath = {
564
- ...interfaceFile.filePath,
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 (interfaceFile.isConfigFile) {
498
+ if (plusFile.isConfigFile) {
582
499
  assert(confVal.configValueLoaded);
583
500
  const { configValue } = confVal;
584
501
  // Defined over pointer import
585
- const pointerImport = interfaceFile.pointerImportsByConfigName[configName];
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 (interfaceFile.isValueFile) {
615
- const configEnvResolved = resolveConfigEnv(configDef.env, interfaceFile.filePath);
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
- ...interfaceFile.filePath,
626
- fileExportPathToShowToUser: configName === interfaceFile.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 makeOrderDeterministic(interfaceFile1, interfaceFile2) {
640
- return lowerFirst((interfaceFile) => {
641
- const { filePathAbsoluteUserRootDir } = interfaceFile.filePath;
642
- assert(isInterfaceFileUserLand(interfaceFile));
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 isInterfaceFileUserLand(interfaceFile) {
656
- return (interfaceFile.isConfigFile && !interfaceFile.isConfigExtension) || interfaceFile.isValueFile;
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(interfaceFile) {
588
+ function getDefiningConfigNames(plusFile) {
671
589
  let configNames = [];
672
- if (interfaceFile.isValueFile) {
673
- configNames.push(interfaceFile.configName);
590
+ if (!plusFile.isConfigFile) {
591
+ configNames.push(plusFile.configName);
674
592
  }
675
- if (interfaceFile.isValueFileLoaded) {
676
- configNames.push(...Object.keys(interfaceFile.fileExportsByConfigName));
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(interfaceFilesRelevant, filter) {
682
- let configDefinitions = { ...configDefinitionsBuiltInAll };
599
+ function getConfigDefinitions(plusFilesRelevant, filter) {
600
+ let configDefinitions = { ...configDefinitionsBuiltIn };
683
601
  // Add user-land meta configs
684
- Object.entries(interfaceFilesRelevant)
602
+ Object.entries(plusFilesRelevant)
685
603
  .reverse()
686
- .forEach(([_locationId, interfaceFiles]) => {
687
- interfaceFiles.forEach((interfaceFile) => {
688
- const confVal = getConfVal(interfaceFile, 'meta');
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 ${interfaceFile.filePath.filePathToShowToUser}`);
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(interfaceFile.isConfigFile);
616
+ assert(plusFile.isConfigFile);
699
617
  configDef._userEffectDefinedAtFilePath = {
700
- ...interfaceFile.filePath,
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(interfaceFilesAll) {
871
- const configDefinitionsAll = getConfigDefinitions(interfaceFilesAll);
751
+ function assertKnownConfigs(plusFilesAll) {
752
+ const configDefinitionsAll = getConfigDefinitions(plusFilesAll);
872
753
  const configNamesKnownAll = Object.keys(configDefinitionsAll);
873
- objectEntries(interfaceFilesAll).forEach(([locationId, interfaceFiles]) => {
874
- const interfaceFilesRelevant = getInterfaceFilesRelevant(interfaceFilesAll, locationId);
875
- const configDefinitionsLocal = getConfigDefinitions(interfaceFilesRelevant);
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
- interfaceFiles.forEach((interfaceFile) => {
878
- const configNames = getDefiningConfigNames(interfaceFile);
758
+ plusFiles.forEach((plusFile) => {
759
+ const configNames = getDefiningConfigNames(plusFile);
879
760
  configNames.forEach((configName) => {
880
- assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal, interfaceFile);
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, interfaceFile) {
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 } } = interfaceFile;
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 sortConfigValueSources(configValueSources, locationIdPage) {
1024
- return Object.fromEntries(Object.entries(configValueSources)
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 (!interfaceFile.isValueFileLoaded)
905
+ if (plusFile.isNotLoaded)
1044
906
  return { configValueLoaded: false };
1045
- const confVal = { configValue: interfaceFile.fileExportsByConfigName[configName], configValueLoaded: true };
907
+ const confVal = { configValue: plusFile.fileExportsByConfigName[configName], configValueLoaded: true };
1046
908
  return confVal;
1047
909
  }
1048
910
  function resolveConfigEnv(configEnv, filePath) {