vike 0.4.224 → 0.4.225-commit-37a36a5

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 (139) hide show
  1. package/dist/cjs/node/api/build.js +1 -1
  2. package/dist/cjs/node/api/context.js +4 -4
  3. package/dist/cjs/node/api/dev.js +1 -1
  4. package/dist/cjs/node/api/prepareViteApiCall.js +3 -2
  5. package/dist/cjs/node/api/prerender.js +1 -1
  6. package/dist/cjs/node/api/preview.js +1 -1
  7. package/dist/cjs/node/cli/context.js +5 -4
  8. package/dist/cjs/node/cli/entry.js +3 -3
  9. package/dist/cjs/node/cli/parseCli.js +43 -15
  10. package/dist/cjs/node/cli/utils.js +1 -1
  11. package/dist/cjs/node/plugin/plugins/build/pluginBuildEntry.js +1 -1
  12. package/dist/cjs/node/plugin/plugins/commonConfig.js +16 -5
  13. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +6 -4
  14. package/dist/cjs/node/plugin/plugins/devConfig/index.js +1 -1
  15. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +14 -10
  16. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +10 -2
  17. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +11 -12
  18. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +138 -83
  19. package/dist/cjs/node/plugin/plugins/previewConfig.js +12 -7
  20. package/dist/cjs/node/plugin/plugins/setGlobalContext.js +10 -1
  21. package/dist/cjs/node/plugin/shared/addSsrMiddleware.js +5 -1
  22. package/dist/cjs/node/plugin/shared/getEnvVarObject.js +9 -8
  23. package/dist/cjs/node/plugin/shared/loggerNotProd/log.js +1 -1
  24. package/dist/cjs/node/prerender/context.js +1 -1
  25. package/dist/cjs/node/prerender/resolvePrerenderConfig.js +33 -18
  26. package/dist/cjs/node/prerender/runPrerender.js +6 -8
  27. package/dist/cjs/node/prerender/utils.js +1 -1
  28. package/dist/cjs/node/runtime/globalContext.js +9 -5
  29. package/dist/cjs/node/runtime/html/injectAssets/getViteDevScript.js +6 -3
  30. package/dist/cjs/node/runtime/html/stream.js +7 -0
  31. package/dist/cjs/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.js +14 -5
  32. package/dist/cjs/node/runtime/renderPage/createHttpResponse.js +2 -4
  33. package/dist/cjs/node/runtime/renderPage/logErrorHint.js +6 -1
  34. package/dist/cjs/node/runtime/renderPage.js +6 -10
  35. package/dist/cjs/node/runtime/utils.js +0 -1
  36. package/dist/cjs/node/runtime-dev/createDevMiddleware.js +10 -8
  37. package/dist/cjs/node/shared/assertV1Design.js +2 -1
  38. package/dist/cjs/node/shared/utils.js +0 -1
  39. package/dist/cjs/shared/page-configs/getConfigDefinedAt.js +19 -2
  40. package/dist/cjs/shared/page-configs/getConfigValueBuildTime.js +8 -5
  41. package/dist/cjs/shared/page-configs/helpers.js +1 -1
  42. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +2 -5
  43. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +9 -5
  44. package/dist/cjs/shared/route/loadPageRoutes.js +2 -2
  45. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  46. package/dist/cjs/utils/assert.js +11 -4
  47. package/dist/cjs/utils/assertSingleInstance.js +11 -17
  48. package/dist/cjs/utils/debug.js +2 -1
  49. package/dist/cjs/utils/getRandomId.js +1 -1
  50. package/dist/cjs/utils/normalizeHeaders.js +1 -1
  51. package/dist/cjs/utils/parseUrl-extras.js +1 -0
  52. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +1 -1
  53. package/dist/esm/client/client-routing-runtime/createPageContext.js +2 -2
  54. package/dist/esm/node/api/build.js +1 -1
  55. package/dist/esm/node/api/context.d.ts +8 -2
  56. package/dist/esm/node/api/context.js +4 -4
  57. package/dist/esm/node/api/dev.js +1 -1
  58. package/dist/esm/node/api/prepareViteApiCall.d.ts +2 -2
  59. package/dist/esm/node/api/prepareViteApiCall.js +3 -2
  60. package/dist/esm/node/api/prerender.js +1 -1
  61. package/dist/esm/node/api/preview.js +1 -1
  62. package/dist/esm/node/api/types.d.ts +7 -0
  63. package/dist/esm/node/cli/context.d.ts +4 -2
  64. package/dist/esm/node/cli/context.js +5 -4
  65. package/dist/esm/node/cli/entry.js +4 -4
  66. package/dist/esm/node/cli/parseCli.d.ts +3 -0
  67. package/dist/esm/node/cli/parseCli.js +44 -16
  68. package/dist/esm/node/cli/utils.d.ts +1 -1
  69. package/dist/esm/node/cli/utils.js +1 -1
  70. package/dist/esm/node/plugin/plugins/build/pluginBuildEntry.js +2 -2
  71. package/dist/esm/node/plugin/plugins/commonConfig.d.ts +1 -0
  72. package/dist/esm/node/plugin/plugins/commonConfig.js +16 -5
  73. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +6 -4
  74. package/dist/esm/node/plugin/plugins/devConfig/index.js +1 -1
  75. package/dist/esm/node/plugin/plugins/importUserCode/index.js +15 -11
  76. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +3 -1
  77. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +10 -2
  78. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.d.ts +5 -2
  79. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +11 -12
  80. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +3 -2
  81. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +140 -84
  82. package/dist/esm/node/plugin/plugins/previewConfig.js +12 -7
  83. package/dist/esm/node/plugin/plugins/setGlobalContext.js +11 -2
  84. package/dist/esm/node/plugin/shared/addSsrMiddleware.d.ts +1 -1
  85. package/dist/esm/node/plugin/shared/addSsrMiddleware.js +5 -1
  86. package/dist/esm/node/plugin/shared/getEnvVarObject.d.ts +3 -1
  87. package/dist/esm/node/plugin/shared/getEnvVarObject.js +9 -8
  88. package/dist/esm/node/plugin/shared/loggerNotProd/log.js +2 -2
  89. package/dist/esm/node/prerender/context.js +1 -1
  90. package/dist/esm/node/prerender/resolvePrerenderConfig.d.ts +2 -1
  91. package/dist/esm/node/prerender/resolvePrerenderConfig.js +34 -19
  92. package/dist/esm/node/prerender/runPrerender.js +7 -9
  93. package/dist/esm/node/prerender/utils.d.ts +1 -1
  94. package/dist/esm/node/prerender/utils.js +1 -1
  95. package/dist/esm/node/runtime/globalContext.d.ts +1 -1
  96. package/dist/esm/node/runtime/globalContext.js +10 -6
  97. package/dist/esm/node/runtime/html/injectAssets/getViteDevScript.js +6 -3
  98. package/dist/esm/node/runtime/html/stream.js +7 -0
  99. package/dist/esm/node/runtime/index-deprecated.d.ts +1 -3
  100. package/dist/esm/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.d.ts +3 -1
  101. package/dist/esm/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.js +15 -6
  102. package/dist/esm/node/runtime/renderPage/createHttpResponse.d.ts +3 -1
  103. package/dist/esm/node/runtime/renderPage/createHttpResponse.js +2 -4
  104. package/dist/esm/node/runtime/renderPage/logErrorHint.js +6 -1
  105. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +5 -5
  106. package/dist/esm/node/runtime/renderPage.js +7 -11
  107. package/dist/esm/node/runtime/utils.d.ts +0 -1
  108. package/dist/esm/node/runtime/utils.js +0 -1
  109. package/dist/esm/node/runtime-dev/createDevMiddleware.js +10 -8
  110. package/dist/esm/node/shared/assertV1Design.js +2 -1
  111. package/dist/esm/node/shared/utils.d.ts +0 -1
  112. package/dist/esm/node/shared/utils.js +0 -1
  113. package/dist/esm/shared/page-configs/Config.d.ts +19 -1
  114. package/dist/esm/shared/page-configs/PageConfig.d.ts +16 -5
  115. package/dist/esm/shared/page-configs/getConfigDefinedAt.d.ts +5 -3
  116. package/dist/esm/shared/page-configs/getConfigDefinedAt.js +20 -3
  117. package/dist/esm/shared/page-configs/getConfigValueBuildTime.js +8 -5
  118. package/dist/esm/shared/page-configs/helpers.js +1 -1
  119. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.d.ts +1 -1
  120. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +2 -5
  121. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +3 -3
  122. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +9 -5
  123. package/dist/esm/shared/route/loadPageRoutes.js +2 -2
  124. package/dist/esm/shared/types.d.ts +5 -1
  125. package/dist/esm/types/index.d.ts +2 -0
  126. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  127. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  128. package/dist/esm/utils/assert.d.ts +2 -1
  129. package/dist/esm/utils/assert.js +11 -4
  130. package/dist/esm/utils/assertSingleInstance.js +11 -17
  131. package/dist/esm/utils/debug.js +2 -1
  132. package/dist/esm/utils/getRandomId.d.ts +1 -1
  133. package/dist/esm/utils/getRandomId.js +1 -1
  134. package/dist/esm/utils/normalizeHeaders.js +1 -1
  135. package/dist/esm/utils/parseUrl-extras.js +1 -0
  136. package/package.json +6 -3
  137. package/dist/cjs/utils/projectInfo.js +0 -8
  138. package/dist/esm/utils/projectInfo.d.ts +0 -4
  139. package/dist/esm/utils/projectInfo.js +0 -5
