vike 0.4.267 → 0.4.268

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 (198) hide show
  1. package/dist/client/runtime-client-routing/createPageContextClient.d.ts +5 -0
  2. package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +5 -0
  3. package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +26 -2
  4. package/dist/client/runtime-client-routing/getPageContextFromHooks.js +4 -5
  5. package/dist/client/runtime-client-routing/renderPageClient.d.ts +481 -10
  6. package/dist/client/runtime-client-routing/renderPageClient.js +116 -41
  7. package/dist/client/runtime-client-routing/streamedValues.d.ts +5 -0
  8. package/dist/client/runtime-client-routing/streamedValues.js +23 -0
  9. package/dist/client/runtime-server-routing/createPageContextClient.d.ts +5 -0
  10. package/dist/client/runtime-server-routing/entry.js +1 -1
  11. package/dist/client/runtime-server-routing/getGlobalContextClientInternal.d.ts +5 -0
  12. package/dist/client/shared/getGlobalContextClientInternalShared.d.ts +5 -0
  13. package/dist/client/shared/getGlobalContextClientInternalShared.js +2 -0
  14. package/dist/client/shared/getJsonSerializedInHtml.d.ts +2 -2
  15. package/dist/client/shared/getJsonSerializedInHtml.js +9 -6
  16. package/dist/client/shared/loadPageConfigsLazyClientSide.js +0 -4
  17. package/dist/client/shared/removeFoucBuster.js +14 -3
  18. package/dist/client/shared/streamedValues/asyncIterable.d.ts +4 -0
  19. package/dist/client/shared/streamedValues/asyncIterable.js +26 -0
  20. package/dist/client/shared/streamedValues/lines.d.ts +11 -0
  21. package/dist/client/shared/streamedValues/lines.js +19 -0
  22. package/dist/client/shared/streamedValues/promise.d.ts +4 -0
  23. package/dist/client/shared/streamedValues/promise.js +19 -0
  24. package/dist/client/shared/streamedValues/readableStream.d.ts +4 -0
  25. package/dist/client/shared/streamedValues/readableStream.js +44 -0
  26. package/dist/client/shared/streamedValues/registry.d.ts +21 -0
  27. package/dist/client/shared/streamedValues/registry.js +40 -0
  28. package/dist/client/shared/streamedValues.d.ts +7 -0
  29. package/dist/client/shared/streamedValues.js +82 -0
  30. package/dist/node/api/dev.js +15 -1
  31. package/dist/node/api/resolveViteConfigUser.js +2 -2
  32. package/dist/node/api/serverEntryDev.d.ts +10 -0
  33. package/dist/node/api/serverEntryDev.js +125 -0
  34. package/dist/node/createDevMiddleware.js +12 -0
  35. package/dist/node/prerender/resolvePrerenderConfig.d.ts +1 -1
  36. package/dist/node/prerender/resolvePrerenderConfig.js +4 -1
  37. package/dist/node/prerender/runPrerender.d.ts +18 -18
  38. package/dist/node/prerender/runPrerender.js +61 -16
  39. package/dist/node/vite/assertEnvVite.js +1 -1
  40. package/dist/node/vite/index.js +2 -0
  41. package/dist/node/vite/plugins/build/handleAssetsManifest.js +6 -2
  42. package/dist/node/vite/plugins/build/pluginBuildApp.js +25 -26
  43. package/dist/node/vite/plugins/build/pluginBuildConfig.d.ts +2 -2
  44. package/dist/node/vite/plugins/build/pluginBuildConfig.js +25 -17
  45. package/dist/node/vite/plugins/build/pluginDistFileNames.js +70 -50
  46. package/dist/node/vite/plugins/build/pluginEnvironmentEntries.d.ts +6 -0
  47. package/dist/node/vite/plugins/build/pluginEnvironmentEntries.js +71 -0
  48. package/dist/node/vite/plugins/build/pluginSuppressRollupWarning.js +19 -17
  49. package/dist/node/vite/plugins/pluginCommon.js +10 -7
  50. package/dist/node/vite/plugins/pluginDev/optimizeDeps.d.ts +1 -1
  51. package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +4 -2
  52. package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +6 -4
  53. package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.d.ts +3 -0
  54. package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.js +28 -2
  55. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.d.ts +1 -1
  56. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.js +22 -11
  57. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.d.ts +4 -0
  58. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.js +29 -0
  59. package/dist/node/vite/plugins/pluginUniversalDeploy.js +29 -5
  60. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.d.ts +2 -1
  61. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.js +29 -12
  62. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntryWithOldDesign.js +3 -2
  63. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFilePageEntry.js +7 -7
  64. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.d.ts +10 -6
  65. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js +5 -11
  66. package/dist/node/vite/plugins/pluginVirtualFiles.js +20 -0
  67. package/dist/node/vite/shared/addSsrMiddleware.js +11 -27
  68. package/dist/node/vite/shared/findPageFiles.d.ts +1 -1
  69. package/dist/node/vite/shared/findPageFiles.js +1 -11
  70. package/dist/node/vite/shared/getAssetsDir.d.ts +3 -2
  71. package/dist/node/vite/shared/getAssetsDir.js +3 -3
  72. package/dist/node/vite/shared/isViteCli.d.ts +3 -3
  73. package/dist/node/vite/shared/isViteCli.js +80 -84
  74. package/dist/node/vite/shared/isViteServerSide.js +2 -7
  75. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +6 -4
  76. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +17 -6
  77. package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +9 -2
  78. package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +5 -1
  79. package/dist/node/vite/shared/resolveVikeConfigInternal.js +86 -13
  80. package/dist/server/__internal/fetch-deprecated.d.ts +2 -0
  81. package/dist/server/__internal/fetch-deprecated.js +6 -0
  82. package/dist/server/__internal/fetch.d.ts +9 -0
  83. package/dist/server/__internal/fetch.js +5 -0
  84. package/dist/server/__internal/index.d.ts +1 -0
  85. package/dist/server/__internal/index.js +2 -0
  86. package/dist/server/createPageRenderer.d.ts +2 -2
  87. package/dist/server/createPageRenderer.js +2 -2
  88. package/dist/server/runtime/createDevMiddleware.js +3 -1
  89. package/dist/server/runtime/globalContext.d.ts +69 -10
  90. package/dist/server/runtime/globalContext.js +35 -2
  91. package/dist/server/runtime/index.d.ts +1 -1
  92. package/dist/server/runtime/index.js +1 -1
  93. package/dist/server/runtime/renderPageServer/analyzePage.js +3 -3
  94. package/dist/server/runtime/renderPageServer/createHttpResponse.d.ts +20 -9
  95. package/dist/server/runtime/renderPageServer/createHttpResponse.js +34 -21
  96. package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +13 -23
  97. package/dist/server/runtime/renderPageServer/csp.d.ts +2 -1
  98. package/dist/server/runtime/renderPageServer/csp.js +2 -1
  99. package/dist/server/runtime/renderPageServer/execHookOnError.js +1 -1
  100. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.d.ts +9 -0
  101. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.js +21 -9
  102. package/dist/server/runtime/renderPageServer/getHttpResponseBody.d.ts +2 -2
  103. package/dist/server/runtime/renderPageServer/getHttpResponseBody.js +19 -12
  104. package/dist/server/runtime/renderPageServer/getPageContextJson.d.ts +8 -0
  105. package/dist/server/runtime/renderPageServer/getPageContextJson.js +47 -0
  106. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.d.ts +2 -0
  107. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.js +1 -1
  108. package/dist/server/runtime/renderPageServer/handlePageContextRequestUrl.js +2 -2
  109. package/dist/server/runtime/renderPageServer/headersResponse.d.ts +11 -2
  110. package/dist/server/runtime/renderPageServer/headersResponse.js +22 -2
  111. package/dist/server/runtime/renderPageServer/html/injectAssets/getHtmlTags.js +5 -4
  112. package/dist/server/runtime/renderPageServer/html/injectAssets.d.ts +3 -2
  113. package/dist/server/runtime/renderPageServer/html/injectAssets.js +7 -1
  114. package/dist/server/runtime/renderPageServer/html/renderHtml.js +4 -2
  115. package/dist/server/runtime/renderPageServer/html/serializeContext.d.ts +5 -1
  116. package/dist/server/runtime/renderPageServer/html/serializeContext.js +12 -9
  117. package/dist/server/runtime/renderPageServer/html/stream.d.ts +13 -6
  118. package/dist/server/runtime/renderPageServer/html/stream.js +135 -32
  119. package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.d.ts +30 -0
  120. package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.js +92 -0
  121. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +10 -14
  122. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.js +5 -1
  123. package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.d.ts +15 -0
  124. package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.js +61 -0
  125. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +320 -55
  126. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.js +21 -12
  127. package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.d.ts +4 -0
  128. package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.js +12 -0
  129. package/dist/server/runtime/renderPageServer/streamedValues/lines.d.ts +10 -0
  130. package/dist/server/runtime/renderPageServer/streamedValues/lines.js +49 -0
  131. package/dist/server/runtime/renderPageServer/streamedValues/promise.d.ts +4 -0
  132. package/dist/server/runtime/renderPageServer/streamedValues/promise.js +14 -0
  133. package/dist/server/runtime/renderPageServer/streamedValues/pump.d.ts +10 -0
  134. package/dist/server/runtime/renderPageServer/streamedValues/pump.js +67 -0
  135. package/dist/server/runtime/renderPageServer/streamedValues/readableStream.d.ts +4 -0
  136. package/dist/server/runtime/renderPageServer/streamedValues/readableStream.js +12 -0
  137. package/dist/server/runtime/renderPageServer/streamedValues/registry.d.ts +28 -0
  138. package/dist/server/runtime/renderPageServer/streamedValues/registry.js +33 -0
  139. package/dist/server/runtime/renderPageServer.d.ts +65 -18
  140. package/dist/server/runtime/renderPageServer.js +31 -62
  141. package/dist/server/runtime/universal-middleware/core.d.ts +25 -0
  142. package/dist/server/runtime/universal-middleware/core.js +167 -0
  143. package/dist/server/runtime/universal-middleware/deprecated-export.d.ts +3 -0
  144. package/dist/server/runtime/universal-middleware/deprecated-export.js +10 -0
  145. package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.d.ts +15 -0
  146. package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.js +51 -0
  147. package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.d.ts +9 -0
  148. package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.js +22 -0
  149. package/dist/shared-server-client/createGlobalContextShared.d.ts +8 -0
  150. package/dist/shared-server-client/createGlobalContextShared.js +2 -1
  151. package/dist/shared-server-client/getPageContextPublicShared.js +0 -2
  152. package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.d.ts +8 -0
  153. package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.js +17 -7
  154. package/dist/shared-server-client/hooks/execHook.d.ts +1 -1
  155. package/dist/shared-server-client/hooks/execHook.js +2 -2
  156. package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.js +2 -0
  157. package/dist/shared-server-client/route/abort.d.ts +1 -1
  158. package/dist/shared-server-client/route/abort.js +4 -2
  159. package/dist/shared-server-client/streamedValues.d.ts +22 -0
  160. package/dist/shared-server-client/streamedValues.js +24 -0
  161. package/dist/shared-server-node/vike-environments.d.ts +4 -0
  162. package/dist/shared-server-node/vike-environments.js +10 -0
  163. package/dist/shared-server-node/virtualFileId.d.ts +7 -5
  164. package/dist/shared-server-node/virtualFileId.js +42 -42
  165. package/dist/types/Config.d.ts +10 -2
  166. package/dist/types/GlobalContext.d.ts +3 -3
  167. package/dist/types/PageConfig.d.ts +13 -5
  168. package/dist/types/PageContext.d.ts +18 -10
  169. package/dist/types/PageContext.js +1 -0
  170. package/dist/types/Server.d.ts +1 -1
  171. package/dist/types/VikeNamespace.d.ts +1 -1
  172. package/dist/types/index.d.ts +1 -0
  173. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  174. package/dist/utils/PROJECT_VERSION.js +1 -1
  175. package/dist/utils/assertViteVersion.d.ts +1 -3
  176. package/dist/utils/assertViteVersion.js +6 -9
  177. package/dist/utils/catchInfiniteLoop.js +33 -11
  178. package/dist/utils/deepEqual.d.ts +2 -1
  179. package/dist/utils/deepEqual.js +21 -6
  180. package/dist/utils/getContentTypeFromUrl.d.ts +2 -0
  181. package/dist/utils/getContentTypeFromUrl.js +39 -0
  182. package/dist/utils/injectRollupInputs.d.ts +2 -2
  183. package/dist/utils/injectRollupInputs.js +2 -2
  184. package/dist/utils/installUncaughtErrorHandlers.js +9 -0
  185. package/dist/utils/isDev.js +2 -7
  186. package/dist/utils/parseUrl-extras.js +4 -0
  187. package/fetch.js +2 -2
  188. package/package.json +35 -26
  189. package/universal-middleware.js +2 -2
  190. package/vike-server.d.ts +14 -0
  191. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.d.ts +0 -4
  192. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.js +0 -22
  193. package/dist/server/runtime/fetch.d.ts +0 -10
  194. package/dist/server/runtime/fetch.js +0 -5
  195. package/dist/server/runtime/universal-middleware.d.ts +0 -10
  196. package/dist/server/runtime/universal-middleware.js +0 -27
  197. package/dist/shared-server-client/addIs404ToPageProps.d.ts +0 -2
  198. package/dist/shared-server-client/addIs404ToPageProps.js +0 -17
