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,15 +1,16 @@
1
1
  export { renderPageServerAfterRoute };
2
2
  export { prerenderPage };
3
- export { prerenderPageEntry };
4
3
  import { getErrorPageId } from '../../../shared-server-client/error-page.js';
5
4
  import { getHtmlString } from './html/renderHtml.js';
5
+ import { isStreamReadableWeb, streamReadableWebToBytes } from './html/stream.js';
6
6
  import { assert, assertUsage } from '../../../utils/assert.js';
7
7
  import { hasProp } from '../../../utils/hasProp.js';
8
8
  import { isSameErrorMessage } from '../../../utils/isSameErrorMessage.js';
9
9
  import { objectAssign } from '../../../utils/objectAssign.js';
10
10
  import { updateType } from '../../../utils/updateType.js';
11
- import { getPageContextClientSerialized } from './html/serializeContext.js';
12
- import { createHttpResponsePage, createHttpResponsePageJson } from './createHttpResponse.js';
11
+ import { getStreamedValuesLinesPrerendered } from './html/streamedValuesHtml.js';
12
+ import { getPageContextJson, getPageContextJsonFile } from './getPageContextJson.js';
13
+ import { createHttpResponsePageHtml, createHttpResponsePageContent, createHttpResponsePageJson, } from './createHttpResponse.js';
13
14
  import { loadPageConfigsLazyServerSide, } from './loadPageConfigsLazyServerSide.js';
14
15
  import { execHookOnRenderHtml } from './execHookOnRenderHtml.js';
15
16
  import { execHookDataAndOnBeforeRender } from './execHookDataAndOnBeforeRender.js';
@@ -50,14 +51,14 @@ async function renderPageServerAfterRoute(pageContext) {
50
51
  if (isError) {
51
52
  objectAssign(pageContext, { [isServerSideError]: true });
52
53
  }
53
- const pageContextSerialized = getPageContextClientSerialized(pageContext, false);
54
- const httpResponse = await createHttpResponsePageJson(pageContextSerialized);
54
+ const httpResponse = await createHttpResponsePageJson(getPageContextJson(pageContext), pageContext);
55
55
  objectAssign(pageContext, { httpResponse });
56
56
  return pageContext;
57
57
  }
58
- const renderHookResult = await execHookOnRenderHtml(pageContext);
59
- const { htmlRender, renderHook } = renderHookResult;
60
- const httpResponse = await createHttpResponsePage(htmlRender, renderHook, pageContext);
58
+ const { htmlRender, content, renderHook } = await execHookOnRenderHtml(pageContext);
59
+ const httpResponse = content !== null
60
+ ? createHttpResponsePageContent(content, renderHook, pageContext)
61
+ : await createHttpResponsePageHtml(htmlRender, renderHook, pageContext);
61
62
  objectAssign(pageContext, { httpResponse });
62
63
  return pageContext;
63
64
  }
@@ -85,15 +86,23 @@ async function prerenderPageEntry(pageContext) {
85
86
  await execHookGuard(pageContext, (pageContext) => getPageContextPublicServer(pageContext))
86
87
  */
87
88
  await execHookDataAndOnBeforeRender(pageContext);
88
- const { htmlRender, renderHook } = await execHookOnRenderHtml(pageContext);
89
+ const { htmlRender, content, renderHook } = await execHookOnRenderHtml(pageContext);
90
+ if (content !== null) {
91
+ // Rejects if the stream errors
92
+ const fileContent = isStreamReadableWeb(content) ? await streamReadableWebToBytes(content) : content;
93
+ return { documentHtml: null, content: fileContent, pageContextSerialized: null, pageContext };
94
+ }
89
95
  assertUsage(htmlRender !== null, `Cannot pre-render ${pc.cyan(pageContext.urlOriginal)} because the ${renderHook.hookName}() hook defined by ${renderHook.hookFilePath} didn't return an HTML string.`);
90
96
  const documentHtml = await getHtmlString(htmlRender);
91
97
  assert(typeof documentHtml === 'string');
98
+ // The streamed pageContext values were read while rendering the HTML: the same lines go into `index.pageContext.json`, and
99
+ // a value that failed makes pre-rendering fail (also without Client Routing)
100
+ const streamedValuesLines = await getStreamedValuesLinesPrerendered(pageContext);
92
101
  if (!pageContext._usesClientRouter) {
93
- return { documentHtml, pageContextSerialized: null, pageContext };
102
+ return { documentHtml, content: null, pageContextSerialized: null, pageContext };
94
103
  }
95
104
  else {
96
- const pageContextSerialized = getPageContextClientSerialized(pageContext, false);
97
- return { documentHtml, pageContextSerialized, pageContext };
105
+ const pageContextSerialized = getPageContextJsonFile(pageContext, streamedValuesLines);
106
+ return { documentHtml, content: null, pageContextSerialized, pageContext };
98
107
  }
99
108
  }
