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
|
@@ -38,7 +38,7 @@ declare function execHookSingleWithReturn<PageContext extends PageContextExecHoo
|
|
|
38
38
|
}>;
|
|
39
39
|
declare function isUserHookError(err: unknown): false | HookLoc;
|
|
40
40
|
declare function execHookSingleWithoutPageContext<HookReturn>(hook: Omit<HookInternal, 'hookFn'>, globalContext: GlobalContextPublicMinimum, hookFnCaller: () => HookReturn): Promise<HookReturn>;
|
|
41
|
-
declare function execHookSingleSync<PageContext extends PageContextExecHook>(hook: Omit<HookInternal<PageContext>, 'hookTimeout'>, globalContext: GlobalContextPublicMinimum, pageContext: PageContext | null, getPageContextPublic: (pageContext: PageContext) => PageContext, hookFnCaller?: () => unknown): {
|
|
41
|
+
declare function execHookSingleSync<PageContext extends PageContextExecHook>(hook: Omit<HookInternal<PageContext>, 'hookTimeout'>, globalContext: GlobalContextPublicMinimum, pageContext: PageContext | null, getPageContextPublic: (pageContext: PageContext) => PageContext, hookFnCaller?: (pageContextPublic: PageContext | null) => unknown): {
|
|
42
42
|
hookReturn: unknown;
|
|
43
43
|
};
|
|
44
44
|
type HookPublic = {
|
|
@@ -61,8 +61,8 @@ async function execHookSingleWithoutPageContext(hook, globalContext, hookFnCalle
|
|
|
61
61
|
}
|
|
62
62
|
function execHookSingleSync(hook, globalContext, pageContext, getPageContextPublic, hookFnCaller) {
|
|
63
63
|
const pageContextPublic = pageContext && getPageContextPublic(pageContext);
|
|
64
|
-
hookFnCaller
|
|
65
|
-
const hookReturn = execHookBase(
|
|
64
|
+
const call = hookFnCaller ? () => hookFnCaller(pageContextPublic) : () => hook.hookFn(pageContextPublic);
|
|
65
|
+
const hookReturn = execHookBase(call, hook, globalContext, pageContextPublic);
|
|
66
66
|
return { hookReturn };
|
|
67
67
|
}
|
|
68
68
|
function execHookBaseAsync(hookFnCaller, hook, globalContext, pageContextPublic) {
|
|
@@ -207,6 +207,8 @@ function getConfigValuesBase(pageConfig, runtimeEnv, isEager) {
|
|
|
207
207
|
assert(configDef);
|
|
208
208
|
if (isEager !== null && isEager !== !!configDef.eager)
|
|
209
209
|
return 'SKIP';
|
|
210
|
+
if (configDef._valueNotLoadedAtRuntime && !runtimeEnv.isConfigEnvironment)
|
|
211
|
+
return 'SKIP';
|
|
210
212
|
if (!configDef.cumulative) {
|
|
211
213
|
const sourcesRelevant = getConfigValueSourcesRelevant(configName, runtimeEnv, pageConfig);
|
|
212
214
|
const source = sourcesRelevant[0];
|
|
@@ -113,7 +113,7 @@ type PageContextAborted = {
|
|
|
113
113
|
_pageContextAbort: PageContextAbort;
|
|
114
114
|
} & PageContextMin;
|
|
115
115
|
declare function getPageContextAddendumAbort(pageContextsAborted: PageContextAborted[]): PageContextAbort | null;
|
|
116
|
-
declare function addNewPageContextAborted(pageContextsAborted: PageContextAborted[], pageContext:
|
|
116
|
+
declare function addNewPageContextAborted<PageContext extends PageContextMin>(pageContextsAborted: PageContextAborted[], pageContext: PageContext, pageContextAbort: PageContextAbort, getPageContextPublic: (pageContext: PageContext & PageContextAborted) => PageContextAborted): void;
|
|
117
117
|
type InferTwoOverloads<F extends Function> = F extends {
|
|
118
118
|
(...a1: infer A1): infer R1;
|
|
119
119
|
(...a0: infer A0): infer R0;
|
|
@@ -189,9 +189,11 @@ function getPageContextAddendumAbort(pageContextsAborted) {
|
|
|
189
189
|
// Sets pageContext._urlRewrite from pageContextAbort._urlRewrite
|
|
190
190
|
return pageContextAbort;
|
|
191
191
|
}
|
|
192
|
-
function addNewPageContextAborted(pageContextsAborted, pageContext, pageContextAbort
|
|
192
|
+
function addNewPageContextAborted(pageContextsAborted, pageContext, pageContextAbort,
|
|
193
|
+
// `pageContextsAborted` is exposed to users: https://vike.dev/pageContext#pageContextsAborted
|
|
194
|
+
getPageContextPublic) {
|
|
193
195
|
objectAssign(pageContext, { _pageContextAbort: pageContextAbort });
|
|
194
|
-
pageContextsAborted.push(pageContext);
|
|
196
|
+
pageContextsAborted.push(getPageContextPublic(pageContext));
|
|
195
197
|
assertNoInfiniteAbortLoop(pageContextsAborted);
|
|
196
198
|
}
|
|
197
199
|
// There doesn't seem to be a way to count the number of HTTP redirects (Vike doesn't have access to the HTTP request headers/cookies)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export { markers };
|
|
2
|
+
export type { Line };
|
|
3
|
+
export type { LineContent };
|
|
4
|
+
declare const markers: {
|
|
5
|
+
readableStream: string;
|
|
6
|
+
promise: string;
|
|
7
|
+
asyncIterable: string;
|
|
8
|
+
};
|
|
9
|
+
type LineContent = {
|
|
10
|
+
t: string;
|
|
11
|
+
} | {
|
|
12
|
+
b: string;
|
|
13
|
+
} | {
|
|
14
|
+
v: unknown;
|
|
15
|
+
} | {
|
|
16
|
+
end: true;
|
|
17
|
+
} | {
|
|
18
|
+
error: true;
|
|
19
|
+
};
|
|
20
|
+
type Line = {
|
|
21
|
+
s: number;
|
|
22
|
+
} & LineContent;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// The wire format of streamed pageContext values: a ReadableStream, a Promise or an async iterable (e.g. an async
|
|
2
|
+
// generator) anywhere in a passToClient value. https://vike.dev/passToClient#streaming
|
|
3
|
+
//
|
|
4
|
+
// - Serialization: a marker followed by the value's id, e.g. `"!VikePromise:0"` (the serializer escapes user strings
|
|
5
|
+
// starting with `!`, so a user string can't be mistaken for a marker).
|
|
6
|
+
// - Delivery: the serialized pageContext is wrapped in a JSON array (the client loads its decoder only then) followed, in
|
|
7
|
+
// the same response, by one JSON line per chunk / result:
|
|
8
|
+
// - HTML: see server/runtime/renderPageServer/html/streamedValuesHtml.ts
|
|
9
|
+
// - `.pageContext.json`: see server/runtime/renderPageServer/getPageContextJson.ts
|
|
10
|
+
//
|
|
11
|
+
// Lines:
|
|
12
|
+
// {"s":<id>,"t":<text>} A chunk that is a Uint8Array of valid UTF-8
|
|
13
|
+
// {"s":<id>,"b":<base64url>} A chunk that is any other Uint8Array
|
|
14
|
+
// {"s":<id>,"v":<value>} Any other chunk, or the value of a Promise (@brillout/json-serializer)
|
|
15
|
+
// {"s":<id>,"end":true} The end of a ReadableStream / async iterable
|
|
16
|
+
// {"s":<id>,"error":true} The value failed (the error is logged on the server-side and isn't sent to the client)
|
|
17
|
+
//
|
|
18
|
+
// A chunk or a Promise value can contain further streamed values: they get new ids and their lines follow.
|
|
19
|
+
export { markers };
|
|
20
|
+
const markers = {
|
|
21
|
+
readableStream: '!VikeStream:',
|
|
22
|
+
promise: '!VikePromise:',
|
|
23
|
+
asyncIterable: '!VikeAsyncIterable:',
|
|
24
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { isEnvironmentBuiltIn };
|
|
2
|
+
export { isEnvironmentNameValid };
|
|
3
|
+
// Vike's built-in environments; every other environment name is an additional environment (e.g. `rsc`)
|
|
4
|
+
function isEnvironmentBuiltIn(environmentName) {
|
|
5
|
+
return environmentName === 'server' || environmentName === 'client';
|
|
6
|
+
}
|
|
7
|
+
// `:` separates the environment name from the page ID in virtual file IDs
|
|
8
|
+
function isEnvironmentNameValid(environmentName) {
|
|
9
|
+
return environmentName !== '' && !environmentName.includes(':');
|
|
10
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { parseVirtualFileId };
|
|
2
2
|
export { generateVirtualFileId };
|
|
3
|
+
export { generateVirtualFileIdAdditionalEnvironment };
|
|
3
4
|
export { virtualFileIdGlobalEntryServer };
|
|
4
5
|
export { virtualFileIdGlobalEntryClientSR };
|
|
5
6
|
export { virtualFileIdGlobalEntryClientCR };
|
|
@@ -8,21 +9,22 @@ declare const virtualFileIdGlobalEntryClientSR = "virtual:vike:global-entry:clie
|
|
|
8
9
|
declare const virtualFileIdGlobalEntryClientCR = "virtual:vike:global-entry:client:client-routing";
|
|
9
10
|
type VirtualFileIdEntryParsed = {
|
|
10
11
|
type: 'global-entry';
|
|
11
|
-
|
|
12
|
+
environmentName: string;
|
|
12
13
|
isClientRouting: boolean;
|
|
13
14
|
} | {
|
|
14
15
|
type: 'page-entry';
|
|
15
|
-
|
|
16
|
+
environmentName: string;
|
|
16
17
|
pageId: string;
|
|
17
18
|
isExtractAssets: boolean;
|
|
18
19
|
};
|
|
19
20
|
declare function parseVirtualFileId(id: string): false | VirtualFileIdEntryParsed;
|
|
20
21
|
declare function generateVirtualFileId(args: {
|
|
21
22
|
type: 'global-entry';
|
|
22
|
-
|
|
23
|
-
isClientRouting
|
|
23
|
+
environmentName: string;
|
|
24
|
+
isClientRouting?: boolean;
|
|
24
25
|
} | {
|
|
25
26
|
type: 'page-entry';
|
|
26
27
|
pageId: string;
|
|
27
|
-
|
|
28
|
+
environmentName: string;
|
|
28
29
|
}): string;
|
|
30
|
+
declare function generateVirtualFileIdAdditionalEnvironment(environmentName: string): string;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export { parseVirtualFileId };
|
|
2
2
|
export { generateVirtualFileId };
|
|
3
|
+
export { generateVirtualFileIdAdditionalEnvironment };
|
|
3
4
|
export { virtualFileIdGlobalEntryServer };
|
|
4
5
|
export { virtualFileIdGlobalEntryClientSR };
|
|
5
6
|
export { virtualFileIdGlobalEntryClientCR };
|
|
6
7
|
import { extractAssetsRemoveQuery } from './extractAssetsQuery.js';
|
|
7
8
|
import { assert } from '../utils/assert.js';
|
|
9
|
+
import { isEnvironmentBuiltIn, isEnvironmentNameValid } from './vike-environments.js';
|
|
8
10
|
import { assertIsNotBrowser } from '../utils/assertIsNotBrowser.js';
|
|
9
11
|
import { removeVirtualFileIdPrefix } from '../utils/virtualFileId.js';
|
|
10
12
|
assertIsNotBrowser();
|
|
@@ -18,13 +20,6 @@ const virtualFileIdGlobalEntryClientSR =
|
|
|
18
20
|
const virtualFileIdGlobalEntryClientCR =
|
|
19
21
|
//
|
|
20
22
|
'virtual:vike:global-entry:client:client-routing';
|
|
21
|
-
// Page entries
|
|
22
|
-
const virtualFileIdPageEntryClient =
|
|
23
|
-
//
|
|
24
|
-
'virtual:vike:page-entry:client:'; // ${pageId}
|
|
25
|
-
const virtualFileIdPageEntryServer =
|
|
26
|
-
//
|
|
27
|
-
'virtual:vike:page-entry:server:'; // ${pageId}
|
|
28
23
|
// Virtual ID prefixes
|
|
29
24
|
const virtualFileIdPageEntryPrefix =
|
|
30
25
|
//
|
|
@@ -38,11 +33,11 @@ function parseVirtualFileId(id) {
|
|
|
38
33
|
return false;
|
|
39
34
|
// Global entry
|
|
40
35
|
if (id.includes(virtualFileIdGlobalEntryPrefix)) {
|
|
41
|
-
const isForClientSide = id !== virtualFileIdGlobalEntryServer;
|
|
42
36
|
const isClientRouting = id === virtualFileIdGlobalEntryClientCR;
|
|
37
|
+
const environmentName = parseGlobalEntryEnvironmentName(id);
|
|
43
38
|
return {
|
|
44
39
|
type: 'global-entry',
|
|
45
|
-
|
|
40
|
+
environmentName,
|
|
46
41
|
isClientRouting,
|
|
47
42
|
};
|
|
48
43
|
}
|
|
@@ -51,52 +46,57 @@ function parseVirtualFileId(id) {
|
|
|
51
46
|
const idOriginal = id;
|
|
52
47
|
id = extractAssetsRemoveQuery(id);
|
|
53
48
|
const isExtractAssets = idOriginal !== id;
|
|
54
|
-
|
|
49
|
+
const environmentNameBegin = virtualFileIdPageEntryPrefix.length;
|
|
50
|
+
const environmentNameEnd = id.indexOf(':', environmentNameBegin);
|
|
51
|
+
assert(environmentNameEnd > environmentNameBegin);
|
|
52
|
+
const environmentName = id.slice(environmentNameBegin, environmentNameEnd);
|
|
53
|
+
const pageIdSerialized = id.slice(environmentNameEnd + 1);
|
|
54
|
+
const pageId = deserializePageId(pageIdSerialized);
|
|
55
|
+
if (environmentName === 'client')
|
|
55
56
|
assert(isExtractAssets === false);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
isExtractAssets,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
if (id.startsWith(virtualFileIdPageEntryServer)) {
|
|
66
|
-
const pageIdSerialized = id.slice(virtualFileIdPageEntryServer.length);
|
|
67
|
-
const pageId = deserializePageId(pageIdSerialized);
|
|
68
|
-
return {
|
|
69
|
-
type: 'page-entry',
|
|
70
|
-
pageId,
|
|
71
|
-
isForClientSide: false,
|
|
72
|
-
isExtractAssets,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
assert(false);
|
|
57
|
+
return {
|
|
58
|
+
type: 'page-entry',
|
|
59
|
+
environmentName,
|
|
60
|
+
pageId,
|
|
61
|
+
isExtractAssets,
|
|
62
|
+
};
|
|
76
63
|
}
|
|
77
64
|
return false;
|
|
78
65
|
}
|
|
66
|
+
function parseGlobalEntryEnvironmentName(id) {
|
|
67
|
+
if (id === virtualFileIdGlobalEntryServer)
|
|
68
|
+
return 'server';
|
|
69
|
+
if (id === virtualFileIdGlobalEntryClientSR || id === virtualFileIdGlobalEntryClientCR)
|
|
70
|
+
return 'client';
|
|
71
|
+
const environmentName = id.slice(virtualFileIdGlobalEntryPrefix.length);
|
|
72
|
+
assert(isEnvironmentNameValid(environmentName));
|
|
73
|
+
return environmentName;
|
|
74
|
+
}
|
|
79
75
|
function generateVirtualFileId(args) {
|
|
80
76
|
if (args.type === 'global-entry') {
|
|
81
|
-
const {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
else if (isClientRouting) {
|
|
86
|
-
return virtualFileIdGlobalEntryClientCR;
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
return virtualFileIdGlobalEntryClientSR;
|
|
77
|
+
const { environmentName, isClientRouting } = args;
|
|
78
|
+
assert(isEnvironmentNameValid(environmentName));
|
|
79
|
+
if (environmentName === 'client') {
|
|
80
|
+
return isClientRouting ? virtualFileIdGlobalEntryClientCR : virtualFileIdGlobalEntryClientSR;
|
|
90
81
|
}
|
|
82
|
+
assert(!isClientRouting);
|
|
83
|
+
if (environmentName === 'server')
|
|
84
|
+
return virtualFileIdGlobalEntryServer;
|
|
85
|
+
return `${virtualFileIdGlobalEntryPrefix}${environmentName}`;
|
|
91
86
|
}
|
|
92
87
|
if (args.type === 'page-entry') {
|
|
93
|
-
const { pageId,
|
|
88
|
+
const { pageId, environmentName } = args;
|
|
94
89
|
const pageIdSerialized = serializePageId(pageId);
|
|
95
|
-
|
|
96
|
-
return
|
|
90
|
+
assert(isEnvironmentNameValid(environmentName));
|
|
91
|
+
return `${virtualFileIdPageEntryPrefix}${environmentName}:${pageIdSerialized}`;
|
|
97
92
|
}
|
|
98
93
|
assert(false);
|
|
99
94
|
}
|
|
95
|
+
// The global entry of an additional environment (e.g. `rsc`)
|
|
96
|
+
function generateVirtualFileIdAdditionalEnvironment(environmentName) {
|
|
97
|
+
assert(!isEnvironmentBuiltIn(environmentName));
|
|
98
|
+
return generateVirtualFileId({ type: 'global-entry', environmentName });
|
|
99
|
+
}
|
|
100
100
|
// Workaround:
|
|
101
101
|
// - We replace virtual:vike:page-entry:client:/ with virtual:vike:page-entry:client:ROOT
|
|
102
102
|
// - In order to avoid Vite to replace `virtual:vike:page-entry:client:/` with `virtual:vike:page-entry:client:`
|
package/dist/types/Config.d.ts
CHANGED
|
@@ -211,7 +211,7 @@ type OnRenderHtmlAsync = (pageContext: PageContextServer) => Promise<OnRenderHtm
|
|
|
211
211
|
* - https://vike.dev/onRenderHtml
|
|
212
212
|
*/
|
|
213
213
|
type OnRenderHtmlSync = (pageContext: PageContextServer) => OnRenderHtmlReturn;
|
|
214
|
-
type OnRenderHtmlReturn = DocumentHtml | {
|
|
214
|
+
type OnRenderHtmlReturn = DocumentHtml | void | {
|
|
215
215
|
injectFilter?: (assets: InjectFilterEntry[]) => void;
|
|
216
216
|
documentHtml?: DocumentHtml;
|
|
217
217
|
pageContext?: OnRenderHtmlPageContextReturn | (() => Promise<OnRenderHtmlPageContextReturn> | OnRenderHtmlPageContextReturn);
|
|
@@ -540,9 +540,9 @@ type ConfigBuiltIn = {
|
|
|
540
540
|
*
|
|
541
541
|
* The middlewares defined via `+middleware` are so called "Universal Middleware" — they work with any JavaScript server (Hono, Express, Cloudflare, ...).
|
|
542
542
|
*
|
|
543
|
-
* https://
|
|
543
|
+
* https://vike.dev/middleware
|
|
544
544
|
*/
|
|
545
|
-
middleware?: EnhancedMiddleware | EnhancedMiddleware[];
|
|
545
|
+
middleware?: EnhancedMiddleware | EnhancedMiddleware[] | ImportStringList;
|
|
546
546
|
/**
|
|
547
547
|
* Set to `false` to disable Vike's automatic server integration mechanism (e.g. for integrating a JavaScript server manually via `renderPage()`).
|
|
548
548
|
*
|
|
@@ -551,6 +551,14 @@ type ConfigBuiltIn = {
|
|
|
551
551
|
* https://vike.dev/server
|
|
552
552
|
*/
|
|
553
553
|
server?: boolean | ImportStringList;
|
|
554
|
+
/**
|
|
555
|
+
* Control how your server starts.
|
|
556
|
+
*
|
|
557
|
+
* It's built into `dist/server/index.mjs` for production, and it's also run in development if you don't define `+server.js`.
|
|
558
|
+
*
|
|
559
|
+
* https://vike.dev/serverEntry
|
|
560
|
+
*/
|
|
561
|
+
serverEntry?: string | ImportStringList;
|
|
554
562
|
/**
|
|
555
563
|
* Set to `true` to create `.br` and `.gz` files for your static assets at build time, so that they don't have to be compressed on each request.
|
|
556
564
|
*
|
|
@@ -7,12 +7,12 @@ import type { GlobalContextClientInternalWithServerRouting } from '../client/run
|
|
|
7
7
|
import type { GlobalContextBasePublic } from '../shared-server-client/createGlobalContextShared.js';
|
|
8
8
|
import type { GlobalContextClientInternal } from '../client/runtime-client-routing/getGlobalContextClientInternal.js';
|
|
9
9
|
type GlobalContext = GlobalContextServer | GlobalContextClient;
|
|
10
|
-
type GlobalContextServer = Pick<GlobalContextServerInternal, 'assetsManifest' | 'config' | 'viteConfig' | 'viteConfigRuntime' | 'pages' | 'baseServer' | 'baseAssets' | 'isClientSide'> & {
|
|
10
|
+
type GlobalContextServer = Pick<GlobalContextServerInternal, 'assetsManifest' | 'config' | 'viteConfig' | 'viteConfigRuntime' | 'pages' | 'baseServer' | 'baseAssets' | 'middlewares' | 'isClientSide' | 'devMiddleware'> & {
|
|
11
11
|
/** https://vike.dev/warning/internals */
|
|
12
12
|
dangerouslyUseInternals: GlobalContextServerInternal;
|
|
13
13
|
} & Vike.GlobalContext & Vike.GlobalContextServer;
|
|
14
14
|
type GlobalContextClient = GlobalContextBasePublic & {
|
|
15
15
|
/** https://vike.dev/warning/internals */
|
|
16
16
|
dangerouslyUseInternals: GlobalContextClientInternal;
|
|
17
|
-
} & Pick<GlobalContextClientInternal, 'isClientSide'> & Vike.GlobalContext & Vike.GlobalContextClient & {};
|
|
18
|
-
type GlobalContextClientWithServerRouting = GlobalContextBasePublic & Pick<GlobalContextClientInternalWithServerRouting, 'isClientSide'> & Vike.GlobalContext & Vike.GlobalContextClient & {};
|
|
17
|
+
} & Pick<GlobalContextClientInternal, 'isClientSide' | 'devMiddleware'> & Vike.GlobalContext & Vike.GlobalContextClient & {};
|
|
18
|
+
type GlobalContextClientWithServerRouting = GlobalContextBasePublic & Pick<GlobalContextClientInternalWithServerRouting, 'isClientSide' | 'devMiddleware'> & Vike.GlobalContext & Vike.GlobalContextClient & {};
|
|
@@ -78,19 +78,27 @@ type VirtualFileExportsPageEntry = {
|
|
|
78
78
|
*
|
|
79
79
|
* https://vike.dev/meta
|
|
80
80
|
*/
|
|
81
|
-
type ConfigEnv =
|
|
81
|
+
type ConfigEnv = {
|
|
82
82
|
/** Load value on the client-side */
|
|
83
83
|
client?: boolean;
|
|
84
|
-
} | {
|
|
85
|
-
/** @experimental */
|
|
86
|
-
client?: 'if-client-routing';
|
|
87
|
-
}) & {
|
|
88
84
|
/** Load value on the server-side */
|
|
89
85
|
server?: boolean;
|
|
90
86
|
/** Load value for config files */
|
|
91
87
|
config?: boolean;
|
|
92
88
|
/** Load value only in production (`true`), or only in development (`false`), or always (`undefined`). */
|
|
93
89
|
production?: boolean;
|
|
90
|
+
/** Load value on the client-side only if the page uses Client Routing
|
|
91
|
+
*
|
|
92
|
+
* @experimental
|
|
93
|
+
*/
|
|
94
|
+
clientRoutingOnly?: boolean;
|
|
95
|
+
/** Load value in an additional Vike environment, e.g. `rsc`
|
|
96
|
+
*
|
|
97
|
+
* @experimental
|
|
98
|
+
*
|
|
99
|
+
* https://vike.dev/meta#vike-environments
|
|
100
|
+
*/
|
|
101
|
+
[environmentName: string]: boolean | undefined;
|
|
94
102
|
};
|
|
95
103
|
type ConfigValueSources = Record<string, // configName
|
|
96
104
|
ConfigValueSource[]>;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
1
|
export type { PageContext };
|
|
3
2
|
export type { PageContextServer };
|
|
4
3
|
export type { PageContextClient };
|
|
@@ -8,7 +7,6 @@ export type { PageContextInternalServer };
|
|
|
8
7
|
export type { PageContextInternalClient };
|
|
9
8
|
export type { PageContextInternalClient_ServerRouting };
|
|
10
9
|
export type { PageContextInternalClient_ClientRouting };
|
|
11
|
-
export type { PageContextInitInternal };
|
|
12
10
|
export type { PageContextInit };
|
|
13
11
|
export type { PageContextBuiltInServer_deprecated as PageContextBuiltInServer };
|
|
14
12
|
export type { PageContextBuiltInClientWithClientRouting_deprecated as PageContextBuiltInClientWithClientRouting };
|
|
@@ -27,11 +25,19 @@ import type { PageContextPublicProxyClient } from '../client/runtime-client-rout
|
|
|
27
25
|
type PageContextServer<Data = unknown> = PageContextBuiltInServer<Data> & {
|
|
28
26
|
/** https://vike.dev/warning/internals */
|
|
29
27
|
dangerouslyUseInternals: DangerouslyUseInternals<PageContextInternalServer & PageContextAfterRender & PageContextPublicServer>;
|
|
30
|
-
} & Vike.PageContext & Vike.PageContextServer & (Vike.Server extends {
|
|
28
|
+
} & Vike.PageContext & Vike.PageContextServer & PageContextContent & (Vike.Server extends {
|
|
31
29
|
server: string;
|
|
32
30
|
} ? {
|
|
33
31
|
runtime: RuntimeAdapterTarget<Vike.Server['server']>;
|
|
34
32
|
} & PageContextReqResAlias<Vike.Server['server']> : {});
|
|
33
|
+
type PageContextContent = {
|
|
34
|
+
/**
|
|
35
|
+
* The content of a non-HTML page — the HTTP response body (SSR) or the file content (pre-rendering).
|
|
36
|
+
*
|
|
37
|
+
* https://vike.dev/pageContext#content
|
|
38
|
+
*/
|
|
39
|
+
content?: string | Uint8Array | ReadableStream<Uint8Array>;
|
|
40
|
+
};
|
|
35
41
|
type PageContextReqResAlias<Server extends string> = ReqResAlias<'req', RuntimeAdapterTarget<Server>> & ReqResAlias<'res', RuntimeAdapterTarget<Server>>;
|
|
36
42
|
type ReqResAlias<Key extends 'req' | 'res', Runtime> = Key extends keyof (Vike.PageContext & Vike.PageContextServer) ? unknown : Key extends keyof Runtime ? Record<Key, Runtime[Key]> : unknown;
|
|
37
43
|
type PageContext<Data = unknown> = PageContextClient<Data> | PageContextServer<Data>;
|
|
@@ -141,13 +147,6 @@ type PageContextInit = {
|
|
|
141
147
|
headersOriginal?: unknown;
|
|
142
148
|
/** @deprecated Set `pageContextInit.urlOriginal` instead */ url?: string;
|
|
143
149
|
};
|
|
144
|
-
type PageContextInitInternal = PageContextInit & {
|
|
145
|
-
_nodeDev?: {
|
|
146
|
-
req: IncomingMessage;
|
|
147
|
-
res: ServerResponse;
|
|
148
|
-
};
|
|
149
|
-
_reqWeb?: Request;
|
|
150
|
-
};
|
|
151
150
|
type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageContextInit & PageContextUrlServer & {
|
|
152
151
|
/**
|
|
153
152
|
* The HTTP request headers.
|
|
@@ -194,6 +193,15 @@ type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageConte
|
|
|
194
193
|
* https://vike.dev/pageContext#pageContextsAborted
|
|
195
194
|
*/
|
|
196
195
|
pageContextsAborted: Partial<PageContextServer<Data>>[];
|
|
196
|
+
/**
|
|
197
|
+
* @experimental
|
|
198
|
+
*
|
|
199
|
+
* https://vike.dev/meta#vike-environments
|
|
200
|
+
*/
|
|
201
|
+
environments?: Record<string, {
|
|
202
|
+
config: PageContextConfig['config'];
|
|
203
|
+
pageContext: PageContextServer<Data>;
|
|
204
|
+
}>;
|
|
197
205
|
isHydration?: undefined;
|
|
198
206
|
isBackwardNavigation?: undefined;
|
|
199
207
|
isHistoryNavigation?: undefined;
|
package/dist/types/Server.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { Fetchable, ServerOptions } from '@universal-deploy/store';
|
|
|
5
5
|
*
|
|
6
6
|
* https://vike.dev/server
|
|
7
7
|
*/
|
|
8
|
-
interface Server extends Fetchable {
|
|
8
|
+
interface Server extends Partial<Fetchable> {
|
|
9
9
|
prod?: Omit<ServerOptions, 'fetch'> & {
|
|
10
10
|
static?: boolean | string;
|
|
11
11
|
};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference path="../../vike-server.d.ts" preserve="true" />
|
|
1
2
|
export type { PageContext, PageContextServer, PageContextClient, PageContextWithServerRouting, PageContextClientWithServerRouting, } from './PageContext.js';
|
|
2
3
|
export type { GlobalContext, GlobalContextServer, GlobalContextClient, GlobalContextClientWithServerRouting, } from './GlobalContext.js';
|
|
3
4
|
export type { PrerenderContextPublic as PrerenderContext } from '../node/prerender/runPrerender.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const PROJECT_VERSION: '0.4.
|
|
1
|
+
export declare const PROJECT_VERSION: '0.4.268-commit-ca58695';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Automatically updated by @brillout/release-me
|
|
2
|
-
export const PROJECT_VERSION = '0.4.
|
|
2
|
+
export const PROJECT_VERSION = '0.4.268-commit-ca58695';
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
export { assertViteVersion };
|
|
2
|
-
|
|
2
|
+
import { assertUsage } from './assert.js';
|
|
3
3
|
import { assertVersion } from './assertVersion.js';
|
|
4
|
-
const viteVersionMin = '
|
|
5
|
-
// package.json#peerDependencies isn't enough, as users often ignore it
|
|
4
|
+
const viteVersionMin = '7.1.0';
|
|
5
|
+
// - package.json#peerDependencies isn't enough, as users often ignore it
|
|
6
|
+
// - `import { version } from 'vite'` isn't reliable: the user may still use an older Vite version — see https://github.com/vitejs/vite/pull/19355
|
|
6
7
|
function assertViteVersion(viteVersion) {
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
// - this.meta.viteVersion was released in vite@7.0.0 => let's use it only after Vike requires a Vite version above 7.0.0
|
|
10
|
-
// - https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#700-2025-06-24
|
|
11
|
-
// - https://github.com/vitejs/vite/pull/20088
|
|
12
|
-
// - We can then remove the assertUsage() at isViteServerSide.ts — see viteVersionMin export usage
|
|
8
|
+
// `viteVersion` is `undefined` on Vite 6 and older (their `config` hook has no `this`); assertVersion() needs a string
|
|
9
|
+
assertUsage(viteVersion, `You're using an old Vite version — update Vite to ${viteVersionMin} or above.`);
|
|
13
10
|
assertVersion('Vite', viteVersion, [viteVersionMin]);
|
|
14
11
|
}
|
|
@@ -1,20 +1,40 @@
|
|
|
1
1
|
export { catchInfiniteLoop };
|
|
2
|
-
import { assertUsage, assertWarning } from './assert.js';
|
|
2
|
+
import { assert, assertUsage, assertWarning } from './assert.js';
|
|
3
3
|
import { humanizeTime } from './humanizeTime.js';
|
|
4
|
-
const trackers =
|
|
4
|
+
const trackers = new Map();
|
|
5
|
+
let lastCleanup;
|
|
6
|
+
// Given these parameters, a warning is shown upon 10 calls a second on average during 5 seconds
|
|
5
7
|
const maxCalls = 99;
|
|
6
8
|
const time = 5 * 1000;
|
|
7
9
|
function catchInfiniteLoop(functionName) {
|
|
8
10
|
// Init
|
|
9
11
|
const now = new Date().getTime();
|
|
10
|
-
//
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
// Cleanup
|
|
13
|
+
if (globalThis.__VIKE__IS_CLIENT) {
|
|
14
|
+
// No cleanup on the client-side, in order to minimize client-side JavaScript (to save client-side KBs)
|
|
15
|
+
assert(trackers.size < 5);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
// Clean outdated trackers
|
|
19
|
+
// - On the server-side, there is an infinite amount of outdated trackers (a new tracker is created per HTTP request) => we should clean them
|
|
20
|
+
// - We don't clean upon every call: the server creates a new tracker per HTTP request, so that would cost O(n^2) — O(number of requests within `time`) per request
|
|
21
|
+
// - https://github.com/vikejs/vike/pull/3576
|
|
22
|
+
const cleanInterval = 10 * 1000;
|
|
23
|
+
lastCleanup ?? (lastCleanup = now);
|
|
24
|
+
if (now - lastCleanup > cleanInterval) {
|
|
25
|
+
trackers.forEach((tracker, key) => {
|
|
26
|
+
if (isOutdated(tracker, now))
|
|
27
|
+
trackers.delete(key);
|
|
28
|
+
});
|
|
29
|
+
lastCleanup = now;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Get/reset tracker
|
|
33
|
+
let tracker = trackers.get(functionName);
|
|
34
|
+
if (!tracker || isOutdated(tracker, now)) {
|
|
35
|
+
tracker = { count: 0, startTime: now };
|
|
36
|
+
trackers.set(functionName, tracker);
|
|
37
|
+
}
|
|
18
38
|
// Count
|
|
19
39
|
tracker.count++;
|
|
20
40
|
// Error
|
|
@@ -24,8 +44,10 @@ function catchInfiniteLoop(functionName) {
|
|
|
24
44
|
}
|
|
25
45
|
// Warning, at 50% threshold
|
|
26
46
|
if (!tracker.warned && tracker.count > maxCalls * 0.5) {
|
|
27
|
-
// Warning is shown upon 10 calls a second, on average during 5 seconds, given the default parameters
|
|
28
47
|
assertWarning(false, msg, { onlyOnce: false, showStackTrace: true });
|
|
29
48
|
tracker.warned = true;
|
|
30
49
|
}
|
|
31
50
|
}
|
|
51
|
+
function isOutdated(tracker, now) {
|
|
52
|
+
return now - tracker.startTime > time;
|
|
53
|
+
}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { deepEqual };
|
|
2
|
+
declare function deepEqual(x: any, y: any): boolean;
|
package/dist/utils/deepEqual.js
CHANGED
|
@@ -1,7 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
export { deepEqual };
|
|
2
|
+
import { assertIsNotBrowser } from './assertIsNotBrowser.js';
|
|
3
|
+
// If client-side needs it then use a more minimal version to save client-side KBs:
|
|
4
|
+
// https://github.com/vikejs/vike/blob/165d572a5994ccd0e56e43fe2993b1cef117ee7f/packages/vike/src/utils/deepEqual.ts
|
|
5
|
+
assertIsNotBrowser();
|
|
6
|
+
function deepEqual(x, y) {
|
|
7
|
+
return deepEqualCyclic(x, y, new Map());
|
|
8
|
+
}
|
|
9
|
+
// Supports cyclic objects, e.g. Vite plugins
|
|
10
|
+
function deepEqualCyclic(x, y, seen) {
|
|
11
|
+
if (x === y)
|
|
12
|
+
return true;
|
|
13
|
+
if (!x || !y || typeof x !== 'object' || typeof y !== 'object')
|
|
14
|
+
return false;
|
|
15
|
+
// A pair seen before is either being compared higher up (a cycle) or already found equal
|
|
16
|
+
const seenY = seen.get(x) ?? new Set();
|
|
17
|
+
if (seenY.has(y))
|
|
18
|
+
return true;
|
|
19
|
+
seen.set(x, seenY.add(y));
|
|
20
|
+
const keys = Object.keys(x);
|
|
21
|
+
return keys.length === Object.keys(y).length && keys.every((key) => deepEqualCyclic(x[key], y[key], seen));
|
|
7
22
|
}
|