@@ -1,4 +1,5 @@
1
1
  export { renderPageServer };
2
+ export { renderPageServer_userLand };
2
3
  export { getRequestTag };
3
4
  import { renderPageServerAfterRoute } from './renderPageServer/renderPageServerAfterRoute.js';
4
5
  import { createPageContextServer, createPageContextServerWithoutGlobalContext, } from './renderPageServer/createPageContextServer.js';
@@ -17,12 +18,13 @@ import { updateType } from '../../utils/updateType.js';
17
18
  import { getPageContextAddendumAbort, isAbortError, logAbort, addNewPageContextAborted, } from '../../shared-server-client/route/abort.js';
18
19
  import { getGlobalContextServerInternal, initGlobalContext_renderPage, } from './globalContext.js';
19
20
  import { handlePageContextRequestUrl } from './renderPageServer/handlePageContextRequestUrl.js';
20
- import { createHttpResponse404, createHttpResponseRedirect, createHttpResponsePageJson, createHttpResponseErrorFallback, createHttpResponseErrorFallback_noGlobalContext, createHttpResponseBaseIsMissing, createHttpResponseFromUniversalMiddleware, } from './renderPageServer/createHttpResponse.js';
21
+ import { getPageContextPublicServer } from './renderPageServer/getPageContextPublicServer.js';
22
+ import { createHttpResponse404, createHttpResponseRedirect, createHttpResponsePageJson, createHttpResponseErrorFallback, createHttpResponseErrorFallback_noGlobalContext, createHttpResponseBaseIsMissing, } from './renderPageServer/createHttpResponse.js';
21
23
  import { logRuntimeError, logRuntimeInfo } from './loggerRuntime.js';
