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