@@ -3,8 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.vikeConfigDependencies = void 0;
7
6
  exports.getVikeConfig = getVikeConfig;
7
+ exports.getVikeConfigOptional = getVikeConfigOptional;
8
8
  exports.getVikeConfig2 = getVikeConfig2;
9
9
  exports.reloadVikeConfig = reloadVikeConfig;
10
10
  exports.isV1Design = isV1Design;
@@ -28,18 +28,18 @@ const assertExtensions_js_1 = require("./getVikeConfig/assertExtensions.js");
28
28
  const getPageConfigUserFriendly_js_1 = require("../../../../../shared/page-configs/getPageConfigUserFriendly.js");
29
29
  const serializeConfigValues_js_1 = require("../../../../../shared/page-configs/serialize/serializeConfigValues.js");
30
30
  const getPlusFilesAll_js_1 = require("./getVikeConfig/getPlusFilesAll.js");
31
+ const getEnvVarObject_js_1 = require("../../../shared/getEnvVarObject.js");
32
+ const context_js_1 = require("../../../../api/context.js");
33
+ const context_js_2 = require("../../../../cli/context.js");
31
34
  (0, utils_js_1.assertIsNotProductionRuntime)();
35
+ (0, utils_js_1.assertIsSingleModuleInstance)('v1-design/getVikeConfig.ts');
32
36
  let restartVite = false;
33
37
  let wasConfigInvalid = null;
34
38
  let vikeConfigPromise = null;
35
- const vikeConfigDependencies = new Set();
36
- exports.vikeConfigDependencies = vikeConfigDependencies;
37
39
  function reloadVikeConfig(config) {
38
40
  const userRootDir = config.root;
39
41
  const vikeVitePluginOptions = config._vikeVitePluginOptions;
40
42
  (0, utils_js_1.assert)(vikeVitePluginOptions);
41
- // TODO/now: unify with esbuildCache
42
- vikeConfigDependencies.clear();
43
43
  vikeConfigPromise = loadVikeConfig_withErrorHandling(userRootDir, true, vikeVitePluginOptions);
44
44
  handleReloadSideEffects();
45
45
  }
@@ -93,6 +93,11 @@ async function getVikeConfigEntry(userRootDir, isDev, vikeVitePluginOptions, doN
93
93
  }
94
94
  return await vikeConfigPromise;
95
95
  }
96
+ async function getVikeConfigOptional() {
97
+ if (!vikeConfigPromise)
98
+ return null;
99
+ return await vikeConfigPromise;
100
+ }
96
101
  function isV1Design(config) {
97
102
  const vikeConfig = config._vikeConfigObject;
98
103
  (0, utils_js_1.assert)(vikeConfig);
@@ -137,20 +142,24 @@ async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePlug
137
142
  configValueSources: {}
138
143
  },
139
144
  global: (0, getPageConfigUserFriendly_js_1.getPageConfigGlobalUserFriendly)({ pageConfigGlobalValues: {} }),
140
- pages: {}
145
+ pages: {},
146
+ vikeConfigDependencies: new Set()
141
147
  };
142
148
  return dummyData;
143
149
  }
144
150
  }
145
151
  }
146
152
  async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
147
- const esbuildCache = {};
153
+ const esbuildCache = {
154
+ transpileCache: {},
155
+ vikeConfigDependencies: new Set()
156
+ };
148
157
  const plusFilesAll = await (0, getPlusFilesAll_js_1.getPlusFilesAll)(userRootDir, esbuildCache);
