vike 0.4.267-commit-5676e14 → 0.4.267-commit-e667e7c

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.
Files changed (80) hide show
  1. package/dist/client/runtime-client-routing/createPageContextClient.d.ts +1 -0
  2. package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +1 -0
  3. package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +4 -0
  4. package/dist/client/runtime-client-routing/renderPageClient.d.ts +8 -0
  5. package/dist/client/runtime-client-routing/renderPageClient.js +0 -7
  6. package/dist/client/runtime-server-routing/createPageContextClient.d.ts +1 -0
  7. package/dist/client/runtime-server-routing/getGlobalContextClientInternal.d.ts +1 -0
  8. package/dist/client/shared/getGlobalContextClientInternalShared.d.ts +1 -0
  9. package/dist/client/shared/getGlobalContextClientInternalShared.js +2 -0
  10. package/dist/client/shared/removeFoucBuster.js +14 -3
  11. package/dist/node/api/dev.js +15 -1
  12. package/dist/node/api/serverEntryDev.d.ts +10 -0
  13. package/dist/node/api/serverEntryDev.js +113 -0
  14. package/dist/node/createDevMiddleware.js +12 -0
  15. package/dist/node/prerender/resolvePrerenderConfig.d.ts +1 -1
  16. package/dist/node/prerender/resolvePrerenderConfig.js +4 -1
  17. package/dist/node/prerender/runPrerender.d.ts +6 -14
  18. package/dist/node/prerender/runPrerender.js +1 -1
  19. package/dist/node/vite/plugins/build/pluginBuildConfig.js +1 -1
  20. package/dist/node/vite/plugins/pluginCommon.js +1 -1
  21. package/dist/node/vite/plugins/pluginDev/optimizeDeps.d.ts +1 -1
  22. package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +3 -1
  23. package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.d.ts +3 -0
  24. package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.js +26 -0
  25. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.d.ts +1 -1
  26. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.js +22 -11
  27. package/dist/node/vite/plugins/pluginUniversalDeploy.js +27 -3
  28. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.d.ts +4 -2
  29. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js +1 -1
  30. package/dist/node/vite/shared/addSsrMiddleware.js +11 -39
  31. package/dist/node/vite/shared/findPageFiles.d.ts +1 -1
  32. package/dist/node/vite/shared/findPageFiles.js +1 -11
  33. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +5 -3
  34. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +9 -0
  35. package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +1 -0
  36. package/dist/node/vite/shared/resolveVikeConfigInternal.js +1 -1
  37. package/dist/server/__internal/index.d.ts +1 -0
  38. package/dist/server/__internal/index.js +2 -0
  39. package/dist/server/createPageRenderer.d.ts +2 -2
  40. package/dist/server/createPageRenderer.js +2 -2
  41. package/dist/server/runtime/createDevMiddleware.js +3 -1
  42. package/dist/server/runtime/fetch.d.ts +4 -5
  43. package/dist/server/runtime/fetch.js +2 -2
  44. package/dist/server/runtime/globalContext.d.ts +49 -10
  45. package/dist/server/runtime/globalContext.js +35 -2
  46. package/dist/server/runtime/index.d.ts +1 -1
  47. package/dist/server/runtime/index.js +1 -1
  48. package/dist/server/runtime/renderPageServer/createHttpResponse.d.ts +0 -2
  49. package/dist/server/runtime/renderPageServer/createHttpResponse.js +0 -6
  50. package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +9 -23
  51. package/dist/server/runtime/renderPageServer/getHttpResponseBody.js +2 -10
  52. package/dist/server/runtime/renderPageServer/handlePageContextRequestUrl.js +2 -2
  53. package/dist/server/runtime/renderPageServer/html/stream.d.ts +1 -1
  54. package/dist/server/runtime/renderPageServer/html/stream.js +16 -3
  55. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +6 -14
  56. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +36 -84
  57. package/dist/server/runtime/renderPageServer.d.ts +61 -18
  58. package/dist/server/runtime/renderPageServer.js +12 -53
  59. package/dist/server/runtime/universal-middleware/core.d.ts +25 -0
  60. package/dist/server/runtime/universal-middleware/core.js +167 -0
  61. package/dist/server/runtime/universal-middleware/deprecated-export.d.ts +3 -0
  62. package/dist/server/runtime/universal-middleware/deprecated-export.js +10 -0
  63. package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.d.ts +15 -0
  64. package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.js +51 -0
  65. package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.d.ts +9 -0
  66. package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.js +22 -0
  67. package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.js +2 -0
  68. package/dist/types/Config.d.ts +9 -1
  69. package/dist/types/GlobalContext.d.ts +3 -3
  70. package/dist/types/PageContext.d.ts +0 -9
  71. package/dist/types/PageContext.js +1 -0
  72. package/dist/types/index.d.ts +1 -0
  73. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  74. package/dist/utils/PROJECT_VERSION.js +1 -1
  75. package/dist/utils/installUncaughtErrorHandlers.js +9 -0
  76. package/package.json +17 -16
  77. package/universal-middleware.js +2 -2
  78. package/vike-server.d.ts +14 -0
  79. package/dist/server/runtime/universal-middleware.d.ts +0 -10
  80. package/dist/server/runtime/universal-middleware.js +0 -27
