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.
- package/RenderErrorPage.js +2 -2
- package/abort.js +2 -2
- package/dist/client/__internal/index.d.ts +2 -0
- package/dist/client/__internal/index.js +3 -0
- package/dist/client/runtime-client-routing/createPageContextClient.d.ts +5 -0
- package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +5 -0
- package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +26 -2
- package/dist/client/runtime-client-routing/getPageContextFromHooks.js +4 -5
- package/dist/client/runtime-client-routing/renderPageClient.d.ts +481 -10
- package/dist/client/runtime-client-routing/renderPageClient.js +116 -41
- package/dist/client/runtime-client-routing/streamedValues.d.ts +5 -0
- package/dist/client/runtime-client-routing/streamedValues.js +23 -0
- package/dist/client/runtime-server-routing/createPageContextClient.d.ts +5 -0
- package/dist/client/runtime-server-routing/entry.js +1 -1
- package/dist/client/runtime-server-routing/getGlobalContextClientInternal.d.ts +5 -0
- package/dist/client/shared/getGlobalContextClientInternalShared.d.ts +5 -0
- package/dist/client/shared/getGlobalContextClientInternalShared.js +2 -0
- package/dist/client/shared/getJsonSerializedInHtml.d.ts +2 -2
- package/dist/client/shared/getJsonSerializedInHtml.js +9 -6
- package/dist/client/shared/loadPageConfigsLazyClientSide.js +0 -4
- package/dist/client/shared/removeFoucBuster.js +14 -3
- package/dist/client/shared/streamedValues/asyncIterable.d.ts +4 -0
- package/dist/client/shared/streamedValues/asyncIterable.js +26 -0
- package/dist/client/shared/streamedValues/lines.d.ts +11 -0
- package/dist/client/shared/streamedValues/lines.js +19 -0
- package/dist/client/shared/streamedValues/promise.d.ts +4 -0
- package/dist/client/shared/streamedValues/promise.js +19 -0
- package/dist/client/shared/streamedValues/readableStream.d.ts +4 -0
- package/dist/client/shared/streamedValues/readableStream.js +44 -0
- package/dist/client/shared/streamedValues/registry.d.ts +21 -0
- package/dist/client/shared/streamedValues/registry.js +40 -0
- package/dist/client/shared/streamedValues.d.ts +7 -0
- package/dist/client/shared/streamedValues.js +82 -0
- package/dist/node/api/dev.js +15 -1
- package/dist/node/api/resolveViteConfigUser.js +2 -2
- package/dist/node/api/serverEntryDev.d.ts +10 -0
- package/dist/node/api/serverEntryDev.js +125 -0
- package/dist/node/createDevMiddleware.js +12 -0
- package/dist/node/prerender/resolvePrerenderConfig.d.ts +1 -1
- package/dist/node/prerender/resolvePrerenderConfig.js +4 -1
- package/dist/node/prerender/runPrerender.d.ts +18 -18
- package/dist/node/prerender/runPrerender.js +61 -16
- package/dist/node/vite/assertEnvVite.js +1 -1
- package/dist/node/vite/index.js +2 -0
- package/dist/node/vite/plugins/build/handleAssetsManifest.js +6 -2
- package/dist/node/vite/plugins/build/pluginBuildApp.js +25 -26
- package/dist/node/vite/plugins/build/pluginBuildConfig.d.ts +2 -2
- package/dist/node/vite/plugins/build/pluginBuildConfig.js +25 -17
- package/dist/node/vite/plugins/build/pluginDistFileNames.js +70 -50
- package/dist/node/vite/plugins/build/pluginEnvironmentEntries.d.ts +6 -0
- package/dist/node/vite/plugins/build/pluginEnvironmentEntries.js +71 -0
- package/dist/node/vite/plugins/build/pluginSuppressRollupWarning.js +19 -17
- package/dist/node/vite/plugins/pluginCommon.js +10 -7
- package/dist/node/vite/plugins/pluginDev/optimizeDeps.d.ts +2 -2
- package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +6 -2
- package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +6 -4
- package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.d.ts +3 -0
- package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.js +28 -2
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.d.ts +1 -1
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.js +22 -11
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.d.ts +4 -0
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.js +29 -0
- package/dist/node/vite/plugins/pluginUniversalDeploy.js +29 -5
- package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.d.ts +2 -1
- package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.js +29 -12
- package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntryWithOldDesign.js +3 -2
- package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFilePageEntry.js +7 -7
- package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.d.ts +10 -6
- package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js +5 -11
- package/dist/node/vite/plugins/pluginVirtualFiles.js +20 -0
- package/dist/node/vite/shared/addSsrMiddleware.js +11 -27
- package/dist/node/vite/shared/findPageFiles.d.ts +1 -1
- package/dist/node/vite/shared/findPageFiles.js +1 -11
- package/dist/node/vite/shared/getAssetsDir.d.ts +3 -2
- package/dist/node/vite/shared/getAssetsDir.js +3 -3
- package/dist/node/vite/shared/isViteCli.d.ts +3 -3
- package/dist/node/vite/shared/isViteCli.js +80 -84
- package/dist/node/vite/shared/isViteServerSide.js +2 -7
- package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +6 -4
- package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +17 -6
- package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +9 -2
- package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +5 -1
- package/dist/node/vite/shared/resolveVikeConfigInternal.js +86 -13
- package/dist/server/__internal/fetch-deprecated.d.ts +2 -0
- package/dist/server/__internal/fetch-deprecated.js +6 -0
- package/dist/server/__internal/fetch.d.ts +9 -0
- package/dist/server/__internal/fetch.js +5 -0
- package/dist/server/__internal/index.d.ts +4 -0
- package/dist/server/__internal/index.js +8 -0
- package/dist/server/createPageRenderer.d.ts +2 -2
- package/dist/server/createPageRenderer.js +2 -2
- package/dist/server/runtime/createDevMiddleware.js +3 -1
- package/dist/server/runtime/globalContext.d.ts +69 -10
- package/dist/server/runtime/globalContext.js +35 -2
- package/dist/server/runtime/index.d.ts +1 -1
- package/dist/server/runtime/index.js +1 -1
- package/dist/server/runtime/renderPageServer/analyzePage.js +3 -3
- package/dist/server/runtime/renderPageServer/createHttpResponse.d.ts +20 -9
- package/dist/server/runtime/renderPageServer/createHttpResponse.js +34 -21
- package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +13 -23
- package/dist/server/runtime/renderPageServer/csp.d.ts +2 -1
- package/dist/server/runtime/renderPageServer/csp.js +2 -1
- package/dist/server/runtime/renderPageServer/execHookOnError.js +1 -1
- package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.d.ts +9 -0
- package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.js +21 -9
- package/dist/server/runtime/renderPageServer/getHttpResponseBody.d.ts +2 -2
- package/dist/server/runtime/renderPageServer/getHttpResponseBody.js +19 -12
- package/dist/server/runtime/renderPageServer/getPageContextJson.d.ts +8 -0
- package/dist/server/runtime/renderPageServer/getPageContextJson.js +47 -0
- package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.d.ts +2 -0
- package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.js +1 -1
- package/dist/server/runtime/renderPageServer/handlePageContextRequestUrl.js +2 -2
- package/dist/server/runtime/renderPageServer/headersResponse.d.ts +11 -2
- package/dist/server/runtime/renderPageServer/headersResponse.js +22 -2
- package/dist/server/runtime/renderPageServer/html/injectAssets/getHtmlTags.js +5 -4
- package/dist/server/runtime/renderPageServer/html/injectAssets.d.ts +3 -2
- package/dist/server/runtime/renderPageServer/html/injectAssets.js +7 -1
- package/dist/server/runtime/renderPageServer/html/renderHtml.js +4 -2
- package/dist/server/runtime/renderPageServer/html/serializeContext.d.ts +5 -1
- package/dist/server/runtime/renderPageServer/html/serializeContext.js +12 -9
- package/dist/server/runtime/renderPageServer/html/stream.d.ts +13 -6
- package/dist/server/runtime/renderPageServer/html/stream.js +135 -32
- package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.d.ts +30 -0
- package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.js +92 -0
- package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +10 -14
- package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.js +5 -1
- package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.d.ts +15 -0
- package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.js +61 -0
- package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +320 -55
- package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.js +21 -12
- package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.d.ts +4 -0
- package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.js +12 -0
- package/dist/server/runtime/renderPageServer/streamedValues/lines.d.ts +10 -0
- package/dist/server/runtime/renderPageServer/streamedValues/lines.js +49 -0
- package/dist/server/runtime/renderPageServer/streamedValues/promise.d.ts +4 -0
- package/dist/server/runtime/renderPageServer/streamedValues/promise.js +14 -0
- package/dist/server/runtime/renderPageServer/streamedValues/pump.d.ts +10 -0
- package/dist/server/runtime/renderPageServer/streamedValues/pump.js +67 -0
- package/dist/server/runtime/renderPageServer/streamedValues/readableStream.d.ts +4 -0
- package/dist/server/runtime/renderPageServer/streamedValues/readableStream.js +12 -0
- package/dist/server/runtime/renderPageServer/streamedValues/registry.d.ts +28 -0
- package/dist/server/runtime/renderPageServer/streamedValues/registry.js +33 -0
- package/dist/server/runtime/renderPageServer.d.ts +65 -18
- package/dist/server/runtime/renderPageServer.js +33 -62
- package/dist/server/runtime/universal-middleware/core.d.ts +25 -0
- package/dist/server/runtime/universal-middleware/core.js +167 -0
- package/dist/server/runtime/universal-middleware/deprecated-export.d.ts +3 -0
- package/dist/server/runtime/universal-middleware/deprecated-export.js +10 -0
- package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.d.ts +15 -0
- package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.js +51 -0
- package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.d.ts +9 -0
- package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.js +22 -0
- package/dist/shared-server-client/createGlobalContextShared.d.ts +8 -0
- package/dist/shared-server-client/createGlobalContextShared.js +2 -1
- package/dist/shared-server-client/getPageContextPublicShared.js +0 -2
- package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.d.ts +8 -0
- package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.js +17 -7
- package/dist/shared-server-client/hooks/execHook.d.ts +1 -1
- package/dist/shared-server-client/hooks/execHook.js +2 -2
- package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.js +2 -0
- package/dist/shared-server-client/route/abort.d.ts +1 -1
- package/dist/shared-server-client/route/abort.js +4 -2
- package/dist/shared-server-client/streamedValues.d.ts +22 -0
- package/dist/shared-server-client/streamedValues.js +24 -0
- package/dist/shared-server-node/vike-environments.d.ts +4 -0
- package/dist/shared-server-node/vike-environments.js +10 -0
- package/dist/shared-server-node/virtualFileId.d.ts +7 -5
- package/dist/shared-server-node/virtualFileId.js +42 -42
- package/dist/types/Config.d.ts +11 -3
- package/dist/types/GlobalContext.d.ts +3 -3
- package/dist/types/PageConfig.d.ts +13 -5
- package/dist/types/PageContext.d.ts +18 -10
- package/dist/types/PageContext.js +1 -0
- package/dist/types/Server.d.ts +1 -1
- package/dist/types/VikeNamespace.d.ts +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/utils/PROJECT_VERSION.d.ts +1 -1
- package/dist/utils/PROJECT_VERSION.js +1 -1
- package/dist/utils/assertViteVersion.d.ts +1 -3
- package/dist/utils/assertViteVersion.js +6 -9
- package/dist/utils/catchInfiniteLoop.js +33 -11
- package/dist/utils/deepEqual.d.ts +2 -1
- package/dist/utils/deepEqual.js +21 -6
- package/dist/utils/getContentTypeFromUrl.d.ts +2 -0
- package/dist/utils/getContentTypeFromUrl.js +39 -0
- package/dist/utils/injectRollupInputs.d.ts +2 -2
- package/dist/utils/injectRollupInputs.js +2 -2
- package/dist/utils/installUncaughtErrorHandlers.js +9 -0
- package/dist/utils/isDev.js +2 -7
- package/dist/utils/parseUrl-extras.js +4 -0
- package/fetch.js +2 -2
- package/modifyUrl.js +2 -2
- package/package.json +42 -26
- package/routing.js +2 -2
- package/universal-middleware.js +2 -2
- package/vike-server.d.ts +14 -0
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.d.ts +0 -4
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.js +0 -22
- package/dist/server/runtime/fetch.d.ts +0 -10
- package/dist/server/runtime/fetch.js +0 -5
- package/dist/server/runtime/universal-middleware.d.ts +0 -10
- package/dist/server/runtime/universal-middleware.js +0 -27
- package/dist/shared-server-client/addIs404ToPageProps.d.ts +0 -2
- 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 {
|
|
12
|
-
import {
|
|
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
|
|
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
|
|
59
|
-
const
|
|
60
|
-
|
|
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 =
|
|
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,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,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,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,
|
|
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
|
|
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:
|
|
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;
|