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,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { renderPageServer_userLand as renderPage } from './renderPageServer.js';
|
|
2
2
|
export { escapeInject, dangerouslySkipEscape } from './renderPageServer/html/renderHtml.js';
|
|
3
3
|
export { pipeWebStream, pipeNodeStream, pipeStream, stampPipe } from './renderPageServer/html/stream.js';
|
|
4
4
|
export { PROJECT_VERSION as version } from '../../utils/PROJECT_VERSION.js';
|
|
@@ -18,14 +18,14 @@ function analyzePage(pageContext) {
|
|
|
18
18
|
clientEntries.push(getVikeClientEntry(isClientRouting));
|
|
19
19
|
const clientDependencies = [];
|
|
20
20
|
clientDependencies.push({
|
|
21
|
-
id: generateVirtualFileId({ type: 'page-entry', pageId: pageConfig.pageId,
|
|
21
|
+
id: generateVirtualFileId({ type: 'page-entry', pageId: pageConfig.pageId, environmentName: 'client' }),
|
|
22
22
|
onlyAssets: isClientRuntimeLoaded ? false : true,
|
|
23
23
|
eagerlyImported: false,
|
|
24
24
|
});
|
|
25
25
|
// In production we inject the import of the server virtual module with ?extractAssets inside the client virtual module
|
|
26
26
|
if (!globalContext._isProduction) {
|
|
27
27
|
clientDependencies.push({
|
|
28
|
-
id: generateVirtualFileId({ type: 'page-entry', pageId: pageConfig.pageId,
|
|
28
|
+
id: generateVirtualFileId({ type: 'page-entry', pageId: pageConfig.pageId, environmentName: 'server' }),
|
|
29
29
|
onlyAssets: true,
|
|
30
30
|
eagerlyImported: false,
|
|
31
31
|
});
|
|
@@ -36,7 +36,7 @@ function analyzePage(pageContext) {
|
|
|
36
36
|
const { env } = configElement
|
|
37
37
|
assert(env)
|
|
38
38
|
const onlyAssets = env === { server: true }
|
|
39
|
-
const eagerlyImported = env === { server: true, client:
|
|
39
|
+
const eagerlyImported = env === { server: true, client: true, clientRoutingOnly: true, eager: true }
|
|
40
40
|
if (onlyAssets || eagerlyImported) {
|
|
41
41
|
clientDependencies.push({
|
|
42
42
|
id: configElement.importPath,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createHttpResponsePageHtml };
|
|
2
|
+
export { createHttpResponsePageContent };
|
|
2
3
|
export { createHttpResponsePageJson };
|
|
3
4
|
export { createHttpResponseErrorFallback };
|
|
4
5
|
export { createHttpResponseErrorFallback_noGlobalContext };
|
|
@@ -6,12 +7,12 @@ export { createHttpResponseErrorFallbackJson };
|
|
|
6
7
|
export { createHttpResponseRedirect };
|
|
7
8
|
export { createHttpResponse404 };
|
|
8
9
|
export { createHttpResponseBaseIsMissing };
|
|
9
|
-
export { createHttpResponseFromUniversalMiddleware };
|
|
10
10
|
export type { HttpResponse };
|
|
11
11
|
import type { GetPageAssets } from './getPageAssets.js';
|
|
12
12
|
import type { HtmlRender } from './html/renderHtml.js';
|
|
13
|
-
import type {
|
|
14
|
-
import type {
|
|
13
|
+
import type { StreamReadableWeb } from './html/stream.js';
|
|
14
|
+
import type { Content, RenderHook } from './execHookOnRenderHtml.js';
|
|
15
|
+
import type { AbortStatusCode, UrlRedirect, PageContextAborted } from '../../../shared-server-client/route/abort.js';
|
|
15
16
|
import { HttpResponseBody } from './getHttpResponseBody.js';
|
|
16
17
|
import { type EarlyHint } from './getEarlyHints.js';
|
|
17
18
|
import type { PageContextBegin } from '../renderPageServer.js';
|
|
@@ -24,7 +25,7 @@ type HttpResponse = {
|
|
|
24
25
|
/** **Deprecated**: use `headers` instead, see https://vike.dev/migration/0.4.134 */
|
|
25
26
|
contentType: string | undefined;
|
|
26
27
|
} & HttpResponseBody;
|
|
27
|
-
|
|
28
|
+
type PageContextHttpResponsePage = {
|
|
28
29
|
pageId: null | string;
|
|
29
30
|
is404: null | boolean;
|
|
30
31
|
errorWhileRendering: null | Error;
|
|
@@ -32,14 +33,24 @@ declare function createHttpResponsePage(htmlRender: HtmlRender, renderHook: null
|
|
|
32
33
|
_globalContext: GlobalContextServerInternal;
|
|
33
34
|
abortStatusCode?: AbortStatusCode;
|
|
34
35
|
headersResponse?: Headers;
|
|
35
|
-
|
|
36
|
+
pageContextsAborted: PageContextAborted[];
|
|
37
|
+
};
|
|
38
|
+
declare function createHttpResponsePageHtml(htmlRender: HtmlRender, renderHook: null | RenderHook, pageContext: PageContextHttpResponsePage): Promise<HttpResponse>;
|
|
39
|
+
declare function createHttpResponsePageContent(content: Content, renderHook: RenderHook, pageContext: PageContextHttpResponsePage & {
|
|
40
|
+
urlOriginal: string;
|
|
41
|
+
}): HttpResponse;
|
|
36
42
|
declare function createHttpResponse404(errMsg404: string): HttpResponse;
|
|
37
43
|
declare function createHttpResponseBaseIsMissing(urlOriginal: string, baseServer: string): HttpResponse;
|
|
38
44
|
declare function createHttpResponseErrorFallback(pageContext: {
|
|
39
45
|
_globalContext: GlobalContextServerInternal;
|
|
46
|
+
pageContextsAborted: PageContextAborted[];
|
|
40
47
|
}): HttpResponse;
|
|
41
48
|
declare function createHttpResponseErrorFallback_noGlobalContext(): HttpResponse;
|
|
42
|
-
declare function createHttpResponseErrorFallbackJson(
|
|
43
|
-
|
|
49
|
+
declare function createHttpResponseErrorFallbackJson(pageContext: {
|
|
50
|
+
pageContextsAborted: PageContextAborted[];
|
|
51
|
+
}): HttpResponse;
|
|
52
|
+
declare function createHttpResponsePageJson(pageContextJson: string | StreamReadableWeb, pageContext: {
|
|
53
|
+
headersResponse?: Headers;
|
|
54
|
+
pageContextsAborted: PageContextAborted[];
|
|
55
|
+
}): Promise<HttpResponse>;
|
|
44
56
|
declare function createHttpResponseRedirect({ url, statusCode }: UrlRedirect, pageContextInit: PageContextBegin): HttpResponse;
|
|
45
|
-
declare function createHttpResponseFromUniversalMiddleware(response: Response, earlyHints?: EarlyHint[]): HttpResponse;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createHttpResponsePageHtml };
|
|
2
|
+
export { createHttpResponsePageContent };
|
|
2
3
|
export { createHttpResponsePageJson };
|
|
3
4
|
export { createHttpResponseErrorFallback };
|
|
4
5
|
export { createHttpResponseErrorFallback_noGlobalContext };
|
|
@@ -6,20 +7,34 @@ export { createHttpResponseErrorFallbackJson };
|
|
|
6
7
|
export { createHttpResponseRedirect };
|
|
7
8
|
export { createHttpResponse404 };
|
|
8
9
|
export { createHttpResponseBaseIsMissing };
|
|
9
|
-
export { createHttpResponseFromUniversalMiddleware };
|
|
10
10
|
import { escapeHtml } from '../../../utils/escapeHtml.js';
|
|
11
11
|
import { assert, assertWarning } from '../../../utils/assert.js';
|
|
12
12
|
import { getErrorPageId, isErrorPage } from '../../../shared-server-client/error-page.js';
|
|
13
|
+
import { getContentTypeFromUrl } from '../../../utils/getContentTypeFromUrl.js';
|
|
13
14
|
import { getHttpResponseBody, getHttpResponseBodyStreamHandlers } from './getHttpResponseBody.js';
|
|
14
15
|
import { getEarlyHints } from './getEarlyHints.js';
|
|
15
16
|
import { assertNoInfiniteHttpRedirect } from './createHttpResponse/assertNoInfiniteHttpRedirect.js';
|
|
16
|
-
import { resolveHeadersResponseFinal } from './headersResponse.js';
|
|
17
|
+
import { getHeadersSetCookieAborted, resolveHeadersResponseFinal, resolveHeadersResponseSetCookie, } from './headersResponse.js';
|
|
17
18
|
import { stringify } from '@brillout/json-serializer/stringify';
|
|
18
19
|
import '../../assertEnvServer.js';
|
|
19
20
|
const contentTypeJson = 'application/json';
|
|
20
21
|
const contentTypeHtml = 'text/html;charset=utf-8';
|
|
21
22
|
const htmlFallbackLog = 'This HTML was generated by Vike.';
|
|
22
|
-
async function
|
|
23
|
+
async function createHttpResponsePageHtml(htmlRender, renderHook, pageContext) {
|
|
24
|
+
const statusCode = getStatusCode(pageContext);
|
|
25
|
+
const earlyHints = getEarlyHints(await pageContext.__getPageAssets());
|
|
26
|
+
const headers = resolveHeadersResponseFinal(pageContext, statusCode);
|
|
27
|
+
return createHttpResponse(statusCode, contentTypeHtml, headers, htmlRender, earlyHints, renderHook);
|
|
28
|
+
}
|
|
29
|
+
function createHttpResponsePageContent(content, renderHook, pageContext) {
|
|
30
|
+
const statusCode = getStatusCode(pageContext);
|
|
31
|
+
const headers = resolveHeadersResponseFinal(pageContext, statusCode);
|
|
32
|
+
if (!headers.some(([k]) => k.toLowerCase() === 'content-type')) {
|
|
33
|
+
headers.push(['Content-Type', getContentTypeFromUrl(pageContext.urlOriginal) ?? 'application/octet-stream']);
|
|
34
|
+
}
|
|
35
|
+
return createHttpResponseCommon(statusCode, headers, content, [], renderHook);
|
|
36
|
+
}
|
|
37
|
+
function getStatusCode(pageContext) {
|
|
23
38
|
let statusCode = pageContext.abortStatusCode;
|
|
24
39
|
if (!statusCode) {
|
|
25
40
|
const isError = !pageContext.pageId || isErrorPage(pageContext.pageId, pageContext._globalContext._pageConfigs);
|
|
@@ -35,9 +50,7 @@ async function createHttpResponsePage(htmlRender, renderHook, pageContext) {
|
|
|
35
50
|
statusCode = pageContext.is404 ? 404 : 500;
|
|
36
51
|
}
|
|
37
52
|
}
|
|
38
|
-
|
|
39
|
-
const headers = resolveHeadersResponseFinal(pageContext, statusCode);
|
|
40
|
-
return createHttpResponse(statusCode, contentTypeHtml, headers, htmlRender, earlyHints, renderHook);
|
|
53
|
+
return statusCode;
|
|
41
54
|
}
|
|
42
55
|
function createHttpResponse404(errMsg404) {
|
|
43
56
|
const httpResponse = createHttpResponse(404, contentTypeHtml, [], getHtmlFallback(`<p>${errMsg404}.</p>`));
|
|
@@ -76,21 +89,26 @@ function createHttpResponseErrorFallback(pageContext) {
|
|
|
76
89
|
return 'no error page (https://vike.dev/error-page) is defined, make sure to create one';
|
|
77
90
|
}
|
|
78
91
|
})();
|
|
79
|
-
|
|
92
|
+
// Cookies set before `throw redirect()` or `throw render()` are kept
|
|
93
|
+
return createHttpResponseError_(reason, getHeadersSetCookieAborted(pageContext));
|
|
80
94
|
}
|
|
81
95
|
function createHttpResponseErrorFallback_noGlobalContext() {
|
|
82
|
-
return createHttpResponseError_('no error page (https://vike.dev/error-page) could be rendered');
|
|
96
|
+
return createHttpResponseError_('no error page (https://vike.dev/error-page) could be rendered', []);
|
|
83
97
|
}
|
|
84
|
-
function createHttpResponseError_(reason) {
|
|
85
|
-
const httpResponse = createHttpResponse(500, contentTypeHtml,
|
|
98
|
+
function createHttpResponseError_(reason, headers) {
|
|
99
|
+
const httpResponse = createHttpResponse(500, contentTypeHtml, headers, getHtmlFallback('<p>An error occurred.</p>', `${htmlFallbackLog} Vike returned this HTML because ${reason}.`));
|
|
86
100
|
return httpResponse;
|
|
87
101
|
}
|
|
88
|
-
function createHttpResponseErrorFallbackJson() {
|
|
89
|
-
const
|
|
102
|
+
function createHttpResponseErrorFallbackJson(pageContext) {
|
|
103
|
+
const headers = getHeadersSetCookieAborted(pageContext);
|
|
104
|
+
const httpResponse = createHttpResponse(500, contentTypeJson, headers, stringify({ serverSideError: true }));
|
|
90
105
|
return httpResponse;
|
|
91
106
|
}
|
|
92
|
-
async function createHttpResponsePageJson(
|
|
93
|
-
const
|
|
107
|
+
async function createHttpResponsePageJson(pageContextJson, pageContext) {
|
|
108
|
+
const headers = resolveHeadersResponseSetCookie(pageContext);
|
|
109
|
+
headers.push(['Content-Type', contentTypeJson]);
|
|
110
|
+
// A stream if there are streamed pageContext values, see https://vike.dev/passToClient#streaming
|
|
111
|
+
const httpResponse = createHttpResponseCommon(200, headers, pageContextJson);
|
|
94
112
|
return httpResponse;
|
|
95
113
|
}
|
|
96
114
|
function createHttpResponseRedirect({ url, statusCode }, pageContextInit) {
|
|
@@ -98,17 +116,12 @@ function createHttpResponseRedirect({ url, statusCode }, pageContextInit) {
|
|
|
98
116
|
assert(url);
|
|
99
117
|
assert(statusCode);
|
|
100
118
|
assert(300 <= statusCode && statusCode <= 399);
|
|
101
|
-
const headers = [['Location', url]];
|
|
119
|
+
const headers = [['Location', url], ...resolveHeadersResponseSetCookie(pageContextInit)];
|
|
102
120
|
return createHttpResponse(statusCode, contentTypeHtml, headers,
|
|
103
121
|
// For bots / programmatic crawlig: show what's going on.
|
|
104
122
|
// For users: showing a blank page is probably better than a flickering text.
|
|
105
123
|
getHtmlFallback(`<p style="display: none">Redirecting to ${escapeHtml(url)}</p>`));
|
|
106
124
|
}
|
|
107
|
-
function createHttpResponseFromUniversalMiddleware(response, earlyHints) {
|
|
108
|
-
const body = response.body ?? getHtmlFallback('<p style="display: none">No HTTP response body.</p>');
|
|
109
|
-
const httpResponse = createHttpResponseCommon(response.status, Array.from(response.headers.entries()), body, earlyHints);
|
|
110
|
-
return httpResponse;
|
|
111
|
-
}
|
|
112
125
|
function getHtmlFallback(bodyHtml, logText = htmlFallbackLog) {
|
|
113
126
|
return `${bodyHtml}<script>console.log(${JSON.stringify(logText)})</script>`;
|
|
114
127
|
}
|
|
@@ -3,10 +3,10 @@ export { createPageContextServerWithoutGlobalContext };
|
|
|
3
3
|
export type { PageContextCreatedServer };
|
|
4
4
|
export type { PageContextCreatedServerWithoutGlobalContext };
|
|
5
5
|
import type { GlobalContextServerInternal } from '../globalContext.js';
|
|
6
|
-
import type { PageContextInit
|
|
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,
|