vike 0.4.220-commit-9a798ce → 0.4.220-commit-af5c91f

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 (124) hide show
  1. package/dist/cjs/node/api/utils.js +1 -1
  2. package/dist/cjs/node/plugin/index.js +1 -1
  3. package/dist/cjs/node/plugin/onLoad.js +1 -1
  4. package/dist/cjs/node/plugin/plugins/buildConfig/fixServerAssets.js +5 -3
  5. package/dist/cjs/node/plugin/plugins/buildConfig.js +7 -5
  6. package/dist/cjs/node/plugin/plugins/buildEntry/index.js +2 -1
  7. package/dist/cjs/node/plugin/plugins/commonConfig.js +1 -2
  8. package/dist/cjs/node/plugin/plugins/extractAssetsPlugin.js +3 -2
  9. package/dist/cjs/node/plugin/plugins/extractExportNamesPlugin.js +2 -1
  10. package/dist/cjs/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +10 -8
  11. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/assertExtensions.js +8 -4
  12. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +39 -22
  13. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.js +9 -64
  14. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +11 -5
  15. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +319 -350
  16. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +2 -1
  17. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +7 -6
  18. package/dist/cjs/node/plugin/plugins/packageJsonFile.js +2 -2
  19. package/dist/cjs/node/plugin/plugins/previewConfig.js +4 -3
  20. package/dist/cjs/node/plugin/plugins/setGlobalContext.js +2 -1
  21. package/dist/cjs/node/plugin/shared/findPageFiles.js +2 -1
  22. package/dist/cjs/node/plugin/{getOutDirs.js → shared/getOutDirs.js} +24 -27
  23. package/dist/cjs/node/plugin/{resolveClientEntriesDev.js → shared/resolveClientEntriesDev.js} +5 -8
  24. package/dist/cjs/{utils → node/plugin/shared}/viteIsSSR.js +2 -2
  25. package/dist/cjs/node/plugin/utils.js +0 -1
  26. package/dist/cjs/node/prerender/context.js +8 -3
  27. package/dist/cjs/node/prerender/resolvePrerenderConfig.js +26 -5
  28. package/dist/cjs/node/prerender/runPrerender.js +6 -11
  29. package/dist/cjs/node/prerender/utils.js +1 -2
  30. package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +9 -4
  31. package/dist/cjs/node/runtime/renderPage/getEarlyHints.js +2 -27
  32. package/dist/cjs/node/runtime/renderPage/isFontFallback.js +29 -0
  33. package/dist/cjs/node/runtime/utils.js +1 -3
  34. package/dist/cjs/shared/getPageContextUrlComputed.js +6 -1
  35. package/dist/cjs/shared/getPageFiles/fileTypes.js +0 -1
  36. package/dist/cjs/shared/getPageFiles/getAllPageIdFiles.js +0 -3
  37. package/dist/cjs/shared/getPageFiles/getPageFileObject.js +0 -5
  38. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +69 -18
  39. package/dist/cjs/shared/utils.js +0 -1
  40. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  41. package/dist/cjs/utils/findFile.js +3 -3
  42. package/dist/cjs/utils/isDev.js +2 -5
  43. package/dist/cjs/utils/isFilePathAbsoluteFilesystem.js +2 -2
  44. package/dist/cjs/utils/path.js +48 -0
  45. package/dist/cjs/utils/requireResolve.js +3 -3
  46. package/dist/esm/node/api/utils.d.ts +1 -1
  47. package/dist/esm/node/api/utils.js +1 -1
  48. package/dist/esm/node/plugin/index.js +1 -1
  49. package/dist/esm/node/plugin/onLoad.js +1 -1
  50. package/dist/esm/node/plugin/plugins/buildConfig/fixServerAssets.js +3 -1
  51. package/dist/esm/node/plugin/plugins/buildConfig.js +3 -1
  52. package/dist/esm/node/plugin/plugins/buildEntry/index.js +2 -1
  53. package/dist/esm/node/plugin/plugins/commonConfig.js +2 -3
  54. package/dist/esm/node/plugin/plugins/extractAssetsPlugin.js +2 -1
  55. package/dist/esm/node/plugin/plugins/extractExportNamesPlugin.js +2 -1
  56. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +9 -7
  57. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/assertExtensions.js +9 -5
  58. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.d.ts +15 -9
  59. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +40 -23
  60. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.d.ts +8 -18
  61. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.js +10 -65
  62. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.d.ts +6 -2
  63. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +12 -6
  64. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +25 -8
  65. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +322 -353
  66. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +2 -1
  67. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +7 -6
  68. package/dist/esm/node/plugin/plugins/packageJsonFile.js +1 -1
  69. package/dist/esm/node/plugin/plugins/previewConfig.js +2 -1
  70. package/dist/esm/node/plugin/plugins/setGlobalContext.js +2 -1
  71. package/dist/esm/node/plugin/shared/findPageFiles.js +2 -1
  72. package/dist/esm/node/plugin/{getOutDirs.js → shared/getOutDirs.js} +2 -5
  73. package/dist/esm/node/plugin/{resolveClientEntriesDev.js → shared/resolveClientEntriesDev.js} +5 -8
  74. package/dist/esm/{utils → node/plugin/shared}/viteIsSSR.js +2 -2
  75. package/dist/esm/node/plugin/utils.d.ts +0 -1
  76. package/dist/esm/node/plugin/utils.js +0 -1
  77. package/dist/esm/node/prerender/context.d.ts +2 -0
  78. package/dist/esm/node/prerender/context.js +8 -3
  79. package/dist/esm/node/prerender/resolvePrerenderConfig.d.ts +8 -1
  80. package/dist/esm/node/prerender/resolvePrerenderConfig.js +26 -5
  81. package/dist/esm/node/prerender/runPrerender.js +7 -12
  82. package/dist/esm/node/prerender/utils.d.ts +1 -2
  83. package/dist/esm/node/prerender/utils.js +1 -2
  84. package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +9 -4
  85. package/dist/esm/node/runtime/renderPage/getEarlyHints.js +1 -26
  86. package/dist/esm/node/runtime/renderPage/getPageAssets.d.ts +1 -1
  87. package/dist/esm/node/runtime/renderPage/isFontFallback.d.ts +3 -0
  88. package/dist/esm/node/runtime/renderPage/isFontFallback.js +27 -0
  89. package/dist/esm/node/runtime/utils.d.ts +1 -3
  90. package/dist/esm/node/runtime/utils.js +1 -3
  91. package/dist/esm/shared/getPageContextUrlComputed.js +6 -1
  92. package/dist/esm/shared/getPageFiles/fileTypes.js +1 -2
  93. package/dist/esm/shared/getPageFiles/getAllPageIdFiles.js +0 -3
  94. package/dist/esm/shared/getPageFiles/getPageFileObject.js +0 -5
  95. package/dist/esm/shared/page-configs/PageConfig.d.ts +0 -1
  96. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +7 -1
  97. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +70 -19
  98. package/dist/esm/shared/utils.d.ts +0 -1
  99. package/dist/esm/shared/utils.js +0 -1
  100. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  101. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  102. package/dist/esm/utils/findFile.js +1 -1
  103. package/dist/esm/utils/isDev.js +3 -6
  104. package/dist/esm/utils/isFilePathAbsoluteFilesystem.js +1 -1
  105. package/dist/esm/utils/path.d.ts +14 -0
  106. package/dist/esm/utils/path.js +46 -0
  107. package/dist/esm/utils/projectInfo.d.ts +1 -1
  108. package/dist/esm/utils/requireResolve.js +1 -1
  109. package/package.json +1 -1
  110. package/dist/cjs/node/plugin/plugins/importUserCode/addImportStatement.js +0 -29
  111. package/dist/cjs/shared/assertPageFilePath.js +0 -11
  112. package/dist/cjs/utils/path-shim.js +0 -19
  113. package/dist/cjs/utils/toPosixPath.js +0 -18
  114. package/dist/esm/node/plugin/plugins/importUserCode/addImportStatement.d.ts +0 -14
  115. package/dist/esm/node/plugin/plugins/importUserCode/addImportStatement.js +0 -27
  116. package/dist/esm/shared/assertPageFilePath.d.ts +0 -2
  117. package/dist/esm/shared/assertPageFilePath.js +0 -9
  118. package/dist/esm/utils/path-shim.d.ts +0 -2
  119. package/dist/esm/utils/path-shim.js +0 -17
  120. package/dist/esm/utils/toPosixPath.d.ts +0 -4
  121. package/dist/esm/utils/toPosixPath.js +0 -16
  122. /package/dist/esm/node/plugin/{getOutDirs.d.ts → shared/getOutDirs.d.ts} +0 -0
  123. /package/dist/esm/node/plugin/{resolveClientEntriesDev.d.ts → shared/resolveClientEntriesDev.d.ts} +0 -0
  124. /package/dist/esm/{utils → node/plugin/shared}/viteIsSSR.d.ts +0 -0