149
158
  const configDefinitionsResolved = await resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache);
150
- assertKnownConfigs(configDefinitionsResolved, plusFilesAll);
151
159
  const { pageConfigGlobal, pageConfigs } = getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRootDir);
152
160
  // Backwards compatibility for vike(options) in vite.config.js
153
161
  temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, userRootDir);
162
+ setCliAndApiOptions(pageConfigGlobal, configDefinitionsResolved);
154
163
  // global
155
164
  const pageConfigGlobalValues = getConfigValues(pageConfigGlobal);
156
165
  const global = (0, getPageConfigUserFriendly_js_1.getPageConfigGlobalUserFriendly)({ pageConfigGlobalValues });
@@ -159,7 +168,7 @@ async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
159
168
  const pageConfigValues = getConfigValues(pageConfig, true);
160
169
  return (0, getPageConfigUserFriendly_js_1.getPageConfigUserFriendly)(pageConfigGlobalValues, pageConfig, pageConfigValues);
161
170
  }));
162
- return { pageConfigs, pageConfigGlobal, global, pages };
171
+ return { pageConfigs, pageConfigGlobal, global, pages, vikeConfigDependencies: esbuildCache.vikeConfigDependencies };
163
172
  }
164
173
  async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache) {
165
174
  const plusFilesAllOrdered = Object.values(plusFilesAll)
@@ -169,6 +178,10 @@ async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache)
169
178
  // We use `plusFilesAll` in order to allow local Vike extensions to create global configs, and to set the value of global configs such as `+vite` (enabling Vike extensions to add Vite plugins).
170
179
  plusFilesAllOrdered, (configDef) => !!configDef.global);
171
180
  await loadCustomConfigBuildTimeFiles(plusFilesAll, configDefinitionsGlobal, userRootDir, esbuildCache);
181
+ const configDefinitionsAll = getConfigDefinitions(Object.values(plusFilesAll).flat());
182
+ const configNamesKnownAll = Object.keys(configDefinitionsAll);
183
+ const configNamesKnownGlobal = Object.keys(configDefinitionsGlobal);
184
+ (0, utils_js_1.assert)(configNamesKnownGlobal.every((configName) => configNamesKnownAll.includes(configName)));
172
185
  const configDefinitionsLocal = {};
173
186
  await Promise.all((0, utils_js_1.objectEntries)(plusFilesAll).map(async ([locationIdPage, plusFiles]) => {
174
187
  const plusFilesRelevant = (0, utils_js_1.objectEntries)(plusFilesAll)
@@ -178,12 +191,23 @@ async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache)
178
191
  .sort((plusFile1, plusFile2) => sortAfterInheritanceOrderPage(plusFile1, plusFile2, locationIdPage, null));
179
192
  const configDefinitions = getConfigDefinitions(plusFilesRelevant, (configDef) => configDef.global !== true);
180
193
  await loadCustomConfigBuildTimeFiles(plusFiles, configDefinitions, userRootDir, esbuildCache);
181
- configDefinitionsLocal[locationIdPage] = { configDefinitions, plusFiles, plusFilesRelevant };
194
+ const configNamesKnownLocal = (0, utils_js_1.unique)([...Object.keys(configDefinitions), ...configNamesKnownGlobal]);
195
+ (0, utils_js_1.assert)(configNamesKnownLocal.every((configName) => configNamesKnownAll.includes(configName)));
196
+ configDefinitionsLocal[locationIdPage] = {
197
+ configDefinitions,
198
+ plusFiles,
199
+ plusFilesRelevant,
200
+ configNamesKnownLocal
201
+ };
182
202
  }));
183
203
  const configDefinitionsResolved = {
184
204
  configDefinitionsGlobal,
185
- configDefinitionsLocal
205
+ configDefinitionsLocal,
206
+ configDefinitionsAll,
207
+ configNamesKnownAll,
208
+ configNamesKnownGlobal
186
209
  };
210
+ assertKnownConfigs(configDefinitionsResolved);
187
211
  return configDefinitionsResolved;
188
212
  }
189
213
  // Load value files (with `env.config===true`) of *custom* configs.
@@ -209,13 +233,13 @@ function getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRo
209
233
  (0, utils_js_1.objectEntries)(configDefinitionsResolved.configDefinitionsGlobal).forEach(([configName, configDef]) => {
210
234
  const sources = resolveConfigValueSources(configName, configDef,
211
235
  // We use `plusFilesAll` in order to allow local Vike extensions to create global configs, and to set the value of global configs such as `+vite` (enabling Vike extensions to add Vite plugins).
212
- Object.values(plusFilesAll).flat(), userRootDir, true);
236
+ Object.values(plusFilesAll).flat(), userRootDir, true, plusFilesAll);
213
237
  if (sources.length === 0)
214
238
  return;
215
239
  pageConfigGlobal.configValueSources[configName] = sources;
216
240
  });
217
241
  applyEffectsMetaEnv(pageConfigGlobal.configValueSources, configDefinitionsResolved.configDefinitionsGlobal);
218
- applyEffectsConfVal(pageConfigGlobal.configValueSources, configDefinitionsResolved.configDefinitionsGlobal);
242
+ applyEffectsConfVal(pageConfigGlobal.configValueSources, configDefinitionsResolved.configDefinitionsGlobal, plusFilesAll);
219
243
  sortConfigValueSources(pageConfigGlobal.configValueSources, null);
220
244
  assertPageConfigGlobal(pageConfigGlobal, plusFilesAll);
221
245
  const pageConfigs = (0, utils_js_1.objectEntries)(configDefinitionsResolved.configDefinitionsLocal)
@@ -226,14 +250,14 @@ function getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRo
226
250
  (0, utils_js_1.objectEntries)(configDefinitionsLocal)
227
251
  .filter(([_configName, configDef]) => configDef.global !== true)
228
252
  .forEach(([configName, configDef]) => {
229
- const sources = resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, false);
253
+ const sources = resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, false, plusFilesAll);
230
254
  if (sources.length === 0)
231
255
  return;
232
256
  configValueSources[configName] = sources;
233
257
  });
234
258
  const pageConfigRoute = determineRouteFilesystem(locationId, configValueSources);
235
259
  applyEffectsMetaEnv(configValueSources, configDefinitionsLocal);
236
- applyEffectsConfVal(configValueSources, configDefinitionsLocal);
260
+ applyEffectsConfVal(configValueSources, configDefinitionsLocal, plusFilesAll);
237
261
  sortConfigValueSources(configValueSources, locationId);
238
262
  const configValuesComputed = getComputed(configValueSources, configDefinitionsLocal);