22
24
  import { assertArguments } from './renderPageServer/assertArguments.js';
23
25
  import { log404 } from './renderPageServer/log404/index.js';
24
26
  import pc from '@brillout/picocolors';
25
- import { getPageContextClientSerializedAbort, getPageContextClientSerialized, } from './renderPageServer/html/serializeContext.js';
27
+ import { getPageContextClientSerializedAbort } from './renderPageServer/html/serializeContext.js';
26
28
  import { getErrorPageId } from '../../shared-server-client/error-page.js';
27
29
  import { handleErrorWithoutErrorPage } from './renderPageServer/handleErrorWithoutErrorPage.js';
28
30
  import { loadPageConfigsLazyServerSide, } from './renderPageServer/loadPageConfigsLazyServerSide.js';
@@ -30,15 +32,19 @@ import { resolveRedirects } from './renderPageServer/resolveRedirects.js';
30
32
  import { getVikeConfigError } from '../../shared-server-node/getVikeConfigError.js';
31
33
  import { forkPageContext } from '../../shared-server-client/forkPageContext.js';
32
34
  import { getAsyncLocalStorage } from './asyncHook.js';
35
+ import { getPageContextJson } from './renderPageServer/getPageContextJson.js';
36
+ import { hasPlusMiddlewares } from './universal-middleware/core.js';
33
37
  import '../assertEnvServer.js';
34
- import { enhance, apply, universalSymbol, UniversalRouter, getAdapterRuntime, } from '@universal-middleware/core';
35
- import { createRequestAdapter } from '@universal-middleware/node/request';
36
38
  const globalObject = getGlobalObject('runtime/renderPageServer.ts', {
37
39
  httpRequestsCount: 0,
38
40
  });
