vike 0.4.146 → 0.4.147-commit-f9a91f3

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 (85) hide show
  1. package/dist/cjs/node/plugin/index.js +6 -4
  2. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +3 -4
  3. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +76 -0
  4. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +61 -40
  5. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +104 -0
  6. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +62 -75
  7. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +43 -17
  8. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +12 -70
  9. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +11 -8
  10. package/dist/cjs/node/plugin/shared/{getConfigValueSourcesRelevant.js → getConfigValueSourcesNotOverriden.js} +3 -3
  11. package/dist/cjs/node/plugin/utils.js +2 -0
  12. package/dist/cjs/node/prerender/runPrerender.js +75 -67
  13. package/dist/cjs/node/runtime/html/injectAssets/injectAssets__public.js +1 -1
  14. package/dist/cjs/node/runtime/index-common.js +3 -1
  15. package/dist/cjs/node/runtime/renderPage/analyzePage.js +2 -2
  16. package/dist/cjs/node/runtime/renderPage/createHttpResponseObject/assertNoInfiniteHttpRedirect.js +12 -12
  17. package/dist/cjs/node/runtime/renderPage/createHttpResponseObject.js +3 -3
  18. package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +1 -2
  19. package/dist/cjs/node/runtime/renderPage/getHttpResponseBody.js +1 -1
  20. package/dist/cjs/node/runtime/renderPage.js +75 -51
  21. package/dist/cjs/shared/getPageFiles/analyzePageClientSide/determineClientEntry.js +1 -0
  22. package/dist/cjs/shared/page-configs/loadConfigValues.js +12 -3
  23. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesSerialized.js +19 -0
  24. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +3 -12
  25. package/dist/cjs/shared/route/resolveRedirects.js +8 -5
  26. package/dist/cjs/utils/assertKeys.js +28 -0
  27. package/dist/cjs/utils/joinEnglish.js +3 -3
  28. package/dist/cjs/utils/parseUrl-extras.js +22 -8
  29. package/dist/cjs/utils/parseUrl.js +24 -16
  30. package/dist/cjs/utils/projectInfo.js +3 -2
  31. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +25 -11
  32. package/dist/esm/client/client-routing-runtime/index.d.ts +1 -0
  33. package/dist/esm/client/client-routing-runtime/index.js +1 -0
  34. package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.js +2 -2
  35. package/dist/esm/client/shared/getPageContextSerializedInHtml.js +1 -1
  36. package/dist/esm/node/plugin/index.d.ts +1 -0
  37. package/dist/esm/node/plugin/index.js +1 -0
  38. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +3 -4
  39. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.d.ts +5 -0
  40. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +70 -0
  41. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +58 -37
  42. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.d.ts +5 -0
  43. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +98 -0
  44. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +63 -76
  45. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +43 -17
  46. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.d.ts +0 -3
  47. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +13 -68
  48. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +11 -8
  49. package/dist/esm/node/plugin/shared/getConfigValueSourcesNotOverriden.d.ts +5 -0
  50. package/dist/esm/node/plugin/shared/{getConfigValueSourcesRelevant.js → getConfigValueSourcesNotOverriden.js} +2 -2
  51. package/dist/esm/node/plugin/utils.d.ts +2 -0
  52. package/dist/esm/node/plugin/utils.js +2 -0
  53. package/dist/esm/node/prerender/runPrerender.js +75 -67
  54. package/dist/esm/node/runtime/html/injectAssets/injectAssets__public.js +1 -1
  55. package/dist/esm/node/runtime/index-common.d.ts +1 -0
  56. package/dist/esm/node/runtime/index-common.js +1 -0
  57. package/dist/esm/node/runtime/renderPage/analyzePage.js +2 -2
  58. package/dist/esm/node/runtime/renderPage/createHttpResponseObject/assertNoInfiniteHttpRedirect.d.ts +1 -1
  59. package/dist/esm/node/runtime/renderPage/createHttpResponseObject/assertNoInfiniteHttpRedirect.js +13 -13
  60. package/dist/esm/node/runtime/renderPage/createHttpResponseObject.d.ts +1 -1
  61. package/dist/esm/node/runtime/renderPage/createHttpResponseObject.js +3 -3
  62. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +1 -2
  63. package/dist/esm/node/runtime/renderPage/getHttpResponseBody.js +1 -1
  64. package/dist/esm/node/runtime/renderPage.js +76 -52
  65. package/dist/esm/shared/getPageFiles/analyzePageClientSide/determineClientEntry.js +1 -0
  66. package/dist/esm/shared/page-configs/PageConfig.d.ts +14 -4
  67. package/dist/esm/shared/page-configs/loadConfigValues.js +12 -3
  68. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.d.ts +4 -0
  69. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.js +16 -0
  70. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +4 -13
  71. package/dist/esm/shared/route/resolveRedirects.js +8 -5
  72. package/dist/esm/utils/assertKeys.d.ts +4 -0
  73. package/dist/esm/utils/assertKeys.js +22 -0
  74. package/dist/esm/utils/joinEnglish.d.ts +1 -1
  75. package/dist/esm/utils/joinEnglish.js +3 -3
  76. package/dist/esm/utils/parseUrl-extras.d.ts +3 -1
  77. package/dist/esm/utils/parseUrl-extras.js +21 -7
  78. package/dist/esm/utils/parseUrl.js +24 -16
  79. package/dist/esm/utils/projectInfo.d.ts +3 -1
  80. package/dist/esm/utils/projectInfo.js +2 -1
  81. package/package.json +3 -3
  82. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/helpers.js +0 -28
  83. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/helpers.d.ts +0 -5
  84. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/helpers.js +0 -25
  85. package/dist/esm/node/plugin/shared/getConfigValueSourcesRelevant.d.ts +0 -5
