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.
- package/RenderErrorPage.js +2 -2
- package/abort.js +2 -2
- package/dist/client/__internal/index.d.ts +3 -0
- package/dist/client/__internal/index.js +4 -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 +28 -2
- package/dist/client/runtime-client-routing/getPageContextFromHooks.js +5 -5
- package/dist/client/runtime-client-routing/renderPageClient.d.ts +490 -10
- package/dist/client/runtime-client-routing/renderPageClient.js +149 -43
- 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 +1 -3
- 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
|
@@ -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
|
|
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:
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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 =
|
|
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
|
-
|
|
9
|
+
type PageContextHeadersResponse = {
|
|
7
10
|
headersResponse?: Headers;
|
|
8
|
-
|
|
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
|
|
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 =
|
|
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();
|