vike 0.4.267 → 0.4.268-commit-45c1759

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 (204) hide show
  1. package/RenderErrorPage.js +2 -2
  2. package/abort.js +2 -2
  3. package/dist/client/__internal/index.d.ts +2 -0
  4. package/dist/client/__internal/index.js +3 -0
  5. package/dist/client/runtime-client-routing/createPageContextClient.d.ts +5 -0
  6. package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +5 -0
  7. package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +26 -2
  8. package/dist/client/runtime-client-routing/getPageContextFromHooks.js +4 -5
  9. package/dist/client/runtime-client-routing/renderPageClient.d.ts +481 -10
  10. package/dist/client/runtime-client-routing/renderPageClient.js +116 -41
  11. package/dist/client/runtime-client-routing/streamedValues.d.ts +5 -0
  12. package/dist/client/runtime-client-routing/streamedValues.js +23 -0
  13. package/dist/client/runtime-server-routing/createPageContextClient.d.ts +5 -0
  14. package/dist/client/runtime-server-routing/entry.js +1 -1
  15. package/dist/client/runtime-server-routing/getGlobalContextClientInternal.d.ts +5 -0
  16. package/dist/client/shared/getGlobalContextClientInternalShared.d.ts +5 -0
  17. package/dist/client/shared/getGlobalContextClientInternalShared.js +2 -0
  18. package/dist/client/shared/getJsonSerializedInHtml.d.ts +2 -2
  19. package/dist/client/shared/getJsonSerializedInHtml.js +9 -6
  20. package/dist/client/shared/loadPageConfigsLazyClientSide.js +0 -4
  21. package/dist/client/shared/removeFoucBuster.js +14 -3
  22. package/dist/client/shared/streamedValues/asyncIterable.d.ts +4 -0
  23. package/dist/client/shared/streamedValues/asyncIterable.js +26 -0
  24. package/dist/client/shared/streamedValues/lines.d.ts +11 -0
  25. package/dist/client/shared/streamedValues/lines.js +19 -0
  26. package/dist/client/shared/streamedValues/promise.d.ts +4 -0
  27. package/dist/client/shared/streamedValues/promise.js +19 -0
  28. package/dist/client/shared/streamedValues/readableStream.d.ts +4 -0
  29. package/dist/client/shared/streamedValues/readableStream.js +44 -0
  30. package/dist/client/shared/streamedValues/registry.d.ts +21 -0
  31. package/dist/client/shared/streamedValues/registry.js +40 -0
  32. package/dist/client/shared/streamedValues.d.ts +7 -0
  33. package/dist/client/shared/streamedValues.js +82 -0
  34. package/dist/node/api/dev.js +15 -1
  35. package/dist/node/api/resolveViteConfigUser.js +2 -2
  36. package/dist/node/api/serverEntryDev.d.ts +10 -0
  37. package/dist/node/api/serverEntryDev.js +125 -0
  38. package/dist/node/createDevMiddleware.js +12 -0
  39. package/dist/node/prerender/resolvePrerenderConfig.d.ts +1 -1
  40. package/dist/node/prerender/resolvePrerenderConfig.js +4 -1
  41. package/dist/node/prerender/runPrerender.d.ts +18 -18
  42. package/dist/node/prerender/runPrerender.js +61 -16
  43. package/dist/node/vite/assertEnvVite.js +1 -1
  44. package/dist/node/vite/index.js +2 -0
  45. package/dist/node/vite/plugins/build/handleAssetsManifest.js +6 -2
  46. package/dist/node/vite/plugins/build/pluginBuildApp.js +25 -26
  47. package/dist/node/vite/plugins/build/pluginBuildConfig.d.ts +2 -2
  48. package/dist/node/vite/plugins/build/pluginBuildConfig.js +25 -17
  49. package/dist/node/vite/plugins/build/pluginDistFileNames.js +70 -50
  50. package/dist/node/vite/plugins/build/pluginEnvironmentEntries.d.ts +6 -0
  51. package/dist/node/vite/plugins/build/pluginEnvironmentEntries.js +71 -0
  52. package/dist/node/vite/plugins/build/pluginSuppressRollupWarning.js +19 -17
  53. package/dist/node/vite/plugins/pluginCommon.js +10 -7
  54. package/dist/node/vite/plugins/pluginDev/optimizeDeps.d.ts +2 -2
  55. package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +6 -2
  56. package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +6 -4
  57. package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.d.ts +3 -0
  58. package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.js +28 -2
  59. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.d.ts +1 -1
  60. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.js +22 -11
  61. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.d.ts +4 -0
  62. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.js +29 -0
  63. package/dist/node/vite/plugins/pluginUniversalDeploy.js +29 -5
  64. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.d.ts +2 -1
  65. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.js +29 -12
  66. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntryWithOldDesign.js +3 -2
  67. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFilePageEntry.js +7 -7
  68. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.d.ts +10 -6
  69. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js +5 -11
  70. package/dist/node/vite/plugins/pluginVirtualFiles.js +20 -0
  71. package/dist/node/vite/shared/addSsrMiddleware.js +11 -27
  72. package/dist/node/vite/shared/findPageFiles.d.ts +1 -1
  73. package/dist/node/vite/shared/findPageFiles.js +1 -11
  74. package/dist/node/vite/shared/getAssetsDir.d.ts +3 -2
  75. package/dist/node/vite/shared/getAssetsDir.js +3 -3
  76. package/dist/node/vite/shared/isViteCli.d.ts +3 -3
  77. package/dist/node/vite/shared/isViteCli.js +80 -84
  78. package/dist/node/vite/shared/isViteServerSide.js +2 -7
  79. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +6 -4
  80. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +17 -6
  81. package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +9 -2
  82. package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +5 -1
  83. package/dist/node/vite/shared/resolveVikeConfigInternal.js +86 -13
  84. package/dist/server/__internal/fetch-deprecated.d.ts +2 -0
  85. package/dist/server/__internal/fetch-deprecated.js +6 -0
  86. package/dist/server/__internal/fetch.d.ts +9 -0
  87. package/dist/server/__internal/fetch.js +5 -0
  88. package/dist/server/__internal/index.d.ts +4 -0
  89. package/dist/server/__internal/index.js +8 -0
  90. package/dist/server/createPageRenderer.d.ts +2 -2
  91. package/dist/server/createPageRenderer.js +2 -2
  92. package/dist/server/runtime/createDevMiddleware.js +3 -1
  93. package/dist/server/runtime/globalContext.d.ts +69 -10
  94. package/dist/server/runtime/globalContext.js +35 -2
  95. package/dist/server/runtime/index.d.ts +1 -1
  96. package/dist/server/runtime/index.js +1 -1
  97. package/dist/server/runtime/renderPageServer/analyzePage.js +3 -3
  98. package/dist/server/runtime/renderPageServer/createHttpResponse.d.ts +20 -9
  99. package/dist/server/runtime/renderPageServer/createHttpResponse.js +34 -21
  100. package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +13 -23
  101. package/dist/server/runtime/renderPageServer/csp.d.ts +2 -1
  102. package/dist/server/runtime/renderPageServer/csp.js +2 -1
  103. package/dist/server/runtime/renderPageServer/execHookOnError.js +1 -1
  104. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.d.ts +9 -0
  105. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.js +21 -9
  106. package/dist/server/runtime/renderPageServer/getHttpResponseBody.d.ts +2 -2
  107. package/dist/server/runtime/renderPageServer/getHttpResponseBody.js +19 -12
  108. package/dist/server/runtime/renderPageServer/getPageContextJson.d.ts +8 -0
  109. package/dist/server/runtime/renderPageServer/getPageContextJson.js +47 -0
  110. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.d.ts +2 -0
  111. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.js +1 -1
  112. package/dist/server/runtime/renderPageServer/handlePageContextRequestUrl.js +2 -2
  113. package/dist/server/runtime/renderPageServer/headersResponse.d.ts +11 -2
  114. package/dist/server/runtime/renderPageServer/headersResponse.js +22 -2
  115. package/dist/server/runtime/renderPageServer/html/injectAssets/getHtmlTags.js +5 -4
  116. package/dist/server/runtime/renderPageServer/html/injectAssets.d.ts +3 -2
  117. package/dist/server/runtime/renderPageServer/html/injectAssets.js +7 -1
  118. package/dist/server/runtime/renderPageServer/html/renderHtml.js +4 -2
  119. package/dist/server/runtime/renderPageServer/html/serializeContext.d.ts +5 -1
  120. package/dist/server/runtime/renderPageServer/html/serializeContext.js +12 -9
  121. package/dist/server/runtime/renderPageServer/html/stream.d.ts +13 -6
  122. package/dist/server/runtime/renderPageServer/html/stream.js +135 -32
  123. package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.d.ts +30 -0
  124. package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.js +92 -0
  125. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +10 -14
  126. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.js +5 -1
  127. package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.d.ts +15 -0
  128. package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.js +61 -0
  129. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +320 -55
  130. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.js +21 -12
  131. package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.d.ts +4 -0
  132. package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.js +12 -0
  133. package/dist/server/runtime/renderPageServer/streamedValues/lines.d.ts +10 -0
  134. package/dist/server/runtime/renderPageServer/streamedValues/lines.js +49 -0
  135. package/dist/server/runtime/renderPageServer/streamedValues/promise.d.ts +4 -0
  136. package/dist/server/runtime/renderPageServer/streamedValues/promise.js +14 -0
  137. package/dist/server/runtime/renderPageServer/streamedValues/pump.d.ts +10 -0
  138. package/dist/server/runtime/renderPageServer/streamedValues/pump.js +67 -0
  139. package/dist/server/runtime/renderPageServer/streamedValues/readableStream.d.ts +4 -0
  140. package/dist/server/runtime/renderPageServer/streamedValues/readableStream.js +12 -0
  141. package/dist/server/runtime/renderPageServer/streamedValues/registry.d.ts +28 -0
  142. package/dist/server/runtime/renderPageServer/streamedValues/registry.js +33 -0
  143. package/dist/server/runtime/renderPageServer.d.ts +65 -18
  144. package/dist/server/runtime/renderPageServer.js +33 -62
  145. package/dist/server/runtime/universal-middleware/core.d.ts +25 -0
  146. package/dist/server/runtime/universal-middleware/core.js +167 -0
  147. package/dist/server/runtime/universal-middleware/deprecated-export.d.ts +3 -0
  148. package/dist/server/runtime/universal-middleware/deprecated-export.js +10 -0
  149. package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.d.ts +15 -0
  150. package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.js +51 -0
  151. package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.d.ts +9 -0
  152. package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.js +22 -0
  153. package/dist/shared-server-client/createGlobalContextShared.d.ts +8 -0
  154. package/dist/shared-server-client/createGlobalContextShared.js +2 -1
  155. package/dist/shared-server-client/getPageContextPublicShared.js +0 -2
  156. package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.d.ts +8 -0
  157. package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.js +17 -7
  158. package/dist/shared-server-client/hooks/execHook.d.ts +1 -1
  159. package/dist/shared-server-client/hooks/execHook.js +2 -2
  160. package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.js +2 -0
  161. package/dist/shared-server-client/route/abort.d.ts +1 -1
  162. package/dist/shared-server-client/route/abort.js +4 -2
  163. package/dist/shared-server-client/streamedValues.d.ts +22 -0
  164. package/dist/shared-server-client/streamedValues.js +24 -0
  165. package/dist/shared-server-node/vike-environments.d.ts +4 -0
  166. package/dist/shared-server-node/vike-environments.js +10 -0
  167. package/dist/shared-server-node/virtualFileId.d.ts +7 -5
  168. package/dist/shared-server-node/virtualFileId.js +42 -42
  169. package/dist/types/Config.d.ts +11 -3
  170. package/dist/types/GlobalContext.d.ts +3 -3
  171. package/dist/types/PageConfig.d.ts +13 -5
  172. package/dist/types/PageContext.d.ts +18 -10
  173. package/dist/types/PageContext.js +1 -0
  174. package/dist/types/Server.d.ts +1 -1
  175. package/dist/types/VikeNamespace.d.ts +1 -1
  176. package/dist/types/index.d.ts +1 -0
  177. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  178. package/dist/utils/PROJECT_VERSION.js +1 -1
  179. package/dist/utils/assertViteVersion.d.ts +1 -3
  180. package/dist/utils/assertViteVersion.js +6 -9
  181. package/dist/utils/catchInfiniteLoop.js +33 -11
  182. package/dist/utils/deepEqual.d.ts +2 -1
  183. package/dist/utils/deepEqual.js +21 -6
  184. package/dist/utils/getContentTypeFromUrl.d.ts +2 -0
  185. package/dist/utils/getContentTypeFromUrl.js +39 -0
  186. package/dist/utils/injectRollupInputs.d.ts +2 -2
  187. package/dist/utils/injectRollupInputs.js +2 -2
  188. package/dist/utils/installUncaughtErrorHandlers.js +9 -0
  189. package/dist/utils/isDev.js +2 -7
  190. package/dist/utils/parseUrl-extras.js +4 -0
  191. package/fetch.js +2 -2
  192. package/modifyUrl.js +2 -2
  193. package/package.json +42 -26
  194. package/routing.js +2 -2
  195. package/universal-middleware.js +2 -2
  196. package/vike-server.d.ts +14 -0
  197. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.d.ts +0 -4
  198. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.js +0 -22
  199. package/dist/server/runtime/fetch.d.ts +0 -10
  200. package/dist/server/runtime/fetch.js +0 -5
  201. package/dist/server/runtime/universal-middleware.d.ts +0 -10
  202. package/dist/server/runtime/universal-middleware.js +0 -27
  203. package/dist/shared-server-client/addIs404ToPageProps.d.ts +0 -2
  204. package/dist/shared-server-client/addIs404ToPageProps.js +0 -17
