vike 0.4.267 → 0.4.268-commit-ca58695

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 +3 -0
  4. package/dist/client/__internal/index.js +4 -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 +28 -2
  8. package/dist/client/runtime-client-routing/getPageContextFromHooks.js +5 -5
  9. package/dist/client/runtime-client-routing/renderPageClient.d.ts +490 -10
  10. package/dist/client/runtime-client-routing/renderPageClient.js +149 -43
  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 +1 -3
  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
@@ -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,
@@ -1,11 +1,20 @@
1
1
  export { resolveHeadersResponseEarly };
2
2
  export { resolveHeadersResponseFinal };
3
+ export { resolveHeadersResponseSetCookie };
4
+ export { getHeadersSetCookieAborted };
3
5
  import { PageContextCspNonce } from './csp.js';
4
6
  import type { PageContextAfterPageEntryLoaded } from './loadPageConfigsLazyServerSide.js';
7
+ import type { PageContextAborted } from '../../../shared-server-client/route/abort.js';
5
8
  import '../../assertEnvServer.js';
6
- declare function resolveHeadersResponseFinal(pageContext: {
9
+ type PageContextHeadersResponse = {
7
10
  headersResponse?: Headers;
8
- }, statusCode: number): [string, string][];
11
+ pageContextsAborted: PageContextAborted[];
12
+ };
13
+ declare function resolveHeadersResponseFinal(pageContext: PageContextHeadersResponse, statusCode: number): [string, string][];
14
+ declare function resolveHeadersResponseSetCookie(pageContext: PageContextHeadersResponse): [string, string][];
15
+ declare function getHeadersSetCookieAborted(pageContext: {
16
+ pageContextsAborted: PageContextAborted[];
17
+ }): [string, string][];
9
18
  declare function resolveHeadersResponseEarly(pageContext: PageContextAfterPageEntryLoaded & PageContextCspNonce): Promise<{
10
19
  headersResponse: Headers;
11
20
  }>;
@@ -1,21 +1,41 @@
1
1
  export { resolveHeadersResponseEarly };
2
2
  export { resolveHeadersResponseFinal };
3
+ export { resolveHeadersResponseSetCookie };
4
+ export { getHeadersSetCookieAborted };
3
5
  import { addCspResponseHeader } from './csp.js';
4
6
  import { isCallable } from '../../../utils/isCallable.js';
5
7
  import { cacheControlDisable, getCacheControl } from './getCacheControl.js';
8
+ import { getPageContextPublicServer } from './getPageContextPublicServer.js';
6
9
  import '../../assertEnvServer.js';
10
+ // Headers of HTML page responses
7
11
  function resolveHeadersResponseFinal(pageContext, statusCode) {
8
12
  const headersResponse = pageContext.headersResponse || new Headers();
9
13
  // 5xx error pages are temporary and shouldn't be cached.
10
14
  // This overrides any previously set Cache-Control value.
11
15
  if (statusCode >= 500)
12
16
  headersResponse.set('Cache-Control', cacheControlDisable);
13
- const headers = [];
17
+ const headers = getHeadersSetCookieAborted(pageContext);
14
18
  headersResponse.forEach((value, key) => {
15
19
  headers.push([key, value]);
16
20
  });
17
21
  return headers;
18
22
  }