@@ -9,7 +9,8 @@ exports.getVikeConfig2 = getVikeConfig2;
9
9
  exports.reloadVikeConfig = reloadVikeConfig;
10
10
  exports.isVikeConfigFile = isVikeConfigFile;
11
11
  exports.isV1Design = isV1Design;
12
- exports.getConfigValueInterfaceFile = getConfigValueInterfaceFile;
12
+ exports.getConfVal = getConfVal;
13
+ exports.getConfigDefinitionOptional = getConfigDefinitionOptional;
13
14
  const utils_js_1 = require("../../../utils.js");
14
15
  const path_1 = __importDefault(require("path"));
15
16
  const configDefinitionsBuiltIn_js_1 = require("./getVikeConfig/configDefinitionsBuiltIn.js");
@@ -30,8 +31,6 @@ const getConfigValueBuildTime_js_1 = require("../../../../../shared/page-configs
30
31
  const assertExtensions_js_1 = require("./assertExtensions.js");
31
32
  const getPageConfigUserFriendly_js_1 = require("../../../../../shared/page-configs/getPageConfigUserFriendly.js");
32
33
  const serializeConfigValues_js_1 = require("../../../../../shared/page-configs/serialize/serializeConfigValues.js");
33
- const configDefinitionsBuiltIn = getConfigDefinitionsBuiltIn();
34
- const configDefinitionsBuiltInGlobal = getConfigDefinitionsBuiltInGlobal();
35
34
  (0, utils_js_1.assertIsNotProductionRuntime)();
36
35
  let restartVite = false;
37
36
  let wasConfigInvalid = null;
@@ -43,7 +42,6 @@ function reloadVikeConfig(config) {
43
42
  const vikeVitePluginOptions = config._vikeVitePluginOptions;
44
43
  (0, utils_js_1.assert)(vikeVitePluginOptions);
45
44
  vikeConfigDependencies.clear();
46
- (0, resolvePointerImport_js_1.clearFilesEnvMap)();
47
45
  vikeConfigPromise = loadVikeConfig_withErrorHandling(userRootDir, true, vikeVitePluginOptions);
48
46
  handleReloadSideEffects();
49
47
  }
@@ -102,7 +100,7 @@ async function isV1Design(config) {
102
100
  const isV1Design = pageConfigs.length > 0;
103
101
  return isV1Design;
104
102
  }
105
- async function loadInterfaceFiles(userRootDir) {
103
+ async function loadInterfaceFiles(userRootDir, esbuildCache) {
106
104
  const plusFiles = await findPlusFiles(userRootDir, null);
107
105
  const configFiles = [];
108
106
  const valueFiles = [];
@@ -120,10 +118,10 @@ async function loadInterfaceFiles(userRootDir) {
120
118
  ...configFiles.map(async (filePath) => {
121
119
  const { filePathAbsoluteUserRootDir } = filePath;
122
120
  (0, utils_js_1.assert)(filePathAbsoluteUserRootDir);
123
- const { configFile, extendsConfigs } = await (0, loadFileAtConfigTime_js_1.loadConfigFile)(filePath, userRootDir, [], false);
121
+ const { configFile, extendsConfigs } = await (0, loadFileAtConfigTime_js_1.loadConfigFile)(filePath, userRootDir, [], false, esbuildCache);
124
122
  (0, utils_js_1.assert)(filePath.filePathAbsoluteUserRootDir);
125
123
  const locationId = (0, filesystemRouting_js_1.getLocationId)(filePathAbsoluteUserRootDir);
126
- const interfaceFile = getInterfaceFileFromConfigFile(configFile, false, locationId);
124
+ const interfaceFile = getInterfaceFileFromConfigFile(configFile, false, locationId, userRootDir);
127
125
  interfaceFilesAll[locationId] = interfaceFilesAll[locationId] ?? [];
128
126
  interfaceFilesAll[locationId].push(interfaceFile);
129
127
  extendsConfigs.forEach((extendsConfig) => {
@@ -143,7 +141,7 @@ async function loadInterfaceFiles(userRootDir) {
143
141
  export default { extends: [vikeReact] }
144
142
  ```
145
143
  */
146
- const interfaceFile = getInterfaceFileFromConfigFile(extendsConfig, true, locationId);
144
+ const interfaceFile = getInterfaceFileFromConfigFile(extendsConfig, true, locationId, userRootDir);
147
145
  (0, assertExtensions_js_1.assertExtensionsConventions)(interfaceFile);
148
146
  interfaceFilesAll[locationId].push(interfaceFile);
149
147
  });
@@ -158,60 +156,50 @@ async function loadInterfaceFiles(userRootDir) {
158
156
  const interfaceFile = {
159
157
  locationId,
160
158
  filePath,
161
- fileExportsByConfigName: {
162
- [configName]: {}
163
- },
164
159
  isConfigFile: false,
165
160
  isValueFile: true,
161
+ isValueFileLoaded: false,
166
162
  configName
167
163
  };
168
- {
169
- // We don't have access to the custom config definitions defined by the user yet.
170
- // - If `configDef` is `undefined` => we load the file +{configName}.js later.
171
- // - We already need to load +meta.js here (to get the custom config definitions defined by the user)
172
- const configDef = getConfigDefinitionOptional(configDefinitionsBuiltIn, configName);
173
- if (configDef && shouldBeLoadableAtBuildTime(configDef)) {
174
- await (0, loadFileAtConfigTime_js_1.loadValueFile)(interfaceFile, configName, userRootDir);
175
- }
176
- }
177
- {
178
- interfaceFilesAll[locationId] = interfaceFilesAll[locationId] ?? [];
179
- interfaceFilesAll[locationId].push(interfaceFile);
180
- }
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);
181
170
  })
182
171
  ]);
183
- assertAllConfigsAreKnown(interfaceFilesAll);
172
+ assertKnownConfigs(interfaceFilesAll);
184
173
  return interfaceFilesAll;
185
174
  }
186
- function getInterfaceFileFromConfigFile(configFile, isConfigExtend, locationId) {
175
+ function getInterfaceFileFromConfigFile(configFile, isConfigExtension, locationId, userRootDir) {
187
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
+ });
188
190
  const interfaceFile = {
189
191
  locationId,
190
192
  filePath,
191
- fileExportsByConfigName: {},
193
+ fileExportsByConfigName,
194
+ pointerImportsByConfigName,
192
195
  isConfigFile: true,
193
196
  isValueFile: false,
194
- isConfigExtend,
197
+ isValueFileLoaded: true,
198
+ isConfigExtension,
195
199
  extendsFilePaths
196
200
  };
197
- const fileExport = (0, getConfigFileExport_js_1.getConfigFileExport)(fileExports, filePath.filePathToShowToUser);
198
- Object.entries(fileExport).forEach(([configName, configValue]) => {
199
- interfaceFile.fileExportsByConfigName[configName] = { configValue };
200
- });
201
201
  return interfaceFile;
202
202
  }
203
- /** Show error message upon unknown config */
204
- function assertAllConfigsAreKnown(interfaceFilesAll) {
205
- (0, utils_js_1.objectEntries)(interfaceFilesAll).forEach(([locationId, interfaceFiles]) => {
206
- const interfaceFilesRelevant = getInterfaceFilesRelevant(interfaceFilesAll, locationId);
207
- const configDefinitions = getConfigDefinitions(interfaceFilesRelevant);
208
- interfaceFiles.forEach((interfaceFile) => {
209
- Object.keys(interfaceFile.fileExportsByConfigName).forEach((configName) => {
210
- assertConfigExists(configName, Object.keys(configDefinitions), interfaceFile.filePath.filePathToShowToUser);
211
- });
212
- });
213
- });
214
- }
215
203
  async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePluginOptions, doNotRestartViteOnError) {
216
204
  let hasError = false;
217
205
  let ret;
@@ -246,7 +234,6 @@ async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePlug
246
234
  pageConfigs: [],
247
235
  pageConfigGlobal: {
248
236
  configDefinitions: {},
249
- interfaceFiles: {},
250
237
  configValueSources: {}
251
238
  },
252
239
  global: (0, getPageConfigUserFriendly_js_1.getPageConfigUserFriendlyNew)({ configValues: {} })
@@ -256,9 +243,10 @@ async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePlug
256
243
  }
257
244
  }
258
245
  async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
259
- const interfaceFilesAll = await loadInterfaceFiles(userRootDir);
260
- const importedFilesLoaded = {};
261
- const { pageConfigGlobal, pageConfigs } = await getPageConfigs(interfaceFilesAll, userRootDir, importedFilesLoaded);
246
+ 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);
262
250
  // interop vike(options) in vite.config.js
263
251
  temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, userRootDir);
264
252
  // global
@@ -266,189 +254,138 @@ async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
266
254
  const global = (0, getPageConfigUserFriendly_js_1.getPageConfigUserFriendlyNew)({ configValues });
267
255
  return { pageConfigs, pageConfigGlobal, global };
268
256
  }
269
- async function getGlobalConfigs(interfaceFilesAll, userRootDir, importedFilesLoaded) {
270
- /* TODO/now: dedupe
271
- // Validate that global configs live in global interface files
272
- {
273
- const interfaceFilesGlobalPaths: string[] = []
274
- objectEntries(interfaceFilesGlobal).forEach(([locationId, interfaceFiles]) => {
275
- assert(isGlobalLocation(locationId, locationIds))
276
- interfaceFiles.forEach(({ filePath: { filePathAbsoluteUserRootDir } }) => {
277
- if (filePathAbsoluteUserRootDir) {
278
- interfaceFilesGlobalPaths.push(filePathAbsoluteUserRootDir)
279
- }
280
- })
281
- })
282
- const globalPaths = Array.from(new Set(interfaceFilesGlobalPaths.map((p) => path.posix.dirname(p))))
283
- objectEntries(interfaceFilesAll).forEach(([locationId, interfaceFiles]) => {
284
- interfaceFiles.forEach((interfaceFile) => {
285
- Object.keys(interfaceFile.fileExportsByConfigName).forEach((configName) => {
286
- if (!isGlobalLocation(locationId, locationIds) && isGlobalConfig(configName)) {
287
- assertUsage(
288
- false,
289
- [
290
- `${interfaceFile.filePath.filePathToShowToUser} defines the config ${pc.cyan(
291
- configName
292
- )} which is global:`,
293
- globalPaths.length
294
- ? `define ${pc.cyan(configName)} in ${joinEnglish(globalPaths, 'or')} instead`
295
- : `create a global config (e.g. /pages/+config.js) and define ${pc.cyan(configName)} there instead`
296
- ].join(' ')
297
- )
298
- }
299
- })
300
- })
301
- })
302
- }
303
- //*/
304
- }
305
- function temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, userRootDir) {
306
- (0, utils_js_1.assert)((0, utils_js_1.isObject)(vikeVitePluginOptions));
307
- (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 });
308
- Object.entries(vikeVitePluginOptions).forEach(([configName, value]) => {
309
- var _a;
310
- (0, utils_js_1.assert)((0, utils_js_1.includes)((0, utils_js_1.objectKeys)(configDefinitionsBuiltInGlobal), configName));
311
- const configDef = configDefinitionsBuiltInGlobal[configName];
312
- const sources = ((_a = pageConfigGlobal.configValueSources)[configName] ?? (_a[configName] = []));
313
- sources.push({
314
- value,
315
- configEnv: configDef.env,
316
- definedAtFilePath: {
317
- ...(0, getFilePath_js_1.getFilePathResolved)({
318
- userRootDir,
319
- filePathAbsoluteUserRootDir: '/vite.config.js'
320
- }),
321
- fileExportPathToShowToUser: null
322
- },
323
- locationId: '/',
324
- interfaceFile: null,
325
- isOverriden: configDef.cumulative ? false : sources.length > 0,
326
- valueIsImportedAtRuntime: false,
327
- valueIsDefinedByPlusFile: false
328
- });
329
- });
257
+ async function resolveConfigDefinitions(interfaceFilesAll, userRootDir, esbuildCache) {
258
+ 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);
263
+ 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 };
270
+ }));
271
+ const configDefinitionsResolved = {
272
+ configDefinitionsGlobal,
273
+ configDefinitionsLocal
274
+ };
275
+ return configDefinitionsResolved;
330
276
  }
331
- async function getPageConfigs(interfaceFilesAll, userRootDir, importedFilesLoaded) {
332
- const locationIds = (0, utils_js_1.objectKeys)(interfaceFilesAll);
333
- const interfaceFilesGlobal = (0, utils_js_1.objectFromEntries)((0, utils_js_1.objectEntries)(interfaceFilesAll).filter(([locationId]) => {
334
- return (0, filesystemRouting_js_1.isGlobalLocation)(locationId, locationIds);
277
+ // 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);
284
+ }
285
+ else {
286
+ await Promise.all(Object.entries(interfaceFile.pointerImportsByConfigName).map(async ([configName, pointerImport]) => {
287
+ await (0, loadFileAtConfigTime_js_1.loadPointerImport)(pointerImport, userRootDir, configName, configDefinitions, esbuildCache);
288
+ }));
289
+ }
335
290
  }));
291
+ }
292
+ function getPageConfigs(configDefinitionsResolved, interfaceFilesAll, userRootDir) {
336
293
  const pageConfigGlobal = {
337
- configDefinitions: configDefinitionsBuiltInGlobal,
338
- interfaceFiles: interfaceFilesGlobal,
294
+ configDefinitions: configDefinitionsResolved.configDefinitionsGlobal,
339
295
  configValueSources: {}
340
296
  };
341
- await Promise.all((0, utils_js_1.objectEntries)(configDefinitionsBuiltInGlobal).map(async ([configName, configDef]) => {
342
- const sources = await resolveConfigValueSources(configName, configDef, interfaceFilesGlobal, userRootDir, importedFilesLoaded);
343
- const configValueSource = sources[0];
344
- if (!configValueSource)
297
+ (0, utils_js_1.objectEntries)(configDefinitionsResolved.configDefinitionsGlobal).forEach(([configName, configDef]) => {
298
+ 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);
302
+ if (sources.length === 0)
345
303
  return;
346
304
  pageConfigGlobal.configValueSources[configName] = sources;
347
- }));
348
- const pageConfigs = [];
349
- await Promise.all((0, utils_js_1.objectEntries)(interfaceFilesAll)
350
- .filter(([_locationId, interfaceFiles]) => isDefiningPage(interfaceFiles))
351
- .map(async ([locationId]) => {
352
- const interfaceFilesRelevant = getInterfaceFilesRelevant(interfaceFilesAll, locationId);
353
- const interfaceFilesRelevantList = Object.values(interfaceFilesRelevant).flat(1);
354
- const configDefinitions = getConfigDefinitions(interfaceFilesRelevant);
355
- // Load value files of `env.config===true` custom configs
356
- await Promise.all(interfaceFilesRelevantList.map(async (interfaceFile) => {
357
- if (!interfaceFile.isValueFile)
358
- return;
359
- const { configName } = interfaceFile;
360
- if (isGlobalConfig(configName))
361
- return;
362
- const configDef = getConfigDefinition(configDefinitions, configName, interfaceFile.filePath.filePathToShowToUser);
363
- if (!shouldBeLoadableAtBuildTime(configDef))
364
- return;
365
- const isAlreadyLoaded = interfacefileIsAlreaydLoaded(interfaceFile);
366
- if (isAlreadyLoaded)
367
- return;
368
- // Value files of built-in configs should have already been loaded at loadInterfaceFiles()
369
- (0, utils_js_1.assert)(!(configName in configDefinitionsBuiltIn));
370
- await (0, loadFileAtConfigTime_js_1.loadValueFile)(interfaceFile, configName, userRootDir);
371
- }));
305
+ });
306
+ assertPageConfigGlobal(pageConfigGlobal, interfaceFilesAll);
307
+ const pageConfigs = (0, utils_js_1.objectEntries)(configDefinitionsResolved.configDefinitionsLocal)
308
+ .filter(([_locationId, { interfaceFiles }]) => isDefiningPage(interfaceFiles))
309
+ .map(([locationId, { configDefinitions, interfaceFilesRelevant }]) => {
310
+ const configDefinitionsLocal = configDefinitions;
372
311
  let configValueSources = {};
373
- await Promise.all((0, utils_js_1.objectEntries)(configDefinitions)
374
- .filter(([configName]) => !isGlobalConfig(configName))
375
- .map(async ([configName, configDef]) => {
376
- const sources = await resolveConfigValueSources(configName, configDef, interfaceFilesRelevant, userRootDir, importedFilesLoaded);
312
+ (0, utils_js_1.objectEntries)(configDefinitionsLocal)
313
+ .filter(([_configName, configDef]) => configDef.global !== true)
314
+ .forEach(([configName, configDef]) => {
315
+ const sources = resolveConfigValueSources(configName, configDef, interfaceFilesRelevant, userRootDir, false);
377
316
  if (sources.length === 0)
378
317
  return;
318
+ // assertUsage(!isGlobalConfig(configName, configDefinitionsLocal, sources), 'TODO') // TODO/now
379
319
  configValueSources[configName] = sources;
380
- }));
320
+ });
381
321
  configValueSources = sortConfigValueSources(configValueSources, locationId);
382
322
  const { routeFilesystem, isErrorPage } = determineRouteFilesystem(locationId, configValueSources);
383
- applyEffectsAll(configValueSources, configDefinitions);
384
- const configValuesComputed = getComputed(configValueSources, configDefinitions);
323
+ applyEffectsAll(configValueSources, configDefinitionsLocal);
324
+ const configValuesComputed = getComputed(configValueSources, configDefinitionsLocal);
385
325
  const pageConfig = {
386
326
  pageId: locationId,
387
327
  isErrorPage,
388
328
  routeFilesystem,
389
- configDefinitions,
329
+ configDefinitions: configDefinitionsLocal,
390
330
  interfaceFiles: interfaceFilesRelevant,
391
331
  configValueSources,
392
332
  configValuesComputed
393
333
  };
394
- pageConfigs.push(pageConfig);
395
- }));
396
- assertPageConfigs(pageConfigs, interfaceFilesAll);
334
+ return pageConfig;
335
+ });
336
+ assertPageConfigs(pageConfigs);
397
337
  return { pageConfigs, pageConfigGlobal };
398
338
  }
399
- function assertPageConfigs(pageConfigs, interfaceFilesAll) {
400
- pageConfigs.forEach((pageConfig) => {
401
- assertGlobalConfigs(pageConfig, interfaceFilesAll);
402
- (0, assertExtensions_js_1.assertExtensionsRequire)(pageConfig);
403
- assertOnBeforeRenderEnv(pageConfig);
339
+ function assertPageConfigGlobal(pageConfigGlobal, interfaceFilesAll) {
340
+ Object.entries(pageConfigGlobal.configValueSources).forEach(([configName, sources]) => {
341
+ assertGlobalConfigLocation(configName, sources, interfaceFilesAll, pageConfigGlobal.configDefinitions);
404
342
  });
405
343
  }
406
- // TODO/now: refactor
407
- // - Dedupe: most of the assertGlobalConfigs() code below is a copy-paste of the assertUsage() logic inside getGlobalConfigs()
408
- // - This assertUsage() message is slightly better: use this one for getGlobalConfigs()
409
- // Global configs should be defined at global locations
410
- function assertGlobalConfigs(pageConfig, interfaceFilesAll) {
411
- const interfaceFilesRelevantList = Object.values(pageConfig.interfaceFiles).flat(1);
412
- const { configDefinitions } = pageConfig;
413
- interfaceFilesRelevantList.forEach((interfaceFile) => {
414
- const configNames = [];
415
- if (interfaceFile.isValueFile) {
416
- configNames.push(interfaceFile.configName);
344
+ function assertGlobalConfigLocation(configName, sources, interfaceFilesAll, configDefinitionsGlobal) {
345
+ const locationIdsAll = (0, utils_js_1.objectKeys)(interfaceFilesAll);
346
+ // Determine existing global +config.js files
347
+ 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
350
+ .filter((i) => i.isConfigFile)
351
+ .forEach((interfaceFile) => {
352
+ const { filePathAbsoluteUserRootDir } = interfaceFile.filePath;
353
+ if (filePathAbsoluteUserRootDir) {
354
+ configFilePathsGlobal.push(filePathAbsoluteUserRootDir);
417
355
  }
418
- else {
419
- configNames.push(...Object.keys(interfaceFile.fileExportsByConfigName));
356
+ });
357
+ // Call assertWarning()
358
+ sources.forEach((source) => {
359
+ const { interfaceFile } = source;
360
+ // 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;
363
+ // Allow local Vike extensions to set gloabl configs (`filePathAbsoluteUserRootDir===null` for Vike extension)
364
+ if (!filePathAbsoluteUserRootDir)
365
+ return;
366
+ (0, utils_js_1.assert)(!interfaceFile.isConfigExtension);
367
+ if (!(0, filesystemRouting_js_1.isGlobalLocation)(source.locationId, locationIdsAll)) {
368
+ const configDef = configDefinitionsGlobal[configName];
369
+ (0, utils_js_1.assert)(configDef);
370
+ const isConditionallyGlobal = (0, utils_js_1.isCallable)(configDef.global);
371
+ const errBeg = `${filePathAbsoluteUserRootDir} (which is a local config file) sets the config ${picocolors_1.default.cyan(configName)}`;
372
+ const errMid = !isConditionallyGlobal
373
+ ? "but it's a global config"
374
+ : 'to a value that is global';
375
+ const what = isConditionallyGlobal ? 'global values' : picocolors_1.default.cyan(configName);
376
+ const errEnd = configFilePathsGlobal.length > 0
377
+ ? `define ${what} at a global config file such as ${(0, utils_js_1.joinEnglish)(configFilePathsGlobal, 'or')} instead`
378
+ : `create a global config file (e.g. /pages/+config.js) and define ${what} there instead`;
379
+ // When updating this error message => also update error message at https://vike.dev/warning/global-config
380
+ const errMsg = `${errBeg} ${errMid}: ${errEnd} (https://vike.dev/warning/global-config).`;
381
+ (0, utils_js_1.assertWarning)(false, errMsg, { onlyOnce: true });
420
382
  }
421
- configNames.forEach((configName) => {
422
- if (isGlobalConfig(configName))
423
- return;
424
- const configDef = getConfigDefinition(configDefinitions, configName, interfaceFile.filePath.filePathToShowToUser);
425
- if (configDef.global === true) {
426
- const locationIds = (0, utils_js_1.objectKeys)(interfaceFilesAll);
427
- if (!(0, filesystemRouting_js_1.isGlobalLocation)(interfaceFile.locationId, locationIds)) {
428
- const interfaceFilesGlobal = (0, utils_js_1.objectFromEntries)((0, utils_js_1.objectEntries)(interfaceFilesAll).filter(([locationId]) => {
429
- return (0, filesystemRouting_js_1.isGlobalLocation)(locationId, locationIds);
430
- }));
431
- const configFilesGlobal = [];
432
- (0, utils_js_1.objectEntries)(interfaceFilesGlobal).forEach(([locationId, interfaceFiles]) => {
433
- (0, utils_js_1.assert)((0, filesystemRouting_js_1.isGlobalLocation)(locationId, locationIds));
434
- interfaceFiles.forEach((interfaceFile) => {
435
- if (!interfaceFile.isConfigFile)
436
- return;
437
- const { filePath: { filePathAbsoluteUserRootDir } } = interfaceFile;
438
- if (filePathAbsoluteUserRootDir) {
439
- configFilesGlobal.push(filePathAbsoluteUserRootDir);
440
- }
441
- });
442
- });
443
- (0, utils_js_1.assertUsage)(false, [
444
- `${interfaceFile.filePath.filePathToShowToUser} sets the config ${picocolors_1.default.cyan(configName)} but it's a global config:`,
445
- configFilesGlobal.length > 0
446
- ? `define ${picocolors_1.default.cyan(configName)} at ${(0, utils_js_1.joinEnglish)(configFilesGlobal, 'or')} instead.`
447
- : `create a global config (e.g. /pages/+config.js) and define ${picocolors_1.default.cyan(configName)} there instead.`
448
- ].join(' '));
449
- }
450
- }
451
- });
383
+ });
384
+ }
385
+ function assertPageConfigs(pageConfigs) {
386
+ pageConfigs.forEach((pageConfig) => {
387
+ (0, assertExtensions_js_1.assertExtensionsRequire)(pageConfig);
388
+ assertOnBeforeRenderEnv(pageConfig);
452
389
  });
453
390
  }
454
391
  function assertOnBeforeRenderEnv(pageConfig) {
@@ -488,13 +425,31 @@ function getConfigValues(pageConfig) {
488
425
  });
489
426
  return configValues;
490
427
  }
491
- function interfacefileIsAlreaydLoaded(interfaceFile) {
492
- const configMapValues = Object.values(interfaceFile.fileExportsByConfigName);
493
- const isAlreadyLoaded = configMapValues.some((conf) => 'configValue' in conf);
494
- if (isAlreadyLoaded) {
495
- (0, utils_js_1.assert)(configMapValues.every((conf) => 'configValue' in conf));
496
- }
497
- return isAlreadyLoaded;
428
+ function temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, userRootDir) {
429
+ (0, utils_js_1.assert)((0, utils_js_1.isObject)(vikeVitePluginOptions));
430
+ (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
+ Object.entries(vikeVitePluginOptions).forEach(([configName, value]) => {
432
+ 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];
435
+ const sources = ((_a = pageConfigGlobal.configValueSources)[configName] ?? (_a[configName] = []));
436
+ sources.push({
437
+ value,
438
+ configEnv: configDef.env,
439
+ definedAtFilePath: {
440
+ ...(0, getFilePath_js_1.getFilePathResolved)({
441
+ userRootDir,
442
+ filePathAbsoluteUserRootDir: '/vite.config.js'
443
+ }),
444
+ fileExportPathToShowToUser: null
445
+ },
446
+ locationId: '/',
447
+ interfaceFile: null,
448
+ isOverriden: configDef.cumulative ? false : sources.length > 0,
449
+ valueIsImportedAtRuntime: false,
450
+ valueIsDefinedByPlusFile: false
451
+ });
452
+ });
498
453
  }
499
454
  function getInterfaceFilesRelevant(interfaceFilesAll, locationIdPage) {
500
455
  const interfaceFilesRelevant = Object.fromEntries((0, utils_js_1.objectEntries)(interfaceFilesAll)
@@ -504,26 +459,19 @@ function getInterfaceFilesRelevant(interfaceFilesAll, locationIdPage) {
504
459
  .sort(([locationId1], [locationId2]) => (0, filesystemRouting_js_1.sortAfterInheritanceOrder)(locationId1, locationId2, locationIdPage)));
505
460
  return interfaceFilesRelevant;
506
461
  }
507
- async function resolveConfigValueSources(configName, configDef, interfaceFilesRelevant, userRootDir, importedFilesLoaded) {
508
- const sourcesInfo = [];
462
+ function resolveConfigValueSources(configName, configDef, interfaceFilesRelevant, userRootDir, isGlobal) {
463
+ const interfaceFilesSource = [];
509
464
  // interfaceFilesRelevant is sorted by sortAfterInheritanceOrder()
510
465
  for (const interfaceFiles of Object.values(interfaceFilesRelevant)) {
511
- const interfaceFilesDefiningConfig = interfaceFiles.filter((interfaceFile) => interfaceFile.fileExportsByConfigName[configName]);
466
+ const interfaceFilesDefiningConfig = interfaceFiles.filter((interfaceFile) => getDefiningConfigNames(interfaceFile).includes(configName));
512
467
  if (interfaceFilesDefiningConfig.length === 0)
513
468
  continue;
514
469
  const visited = new WeakSet();
515
470
  const add = (interfaceFile) => {
516
471
  (0, utils_js_1.assert)(!visited.has(interfaceFile));
517
472
  visited.add(interfaceFile);
518
- const isHighestInheritancePrecedence = sourcesInfo.length === 0;
519
- sourcesInfo.push([
520
- configName,
521
- interfaceFile,
522
- configDef,
523
- userRootDir,
524
- importedFilesLoaded,
525
- isHighestInheritancePrecedence
526
- ]);
473
+ const isHighestInheritancePrecedence = interfaceFilesSource.length === 0;
474
+ interfaceFilesSource.push({ interfaceFile, isHighestInheritancePrecedence });
527
475
  };
528
476
  // Main resolution logic
529
477
  {
@@ -534,8 +482,8 @@ async function resolveConfigValueSources(configName, configDef, interfaceFilesRe
534
482
  .sort(makeOrderDeterministic);
535
483
  const interfaceConfigFiles = interfaceFilesDefiningConfig
536
484
  .filter((interfaceFile) => interfaceFile.isConfigFile &&
537
- // We consider value from extended configs (e.g. vike-react) later (i.e. with less priority)
538
- !interfaceFile.isConfigExtend)
485
+ // We consider values from extensions (e.g. vike-react) later (i.e. with less priority)
486
+ !interfaceFile.isConfigExtension)
539
487
  .sort(makeOrderDeterministic);
540
488
  const interfaceValueFile = interfaceValueFiles[0];
541
489
  const interfaceConfigFile = interfaceConfigFiles[0];
@@ -563,8 +511,8 @@ async function resolveConfigValueSources(configName, configDef, interfaceFilesRe
563
511
  });
564
512
  // extends
565
513
  interfaceFilesDefiningConfig
566
- .filter((interfaceFile) => interfaceFile.isConfigFile && interfaceFile.isConfigExtend)
567
- // extended config files are already sorted by inheritance order
514
+ .filter((interfaceFile) => interfaceFile.isConfigFile && interfaceFile.isConfigExtension)
515
+ // Extension config files are already sorted by inheritance order
568
516
  .forEach((interfaceFile) => {
569
517
  add(interfaceFile);
570
518
  });
@@ -572,31 +520,26 @@ async function resolveConfigValueSources(configName, configDef, interfaceFilesRe
572
520
  (0, utils_js_1.assert)(visited.has(interfaceFile));
573
521
  });
574
522
  }
575
- const sources = await Promise.all(sourcesInfo.map(async (args) => await getConfigValueSource(...args)));
576
- return sources;
577
- }
578
- function makeOrderDeterministic(interfaceFile1, interfaceFile2) {
579
- return (0, utils_js_1.lowerFirst)((interfaceFile) => {
580
- const { filePathAbsoluteUserRootDir } = interfaceFile.filePath;
581
- (0, utils_js_1.assert)(isInterfaceFileUserLand(interfaceFile));
582
- (0, utils_js_1.assert)(filePathAbsoluteUserRootDir);
583
- return filePathAbsoluteUserRootDir.length;
584
- })(interfaceFile1, interfaceFile2);
585
- }
586
- function warnOverridenConfigValues(interfaceFileWinner, interfaceFilesOverriden, configName) {
587
- interfaceFilesOverriden.forEach((interfaceFileLoser) => {
588
- const loserFilePath = interfaceFileLoser.filePath.filePathToShowToUser;
589
- const winnerFilePath = interfaceFileWinner.filePath.filePathToShowToUser;
590
- const confName = picocolors_1.default.cyan(configName);
591
- (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 });
523
+ let sources = interfaceFilesSource.map(({ interfaceFile, isHighestInheritancePrecedence }) => {
524
+ const configValueSource = getConfigValueSource(configName, interfaceFile, configDef, userRootDir, isHighestInheritancePrecedence);
525
+ return configValueSource;
592
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;
536
+ });
537
+ }
538
+ return sources;
593
539
  }
594
- function isInterfaceFileUserLand(interfaceFile) {
595
- return (interfaceFile.isConfigFile && !interfaceFile.isConfigExtend) || interfaceFile.isValueFile;
596
- }
597
- async function getConfigValueSource(configName, interfaceFile, configDef, userRootDir, importedFilesLoaded, isHighestInheritancePrecedence) {
598
- const conf = interfaceFile.fileExportsByConfigName[configName];
599
- (0, utils_js_1.assert)(conf);
540
+ function getConfigValueSource(configName, interfaceFile, configDef, userRootDir, isHighestInheritancePrecedence) {
541
+ const confVal = getConfVal(interfaceFile, configName);
542
+ (0, utils_js_1.assert)(confVal);
600
543
  const configValueSourceCommon = {
601
544
  locationId: interfaceFile.locationId,
602
545
  interfaceFile
@@ -612,11 +555,12 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
612
555
  let valueFilePath;
613
556
  if (interfaceFile.isConfigFile) {
614
557
  // Defined over pointer import
615
- const resolved = (0, resolvePointerImport_js_1.resolvePointerImportOfConfig)(conf.configValue, interfaceFile.filePath, userRootDir, configDef.env, configName);
558
+ (0, utils_js_1.assert)(confVal.configValueLoaded);
559
+ const pointerImport = (0, resolvePointerImport_js_1.resolvePointerImport)(confVal.configValue, interfaceFile.filePath, userRootDir, configName);
616
560
  const configDefinedAt = (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, definedAtFilePath_);
617
- (0, utils_js_1.assertUsage)(resolved, `${configDefinedAt} should be an import`);
618
- valueFilePath = resolved.pointerImport.filePathAbsoluteVite;
619
- definedAtFilePath = resolved.pointerImport;
561
+ (0, utils_js_1.assertUsage)(pointerImport, `${configDefinedAt} should be an import`);
562
+ valueFilePath = pointerImport.fileExportPath.filePathAbsoluteVite;
563
+ definedAtFilePath = pointerImport.fileExportPath;
620
564
  }
621
565
  else {
622
566
  // Defined by value file, i.e. +{configName}.js
@@ -641,31 +585,22 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
641
585
  }
642
586
  // +config.js
643
587
  if (interfaceFile.isConfigFile) {
644
- (0, utils_js_1.assert)('configValue' in conf);
645
- const { configValue } = conf;
588
+ (0, utils_js_1.assert)(confVal.configValueLoaded);
589
+ const { configValue } = confVal;
646
590
  // Defined over pointer import
647
- const resolved = (0, resolvePointerImport_js_1.resolvePointerImportOfConfig)(configValue, interfaceFile.filePath, userRootDir, configDef.env, configName);
648
- if (resolved) {
591
+ const pointerImport = interfaceFile.pointerImportsByConfigName[configName];
592
+ if (pointerImport) {
649
593
  const configValueSource = {
650
594
  ...configValueSourceCommon,
651
- configEnv: resolved.configEnvResolved,
595
+ configEnv: resolveConfigEnv(configDef.env, pointerImport.fileExportPath),
652
596
  valueIsImportedAtRuntime: true,
653
597
  valueIsDefinedByPlusFile: false,
654
598
  isOverriden,
655
- definedAtFilePath: resolved.pointerImport
599
+ definedAtFilePath: pointerImport.fileExportPath
656
600
  };
657
- // Load pointer import
658
- if (shouldBeLoadableAtBuildTime(configDef) &&
659
- // The value of `extends` was already loaded and already used: we don't need the value of `extends` anymore
660
- configName !== 'extends') {
661
- if (resolved.pointerImport.filePathAbsoluteFilesystem) {
662
- const fileExport = await (0, loadFileAtConfigTime_js_1.loadImportedFile)(resolved.pointerImport, userRootDir, importedFilesLoaded);
663
- configValueSource.value = fileExport;
664
- }
665
- else {
666
- const configDefinedAt = (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, configValueSource.definedAtFilePath);
667
- (0, utils_js_1.assertUsage)(!configDef.cumulative, `${configDefinedAt} cannot be defined over an aliased import`);
668
- }
601
+ if (pointerImport.fileExportValueLoaded) {
602
+ configValueSource.value = pointerImport.fileExportValue;
603
+ (0, utils_js_1.assert)('fileExportValue' in pointerImport);
669
604
  }
670
605
  return configValueSource;
671
606
  }
@@ -683,8 +618,8 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
683
618
  }
684
619
  // Defined by value file, i.e. +{configName}.js
685
620
  if (interfaceFile.isValueFile) {
686
- const configEnvResolved = (0, resolvePointerImport_js_1.resolveConfigEnvWithFileName)(configDef.env, interfaceFile.filePath);
687
- const valueAlreadyLoaded = 'configValue' in conf;
621
+ const configEnvResolved = resolveConfigEnv(configDef.env, interfaceFile.filePath);
622
+ const valueAlreadyLoaded = confVal.configValueLoaded;
688
623
  (0, utils_js_1.assert)(valueAlreadyLoaded === !!configEnvResolved.config);
689
624
  const configValueSource = {
690
625
  ...configValueSourceCommon,
@@ -701,15 +636,34 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
701
636
  }
702
637
  };
703
638
  if (valueAlreadyLoaded) {
704
- configValueSource.value = conf.configValue;
639
+ configValueSource.value = confVal.configValue;
705
640
  }
706
641
  return configValueSource;
707
642
  }
708
643
  (0, utils_js_1.assert)(false);
709
644
  }
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;
657
+ const confName = picocolors_1.default.cyan(configName);
658
+ (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
+ });
660
+ }
661
+ function isInterfaceFileUserLand(interfaceFile) {
662
+ return (interfaceFile.isConfigFile && !interfaceFile.isConfigExtension) || interfaceFile.isValueFile;
663
+ }
710
664
  function isDefiningPage(interfaceFiles) {
711
665
  for (const interfaceFile of interfaceFiles) {
712
- const configNames = Object.keys(interfaceFile.fileExportsByConfigName);
666
+ const configNames = getDefiningConfigNames(interfaceFile);
713
667
  if (configNames.some((configName) => isDefiningPageConfig(configName))) {
714
668
  return true;
715
669
  }
@@ -719,16 +673,29 @@ function isDefiningPage(interfaceFiles) {
719
673
  function isDefiningPageConfig(configName) {
720
674
  return ['Page', 'route'].includes(configName);
721
675
  }
722
- function getConfigDefinitions(interfaceFilesRelevant) {
723
- const configDefinitionsMerged = { ...configDefinitionsBuiltIn };
676
+ function getDefiningConfigNames(interfaceFile) {
677
+ let configNames = [];
678
+ if (interfaceFile.isValueFile) {
679
+ configNames.push(interfaceFile.configName);
680
+ }
681
+ if (interfaceFile.isValueFileLoaded) {
682
+ configNames.push(...Object.keys(interfaceFile.fileExportsByConfigName));
683
+ }
684
+ configNames = (0, utils_js_1.unique)(configNames);
685
+ return configNames;
686
+ }
687
+ function getConfigDefinitions(interfaceFilesRelevant, filter) {
688
+ let configDefinitions = { ...configDefinitionsBuiltIn_js_1.configDefinitionsBuiltInAll };
689
+ // Add user-land meta configs
724
690
  Object.entries(interfaceFilesRelevant)
725
691
  .reverse()
726
692
  .forEach(([_locationId, interfaceFiles]) => {
727
693
  interfaceFiles.forEach((interfaceFile) => {
728
- const configMeta = interfaceFile.fileExportsByConfigName['meta'];
729
- if (!configMeta)
694
+ const confVal = getConfVal(interfaceFile, 'meta');
695
+ if (!confVal)
730
696
  return;
731
- const meta = configMeta.configValue;
697
+ (0, utils_js_1.assert)(confVal.configValueLoaded);
698
+ const meta = confVal.configValue;
732
699
  assertMetaUsage(meta, `Config ${picocolors_1.default.cyan('meta')} defined at ${interfaceFile.filePath.filePathToShowToUser}`);
733
700
  // Set configDef._userEffectDefinedAtFilePath
734
701
  Object.entries(meta).forEach(([configName, configDef]) => {
@@ -740,16 +707,18 @@ function getConfigDefinitions(interfaceFilesRelevant) {
740
707
  fileExportPathToShowToUser: ['default', 'meta', configName, 'effect']
741
708
  };
742
709
  });
743
- (0, utils_js_1.objectEntries)(meta).forEach(([configName, configDefinition]) => {
710
+ (0, utils_js_1.objectEntries)(meta).forEach(([configName, configDefinitionUserLand]) => {
744
711
  // User can override an existing config definition
745
- configDefinitionsMerged[configName] = {
746
- ...configDefinitionsMerged[configName],
747
- ...configDefinition
712
+ configDefinitions[configName] = {
713
+ ...configDefinitions[configName],
714
+ ...configDefinitionUserLand
748
715
  };
749
716
  });
750
717
  });
751
718
  });
752
- const configDefinitions = configDefinitionsMerged;
719
+ if (filter) {
720
+ configDefinitions = Object.fromEntries(Object.entries(configDefinitions).filter(([_configName, configDef]) => filter(configDef)));
721
+ }
753
722
  return configDefinitions;
754
723
  }
755
724
  function assertMetaUsage(metaVal, metaConfigDefinedAt) {
@@ -903,10 +872,35 @@ function assertNoUnexpectedPlusSign(filePath: string, fileName: string) {
903
872
  )
904
873
  }
905
874
  */
906
- function handleUnknownConfig(configName, configNames, filePathToShowToUser) {
875
+ // Show error message upon unknown config
876
+ function assertKnownConfigs(interfaceFilesAll) {
877
+ const configDefinitionsAll = getConfigDefinitions(interfaceFilesAll);
878
+ 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);
882
+ const configNamesKnownLocal = Object.keys(configDefinitionsLocal);
883
+ interfaceFiles.forEach((interfaceFile) => {
884
+ const configNames = getDefiningConfigNames(interfaceFile);
885
+ configNames.forEach((configName) => {
886
+ assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal, interfaceFile);
887
+ (0, utils_js_1.assert)(configNamesKnownLocal.includes(configName));
888
+ (0, utils_js_1.assert)(configNamesKnownAll.includes(configName));
889
+ });
890
+ });
891
+ });
892
+ }
893
+ function assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal, interfaceFile) {
894
+ if (configNamesKnownLocal.includes(configName))
895
+ return;
907
896
  const configNameColored = picocolors_1.default.cyan(configName);
908
- let errMsg = `${filePathToShowToUser} sets an unknown config ${configNameColored}.`;
909
- // vike-{react,vue,solid} hint
897
+ const { locationId, filePath: { filePathToShowToUser } } = interfaceFile;
898
+ const errMsg = `${filePathToShowToUser} sets an unknown config ${configNameColored}`;
899
+ // Inheritance issue: config is known but isn't defined at `locationId`
900
+ if (configNamesKnownAll.includes(configName)) {
901
+ (0, utils_js_1.assertUsage)(false, `${filePathToShowToUser} sets the value of the config ${configNameColored} which is a custom config that is defined with ${picocolors_1.default.underline('https://vike.dev/meta')} at a path that doesn't apply to ${locationId} — see ${picocolors_1.default.underline('https://vike.dev/config#inheritance')}`);
902
+ }
903
+ // Missing vike-{react,vue,solid} installation
910
904
  {
911
905
  const ui = ['vike-react', 'vike-vue', 'vike-solid'];
912
906
  const knownVikeExntensionConfigs = {
@@ -921,15 +915,11 @@ function handleUnknownConfig(configName, configNames, filePathToShowToUser) {
921
915
  Wrapper: ui
922
916
  };
923
917
  if (configName in knownVikeExntensionConfigs) {
924
- const requiredVikeExtension = knownVikeExntensionConfigs[configName];
925
- (0, utils_js_1.assertUsage)(false, [
926
- errMsg,
927
- `If you want to use the configuration documented at https://vike.dev/${configName} then make sure to install the Vike extension ${requiredVikeExtension
928
- .map((e) => picocolors_1.default.bold(e))
929
- .join('/')}.`,
930
- `Also make sure it applies to ${filePathToShowToUser} (see https://vike.dev/extends#inheritance).`,
931
- `Alternatively, if you don't want to use the aforementioned Vike extension, define it yourself by using ${picocolors_1.default.cyan('meta')} (https://vike.dev/meta).`
932
- ].join(' '));
918
+ const requiredVikeExtension = knownVikeExntensionConfigs[configName]
919
+ .map((e) => picocolors_1.default.bold(e))
920
+ .join('/');
921
+ const errMsgEnhanced = `${errMsg}. If you want to use the configuration ${configNameColored} documented at ${picocolors_1.default.underline(`https://vike.dev/${configName}`)} then make sure to install ${requiredVikeExtension}. (Alternatively, you can define ${configNameColored} yourself by using ${picocolors_1.default.cyan('meta')}, see ${picocolors_1.default.underline('https://vike.dev/meta')} for more information.)`;
922
+ (0, utils_js_1.assertUsage)(false, errMsgEnhanced);
933
923
  }
934
924
  }
935
925
  // Similarity hint
@@ -938,18 +928,15 @@ function handleUnknownConfig(configName, configNames, filePathToShowToUser) {
938
928
  configNameSimilar = 'Page';
939
929
  }
940
930
  else {
941
- configNameSimilar = (0, utils_js_1.getMostSimilar)(configName, configNames);
931
+ configNameSimilar = (0, utils_js_1.getMostSimilar)(configName, configNamesKnownAll);
942
932
  }
943
933
  if (configNameSimilar) {
944
934
  (0, utils_js_1.assert)(configNameSimilar !== configName);
945
- errMsg += ` Did you mean to set ${picocolors_1.default.cyan(configNameSimilar)} instead?`;
935
+ let errMsgEnhanced = `${errMsg}. Did you mean ${picocolors_1.default.cyan(configNameSimilar)} instead?`;
946
936
  if (configName === 'page') {
947
- errMsg += ` (The name of the config ${picocolors_1.default.cyan('Page')} starts with a capital letter ${picocolors_1.default.cyan('P')} because it defines a UI component: a ubiquitous JavaScript convention is that the name of UI components start with a capital letter.)`;
937
+ errMsgEnhanced += ` (The name of the config ${picocolors_1.default.cyan('Page')} starts with a capital letter ${picocolors_1.default.cyan('P')} because it defines a UI component: a ubiquitous JavaScript convention is that the name of UI components start with a capital letter.)`;
948
938
  }
949
- }
950
- // `meta` hint
951
- if (!configNameSimilar) {
952
- errMsg += ` Make sure to define ${configNameColored} by using ${picocolors_1.default.cyan('meta')} (https://vike.dev/meta), and also make sure the meta configuration applies to ${filePathToShowToUser} (see https://vike.dev/config#inheritance).`;
939
+ (0, utils_js_1.assertUsage)(false, errMsgEnhanced);
953
940
  }
954
941
  (0, utils_js_1.assertUsage)(false, errMsg);
955
942
  }
@@ -1036,52 +1023,9 @@ function getConfigEnvValue(val, errMsgIntro) {
1036
1023
  */
1037
1024
  return val;
1038
1025
  }
1039
- function getConfigDefinition(configDefinitions, configName, filePathToShowToUser) {
1040
- const configDef = configDefinitions[configName];
1041
- assertConfigExists(configName, Object.keys(configDefinitions), filePathToShowToUser);
1042
- (0, utils_js_1.assert)(configDef);
1043
- return configDef;
1044
- }
1045
1026
  function getConfigDefinitionOptional(configDefinitions, configName) {
1046
1027
  return configDefinitions[configName] ?? null;
1047
1028
  }
1048
- function shouldBeLoadableAtBuildTime(configDef) {
1049
- return !!configDef.env.config && !configDef._valueIsFilePath;
1050
- }
1051
- function isGlobalConfig(configName) {
1052
- // TODO/now
1053
- if (configName === 'prerender')
1054
- return false;
1055
- const configNamesGlobal = getConfigNamesGlobal();
1056
- return (0, utils_js_1.includes)(configNamesGlobal, configName);
1057
- }
1058
- /*
1059
- // TODO/now
1060
- function isGlobalConfig(configName: string, configDefinitions: ConfigDefinitions): configName is ConfigNameGlobal {
1061
- const configSpec = configDefinitions[configName]
1062
- assert(configSpec)
1063
- const globalValue = configSpec.global
1064
- if (!globalValue) return false
1065
- if (globalValue === true ) return true
1066
- return globalValue(value)
1067
- }
1068
- */
1069
- function getConfigNamesGlobal() {
1070
- return Object.keys(configDefinitionsBuiltInGlobal);
1071
- }
1072
- function getConfigDefinitionsBuiltInGlobal() {
1073
- return (0, utils_js_1.objectFromEntries)((0, utils_js_1.objectEntries)(configDefinitionsBuiltIn_js_1.configDefinitionsBuiltInAll).filter(([_configName, configDef]) => configDef.global !== undefined));
1074
- }
1075
- function getConfigDefinitionsBuiltIn() {
1076
- return (0, utils_js_1.objectFromEntries)((0, utils_js_1.objectEntries)(configDefinitionsBuiltIn_js_1.configDefinitionsBuiltInAll).filter(([_configName, configDef]) => configDef.global !== true));
1077
- }
1078
- function assertConfigExists(configName, configNamesRelevant, filePathToShowToUser) {
1079
- const configNames = [...configNamesRelevant, ...getConfigNamesGlobal()];
1080
- if (configNames.includes(configName))
1081
- return;
1082
- handleUnknownConfig(configName, configNames, filePathToShowToUser);
1083
- (0, utils_js_1.assert)(false);
1084
- }
1085
1029
  function sortConfigValueSources(configValueSources, locationIdPage) {
1086
1030
  return Object.fromEntries(Object.entries(configValueSources)
1087
1031
  // Make order deterministic (no other purpose)
@@ -1098,6 +1042,31 @@ function sortConfigValueSources(configValueSources, locationIdPage) {
1098
1042
  // Sort after the filesystem inheritance of the config value
1099
1043
  .sort(([, [source1]], [, [source2]]) => (0, utils_js_1.reverse)((0, filesystemRouting_js_1.sortAfterInheritanceOrder)(source1.locationId, source2.locationId, locationIdPage))));
1100
1044
  }
1101
- function getConfigValueInterfaceFile(interfaceFile, configName) {
1102
- return interfaceFile.fileExportsByConfigName[configName]?.configValue;
1045
+ function getConfVal(interfaceFile, configName) {
1046
+ const configNames = getDefiningConfigNames(interfaceFile);
1047
+ if (!configNames.includes(configName))
1048
+ return null;
1049
+ if (!interfaceFile.isValueFileLoaded)
1050
+ return { configValueLoaded: false };
1051
+ const confVal = { configValue: interfaceFile.fileExportsByConfigName[configName], configValueLoaded: true };
1052
+ return confVal;
1053
+ }
1054
+ function resolveConfigEnv(configEnv, filePath) {
1055
+ const configEnvResolved = { ...configEnv };
1056
+ if (filePath.filePathAbsoluteFilesystem) {
1057
+ const { fileName } = filePath;
1058
+ if (fileName.includes('.server.')) {
1059
+ configEnvResolved.server = true;
1060
+ configEnvResolved.client = false;
1061
+ }
1062
+ else if (fileName.includes('.client.')) {
1063
+ configEnvResolved.client = true;
1064
+ configEnvResolved.server = false;
1065
+ }
1066
+ else if (fileName.includes('.shared.')) {
1067
+ configEnvResolved.server = true;
1068
+ configEnvResolved.client = true;
1069
+ }
1070
+ }
1071
+ return configEnvResolved;
1103
1072
  }