@@ -0,0 +1,4 @@
1
+ export { asyncIterable };
2
+ import type { StreamedValueType } from './registry.js';
3
+ import '../../../assertEnvServer.js';
4
+ declare const asyncIterable: StreamedValueType<AsyncIterable<unknown>, IteratorResult<unknown>>;
@@ -0,0 +1,12 @@
1
+ export { asyncIterable };
2
+ import { markers } from '../../../../shared-server-client/streamedValues.js';
3
+ import { chunkToLine } from './lines.js';
4
+ import '../../../assertEnvServer.js';
5
+ const asyncIterable = {
6
+ marker: markers.asyncIterable,
7
+ is: (value) => typeof value === 'object' && value !== null && Symbol.asyncIterator in value,
8
+ read(value) {
9
+ const iterator = value[Symbol.asyncIterator]();
10
+ return { next: () => iterator.next(), toLine: chunkToLine, cancel: () => iterator.return?.() };
11
+ },
12
+ };
@@ -0,0 +1,10 @@
1
+ export { serializeLine };
2
+ export { chunkToLine };
3
+ import { type Replacer } from '@brillout/json-serializer/stringify';
4
+ import type { Line, LineContent } from '../../../../shared-server-client/streamedValues.js';
5
+ import '../../../assertEnvServer.js';
6
+ declare function serializeLine(line: Line, replacer: Replacer): string;
7
+ declare function chunkToLine(result: IteratorResult<unknown>): {
8
+ line: LineContent;
9
+ isLast: boolean;
10
+ };
@@ -0,0 +1,49 @@
1
+ // The encoding of the lines (see shared-server-client/streamedValues.ts)
2
+ export { serializeLine };
3
+ export { chunkToLine };
4
+ import { stringify } from '@brillout/json-serializer/stringify';
5
+ import { assert } from '../../../../utils/assert.js';
6
+ import '../../../assertEnvServer.js';
7
+ // `replacer` replaces the streamed values that a `v` line's value contains
8
+ function serializeLine(line, replacer) {
9
+ const lineStr = 'v' in line
10
+ ? `{"s":${line.s},"v":${stringify(line.v, {
11
+ forbidReactElements: true,
12
+ valueName: 'a streamed pageContext value',
13
+ replacer,
14
+ htmlScriptSafe: { escapeScripts: true, escapeURLs: false },
15
+ })}}`
16
+ : JSON.stringify(line);
17
+ // JSON.stringify() escapes line breaks: one line per JSON value
18
+ assert(!lineStr.includes('\n'));
19
+ return lineStr;
20
+ }
21
+ // A ReadableStream / async iterable: one line per chunk, then an `end` line
22
+ function chunkToLine(result) {
23
+ if (result.done)
24
+ return { line: { end: true }, isLast: true };
25
+ return { line: encodeChunk(result.value), isLast: false };
26
+ }
27
+ function encodeChunk(chunk) {
28
+ if (!(chunk instanceof Uint8Array))
29
+ return { v: chunk };
30
+ const text = decodeUtf8(chunk);
31
+ return text !== null ? { t: text } : { b: encodeBase64url(chunk) };
32
+ }
33
+ const utf8Decoder = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
34
+ function decodeUtf8(bytes) {
35
+ try {
36
+ return utf8Decoder.decode(bytes);
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ function encodeBase64url(bytes) {
43
+ let binary = '';
44
+ // In slices: spreading a large array into a single call overflows the stack
45
+ for (let i = 0; i < bytes.length; i += 0x8000) {
46
+ binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
47
+ }
48
+ return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');
49
+ }
@@ -0,0 +1,4 @@
1
+ export { promise };
2
+ import type { StreamedValueType } from './registry.js';
3
+ import '../../../assertEnvServer.js';
4
+ declare const promise: StreamedValueType<Promise<unknown>>;
@@ -0,0 +1,14 @@
1
+ export { promise };
2
+ import { markers } from '../../../../shared-server-client/streamedValues.js';
3
+ import { isPromise } from '../../../../utils/isPromise.js';
4
+ import '../../../assertEnvServer.js';
5
+ // One `v` line
6
+ const promise = {
7
+ marker: markers.promise,
8
+ is: isPromise,
9
+ read: (value) => ({
10
+ next: () => value,
11
+ toLine: (v) => ({ line: { v }, isLast: true }),
12
+ cancel: () => { },
13
+ }),
14
+ };
@@ -0,0 +1,10 @@
1
+ export { pumpStreamedValues };
2
+ import { type PageContext_logRuntime } from '../../loggerRuntime.js';
3
+ import { type StreamedValue } from './registry.js';
4
+ import '../../../assertEnvServer.js';
5
+ declare function pumpStreamedValues(pageContext: NonNullable<PageContext_logRuntime>, streamedValues: StreamedValue[], write: (line: string) => void, { failFast }: {
6
+ failFast: boolean;
7
+ }): {
8
+ done: Promise<void>;
9
+ cancel: () => void;
10
+ };
@@ -0,0 +1,67 @@
1
+ // Reads the streamed values of a response concurrently and writes their lines.
2
+ // - `failFast: false` (responses): a value that fails is logged and sent as an `error` line.
3
+ // - `failFast: true` (pre-rendering): a value that fails rejects `done`.
4
+ export { pumpStreamedValues };
5
+ import { logRuntimeError } from '../../loggerRuntime.js';
6
+ import { getReplacer } from './registry.js';
7
+ import { serializeLine } from './lines.js';
8
+ import { genPromise } from '../../../../utils/genPromise.js';
9
+ import '../../../assertEnvServer.js';
10
+ function pumpStreamedValues(pageContext, streamedValues, write, { failFast }) {
11
+ // Stop the values being read: when the response ends early, or when the value fails
12
+ const cancels = new Set();
13
+ let pending = 0;
14
+ let isEnded = false;
15
+ const { promise: done, resolve, reject } = genPromise({ timeout: null });
16
+ const end = (settle) => {
17
+ if (isEnded)
18
+ return;
19
+ isEnded = true;
20
+ cancels.forEach((cancel) => cancel());
21
+ settle();
22
+ };
23
+ const start = (streamedValue) => {
24
+ pending++;
25
+ send(streamedValue).then(() => {
26
+ if (--pending === 0)
27
+ end(resolve);
28
+ }, (err) => end(() => reject(err)));
29
+ };
30
+ // A line's value can contain new streamed values: they're started after the line is written
31
+ const writeLine = (line) => {
32
+ const { replacer, streamedValues } = getReplacer(pageContext);
33
+ write(serializeLine(line, replacer));
34
+ streamedValues.forEach(start);
35
+ };
36
+ const send = async ({ id: s, type, value }) => {
37
+ let cancel = () => { };
38
+ try {
39
+ const reader = type.read(value);
40
+ cancel = () => void Promise.resolve(reader.cancel()).catch(() => { });
41
+ cancels.add(cancel);
42
+ while (true) {
43
+ const result = await reader.next();
44
+ if (isEnded)
45
+ return;
46
+ const { line, isLast } = reader.toLine(result);
47
+ writeLine({ s, ...line });
48
+ if (isLast)
49
+ return;
50
+ }
51
+ }
52
+ catch (err) {
53
+ if (isEnded)
54
+ return;
55
+ cancel();
56
+ if (failFast)
57
+ throw err;
58
+ logRuntimeError(err, pageContext);
59
+ writeLine({ s, error: true });
60
+ }
61
+ finally {
62
+ cancels.delete(cancel);
63
+ }
64
+ };
65
+ streamedValues.forEach(start);
66
+ return { done, cancel: () => end(resolve) };
67
+ }
@@ -0,0 +1,4 @@
1
+ export { readableStream };
2
+ import type { StreamedValueType } from './registry.js';
3
+ import '../../../assertEnvServer.js';
4
+ declare const readableStream: StreamedValueType<ReadableStream<unknown>, ReadableStreamReadResult<unknown>>;
@@ -0,0 +1,12 @@
1
+ export { readableStream };
2
+ import { markers } from '../../../../shared-server-client/streamedValues.js';
3
+ import { chunkToLine } from './lines.js';
4
+ import '../../../assertEnvServer.js';
5
+ const readableStream = {
6
+ marker: markers.readableStream,
7
+ is: (value) => value instanceof ReadableStream,
8
+ read(value) {
9
+ const reader = value.getReader();
10
+ return { next: () => reader.read(), toLine: chunkToLine, cancel: () => reader.cancel() };
11
+ },
12
+ };
@@ -0,0 +1,28 @@
1
+ export { getReplacer };
2
+ export type { StreamedValue };
3
+ export type { StreamedValueType };
4
+ import type { Replacer } from '@brillout/json-serializer/stringify';
5
+ import type { LineContent } from '../../../../shared-server-client/streamedValues.js';
6
+ import '../../../assertEnvServer.js';
7
+ type StreamedValueType<Value = any, Result = any> = {
8
+ marker: string;
9
+ is: (value: unknown) => value is Value;
10
+ read: (value: Value) => {
11
+ next: () => Promise<Result>;
12
+ /** `isLast`: the value ended */
13
+ toLine: (result: Result) => {
14
+ line: LineContent;
15
+ isLast: boolean;
16
+ };
17
+ cancel: () => unknown;
18
+ };
19
+ };
20
+ type StreamedValue = {
21
+ id: number;
22
+ type: StreamedValueType;
23
+ value: unknown;
24
+ };
25
+ declare function getReplacer(pageContext: object): {
26
+ replacer: Replacer;
27
+ streamedValues: StreamedValue[];
28
+ };
@@ -0,0 +1,33 @@
1
+ // The types of streamed pageContext values (see shared-server-client/streamedValues.ts), and the serializer's replacer
2
+ // that replaces them with their marker and id.
3
+ export { getReplacer };
4
+ import { readableStream } from './readableStream.js';
5
+ import { promise } from './promise.js';
6
+ import { asyncIterable } from './asyncIterable.js';
7
+ import '../../../assertEnvServer.js';
8
+ // A ReadableStream is also an async iterable
9
+ const types = [readableStream, promise, asyncIterable];
10
+ // Per pageContext: the HTML and the `index.pageContext.json` of a pre-rendered page reference the same values with the
11
+ // same ids.
12
+ const idsByPageContext = new WeakMap();
13
+ // `streamedValues`: the values not seen before, filled while serializing
14
+ function getReplacer(pageContext) {
15
+ let ids = idsByPageContext.get(pageContext);
16
+ if (!ids)
17
+ idsByPageContext.set(pageContext, (ids = { byValue: new Map(), idNext: 0 }));
18
+ const streamedValues = [];
19
+ const replacer = (_key, value) => {
20
+ const type = types.find((type) => type.is(value));
21
+ if (!type)
22
+ return undefined;
23
+ let streamedValue = ids.byValue.get(value);
24
+ if (!streamedValue) {
25
+ streamedValue = { id: ids.idNext++, type, value };
26
+ ids.byValue.set(value, streamedValue);
27
+ // The same value referenced twice is sent once (a stream can be read only once)
28
+ streamedValues.push(streamedValue);
29
+ }
30
+ return { replacement: type.marker + streamedValue.id };
31
+ };
32
+ return { replacer, streamedValues };
33
+ }
@@ -1,21 +1,72 @@
1
1
  export { renderPageServer };
2
+ export { renderPageServer_userLand };
2
3
  export { getRequestTag };
3
4
  export type { PageContextInit };
4
- export type { PageContextInitInternal };
5
5
  export type { PageContextBegin };
6
6
  export type { RequestTag };
7
7
  import { type PageContextAborted } from '../../shared-server-client/route/abort.js';
8
8
  import { type GlobalContextServerInternal } from './globalContext.js';
9
9
  import { type HttpResponse } from './renderPageServer/createHttpResponse.js';
10
10
  import type { PageContextServer } from '../../types/index.js';
11
- import type { PageContextInit, PageContextInitInternal } from '../../types/PageContext.js';
11
+ import type { PageContextInit, PageContextInternalServer } from '../../types/PageContext.js';
12
12
  import { type AsyncStore } from './asyncHook.js';
13
13
  import '../assertEnvServer.js';
14
14
  type PageContextBegin = ReturnType<typeof getPageContextBegin>;
15
- declare function renderPageServer<PageContextUserAdded extends {}, PageContextInitUser extends PageContextInitInternal>(pageContextInit: PageContextInitUser): Promise<PageContextInitUser & {
15
+ declare function renderPageServer_userLand<PageContextUserAdded extends {}, PageContextInitUser extends PageContextInit>(pageContextInit: PageContextInitUser): Promise<PageContextInitUser & {
16
+ httpResponse: HttpResponse;
17
+ } & Partial<import("../../shared-server-client/getPageFiles.js").PageContextConfig & {
18
+ isPageContext: true;
19
+ Page: import("../../types/Config.js").Config['Page'];
20
+ routeParams: Record<string, string>;
21
+ data: unknown;
22
+ headersResponse: Headers;
23
+ is404: boolean | null;
24
+ isClientSideNavigation: boolean;
25
+ abortReason?: unknown;
26
+ abortStatusCode?: import("../../shared-server-client/route/abort.js").AbortStatusCode;
27
+ errorWhileRendering?: unknown;
28
+ pageId: string | null;
29
+ from: import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").From;
30
+ source: import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").Source;
31
+ sources: import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").Sources;
32
+ pageExports: Record<string, unknown>;
33
+ isBaseMissing?: true;
34
+ } & PageContextInit & {
35
+ urlOriginal: string;
36
+ } & {
37
+ urlParsed: import("../../utils/parseUrl.js").UrlPublic;
38
+ urlPathname: string;
39
+ url: string;
40
+ } & {
41
+ urlParsed: Omit<import("../../utils/parseUrl.js").UrlPublic, "hash" | "hashOriginal" | "hashString"> & {
42
+ hash: '';
43
+ hashString: null;
44
+ hashOriginal: null;
45
+ };
46
+ } & {
47
+ headers: Record<string, string> | null;
48
+ isClientSide: false;
49
+ isPrerendering: boolean;
50
+ globalContext: import("../../types/GlobalContext.js").GlobalContextServer;
51
+ cspNonce: string | null;
52
+ pageContextsAborted: Partial<PageContextServer<unknown>>[];
53
+ environments?: Record<string, {
54
+ config: import("../../shared-server-client/getPageFiles.js").PageContextConfig['config'];
55
+ pageContext: PageContextServer<unknown>;
56
+ }> | undefined;
57
+ isHydration?: undefined;
58
+ isBackwardNavigation?: undefined;
59
+ isHistoryNavigation?: undefined;
60
+ previousPageContext?: undefined;
61
+ } & {
62
+ dangerouslyUseInternals: import("../../shared-server-client/getPublicProxy.js").DangerouslyUseInternals<PageContextInternalServer & import("./renderPageServer/renderPageServerAfterRoute.js").PageContextAfterRender & import("./renderPageServer/getPageContextPublicServer.js").PageContextPublicServer>;
63
+ } & Vike.PageContext & Vike.PageContextServer & {
64
+ content?: string | Uint8Array | ReadableStream<Uint8Array>;
65
+ } & PageContextUserAdded>>;
66
+ declare function renderPageServer<PageContextUserAdded extends {}, PageContextInitUser extends PageContextInit>(pageContextInit: PageContextInitUser, isCalledDirectlyByUser: boolean): Promise<PageContextInitUser & {
16
67
  httpResponse: HttpResponse;
17
68
  } & Partial<PageContextServer & PageContextUserAdded>>;
18
- declare function getPageContextBegin(pageContextInit: PageContextInitInternal, globalContext: GlobalContextServerInternal, requestId: number, asyncStore: AsyncStore): {
69
+ declare function getPageContextBegin(pageContextInit: PageContextInit, globalContext: GlobalContextServerInternal, requestId: number, asyncStore: AsyncStore): {
19
70
  _isOriginalObject: true;
20
71
  isPageContext: true;
21
72
  } & {
@@ -23,12 +74,6 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
23
74
  isPrerendering: boolean;
24
75
  _requestId: number;
25
76
  } & PageContextInit & {
26
- _nodeDev?: {
27
- req: import("http").IncomingMessage;
28
- res: import("http").ServerResponse;
29
- };
30
- _reqWeb?: Request;
31
- } & {
32
77
  _globalContext: ({
33
78
  config: import("../../types/index.js").ConfigResolved;
34
79
  _source: import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").Source;
@@ -52,6 +97,10 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
52
97
  _pageFilesAll: import("../__internal/index.js").PageFile[];
53
98
  _pageConfigs: import("../__internal/index.js").PageConfig[];
54
99
  _pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
100
+ _environmentEntries: Record<string, {
101
+ pageConfigs: import("../__internal/index.js").PageConfig[];
102
+ pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
103
+ } | null>;
55
104
  _allPageIds: string[];
56
105
  } & (({
57
106
  isClientSide: false;
@@ -61,6 +110,7 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
61
110
  _isPrerendering: false;
62
111
  assetsManifest: null;
63
112
  _viteDevServer: import("vite").ViteDevServer | undefined;
113
+ devMiddleware: import("vite").Connect.Server | null;
64
114
  viteConfig: import("vite").ResolvedConfig | undefined;
65
115
  } | {
66
116
  isClientSide: false;
@@ -69,6 +119,7 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
69
119
  _isProduction: true;
70
120
  assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
71
121
  _viteDevServer: null;
122
+ devMiddleware: null;
72
123
  _usesClientRouter: boolean;
73
124
  _isPrerendering: true;
74
125
  viteConfig: import("vite").ResolvedConfig;
@@ -79,12 +130,11 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
79
130
  _isProduction: true;
80
131
  assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
81
132
  _viteDevServer: null;
133
+ devMiddleware: null;
82
134
  _usesClientRouter: boolean;
83
135
  _isPrerendering: false;
84
136
  viteConfig: null;
85
137
  }) & {
86
- baseServer: string;
87
- baseAssets: string;
88
138
  viteConfigRuntime: {
89
139
  root: string;
90
140
  build: {
@@ -95,6 +145,9 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
95
145
  inject: boolean | undefined;
96
146
  };
97
147
  };
148
+ baseServer: string;
149
+ baseAssets: string;
150
+ middlewares: import("./universal-middleware/core.js").Middleware[];
98
151
  })) & {
99
152
  prerenderContext: import("../../types/index.js").PrerenderContext | undefined;
100
153
  };
@@ -102,12 +155,6 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
102
155
  _baseServer: string;
103
156
  _baseAssets: string;
104
157
  _pageContextInit: PageContextInit & {
105
- _nodeDev?: {
106
- req: import("http").IncomingMessage;
107
- res: import("http").ServerResponse;
108
- };
109
- _reqWeb?: Request;
110
- } & {
111
158
  headers?: Record<string, unknown>;
112
159
  };
113
160
  _urlHandler: ((url: string) => string) | null;