239
263
  const pageConfig = {
@@ -355,27 +379,58 @@ function temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, use
355
379
  (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 });
356
380
  Object.entries(vikeVitePluginOptions).forEach(([configName, value]) => {
357
381
  var _a;
358
- (0, utils_js_1.assert)((0, utils_js_1.includes)((0, utils_js_1.objectKeys)(configDefinitionsBuiltIn_js_1.configDefinitionsBuiltIn), configName));
359
- const configDef = configDefinitionsBuiltIn_js_1.configDefinitionsBuiltIn[configName];
360
382
  const sources = ((_a = pageConfigGlobal.configValueSources)[configName] ?? (_a[configName] = []));
361
- sources.push({
362
- valueIsLoaded: true,
363
- value,
364
- configEnv: configDef.env,
365
- definedAtFilePath: {
366
- ...(0, getFilePath_js_1.getFilePathResolved)({
367
- userRootDir,
368
- filePathAbsoluteUserRootDir: '/vite.config.js'
369
- }),
370
- fileExportPathToShowToUser: null
371
- },
372
- locationId: '/',
373
- plusFile: null,
374
- valueIsLoadedWithImport: false,
375
- valueIsDefinedByPlusValueFile: false
376
- });
383
+ sources.push(getSourceNonConfigFile(configName, value, {
384
+ ...(0, getFilePath_js_1.getFilePathResolved)({
385
+ userRootDir,
386
+ filePathAbsoluteUserRootDir: '/vite.config.js'
387
+ }),
388
+ fileExportPathToShowToUser: null
389
+ }));
377
390
  });
378
391
  }
392
+ function setCliAndApiOptions(pageConfigGlobal, configDefinitionsResolved) {
393
+ // Vike API — passed options [lowest precedence]
394
+ const apiOperation = (0, context_js_1.getApiOperation)();
395
+ if (apiOperation?.options.vikeConfig) {
396
+ addSources(apiOperation.options.vikeConfig, { definedBy: 'api', operation: apiOperation.operation }, false);
397
+ }
398
+ // Vike CLI options
399
+ const cliOptions = (0, context_js_2.getCliOptions)();
400
+ if (cliOptions) {
401
+ addSources(cliOptions, { definedBy: 'cli' }, true);
402
+ }
403
+ // VIKE_CONFIG [highest precedence]
404
+ const configFromEnv = (0, getEnvVarObject_js_1.getEnvVarObject)('VIKE_CONFIG');
405
+ if (configFromEnv) {
406
+ addSources(configFromEnv, { definedBy: 'env' }, false);
407
+ }
408
+ return;
409
+ function addSources(configValues, definedBy, exitOnError) {
410
+ Object.entries(configValues).forEach(([configName, value]) => {
411
+ var _a;
412
+ const sourceName = `The ${(0, getConfigDefinedAt_js_1.getDefinedByString)(definedBy, configName)}`;
413
+ assertKnownConfig(configName, configDefinitionsResolved.configNamesKnownGlobal, configDefinitionsResolved, '/', sourceName, exitOnError);
414
+ const sources = ((_a = pageConfigGlobal.configValueSources)[configName] ?? (_a[configName] = []));
415
+ sources.unshift(getSourceNonConfigFile(configName, value, definedBy));
416
+ });
417
+ }
418
+ }
419
+ function getSourceNonConfigFile(configName, value, definedAt) {
420
+ (0, utils_js_1.assert)((0, utils_js_1.includes)((0, utils_js_1.objectKeys)(configDefinitionsBuiltIn_js_1.configDefinitionsBuiltIn), configName));
421
+ const configDef = configDefinitionsBuiltIn_js_1.configDefinitionsBuiltIn[configName];
422
+ const source = {
423
+ valueIsLoaded: true,
424
+ value,
425
+ configEnv: configDef.env,
426
+ definedAt,
427
+ locationId: '/',
428
+ plusFile: null,
429
+ valueIsLoadedWithImport: false,
430
+ valueIsDefinedByPlusValueFile: false
431
+ };
432
+ return source;
433
+ }
379
434
  function sortConfigValueSources(configValueSources, locationIdPage) {
380
435
  Object.entries(configValueSources).forEach(([configName, sources]) => {
381
436
  sources
@@ -462,7 +517,7 @@ function sortPlusFilesSameLocationId(plusFile1, plusFile2, configName) {
462
517
  // No need to make it deterministic: the overall order is arleady deterministic, see sortMakeDeterministic() at getPlusFilesAll()
463
518
  return 0;
464
519
  }
465
- function resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, isGlobal) {
520
+ function resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, isGlobal, plusFilesAll) {
466
521
  let sources = plusFilesRelevant
467
522
  .filter((plusFile) => isDefiningConfig(plusFile, configName))
468
523
  .map((plusFile) => getConfigValueSource(configName, plusFile, configDef, userRootDir));
@@ -477,14 +532,14 @@ function resolveConfigValueSources(configName, configDef, plusFilesRelevant, use
477
532
  sources = sources.filter((source) => {
478
533
  (0, utils_js_1.assert)(source.configEnv.config);
479
534
  (0, utils_js_1.assert)(source.valueIsLoaded);
480
- const valueIsGlobal = resolveIsGlobalValue(configDef.global, source.value);
535
+ const valueIsGlobal = resolveIsGlobalValue(configDef.global, source, plusFilesAll);
481
536
  return isGlobal ? valueIsGlobal : !valueIsGlobal;
482
537
  });
483
538
  }
484
539
  return sources;
485
540
  }
486
541
  function isDefiningConfig(plusFile, configName) {
487
- return getDefiningConfigNames(plusFile).includes(configName);
542
+ return getConfigNamesSetByPlusFile(plusFile).includes(configName);
488
543
  }
489
544
  function getConfigValueSource(configName, plusFile, configDef, userRootDir) {
490
545
  const confVal = getConfVal(plusFile, configName);
@@ -527,7 +582,7 @@ function getConfigValueSource(configName, plusFile, configDef, userRootDir) {
527
582
  configEnv: configDef.env,
528
583
  valueIsLoadedWithImport: false,
529
584
  valueIsDefinedByPlusValueFile: false,
530
- definedAtFilePath
585
+ definedAt: definedAtFilePath
531
586
  };
532
587
  return configValueSource;
533
588
  }
@@ -551,7 +606,7 @@ function getConfigValueSource(configName, plusFile, configDef, userRootDir) {
551
606
  configEnv: resolveConfigEnv(configDef.env, pointerImport.fileExportPath),
552
607
  valueIsLoadedWithImport: true,
553
608
  valueIsDefinedByPlusValueFile: false,
554
- definedAtFilePath: pointerImport.fileExportPath
609
+ definedAt: pointerImport.fileExportPath
555
610
  };
556
611
  return configValueSource;
557
612
  }
@@ -563,7 +618,7 @@ function getConfigValueSource(configName, plusFile, configDef, userRootDir) {
563
618
  configEnv: configDef.env,
564
619
  valueIsLoadedWithImport: false,
565
620
  valueIsDefinedByPlusValueFile: false,
566
- definedAtFilePath: definedAtFilePath_
621
+ definedAt: definedAtFilePath_
567
622
  };
568
623
  return configValueSource;
569
624
  }