39
- // `renderPageServer()` calls `renderPageServerNominal()` while ensuring that errors are `console.error(err)` instead of `throw err`, so that Vike never triggers a server shut down. (Throwing an error in an Express.js middleware shuts down the whole Express.js server.)
40
- async function renderPageServer(pageContextInit) {
41
+ // The user's renderPage()
42
+ function renderPageServer_userLand(pageContextInit) {
41
43
  assertArguments(...arguments);
44
+ return renderPageServer(pageContextInit, true);
45
+ }
46
+ // `renderPageServer()` calls `renderPageServerNominal()` while ensuring that errors are `console.error(err)` instead of `throw err`, so that Vike never triggers a server shut down. (Throwing an error in an Express.js middleware shuts down the whole Express.js server.)
47
+ async function renderPageServer(pageContextInit, isCalledDirectlyByUser) {
42
48
  assert(hasProp(pageContextInit, 'urlOriginal', 'string')); // assertUsage() already implemented at assertArguments()
43
49
  assertIsUrl(pageContextInit.urlOriginal);
44
50
  onSetupRuntime();
@@ -50,14 +56,19 @@ async function renderPageServer(pageContextInit) {
50
56
  logHttpRequest(urlOriginalPretty, pageContextInit, requestId);
51
57
  const asyncLocalStorage = await getAsyncLocalStorage();
52
58
  const asyncStore = !asyncLocalStorage ? null : { requestId };
53
- const render = async () => await renderPageServerEntryOnceBegin(pageContextInit, requestId, asyncStore);
59
+ const render = async () => await renderPageServerEntryOnce(pageContextInit, isCalledDirectlyByUser, requestId, asyncStore);
54
60
  const pageContextFinish = !asyncLocalStorage ? await render() : await asyncLocalStorage.run(asyncStore, render);
55
61
  logHttpResponse(urlOriginalPretty, pageContextFinish);
56
62
  checkType(pageContextFinish);
57
63
  assertPageContextFinish(pageContextFinish);
58
- return pageContextFinish;
64
+ return getPageContextReturn(pageContextFinish);
59
65
  }
60
- async function renderPageServerEntryOnceBegin(pageContextInit, requestId, asyncStore) {
66
+ function getPageContextReturn(pageContextFinish) {
67
+ if (!hasProp(pageContextFinish, '_globalContext', 'object'))
68
+ return pageContextFinish;
69
+ return getPageContextPublicServer(pageContextFinish);
70
+ }
71
+ async function renderPageServerEntryOnce(pageContextInit, isCalledDirectlyByUser, requestId, asyncStore) {
61
72
  // Invalid config
62
73
  {
63
74
  const vikeConfigError = getVikeConfigError();
@@ -92,17 +103,8 @@ async function renderPageServerEntryOnceBegin(pageContextInit, requestId, asyncS
92
103
  }
93
104
  }
94
105
  const { globalContext } = await getGlobalContextServerInternal();
106
+ assertUsage(!isCalledDirectlyByUser || !hasPlusMiddlewares(globalContext), `renderPage() doesn't run +middleware — see ${pc.underline('https://vike.dev/error/setup-middlewares')}`);
95
107
  const pageContextBegin = getPageContextBegin(pageContextInit, globalContext, requestId, asyncStore);
96
- const middlewares = (globalContext.config.middleware ?? []).flat();
97
- const renderPageServerEntry = () => renderPageServerEntryOnce(pageContextBegin, globalContext, requestId);
98
- if (middlewares.length === 0) {
99
- return renderPageServerEntry();
100
- }
101
- else {
102
- return renderPageServerEntryWithMiddlewares(pageContextBegin, renderPageServerEntry, middlewares);
103
- }
104
- }
105
- async function renderPageServerEntryOnce(pageContextBegin, globalContext, requestId) {
106
108
  // Check Base URL
107
109
  {
108
110
  const pageContextHttpResponse = await checkBaseUrl(pageContextBegin, globalContext);
@@ -125,6 +127,7 @@ async function renderPageServerEntryOnce(pageContextBegin, globalContext, reques
125
127
  return await renderPageServerEntryRecursive(pageContextBegin, globalContext, requestId);
126
128
  }
127
129
  async function renderPageServerEntryRecursive(pageContextBegin, globalContext, requestId) {
130
+ assert(requestId);
128
131
  catchInfiniteLoop(`[${getRequestTag(requestId)}] renderPageServerEntryRecursive()`);
129
132
  const pageContextNominalPageBegin = fork(pageContextBegin);
130
133
  const pageContextAddendumAbort = getPageContextAddendumAbort(pageContextBegin.pageContextsAborted);
@@ -217,7 +220,9 @@ async function renderPageServerEntryRecursive_onError(err, pageContextBegin, pag
217
220
  catch (errErrorPage) {
218
221
  // Handle `throw redirect()` and `throw render()` while rendering error page
219
222
  if (isAbortError(errErrorPage)) {
220
- const handled = await handleAbort(errErrorPage, pageContextBegin, pageContextNominalPageBegin, requestId, pageContextErrorPageInit, globalContext);
223
+ const handled = await handleAbort(errErrorPage, pageContextBegin,
224
+ // The error page is the page that aborted
225
+ pageContextErrorPageInit, requestId, pageContextErrorPageInit, globalContext);
221
226
  if (handled.pageContextReturn) {
222
227
  // - throw redirect()
223
228
  // - throw render(url)
@@ -239,42 +244,6 @@ async function renderPageServerEntryRecursive_onError(err, pageContextBegin, pag
239
244
  }
240
245
  return pageContextErrorPage;
241
246
  }
242
- const requestAdapter = createRequestAdapter();
243
- async function renderPageServerEntryWithMiddlewares(pageContext, renderPageServerEntry, middlewares) {
244
- const router = new UniversalRouter(true, false);
245
- let httpResponseVikeCore = undefined;
246
- // Wrap rendering into universal-middleware routing
247
- apply(router, [
248
- enhance(async function adaptRenderPageServerEntryOnceInternal() {
249
- const pageContextHttpResponse = await renderPageServerEntry();
250
- const { httpResponse } = pageContextHttpResponse;
251
- pageContext = pageContextHttpResponse;
252
- httpResponseVikeCore = httpResponse;
253
- const readable = httpResponse.getReadableWebStream();
254
- return new Response(readable, {
255
- status: httpResponse.statusCode,
256
- headers: httpResponse.headers,
257
- });
258
- }, {
259
- name: 'vike',
260
- method: ['GET', 'POST', 'PUT', 'PATCH', 'HEAD', 'OPTIONS'],
261
- path: '/**', // rou3 format
262
- immutable: true, // avoids cloning the function we just created
263
- }),
264
- ...middlewares,
265
- ]);
266
- const handler = router[universalSymbol];
267
- const request = pageContext._reqWeb ??
268
- (pageContext._nodeDev
269
- ? requestAdapter(pageContext._nodeDev.req, pageContext._nodeDev.res)
270
- : new Request(new URL(pageContext.urlOriginal, 'http://localhost').toString(), {
271
- headers: pageContext.headers ?? {},
272
- }));
273
- const res = await handler(request, {}, getAdapterRuntime('other', { params: undefined }));
274
- const httpResponse = createHttpResponseFromUniversalMiddleware(res, httpResponseVikeCore?.earlyHints);
275
- objectAssign(pageContext, { httpResponse });
276
- return pageContext;
277
- }
278
247
  function logHttpRequest(urlOriginal, pageContextInit, requestId) {
279
248
  const pageContext = createPageContextServerWithoutGlobalContext(pageContextInit, requestId);
280
249
  logRuntimeInfo?.(getRequestInfoMessage(urlOriginal), pageContext, 'info');
@@ -453,7 +422,7 @@ async function getPermanentRedirect(pageContextBegin, globalContext) {
453
422
  if (normalize(urlTarget) === normalize(urlWithoutBase))
454
423
  return null;
455
424
  if (!originChanged)
456
- urlTarget = prependBase(urlTarget, globalContext.baseServer);
425
+ urlTarget = modifyUrlPathname(urlTarget, (urlPathname) => prependBase(urlPathname, globalContext.baseServer));
457
426
  assert(urlTarget !== pageContext.urlOriginal);
458
427
  }
459
428
  logRuntimeInfo?.(`Permanent redirection defined by config.redirects (https://vike.dev/redirects)`, pageContext, 'info');
@@ -470,14 +439,14 @@ pageContextNominalPageBegin, requestId, pageContextErrorPageInit, globalContext)
470
439
  logAbort(errAbort, globalContext._isProduction, pageContextNominalPageBegin);
471
440
  const pageContextAbort = errAbort._pageContextAbort;
472
441
  assert(pageContextAbort);
473
- addNewPageContextAborted(pageContextBegin.pageContextsAborted, pageContextNominalPageBegin, pageContextAbort);
442
+ addNewPageContextAborted(pageContextBegin.pageContextsAborted, pageContextNominalPageBegin, pageContextAbort, getPageContextPublicServer);
474
443
  const pageContext = fork(pageContextBegin);
475
444
  const pageContextAddendumAbort = getPageContextAddendumAbort(pageContextBegin.pageContextsAborted);
476
445
  objectAssign(pageContext, pageContextAddendumAbort);
477
446
  assert(pageContextAddendumAbort === pageContextAbort);
478
447
  // Client-side navigation — [`pageContext.json` request](https://vike.dev/pageContext.json)
479
448
  if (pageContextBegin.isClientSideNavigation) {
480
- let pageContextSerialized;
449
+ let pageContextJson;
481
450
  if (pageContextAbort.abortStatusCode) {
482
451
  const errorPageId = getErrorPageId(globalContext._pageFilesAll, globalContext._pageConfigs);
483
452
  const abortCall = pageContextAbort._abortCall;
@@ -487,12 +456,12 @@ pageContextNominalPageBegin, requestId, pageContextErrorPageInit, globalContext)
487
456
  objectAssign(pageContext, pageContextErrorPageInit, true);
488
457
  updateType(pageContext, await loadPageConfigsLazyServerSide(pageContext));
489
458
  // We include pageContextInit: we don't only serialize pageContextAbort because the error page may need to access pageContextInit
490
- pageContextSerialized = getPageContextClientSerialized(pageContext, false);
459
+ pageContextJson = getPageContextJson(pageContext);
491
460
  }
492
461
  else {
493
- pageContextSerialized = getPageContextClientSerializedAbort(pageContextAbort, false);
462
+ pageContextJson = getPageContextClientSerializedAbort(pageContextAbort, false);
494
463
  }
495
- const httpResponse = await createHttpResponsePageJson(pageContextSerialized);
464
+ const httpResponse = await createHttpResponsePageJson(pageContextJson, pageContext);
496
465
  objectAssign(pageContext, { httpResponse });
497
466
  return { pageContextReturn: pageContext };
498
467
  }
@@ -0,0 +1,25 @@
1
+ export { getMiddlewares_globalContext };
2
+ export { getMiddlewares_withErrorHandling };
3
+ export { hasPlusMiddlewares };
4
+ export { routeCatchAll };
5
+ export { mergeContext };
6
+ export type { Middleware };
7
+ import { type EnhancedMiddleware, type UniversalMiddleware } from '@universal-middleware/core';
8
+ import type { ConfigResolved } from '../../../types/Config/ConfigResolved.js';
9
+ import '../../assertEnvServer.js';
10
+ type Middleware = EnhancedMiddleware & {
11
+ isHandler: boolean;
12
+ };
13
+ declare const routeCatchAll: {
14
+ readonly name: 'vike';
15
+ readonly method: ["GET", "POST", "PUT", "PATCH", "HEAD", "OPTIONS"];
16
+ readonly path: '/**';
17
+ };
18
+ declare function getMiddlewares_globalContext(globalContext: {
19
+ config: ConfigResolved;
20
+ }, baseServer: string): Middleware[];
21
+ declare function getMiddlewares_withErrorHandling(): Promise<Middleware[]>;
22
+ declare function hasPlusMiddlewares(globalContext: {
23
+ config: ConfigResolved;
24
+ }): boolean;
25
+ declare function mergeContext(middleware: EnhancedMiddleware): UniversalMiddleware;
@@ -0,0 +1,167 @@
1
+ export { getMiddlewares_globalContext };
2
+ export { getMiddlewares_withErrorHandling };
3
+ export { hasPlusMiddlewares };
4
+ export { routeCatchAll };
5
+ export { mergeContext };
6
+ import { createMatcher, enhance, getUniversal, getUniversalProp, isHandler, methodSymbol, orderSymbol, pathSymbol, nameSymbol, runsSymbol, } from '@universal-middleware/core';
7
+ import { parseUrl } from '../../../utils/parseUrl.js';
8
+ import { prependBase } from '../../../utils/parseUrl-extras.js';
9
+ import { handlePageContextRequestUrl } from '../renderPageServer/handlePageContextRequestUrl.js';
10
+ import { renderPageServer } from '../renderPageServer.js';
11
+ import { getGlobalContextServerInternal, initGlobalContext_renderPage } from '../globalContext.js';
12
+ import { getVikeConfigError } from '../../../shared-server-node/getVikeConfigError.js';
13
+ import { assertWarning } from '../../../utils/assert.js';
14
+ import pc from '@brillout/picocolors';
15
+ import '../../assertEnvServer.js';
16
+ const routeCatchAll = {
17
+ name: 'vike',
18
+ method: ['GET', 'POST', 'PUT', 'PATCH', 'HEAD', 'OPTIONS'],
19
+ path: '/**',
20
+ };
21
+ // Vike's pages
22
+ const renderPageServer_universalMiddleware = enhance(renderPageServer_universal, routeCatchAll);
23
+ // globalContext.middlewares — every +middleware and Vike's handler that renders pages
24
+ function getMiddlewares_globalContext(globalContext, baseServer) {
25
+ return [
26
+ ...getMiddlewares_config(globalContext).map((plusMiddleware) => wrapWithVikeNormalizedURL(plusMiddleware, baseServer)),
27
+ renderPageServer_universalMiddleware,
28
+ ].map(withIsHandler);
29
+ }
30
+ // Returns globalContext.middlewares, or middlewares_errorHandling upon an invalid config
31
+ async function getMiddlewares_withErrorHandling() {
32
+ if (getVikeConfigError())
33
+ return middlewares_errorHandling;
34
+ try {
35
+ await initGlobalContext_renderPage();
36
+ }
37
+ catch {
38
+ return middlewares_errorHandling;
39
+ }
40
+ if (getVikeConfigError())
41
+ return middlewares_errorHandling;
42
+ const { globalContext } = await getGlobalContextServerInternal();
43
+ return globalContext.middlewares;
44
+ }
45
+ // Upon an invalid config: let renderPageServer() answer every request with the error (`+middleware` isn't defined upon config error)
46
+ const middlewares_errorHandling = [enhance(renderPageServer_universal, { name: 'vike:error-handling' })].map(withIsHandler);
47
+ async function renderPageServer_universal(request, context, runtime) {
48
+ const pageContextInit = {
49
+ urlOriginal: request.url, // Let `context` override it, e.g. `$ vike dev` passes the URL's path
50
+ headersOriginal: request.headers,
51
+ req: 'req' in runtime ? runtime.req : null,
52
+ res: 'res' in runtime ? runtime.res : null,
53
+ runtime,
54
+ ...context,
55
+ };
56
+ addUserAgent_deprecated(pageContextInit, request, runtime);
57
+ const pageContext = await renderPageServer(pageContextInit, false);
58
+ const { httpResponse } = pageContext;
59
+ return new Response(httpResponse.getReadableWebStream(), {
60
+ status: httpResponse.statusCode,
61
+ headers: httpResponse.headers,
62
+ });
63
+ }
64
+ // List of +middleware
65
+ function getMiddlewares_config(globalContext) {
66
+ return (globalContext.config.middleware ?? []).flat();
67
+ }
68
+ // Does a +middleware exist?
69
+ function hasPlusMiddlewares(globalContext) {
70
+ return getMiddlewares_config(globalContext).length > 0;
71
+ }
72
+ // Handle:
73
+ // - Base URL
74
+ // - JSON URL `.pageContext.json`
75
+ function wrapWithVikeNormalizedURL(plusMiddleware, baseServer) {
76
+ const { path, method, ...options } = getOptions(plusMiddleware);
77
+ if (path)
78
+ assertPath(options.name, path, baseServer);
79
+ if (isHandler(plusMiddleware)) {
80
+ // A handler is a route of the server, which matches it: its path gets the Base URL. (`enhance()` clones it, so that marking it `isHandler` leaves the extension's export untouched.)
81
+ return enhance(plusMiddleware, path ? { path: prependBase(path.startsWith('/') ? path : `/${path}`, baseServer) } : {});
82
+ }
83
+ const isMatch = path && createMatcher(path, method);
84
+ const plusMiddlewareMerged = mergeContext(plusMiddleware);
85
+ return enhance(async (request, context, runtime) => {
86
+ const { isPageContextJsonRequest, urlWithoutPageContextRequestSuffix } = handlePageContextRequestUrl(request.url);
87
+ if (isMatch) {
88
+ const { href, isBaseMissing } = parseUrl(urlWithoutPageContextRequestSuffix, baseServer);
89
+ if (isBaseMissing || !isMatch(new Request(href, { method: request.method })))
90
+ return;
91
+ }
92
+ const answer = await getUniversal(plusMiddlewareMerged)(request, context, runtime);
93
+ return isPageContextJsonRequest ? toPageContextJsonAnswer(answer) : answer;
94
+ }, {
95
+ ...options,
96
+ // Whatever its order, it doesn't run once a Response exists
97
+ runs: 'until-response',
98
+ });
99
+ }
100
+ // A +middleware's answer to a `.pageContext.json` request. Its own Response, or a response function's replacement of
101
+ // Vike's JSON, becomes a 404 without JSON: the client router then reloads the page, so that the page's own request shows
102
+ // the +middleware's answer (e.g. a 401, a redirect or a login page).
103
+ function toPageContextJsonAnswer(answer) {
104
+ const toReload = (response) => {
105
+ const headers = new Headers(response.headers);
106
+ headers.delete('content-type');
107
+ return new Response(response.body, { status: 404, headers });
108
+ };
109
+ // The +middleware answered instead of the page
110
+ if (answer instanceof Response)
111
+ return toReload(answer);
112
+ if (typeof answer !== 'function')
113
+ return answer;
114
+ return async (response) => {
115
+ const replaced = await answer(response);
116
+ // Vike's JSON, possibly re-encoded, keeps its status and its JSON Content-Type
117
+ const isVikeJson = replaced?.status === response.status && replaced.headers.get('content-type')?.includes('application/json');
118
+ return replaced && (isVikeJson ? replaced : toReload(replaced));
119
+ };
120
+ }
121
+ // Warns about a path that starts with the Base URL
122
+ function assertPath(name, path, baseServer) {
123
+ const base = baseServer.replace(/\/$/, '');
124
+ if (!base || (path !== base && !path.startsWith(`${base}/`)))
125
+ return;
126
+ assertWarning(false, `The +middleware ${name ? `${pc.bold(name)} ` : ''}has the path ${pc.cyan(path)}, which starts with the Base URL ${pc.cyan(baseServer)}. A +middleware path is relative to the Base URL, use ${pc.cyan(path.slice(base.length) || '/')} instead.`, { onlyOnce: `middleware-path:${name}:${path}` });
127
+ }
128
+ // Universal Middleware replaces the context with the one a middleware returns: Vike merges it into a new object, as a
129
+ // +middleware or a user-land universal middleware returns only what it adds, and an adapter may reuse the context
130
+ function mergeContext(middleware) {
131
+ return enhance(async (request, context, runtime) => {
132
+ const result = await getUniversal(middleware)(request, context, runtime);
133
+ if (!result || result instanceof Response || typeof result === 'function')
134
+ return result;
135
+ return { ...context, ...result };
136
+ }, getOptions(middleware));
137
+ }
138
+ // The options `enhance()` gave a middleware, also when an adapter wraps it, without the unset ones: Universal Middleware sorts an `order` set to `undefined` as `NaN`
139
+ function getOptions(middleware) {
140
+ const options = {
141
+ name: getUniversalProp(middleware, nameSymbol),
142
+ path: getUniversalProp(middleware, pathSymbol),
143
+ method: getUniversalProp(middleware, methodSymbol),
144
+ order: getUniversalProp(middleware, orderSymbol),
145
+ runs: getUniversalProp(middleware, runsSymbol),
146
+ };
147
+ return Object.fromEntries(Object.entries(options).filter(([, value]) => value !== undefined));
148
+ }
149
+ function withIsHandler(middleware) {
150
+ return Object.assign(middleware, { isHandler: isHandler(middleware) });
151
+ }
152
+ function addUserAgent_deprecated(pageContextInit, request, runtime) {
153
+ // Backwards compatibility for `$ vike dev` and `$ vike preview`
154
+ if (runtime.adapter === 'other' && 'req' in runtime) {
155
+ Object.defineProperty(pageContextInit, 'userAgent', {
156
+ get() {
157
+ // TO-DO/next-major-release: assertUsage() instead of assertWarning()
158
+ assertWarning(false, `${pc.cyan('pageContext.userAgent')} is deprecated: use ${pc.cyan("pageContext.headers['user-agent']")} instead.`, {
159
+ showStackTrace: true,
160
+ onlyOnce: true,
161
+ });
162
+ return request.headers.get('user-agent') ?? undefined;
163
+ },
164
+ enumerable: false,
165
+ });
166
+ }
167
+ }
@@ -0,0 +1,3 @@
1
+ export default vikeUniversalMiddleware;
2
+ import { vikeUniversalMiddleware } from './vikeUniversalMiddleware.js';
3
+ import '../../assertEnvServer.js';
@@ -0,0 +1,10 @@
1
+ export default vikeUniversalMiddleware;
2
+ // TO-DO/next-major-release: remove this export (the entire file)
3
+ import { vikeUniversalMiddleware } from './vikeUniversalMiddleware.js';
4
+ import { assertWarning } from '../../../utils/assert.js';
5
+ import '../../assertEnvServer.js';
6
+ assertWarning(false, [
7
+ "You're using a deprecated Vike extension:",
8
+ '- If you use one of the following, update to its latest version: @vikejs/hono, @vikejs/express, @vikejs/fastify, @vikejs/h3, or @vikejs/elysia',
9
+ '- If you use vike-photon or vike-server, migrate to +server.js — see https://vike.dev/migration/server',
10
+ ].join('\n'), { onlyOnce: true });
@@ -0,0 +1,15 @@
1
+ export { getMiddlewaresPipe_nonHandlers };
2
+ export { getMiddlewaresPipe_handlers };
3
+ export { pipeNonHandlers };
4
+ import { type UniversalHandler, type UniversalMiddleware } from '@universal-middleware/core';
5
+ import { type Middleware } from './core.js';
6
+ import '../../assertEnvServer.js';
7
+ /**
8
+ * What `vike(app, middlewares)` runs after the app's routes: the middlewares (looked up upon each request) that are handlers, as one universal handler (the pipe).
9
+ */
10
+ declare function getMiddlewaresPipe_handlers(middlewaresUserLand: object[]): UniversalHandler;
11
+ /**
12
+ * What `vike(app, middlewares)` applies before the app's routes: the middlewares (looked up upon each request) that aren't handlers, as one universal middleware (the pipe).
13
+ */
14
+ declare function getMiddlewaresPipe_nonHandlers(middlewaresUserLand: object[]): UniversalMiddleware;
15
+ declare function pipeNonHandlers(middlewares: Middleware[], nonHandlersUserLand: UniversalMiddleware[]): UniversalMiddleware;
@@ -0,0 +1,51 @@
1
+ export { getMiddlewaresPipe_nonHandlers };
2
+ export { getMiddlewaresPipe_handlers };
3
+ export { pipeNonHandlers };
4
+ import { enhance, isHandler, pipeRoute, } from '@universal-middleware/core';
5
+ import { getMiddlewares_withErrorHandling, mergeContext } from './core.js';
6
+ import '../../assertEnvServer.js';
7
+ /**
8
+ * What `vike(app, middlewares)` runs after the app's routes: the middlewares (looked up upon each request) that are handlers, as one universal handler (the pipe).
9
+ */
10
+ function getMiddlewaresPipe_handlers(
11
+ // `object[]`: the user-land universal middlewares can come from another copy of @universal-middleware/core, whose types don't match this copy's
12
+ middlewaresUserLand) {
13
+ const handlersUserLand = middlewaresUserLand.filter(isHandler);
14
+ const router = pipe((middlewares) => pipeRoute([...handlersUserLand, ...middlewares.filter((middleware) => middleware.isHandler)]));
15
+ return enhance(async (request, context, runtime) => {
16
+ return ((await router(request, context, runtime)) ??
17
+ // Fallback when no handler answers
18
+ new Response('Not Found', { status: 404 }));
19
+ }, {
20
+ name: 'vike:handlers',
21
+ method: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH'],
22
+ path: '/**',
23
+ });
24
+ }
25
+ /**
26
+ * What `vike(app, middlewares)` applies before the app's routes: the middlewares (looked up upon each request) that aren't handlers, as one universal middleware (the pipe).
27
+ */
28
+ function getMiddlewaresPipe_nonHandlers(
29
+ // `object[]`: the user-land universal middlewares can come from another copy of @universal-middleware/core, whose types don't match this copy's
30
+ middlewaresUserLand) {
31
+ const nonHandlersUserLand = middlewaresUserLand.filter((middleware) => !isHandler(middleware));
32
+ return enhance(pipe((middlewares) => pipeNonHandlers(middlewares, nonHandlersUserLand)), { name: 'vike:nonHandlers' });
33
+ }
34
+ function pipeNonHandlers(middlewares, nonHandlersUserLand) {
35
+ const nonHandlers = [
36
+ ...middlewares.filter((middleware) => !middleware.isHandler),
37
+ ...nonHandlersUserLand.map((middleware) => mergeContext(enhance(middleware, { runs: 'always' }))),
38
+ ];
39
+ return pipeRoute(nonHandlers);
40
+ }
41
+ function pipe(getPipe) {
42
+ // Caching: the list changes only when the config does, so getPipe() runs once per list
43
+ const cache = new WeakMap();
44
+ return async (request, context, runtime) => {
45
+ const middlewares = await getMiddlewares_withErrorHandling();
46
+ let ret = cache.get(middlewares);
47
+ if (!ret)
48
+ cache.set(middlewares, (ret = getPipe(middlewares)));
49
+ return ret(request, context, runtime);
50
+ };
51
+ }
@@ -0,0 +1,9 @@
1
+ export { vikeUniversalMiddleware };
2
+ import { type RuntimeAdapterTarget } from '@universal-middleware/core';
3
+ import '../../assertEnvServer.js';
4
+ declare const vikeUniversalMiddleware: typeof handler & import("@universal-middleware/core").WithUniversalSymbols<{
5
+ readonly name: 'vike';
6
+ readonly method: ["GET", "POST", "PUT", "PATCH", "HEAD", "OPTIONS"];
7
+ readonly path: '/**';
8
+ }>;
9
+ declare function handler(request: Request, context?: Universal.Context, runtime?: RuntimeAdapterTarget<unknown>): Promise<Response>;
@@ -0,0 +1,22 @@
1
+ export { vikeUniversalMiddleware };
2
+ import { enhance, getAdapterRuntime } from '@universal-middleware/core';
3
+ import { getMiddlewaresPipe_handlers, getMiddlewaresPipe_nonHandlers } from './getMiddlewaresPipe.js';
4
+ import { routeCatchAll } from './core.js';
5
+ import '../../assertEnvServer.js';
6
+ // The Universal Middleware for Vike's built-in server.
7
+ // - The same two pipes that `vike(app)` applies, but without any user-land middlewares (there aren't any)
8
+ const vikeUniversalMiddleware = enhance(handler, routeCatchAll);
9
+ const pipeNonHandlers = getMiddlewaresPipe_nonHandlers([]);
10
+ const pipeHandlers = getMiddlewaresPipe_handlers([]);
11
+ async function handler(request, context = {}, runtime = getAdapterRuntime('other', { params: undefined })) {
12
+ // A copy: Universal Middleware's `pipe()` writes a returned context into it when a response function follows, and a Cloudflare worker's `env` (its context) is shared by all requests
13
+ context = { ...context };
14
+ const answer = await pipeNonHandlers(request, context, runtime);
15
+ if (answer instanceof Response)
16
+ return answer;
17
+ // The context the +middleware returned
18
+ if (answer && typeof answer === 'object')
19
+ context = answer;
20
+ const response = await pipeHandlers(request, context, runtime);
21
+ return typeof answer === 'function' ? ((await answer(response)) ?? response) : response;
22
+ }
@@ -42,6 +42,10 @@ declare function createGlobalContextShared<GlobalContextAdded extends {}, Global
42
42
  _pageFilesAll: PageFile[];
43
43
  _pageConfigs: PageConfigRuntime[];
44
44
  _pageConfigGlobal: import("../types/PageConfig.js").PageConfigGlobalRuntime;
45
+ _environmentEntries: Record<string, {
46
+ pageConfigs: PageConfigRuntime[];
47
+ pageConfigGlobal: import("../types/PageConfig.js").PageConfigGlobalRuntime;
48
+ } | null>;
45
49
  _allPageIds: string[];
46
50
  } & GlobalContextAdded & Awaited<GlobalContextAddedAsync>>;
47
51
  type GlobalContextBasePublic = Pick<GlobalContextBase, 'config' | 'pages' | 'isGlobalContext'>;
@@ -74,5 +78,9 @@ declare function createGlobalContextBase(virtualFileExportsGlobalEntry: unknown)
74
78
  _pageFilesAll: PageFile[];
75
79
  _pageConfigs: PageConfigRuntime[];
76
80
  _pageConfigGlobal: import("../types/PageConfig.js").PageConfigGlobalRuntime;
81
+ _environmentEntries: Record<string, {
82
+ pageConfigs: PageConfigRuntime[];
83
+ pageConfigGlobal: import("../types/PageConfig.js").PageConfigGlobalRuntime;
84
+ } | null>;
77
85
  _allPageIds: string[];
78
86
  };
@@ -79,7 +79,7 @@ addGlobalContextTmp, addGlobalContextAsync) {
79
79
  }
80
80
  }
81
81
  function createGlobalContextBase(virtualFileExportsGlobalEntry) {
82
- const { pageFilesAll, pageConfigs, pageConfigGlobal } = parseVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry);
82
+ const { pageFilesAll, pageConfigs, pageConfigGlobal, environmentEntries } = parseVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry);
83
83
  const allPageIds = getAllPageIds(pageFilesAll, pageConfigs);
84
84
  const globalContextAddendum = resolveGlobalContextConfig(pageConfigs, pageConfigGlobal);
85
85
  const globalContext = {
@@ -94,6 +94,7 @@ function createGlobalContextBase(virtualFileExportsGlobalEntry) {
94
94
  _pageFilesAll: pageFilesAll,
95
95
  _pageConfigs: pageConfigs,
96
96
  _pageConfigGlobal: pageConfigGlobal,
97
+ _environmentEntries: environmentEntries,
97
98
  _allPageIds: allPageIds,
98
99
  ...globalContextAddendum,
99
100
  };
@@ -3,14 +3,12 @@ export { assertPropertyGetters };
3
3
  import { assert, assertWarning } from '../utils/assert.js';
4
4
  import { compareString } from '../utils/compareString.js';
5
5
  import { isPropertyGetter } from '../utils/isPropertyGetter.js';
6
- import { addIs404ToPageProps } from './addIs404ToPageProps.js';
7
6
  import { getGlobalContextPublicShared } from './getGlobalContextPublicShared.js';
8
7
  import { getPublicProxy } from './getPublicProxy.js';
9
8
  function getPageContextPublicShared(pageContext) {
10
9
  assert(!pageContext._isProxyObject);
11
10
  assert(!pageContext.globalContext); // pageContext.globalContext should only be available to users — Vike itself should use pageContext._globalContext instead
12
11
  assert(pageContext._isOriginalObject); // ensure we preserve the original object reference
13
- addIs404ToPageProps(pageContext);
14
12
  // TO-DO/next-major-release: remove
15
13
  if (!('_pageId' in pageContext)) {
16
14
  Object.defineProperty(pageContext, '_pageId', {
@@ -1,8 +1,16 @@
1
1
  export { parseVirtualFileExportsGlobalEntry };
2
+ export { parseGlobalEntryPageConfigs };
3
+ export type { EnvironmentEntry };
2
4
  import { type PageFile } from './getPageFileObject.js';
3
5
  import type { PageConfigRuntime, PageConfigGlobalRuntime } from '../../types/PageConfig.js';
4
6
  declare function parseVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry: unknown): {
5
7
  pageFilesAll: PageFile[];
6
8
  pageConfigs: PageConfigRuntime[];
7
9
  pageConfigGlobal: PageConfigGlobalRuntime;
10
+ environmentEntries: Record<string, null | EnvironmentEntry>;
11
+ };
12
+ type EnvironmentEntry = ReturnType<typeof parseGlobalEntryPageConfigs>;
13
+ declare function parseGlobalEntryPageConfigs(virtualFileExportsGlobalEntry: unknown): {
14
+ pageConfigs: PageConfigRuntime[];
15
+ pageConfigGlobal: PageConfigGlobalRuntime;
8
16
  };
@@ -1,4 +1,5 @@
1
1
  export { parseVirtualFileExportsGlobalEntry };
2
+ export { parseGlobalEntryPageConfigs };
2
3
  // TO-DO/next-major-release: remove old design code, and remove all assertions.
3
4
  import { assert } from '../../utils/assert.js';
4
5
  import { cast } from '../../utils/cast.js';
@@ -6,6 +7,7 @@ import { hasProp } from '../../utils/hasProp.js';
6
7
  import { isArray } from '../../utils/isArray.js';
7
8
  import { isCallable } from '../../utils/isCallable.js';
8
9
  import { isObject } from '../../utils/isObject.js';
10
+ import { objectMap } from '../../utils/objectMap.js';
9
11
  import { assertExportValues } from './assert_exports_old_design.js';
10
12
  import { getPageFileObject } from './getPageFileObject.js';
11
13
  import { fileTypes } from './fileTypes.js';
@@ -21,12 +23,12 @@ function parseVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry) {
21
23
  assert(hasProp(virtualFileExportsGlobalEntry.pageFilesLazy, '.page.client') ||
22
24
  hasProp(virtualFileExportsGlobalEntry.pageFilesLazy, '.page.server'));
23
25
  assert(hasProp(virtualFileExportsGlobalEntry, 'pageFilesList', 'string[]'));
24
- assert(hasProp(virtualFileExportsGlobalEntry, 'pageConfigsSerialized'));
25
- assert(hasProp(virtualFileExportsGlobalEntry, 'pageConfigGlobalSerialized'));
26
- const { pageConfigsSerialized, pageConfigGlobalSerialized } = virtualFileExportsGlobalEntry;
27
- assertPageConfigsSerialized(pageConfigsSerialized);
28
- assertPageConfigGlobalSerialized(pageConfigGlobalSerialized);
29
- const { pageConfigs, pageConfigGlobal } = parsePageConfigsSerialized(pageConfigsSerialized, pageConfigGlobalSerialized);
26
+ const { pageConfigs, pageConfigGlobal } = parseGlobalEntryPageConfigs(virtualFileExportsGlobalEntry);
27
+ // The global entries of the additional environments (e.g. `rsc`)
28
+ // - `null` in development: they're imported with environment.runner.import()
29
+ const environmentEntries = hasProp(virtualFileExportsGlobalEntry, 'environmentEntries', 'object')
30
+ ? objectMap(virtualFileExportsGlobalEntry.environmentEntries, (environmentEntry) => environmentEntry === null ? null : parseGlobalEntryPageConfigs(environmentEntry))
31
+ : {};
30
32
  const pageFilesMap = {};
31
33
  parseGlobResult(virtualFileExportsGlobalEntry.pageFilesLazy).forEach(({ filePath, pageFile, globValue }) => {
32
34
  pageFile = pageFilesMap[filePath] = pageFilesMap[filePath] ?? pageFile;
@@ -72,7 +74,15 @@ function parseVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry) {
72
74
  pageFilesAll.forEach(({ filePath }) => {
73
75
  assert(!filePath.includes('\\'));
74
76
  });
75
- return { pageFilesAll, pageConfigs, pageConfigGlobal };
77
+ return { pageFilesAll, pageConfigs, pageConfigGlobal, environmentEntries };
78
+ }
79
+ function parseGlobalEntryPageConfigs(virtualFileExportsGlobalEntry) {
80
+ assert(hasProp(virtualFileExportsGlobalEntry, 'pageConfigsSerialized'));
81
+ assert(hasProp(virtualFileExportsGlobalEntry, 'pageConfigGlobalSerialized'));
82
+ const { pageConfigsSerialized, pageConfigGlobalSerialized } = virtualFileExportsGlobalEntry;
83
+ assertPageConfigsSerialized(pageConfigsSerialized);
84
+ assertPageConfigGlobalSerialized(pageConfigGlobalSerialized);
85
+ return parsePageConfigsSerialized(pageConfigsSerialized, pageConfigGlobalSerialized);
76
86
  }
77
87
  function parseGlobResult(globObject) {
78
88
  const ret = [];
@@ -38,7 +38,7 @@ declare function execHookSingleWithReturn<PageContext extends PageContextExecHoo
38
38
  }>;
39
39
  declare function isUserHookError(err: unknown): false | HookLoc;
40
40
  declare function execHookSingleWithoutPageContext<HookReturn>(hook: Omit<HookInternal, 'hookFn'>, globalContext: GlobalContextPublicMinimum, hookFnCaller: () => HookReturn): Promise<HookReturn>;
41
- declare function execHookSingleSync<PageContext extends PageContextExecHook>(hook: Omit<HookInternal<PageContext>, 'hookTimeout'>, globalContext: GlobalContextPublicMinimum, pageContext: PageContext | null, getPageContextPublic: (pageContext: PageContext) => PageContext, hookFnCaller?: () => unknown): {
41
+ declare function execHookSingleSync<PageContext extends PageContextExecHook>(hook: Omit<HookInternal<PageContext>, 'hookTimeout'>, globalContext: GlobalContextPublicMinimum, pageContext: PageContext | null, getPageContextPublic: (pageContext: PageContext) => PageContext, hookFnCaller?: (pageContextPublic: PageContext | null) => unknown): {
42
42
  hookReturn: unknown;
43
43
  };
44
44
  type HookPublic = {