@@ -11,7 +11,7 @@ const picocolors_1 = __importDefault(require("@brillout/picocolors"));
11
11
  const streamDocs = 'See https://vike.dev/stream for more information.';
12
12
  function getHttpResponseBody(htmlRender, renderHook) {
13
13
  if (typeof htmlRender !== 'string') {
14
- (0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'body', `Use ${picocolors_1.default.cyan('pageContext.httpResponse.pipe()')} or ${picocolors_1.default.cyan('pageContext.httpResponse.getBody()')} instead`));
14
+ (0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'body', `Use ${picocolors_1.default.cyan('pageContext.httpResponse.pipe()')} instead`));
15
15
  }
16
16
  const body = htmlRender;
17
17
  return body;
@@ -39,17 +39,17 @@ async function renderPage(pageContextInit) {
39
39
  (0, assertArguments_js_1.assertArguments)(...arguments);
40
40
  (0, utils_js_1.assert)((0, utils_js_1.hasProp)(pageContextInit, 'urlOriginal', 'string'));
41
41
  (0, utils_js_1.assertEnv)();
42
- if (skipRequest(pageContextInit.urlOriginal)) {
43
- const pageContextHttpReponseNull = getPageContextHttpResponseNull(pageContextInit);
44
- (0, utils_js_1.checkType)(pageContextHttpReponseNull);
45
- return pageContextHttpReponseNull;
42
+ if (isIgnoredUrl(pageContextInit.urlOriginal)) {
43
+ const pageContextHttpResponseNull = getPageContextHttpResponseNull(pageContextInit);
44
+ (0, utils_js_1.checkType)(pageContextHttpResponseNull);
45
+ return pageContextHttpResponseNull;
46
46
  }
47
47
  const httpRequestId = getRequestId();
48
- const urlToShowToUser = pageContextInit.urlOriginal;
49
- logHttpRequest(urlToShowToUser, httpRequestId);
48
+ const { urlOriginal } = pageContextInit;
49
+ logHttpRequest(urlOriginal, httpRequestId);
50
50
  globalObject.pendingRequestsCount++;
51
51
  const { pageContextReturn, onRequestDone } = await renderPage_wrapper(httpRequestId, () => renderPageAndPrepare(pageContextInit, httpRequestId));
52
- logHttpResponse(urlToShowToUser, httpRequestId, pageContextReturn);
52
+ logHttpResponse(urlOriginal, httpRequestId, pageContextReturn);
53
53
  globalObject.pendingRequestsCount--;
54
54
  onRequestDone();
55
55
  (0, utils_js_1.checkType)(pageContextReturn);
@@ -60,8 +60,8 @@ async function renderPageAndPrepare(pageContextInit, httpRequestId) {
60
60
  // Invalid config
61
61
  const handleInvalidConfig = () => {
62
62
  (0, loggerRuntime_js_1.logRuntimeInfo)?.(picocolors_1.default.bold(picocolors_1.default.red("Couldn't load configuration: see error above.")), httpRequestId, 'error');
63
- const pageContextHttpReponseNull = getPageContextHttpResponseNull(pageContextInit);
64
- return pageContextHttpReponseNull;
63
+ const pageContextHttpResponseNull = getPageContextHttpResponseNull(pageContextInit);
64
+ return pageContextHttpResponseNull;
65
65
  };
66
66
  if (isConfigInvalid_js_1.isConfigInvalid) {
67
67
  return handleInvalidConfig();
@@ -77,8 +77,8 @@ async function renderPageAndPrepare(pageContextInit, httpRequestId) {
77
77
  // initGlobalContext() and getRenderContext() don't call any user hooks => err isn't thrown from user code
78
78
  (0, utils_js_1.assert)(!(0, abort_js_1.isAbortError)(err));
79
79
  (0, loggerRuntime_js_1.logRuntimeError)(err, httpRequestId);
80
- const pageContextHttpReponseNull = getPageContextHttpResponseNullWithError(err, pageContextInit);
81
- return pageContextHttpReponseNull;
80
+ const pageContextHttpResponseNull = getPageContextHttpResponseNullWithError(err, pageContextInit);
81
+ return pageContextHttpResponseNull;
82
82
  }
83
83
  if (isConfigInvalid_js_1.isConfigInvalid) {
84
84
  return handleInvalidConfig();
@@ -86,15 +86,23 @@ async function renderPageAndPrepare(pageContextInit, httpRequestId) {
86
86
  else {
87
87
  // From now on, renderContext.pageConfigs contains all the configuration data; getVikeConfig() isn't called anymore for this request
88
88
  }
89
+ // Check Base URL
90
+ {
91
+ const pageContextHttpResponse = checkBaseUrl(pageContextInit, httpRequestId);
92
+ if (pageContextHttpResponse)
93
+ return pageContextHttpResponse;
94
+ }
95
+ // Normalize URL
89
96
  {
90
- const pageContextHttpReponse = normalizeUrl(pageContextInit, httpRequestId);
91
- if (pageContextHttpReponse)
92
- return pageContextHttpReponse;
97
+ const pageContextHttpResponse = normalizeUrl(pageContextInit, httpRequestId);
98
+ if (pageContextHttpResponse)
99
+ return pageContextHttpResponse;
93
100
  }
101
+ // Permanent redirects (HTTP status code `301`)
94
102
  {
95
- const pageContextHttpReponse = getPermanentRedirect(pageContextInit, httpRequestId);
96
- if (pageContextHttpReponse)
97
- return pageContextHttpReponse;
103
+ const pageContextHttpResponse = getPermanentRedirect(pageContextInit, httpRequestId);
104
+ if (pageContextHttpResponse)
105
+ return pageContextHttpResponse;
98
106
  }
99
107
  return await renderPageAlreadyPrepared(pageContextInit, httpRequestId, renderContext, []);
100
108
  }
@@ -177,8 +185,8 @@ async function renderPageAlreadyPrepared(pageContextInit, httpRequestId, renderC
177
185
  if (!handled.pageContextReturn) {
178
186
  const pageContextAbort = errErrorPage._pageContextAbort;
179
187
  (0, utils_js_1.assertWarning)(false, `Failed to render error page because ${picocolors_1.default.cyan(pageContextAbort._abortCall)} was called: make sure ${picocolors_1.default.cyan(pageContextAbort._abortCaller)} doesn't occur while the error page is being rendered.`, { onlyOnce: false });
180
- const pageContextHttpReponseNull = getPageContextHttpResponseNullWithError(errNominalPage, pageContextInit);
181
- return pageContextHttpReponseNull;
188
+ const pageContextHttpResponseNull = getPageContextHttpResponseNullWithError(errNominalPage, pageContextInit);
189
+ return pageContextHttpResponseNull;
182
190
  }
183
191
  // `throw redirect()` / `throw render(url)`
184
192
  return handled.pageContextReturn;
@@ -186,18 +194,28 @@ async function renderPageAlreadyPrepared(pageContextInit, httpRequestId, renderC
186
194
  if ((0, isNewError_js_1.isNewError)(errErrorPage, errNominalPage)) {
187
195
  (0, loggerRuntime_js_1.logRuntimeError)(errErrorPage, httpRequestId);
188
196
  }
189
- const pageContextHttpReponseNull = getPageContextHttpResponseNullWithError(errNominalPage, pageContextInit);
190
- return pageContextHttpReponseNull;
197
+ const pageContextHttpResponseNull = getPageContextHttpResponseNullWithError(errNominalPage, pageContextInit);
198
+ return pageContextHttpResponseNull;
191
199
  }
192
200
  return pageContextErrorPage;
193
201
  }
194
202
  }
195
- function logHttpRequest(urlToShowToUser, httpRequestId) {
203
+ function logHttpRequest(urlOriginal, httpRequestId) {
196
204
  const clearErrors = globalObject.pendingRequestsCount === 0;
197
- (0, loggerRuntime_js_1.logRuntimeInfo)?.(`HTTP request: ${picocolors_1.default.bold(urlToShowToUser)}`, httpRequestId, 'info', clearErrors);
205
+ (0, loggerRuntime_js_1.logRuntimeInfo)?.(getRequestInfoMessage(urlOriginal), httpRequestId, 'info', clearErrors);
198
206
  }
199
- function logHttpResponse(urlToShowToUser, httpRequestId, pageContextReturn) {
207
+ function getRequestInfoMessage(urlOriginal) {
208
+ return `HTTP request: ${picocolors_1.default.bold(urlOriginal)}`;
209
+ }
210
+ function logHttpResponse(urlOriginal, httpRequestId, pageContextReturn) {
200
211
  const statusCode = pageContextReturn.httpResponse?.statusCode ?? null;
212
+ {
213
+ // If URL doesn't include Base URL
214
+ const { errorWhileRendering } = pageContextReturn;
215
+ const isSkipped = statusCode === null && (errorWhileRendering === null || errorWhileRendering === undefined);
216
+ if (isSkipped)
217
+ return;
218
+ }
201
219
  const isSuccess = statusCode !== null && statusCode >= 200 && statusCode <= 399;
202
220
  const isNominal = isSuccess || statusCode === 404;
203
221
  const color = (s) => picocolors_1.default.bold(isSuccess ? picocolors_1.default.green(String(s)) : picocolors_1.default.red(String(s)));
@@ -211,39 +229,30 @@ function logHttpResponse(urlToShowToUser, httpRequestId, pageContextReturn) {
211
229
  .find((header) => header[0] === 'Location');
212
230
  (0, utils_js_1.assert)(headerRedirect);
213
231
  const urlRedirect = headerRedirect[1];
214
- urlToShowToUser = urlRedirect;
232
+ urlOriginal = urlRedirect;
215
233
  }
216
- (0, loggerRuntime_js_1.logRuntimeInfo)?.(`HTTP ${type} ${picocolors_1.default.bold(urlToShowToUser)} ${color(statusCode ?? 'ERR')}`, httpRequestId, isNominal ? 'info' : 'error');
234
+ (0, loggerRuntime_js_1.logRuntimeInfo)?.(`HTTP ${type} ${picocolors_1.default.bold(urlOriginal)} ${color(statusCode ?? 'ERR')}`, httpRequestId, isNominal ? 'info' : 'error');
217
235
  }
218
236
  function getPageContextHttpResponseNullWithError(err, pageContextInit) {
219
- const pageContextHttpReponseNull = {};
220
- (0, utils_js_1.objectAssign)(pageContextHttpReponseNull, pageContextInit);
221
- (0, utils_js_1.objectAssign)(pageContextHttpReponseNull, {
237
+ const pageContextHttpResponseNull = {};
238
+ (0, utils_js_1.objectAssign)(pageContextHttpResponseNull, pageContextInit);
239
+ (0, utils_js_1.objectAssign)(pageContextHttpResponseNull, {
222
240
  httpResponse: null,
223
241
  errorWhileRendering: err
224
242
  });
225
- return pageContextHttpReponseNull;
243
+ return pageContextHttpResponseNull;
226
244
  }
227
245
  function getPageContextHttpResponseNull(pageContextInit) {
228
- const pageContextHttpReponseNull = {};
229
- (0, utils_js_1.objectAssign)(pageContextHttpReponseNull, pageContextInit);
230
- (0, utils_js_1.objectAssign)(pageContextHttpReponseNull, {
246
+ const pageContextHttpResponseNull = {};
247
+ (0, utils_js_1.objectAssign)(pageContextHttpResponseNull, pageContextInit);
248
+ (0, utils_js_1.objectAssign)(pageContextHttpResponseNull, {
231
249
  httpResponse: null,
232
250
  errorWhileRendering: null
233
251
  });
234
- return pageContextHttpReponseNull;
252
+ return pageContextHttpResponseNull;
235
253
  }
236
254
  async function renderPageNominal(pageContext) {
237
255
  (0, utils_js_1.objectAssign)(pageContext, { errorWhileRendering: null });
238
- // Check Base URL
239
- {
240
- const { urlWithoutPageContextRequestSuffix } = (0, handlePageContextRequestUrl_js_1.handlePageContextRequestUrl)(pageContext.urlOriginal);
241
- const hasBaseServer = (0, utils_js_1.parseUrl)(urlWithoutPageContextRequestSuffix, pageContext._baseServer).hasBaseServer || !!pageContext._urlRewrite;
242
- if (!hasBaseServer) {
243
- (0, utils_js_1.objectAssign)(pageContext, { httpResponse: null });
244
- return pageContext;
245
- }
246
- }
247
256
  // Route
248
257
  {
249
258
  const pageContextFromRoute = await (0, index_js_1.route)(pageContext);
@@ -309,7 +318,7 @@ function getRequestId() {
309
318
  (0, utils_js_1.assert)(httpRequestId >= 1);
310
319
  return httpRequestId;
311
320
  }
312
- function skipRequest(urlOriginal) {
321
+ function isIgnoredUrl(urlOriginal) {
313
322
  const isViteClientRequest = urlOriginal.endsWith('/@vite/client') || urlOriginal.startsWith('/@fs/');
314
323
  (0, utils_js_1.assertWarning)(!isViteClientRequest, `The vike middleware renderPage() was called with the URL ${urlOriginal} which is unexpected because the HTTP request should have already been handled by Vite's development middleware. Make sure to 1. install Vite's development middleware and 2. add Vite's middleware *before* Vike's middleware, see https://vike.dev/renderPage`, { onlyOnce: true });
315
324
  return (urlOriginal.endsWith('/__vite_ping') ||
@@ -318,11 +327,11 @@ function skipRequest(urlOriginal) {
318
327
  isViteClientRequest);
319
328
  }
320
329
  function normalizeUrl(pageContextInit, httpRequestId) {
321
- const { trailingSlash, disableUrlNormalization } = (0, globalContext_js_1.getGlobalContext)();
330
+ const { trailingSlash, disableUrlNormalization, baseServer } = (0, globalContext_js_1.getGlobalContext)();
322
331
  if (disableUrlNormalization)
323
332
  return null;
324
333
  const { urlOriginal } = pageContextInit;
325
- const urlNormalized = (0, utils_js_1.normalizeUrlPathname)(urlOriginal, trailingSlash);
334
+ const urlNormalized = (0, utils_js_1.normalizeUrlPathname)(urlOriginal, trailingSlash, baseServer);
326
335
  if (!urlNormalized)
327
336
  return null;
328
337
  (0, loggerRuntime_js_1.logRuntimeInfo)?.(`URL normalized from ${picocolors_1.default.cyan(urlOriginal)} to ${picocolors_1.default.cyan(urlNormalized)} (https://vike.dev/url-normalization)`, httpRequestId, 'info');
@@ -333,10 +342,8 @@ function normalizeUrl(pageContextInit, httpRequestId) {
333
342
  function getPermanentRedirect(pageContextInit, httpRequestId) {
334
343
  const { redirects, baseServer } = (0, globalContext_js_1.getGlobalContext)();
335
344
  const urlWithoutBase = (0, utils_js_1.removeBaseServer)(pageContextInit.urlOriginal, baseServer);
336
- let urlOriginalPathnameWithouBase;
337
345
  let origin = null;
338
346
  let urlTarget = (0, utils_js_1.modifyUrlPathname)(urlWithoutBase, (urlPathname) => {
339
- urlOriginalPathnameWithouBase = urlPathname;
340
347
  const urlTargetWithOrigin = (0, resolveRedirects_js_1.resolveRedirects)(redirects, urlPathname);
341
348
  if (urlTargetWithOrigin === null)
342
349
  return null;
@@ -346,13 +353,12 @@ function getPermanentRedirect(pageContextInit, httpRequestId) {
346
353
  });
347
354
  if (origin)
348
355
  urlTarget = (0, utils_js_1.addUrlOrigin)(urlTarget, origin);
349
- (0, utils_js_1.assert)(urlOriginalPathnameWithouBase);
350
356
  if (urlTarget === urlWithoutBase)
351
357
  return null;
352
358
  (0, loggerRuntime_js_1.logRuntimeInfo)?.(`Permanent redirect defined by your config.redirects (https://vike.dev/redirects)`, httpRequestId, 'info');
353
359
  urlTarget = (0, utils_js_1.prependBase)(urlTarget, baseServer);
354
360
  (0, utils_js_1.assert)(urlTarget !== pageContextInit.urlOriginal);
355
- const httpResponse = (0, createHttpResponseObject_js_1.createHttpResponseObjectRedirect)({ url: urlTarget, statusCode: 301 }, urlOriginalPathnameWithouBase);
361
+ const httpResponse = (0, createHttpResponseObject_js_1.createHttpResponseObjectRedirect)({ url: urlTarget, statusCode: 301 }, urlWithoutBase);
356
362
  const pageContextHttpResponse = { ...pageContextInit, httpResponse };
357
363
  return pageContextHttpResponse;
358
364
  }
@@ -396,10 +402,28 @@ async function handleAbortError(errAbort, pageContextsFromRewrite, pageContextIn
396
402
  ...pageContextInit,
397
403
  ...pageContextAbort
398
404
  };
399
- const httpResponse = (0, createHttpResponseObject_js_1.createHttpResponseObjectRedirect)(pageContextAbort._urlRedirect, pageContextNominalPageInit.urlPathname);
405
+ const httpResponse = (0, createHttpResponseObject_js_1.createHttpResponseObjectRedirect)(pageContextAbort._urlRedirect, (() => {
406
+ const { pathname, searchOriginal } = pageContextNominalPageInit.urlParsed;
407
+ const urlLogical = (0, utils_js_1.createUrlFromComponents)(null, pathname, searchOriginal,
408
+ // The server-side doesn't have access to the hash
409
+ null);
410
+ return urlLogical;
411
+ })());
400
412
  (0, utils_js_1.objectAssign)(pageContextReturn, { httpResponse });
401
413
  return { pageContextReturn };
402
414
  }
403
415
  (0, utils_js_1.assert)(pageContextAbort.abortStatusCode);
404
416
  return { pageContextAbort };
405
417
  }
418
+ function checkBaseUrl(pageContextInit, httpRequestId) {
419
+ const { baseServer } = (0, globalContext_js_1.getGlobalContext)();
420
+ const { urlOriginal } = pageContextInit;
421
+ const { urlWithoutPageContextRequestSuffix } = (0, handlePageContextRequestUrl_js_1.handlePageContextRequestUrl)(urlOriginal);
422
+ const { hasBaseServer } = (0, utils_js_1.parseUrl)(urlWithoutPageContextRequestSuffix, baseServer);
423
+ if (!hasBaseServer) {
424
+ (0, loggerRuntime_js_1.logRuntimeInfo)?.(`${getRequestInfoMessage(urlOriginal)} skipped because URL ${picocolors_1.default.bold(urlOriginal)} doesn't start with Base URL ${picocolors_1.default.bold(baseServer)} (https://vike.dev/base-url)`, httpRequestId, 'info');
425
+ const pageContextHttpResponseNull = getPageContextHttpResponseNull(pageContextInit);
426
+ return pageContextHttpResponseNull;
427
+ }
428
+ return null;
429
+ }
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ // TODO/v1-release: remove
2
3
  Object.defineProperty(exports, "__esModule", { value: true });
3
4
  exports.getVikeClientEntry = exports.determineClientEntry = void 0;
4
5
  function determineClientEntry({ pageFilesClientSide, pageFilesServerSide, isHtmlOnly, isClientRouting }) {
@@ -3,15 +3,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.loadConfigValues = void 0;
4
4
  const utils_js_1 = require("../utils.js");
5
5
  const parseConfigValuesImported_js_1 = require("./serialize/parseConfigValuesImported.js");
6
+ const parseConfigValuesSerialized_js_1 = require("./serialize/parseConfigValuesSerialized.js");
6
7
  async function loadConfigValues(pageConfig, isDev) {
7
8
  if ('isAllLoaded' in pageConfig &&
8
9
  // We don't need to cache in dev, since Vite already caches the virtual module
9
10
  !isDev) {
10
11
  return pageConfig;
11
12
  }
12
- const configValuesImported = await pageConfig.loadConfigValuesAll();
13
- const configValuesAddendum = (0, parseConfigValuesImported_js_1.parseConfigValuesImported)(configValuesImported);
14
- Object.assign(pageConfig.configValues, configValuesAddendum);
13
+ const configValuesLoaded = await pageConfig.loadConfigValuesAll();
14
+ {
15
+ const { configValuesImported } = configValuesLoaded;
16
+ const configValuesAddendum = (0, parseConfigValuesImported_js_1.parseConfigValuesImported)(configValuesImported);
17
+ Object.assign(pageConfig.configValues, configValuesAddendum);
18
+ }
19
+ {
20
+ const { configValuesSerialized } = configValuesLoaded;
21
+ const configValuesAddendum = (0, parseConfigValuesSerialized_js_1.parseConfigValuesSerialized)(configValuesSerialized);
22
+ Object.assign(pageConfig.configValues, configValuesAddendum);
23
+ }
15
24
  (0, utils_js_1.objectAssign)(pageConfig, { isAllLoaded: true });
16
25
  return pageConfig;
17
26
  }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseConfigValuesSerialized = void 0;
4
+ const utils_js_1 = require("../../utils.js");
5
+ const parse_1 = require("@brillout/json-serializer/parse");
6
+ function parseConfigValuesSerialized(configValuesSerialized) {
7
+ const configValues = {};
8
+ Object.entries(configValuesSerialized).forEach(([configName, configValueSeriliazed]) => {
9
+ const { valueSerialized, definedAt } = configValueSeriliazed;
10
+ (0, utils_js_1.assert)(valueSerialized);
11
+ (0, utils_js_1.assert)(!configValues[configName]);
12
+ configValues[configName] = {
13
+ value: (0, parse_1.parse)(valueSerialized),
14
+ definedAt
15
+ };
16
+ });
17
+ return configValues;
18
+ }
19
+ exports.parseConfigValuesSerialized = parseConfigValuesSerialized;
@@ -1,26 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parsePageConfigs = void 0;
4
- const parse_1 = require("@brillout/json-serializer/parse");
5
4
  const parseConfigValuesImported_js_1 = require("./parseConfigValuesImported.js");
6
5
  const utils_js_1 = require("../../utils.js");
7
6
  const helpers_js_1 = require("../helpers.js");
7
+ const parseConfigValuesSerialized_js_1 = require("./parseConfigValuesSerialized.js");
8
8
  function parsePageConfigs(pageConfigsSerialized, pageConfigGlobalSerialized) {
9
9
  const pageConfigs = pageConfigsSerialized.map((pageConfigSerialized) => {
10
10
  const configValues = {};
11
11
  {
12
12
  const { configValuesSerialized } = pageConfigSerialized;
13
- Object.entries(configValuesSerialized).forEach(([configName, configValueSeriliazed]) => {
14
- {
15
- const { valueSerialized, definedAt } = configValueSeriliazed;
16
- (0, utils_js_1.assert)(valueSerialized);
17
- (0, utils_js_1.assert)(!configValues[configName]);
18
- configValues[configName] = {
19
- value: (0, parse_1.parse)(valueSerialized),
20
- definedAt
21
- };
22
- }
23
- });
13
+ const configValuesAddendum = (0, parseConfigValuesSerialized_js_1.parseConfigValuesSerialized)(configValuesSerialized);
14
+ Object.assign(configValues, configValuesAddendum);
24
15
  }
25
16
  {
26
17
  const { configValuesImported } = pageConfigSerialized;
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.resolveRouteStringRedirect = exports.resolveRedirects = void 0;
7
7
  const assertIsNotBrowser_js_1 = require("../../utils/assertIsNotBrowser.js");
8
+ const parseUrl_extras_js_1 = require("../../utils/parseUrl-extras.js");
8
9
  const utils_js_1 = require("../utils.js");
9
10
  const resolveRouteString_js_1 = require("./resolveRouteString.js");
10
11
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
@@ -23,9 +24,9 @@ exports.resolveRedirects = resolveRedirects;
23
24
  function resolveRouteStringRedirect(urlSource, urlTarget, urlPathname) {
24
25
  (0, resolveRouteString_js_1.assertRouteString)(urlSource, `${configSrc} Invalid`);
25
26
  (0, utils_js_1.assertUsage)(urlTarget.startsWith('/') ||
26
- urlTarget.startsWith('http://') ||
27
- urlTarget.startsWith('https://') ||
28
- urlTarget === '*', `${configSrc} Invalid redirection target URL ${picocolors_1.default.cyan(urlTarget)}: the target URL should start with ${picocolors_1.default.cyan('/')}, ${picocolors_1.default.cyan('http://')}, ${picocolors_1.default.cyan('https://')}, or be ${picocolors_1.default.cyan('*')}`);
27
+ // Is allowing any protocol a safety issue? https://github.com/vikejs/vike/pull/1292#issuecomment-1828043917
28
+ (0, parseUrl_extras_js_1.isUriWithProtocol)(urlTarget) ||
29
+ urlTarget === '*', `${configSrc} Invalid redirection target URL ${picocolors_1.default.cyan(urlTarget)}: the target URL should start with ${picocolors_1.default.cyan('/')}, a valid protocol (${picocolors_1.default.cyan('https:')}, ${picocolors_1.default.cyan('http:')}, ${picocolors_1.default.cyan('ipfs:')}, ${picocolors_1.default.cyan('magnet:')}, ...), or be ${picocolors_1.default.cyan('*')}`);
29
30
  assertParams(urlSource, urlTarget);
30
31
  const match = (0, resolveRouteString_js_1.resolveRouteString)(urlSource, urlPathname);
31
32
  if (!match)
@@ -37,10 +38,12 @@ function resolveRouteStringRedirect(urlSource, urlTarget, urlPathname) {
37
38
  }
38
39
  urlResolved = urlResolved.replaceAll(key, val);
39
40
  });
40
- (0, utils_js_1.assert)(!urlResolved.includes('@'));
41
+ if (!urlResolved.startsWith('mailto:')) {
42
+ (0, utils_js_1.assertUsage)(!urlResolved.includes('@'), 'URL should not contain "@" unless it is a mailto link.');
43
+ }
41
44
  if (urlResolved === urlPathname)
42
45
  return null;
43
- (0, utils_js_1.assert)(urlTarget.startsWith('/') || urlTarget.startsWith('http'));
46
+ (0, utils_js_1.assert)(urlResolved.startsWith('/') || (0, parseUrl_extras_js_1.isUriWithProtocol)(urlResolved));
44
47
  return urlResolved;
45
48
  }
46
49
  exports.resolveRouteStringRedirect = resolveRouteStringRedirect;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assertKeys = void 0;
7
+ const picocolors_1 = __importDefault(require("@brillout/picocolors"));
8
+ const assert_js_1 = require("./assert.js");
9
+ const joinEnglish_js_1 = require("./joinEnglish.js");
10
+ function assertKeys(obj, keysExpected, errPrefix) {
11
+ const keysUnknown = [];
12
+ const keys = Object.keys(obj);
13
+ for (const key of keys) {
14
+ if (!keysExpected.includes(key)) {
15
+ keysUnknown.push(key);
16
+ }
17
+ }
18
+ if (keysUnknown.length !== 0) {
19
+ (0, assert_js_1.assertUsage)(false, [
20
+ errPrefix,
21
+ `unknown key${keysUnknown.length === 1 ? '' : 's'}`,
22
+ (0, joinEnglish_js_1.joinEnglish)(keysUnknown, 'and', picocolors_1.default.cyan) + '.',
23
+ 'Only following keys are allowed:',
24
+ (0, joinEnglish_js_1.joinEnglish)(keysExpected, 'and', picocolors_1.default.cyan) + '.'
25
+ ].join(' '));
26
+ }
27
+ }
28
+ exports.assertKeys = assertKeys;
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.joinEnglish = void 0;
4
4
  const assert_js_1 = require("./assert.js");
5
5
  // https://stackoverflow.com/questions/53879088/join-an-array-by-commas-and-and/53879103#53879103
6
- function joinEnglish(arr, conjunction) {
6
+ function joinEnglish(arr, conjunction, colorizer = (s) => s) {
7
7
  (0, assert_js_1.assert)(arr.length > 0);
8
8
  if (arr.length === 1)
9
- return arr[0];
9
+ return colorizer(arr[0]);
10
10
  const firsts = arr.slice(0, arr.length - 1);
11
11
  const last = arr[arr.length - 1];
12
- return firsts.join(', ') + ` ${conjunction} ` + last;
12
+ return firsts.map(colorizer).join(', ') + ` ${conjunction} ` + colorizer(last);
13
13
  }
14
14
  exports.joinEnglish = joinEnglish;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addUrlOrigin = exports.removeUrlOrigin = exports.modifyUrlPathname = exports.removeBaseServer = exports.normalizeUrlPathname = exports.isBaseAssets = exports.prependBase = void 0;
3
+ exports.isUriWithProtocol = exports.addUrlOrigin = exports.removeUrlOrigin = exports.modifyUrlPathname = exports.removeBaseServer = exports.normalizeUrlPathname = exports.isBaseAssets = exports.prependBase = void 0;
4
4
  const parseUrl_js_1 = require("./parseUrl.js");
5
5
  const assert_js_1 = require("./assert.js");
6
6
  const slice_js_1 = require("./slice.js");
@@ -52,15 +52,20 @@ function isBaseAssets(base) {
52
52
  return base.startsWith('/') || base.startsWith('http://') || base.startsWith('https://');
53
53
  }
54
54
  exports.isBaseAssets = isBaseAssets;
55
- function normalizeUrlPathname(urlOriginal, trailingSlash) {
55
+ function normalizeUrlPathname(urlOriginal, trailingSlash, baseServer) {
56
56
  const urlNormalized = modifyUrlPathname(urlOriginal, (urlPathname) => {
57
57
  (0, assert_js_1.assert)(urlPathname.startsWith('/'));
58
- let urlPathnameNormalized = '/' + urlPathname.split('/').filter(Boolean).join('/');
59
- if (urlPathnameNormalized !== '/') {
60
- (0, assert_js_1.assert)(!urlPathnameNormalized.endsWith('/'));
61
- if (trailingSlash) {
62
- urlPathnameNormalized = urlPathnameNormalized + '/';
63
- }
58
+ let urlPathnameNormalized = normalize(urlPathname);
59
+ if (urlPathnameNormalized === '/') {
60
+ return urlPathnameNormalized;
61
+ }
62
+ // If the Base URL has a trailing slash, then Vite (as of vite@5.0.0-beta.19) expects the root URL to also have a trailing slash, see https://github.com/vikejs/vike/issues/1258#issuecomment-1812226260
63
+ if (baseServer.endsWith('/') && baseServer !== '/' && normalize(baseServer) === urlPathnameNormalized) {
64
+ trailingSlash = true;
65
+ }
66
+ (0, assert_js_1.assert)(!urlPathnameNormalized.endsWith('/'));
67
+ if (trailingSlash) {
68
+ urlPathnameNormalized = urlPathnameNormalized + '/';
64
69
  }
65
70
  return urlPathnameNormalized;
66
71
  });
@@ -69,6 +74,10 @@ function normalizeUrlPathname(urlOriginal, trailingSlash) {
69
74
  return urlNormalized;
70
75
  }
71
76
  exports.normalizeUrlPathname = normalizeUrlPathname;
77
+ function normalize(urlPathname) {
78
+ (0, assert_js_1.assert)(urlPathname.startsWith('/'));
79
+ return '/' + urlPathname.split('/').filter(Boolean).join('/');
80
+ }
72
81
  function modifyUrlPathname(url, modifier) {
73
82
  const { origin, pathnameOriginal, searchOriginal, hashOriginal } = (0, parseUrl_js_1.parseUrl)(url, '/');
74
83
  const pathnameModified = modifier(pathnameOriginal);
@@ -94,3 +103,8 @@ function addUrlOrigin(url, origin) {
94
103
  return urlModified;
95
104
  }
96
105
  exports.addUrlOrigin = addUrlOrigin;
106
+ function isUriWithProtocol(uri) {
107
+ // https://en.wikipedia.org/wiki/List_of_URI_schemes
108
+ return /^[a-z0-9][a-z0-9\.\+\-]*:/i.test(uri);
109
+ }
110
+ exports.isUriWithProtocol = isUriWithProtocol;
@@ -55,7 +55,7 @@ function parseUrl(url, baseServer) {
55
55
  searchAll[key] = [...(searchAll.hasOwnProperty(key) ? searchAll[key] : []), val];
56
56
  });
57
57
  // Origin + pathname
58
- const { origin, pathname: pathnameResolved } = parsePathname(urlWithoutHashNorSearch, baseServer);
58
+ const { origin, pathname: pathnameResolved } = getPathname(urlWithoutHashNorSearch, baseServer);
59
59
  (0, assert_js_1.assert)(origin === null || origin === decodeSafe(origin)); // AFAICT decoding the origin is useless
60
60
  (0, assert_js_1.assert)(pathnameResolved.startsWith('/'));
61
61
  (0, assert_js_1.assert)(origin === null || url.startsWith(origin));
@@ -91,35 +91,43 @@ function decodeSafe(urlComponent) {
91
91
  return urlComponent;
92
92
  }
93
93
  function decodePathname(urlPathname) {
94
+ urlPathname = urlPathname.replace(/\s+$/, '');
94
95
  urlPathname = urlPathname
95
96
  .split('/')
96
97
  .map((dir) => decodeSafe(dir).split('/').join('%2F'))
97
98
  .join('/');
98
- urlPathname = urlPathname.replace(/\s/g, '');
99
99
  return urlPathname;
100
100
  }
101
- function parsePathname(urlWithoutHashNorSearch, baseServer) {
101
+ function getPathname(url, baseServer) {
102
+ // Search and hash already extracted
103
+ (0, assert_js_1.assert)(!url.includes('?') && !url.includes('#'));
104
+ // url has origin
102
105
  {
103
- const { origin, pathname } = parseOrigin(urlWithoutHashNorSearch);
106
+ const { origin, pathname } = parseOrigin(url);
104
107
  if (origin) {
105
108
  return { origin, pathname };
106
109
  }
107
- (0, assert_js_1.assert)(pathname === urlWithoutHashNorSearch);
110
+ (0, assert_js_1.assert)(pathname === url);
108
111
  }
109
- if (urlWithoutHashNorSearch.startsWith('/')) {
110
- return { origin: null, pathname: urlWithoutHashNorSearch };
112
+ // url doesn't have origin
113
+ if (url.startsWith('/')) {
114
+ return { origin: null, pathname: url };
111
115
  }
112
116
  else {
113
- // In the browser, this is the Base URL of the current URL
117
+ // url is a relative path
118
+ // In the browser, this is the Base URL of the current URL.
114
119
  // Safe access `window?.document?.baseURI` for users who shim `window` in Node.js
115
- let baseURI = typeof window !== 'undefined' && window?.document?.baseURI;
116
- if (baseURI)
117
- baseURI = parseOrigin(baseURI).pathname;
118
- const base = baseURI || baseServer;
119
- const pathname = resolveUrlPathnameRelative(urlWithoutHashNorSearch, base);
120
- // We need to parse the origin in case `base === window.document.baseURI`
121
- const parsed = parseOrigin(pathname);
122
- return parsed;
120
+ const baseURI = typeof window !== 'undefined' ? window?.document?.baseURI : undefined;
121
+ let base;
122
+ if (baseURI) {
123
+ const baseURIPathaname = parseOrigin(baseURI.split('?')[0]).pathname;
124
+ base = baseURIPathaname;
125
+ }
126
+ else {
127
+ base = baseServer;
128
+ }
129
+ const pathname = resolveUrlPathnameRelative(url, base);
130
+ return { origin: null, pathname };
123
131
  }
124
132
  }
125
133
  function parseOrigin(url) {
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.projectInfo = void 0;
3
+ exports.PROJECT_VERSION = exports.projectInfo = void 0;
4
4
  const assertSingleInstance_js_1 = require("./assertSingleInstance.js");
5
- const PROJECT_VERSION = '0.4.146';
5
+ const PROJECT_VERSION = '0.4.147-commit-f9a91f3';
6
+ exports.PROJECT_VERSION = PROJECT_VERSION;
6
7
  const projectInfo = {
7
8
  projectName: 'Vike',
8
9
  projectVersion: PROJECT_VERSION,