vike 0.4.266 → 0.4.267-commit-7884d91
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/dist/client/runtime-client-routing/createPageContextClient.d.ts +4 -0
- package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +4 -0
- package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +22 -2
- package/dist/client/runtime-client-routing/getPageContextFromHooks.js +4 -5
- package/dist/client/runtime-client-routing/history.d.ts +19 -19
- package/dist/client/runtime-client-routing/history.js +89 -83
- package/dist/client/runtime-client-routing/renderPageClient.d.ts +472 -9
- package/dist/client/runtime-client-routing/renderPageClient.js +12 -11
- package/dist/client/runtime-client-routing/setScrollPosition.js +6 -5
- 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 +4 -0
- package/dist/client/runtime-server-routing/entry.js +1 -1
- package/dist/client/runtime-server-routing/getGlobalContextClientInternal.d.ts +4 -0
- package/dist/client/shared/getGlobalContextClientInternalShared.d.ts +4 -0
- package/dist/client/shared/getJsonSerializedInHtml.d.ts +2 -2
- package/dist/client/shared/getJsonSerializedInHtml.js +9 -6
- 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/resolveViteConfigUser.js +2 -2
- package/dist/node/prerender/runPrerender.d.ts +12 -4
- package/dist/node/prerender/runPrerender.js +71 -15
- package/dist/node/vite/assertEnvVite.js +2 -2
- package/dist/node/vite/index.js +2 -0
- package/dist/node/vite/plugins/build/handleAssetsManifest.js +8 -3
- 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 +24 -16
- 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 +9 -6
- package/dist/node/vite/plugins/pluginDev/logSkillHint.js +6 -4
- package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +1 -1
- package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +6 -4
- package/dist/node/vite/plugins/pluginUniversalDeploy.js +3 -2
- 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 +7 -5
- package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js +4 -10
- package/dist/node/vite/plugins/pluginVirtualFiles.js +20 -0
- package/dist/node/vite/shared/addSsrMiddleware.js +13 -1
- 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/getPlusFiles.d.ts +2 -2
- package/dist/node/vite/shared/resolveVikeConfigInternal/getPlusFiles.js +3 -3
- package/dist/node/vite/shared/resolveVikeConfigInternal/loadFileAtConfigTime.d.ts +4 -4
- package/dist/node/vite/shared/resolveVikeConfigInternal/loadFileAtConfigTime.js +9 -9
- package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +1 -1
- package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +12 -6
- package/dist/node/vite/shared/resolveVikeConfigInternal/pointerImports.d.ts +3 -1
- package/dist/node/vite/shared/resolveVikeConfigInternal/pointerImports.js +18 -46
- package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.d.ts +3 -3
- package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +333 -212
- package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +4 -1
- package/dist/node/vite/shared/resolveVikeConfigInternal.js +97 -26
- package/dist/server/runtime/globalContext.d.ts +20 -0
- package/dist/server/runtime/renderPageServer/analyzePage.js +3 -3
- package/dist/server/runtime/renderPageServer/createHttpResponse.d.ts +20 -7
- package/dist/server/runtime/renderPageServer/createHttpResponse.js +34 -15
- package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +4 -0
- 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 +17 -5
- package/dist/server/runtime/renderPageServer/getHttpResponseBody.d.ts +2 -2
- package/dist/server/runtime/renderPageServer/getHttpResponseBody.js +17 -2
- 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/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 +121 -31
- 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 +4 -0
- 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 +314 -1
- 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 +4 -0
- package/dist/server/runtime/renderPageServer.js +17 -8
- 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/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 +9 -1
- package/dist/types/PageConfig.d.ts +13 -5
- package/dist/types/PageContext.d.ts +18 -1
- package/dist/utils/PROJECT_VERSION.d.ts +1 -1
- package/dist/utils/PROJECT_VERSION.js +1 -1
- package/dist/utils/assertNodeVersion.d.ts +2 -0
- package/dist/utils/assertNodeVersion.js +4 -1
- package/dist/utils/assertViteVersion.d.ts +1 -3
- package/dist/utils/assertViteVersion.js +6 -9
- package/dist/utils/debug.d.ts +1 -1
- package/dist/utils/debug.js +1 -1
- 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/isDev.js +2 -7
- package/dist/utils/parseUrl-extras.js +4 -0
- package/dist/utils/requireResolve.d.ts +0 -6
- package/dist/utils/requireResolve.js +0 -8
- package/package.json +9 -10
- package/dist/shared-server-client/addIs404ToPageProps.d.ts +0 -2
- package/dist/shared-server-client/addIs404ToPageProps.js +0 -17
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Streamed pageContext values https://vike.dev/passToClient#streaming, upon client-side navigation: the decoder
|
|
2
|
+
// (../shared/streamedValues.ts) is loaded only if the `.pageContext.json` response is a JSON array (see
|
|
3
|
+
// server/runtime/renderPageServer/getPageContextJson.ts).
|
|
4
|
+
export { readPageContextJson };
|
|
5
|
+
export { cancelStreamedValues };
|
|
6
|
+
import { parse } from '@brillout/json-serializer/parse';
|
|
7
|
+
import '../assertEnvClient.js';
|
|
8
|
+
let decoder;
|
|
9
|
+
async function readPageContextJson(response) {
|
|
10
|
+
const reader = response.clone().body.getReader();
|
|
11
|
+
let chunk = await reader.read();
|
|
12
|
+
while (!chunk.done && !chunk.value.length)
|
|
13
|
+
chunk = await reader.read();
|
|
14
|
+
reader.cancel();
|
|
15
|
+
// A pageContext always serializes as `{…}`, so an array (`[` is 91) means streamed values
|
|
16
|
+
if (chunk.value?.[0] !== 91)
|
|
17
|
+
return parse(await response.text());
|
|
18
|
+
decoder ?? (decoder = await import('../shared/streamedValues.js'));
|
|
19
|
+
return decoder.readPageContextJsonStreamed(response);
|
|
20
|
+
}
|
|
21
|
+
function cancelStreamedValues(pageContext, isRendered) {
|
|
22
|
+
decoder?.cancelStreamedValues(pageContext, isRendered);
|
|
23
|
+
}
|
|
@@ -35,6 +35,10 @@ declare function createPageContextClient(): Promise<{
|
|
|
35
35
|
_pageFilesAll: import("../../shared-server-client/getPageFiles.js").PageFile[];
|
|
36
36
|
_pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
|
|
37
37
|
_pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
38
|
+
_environmentEntries: Record<string, {
|
|
39
|
+
pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
|
|
40
|
+
pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
41
|
+
} | null>;
|
|
38
42
|
_allPageIds: string[];
|
|
39
43
|
} & {
|
|
40
44
|
isClientSide: true;
|
|
@@ -23,7 +23,7 @@ if (import.meta.env.DEV)
|
|
|
23
23
|
hydrate();
|
|
24
24
|
async function hydrate() {
|
|
25
25
|
const pageContext = await createPageContextClient();
|
|
26
|
-
objectAssign(pageContext, getPageContextSerializedInHtml());
|
|
26
|
+
objectAssign(pageContext, await getPageContextSerializedInHtml());
|
|
27
27
|
// Sets pageContext.config using non-global configs — overrides the pageContext.config set using global configs at createPageContextClient()
|
|
28
28
|
const pageContextAddendum = await loadPageConfigsLazyClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._globalContext._pageConfigs, pageContext._globalContext._pageConfigGlobal);
|
|
29
29
|
objectAssign(pageContext, pageContextAddendum);
|
|
@@ -25,6 +25,10 @@ declare function getGlobalContextClientInternal(): Promise<{
|
|
|
25
25
|
_pageFilesAll: import("../../shared-server-client/getPageFiles.js").PageFile[];
|
|
26
26
|
_pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
|
|
27
27
|
_pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
28
|
+
_environmentEntries: Record<string, {
|
|
29
|
+
pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
|
|
30
|
+
pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
31
|
+
} | null>;
|
|
28
32
|
_allPageIds: string[];
|
|
29
33
|
} & {
|
|
30
34
|
isClientSide: true;
|
|
@@ -29,6 +29,10 @@ declare function getGlobalContextClientInternalShared(): Promise<{
|
|
|
29
29
|
_pageFilesAll: import("../../shared-server-client/getPageFiles.js").PageFile[];
|
|
30
30
|
_pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
|
|
31
31
|
_pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
32
|
+
_environmentEntries: Record<string, {
|
|
33
|
+
pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
|
|
34
|
+
pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
35
|
+
} | null>;
|
|
32
36
|
_allPageIds: string[];
|
|
33
37
|
} & {
|
|
34
38
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { getPageContextSerializedInHtml };
|
|
2
2
|
export { getGlobalContextSerializedInHtml };
|
|
3
3
|
import '../assertEnvClient.js';
|
|
4
|
-
declare function getPageContextSerializedInHtml(): {
|
|
4
|
+
declare function getPageContextSerializedInHtml(): Promise<{
|
|
5
5
|
pageId: string;
|
|
6
6
|
routeParams: Record<string, string>;
|
|
7
|
-
}
|
|
7
|
+
}>;
|
|
8
8
|
declare function getGlobalContextSerializedInHtml(): object;
|
|
@@ -9,23 +9,26 @@ import '../assertEnvClient.js';
|
|
|
9
9
|
// 1. <script id="vike_pageContext" type="application/json"> appears before the <script> that loads Vike's client runtime (which includes this file)
|
|
10
10
|
// 2. <script id="vike_pageContext" type="application/json"> is neither async nor defer
|
|
11
11
|
// See https://github.com/vikejs/vike/pull/1271
|
|
12
|
-
function getPageContextSerializedInHtml() {
|
|
13
|
-
const
|
|
12
|
+
async function getPageContextSerializedInHtml() {
|
|
13
|
+
const pageContextJson = findJson(htmlElementId_pageContext);
|
|
14
|
+
// A pageContext always serializes as `{…}`, so an array means streamed values https://vike.dev/passToClient#streaming
|
|
15
|
+
const pageContextSerializedInHtml = pageContextJson[0] === '['
|
|
16
|
+
? (await import('./streamedValues.js')).parsePageContextHtml(pageContextJson)
|
|
17
|
+
: parse(pageContextJson);
|
|
14
18
|
assert(hasProp(pageContextSerializedInHtml, 'pageId', 'string'));
|
|
15
19
|
assert(hasProp(pageContextSerializedInHtml, 'routeParams', 'string{}'));
|
|
16
20
|
return pageContextSerializedInHtml;
|
|
17
21
|
}
|
|
18
22
|
function getGlobalContextSerializedInHtml() {
|
|
19
|
-
const globalContextSerializedInHtml =
|
|
23
|
+
const globalContextSerializedInHtml = parse(findJson(htmlElementId_globalContext));
|
|
20
24
|
return globalContextSerializedInHtml;
|
|
21
25
|
}
|
|
22
|
-
function
|
|
26
|
+
function findJson(id) {
|
|
23
27
|
const elem = document.getElementById(id);
|
|
24
28
|
assertUsage(elem,
|
|
25
29
|
// It seems like it can be missing when HTML is malformed: https://github.com/vikejs/vike/issues/913
|
|
26
30
|
`Couldn't find #${id} (which Vike automatically injects in the HTML): make sure it exists (i.e. don't remove it and make sure your HTML isn't malformed)`);
|
|
27
31
|
const jsonStr = elem.textContent;
|
|
28
32
|
assert(jsonStr);
|
|
29
|
-
|
|
30
|
-
return json;
|
|
33
|
+
return jsonStr;
|
|
31
34
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export { asyncIterable };
|
|
2
|
+
import { markers } from '../../../shared-server-client/streamedValues.js';
|
|
3
|
+
import { readableStream } from './readableStream.js';
|
|
4
|
+
import '../../assertEnvClient.js';
|
|
5
|
+
// A ReadableStream, consumed as an async iterable: `for await (const chunk of pageContext.someAsyncIterable)` (Safari's
|
|
6
|
+
// ReadableStream isn't async-iterable)
|
|
7
|
+
const asyncIterable = {
|
|
8
|
+
marker: markers.asyncIterable,
|
|
9
|
+
revive(parseValue) {
|
|
10
|
+
const streamedValue = readableStream.revive(parseValue);
|
|
11
|
+
return { ...streamedValue, value: toAsyncIterable(streamedValue.value) };
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
function toAsyncIterable(stream) {
|
|
15
|
+
const reader = stream.getReader();
|
|
16
|
+
const iterator = {
|
|
17
|
+
next: () => reader.read(),
|
|
18
|
+
// Called upon `break` in `for await`
|
|
19
|
+
async return(value) {
|
|
20
|
+
await reader.cancel();
|
|
21
|
+
return { done: true, value };
|
|
22
|
+
},
|
|
23
|
+
[Symbol.asyncIterator]: () => iterator,
|
|
24
|
+
};
|
|
25
|
+
return iterator;
|
|
26
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { decodeChunk };
|
|
2
|
+
export { getLineError };
|
|
3
|
+
import '../../assertEnvClient.js';
|
|
4
|
+
declare function decodeChunk(line: {
|
|
5
|
+
t: string;
|
|
6
|
+
} | {
|
|
7
|
+
b: string;
|
|
8
|
+
} | {
|
|
9
|
+
v: unknown;
|
|
10
|
+
}, parseValue: (value: unknown) => unknown): unknown;
|
|
11
|
+
declare function getLineError(): Error;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// The decoding of the lines (see shared-server-client/streamedValues.ts)
|
|
2
|
+
export { decodeChunk };
|
|
3
|
+
export { getLineError };
|
|
4
|
+
import '../../assertEnvClient.js';
|
|
5
|
+
const textEncoder = new TextEncoder();
|
|
6
|
+
function decodeChunk(line, parseValue) {
|
|
7
|
+
if ('t' in line)
|
|
8
|
+
return textEncoder.encode(line.t);
|
|
9
|
+
if ('b' in line)
|
|
10
|
+
return decodeBase64url(line.b);
|
|
11
|
+
return parseValue(line.v);
|
|
12
|
+
}
|
|
13
|
+
function getLineError() {
|
|
14
|
+
return new Error('A streamed pageContext value failed on the server-side (see the server logs)');
|
|
15
|
+
}
|
|
16
|
+
function decodeBase64url(str) {
|
|
17
|
+
const binary = atob(str.replaceAll('-', '+').replaceAll('_', '/'));
|
|
18
|
+
return Uint8Array.from(binary, (c) => c.charCodeAt(0));
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { promise };
|
|
2
|
+
import { markers } from '../../../shared-server-client/streamedValues.js';
|
|
3
|
+
import { getLineError } from './lines.js';
|
|
4
|
+
import { genPromise } from '../../../utils/genPromise.js';
|
|
5
|
+
import '../../assertEnvClient.js';
|
|
6
|
+
// Settled by its `v` or `error` line
|
|
7
|
+
const promise = {
|
|
8
|
+
marker: markers.promise,
|
|
9
|
+
revive(parseValue) {
|
|
10
|
+
const { promise: value, resolve, reject } = genPromise({ timeout: null });
|
|
11
|
+
// Avoid an unhandled rejection if the user doesn't use the promise
|
|
12
|
+
value.catch(() => { });
|
|
13
|
+
return {
|
|
14
|
+
value,
|
|
15
|
+
push: (line) => ('v' in line ? resolve(parseValue(line.v)) : reject(getLineError())),
|
|
16
|
+
fail: reject,
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export { readableStream };
|
|
2
|
+
import { markers } from '../../../shared-server-client/streamedValues.js';
|
|
3
|
+
import { decodeChunk, getLineError } from './lines.js';
|
|
4
|
+
import '../../assertEnvClient.js';
|
|
5
|
+
// Fed by its chunk lines, until its `end` or `error` line
|
|
6
|
+
const readableStream = {
|
|
7
|
+
marker: markers.readableStream,
|
|
8
|
+
revive(parseValue) {
|
|
9
|
+
let controller;
|
|
10
|
+
let isClosed = false;
|
|
11
|
+
const value = new ReadableStream({
|
|
12
|
+
start(controller_) {
|
|
13
|
+
controller = controller_;
|
|
14
|
+
},
|
|
15
|
+
cancel() {
|
|
16
|
+
// Released by its consumer: the rest is ignored
|
|
17
|
+
isClosed = true;
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
const close = (err) => {
|
|
21
|
+
if (isClosed)
|
|
22
|
+
return;
|
|
23
|
+
isClosed = true;
|
|
24
|
+
if (err)
|
|
25
|
+
controller.error(err);
|
|
26
|
+
else
|
|
27
|
+
controller.close();
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
value,
|
|
31
|
+
push(line) {
|
|
32
|
+
if (isClosed)
|
|
33
|
+
return;
|
|
34
|
+
if ('end' in line)
|
|
35
|
+
close();
|
|
36
|
+
else if ('error' in line)
|
|
37
|
+
close(getLineError());
|
|
38
|
+
else
|
|
39
|
+
controller.enqueue(decodeChunk(line, parseValue));
|
|
40
|
+
},
|
|
41
|
+
fail: close,
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export { createReceiver };
|
|
2
|
+
export type { StreamedValueType };
|
|
3
|
+
import { type Reviver } from '@brillout/json-serializer/parse';
|
|
4
|
+
import type { Line } from '../../../shared-server-client/streamedValues.js';
|
|
5
|
+
import '../../assertEnvClient.js';
|
|
6
|
+
type StreamedValueType = {
|
|
7
|
+
marker: string;
|
|
8
|
+
/** `parseValue()` parses the value of a `v` line, which can contain further streamed values */
|
|
9
|
+
revive: (parseValue: (value: unknown) => unknown) => StreamedValue;
|
|
10
|
+
};
|
|
11
|
+
type StreamedValue = {
|
|
12
|
+
value: unknown;
|
|
13
|
+
push: (line: Line) => void;
|
|
14
|
+
fail: (err: unknown) => void;
|
|
15
|
+
};
|
|
16
|
+
declare function createReceiver(): {
|
|
17
|
+
reviver: Reviver;
|
|
18
|
+
onLine(lineStr: string): void;
|
|
19
|
+
/** The response failed, ended or was cancelled: the values that didn't end fail */
|
|
20
|
+
fail(err: unknown): void;
|
|
21
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// The types of streamed pageContext values (see shared-server-client/streamedValues.ts), and the receiver: its reviver
|
|
2
|
+
// replaces the markers with values, which it then feeds with their lines.
|
|
3
|
+
export { createReceiver };
|
|
4
|
+
import { parseTransform } from '@brillout/json-serializer/parse';
|
|
5
|
+
import { assert } from '../../../utils/assert.js';
|
|
6
|
+
import { readableStream } from './readableStream.js';
|
|
7
|
+
import { promise } from './promise.js';
|
|
8
|
+
import { asyncIterable } from './asyncIterable.js';
|
|
9
|
+
import '../../assertEnvClient.js';
|
|
10
|
+
const types = [readableStream, promise, asyncIterable];
|
|
11
|
+
function createReceiver() {
|
|
12
|
+
const streamedValues = new Map();
|
|
13
|
+
const parseValue = (value) => parseTransform(value, { reviver });
|
|
14
|
+
const reviver = (_path, value) => {
|
|
15
|
+
const type = types.find((type) => value.startsWith(type.marker));
|
|
16
|
+
if (!type)
|
|
17
|
+
return undefined;
|
|
18
|
+
const id = value.slice(type.marker.length);
|
|
19
|
+
assert(/^\d+$/.test(id));
|
|
20
|
+
// The same value referenced twice
|
|
21
|
+
let streamedValue = streamedValues.get(Number(id));
|
|
22
|
+
if (!streamedValue) {
|
|
23
|
+
streamedValue = type.revive(parseValue);
|
|
24
|
+
streamedValues.set(Number(id), streamedValue);
|
|
25
|
+
}
|
|
26
|
+
return { replacement: streamedValue.value };
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
reviver,
|
|
30
|
+
onLine(lineStr) {
|
|
31
|
+
const line = JSON.parse(lineStr);
|
|
32
|
+
// Unknown if contained in a chunk nobody read
|
|
33
|
+
streamedValues.get(line.s)?.push(line);
|
|
34
|
+
},
|
|
35
|
+
/** The response failed, ended or was cancelled: the values that didn't end fail */
|
|
36
|
+
fail(err) {
|
|
37
|
+
streamedValues.forEach((streamedValue) => streamedValue.fail(err));
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { parsePageContextHtml };
|
|
2
|
+
export { readPageContextJsonStreamed };
|
|
3
|
+
export { cancelStreamedValues };
|
|
4
|
+
import '../assertEnvClient.js';
|
|
5
|
+
declare function parsePageContextHtml(pageContextJson: string): unknown;
|
|
6
|
+
declare function readPageContextJsonStreamed(response: Response): Promise<Record<string, unknown>>;
|
|
7
|
+
declare function cancelStreamedValues(pageContext: object, isRendered: boolean): void;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// Streamed pageContext values, client-side (see shared-server-client/streamedValues.ts): the lines that follow the
|
|
2
|
+
// serialized pageContext feed the values of a receiver (see ./streamedValues/registry.ts).
|
|
3
|
+
//
|
|
4
|
+
// Loaded only if the pageContext has streamed values (see getJsonSerializedInHtml.ts and
|
|
5
|
+
// ../runtime-client-routing/streamedValues.ts).
|
|
6
|
+
export { parsePageContextHtml };
|
|
7
|
+
export { readPageContextJsonStreamed };
|
|
8
|
+
export { cancelStreamedValues };
|
|
9
|
+
import { parse } from '@brillout/json-serializer/parse';
|
|
10
|
+
import { assert } from '../../utils/assert.js';
|
|
11
|
+
import { isObject } from '../../utils/isObject.js';
|
|
12
|
+
import { createReceiver } from './streamedValues/registry.js';
|
|
13
|
+
import '../assertEnvClient.js';
|
|
14
|
+
// First render: the `<script>` tags that follow `<script id="vike_pageContext">` push the lines to `self.__vike_streamed`,
|
|
15
|
+
// before and after Vike's client runtime is loaded.
|
|
16
|
+
function parsePageContextHtml(pageContextJson) {
|
|
17
|
+
const receiver = createReceiver();
|
|
18
|
+
const [pageContext] = parse(pageContextJson, { reviver: receiver.reviver });
|
|
19
|
+
const g = self;
|
|
20
|
+
const linesQueued = Array.isArray(g.__vike_streamed) ? g.__vike_streamed : [];
|
|
21
|
+
g.__vike_streamed = { push: receiver.onLine };
|
|
22
|
+
linesQueued.forEach(receiver.onLine);
|
|
23
|
+
return pageContext;
|
|
24
|
+
}
|
|
25
|
+
// Client-side navigation: the `.pageContext.json` response (see server/runtime/renderPageServer/getPageContextJson.ts),
|
|
26
|
+
// `[pageContext` then one `,line` per line then `]`. The pageContext is returned as soon as its line arrives.
|
|
27
|
+
async function readPageContextJsonStreamed(response) {
|
|
28
|
+
const reader = response.body.getReader();
|
|
29
|
+
const lines = readLines(reader);
|
|
30
|
+
const { done, value: lineFirst } = await lines.next();
|
|
31
|
+
assert(!done && lineFirst[0] === '[');
|
|
32
|
+
const receiver = createReceiver();
|
|
33
|
+
const pageContextFromServer = parse(lineFirst.slice(1), { reviver: receiver.reviver });
|
|
34
|
+
assert(isObject(pageContextFromServer));
|
|
35
|
+
responsesStreaming.push(reader);
|
|
36
|
+
(async () => {
|
|
37
|
+
try {
|
|
38
|
+
for await (const line of lines) {
|
|
39
|
+
if (line !== ']')
|
|
40
|
+
receiver.onLine(line.slice(1));
|
|
41
|
+
}
|
|
42
|
+
receiver.fail(new Error('The pageContext.json response ended before the streamed pageContext values ended'));
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
// E.g. the server aborted the response
|
|
46
|
+
receiver.fail(err);
|
|
47
|
+
}
|
|
48
|
+
})();
|
|
49
|
+
return { ...pageContextFromServer, _streamedValuesReader: reader };
|
|
50
|
+
}
|
|
51
|
+
async function* readLines(reader) {
|
|
52
|
+
const decoder = new TextDecoder();
|
|
53
|
+
// Joined once per line: joining upon each chunk would be quadratic
|
|
54
|
+
let parts = [];
|
|
55
|
+
while (true) {
|
|
56
|
+
const { done, value } = await reader.read();
|
|
57
|
+
if (done)
|
|
58
|
+
return;
|
|
59
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
60
|
+
let lineStart = 0;
|
|
61
|
+
let lineEnd;
|
|
62
|
+
while ((lineEnd = chunk.indexOf('\n', lineStart)) !== -1) {
|
|
63
|
+
yield parts.join('') + chunk.slice(lineStart, lineEnd);
|
|
64
|
+
parts = [];
|
|
65
|
+
lineStart = lineEnd + 1;
|
|
66
|
+
}
|
|
67
|
+
parts.push(chunk.slice(lineStart));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Once a page is rendered, the streamed values fetched before it are cancelled (the previous page's, and superseded
|
|
71
|
+
// navigations'): the previous page keeps its values while it's shown.
|
|
72
|
+
let responsesStreaming = [];
|
|
73
|
+
// Cancels the streamed values of `pageContext` (a superseded navigation), or, once `pageContext` is rendered, all the others
|
|
74
|
+
function cancelStreamedValues(pageContext, isRendered) {
|
|
75
|
+
const { _streamedValuesReader } = pageContext;
|
|
76
|
+
responsesStreaming = responsesStreaming.filter((reader) => {
|
|
77
|
+
if ((reader === _streamedValuesReader) === isRendered)
|
|
78
|
+
return true;
|
|
79
|
+
reader.cancel().catch(() => { });
|
|
80
|
+
return false;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
@@ -15,7 +15,7 @@ import { toPosixPath } from '../../utils/path.js';
|
|
|
15
15
|
import pc from '@brillout/picocolors';
|
|
16
16
|
import { getEnvVarObject } from '../../utils/getEnvVarObject.js';
|
|
17
17
|
import { getVikeApiOperation, isVikeCliOrApi } from '../../shared-server-node/api-context.js';
|
|
18
|
-
import { getViteCliCommand,
|
|
18
|
+
import { getViteCliCommand, getViteCliArgsMinimal } from '../vite/shared/isViteCli.js';
|
|
19
19
|
import './assertEnvApiDevAndProd.js';
|
|
20
20
|
const globalObject = getGlobalObject('resolveViteConfigUser.ts', {});
|
|
21
21
|
const debug = createDebug('vike:vite-config-user');
|
|
@@ -83,7 +83,7 @@ async function resolve(viteContext) {
|
|
|
83
83
|
// Vite CLI args (when invoked via Vite's CLI rather than Vike's API).
|
|
84
84
|
// - Without this, Vike loads vite.config.js blind to `vite [root]` / `-c <file>` and ends up with the wrong root when those Vite CLI args are used.
|
|
85
85
|
{
|
|
86
|
-
const viteConfigFromViteCli =
|
|
86
|
+
const viteConfigFromViteCli = getViteCliArgsMinimal();
|
|
87
87
|
addConfig(viteConfigFromViteCli);
|
|
88
88
|
if (debug.isActivated)
|
|
89
89
|
debug('viteConfigFromViteCli', viteConfigFromViteCli);
|
|
@@ -32,13 +32,17 @@ type PrerenderContext = {
|
|
|
32
32
|
_userRootDir: string;
|
|
33
33
|
_outDirClient: string;
|
|
34
34
|
};
|
|
35
|
-
type Output<PageContext = PageContextPrerendered> = {
|
|
35
|
+
type Output<PageContext = PageContextPrerendered> = ({
|
|
36
36
|
filePath: string;
|
|
37
|
-
fileType:
|
|
37
|
+
fileType: 'HTML' | 'JSON';
|
|
38
38
|
fileContent: string;
|
|
39
39
|
pageContext: PageContext;
|
|
40
|
-
}
|
|
41
|
-
|
|
40
|
+
} | {
|
|
41
|
+
filePath: string;
|
|
42
|
+
fileType: 'CONTENT';
|
|
43
|
+
fileContent: string | Uint8Array;
|
|
44
|
+
pageContext: PageContext;
|
|
45
|
+
})[];
|
|
42
46
|
type PageContext = Awaited<ReturnType<typeof createPageContextPrerendering>> & {
|
|
43
47
|
_urlOriginalBeforeHook?: string;
|
|
44
48
|
};
|
|
@@ -101,6 +105,10 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
|
|
|
101
105
|
_pageFilesAll: PageFile[];
|
|
102
106
|
_pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
|
|
103
107
|
_pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
108
|
+
_environmentEntries: Record<string, {
|
|
109
|
+
pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
|
|
110
|
+
pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
111
|
+
} | null>;
|
|
104
112
|
_allPageIds: string[];
|
|
105
113
|
} & (({
|
|
106
114
|
isClientSide: false;
|