@@ -1,4 +1,4 @@
1
- export { renderPageServer as renderPage } from './renderPageServer.js';
1
+ export { renderPageServer_userLand as renderPage } from './renderPageServer.js';
2
2
  export { escapeInject, dangerouslySkipEscape } from './renderPageServer/html/renderHtml.js';
3
3
  export { pipeWebStream, pipeNodeStream, pipeStream, stampPipe } from './renderPageServer/html/stream.js';
4
4
  export { PROJECT_VERSION as version } from '../../utils/PROJECT_VERSION.js';
@@ -18,14 +18,14 @@ function analyzePage(pageContext) {
18
18
  clientEntries.push(getVikeClientEntry(isClientRouting));
19
19
  const clientDependencies = [];
20
20
  clientDependencies.push({
21
- id: generateVirtualFileId({ type: 'page-entry', pageId: pageConfig.pageId, isForClientSide: true }),
21
+ id: generateVirtualFileId({ type: 'page-entry', pageId: pageConfig.pageId, environmentName: 'client' }),
22
22
  onlyAssets: isClientRuntimeLoaded ? false : true,
23
23
  eagerlyImported: false,
24
24
  });
25
25
  // In production we inject the import of the server virtual module with ?extractAssets inside the client virtual module
26
26
  if (!globalContext._isProduction) {
27
27
  clientDependencies.push({
28
- id: generateVirtualFileId({ type: 'page-entry', pageId: pageConfig.pageId, isForClientSide: false }),
28
+ id: generateVirtualFileId({ type: 'page-entry', pageId: pageConfig.pageId, environmentName: 'server' }),
29
29
  onlyAssets: true,
30
30
  eagerlyImported: false,
31
31
  });
@@ -36,7 +36,7 @@ function analyzePage(pageContext) {
36
36
  const { env } = configElement
37
37
  assert(env)
38
38
  const onlyAssets = env === { server: true }
39
- const eagerlyImported = env === { server: true, client: 'if-client-routing', eager: true }
39
+ const eagerlyImported = env === { server: true, client: true, clientRoutingOnly: true, eager: true }
40
40
  if (onlyAssets || eagerlyImported) {
41
41
  clientDependencies.push({
42
42
  id: configElement.importPath,
@@ -1,4 +1,5 @@
1
- export { createHttpResponsePage };
1
+ export { createHttpResponsePageHtml };
2
+ export { createHttpResponsePageContent };
2
3
  export { createHttpResponsePageJson };
3
4
  export { createHttpResponseErrorFallback };
4
5
  export { createHttpResponseErrorFallback_noGlobalContext };
@@ -6,12 +7,12 @@ export { createHttpResponseErrorFallbackJson };
6
7
  export { createHttpResponseRedirect };
7
8
  export { createHttpResponse404 };
8
9
  export { createHttpResponseBaseIsMissing };
9
- export { createHttpResponseFromUniversalMiddleware };
10
10
  export type { HttpResponse };
11
11
  import type { GetPageAssets } from './getPageAssets.js';
12
12
  import type { HtmlRender } from './html/renderHtml.js';
13
- import type { RenderHook } from './execHookOnRenderHtml.js';
14
- import type { AbortStatusCode, UrlRedirect } from '../../../shared-server-client/route/abort.js';
13
+ import type { StreamReadableWeb } from './html/stream.js';
14
+ import type { Content, RenderHook } from './execHookOnRenderHtml.js';
15
+ import type { AbortStatusCode, UrlRedirect, PageContextAborted } from '../../../shared-server-client/route/abort.js';
15
16
  import { HttpResponseBody } from './getHttpResponseBody.js';
16
17
  import { type EarlyHint } from './getEarlyHints.js';
17
18
  import type { PageContextBegin } from '../renderPageServer.js';
@@ -24,7 +25,7 @@ type HttpResponse = {
24
25
  /** **Deprecated**: use `headers` instead, see https://vike.dev/migration/0.4.134 */
25
26
  contentType: string | undefined;
26
27
  } & HttpResponseBody;
27
- declare function createHttpResponsePage(htmlRender: HtmlRender, renderHook: null | RenderHook, pageContext: {
28
+ type PageContextHttpResponsePage = {
28
29
  pageId: null | string;
29
30
  is404: null | boolean;
30
31
  errorWhileRendering: null | Error;
@@ -32,14 +33,24 @@ declare function createHttpResponsePage(htmlRender: HtmlRender, renderHook: null
32
33
  _globalContext: GlobalContextServerInternal;
33
34
  abortStatusCode?: AbortStatusCode;
34
35
  headersResponse?: Headers;
35
- }): Promise<HttpResponse>;
36
+ pageContextsAborted: PageContextAborted[];
37
+ };
38
+ declare function createHttpResponsePageHtml(htmlRender: HtmlRender, renderHook: null | RenderHook, pageContext: PageContextHttpResponsePage): Promise<HttpResponse>;
39
+ declare function createHttpResponsePageContent(content: Content, renderHook: RenderHook, pageContext: PageContextHttpResponsePage & {
40
+ urlOriginal: string;
41
+ }): HttpResponse;
36
42
  declare function createHttpResponse404(errMsg404: string): HttpResponse;
37
43
  declare function createHttpResponseBaseIsMissing(urlOriginal: string, baseServer: string): HttpResponse;
38
44
  declare function createHttpResponseErrorFallback(pageContext: {
39
45
  _globalContext: GlobalContextServerInternal;
46
+ pageContextsAborted: PageContextAborted[];
40
47
  }): HttpResponse;
41
48
  declare function createHttpResponseErrorFallback_noGlobalContext(): HttpResponse;
42
- declare function createHttpResponseErrorFallbackJson(): HttpResponse;
43
- declare function createHttpResponsePageJson(pageContextSerialized: string): Promise<HttpResponse>;
49
+ declare function createHttpResponseErrorFallbackJson(pageContext: {
50
+ pageContextsAborted: PageContextAborted[];
51
+ }): HttpResponse;
52
+ declare function createHttpResponsePageJson(pageContextJson: string | StreamReadableWeb, pageContext: {
53
+ headersResponse?: Headers;
54
+ pageContextsAborted: PageContextAborted[];
55
+ }): Promise<HttpResponse>;
44
56
  declare function createHttpResponseRedirect({ url, statusCode }: UrlRedirect, pageContextInit: PageContextBegin): HttpResponse;
45
- declare function createHttpResponseFromUniversalMiddleware(response: Response, earlyHints?: EarlyHint[]): HttpResponse;
@@ -1,4 +1,5 @@
1
- export { createHttpResponsePage };
1
+ export { createHttpResponsePageHtml };
2
+ export { createHttpResponsePageContent };
2
3
  export { createHttpResponsePageJson };
3
4
  export { createHttpResponseErrorFallback };
4
5
  export { createHttpResponseErrorFallback_noGlobalContext };
@@ -6,20 +7,34 @@ export { createHttpResponseErrorFallbackJson };
6
7
  export { createHttpResponseRedirect };
7
8
  export { createHttpResponse404 };
8
9
  export { createHttpResponseBaseIsMissing };
9
- export { createHttpResponseFromUniversalMiddleware };
10
10
  import { escapeHtml } from '../../../utils/escapeHtml.js';
11
11
  import { assert, assertWarning } from '../../../utils/assert.js';
12
12
  import { getErrorPageId, isErrorPage } from '../../../shared-server-client/error-page.js';
13
+ import { getContentTypeFromUrl } from '../../../utils/getContentTypeFromUrl.js';
13
14
  import { getHttpResponseBody, getHttpResponseBodyStreamHandlers } from './getHttpResponseBody.js';
14
15
  import { getEarlyHints } from './getEarlyHints.js';
15
16
  import { assertNoInfiniteHttpRedirect } from './createHttpResponse/assertNoInfiniteHttpRedirect.js';
16
- import { resolveHeadersResponseFinal } from './headersResponse.js';
17
+ import { getHeadersSetCookieAborted, resolveHeadersResponseFinal, resolveHeadersResponseSetCookie, } from './headersResponse.js';
17
18
  import { stringify } from '@brillout/json-serializer/stringify';
18
19
  import '../../assertEnvServer.js';
19
20
  const contentTypeJson = 'application/json';
20
21
  const contentTypeHtml = 'text/html;charset=utf-8';
21
22
  const htmlFallbackLog = 'This HTML was generated by Vike.';
22
- async function createHttpResponsePage(htmlRender, renderHook, pageContext) {
23
+ async function createHttpResponsePageHtml(htmlRender, renderHook, pageContext) {
24
+ const statusCode = getStatusCode(pageContext);
25
+ const earlyHints = getEarlyHints(await pageContext.__getPageAssets());
26
+ const headers = resolveHeadersResponseFinal(pageContext, statusCode);
27
+ return createHttpResponse(statusCode, contentTypeHtml, headers, htmlRender, earlyHints, renderHook);
28
+ }
29
+ function createHttpResponsePageContent(content, renderHook, pageContext) {
30
+ const statusCode = getStatusCode(pageContext);
31
+ const headers = resolveHeadersResponseFinal(pageContext, statusCode);
32
+ if (!headers.some(([k]) => k.toLowerCase() === 'content-type')) {
33
+ headers.push(['Content-Type', getContentTypeFromUrl(pageContext.urlOriginal) ?? 'application/octet-stream']);
34
+ }
35
+ return createHttpResponseCommon(statusCode, headers, content, [], renderHook);
36
+ }
37
+ function getStatusCode(pageContext) {
23
38
  let statusCode = pageContext.abortStatusCode;
24
39
  if (!statusCode) {
25
40
  const isError = !pageContext.pageId || isErrorPage(pageContext.pageId, pageContext._globalContext._pageConfigs);
@@ -35,9 +50,7 @@ async function createHttpResponsePage(htmlRender, renderHook, pageContext) {
35
50
  statusCode = pageContext.is404 ? 404 : 500;
36
51
  }
37
52
  }
38
- const earlyHints = getEarlyHints(await pageContext.__getPageAssets());
39
- const headers = resolveHeadersResponseFinal(pageContext, statusCode);
40
- return createHttpResponse(statusCode, contentTypeHtml, headers, htmlRender, earlyHints, renderHook);
53
+ return statusCode;
41
54
  }
42
55
  function createHttpResponse404(errMsg404) {
43
56
  const httpResponse = createHttpResponse(404, contentTypeHtml, [], getHtmlFallback(`<p>${errMsg404}.</p>`));
@@ -76,21 +89,26 @@ function createHttpResponseErrorFallback(pageContext) {
76
89
  return 'no error page (https://vike.dev/error-page) is defined, make sure to create one';
77
90
  }
78
91
  })();
79
- return createHttpResponseError_(reason);
92
+ // Cookies set before `throw redirect()` or `throw render()` are kept
93
+ return createHttpResponseError_(reason, getHeadersSetCookieAborted(pageContext));
80
94
  }
81
95
  function createHttpResponseErrorFallback_noGlobalContext() {
82
- return createHttpResponseError_('no error page (https://vike.dev/error-page) could be rendered');
96
+ return createHttpResponseError_('no error page (https://vike.dev/error-page) could be rendered', []);
83
97
  }
84
- function createHttpResponseError_(reason) {
85
- const httpResponse = createHttpResponse(500, contentTypeHtml, [], getHtmlFallback('<p>An error occurred.</p>', `${htmlFallbackLog} Vike returned this HTML because ${reason}.`));
98
+ function createHttpResponseError_(reason, headers) {
99
+ const httpResponse = createHttpResponse(500, contentTypeHtml, headers, getHtmlFallback('<p>An error occurred.</p>', `${htmlFallbackLog} Vike returned this HTML because ${reason}.`));
86
100
  return httpResponse;
87
101
  }
88
- function createHttpResponseErrorFallbackJson() {
89
- const httpResponse = createHttpResponse(500, contentTypeJson, [], stringify({ serverSideError: true }));
102
+ function createHttpResponseErrorFallbackJson(pageContext) {
103
+ const headers = getHeadersSetCookieAborted(pageContext);
104
+ const httpResponse = createHttpResponse(500, contentTypeJson, headers, stringify({ serverSideError: true }));
90
105
  return httpResponse;
91
106
  }
92
- async function createHttpResponsePageJson(pageContextSerialized) {
93
- const httpResponse = createHttpResponse(200, contentTypeJson, [], pageContextSerialized, [], null);
107
+ async function createHttpResponsePageJson(pageContextJson, pageContext) {
108
+ const headers = resolveHeadersResponseSetCookie(pageContext);
109
+ headers.push(['Content-Type', contentTypeJson]);
110
+ // A stream if there are streamed pageContext values, see https://vike.dev/passToClient#streaming
111
+ const httpResponse = createHttpResponseCommon(200, headers, pageContextJson);
94
112
  return httpResponse;
95
113
  }
96
114
  function createHttpResponseRedirect({ url, statusCode }, pageContextInit) {
@@ -98,17 +116,12 @@ function createHttpResponseRedirect({ url, statusCode }, pageContextInit) {
98
116
  assert(url);
99
117
  assert(statusCode);
100
118
  assert(300 <= statusCode && statusCode <= 399);
101
- const headers = [['Location', url]];
119
+ const headers = [['Location', url], ...resolveHeadersResponseSetCookie(pageContextInit)];
102
120
  return createHttpResponse(statusCode, contentTypeHtml, headers,
103
121
  // For bots / programmatic crawlig: show what's going on.
104
122
  // For users: showing a blank page is probably better than a flickering text.
105
123
  getHtmlFallback(`<p style="display: none">Redirecting to ${escapeHtml(url)}</p>`));
106
124
  }
107
- function createHttpResponseFromUniversalMiddleware(response, earlyHints) {
108
- const body = response.body ?? getHtmlFallback('<p style="display: none">No HTTP response body.</p>');
109
- const httpResponse = createHttpResponseCommon(response.status, Array.from(response.headers.entries()), body, earlyHints);
110
- return httpResponse;
111
- }
112
125
  function getHtmlFallback(bodyHtml, logText = htmlFallbackLog) {
113
126
  return `${bodyHtml}<script>console.log(${JSON.stringify(logText)})</script>`;
114
127
  }
@@ -3,10 +3,10 @@ export { createPageContextServerWithoutGlobalContext };
3
3
  export type { PageContextCreatedServer };
4
4
  export type { PageContextCreatedServerWithoutGlobalContext };
5
5
  import type { GlobalContextServerInternal } from '../globalContext.js';
6
- import type { PageContextInit, PageContextInitInternal } from '../renderPageServer.js';
6
+ import type { PageContextInit } from '../renderPageServer.js';
7
7
  import '../../assertEnvServer.js';
8
8
  type PageContextCreatedServer = Awaited<ReturnType<typeof createPageContextServer>>;
9
- declare function createPageContextServer(pageContextInit: PageContextInitInternal & {
9
+ declare function createPageContextServer(pageContextInit: PageContextInit & {
10
10
  headers?: Record<string, unknown>;
11
11
  }, globalContext: GlobalContextServerInternal, args: {
12
12
  requestId: number;
@@ -24,12 +24,6 @@ declare function createPageContextServer(pageContextInit: PageContextInitInterna
24
24
  isPrerendering: boolean;
25
25
  _requestId: number;
26
26
  } & PageContextInit & {
27
- _nodeDev?: {
28
- req: import("http").IncomingMessage;
29
- res: import("http").ServerResponse;
30
- };
31
- _reqWeb?: Request;
32
- } & {
33
27
  _globalContext: ({
34
28
  config: import("../../../types/index.js").ConfigResolved;
35
29
  _source: import("../../../shared-server-client/page-configs/resolveVikeConfigPublic.js").Source;
@@ -53,6 +47,10 @@ declare function createPageContextServer(pageContextInit: PageContextInitInterna
53
47
  _pageFilesAll: import("../../__internal/index.js").PageFile[];
54
48
  _pageConfigs: import("../../__internal/index.js").PageConfig[];
55
49
  _pageConfigGlobal: import("../../../types/PageConfig.js").PageConfigGlobalRuntime;
50
+ _environmentEntries: Record<string, {
51
+ pageConfigs: import("../../__internal/index.js").PageConfig[];
52
+ pageConfigGlobal: import("../../../types/PageConfig.js").PageConfigGlobalRuntime;
53
+ } | null>;
56
54
  _allPageIds: string[];
57
55
  } & (({
58
56
  isClientSide: false;
@@ -62,6 +60,7 @@ declare function createPageContextServer(pageContextInit: PageContextInitInterna
62
60
  _isPrerendering: false;
63
61
  assetsManifest: null;
64
62
  _viteDevServer: import("vite").ViteDevServer | undefined;
63
+ devMiddleware: import("vite").Connect.Server | null;
65
64
  viteConfig: import("vite").ResolvedConfig | undefined;
66
65
  } | {
67
66
  isClientSide: false;
@@ -70,6 +69,7 @@ declare function createPageContextServer(pageContextInit: PageContextInitInterna
70
69
  _isProduction: true;
71
70
  assetsManifest: import("../../../types/ViteManifest.js").ViteManifest;
72
71
  _viteDevServer: null;
72
+ devMiddleware: null;
73
73
  _usesClientRouter: boolean;
74
74
  _isPrerendering: true;
75
75
  viteConfig: import("vite").ResolvedConfig;
@@ -80,12 +80,11 @@ declare function createPageContextServer(pageContextInit: PageContextInitInterna
80
80
  _isProduction: true;
81
81
  assetsManifest: import("../../../types/ViteManifest.js").ViteManifest;
82
82
  _viteDevServer: null;
83
+ devMiddleware: null;
83
84
  _usesClientRouter: boolean;
84
85
  _isPrerendering: false;
85
86
  viteConfig: null;
86
87
  }) & {
87
- baseServer: string;
88
- baseAssets: string;
89
88
  viteConfigRuntime: {
90
89
  root: string;
91
90
  build: {
@@ -96,6 +95,9 @@ declare function createPageContextServer(pageContextInit: PageContextInitInterna
96
95
  inject: boolean | undefined;
97
96
  };
98
97
  };
98
+ baseServer: string;
99
+ baseAssets: string;
100
+ middlewares: import("../universal-middleware/core.js").Middleware[];
99
101
  })) & {
100
102
  prerenderContext: import("../../../types/index.js").PrerenderContext | undefined;
101
103
  };
@@ -103,12 +105,6 @@ declare function createPageContextServer(pageContextInit: PageContextInitInterna
103
105
  _baseServer: string;
104
106
  _baseAssets: string;
105
107
  _pageContextInit: PageContextInit & {
106
- _nodeDev?: {
107
- req: import("http").IncomingMessage;
108
- res: import("http").ServerResponse;
109
- };
110
- _reqWeb?: Request;
111
- } & {
112
108
  headers?: Record<string, unknown>;
113
109
  };
114
110
  _urlHandler: ((url: string) => string) | null;
@@ -137,10 +133,4 @@ declare function createPageContextServerWithoutGlobalContext(pageContextInit: Pa
137
133
  isClientSide: false;
138
134
  isPrerendering: boolean;
139
135
  _requestId: number;
140
- } & PageContextInit & {
141
- _nodeDev?: {
142
- req: import("http").IncomingMessage;
143
- res: import("http").ServerResponse;
144
- };
145
- _reqWeb?: Request;
146
- };
136
+ } & PageContextInit;
@@ -3,9 +3,10 @@ export { inferNonceAttr };
3
3
  export { addCspResponseHeader };
4
4
  export type { PageContextCspNonce };
5
5
  import type { PageContextConfig } from '../../../shared-server-client/getPageFiles.js';
6
+ import type { PageContextPublicMinimum } from '../../../shared-server-client/getPageContextPublicShared.js';
6
7
  import type { PageContextServer } from '../../../types/PageContext.js';
7
8
  import '../../assertEnvServer.js';
8
- declare function resolvePageContextCspNone(pageContext: PageContextConfig & Partial<PageContextCspNonce>): Promise<null | {
9
+ declare function resolvePageContextCspNone(pageContext: PageContextConfig & PageContextPublicMinimum & Partial<PageContextCspNonce>): Promise<null | {
9
10
  cspNonce: string | null;
10
11
  }>;
11
12
  type PageContextCspNonce = Pick<PageContextServer, 'cspNonce'>;
@@ -3,6 +3,7 @@ export { inferNonceAttr };
3
3
  export { addCspResponseHeader };
4
4
  import { import_ } from '@brillout/import';
5
5
  import { assert } from '../../../utils/assert.js';
6
+ import { getPageContextPublicServer } from './getPageContextPublicServer.js';
6
7
  import '../../assertEnvServer.js';
7
8
  async function resolvePageContextCspNone(pageContext) {
8
9
  if (pageContext.cspNonce)
@@ -14,7 +15,7 @@ async function resolvePageContextCspNone(pageContext) {
14
15
  pageContextAddendum.cspNonce = await generateNonce();
15
16
  }
16
17
  else {
17
- pageContextAddendum.cspNonce = await csp.nonce(pageContext);
18
+ pageContextAddendum.cspNonce = await csp.nonce(getPageContextPublicServer(pageContext));
18
19
  }
19
20
  }
20
21
  return pageContextAddendum;
@@ -23,7 +23,7 @@ function execHookOnError(err, pageContext) {
23
23
  const hooks = getHooksFromPageConfigGlobalCumulative(globalContext._pageConfigGlobal, 'onError');
24
24
  for (const hook of hooks) {
25
25
  try {
26
- execHookSingleSync(hook, globalContext, pageContext, getPageContextPublicServer, () => hook.hookFn(err, pageContext));
26
+ execHookSingleSync(hook, globalContext, pageContext, getPageContextPublicServer, (pageContextPublic) => hook.hookFn(err, pageContextPublic));
27
27
  }
28
28
  catch (hookErr) {
29
29
  console.error(hookErr);
@@ -1,14 +1,17 @@
1
1
  export { execHookOnRenderHtml };
2
2
  export type { RenderHook };
3
+ export type { Content };
3
4
  import { type HtmlRender } from './html/renderHtml.js';
4
5
  import { type HookInternal } from '../../../shared-server-client/hooks/getHook.js';
5
6
  import type { PageAsset } from './getPageAssets.js';
7
+ import { type StreamReadableWeb } from './html/stream.js';
6
8
  import type { PageContextSerialization } from './html/serializeContext.js';
7
9
  import { type PageContextExecHook } from '../../../shared-server-client/hooks/execHook.js';
8
10
  import type { PageContextConfig } from '../../../shared-server-client/getPageFiles.js';
9
11
  import type { PageContextInternalServer } from '../../../types/PageContext.js';
10
12
  import '../../assertEnvServer.js';
11
13
  type GetPageAssets = () => Promise<PageAsset[]>;
14
+ type Content = string | Uint8Array | StreamReadableWeb;
12
15
  type RenderHook = HookInternal & {
13
16
  hookName: HookName;
14
17
  };
@@ -19,7 +22,13 @@ declare function execHookOnRenderHtml(pageContext: PageContextConfig & PageConte
19
22
  _isHtmlOnly: boolean;
20
23
  _baseServer: string;
21
24
  _requestId: number;
25
+ content?: unknown;
22
26
  }): Promise<{
23
27
  renderHook: RenderHook;
24
28
  htmlRender: HtmlRender;
29
+ content: null;
30
+ } | {
31
+ renderHook: RenderHook;
32
+ htmlRender: null;
33
+ content: Content;
25
34
  }>;
@@ -6,7 +6,7 @@ import { isCallable } from '../../../utils/isCallable.js';
6
6
  import { assert, assertUsage, assertWarning } from '../../../utils/assert.js';
7
7
  import { isObject } from '../../../utils/isObject.js';
8
8
  import { objectAssign } from '../../../utils/objectAssign.js';
9
- import { isStream } from './html/stream.js';
9
+ import { awaitFirstChunk, isStream, isStreamReadableWeb } from './html/stream.js';
10
10
  import { assertPageContextProvidedByUser } from '../../../shared-server-client/assertPageContextProvidedByUser.js';
11
11
  import { getPageContextPublicServer } from './getPageContextPublicServer.js';
12
12
  import { assertHookReturnedObject } from '../../../shared-server-client/assertHookReturnedObject.js';
@@ -18,9 +18,6 @@ async function execHookOnRenderHtml(pageContext) {
18
18
  const hook = getRenderHook(pageContext);
19
19
  objectAssign(pageContext, { _renderHook: hook });
20
20
  const { hookReturn } = await execHookSingleWithReturn(hook, pageContext, getPageContextPublicServer);
21
- const { documentHtml, pageContextProvidedByRenderHook, pageContextPromise, injectFilter } = processHookReturnValue(hookReturn, hook);
22
- Object.assign(pageContext, pageContextProvidedByRenderHook);
23
- objectAssign(pageContext, { _pageContextPromise: pageContextPromise });
24
21
  const onErrorWhileStreaming = (err) => {
25
22
  // Should the stream inject the following?
26
23
  // ```
@@ -31,9 +28,24 @@ async function execHookOnRenderHtml(pageContext) {
31
28
  pageContext.errorWhileRendering = err;
32
29
  }
33
30
  };
31
+ // The render hook sets `pageContext.content` instead of returning `documentHtml`
32
+ if (hookReturn === undefined && pageContext.content !== undefined) {
33
+ const content = await getContent(pageContext.content, onErrorWhileStreaming);
34
+ return { content, htmlRender: null, renderHook: hook };
35
+ }
36
+ const { documentHtml, pageContextProvidedByRenderHook, pageContextPromise, injectFilter } = processHookReturnValue(hookReturn, hook);
37
+ Object.assign(pageContext, pageContextProvidedByRenderHook);
38
+ objectAssign(pageContext, { _pageContextPromise: pageContextPromise });
34
39
  const htmlRender = await renderDocumentHtml(documentHtml, pageContext, onErrorWhileStreaming, injectFilter);
35
40
  assert(typeof htmlRender === 'string' || isStream(htmlRender));
36
- return { htmlRender, renderHook: hook };
41
+ return { htmlRender, content: null, renderHook: hook };
42
+ }
43
+ async function getContent(content, onErrorWhileStreaming) {
44
+ if (typeof content === 'string' || content instanceof Uint8Array)
45
+ return content;
46
+ assertUsage(isStreamReadableWeb(content), `${pc.code('pageContext.content')} is a value that isn't a string, a Uint8Array, nor a ReadableStream, see https://vike.dev/pageContext#content`);
47
+ // Errors before the first chunk => error page
48
+ return await awaitFirstChunk(content, onErrorWhileStreaming);
37
49
  }
38
50
  function getRenderHook(pageContext) {
39
51
  let hookFound;
@@ -67,10 +79,6 @@ function processHookReturnValue(hookReturnValue, renderHook) {
67
79
  let pageContextPromise = null;
68
80
  let pageContextProvidedByRenderHook = null;
69
81
  let injectFilter = null;
70
- if (isDocumentHtml(hookReturnValue)) {
71
- documentHtml = hookReturnValue;
72
- return { documentHtml, pageContextProvidedByRenderHook, pageContextPromise, injectFilter };
73
- }
74
82
  const errPrefix = `The ${renderHook.hookName}() hook defined at ${renderHook.hookFilePath}`;
75
83
  const errSuffix = `a string generated with ${pc.cyan('escapeInject`<html>...</html>`')} or the value returned by ${pc.cyan('dangerouslySkipEscape()')}, see https://vike.dev/escapeInject`;
76
84
  if (typeof hookReturnValue === 'string') {
@@ -81,6 +89,10 @@ function processHookReturnValue(hookReturnValue, renderHook) {
81
89
  ].join(' '), { onlyOnce: true });
82
90
  hookReturnValue = dangerouslySkipEscape(hookReturnValue);
83
91
  }
92
+ if (isDocumentHtml(hookReturnValue)) {
93
+ documentHtml = hookReturnValue;
94
+ return { documentHtml, pageContextProvidedByRenderHook, pageContextPromise, injectFilter };
95
+ }
84
96
  const wrongReturnValue = `should return the value ${pc.cyan('documentHtml')} or an object ${pc.cyan('{ documentHtml }')} where ${pc.cyan('documentHtml')} is ${errSuffix}`;
85
97
  assertUsage(isObject(hookReturnValue), `${errPrefix} ${wrongReturnValue}`);
86
98
  assertHookReturnedObject(hookReturnValue, ['documentHtml', 'pageContext', 'injectFilter'], errPrefix);
@@ -20,8 +20,8 @@ type HttpResponseBody = {
20
20
  /** @deprecated */
21
21
  pipeToWebWritable: StreamPipeWeb;
22
22
  };
23
- declare function getHttpResponseBody(htmlRender: HtmlRender, renderHook: null | RenderHook): string;
24
- declare function getHttpResponseBodyStreamHandlers(htmlRender: HtmlRender, renderHook: null | RenderHook): {
23
+ declare function getHttpResponseBody(htmlRender: HtmlRender | Uint8Array, renderHook: null | RenderHook): string;
24
+ declare function getHttpResponseBodyStreamHandlers(htmlRender: HtmlRender | Uint8Array, renderHook: null | RenderHook): {
25
25
  pipe(writable: StreamWritableNode | StreamWritableWeb): void;
26
26
  getReadableWebStream(): StreamReadableWeb;
27
27
  getReadableNodeStream(): Promise<import("stream").Readable>;
@@ -40,11 +40,7 @@ function getHttpResponseBodyStreamHandlers(htmlRender, renderHook) {
40
40
  assertUsage(false, `The argument ${pc.cyan('writable')} passed to ${pc.cyan('pageContext.httpResponse.pipe(writable)')} doesn't seem to be ${getStreamName('writable', 'web')} nor ${getStreamName('writable', 'node')}.`);
41
41
  },
42
42
  getReadableWebStream() {
43
- const webStream = getStreamReadableWeb(htmlRender);
44
- if (webStream === null) {
45
- assertUsage(false, getErrMsg(htmlRender, renderHook, 'getReadableWebStream()', getFixMsg('readable', 'web')));
46
- }
47
- return webStream;
43
+ return getStreamReadableWeb(htmlRender);
48
44
  },
49
45
  async getReadableNodeStream() {
50
46
  const nodeStream = await getStreamReadableNode(htmlRender);
@@ -53,7 +49,16 @@ function getHttpResponseBodyStreamHandlers(htmlRender, renderHook) {
53
49
  }
54
50
  return nodeStream;
55
51
  },
52
+ // Decodes the body as UTF-8 text
56
53
  async getBody() {
54
+ if (htmlRender instanceof Uint8Array) {
55
+ try {
56
+ return new TextDecoder('utf-8', { fatal: true }).decode(htmlRender);
57
+ }
58
+ catch {
59
+ assertUsage(false, getErrMsg(htmlRender, renderHook, 'getBody()', `The Uint8Array isn't UTF-8 text: use ${pc.cyan('pageContext.httpResponse.pipe()')} instead`));
60
+ }
61
+ }
57
62
  const body = await getHtmlString(htmlRender);
58
63
  return body;
59
64
  },
@@ -71,11 +76,7 @@ function getHttpResponseBodyStreamHandlers(htmlRender, renderHook) {
71
76
  getWebStream() {
72
77
  assertWarning(false, '`pageContext.httpResponse.getWebStream(res)` is outdated, use `pageContext.httpResponse.getReadableWebStream(res)` instead. ' +
73
78
  streamDocs, { onlyOnce: true, showStackTrace: true });
74
- const webStream = getStreamReadableWeb(htmlRender);
75
- if (webStream === null) {
76
- assertUsage(false, getErrMsg(htmlRender, renderHook, 'getWebStream()', getFixMsg('readable', 'web')));
77
- }
78
- return webStream;
79
+ return getStreamReadableWeb(htmlRender);
79
80
  },
80
81
  // TO-DO/next-major-release: remove
81
82
  pipeToWebWritable(writable) {
@@ -99,7 +100,8 @@ function getHttpResponseBodyStreamHandlers(htmlRender, renderHook) {
99
100
  function getFixMsg(kind, type) {
100
101
  const streamName = getStreamName(kind, type);
101
102
  assert(['a ', 'an ', 'the '].some((s) => streamName.startsWith(s)));
102
- assert(renderHook);
103
+ if (!renderHook)
104
+ return `Use ${pc.cyan('pageContext.httpResponse.pipe()')} instead`;
103
105
  const { hookFilePath, hookName } = renderHook;
104
106
  return `Make sure the ${hookName}() hook defined by ${hookFilePath} provides ${streamName} instead`;
105
107
  }
@@ -112,7 +114,9 @@ function getErrMsg(htmlRender, renderHook, method, msgAddendum) {
112
114
  .join('. ');
113
115
  }
114
116
  function getErrMsgBody(htmlRender, renderHook) {
115
- assert(renderHook);
117
+ // E.g. a pageContext.json response with streamed pageContext values
118
+ if (!renderHook)
119
+ return `HTTP response body is ${getHookReturnType(htmlRender)}`;
116
120
  const { hookFilePath, hookName } = renderHook;
117
121
  const hookReturnType = getHookReturnType(htmlRender);
118
122
  assert(['a ', 'an ', 'the '].some((s) => hookReturnType.startsWith(s)));
@@ -124,6 +128,9 @@ function getHookReturnType(htmlRender) {
124
128
  if (typeof htmlRender === 'string') {
125
129
  return 'an HTML string';
126
130
  }
131
+ else if (htmlRender instanceof Uint8Array) {
132
+ return 'a Uint8Array';
133
+ }
127
134
  else if (isStream(htmlRender)) {
128
135
  return inferStreamName(htmlRender);
129
136
  }
@@ -0,0 +1,8 @@
1
+ export { getPageContextJson };
2
+ export { getPageContextJsonFile };
3
+ import { type PageContextSerialization } from './html/serializeContext.js';
4
+ import type { PageContext_logRuntime } from '../loggerRuntime.js';
5
+ import '../../assertEnvServer.js';
6
+ type PageContextForJson = PageContextSerialization & NonNullable<PageContext_logRuntime>;
7
+ declare function getPageContextJson(pageContext: PageContextForJson): string | ReadableStream<Uint8Array>;
8
+ declare function getPageContextJsonFile(pageContext: PageContextSerialization, lines: null | string[]): string;
@@ -0,0 +1,47 @@
1
+ // The body of `.pageContext.json` requests (client-side navigation) and of pre-rendered `index.pageContext.json` files.
2
+ //
3
+ // - Without streamed pageContext values: the serialized pageContext, as is.
4
+ // - With streamed pageContext values (see shared-server-client/streamedValues.ts): a JSON array, written line by line
5
+ // so that the client can read it while it streams:
6
+ // [{"pageId":"/pages/index","data":"!VikePromise:0"}
7
+ // ,{"s":0,"v":{"title":"Hello"}}
8
+ // ]
9
+ export { getPageContextJson };
10
+ export { getPageContextJsonFile };
11
+ import { getPageContextClientSerialized } from './html/serializeContext.js';
12
+ import { pumpStreamedValues } from './streamedValues/pump.js';
13
+ import '../../assertEnvServer.js';
14
+ const textEncoder = new TextEncoder();
15
+ function getPageContextJson(pageContext) {
16
+ const { pageContextSerialized, streamedValues } = getPageContextClientSerialized(pageContext, false);
17
+ if (streamedValues.length === 0)
18
+ return pageContextSerialized;
19
+ let pump;
20
+ let isCancelled = false;
21
+ return new ReadableStream({
22
+ start(controller) {
23
+ const enqueue = (line) => controller.enqueue(textEncoder.encode(line + '\n'));
24
+ // Sent right away: the client runs its hooks while the values are still being produced
25
+ enqueue('[' + pageContextSerialized);
26
+ pump = pumpStreamedValues(pageContext, streamedValues, (line) => enqueue(',' + line), { failFast: false });
27
+ pump.done.then(() => {
28
+ if (isCancelled)
29
+ return;
30
+ enqueue(']');
31
+ controller.close();
32
+ });
33
+ },
34
+ // E.g. the user navigated away
35
+ cancel() {
36
+ isCancelled = true;
37
+ pump.cancel();
38
+ },
39
+ });
40
+ }
41
+ // Pre-rendering: the lines were collected while rendering the HTML (see html/streamedValuesHtml.ts)
42
+ function getPageContextJsonFile(pageContext, lines) {
43
+ const { pageContextSerialized } = getPageContextClientSerialized(pageContext, false);
44
+ if (!lines)
45
+ return pageContextSerialized;
46
+ return ['[' + pageContextSerialized, ...lines.map((line) => ',' + line), ']'].map((line) => line + '\n').join('');
47
+ }
@@ -1,6 +1,7 @@
1
1
  export { handleErrorWithoutErrorPage };
2
2
  import type { GlobalContextServerInternal } from '../globalContext.js';
3
3
  import type { PageContextCreatedServer } from './createPageContextServer.js';
4
+ import type { PageContextAborted } from '../../../shared-server-client/route/abort.js';
4
5
  import '../../assertEnvServer.js';
5
6
  declare function handleErrorWithoutErrorPage<PageContext extends PageContextCreatedServer & {
6
7
  errorWhileRendering: null | Error;
@@ -8,6 +9,7 @@ declare function handleErrorWithoutErrorPage<PageContext extends PageContextCrea
8
9
  pageId: null;
9
10
  _globalContext: GlobalContextServerInternal;
10
11
  urlOriginal: string;
12
+ pageContextsAborted: PageContextAborted[];
11
13
  }>(pageContext: PageContext): PageContext & {
12
14
  httpResponse: import("./createHttpResponse.js").HttpResponse;
13
15
  };
@@ -20,7 +20,7 @@ function handleErrorWithoutErrorPage(pageContext) {
20
20
  else {
21
21
  const __getPageAssets = async () => [];
22
22
  objectAssign(pageContext, { __getPageAssets });
23
- const httpResponse = createHttpResponseErrorFallbackJson();
23
+ const httpResponse = createHttpResponseErrorFallbackJson(pageContext);
24
24
  objectAssign(pageContext, { httpResponse });
25
25
  return pageContext;
26
26
  }
@@ -1,6 +1,6 @@
1
1
  export { handlePageContextRequestUrl };
2
2
  import { pageContextJsonFileExtension, doNotCreateExtraDirectory, } from '../../../shared-server-client/getPageContextRequestUrl.js';
3
- import { modifyUrl } from '../../../shared-server-client/modifyUrl.js';
3
+ import { modifyUrlSameOrigin } from '../../../shared-server-client/modifyUrlSameOrigin.js';
4
4
  import { slice } from '../../../utils/slice.js';
5
5
  import { baseServer } from '../../../utils/urlToFile.js';
6
6
  import { assert } from '../../../utils/assert.js';
@@ -46,7 +46,7 @@ function processUrl(urlParsed, url) {
46
46
  if (pathnameModified === '')
47
47
  pathnameModified = '/';
48
48
  const searchVikeArgs = search?._vike;
49
- const urlWithoutPageContextRequestSuffix = modifyUrl(url, {
49
+ const urlWithoutPageContextRequestSuffix = modifyUrlSameOrigin(url, {
50
50
  pathname: pathnameModified,
51
51
  search: {
52
52
  _vike: searchVikeArgs ? null : undefined,