@@ -577,7 +632,7 @@ function getConfigValueSource(configName, plusFile, configDef, userRootDir) {
577
632
  configEnv: configEnvResolved,
578
633
  valueIsLoadedWithImport: !confVal.valueIsLoaded || !(0, serializeConfigValues_js_1.isJsonValue)(confVal.value),
579
634
  valueIsDefinedByPlusValueFile: true,
580
- definedAtFilePath: {
635
+ definedAt: {
581
636
  ...plusFile.filePath,
582
637
  fileExportPathToShowToUser: configName === plusFile.configName
583
638
  ? []
@@ -591,7 +646,7 @@ function getConfigValueSource(configName, plusFile, configDef, userRootDir) {
591
646
  }
592
647
  function isDefiningPage(plusFiles) {
593
648
  for (const plusFile of plusFiles) {
594
- const configNames = getDefiningConfigNames(plusFile);
649
+ const configNames = getConfigNamesSetByPlusFile(plusFile);
595
650
  if (configNames.some((configName) => isDefiningPageConfig(configName))) {
596
651
  return true;
597
652
  }
@@ -601,16 +656,19 @@ function isDefiningPage(plusFiles) {
601
656
  function isDefiningPageConfig(configName) {
602
657
  return ['Page', 'route'].includes(configName);
603
658
  }
604
- function resolveIsGlobalValue(configDefGlobal, configValue) {
659
+ function resolveIsGlobalValue(configDefGlobal, source, plusFilesAll) {
660
+ (0, utils_js_1.assert)(source.valueIsLoaded);
605
661
  let isGlobal;
606
662
  if ((0, utils_js_1.isCallable)(configDefGlobal))
607
- isGlobal = configDefGlobal(configValue);
663
+ isGlobal = configDefGlobal(source.value, {
664
+ isGlobalLocation: isGlobalLocation(source.locationId, plusFilesAll)
665
+ });
608
666
  else
609
667
  isGlobal = configDefGlobal ?? false;
610
668
  (0, utils_js_1.assert)(typeof isGlobal === 'boolean');
611
669
  return isGlobal;
612
670
  }
613
- function getDefiningConfigNames(plusFile) {
671
+ function getConfigNamesSetByPlusFile(plusFile) {
614
672
  let configNames = [];
615
673
  if (!plusFile.isConfigFile) {
616
674
  configNames.push(plusFile.configName);
@@ -694,7 +752,7 @@ function assertMetaUsage(metaVal, metaConfigDefinedAt) {
694
752
  });
695
753
  }
696
754
  // Test: https://github.com/vikejs/vike/blob/441a37c4c1a3b07bb8f6efb1d1f7be297a53974a/test/playground/vite.config.ts#L39
697
- function applyEffectsConfVal(configValueSources, configDefinitions) {
755
+ function applyEffectsConfVal(configValueSources, configDefinitions, plusFilesAll) {
698
756
  (0, utils_js_1.objectEntries)(configDefinitions).forEach(([configNameEffect, configDefEffect]) => {
699
757
  const sourceEffect = configValueSources[configNameEffect]?.[0];
700
758
  if (!sourceEffect)
@@ -702,8 +760,8 @@ function applyEffectsConfVal(configValueSources, configDefinitions) {
702
760
  const effect = runEffect(configNameEffect, configDefEffect, sourceEffect);
703
761
  if (!effect)
704
762
  return;
705
- const { configModFromEffect, configValueEffectSource } = effect;
706
- applyEffectConfVal(configModFromEffect, sourceEffect, configValueSources, configNameEffect, configDefEffect, configDefinitions, configValueEffectSource);
763
+ const configModFromEffect = effect;
764
+ applyEffectConfVal(configModFromEffect, sourceEffect, configValueSources, configNameEffect, configDefEffect, configDefinitions, plusFilesAll);
707
765
  });
708
766
  }
709
767
  // Test: https://github.com/vikejs/vike/blob/441a37c4c1a3b07bb8f6efb1d1f7be297a53974a/test/playground/pages/config-meta/effect/e2e-test.ts#L16
@@ -715,7 +773,7 @@ function applyEffectsMetaEnv(configValueSources, configDefinitions) {
715
773
  const effect = runEffect(configNameEffect, configDefEffect, sourceEffect);
716
774
  if (!effect)
717
775
  return;
718
- const { configModFromEffect } = effect;
776
+ const configModFromEffect = effect;
719
777
  applyEffectMetaEnv(configModFromEffect, configValueSources, configDefEffect);
720
778
  });
721
779
  }
@@ -727,17 +785,16 @@ function runEffect(configName, configDef, source) {
727
785
  `Cannot add meta.effect to ${picocolors_1.default.cyan(configName)} because its meta.env is ${picocolors_1.default.cyan(JSON.stringify(configDef.env))} but an effect can only be added to a config that has a meta.env with ${picocolors_1.default.cyan('{ config: true }')}.`
728
786
  ].join(' '));
729
787
  (0, utils_js_1.assert)(source.valueIsLoaded);
730
- const configValueEffectSource = source.value;
731
788
  // Call effect
732
789
  const configModFromEffect = configDef.effect({
733
- configValue: configValueEffectSource,
734
- configDefinedAt: (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, source.definedAtFilePath)
790
+ configValue: source.value,
791
+ configDefinedAt: (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, source.definedAt)
735
792
  });
736
793
  if (!configModFromEffect)
737
794
  return null;
738
- return { configModFromEffect, configValueEffectSource };
795
+ return configModFromEffect;
739
796
  }
740
- function applyEffectConfVal(configModFromEffect, sourceEffect, configValueSources, configNameEffect, configDefEffect, configDefinitions, configValueEffectSource) {
797
+ function applyEffectConfVal(configModFromEffect, sourceEffect, configValueSources, configNameEffect, configDefEffect, configDefinitions, plusFilesAll) {
741
798
  (0, utils_js_1.objectEntries)(configModFromEffect).forEach(([configNameTarget, configValue]) => {
742
799
  if (configNameTarget === 'meta')
743
800
  return;
@@ -745,7 +802,7 @@ function applyEffectConfVal(configModFromEffect, sourceEffect, configValueSource
745
802
  (0, utils_js_1.assert)(configDef);
746
803
  (0, utils_js_1.assert)(configDefEffect._userEffectDefinedAtFilePath);
747
804
  const configValueSource = {
748
- definedAtFilePath: configDefEffect._userEffectDefinedAtFilePath,
805
+ definedAt: configDefEffect._userEffectDefinedAtFilePath,
749
806
  plusFile: sourceEffect.plusFile,
750
807
  locationId: sourceEffect.locationId,
751
808
  configEnv: configDef.env,
@@ -754,11 +811,12 @@ function applyEffectConfVal(configModFromEffect, sourceEffect, configValueSource
754
811
  valueIsLoaded: true,
755
812
  value: configValue
756
813
  };
757
- const isValueGlobalSource = resolveIsGlobalValue(configDefEffect.global, configValueEffectSource);
758
- const isValueGlobalTarget = resolveIsGlobalValue(configDef.global, configValue);
814
+ (0, utils_js_1.assert)(sourceEffect.valueIsLoaded);
815
+ const isValueGlobalSource = resolveIsGlobalValue(configDefEffect.global, sourceEffect, plusFilesAll);
816
+ const isValueGlobalTarget = resolveIsGlobalValue(configDef.global, configValueSource, plusFilesAll);
759
817
  const isGlobalHumanReadable = (isGlobal) => `${isGlobal ? 'non-' : ''}global`;
760
818
  // The error message make it sound like it's an inherent limitation, it actually isn't (both ways can make senses).
761
- (0, utils_js_1.assertUsage)(isValueGlobalSource === isValueGlobalTarget, `The configuration ${picocolors_1.default.cyan(configNameEffect)} is set to ${picocolors_1.default.cyan(JSON.stringify(configValueEffectSource))} which is considered ${isGlobalHumanReadable(isValueGlobalSource)}. However, it has a meta.effect that sets the configuration ${picocolors_1.default.cyan(configNameTarget)} to ${picocolors_1.default.cyan(JSON.stringify(configValue))} which is considered ${isGlobalHumanReadable(isValueGlobalTarget)}. This is contradictory: make sure the values are either both non-global or both global.`);
819
+ (0, utils_js_1.assertUsage)(isValueGlobalSource === isValueGlobalTarget, `The configuration ${picocolors_1.default.cyan(configNameEffect)} is set to ${picocolors_1.default.cyan(JSON.stringify(sourceEffect.value))} which is considered ${isGlobalHumanReadable(isValueGlobalSource)}. However, it has a meta.effect that sets the configuration ${picocolors_1.default.cyan(configNameTarget)} to ${picocolors_1.default.cyan(JSON.stringify(configValue))} which is considered ${isGlobalHumanReadable(isValueGlobalTarget)}. This is contradictory: make sure the values are either both non-global or both global.`);
762
820
  configValueSources[configNameTarget] ?? (configValueSources[configNameTarget] = []);
763
821
  configValueSources[configNameTarget].push(configValueSource);
764
822
  });
@@ -807,33 +865,30 @@ function getComputed(configValueSources, configDefinitions) {
807
865
  return configValuesComputed;
808
866
  }
809
867
  // Show error message upon unknown config
810
- function assertKnownConfigs(configDefinitionsResolved, plusFilesAll) {
811
- const configDefinitionsAll = getConfigDefinitions(Object.values(plusFilesAll).flat());
812
- const configNamesKnownAll = Object.keys(configDefinitionsAll);
813
- const configNamesGlobal = Object.keys(configDefinitionsResolved.configDefinitionsGlobal);
814
- (0, utils_js_1.objectEntries)(configDefinitionsResolved.configDefinitionsLocal).forEach(([_locationId, { configDefinitions, plusFiles }]) => {
815
- const configDefinitionsLocal = configDefinitions;
816
- const configNamesKnownLocal = [...Object.keys(configDefinitionsLocal), ...configNamesGlobal];
868
+ function assertKnownConfigs(configDefinitionsResolved) {
869
+ (0, utils_js_1.objectEntries)(configDefinitionsResolved.configDefinitionsLocal).forEach(([_locationId, { configNamesKnownLocal, plusFiles }]) => {
817
870
  plusFiles.forEach((plusFile) => {
818
- const configNames = getDefiningConfigNames(plusFile);
871
+ const configNames = getConfigNamesSetByPlusFile(plusFile);
819
872
  configNames.forEach((configName) => {
820
- assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal, plusFile);
821
- (0, utils_js_1.assert)(configNamesKnownLocal.includes(configName));
822
- (0, utils_js_1.assert)(configNamesKnownAll.includes(configName));
873
+ const { locationId } = plusFile;
874
+ const sourceName = plusFile.filePath.filePathToShowToUser;
875
+ assertKnownConfig(configName, configNamesKnownLocal, configDefinitionsResolved, locationId, sourceName, false);
823
876
  });
824
877
  });
825
878
  });
826
879
  }
827
- function assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal, plusFile) {
828
- if (configNamesKnownLocal.includes(configName))
880
+ function assertKnownConfig(configName, configNamesKnownRelevant, configDefinitionsResolved, locationId, sourceName, exitOnError) {
881
+ const { configNamesKnownAll } = configDefinitionsResolved;
882
+ if (configNamesKnownRelevant.includes(configName)) {
883
+ (0, utils_js_1.assert)(configNamesKnownAll.includes(configName));
829
884
  return;
885
+ }
830
886
  const configNameColored = picocolors_1.default.cyan(configName);
831
- const { locationId, filePath: { filePathToShowToUser } } = plusFile;
832
- const errMsg = `${filePathToShowToUser} sets an unknown config ${configNameColored}`;
833
887
  // Inheritance issue: config is known but isn't defined at `locationId`
834
888
  if (configNamesKnownAll.includes(configName)) {
835
- (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')}`);
889
+ (0, utils_js_1.assertUsage)(false, `${sourceName} 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')}`, { exitOnError });
836
890
  }
891
+ const errMsg = `${sourceName} sets an unknown config ${configNameColored}`;
837
892
  // Missing vike-{react,vue,solid} installation
838
893
  {
839
894
  const ui = ['vike-react', 'vike-vue', 'vike-solid'];
@@ -849,11 +904,9 @@ function assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLoca
849
904
  Wrapper: ui
850
905
  };
851
906
  if (configName in knownVikeExntensionConfigs) {
852
- const requiredVikeExtension = knownVikeExntensionConfigs[configName]
853
- .map((e) => picocolors_1.default.bold(e))
854
- .join('/');
907
+ const requiredVikeExtension = (0, utils_js_1.joinEnglish)(knownVikeExntensionConfigs[configName].map((e) => picocolors_1.default.bold(e)), 'or');
855
908
  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.)`;
856
- (0, utils_js_1.assertUsage)(false, errMsgEnhanced);
909
+ (0, utils_js_1.assertUsage)(false, errMsgEnhanced, { exitOnError });
857
910
  }
858
911
  }
859
912
  // Similarity hint
@@ -870,9 +923,9 @@ function assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLoca
870
923
  if (configName === 'page') {
871
924
  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.)`;
872
925
  }
873
- (0, utils_js_1.assertUsage)(false, errMsgEnhanced);
926
+ (0, utils_js_1.assertUsage)(false, errMsgEnhanced, { exitOnError });
874
927
  }
875
- (0, utils_js_1.assertUsage)(false, errMsg);
928
+ (0, utils_js_1.assertUsage)(false, errMsg, { exitOnError });
876
929
  }
877
930
  function determineRouteFilesystem(locationId, configValueSources) {
878
931
  const configName = 'filesystemRoutingRoot';
@@ -895,7 +948,7 @@ function determineRouteFilesystem(locationId, configValueSources) {
895
948
  (0, utils_js_1.assert)(filesystemRouteString.startsWith('/'));
896
949
  const routeFilesystem = {
897
950
  routeString: filesystemRouteString,
898
- definedBy: filesystemRouteDefinedBy
951
+ definedAtLocation: filesystemRouteDefinedBy
899
952
  };
900
953
  return { routeFilesystem, isErrorPage: undefined };
901
954
  }
@@ -904,10 +957,12 @@ function getFilesystemRoutingRootEffect(configFilesystemRoutingRoot, configName)
904
957
  // Eagerly loaded since it's config-only
905
958
  (0, utils_js_1.assert)(configFilesystemRoutingRoot.valueIsLoaded);
906
959
  const { value } = configFilesystemRoutingRoot;
907
- const configDefinedAt = (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, configFilesystemRoutingRoot.definedAtFilePath);
960
+ const configDefinedAt = (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, configFilesystemRoutingRoot.definedAt);
908
961
  (0, utils_js_1.assertUsage)(typeof value === 'string', `${configDefinedAt} should be a string`);
909
962
  (0, utils_js_1.assertUsage)(value.startsWith('/'), `${configDefinedAt} is ${picocolors_1.default.cyan(value)} but it should start with a leading slash ${picocolors_1.default.cyan('/')}`);
910
- const { filePathAbsoluteUserRootDir } = configFilesystemRoutingRoot.definedAtFilePath;
963
+ const { definedAt } = configFilesystemRoutingRoot;
964
+ (0, utils_js_1.assert)(!definedAt.definedBy);
965
+ const { filePathAbsoluteUserRootDir } = definedAt;
911
966
  (0, utils_js_1.assert)(filePathAbsoluteUserRootDir);
912
967
  const before = (0, filesystemRouting_js_1.getFilesystemRouteString)((0, filesystemRouting_js_1.getLocationId)(filePathAbsoluteUserRootDir));
913
968
  const after = value;
@@ -958,7 +1013,7 @@ function getConfigDefinitionOptional(configDefinitions, configName) {
958
1013
  return configDefinitions[configName] ?? null;
959
1014
  }
960
1015
  function getConfVal(plusFile, configName) {
961
- const configNames = getDefiningConfigNames(plusFile);
1016
+ const configNames = getConfigNamesSetByPlusFile(plusFile);
962
1017
  if (!configNames.includes(configName))
963
1018
  return null;
964
1019
  if (plusFile.isNotLoaded)
@@ -11,6 +11,8 @@ const addSsrMiddleware_js_1 = require("../shared/addSsrMiddleware.js");
11
11
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
12
12
  const index_js_1 = require("./devConfig/index.js");
13
13
  const getOutDirs_js_1 = require("../shared/getOutDirs.js");
14
+ const sirv_1 = __importDefault(require("sirv"));
15
+ const resolvePrerenderConfig_js_1 = require("../../prerender/resolvePrerenderConfig.js");
14
16
  function previewConfig() {
15
17
  let config;
16
18
  // let vikeConfig: VikeConfigObject
@@ -37,23 +39,26 @@ function previewConfig() {
37
39
  */
38
40
  return () => {
39
41
  assertDist();
40
- /* We don't use this condition (we wrongfully always use the SSR middleware) because of the regression introduced by https://github.com/vitejs/vite/pull/14756 which stops servering .html files when `appType: 'custom'`.
41
- if (!vikeConfig.global.config.prerender || vikeConfig.global.config.prerender.partial) {
42
- addSsrMiddleware(server.middlewares, config, true)
42
+ // We cannot re-use Vite's static middleware: https://github.com/vitejs/vite/pull/14836#issuecomment-1788540300
43
+ addStaticAssetsMiddleware(server.middlewares);
44
+ const prerenderConfigGlobal = (0, resolvePrerenderConfig_js_1.resolvePrerenderConfigGlobal)(config._vikeConfigObject);
45
+ if (!prerenderConfigGlobal.isPrerenderingEnabledForAllPages) {
46
+ (0, addSsrMiddleware_js_1.addSsrMiddleware)(server.middlewares, config, true, prerenderConfigGlobal.isPrerenderingEnabled);
43
47
  }
44
- /*/
45
- (0, addSsrMiddleware_js_1.addSsrMiddleware)(server.middlewares, config, true);
46
- //*/
47
48
  addStatic404Middleware(server.middlewares);
48
49
  };
49
50
  }
50
51
  };
51
52
  function assertDist() {
52
- let { outDirRoot, outDirClient, outDirServer } = (0, getOutDirs_js_1.getOutDirs)(config);
53
+ const { outDirRoot, outDirClient, outDirServer } = (0, getOutDirs_js_1.getOutDirs)(config);
53
54
  [outDirRoot, outDirClient, outDirServer].forEach((outDirAny) => {
54
55
  (0, utils_js_1.assertUsage)(fs_1.default.existsSync(outDirAny), `Cannot run ${picocolors_1.default.cyan('$ vike preview')}: your app isn't built (the build directory ${picocolors_1.default.cyan(outDirAny)} is missing). Make sure to run ${picocolors_1.default.cyan('$ vike build')} before running ${picocolors_1.default.cyan('$ vike preview')}.`);
55
56
  });
56
57
  }
58
+ function addStaticAssetsMiddleware(middlewares) {
59
+ const { outDirClient } = (0, getOutDirs_js_1.getOutDirs)(config);
60
+ middlewares.use((0, sirv_1.default)(outDirClient));
61
+ }
57
62
  function addStatic404Middleware(middlewares) {
58
63
  const { outDirClient } = (0, getOutDirs_js_1.getOutDirs)(config);
59
64
  middlewares.use(config.base, (_, res, next) => {
@@ -4,14 +4,22 @@ exports.setGlobalContext = setGlobalContext;
4
4
  const globalContext_js_1 = require("../../runtime/globalContext.js");
5
5
  const utils_js_1 = require("../utils.js");
6
6
  const getOutDirs_js_1 = require("../shared/getOutDirs.js");
7
+ const getVikeConfig_js_1 = require("./importUserCode/v1-design/getVikeConfig.js");
7
8
  function setGlobalContext() {
9
+ let isServerReload = false;
10
+ let config;
8
11
  return [
9
12
  {
10
13
  name: 'vike:setGlobalContext:pre',
11
14
  enforce: 'pre',
15
+ // This hook is called not only at server start but also at server restart (a new `viteDevServer` instance is created)
12
16
  configureServer: {
13
17
  order: 'pre',
14
18
  handler(viteDevServer) {
19
+ (0, utils_js_1.assert)(config);
20
+ if (isServerReload)
21
+ (0, getVikeConfig_js_1.reloadVikeConfig)(config);
22
+ isServerReload = true;
15
23
  (0, globalContext_js_1.setGlobalContext_viteDevServer)(viteDevServer);
16
24
  (0, utils_js_1.markSetup_viteDevServer)();
17
25
  }
@@ -33,7 +41,8 @@ function setGlobalContext() {
33
41
  enforce: 'post',
34
42
  configResolved: {
35
43
  order: 'post',
36
- async handler(config) {
44
+ async handler(config_) {
45
+ config = config_;
37
46
  const { outDirRoot } = (0, getOutDirs_js_1.getOutDirs)(config);
38
47
  (0, utils_js_1.assertFilePathAbsoluteFilesystem)(outDirRoot); // Needed for `importServerProductionEntry({ outDir })` of @brillout/vite-plugin-server-entry
39
48
  (0, globalContext_js_1.setGlobalContext_viteConfig)(config, outDirRoot);
@@ -7,7 +7,7 @@ exports.addSsrMiddleware = addSsrMiddleware;
7
7
  const renderPage_js_1 = require("../../runtime/renderPage.js");
8
8
  const utils_js_1 = require("../utils.js");
9
9
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
10
- function addSsrMiddleware(middlewares, config, isPreview) {
10
+ function addSsrMiddleware(middlewares, config, isPreview, isPrerenderingEnabled) {
11
11
  middlewares.use(async (req, res, next) => {
12
12
  if (res.headersSent)
13
13
  return next();
@@ -42,6 +42,10 @@ function addSsrMiddleware(middlewares, config, isPreview) {
42
42
  // - We purposely don't use next(err) to align behavior: we use our own/copied implementation of buildErrorMessage() regardless of whether the user uses Vite's dev middleware or Vite's standalone dev server
43
43
  return next();
44
44
  }
45
+ if (pageContext.httpResponse.statusCode === 404 && isPreview && isPrerenderingEnabled) {
46
+ // Serve /dist/client/404.html instead
47
+ return next();
48
+ }
45
49
  const configHeaders = (isPreview && config?.preview?.headers) || config?.server?.headers;
46
50
  if (configHeaders) {
47
51
  for (const [name, value] of Object.entries(configHeaders))
@@ -4,26 +4,27 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getEnvVarObject = getEnvVarObject;
7
+ exports.parseJson5 = parseJson5;
7
8
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
8
9
  const utils_js_1 = require("../utils.js");
9
10
  const json5_1 = __importDefault(require("json5"));
10
- function getEnvVarObject(envVarName
11
- /* Let's eventually implement this for Vike's config as well
12
- | 'VIKE_CONFIG'
13
- */
14
- ) {
11
+ function getEnvVarObject(envVarName) {
15
12
  const valueStr = process.env[envVarName];
16
13
  if (!valueStr)
17
14
  return null;
15
+ const value = parseJson5(valueStr, envVarName);
16
+ (0, utils_js_1.assertUsage)(value, `${envVarName} should define an object but it's ${picocolors_1.default.bold(String(value))} instead.`);
17
+ (0, utils_js_1.assertUsage)((0, utils_js_1.isObject)(value), `${envVarName} should define an object but it's set to the following which isn't an object: ${picocolors_1.default.bold(valueStr)}`);
18
+ return value;
19
+ }
20
+ function parseJson5(valueStr, what) {
18
21
  let value;
19
22
  try {
20
23
  value = json5_1.default.parse(valueStr);
21
24
  }
22
25
  catch (err) {
23
26
  console.error(err);
24
- (0, utils_js_1.assertUsage)(false, `Cannot parse ${envVarName} (see error above) because it's set to the following which isn't a valid JSON5 string: ${picocolors_1.default.bold(valueStr)}`);
27
+ (0, utils_js_1.assertUsage)(false, `Cannot parse ${picocolors_1.default.cyan(what)} (see error above) because it's set to the following which isn't a valid JSON5 string: ${picocolors_1.default.bold(valueStr)}`);
25
28
  }
26
- (0, utils_js_1.assertUsage)(value, `${envVarName} should define an object but it's ${picocolors_1.default.bold(String(value))} instead.`);
27
- (0, utils_js_1.assertUsage)((0, utils_js_1.isObject)(value), `${envVarName} should define an object but it's set to the following which isn't an object: ${picocolors_1.default.bold(valueStr)}`);
28
29
  return value;
29
30
  }
@@ -20,7 +20,7 @@ function logWithVikeTag(msg, logType, category, showVikeVersion = false) {
20
20
  function getProjectTag(showVikeVersion) {
21
21
  let projectTag;
22
22
  if (showVikeVersion) {
23
- projectTag = `[vike@${utils_js_1.projectInfo.projectVersion}]`;
23
+ projectTag = `[vike@${utils_js_1.PROJECT_VERSION}]`;
24
24
  }
25
25
  else {
26
26
  projectTag = `[vike]`;