23
+ // Headers of `pageContext.json` and redirect responses: only `Set-Cookie` applies to them, the other headers (e.g. `Cache-Control` and `Content-Security-Policy`) are about the HTML page.
24
+ function resolveHeadersResponseSetCookie(pageContext) {
25
+ const headersResponse = pageContext.headersResponse || new Headers();
26
+ const headers = getHeadersSetCookieAborted(pageContext);
27
+ headersResponse.getSetCookie().forEach((value) => {
28
+ headers.push(['set-cookie', value]);
29
+ });
30
+ return headers;
31
+ }
32
+ // Cookies set before `throw redirect()` or `throw render()` are kept. They're sent first, so that a cookie set again later wins.
33
+ function getHeadersSetCookieAborted(pageContext) {
34
+ return pageContext.pageContextsAborted.flatMap((pageContextAborted) => {
35
+ const { headersResponse } = pageContextAborted;
36
+ return (headersResponse?.getSetCookie() ?? []).map((value) => ['set-cookie', value]);
37
+ });
38
+ }
19
39
  async function resolveHeadersResponseEarly(pageContext) {
20
40
  const headersResponse = await resolveHeadersResponseConfig(pageContext);
21
41
  if (!headersResponse.get('Cache-Control')) {
@@ -34,7 +54,7 @@ async function resolveHeadersResponseConfig(pageContext) {
34
54
  await Promise.all((pageContext.config.headersResponse ?? []).map(async (headers) => {
35
55
  let headersInit;
36
56
  if (isCallable(headers)) {
37
- headersInit = await headers(pageContext);
57
+ headersInit = await headers(getPageContextPublicServer(pageContext));
38
58
  }
39
59
  else {
40
60
  headersInit = headers;
@@ -2,7 +2,7 @@ export { getHtmlTags };
2
2
  import { assert, assertWarning, assertUsage } from '../../../../../utils/assert.js';
3
3
  import { freezePartial } from '../../../../../utils/freezePartial.js';
4
4
  import { isObject } from '../../../../../utils/isObject.js';
5
- import { getGlobalContextClientSerialized, getPageContextClientSerialized, } from '../serializeContext.js';
5
+ import { getGlobalContextClientSerialized } from '../serializeContext.js';
6
6
  import { inferAssetTag, inferPreloadTag } from './inferHtmlTags.js';
7
7
  import { mergeScriptTags } from './mergeScriptTags.js';
8
8
  import { getPageConfig } from '../../../../../shared-server-client/page-configs/helpers.js';
@@ -12,6 +12,7 @@ import { getConfigDefinedAt } from '../../../../../shared-server-client/page-con
12
12
  import { htmlElementId_globalContext, htmlElementId_pageContext, } from '../../../../../shared-server-client/htmlElementIds.js';
13
13
  import { isFontFallback } from '../../isFontFallback.js';
14
14
  import { inferNonceAttr } from '../../csp.js';
15
+ import { serializePageContextHtml } from '../streamedValuesHtml.js';
15
16
  import '../../../../assertEnvServer.js';
16
17
  const stamp = '__injectFilterEntry';
17
18
  async function getHtmlTags(pageContext, streamFromReactStreamingPackage, injectFilter, pageAssets, viteDevScript, isStream) {
@@ -128,7 +129,7 @@ async function getHtmlTags(pageContext, streamFromReactStreamingPackage, injectF
128
129
  htmlTags.push({
129
130
  htmlTag: () =>
130
131
  // Needs to be called after resolvePageContextPromise()
131
- getPageContextJsonScriptTag(pageContext),
132
+ getPageContextJsonScriptTag(pageContext, streamFromReactStreamingPackage),
132
133
  position: positionJavaScriptEntry,
133
134
  });
134
135
  // <script id="vike_globalContext" type="application/json">
@@ -184,8 +185,8 @@ function mergeScriptEntries(pageAssets, viteDevScript, pageContext) {
184
185
  scriptEntry = mergeScriptTags(scriptEntry, pageContext);
185
186
  return scriptEntry;
186
187
  }
187
- function getPageContextJsonScriptTag(pageContext) {
188
- const pageContextClientSerialized = getPageContextClientSerialized(pageContext, true);
188
+ function getPageContextJsonScriptTag(pageContext, streamFromReactStreamingPackage) {
189
+ const pageContextClientSerialized = serializePageContextHtml(pageContext, streamFromReactStreamingPackage);
189
190
  const nonceAttr = inferNonceAttr(pageContext);
190
191
  const htmlTag = `<script id="${htmlElementId_pageContext}" type="application/json"${nonceAttr}>${pageContextClientSerialized}</script>`;
191
192
  // Used by contra.com https://github.com/gajus
@@ -7,6 +7,7 @@ import type { HtmlPart } from './renderHtml.js';
7
7
  import { type PreloadFilter } from './injectAssets/getHtmlTags.js';
8
8
  import type { StreamFromReactStreamingPackage } from './stream/react-streaming.js';
9
9
  import type { PageContextSerialization } from './serializeContext.js';
10
+ import { type PageContextStreamedValuesHtml } from './streamedValuesHtml.js';
10
11
  import type { GlobalContextServerInternal } from '../../globalContext.js';
11
12
  import '../../../assertEnvServer.js';
12
13
  type PageContextInjectAssets = {
@@ -22,7 +23,7 @@ type PageContextInjectAssets = {
22
23
  _baseServer: string;
23
24
  is404: null | boolean;
24
25
  _globalContext: GlobalContextServerInternal;
25
- } & PageContextSerialization;
26
+ } & PageContextSerialization & PageContextStreamedValuesHtml;
26
27
  declare function injectHtmlTagsToString(htmlParts: HtmlPart[], pageContext: PageContextInjectAssets & {
27
28
  _isStream: false;
28
29
  }, injectFilter: PreloadFilter): Promise<string>;
@@ -31,6 +32,6 @@ declare function injectHtmlTagsToStream(pageContext: PageContextInjectAssets & {
31
32
  }, streamFromReactStreamingPackage: null | StreamFromReactStreamingPackage, injectFilter: PreloadFilter): {
32
33
  injectAtStreamBegin: (htmlPartsBegin: HtmlPart[]) => Promise<string>;
33
34
  injectAtStreamAfterFirstChunk: () => null | string;
34
- injectAtStreamEnd: (htmlPartsEnd: HtmlPart[]) => Promise<string>;
35
+ injectAtStreamEnd: (htmlPartsEnd: HtmlPart[], writeHtml: (html: string) => void) => Promise<string>;
35
36
  };
36
37
  type PageContextPromise = null | Promise<unknown> | (() => void | Promise<unknown>);
@@ -6,6 +6,7 @@ import { assert } from '../../../../utils/assert.js';
6
6
  import { assertPageContextProvidedByUser } from '../../../../shared-server-client/assertPageContextProvidedByUser.js';
7
7
  import { joinHtmlTags, injectHtmlTags, createHtmlHeadIfMissing, injectHtmlTagsUsingStream, } from './injectAssets/injectHtmlTags.js';
8
8
  import { getHtmlTags } from './injectAssets/getHtmlTags.js';
9
+ import { getStreamedValuesHtml, writeStreamedValuesHtmlAtStreamEnd, } from './streamedValuesHtml.js';
9
10
  import { getViteDevScript } from './injectAssets/getViteDevScript.js';
10
11
  import '../../../assertEnvServer.js';
11
12
  async function injectHtmlTagsToString(htmlParts, pageContext, injectFilter) {
@@ -16,6 +17,10 @@ async function injectHtmlTagsToString(htmlParts, pageContext, injectFilter) {
16
17
  htmlString = injectToHtmlBegin(htmlString, htmlTags);
17
18
  htmlString = injectToHtmlEnd(htmlString, htmlTags);
18
19
  assert(htmlTags.filter((snippet) => snippet.position === 'HTML_STREAM').length === 0);
20
+ const streamedValuesHtml = await getStreamedValuesHtml(pageContext);
21
+ if (streamedValuesHtml !== null) {
22
+ htmlString = injectToHtmlEnd(htmlString, [{ htmlTag: streamedValuesHtml, position: 'HTML_END' }]);
23
+ }
19
24
  return htmlString;
20
25
  }
21
26
  function injectHtmlTagsToStream(pageContext, streamFromReactStreamingPackage, injectFilter) {
@@ -48,12 +53,13 @@ function injectHtmlTagsToStream(pageContext, streamFromReactStreamingPackage, in
48
53
  const htmlFragment = joinHtmlTags(tags);
49
54
  return htmlFragment;
50
55
  }
51
- async function injectAtStreamEnd(htmlPartsEnd) {
56
+ async function injectAtStreamEnd(htmlPartsEnd, writeHtml) {
52
57
  assert(htmlTags);
53
58
  await resolvePageContextPromise(pageContext);
54
59
  const pageAssets = await pageContext.__getPageAssets();
55
60
  let htmlEnd = htmlPartsToString(htmlPartsEnd, pageAssets);
56
61
  htmlEnd = injectToHtmlEnd(htmlEnd, htmlTags);
62
+ htmlEnd = await writeStreamedValuesHtmlAtStreamEnd(pageContext, htmlEnd, writeHtml);
57
63
  return htmlEnd;
58
64
  }
59
65
  }
@@ -13,6 +13,7 @@ import { objectAssign } from '../../../../utils/objectAssign.js';
13
13
  import { injectHtmlTagsToString, injectHtmlTagsToStream } from './injectAssets.js';
14
14
  import { processStream, isStream, streamToString, } from './stream.js';
15
15
  import { isStreamFromReactStreamingPackage } from './stream/react-streaming.js';
16
+ import { cancelStreamedValuesHtml } from './streamedValuesHtml.js';
16
17
  import pc from '@brillout/picocolors';
17
18
  import '../../../assertEnvServer.js';
18
19
  function isDocumentHtml(something) {
@@ -61,6 +62,7 @@ async function renderHtmlStream(streamOriginal, injectString, pageContext, onErr
61
62
  const processStreamOptions = {
62
63
  onErrorWhileStreaming,
63
64
  enableEagerStreaming: pageContext.enableEagerStreaming,
65
+ onCancel: () => cancelStreamedValuesHtml(pageContext),
64
66
  };
65
67
  if (injectString) {
66
68
  let streamFromReactStreamingPackage = null;
@@ -71,8 +73,8 @@ async function renderHtmlStream(streamOriginal, injectString, pageContext, onErr
71
73
  processStreamOptions.injectStringAtBegin = async () => {
72
74
  return await injectAtStreamBegin(injectString.htmlPartsBegin);
73
75
  };
74
- processStreamOptions.injectStringAtEnd = async () => {
75
- return await injectAtStreamEnd(injectString.htmlPartsEnd);
76
+ processStreamOptions.injectStringAtEnd = async (writeHtml) => {
77
+ return await injectAtStreamEnd(injectString.htmlPartsEnd, writeHtml);
76
78
  };
77
79
  processStreamOptions.injectStringAfterFirstChunk = () => {
78
80
  return injectAtStreamAfterFirstChunk();