@@ -1,21 +1,72 @@
1
1
  export { renderPageServer };
2
+ export { renderPageServer_userLand };
2
3
  export { getRequestTag };
3
4
  export type { PageContextInit };
4
- export type { PageContextInitInternal };
5
5
  export type { PageContextBegin };
6
6
  export type { RequestTag };
7
7
  import { type PageContextAborted } from '../../shared-server-client/route/abort.js';
8
8
  import { type GlobalContextServerInternal } from './globalContext.js';
9
9
  import { type HttpResponse } from './renderPageServer/createHttpResponse.js';
10
10
  import type { PageContextServer } from '../../types/index.js';
11
- import type { PageContextInit, PageContextInitInternal } from '../../types/PageContext.js';
11
+ import type { PageContextInit, PageContextInternalServer } from '../../types/PageContext.js';
12
12
  import { type AsyncStore } from './asyncHook.js';
13
13
  import '../assertEnvServer.js';
14
14
  type PageContextBegin = ReturnType<typeof getPageContextBegin>;
15
- declare function renderPageServer<PageContextUserAdded extends {}, PageContextInitUser extends PageContextInitInternal>(pageContextInit: PageContextInitUser): Promise<PageContextInitUser & {
15
+ declare function renderPageServer_userLand<PageContextUserAdded extends {}, PageContextInitUser extends PageContextInit>(pageContextInit: PageContextInitUser): Promise<PageContextInitUser & {
16
+ httpResponse: HttpResponse;
17
+ } & Partial<import("../../shared-server-client/getPageFiles.js").PageContextConfig & {
18
+ isPageContext: true;
19
+ Page: import("../../types/Config.js").Config['Page'];
20
+ routeParams: Record<string, string>;
21
+ data: unknown;
22
+ headersResponse: Headers;
23
+ is404: boolean | null;
24
+ isClientSideNavigation: boolean;
25
+ abortReason?: unknown;
26
+ abortStatusCode?: import("../../shared-server-client/route/abort.js").AbortStatusCode;
27
+ errorWhileRendering?: unknown;
28
+ pageId: string | null;
29
+ from: import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").From;
30
+ source: import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").Source;
31
+ sources: import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").Sources;
32
+ pageExports: Record<string, unknown>;
33
+ isBaseMissing?: true;
34
+ } & PageContextInit & {
35
+ urlOriginal: string;
36
+ } & {
37
+ urlParsed: import("../../utils/parseUrl.js").UrlPublic;
38
+ urlPathname: string;
39
+ url: string;
40
+ } & {
41
+ urlParsed: Omit<import("../../utils/parseUrl.js").UrlPublic, "hash" | "hashOriginal" | "hashString"> & {
42
+ hash: '';
43
+ hashString: null;
44
+ hashOriginal: null;
45
+ };
46
+ } & {
47
+ headers: Record<string, string> | null;
48
+ isClientSide: false;
49
+ isPrerendering: boolean;
50
+ globalContext: import("../../types/GlobalContext.js").GlobalContextServer;
51
+ cspNonce: string | null;
52
+ pageContextsAborted: Partial<PageContextServer<unknown>>[];
53
+ environments?: Record<string, {
54
+ config: import("../../shared-server-client/getPageFiles.js").PageContextConfig['config'];
55
+ pageContext: PageContextServer<unknown>;
56
+ }> | undefined;
57
+ isHydration?: undefined;
58
+ isBackwardNavigation?: undefined;
59
+ isHistoryNavigation?: undefined;
60
+ previousPageContext?: undefined;
61
+ } & {
62
+ dangerouslyUseInternals: import("../../shared-server-client/getPublicProxy.js").DangerouslyUseInternals<PageContextInternalServer & import("./renderPageServer/renderPageServerAfterRoute.js").PageContextAfterRender & import("./renderPageServer/getPageContextPublicServer.js").PageContextPublicServer>;
63
+ } & Vike.PageContext & Vike.PageContextServer & {
64
+ content?: string | Uint8Array | ReadableStream<Uint8Array>;
65
+ } & PageContextUserAdded>>;
66
+ declare function renderPageServer<PageContextUserAdded extends {}, PageContextInitUser extends PageContextInit>(pageContextInit: PageContextInitUser, isCalledDirectlyByUser: boolean): Promise<PageContextInitUser & {
16
67
  httpResponse: HttpResponse;
17
68
  } & Partial<PageContextServer & PageContextUserAdded>>;
18
- declare function getPageContextBegin(pageContextInit: PageContextInitInternal, globalContext: GlobalContextServerInternal, requestId: number, asyncStore: AsyncStore): {
69
+ declare function getPageContextBegin(pageContextInit: PageContextInit, globalContext: GlobalContextServerInternal, requestId: number, asyncStore: AsyncStore): {
19
70
  _isOriginalObject: true;
20
71
  isPageContext: true;
21
72
  } & {
@@ -23,12 +74,6 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
23
74
  isPrerendering: boolean;
24
75
  _requestId: number;
25
76
  } & PageContextInit & {
26
- _nodeDev?: {
27
- req: import("http").IncomingMessage;
28
- res: import("http").ServerResponse;
29
- };
30
- _reqWeb?: Request;
31
- } & {
32
77
  _globalContext: ({
33
78
  config: import("../../types/index.js").ConfigResolved;
34
79
  _source: import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").Source;
@@ -65,6 +110,7 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
65
110
  _isPrerendering: false;
66
111
  assetsManifest: null;
67
112
  _viteDevServer: import("vite").ViteDevServer | undefined;
113
+ devMiddleware: import("vite").Connect.Server | null;
68
114
  viteConfig: import("vite").ResolvedConfig | undefined;
69
115
  } | {
70
116
  isClientSide: false;
@@ -73,6 +119,7 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
73
119
  _isProduction: true;
74
120
  assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
75
121
  _viteDevServer: null;
122
+ devMiddleware: null;
76
123
  _usesClientRouter: boolean;
77
124
  _isPrerendering: true;
78
125
  viteConfig: import("vite").ResolvedConfig;
@@ -83,12 +130,11 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
83
130
  _isProduction: true;
84
131
  assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
85
132
  _viteDevServer: null;
133
+ devMiddleware: null;
86
134
  _usesClientRouter: boolean;
87
135
  _isPrerendering: false;
88
136
  viteConfig: null;
89
137
  }) & {
90
- baseServer: string;
91
- baseAssets: string;
92
138
  viteConfigRuntime: {
93
139
  root: string;
94
140
  build: {
@@ -99,6 +145,9 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
99
145
  inject: boolean | undefined;
100
146
  };
101
147
  };
148
+ baseServer: string;
149
+ baseAssets: string;
150
+ middlewares: import("./universal-middleware/core.js").Middleware[];
102
151
  })) & {
103
152
  prerenderContext: import("../../types/index.js").PrerenderContext | undefined;
104
153
  };
@@ -106,12 +155,6 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
106
155
  _baseServer: string;
107
156
  _baseAssets: string;
108
157
  _pageContextInit: PageContextInit & {
109
- _nodeDev?: {
110
- req: import("http").IncomingMessage;
111
- res: import("http").ServerResponse;
112
- };
113
- _reqWeb?: Request;
114
- } & {
115
158
  headers?: Record<string, unknown>;
116
159
  };
117
160
  _urlHandler: ((url: string) => string) | null;
@@ -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';
@@ -18,7 +19,7 @@ import { getPageContextAddendumAbort, isAbortError, logAbort, addNewPageContextA
18
19
  import { getGlobalContextServerInternal, initGlobalContext_renderPage, } from './globalContext.js';
19
20
  import { handlePageContextRequestUrl } from './renderPageServer/handlePageContextRequestUrl.js';
20
21
  import { getPageContextPublicServer } from './renderPageServer/getPageContextPublicServer.js';
21
- import { createHttpResponse404, createHttpResponseRedirect, createHttpResponsePageJson, createHttpResponseErrorFallback, createHttpResponseErrorFallback_noGlobalContext, createHttpResponseBaseIsMissing, createHttpResponseFromUniversalMiddleware, } from './renderPageServer/createHttpResponse.js';
22
+ import { createHttpResponse404, createHttpResponseRedirect, createHttpResponsePageJson, createHttpResponseErrorFallback, createHttpResponseErrorFallback_noGlobalContext, createHttpResponseBaseIsMissing, } from './renderPageServer/createHttpResponse.js';
22
23
  import { logRuntimeError, logRuntimeInfo } from './loggerRuntime.js';
23
24
  import { assertArguments } from './renderPageServer/assertArguments.js';
24
25
  import { log404 } from './renderPageServer/log404/index.js';
@@ -32,15 +33,18 @@ import { getVikeConfigError } from '../../shared-server-node/getVikeConfigError.
32
33
  import { forkPageContext } from '../../shared-server-client/forkPageContext.js';
33
34
  import { getAsyncLocalStorage } from './asyncHook.js';
34
35
  import { getPageContextJson } from './renderPageServer/getPageContextJson.js';
36
+ import { hasPlusMiddlewares } from './universal-middleware/core.js';
35
37
  import '../assertEnvServer.js';
36
- import { enhance, apply, universalSymbol, UniversalRouter, getAdapterRuntime, } from '@universal-middleware/core';
37
- import { createRequestAdapter } from '@universal-middleware/node/request';
38
38
  const globalObject = getGlobalObject('runtime/renderPageServer.ts', {
39
39
  httpRequestsCount: 0,
40
40
  });
41
- // `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.)
42
- async function renderPageServer(pageContextInit) {
41
+ // The user's renderPage()
42
+ function renderPageServer_userLand(pageContextInit) {
43
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) {
44
48
  assert(hasProp(pageContextInit, 'urlOriginal', 'string')); // assertUsage() already implemented at assertArguments()
45
49
  assertIsUrl(pageContextInit.urlOriginal);
46
50
  onSetupRuntime();
@@ -52,7 +56,7 @@ async function renderPageServer(pageContextInit) {
52
56
  logHttpRequest(urlOriginalPretty, pageContextInit, requestId);
53
57
  const asyncLocalStorage = await getAsyncLocalStorage();
54
58
  const asyncStore = !asyncLocalStorage ? null : { requestId };
55
- const render = async () => await renderPageServerEntryOnceBegin(pageContextInit, requestId, asyncStore);
59
+ const render = async () => await renderPageServerEntryOnce(pageContextInit, isCalledDirectlyByUser, requestId, asyncStore);
56
60
  const pageContextFinish = !asyncLocalStorage ? await render() : await asyncLocalStorage.run(asyncStore, render);
57
61
  logHttpResponse(urlOriginalPretty, pageContextFinish);
58
62
  checkType(pageContextFinish);
@@ -64,7 +68,7 @@ function getPageContextReturn(pageContextFinish) {
64
68
  return pageContextFinish;
65
69
  return getPageContextPublicServer(pageContextFinish);
66
70
  }
67
- async function renderPageServerEntryOnceBegin(pageContextInit, requestId, asyncStore) {
71
+ async function renderPageServerEntryOnce(pageContextInit, isCalledDirectlyByUser, requestId, asyncStore) {
68
72
  // Invalid config
69
73
  {
70
74
  const vikeConfigError = getVikeConfigError();
@@ -99,17 +103,8 @@ async function renderPageServerEntryOnceBegin(pageContextInit, requestId, asyncS
99
103
  }
100
104
  }
101
105
  const { globalContext } = await getGlobalContextServerInternal();
106
+ assertUsage(!isCalledDirectlyByUser || !hasPlusMiddlewares(globalContext), `renderPage() doesn't run +middleware — see ${pc.underline('https://vike.dev/error/setup-middlewares')}`);
102
107
  const pageContextBegin = getPageContextBegin(pageContextInit, globalContext, requestId, asyncStore);
103
- const middlewares = (globalContext.config.middleware ?? []).flat();
104
- const renderPageServerEntry = () => renderPageServerEntryOnce(pageContextBegin, globalContext, requestId);
105
- if (middlewares.length === 0) {
106
- return renderPageServerEntry();
107
- }
108
- else {
109
- return renderPageServerEntryWithMiddlewares(pageContextBegin, renderPageServerEntry, middlewares);
110
- }
111
- }
112
- async function renderPageServerEntryOnce(pageContextBegin, globalContext, requestId) {
113
108
  // Check Base URL
114
109
  {
115
110
  const pageContextHttpResponse = await checkBaseUrl(pageContextBegin, globalContext);
@@ -249,42 +244,6 @@ async function renderPageServerEntryRecursive_onError(err, pageContextBegin, pag
249
244
  }
250
245
  return pageContextErrorPage;
251
246
  }
252
- const requestAdapter = createRequestAdapter();
253
- async function renderPageServerEntryWithMiddlewares(pageContext, renderPageServerEntry, middlewares) {
254
- const router = new UniversalRouter(true, false);
255
- let httpResponseVikeCore = undefined;
256
- // Wrap rendering into universal-middleware routing
257
- apply(router, [
258
- enhance(async function adaptRenderPageServerEntryOnceInternal() {
259
- const pageContextHttpResponse = await renderPageServerEntry();
260
- const { httpResponse } = pageContextHttpResponse;
261
- pageContext = pageContextHttpResponse;
262
- httpResponseVikeCore = httpResponse;
263
- const readable = httpResponse.getReadableWebStream();
264
- return new Response(readable, {
265
- status: httpResponse.statusCode,
266
- headers: httpResponse.headers,
267
- });
268
- }, {
269
- name: 'vike',
270
- method: ['GET', 'POST', 'PUT', 'PATCH', 'HEAD', 'OPTIONS'],
271
- path: '/**', // rou3 format
272
- immutable: true, // avoids cloning the function we just created
273
- }),
274
- ...middlewares,
275
- ]);
276
- const handler = router[universalSymbol];
277
- const request = pageContext._reqWeb ??
278
- (pageContext._nodeDev
279
- ? requestAdapter(pageContext._nodeDev.req, pageContext._nodeDev.res)
280
- : new Request(new URL(pageContext.urlOriginal, 'http://localhost').toString(), {
281
- headers: pageContext.headers ?? {},
282
- }));
283
- const res = await handler(request, {}, getAdapterRuntime('other', { params: undefined }));
284
- const httpResponse = createHttpResponseFromUniversalMiddleware(res, httpResponseVikeCore?.earlyHints);
285
- objectAssign(pageContext, { httpResponse });
286
- return pageContext;
287
- }
288
247
  function logHttpRequest(urlOriginal, pageContextInit, requestId) {
289
248
  const pageContext = createPageContextServerWithoutGlobalContext(pageContextInit, requestId);
290
249
  logRuntimeInfo?.(getRequestInfoMessage(urlOriginal), pageContext, 'info');
@@ -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,3 @@
1
+ export default vikeUniversalMiddleware;
2
+ import { vikeUniversalMiddleware } from './vikeUniversalMiddleware.js';
3
+ import '../../assertEnvServer.js';
@@ -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
+ }
@@ -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];
@@ -540,7 +540,7 @@ 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://github.com/magne4000/universal-middleware
543
+ * https://vike.dev/middleware
544
544
  */
545
545
  middleware?: EnhancedMiddleware | EnhancedMiddleware[];
546
546
  /**
@@ -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 & {};
@@ -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 };
@@ -149,13 +147,6 @@ type PageContextInit = {
149
147
  headersOriginal?: unknown;
150
148
  /** @deprecated Set `pageContextInit.urlOriginal` instead */ url?: string;
151
149
  };
152
- type PageContextInitInternal = PageContextInit & {
153
- _nodeDev?: {
154
- req: IncomingMessage;
155
- res: ServerResponse;
156
- };
157
- _reqWeb?: Request;
158
- };
159
150
  type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageContextInit & PageContextUrlServer & {
160
151
  /**
161
152
  * The HTTP request headers.