vike 0.4.267 → 0.4.268
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 +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 +1 -1
- package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +4 -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 +1 -0
- package/dist/server/__internal/index.js +2 -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 +31 -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 +10 -2
- 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/package.json +35 -26
- 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,5 @@
|
|
|
1
1
|
export { renderPageServer };
|
|
2
|
+
export { renderPageServer_userLand };
|
|
2
3
|
export { getRequestTag };
|
|
3
4
|
import { renderPageServerAfterRoute } from './renderPageServer/renderPageServerAfterRoute.js';
|
|
4
5
|
import { createPageContextServer, createPageContextServerWithoutGlobalContext, } from './renderPageServer/createPageContextServer.js';
|
|
@@ -17,12 +18,13 @@ import { updateType } from '../../utils/updateType.js';
|
|
|
17
18
|
import { getPageContextAddendumAbort, isAbortError, logAbort, addNewPageContextAborted, } from '../../shared-server-client/route/abort.js';
|
|
18
19
|
import { getGlobalContextServerInternal, initGlobalContext_renderPage, } from './globalContext.js';
|
|
19
20
|
import { handlePageContextRequestUrl } from './renderPageServer/handlePageContextRequestUrl.js';
|
|
20
|
-
import {
|
|
21
|
+
import { getPageContextPublicServer } from './renderPageServer/getPageContextPublicServer.js';
|
|
22
|
+
import { createHttpResponse404, createHttpResponseRedirect, createHttpResponsePageJson, createHttpResponseErrorFallback, createHttpResponseErrorFallback_noGlobalContext, createHttpResponseBaseIsMissing, } from './renderPageServer/createHttpResponse.js';
|
|
21
23
|
import { logRuntimeError, logRuntimeInfo } from './loggerRuntime.js';
|
|
22
24
|
import { assertArguments } from './renderPageServer/assertArguments.js';
|
|
23
25
|
import { log404 } from './renderPageServer/log404/index.js';
|
|
24
26
|
import pc from '@brillout/picocolors';
|
|
25
|
-
import { getPageContextClientSerializedAbort
|
|
27
|
+
import { getPageContextClientSerializedAbort } from './renderPageServer/html/serializeContext.js';
|
|
26
28
|
import { getErrorPageId } from '../../shared-server-client/error-page.js';
|
|
27
29
|
import { handleErrorWithoutErrorPage } from './renderPageServer/handleErrorWithoutErrorPage.js';
|
|
28
30
|
import { loadPageConfigsLazyServerSide, } from './renderPageServer/loadPageConfigsLazyServerSide.js';
|
|
@@ -30,15 +32,19 @@ import { resolveRedirects } from './renderPageServer/resolveRedirects.js';
|
|
|
30
32
|
import { getVikeConfigError } from '../../shared-server-node/getVikeConfigError.js';
|
|
31
33
|
import { forkPageContext } from '../../shared-server-client/forkPageContext.js';
|
|
32
34
|
import { getAsyncLocalStorage } from './asyncHook.js';
|
|
35
|
+
import { getPageContextJson } from './renderPageServer/getPageContextJson.js';
|
|
36
|
+
import { hasPlusMiddlewares } from './universal-middleware/core.js';
|
|
33
37
|
import '../assertEnvServer.js';
|
|
34
|
-
import { enhance, apply, universalSymbol, UniversalRouter, getAdapterRuntime, } from '@universal-middleware/core';
|
|
35
|
-
import { createRequestAdapter } from '@universal-middleware/node/request';
|
|
36
38
|
const globalObject = getGlobalObject('runtime/renderPageServer.ts', {
|
|
37
39
|
httpRequestsCount: 0,
|
|
38
40
|
});
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
+
// The user's renderPage()
|
|
42
|
+
function renderPageServer_userLand(pageContextInit) {
|
|
41
43
|
assertArguments(...arguments);
|
|
44
|
+
return renderPageServer(pageContextInit, true);
|
|
45
|
+
}
|
|
46
|
+
// `renderPageServer()` calls `renderPageServerNominal()` while ensuring that errors are `console.error(err)` instead of `throw err`, so that Vike never triggers a server shut down. (Throwing an error in an Express.js middleware shuts down the whole Express.js server.)
|
|
47
|
+
async function renderPageServer(pageContextInit, isCalledDirectlyByUser) {
|
|
42
48
|
assert(hasProp(pageContextInit, 'urlOriginal', 'string')); // assertUsage() already implemented at assertArguments()
|
|
43
49
|
assertIsUrl(pageContextInit.urlOriginal);
|
|
44
50
|
onSetupRuntime();
|
|
@@ -50,14 +56,19 @@ async function renderPageServer(pageContextInit) {
|
|
|
50
56
|
logHttpRequest(urlOriginalPretty, pageContextInit, requestId);
|
|
51
57
|
const asyncLocalStorage = await getAsyncLocalStorage();
|
|
52
58
|
const asyncStore = !asyncLocalStorage ? null : { requestId };
|
|
53
|
-
const render = async () => await
|
|
59
|
+
const render = async () => await renderPageServerEntryOnce(pageContextInit, isCalledDirectlyByUser, requestId, asyncStore);
|
|
54
60
|
const pageContextFinish = !asyncLocalStorage ? await render() : await asyncLocalStorage.run(asyncStore, render);
|
|
55
61
|
logHttpResponse(urlOriginalPretty, pageContextFinish);
|
|
56
62
|
checkType(pageContextFinish);
|
|
57
63
|
assertPageContextFinish(pageContextFinish);
|
|
58
|
-
return pageContextFinish;
|
|
64
|
+
return getPageContextReturn(pageContextFinish);
|
|
59
65
|
}
|
|
60
|
-
|
|
66
|
+
function getPageContextReturn(pageContextFinish) {
|
|
67
|
+
if (!hasProp(pageContextFinish, '_globalContext', 'object'))
|
|
68
|
+
return pageContextFinish;
|
|
69
|
+
return getPageContextPublicServer(pageContextFinish);
|
|
70
|
+
}
|
|
71
|
+
async function renderPageServerEntryOnce(pageContextInit, isCalledDirectlyByUser, requestId, asyncStore) {
|
|
61
72
|
// Invalid config
|
|
62
73
|
{
|
|
63
74
|
const vikeConfigError = getVikeConfigError();
|
|
@@ -92,17 +103,8 @@ async function renderPageServerEntryOnceBegin(pageContextInit, requestId, asyncS
|
|
|
92
103
|
}
|
|
93
104
|
}
|
|
94
105
|
const { globalContext } = await getGlobalContextServerInternal();
|
|
106
|
+
assertUsage(!isCalledDirectlyByUser || !hasPlusMiddlewares(globalContext), `renderPage() doesn't run +middleware — see ${pc.underline('https://vike.dev/error/setup-middlewares')}`);
|
|
95
107
|
const pageContextBegin = getPageContextBegin(pageContextInit, globalContext, requestId, asyncStore);
|
|
96
|
-
const middlewares = (globalContext.config.middleware ?? []).flat();
|
|
97
|
-
const renderPageServerEntry = () => renderPageServerEntryOnce(pageContextBegin, globalContext, requestId);
|
|
98
|
-
if (middlewares.length === 0) {
|
|
99
|
-
return renderPageServerEntry();
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
return renderPageServerEntryWithMiddlewares(pageContextBegin, renderPageServerEntry, middlewares);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
async function renderPageServerEntryOnce(pageContextBegin, globalContext, requestId) {
|
|
106
108
|
// Check Base URL
|
|
107
109
|
{
|
|
108
110
|
const pageContextHttpResponse = await checkBaseUrl(pageContextBegin, globalContext);
|
|
@@ -125,6 +127,7 @@ async function renderPageServerEntryOnce(pageContextBegin, globalContext, reques
|
|
|
125
127
|
return await renderPageServerEntryRecursive(pageContextBegin, globalContext, requestId);
|
|
126
128
|
}
|
|
127
129
|
async function renderPageServerEntryRecursive(pageContextBegin, globalContext, requestId) {
|
|
130
|
+
assert(requestId);
|
|
128
131
|
catchInfiniteLoop(`[${getRequestTag(requestId)}] renderPageServerEntryRecursive()`);
|
|
129
132
|
const pageContextNominalPageBegin = fork(pageContextBegin);
|
|
130
133
|
const pageContextAddendumAbort = getPageContextAddendumAbort(pageContextBegin.pageContextsAborted);
|
|
@@ -217,7 +220,9 @@ async function renderPageServerEntryRecursive_onError(err, pageContextBegin, pag
|
|
|
217
220
|
catch (errErrorPage) {
|
|
218
221
|
// Handle `throw redirect()` and `throw render()` while rendering error page
|
|
219
222
|
if (isAbortError(errErrorPage)) {
|
|
220
|
-
const handled = await handleAbort(errErrorPage, pageContextBegin,
|
|
223
|
+
const handled = await handleAbort(errErrorPage, pageContextBegin,
|
|
224
|
+
// The error page is the page that aborted
|
|
225
|
+
pageContextErrorPageInit, requestId, pageContextErrorPageInit, globalContext);
|
|
221
226
|
if (handled.pageContextReturn) {
|
|
222
227
|
// - throw redirect()
|
|
223
228
|
// - throw render(url)
|
|
@@ -239,42 +244,6 @@ async function renderPageServerEntryRecursive_onError(err, pageContextBegin, pag
|
|
|
239
244
|
}
|
|
240
245
|
return pageContextErrorPage;
|
|
241
246
|
}
|
|
242
|
-
const requestAdapter = createRequestAdapter();
|
|
243
|
-
async function renderPageServerEntryWithMiddlewares(pageContext, renderPageServerEntry, middlewares) {
|
|
244
|
-
const router = new UniversalRouter(true, false);
|
|
245
|
-
let httpResponseVikeCore = undefined;
|
|
246
|
-
// Wrap rendering into universal-middleware routing
|
|
247
|
-
apply(router, [
|
|
248
|
-
enhance(async function adaptRenderPageServerEntryOnceInternal() {
|
|
249
|
-
const pageContextHttpResponse = await renderPageServerEntry();
|
|
250
|
-
const { httpResponse } = pageContextHttpResponse;
|
|
251
|
-
pageContext = pageContextHttpResponse;
|
|
252
|
-
httpResponseVikeCore = httpResponse;
|
|
253
|
-
const readable = httpResponse.getReadableWebStream();
|
|
254
|
-
return new Response(readable, {
|
|
255
|
-
status: httpResponse.statusCode,
|
|
256
|
-
headers: httpResponse.headers,
|
|
257
|
-
});
|
|
258
|
-
}, {
|
|
259
|
-
name: 'vike',
|
|
260
|
-
method: ['GET', 'POST', 'PUT', 'PATCH', 'HEAD', 'OPTIONS'],
|
|
261
|
-
path: '/**', // rou3 format
|
|
262
|
-
immutable: true, // avoids cloning the function we just created
|
|
263
|
-
}),
|
|
264
|
-
...middlewares,
|
|
265
|
-
]);
|
|
266
|
-
const handler = router[universalSymbol];
|
|
267
|
-
const request = pageContext._reqWeb ??
|
|
268
|
-
(pageContext._nodeDev
|
|
269
|
-
? requestAdapter(pageContext._nodeDev.req, pageContext._nodeDev.res)
|
|
270
|
-
: new Request(new URL(pageContext.urlOriginal, 'http://localhost').toString(), {
|
|
271
|
-
headers: pageContext.headers ?? {},
|
|
272
|
-
}));
|
|
273
|
-
const res = await handler(request, {}, getAdapterRuntime('other', { params: undefined }));
|
|
274
|
-
const httpResponse = createHttpResponseFromUniversalMiddleware(res, httpResponseVikeCore?.earlyHints);
|
|
275
|
-
objectAssign(pageContext, { httpResponse });
|
|
276
|
-
return pageContext;
|
|
277
|
-
}
|
|
278
247
|
function logHttpRequest(urlOriginal, pageContextInit, requestId) {
|
|
279
248
|
const pageContext = createPageContextServerWithoutGlobalContext(pageContextInit, requestId);
|
|
280
249
|
logRuntimeInfo?.(getRequestInfoMessage(urlOriginal), pageContext, 'info');
|
|
@@ -453,7 +422,7 @@ async function getPermanentRedirect(pageContextBegin, globalContext) {
|
|
|
453
422
|
if (normalize(urlTarget) === normalize(urlWithoutBase))
|
|
454
423
|
return null;
|
|
455
424
|
if (!originChanged)
|
|
456
|
-
urlTarget =
|
|
425
|
+
urlTarget = modifyUrlPathname(urlTarget, (urlPathname) => prependBase(urlPathname, globalContext.baseServer));
|
|
457
426
|
assert(urlTarget !== pageContext.urlOriginal);
|
|
458
427
|
}
|
|
459
428
|
logRuntimeInfo?.(`Permanent redirection defined by config.redirects (https://vike.dev/redirects)`, pageContext, 'info');
|
|
@@ -470,14 +439,14 @@ pageContextNominalPageBegin, requestId, pageContextErrorPageInit, globalContext)
|
|
|
470
439
|
logAbort(errAbort, globalContext._isProduction, pageContextNominalPageBegin);
|
|
471
440
|
const pageContextAbort = errAbort._pageContextAbort;
|
|
472
441
|
assert(pageContextAbort);
|
|
473
|
-
addNewPageContextAborted(pageContextBegin.pageContextsAborted, pageContextNominalPageBegin, pageContextAbort);
|
|
442
|
+
addNewPageContextAborted(pageContextBegin.pageContextsAborted, pageContextNominalPageBegin, pageContextAbort, getPageContextPublicServer);
|
|
474
443
|
const pageContext = fork(pageContextBegin);
|
|
475
444
|
const pageContextAddendumAbort = getPageContextAddendumAbort(pageContextBegin.pageContextsAborted);
|
|
476
445
|
objectAssign(pageContext, pageContextAddendumAbort);
|
|
477
446
|
assert(pageContextAddendumAbort === pageContextAbort);
|
|
478
447
|
// Client-side navigation — [`pageContext.json` request](https://vike.dev/pageContext.json)
|
|
479
448
|
if (pageContextBegin.isClientSideNavigation) {
|
|
480
|
-
let
|
|
449
|
+
let pageContextJson;
|
|
481
450
|
if (pageContextAbort.abortStatusCode) {
|
|
482
451
|
const errorPageId = getErrorPageId(globalContext._pageFilesAll, globalContext._pageConfigs);
|
|
483
452
|
const abortCall = pageContextAbort._abortCall;
|
|
@@ -487,12 +456,12 @@ pageContextNominalPageBegin, requestId, pageContextErrorPageInit, globalContext)
|
|
|
487
456
|
objectAssign(pageContext, pageContextErrorPageInit, true);
|
|
488
457
|
updateType(pageContext, await loadPageConfigsLazyServerSide(pageContext));
|
|
489
458
|
// We include pageContextInit: we don't only serialize pageContextAbort because the error page may need to access pageContextInit
|
|
490
|
-
|
|
459
|
+
pageContextJson = getPageContextJson(pageContext);
|
|
491
460
|
}
|
|
492
461
|
else {
|
|
493
|
-
|
|
462
|
+
pageContextJson = getPageContextClientSerializedAbort(pageContextAbort, false);
|
|
494
463
|
}
|
|
495
|
-
const httpResponse = await createHttpResponsePageJson(
|
|
464
|
+
const httpResponse = await createHttpResponsePageJson(pageContextJson, pageContext);
|
|
496
465
|
objectAssign(pageContext, { httpResponse });
|
|
497
466
|
return { pageContextReturn: pageContext };
|
|
498
467
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { getMiddlewares_globalContext };
|
|
2
|
+
export { getMiddlewares_withErrorHandling };
|
|
3
|
+
export { hasPlusMiddlewares };
|
|
4
|
+
export { routeCatchAll };
|
|
5
|
+
export { mergeContext };
|
|
6
|
+
export type { Middleware };
|
|
7
|
+
import { type EnhancedMiddleware, type UniversalMiddleware } from '@universal-middleware/core';
|
|
8
|
+
import type { ConfigResolved } from '../../../types/Config/ConfigResolved.js';
|
|
9
|
+
import '../../assertEnvServer.js';
|
|
10
|
+
type Middleware = EnhancedMiddleware & {
|
|
11
|
+
isHandler: boolean;
|
|
12
|
+
};
|
|
13
|
+
declare const routeCatchAll: {
|
|
14
|
+
readonly name: 'vike';
|
|
15
|
+
readonly method: ["GET", "POST", "PUT", "PATCH", "HEAD", "OPTIONS"];
|
|
16
|
+
readonly path: '/**';
|
|
17
|
+
};
|
|
18
|
+
declare function getMiddlewares_globalContext(globalContext: {
|
|
19
|
+
config: ConfigResolved;
|
|
20
|
+
}, baseServer: string): Middleware[];
|
|
21
|
+
declare function getMiddlewares_withErrorHandling(): Promise<Middleware[]>;
|
|
22
|
+
declare function hasPlusMiddlewares(globalContext: {
|
|
23
|
+
config: ConfigResolved;
|
|
24
|
+
}): boolean;
|
|
25
|
+
declare function mergeContext(middleware: EnhancedMiddleware): UniversalMiddleware;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
export { getMiddlewares_globalContext };
|
|
2
|
+
export { getMiddlewares_withErrorHandling };
|
|
3
|
+
export { hasPlusMiddlewares };
|
|
4
|
+
export { routeCatchAll };
|
|
5
|
+
export { mergeContext };
|
|
6
|
+
import { createMatcher, enhance, getUniversal, getUniversalProp, isHandler, methodSymbol, orderSymbol, pathSymbol, nameSymbol, runsSymbol, } from '@universal-middleware/core';
|
|
7
|
+
import { parseUrl } from '../../../utils/parseUrl.js';
|
|
8
|
+
import { prependBase } from '../../../utils/parseUrl-extras.js';
|
|
9
|
+
import { handlePageContextRequestUrl } from '../renderPageServer/handlePageContextRequestUrl.js';
|
|
10
|
+
import { renderPageServer } from '../renderPageServer.js';
|
|
11
|
+
import { getGlobalContextServerInternal, initGlobalContext_renderPage } from '../globalContext.js';
|
|
12
|
+
import { getVikeConfigError } from '../../../shared-server-node/getVikeConfigError.js';
|
|
13
|
+
import { assertWarning } from '../../../utils/assert.js';
|
|
14
|
+
import pc from '@brillout/picocolors';
|
|
15
|
+
import '../../assertEnvServer.js';
|
|
16
|
+
const routeCatchAll = {
|
|
17
|
+
name: 'vike',
|
|
18
|
+
method: ['GET', 'POST', 'PUT', 'PATCH', 'HEAD', 'OPTIONS'],
|
|
19
|
+
path: '/**',
|
|
20
|
+
};
|
|
21
|
+
// Vike's pages
|
|
22
|
+
const renderPageServer_universalMiddleware = enhance(renderPageServer_universal, routeCatchAll);
|
|
23
|
+
// globalContext.middlewares — every +middleware and Vike's handler that renders pages
|
|
24
|
+
function getMiddlewares_globalContext(globalContext, baseServer) {
|
|
25
|
+
return [
|
|
26
|
+
...getMiddlewares_config(globalContext).map((plusMiddleware) => wrapWithVikeNormalizedURL(plusMiddleware, baseServer)),
|
|
27
|
+
renderPageServer_universalMiddleware,
|
|
28
|
+
].map(withIsHandler);
|
|
29
|
+
}
|
|
30
|
+
// Returns globalContext.middlewares, or middlewares_errorHandling upon an invalid config
|
|
31
|
+
async function getMiddlewares_withErrorHandling() {
|
|
32
|
+
if (getVikeConfigError())
|
|
33
|
+
return middlewares_errorHandling;
|
|
34
|
+
try {
|
|
35
|
+
await initGlobalContext_renderPage();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return middlewares_errorHandling;
|
|
39
|
+
}
|
|
40
|
+
if (getVikeConfigError())
|
|
41
|
+
return middlewares_errorHandling;
|
|
42
|
+
const { globalContext } = await getGlobalContextServerInternal();
|
|
43
|
+
return globalContext.middlewares;
|
|
44
|
+
}
|
|
45
|
+
// Upon an invalid config: let renderPageServer() answer every request with the error (`+middleware` isn't defined upon config error)
|
|
46
|
+
const middlewares_errorHandling = [enhance(renderPageServer_universal, { name: 'vike:error-handling' })].map(withIsHandler);
|
|
47
|
+
async function renderPageServer_universal(request, context, runtime) {
|
|
48
|
+
const pageContextInit = {
|
|
49
|
+
urlOriginal: request.url, // Let `context` override it, e.g. `$ vike dev` passes the URL's path
|
|
50
|
+
headersOriginal: request.headers,
|
|
51
|
+
req: 'req' in runtime ? runtime.req : null,
|
|
52
|
+
res: 'res' in runtime ? runtime.res : null,
|
|
53
|
+
runtime,
|
|
54
|
+
...context,
|
|
55
|
+
};
|
|
56
|
+
addUserAgent_deprecated(pageContextInit, request, runtime);
|
|
57
|
+
const pageContext = await renderPageServer(pageContextInit, false);
|
|
58
|
+
const { httpResponse } = pageContext;
|
|
59
|
+
return new Response(httpResponse.getReadableWebStream(), {
|
|
60
|
+
status: httpResponse.statusCode,
|
|
61
|
+
headers: httpResponse.headers,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// List of +middleware
|
|
65
|
+
function getMiddlewares_config(globalContext) {
|
|
66
|
+
return (globalContext.config.middleware ?? []).flat();
|
|
67
|
+
}
|
|
68
|
+
// Does a +middleware exist?
|
|
69
|
+
function hasPlusMiddlewares(globalContext) {
|
|
70
|
+
return getMiddlewares_config(globalContext).length > 0;
|
|
71
|
+
}
|
|
72
|
+
// Handle:
|
|
73
|
+
// - Base URL
|
|
74
|
+
// - JSON URL `.pageContext.json`
|
|
75
|
+
function wrapWithVikeNormalizedURL(plusMiddleware, baseServer) {
|
|
76
|
+
const { path, method, ...options } = getOptions(plusMiddleware);
|
|
77
|
+
if (path)
|
|
78
|
+
assertPath(options.name, path, baseServer);
|
|
79
|
+
if (isHandler(plusMiddleware)) {
|
|
80
|
+
// A handler is a route of the server, which matches it: its path gets the Base URL. (`enhance()` clones it, so that marking it `isHandler` leaves the extension's export untouched.)
|
|
81
|
+
return enhance(plusMiddleware, path ? { path: prependBase(path.startsWith('/') ? path : `/${path}`, baseServer) } : {});
|
|
82
|
+
}
|
|
83
|
+
const isMatch = path && createMatcher(path, method);
|
|
84
|
+
const plusMiddlewareMerged = mergeContext(plusMiddleware);
|
|
85
|
+
return enhance(async (request, context, runtime) => {
|
|
86
|
+
const { isPageContextJsonRequest, urlWithoutPageContextRequestSuffix } = handlePageContextRequestUrl(request.url);
|
|
87
|
+
if (isMatch) {
|
|
88
|
+
const { href, isBaseMissing } = parseUrl(urlWithoutPageContextRequestSuffix, baseServer);
|
|
89
|
+
if (isBaseMissing || !isMatch(new Request(href, { method: request.method })))
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const answer = await getUniversal(plusMiddlewareMerged)(request, context, runtime);
|
|
93
|
+
return isPageContextJsonRequest ? toPageContextJsonAnswer(answer) : answer;
|
|
94
|
+
}, {
|
|
95
|
+
...options,
|
|
96
|
+
// Whatever its order, it doesn't run once a Response exists
|
|
97
|
+
runs: 'until-response',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// A +middleware's answer to a `.pageContext.json` request. Its own Response, or a response function's replacement of
|
|
101
|
+
// Vike's JSON, becomes a 404 without JSON: the client router then reloads the page, so that the page's own request shows
|
|
102
|
+
// the +middleware's answer (e.g. a 401, a redirect or a login page).
|
|
103
|
+
function toPageContextJsonAnswer(answer) {
|
|
104
|
+
const toReload = (response) => {
|
|
105
|
+
const headers = new Headers(response.headers);
|
|
106
|
+
headers.delete('content-type');
|
|
107
|
+
return new Response(response.body, { status: 404, headers });
|
|
108
|
+
};
|
|
109
|
+
// The +middleware answered instead of the page
|
|
110
|
+
if (answer instanceof Response)
|
|
111
|
+
return toReload(answer);
|
|
112
|
+
if (typeof answer !== 'function')
|
|
113
|
+
return answer;
|
|
114
|
+
return async (response) => {
|
|
115
|
+
const replaced = await answer(response);
|
|
116
|
+
// Vike's JSON, possibly re-encoded, keeps its status and its JSON Content-Type
|
|
117
|
+
const isVikeJson = replaced?.status === response.status && replaced.headers.get('content-type')?.includes('application/json');
|
|
118
|
+
return replaced && (isVikeJson ? replaced : toReload(replaced));
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// Warns about a path that starts with the Base URL
|
|
122
|
+
function assertPath(name, path, baseServer) {
|
|
123
|
+
const base = baseServer.replace(/\/$/, '');
|
|
124
|
+
if (!base || (path !== base && !path.startsWith(`${base}/`)))
|
|
125
|
+
return;
|
|
126
|
+
assertWarning(false, `The +middleware ${name ? `${pc.bold(name)} ` : ''}has the path ${pc.cyan(path)}, which starts with the Base URL ${pc.cyan(baseServer)}. A +middleware path is relative to the Base URL, use ${pc.cyan(path.slice(base.length) || '/')} instead.`, { onlyOnce: `middleware-path:${name}:${path}` });
|
|
127
|
+
}
|
|
128
|
+
// Universal Middleware replaces the context with the one a middleware returns: Vike merges it into a new object, as a
|
|
129
|
+
// +middleware or a user-land universal middleware returns only what it adds, and an adapter may reuse the context
|
|
130
|
+
function mergeContext(middleware) {
|
|
131
|
+
return enhance(async (request, context, runtime) => {
|
|
132
|
+
const result = await getUniversal(middleware)(request, context, runtime);
|
|
133
|
+
if (!result || result instanceof Response || typeof result === 'function')
|
|
134
|
+
return result;
|
|
135
|
+
return { ...context, ...result };
|
|
136
|
+
}, getOptions(middleware));
|
|
137
|
+
}
|
|
138
|
+
// The options `enhance()` gave a middleware, also when an adapter wraps it, without the unset ones: Universal Middleware sorts an `order` set to `undefined` as `NaN`
|
|
139
|
+
function getOptions(middleware) {
|
|
140
|
+
const options = {
|
|
141
|
+
name: getUniversalProp(middleware, nameSymbol),
|
|
142
|
+
path: getUniversalProp(middleware, pathSymbol),
|
|
143
|
+
method: getUniversalProp(middleware, methodSymbol),
|
|
144
|
+
order: getUniversalProp(middleware, orderSymbol),
|
|
145
|
+
runs: getUniversalProp(middleware, runsSymbol),
|
|
146
|
+
};
|
|
147
|
+
return Object.fromEntries(Object.entries(options).filter(([, value]) => value !== undefined));
|
|
148
|
+
}
|
|
149
|
+
function withIsHandler(middleware) {
|
|
150
|
+
return Object.assign(middleware, { isHandler: isHandler(middleware) });
|
|
151
|
+
}
|
|
152
|
+
function addUserAgent_deprecated(pageContextInit, request, runtime) {
|
|
153
|
+
// Backwards compatibility for `$ vike dev` and `$ vike preview`
|
|
154
|
+
if (runtime.adapter === 'other' && 'req' in runtime) {
|
|
155
|
+
Object.defineProperty(pageContextInit, 'userAgent', {
|
|
156
|
+
get() {
|
|
157
|
+
// TO-DO/next-major-release: assertUsage() instead of assertWarning()
|
|
158
|
+
assertWarning(false, `${pc.cyan('pageContext.userAgent')} is deprecated: use ${pc.cyan("pageContext.headers['user-agent']")} instead.`, {
|
|
159
|
+
showStackTrace: true,
|
|
160
|
+
onlyOnce: true,
|
|
161
|
+
});
|
|
162
|
+
return request.headers.get('user-agent') ?? undefined;
|
|
163
|
+
},
|
|
164
|
+
enumerable: false,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export default vikeUniversalMiddleware;
|
|
2
|
+
// TO-DO/next-major-release: remove this export (the entire file)
|
|
3
|
+
import { vikeUniversalMiddleware } from './vikeUniversalMiddleware.js';
|
|
4
|
+
import { assertWarning } from '../../../utils/assert.js';
|
|
5
|
+
import '../../assertEnvServer.js';
|
|
6
|
+
assertWarning(false, [
|
|
7
|
+
"You're using a deprecated Vike extension:",
|
|
8
|
+
'- If you use one of the following, update to its latest version: @vikejs/hono, @vikejs/express, @vikejs/fastify, @vikejs/h3, or @vikejs/elysia',
|
|
9
|
+
'- If you use vike-photon or vike-server, migrate to +server.js — see https://vike.dev/migration/server',
|
|
10
|
+
].join('\n'), { onlyOnce: true });
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { getMiddlewaresPipe_nonHandlers };
|
|
2
|
+
export { getMiddlewaresPipe_handlers };
|
|
3
|
+
export { pipeNonHandlers };
|
|
4
|
+
import { type UniversalHandler, type UniversalMiddleware } from '@universal-middleware/core';
|
|
5
|
+
import { type Middleware } from './core.js';
|
|
6
|
+
import '../../assertEnvServer.js';
|
|
7
|
+
/**
|
|
8
|
+
* What `vike(app, middlewares)` runs after the app's routes: the middlewares (looked up upon each request) that are handlers, as one universal handler (the pipe).
|
|
9
|
+
*/
|
|
10
|
+
declare function getMiddlewaresPipe_handlers(middlewaresUserLand: object[]): UniversalHandler;
|
|
11
|
+
/**
|
|
12
|
+
* What `vike(app, middlewares)` applies before the app's routes: the middlewares (looked up upon each request) that aren't handlers, as one universal middleware (the pipe).
|
|
13
|
+
*/
|
|
14
|
+
declare function getMiddlewaresPipe_nonHandlers(middlewaresUserLand: object[]): UniversalMiddleware;
|
|
15
|
+
declare function pipeNonHandlers(middlewares: Middleware[], nonHandlersUserLand: UniversalMiddleware[]): UniversalMiddleware;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export { getMiddlewaresPipe_nonHandlers };
|
|
2
|
+
export { getMiddlewaresPipe_handlers };
|
|
3
|
+
export { pipeNonHandlers };
|
|
4
|
+
import { enhance, isHandler, pipeRoute, } from '@universal-middleware/core';
|
|
5
|
+
import { getMiddlewares_withErrorHandling, mergeContext } from './core.js';
|
|
6
|
+
import '../../assertEnvServer.js';
|
|
7
|
+
/**
|
|
8
|
+
* What `vike(app, middlewares)` runs after the app's routes: the middlewares (looked up upon each request) that are handlers, as one universal handler (the pipe).
|
|
9
|
+
*/
|
|
10
|
+
function getMiddlewaresPipe_handlers(
|
|
11
|
+
// `object[]`: the user-land universal middlewares can come from another copy of @universal-middleware/core, whose types don't match this copy's
|
|
12
|
+
middlewaresUserLand) {
|
|
13
|
+
const handlersUserLand = middlewaresUserLand.filter(isHandler);
|
|
14
|
+
const router = pipe((middlewares) => pipeRoute([...handlersUserLand, ...middlewares.filter((middleware) => middleware.isHandler)]));
|
|
15
|
+
return enhance(async (request, context, runtime) => {
|
|
16
|
+
return ((await router(request, context, runtime)) ??
|
|
17
|
+
// Fallback when no handler answers
|
|
18
|
+
new Response('Not Found', { status: 404 }));
|
|
19
|
+
}, {
|
|
20
|
+
name: 'vike:handlers',
|
|
21
|
+
method: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH'],
|
|
22
|
+
path: '/**',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* What `vike(app, middlewares)` applies before the app's routes: the middlewares (looked up upon each request) that aren't handlers, as one universal middleware (the pipe).
|
|
27
|
+
*/
|
|
28
|
+
function getMiddlewaresPipe_nonHandlers(
|
|
29
|
+
// `object[]`: the user-land universal middlewares can come from another copy of @universal-middleware/core, whose types don't match this copy's
|
|
30
|
+
middlewaresUserLand) {
|
|
31
|
+
const nonHandlersUserLand = middlewaresUserLand.filter((middleware) => !isHandler(middleware));
|
|
32
|
+
return enhance(pipe((middlewares) => pipeNonHandlers(middlewares, nonHandlersUserLand)), { name: 'vike:nonHandlers' });
|
|
33
|
+
}
|
|
34
|
+
function pipeNonHandlers(middlewares, nonHandlersUserLand) {
|
|
35
|
+
const nonHandlers = [
|
|
36
|
+
...middlewares.filter((middleware) => !middleware.isHandler),
|
|
37
|
+
...nonHandlersUserLand.map((middleware) => mergeContext(enhance(middleware, { runs: 'always' }))),
|
|
38
|
+
];
|
|
39
|
+
return pipeRoute(nonHandlers);
|
|
40
|
+
}
|
|
41
|
+
function pipe(getPipe) {
|
|
42
|
+
// Caching: the list changes only when the config does, so getPipe() runs once per list
|
|
43
|
+
const cache = new WeakMap();
|
|
44
|
+
return async (request, context, runtime) => {
|
|
45
|
+
const middlewares = await getMiddlewares_withErrorHandling();
|
|
46
|
+
let ret = cache.get(middlewares);
|
|
47
|
+
if (!ret)
|
|
48
|
+
cache.set(middlewares, (ret = getPipe(middlewares)));
|
|
49
|
+
return ret(request, context, runtime);
|
|
50
|
+
};
|
|
51
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { vikeUniversalMiddleware };
|
|
2
|
+
import { type RuntimeAdapterTarget } from '@universal-middleware/core';
|
|
3
|
+
import '../../assertEnvServer.js';
|
|
4
|
+
declare const vikeUniversalMiddleware: typeof handler & import("@universal-middleware/core").WithUniversalSymbols<{
|
|
5
|
+
readonly name: 'vike';
|
|
6
|
+
readonly method: ["GET", "POST", "PUT", "PATCH", "HEAD", "OPTIONS"];
|
|
7
|
+
readonly path: '/**';
|
|
8
|
+
}>;
|
|
9
|
+
declare function handler(request: Request, context?: Universal.Context, runtime?: RuntimeAdapterTarget<unknown>): Promise<Response>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export { vikeUniversalMiddleware };
|
|
2
|
+
import { enhance, getAdapterRuntime } from '@universal-middleware/core';
|
|
3
|
+
import { getMiddlewaresPipe_handlers, getMiddlewaresPipe_nonHandlers } from './getMiddlewaresPipe.js';
|
|
4
|
+
import { routeCatchAll } from './core.js';
|
|
5
|
+
import '../../assertEnvServer.js';
|
|
6
|
+
// The Universal Middleware for Vike's built-in server.
|
|
7
|
+
// - The same two pipes that `vike(app)` applies, but without any user-land middlewares (there aren't any)
|
|
8
|
+
const vikeUniversalMiddleware = enhance(handler, routeCatchAll);
|
|
9
|
+
const pipeNonHandlers = getMiddlewaresPipe_nonHandlers([]);
|
|
10
|
+
const pipeHandlers = getMiddlewaresPipe_handlers([]);
|
|
11
|
+
async function handler(request, context = {}, runtime = getAdapterRuntime('other', { params: undefined })) {
|
|
12
|
+
// A copy: Universal Middleware's `pipe()` writes a returned context into it when a response function follows, and a Cloudflare worker's `env` (its context) is shared by all requests
|
|
13
|
+
context = { ...context };
|
|
14
|
+
const answer = await pipeNonHandlers(request, context, runtime);
|
|
15
|
+
if (answer instanceof Response)
|
|
16
|
+
return answer;
|
|
17
|
+
// The context the +middleware returned
|
|
18
|
+
if (answer && typeof answer === 'object')
|
|
19
|
+
context = answer;
|
|
20
|
+
const response = await pipeHandlers(request, context, runtime);
|
|
21
|
+
return typeof answer === 'function' ? ((await answer(response)) ?? response) : response;
|
|
22
|
+
}
|
|
@@ -42,6 +42,10 @@ declare function createGlobalContextShared<GlobalContextAdded extends {}, Global
|
|
|
42
42
|
_pageFilesAll: PageFile[];
|
|
43
43
|
_pageConfigs: PageConfigRuntime[];
|
|
44
44
|
_pageConfigGlobal: import("../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
45
|
+
_environmentEntries: Record<string, {
|
|
46
|
+
pageConfigs: PageConfigRuntime[];
|
|
47
|
+
pageConfigGlobal: import("../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
48
|
+
} | null>;
|
|
45
49
|
_allPageIds: string[];
|
|
46
50
|
} & GlobalContextAdded & Awaited<GlobalContextAddedAsync>>;
|
|
47
51
|
type GlobalContextBasePublic = Pick<GlobalContextBase, 'config' | 'pages' | 'isGlobalContext'>;
|
|
@@ -74,5 +78,9 @@ declare function createGlobalContextBase(virtualFileExportsGlobalEntry: unknown)
|
|
|
74
78
|
_pageFilesAll: PageFile[];
|
|
75
79
|
_pageConfigs: PageConfigRuntime[];
|
|
76
80
|
_pageConfigGlobal: import("../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
81
|
+
_environmentEntries: Record<string, {
|
|
82
|
+
pageConfigs: PageConfigRuntime[];
|
|
83
|
+
pageConfigGlobal: import("../types/PageConfig.js").PageConfigGlobalRuntime;
|
|
84
|
+
} | null>;
|
|
77
85
|
_allPageIds: string[];
|
|
78
86
|
};
|
|
@@ -79,7 +79,7 @@ addGlobalContextTmp, addGlobalContextAsync) {
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
function createGlobalContextBase(virtualFileExportsGlobalEntry) {
|
|
82
|
-
const { pageFilesAll, pageConfigs, pageConfigGlobal } = parseVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry);
|
|
82
|
+
const { pageFilesAll, pageConfigs, pageConfigGlobal, environmentEntries } = parseVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry);
|
|
83
83
|
const allPageIds = getAllPageIds(pageFilesAll, pageConfigs);
|
|
84
84
|
const globalContextAddendum = resolveGlobalContextConfig(pageConfigs, pageConfigGlobal);
|
|
85
85
|
const globalContext = {
|
|
@@ -94,6 +94,7 @@ function createGlobalContextBase(virtualFileExportsGlobalEntry) {
|
|
|
94
94
|
_pageFilesAll: pageFilesAll,
|
|
95
95
|
_pageConfigs: pageConfigs,
|
|
96
96
|
_pageConfigGlobal: pageConfigGlobal,
|
|
97
|
+
_environmentEntries: environmentEntries,
|
|
97
98
|
_allPageIds: allPageIds,
|
|
98
99
|
...globalContextAddendum,
|
|
99
100
|
};
|
|
@@ -3,14 +3,12 @@ export { assertPropertyGetters };
|
|
|
3
3
|
import { assert, assertWarning } from '../utils/assert.js';
|
|
4
4
|
import { compareString } from '../utils/compareString.js';
|
|
5
5
|
import { isPropertyGetter } from '../utils/isPropertyGetter.js';
|
|
6
|
-
import { addIs404ToPageProps } from './addIs404ToPageProps.js';
|
|
7
6
|
import { getGlobalContextPublicShared } from './getGlobalContextPublicShared.js';
|
|
8
7
|
import { getPublicProxy } from './getPublicProxy.js';
|
|
9
8
|
function getPageContextPublicShared(pageContext) {
|
|
10
9
|
assert(!pageContext._isProxyObject);
|
|
11
10
|
assert(!pageContext.globalContext); // pageContext.globalContext should only be available to users — Vike itself should use pageContext._globalContext instead
|
|
12
11
|
assert(pageContext._isOriginalObject); // ensure we preserve the original object reference
|
|
13
|
-
addIs404ToPageProps(pageContext);
|
|
14
12
|
// TO-DO/next-major-release: remove
|
|
15
13
|
if (!('_pageId' in pageContext)) {
|
|
16
14
|
Object.defineProperty(pageContext, '_pageId', {
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
export { parseVirtualFileExportsGlobalEntry };
|
|
2
|
+
export { parseGlobalEntryPageConfigs };
|
|
3
|
+
export type { EnvironmentEntry };
|
|
2
4
|
import { type PageFile } from './getPageFileObject.js';
|
|
3
5
|
import type { PageConfigRuntime, PageConfigGlobalRuntime } from '../../types/PageConfig.js';
|
|
4
6
|
declare function parseVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry: unknown): {
|
|
5
7
|
pageFilesAll: PageFile[];
|
|
6
8
|
pageConfigs: PageConfigRuntime[];
|
|
7
9
|
pageConfigGlobal: PageConfigGlobalRuntime;
|
|
10
|
+
environmentEntries: Record<string, null | EnvironmentEntry>;
|
|
11
|
+
};
|
|
12
|
+
type EnvironmentEntry = ReturnType<typeof parseGlobalEntryPageConfigs>;
|
|
13
|
+
declare function parseGlobalEntryPageConfigs(virtualFileExportsGlobalEntry: unknown): {
|
|
14
|
+
pageConfigs: PageConfigRuntime[];
|
|
15
|
+
pageConfigGlobal: PageConfigGlobalRuntime;
|
|
8
16
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { parseVirtualFileExportsGlobalEntry };
|
|
2
|
+
export { parseGlobalEntryPageConfigs };
|
|
2
3
|
// TO-DO/next-major-release: remove old design code, and remove all assertions.
|
|
3
4
|
import { assert } from '../../utils/assert.js';
|
|
4
5
|
import { cast } from '../../utils/cast.js';
|
|
@@ -6,6 +7,7 @@ import { hasProp } from '../../utils/hasProp.js';
|
|
|
6
7
|
import { isArray } from '../../utils/isArray.js';
|
|
7
8
|
import { isCallable } from '../../utils/isCallable.js';
|
|
8
9
|
import { isObject } from '../../utils/isObject.js';
|
|
10
|
+
import { objectMap } from '../../utils/objectMap.js';
|
|
9
11
|
import { assertExportValues } from './assert_exports_old_design.js';
|
|
10
12
|
import { getPageFileObject } from './getPageFileObject.js';
|
|
11
13
|
import { fileTypes } from './fileTypes.js';
|
|
@@ -21,12 +23,12 @@ function parseVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry) {
|
|
|
21
23
|
assert(hasProp(virtualFileExportsGlobalEntry.pageFilesLazy, '.page.client') ||
|
|
22
24
|
hasProp(virtualFileExportsGlobalEntry.pageFilesLazy, '.page.server'));
|
|
23
25
|
assert(hasProp(virtualFileExportsGlobalEntry, 'pageFilesList', 'string[]'));
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
const { pageConfigs, pageConfigGlobal } = parseGlobalEntryPageConfigs(virtualFileExportsGlobalEntry);
|
|
27
|
+
// The global entries of the additional environments (e.g. `rsc`)
|
|
28
|
+
// - `null` in development: they're imported with environment.runner.import()
|
|
29
|
+
const environmentEntries = hasProp(virtualFileExportsGlobalEntry, 'environmentEntries', 'object')
|
|
30
|
+
? objectMap(virtualFileExportsGlobalEntry.environmentEntries, (environmentEntry) => environmentEntry === null ? null : parseGlobalEntryPageConfigs(environmentEntry))
|
|
31
|
+
: {};
|
|
30
32
|
const pageFilesMap = {};
|
|
31
33
|
parseGlobResult(virtualFileExportsGlobalEntry.pageFilesLazy).forEach(({ filePath, pageFile, globValue }) => {
|
|
32
34
|
pageFile = pageFilesMap[filePath] = pageFilesMap[filePath] ?? pageFile;
|
|
@@ -72,7 +74,15 @@ function parseVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry) {
|
|
|
72
74
|
pageFilesAll.forEach(({ filePath }) => {
|
|
73
75
|
assert(!filePath.includes('\\'));
|
|
74
76
|
});
|
|
75
|
-
return { pageFilesAll, pageConfigs, pageConfigGlobal };
|
|
77
|
+
return { pageFilesAll, pageConfigs, pageConfigGlobal, environmentEntries };
|
|
78
|
+
}
|
|
79
|
+
function parseGlobalEntryPageConfigs(virtualFileExportsGlobalEntry) {
|
|
80
|
+
assert(hasProp(virtualFileExportsGlobalEntry, 'pageConfigsSerialized'));
|
|
81
|
+
assert(hasProp(virtualFileExportsGlobalEntry, 'pageConfigGlobalSerialized'));
|
|
82
|
+
const { pageConfigsSerialized, pageConfigGlobalSerialized } = virtualFileExportsGlobalEntry;
|
|
83
|
+
assertPageConfigsSerialized(pageConfigsSerialized);
|
|
84
|
+
assertPageConfigGlobalSerialized(pageConfigGlobalSerialized);
|
|
85
|
+
return parsePageConfigsSerialized(pageConfigsSerialized, pageConfigGlobalSerialized);
|
|
76
86
|
}
|
|
77
87
|
function parseGlobResult(globObject) {
|
|
78
88
|
const ret = [];
|
|
@@ -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 = {
|