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
@@ -46,6 +46,7 @@ declare function createPageContextClient(urlOriginal: string): Promise<{
46
46
  _allPageIds: string[];
47
47
  } & {
48
48
  isClientSide: true;
49
+ devMiddleware: null;
49
50
  } & {
50
51
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
51
52
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -32,6 +32,7 @@ declare function getGlobalContextClientInternal(): Promise<{
32
32
  _allPageIds: string[];
33
33
  } & {
34
34
  isClientSide: true;
35
+ devMiddleware: null;
35
36
  } & {
36
37
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
37
38
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -64,6 +64,7 @@ declare function getPageContextFromHooksClient_firstRender(pageContext: PageCont
64
64
  _allPageIds: string[];
65
65
  } & {
66
66
  isClientSide: true;
67
+ devMiddleware: null;
67
68
  } & {
68
69
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
69
70
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -124,6 +125,7 @@ declare function getPageContextFromHooksClient_firstRender(pageContext: PageCont
124
125
  _allPageIds: string[];
125
126
  } & {
126
127
  isClientSide: true;
128
+ devMiddleware: null;
127
129
  } & {
128
130
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
129
131
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -316,6 +318,7 @@ declare function getPageContextFromHooksClient(pageContext: {
316
318
  _allPageIds: string[];
317
319
  } & {
318
320
  isClientSide: true;
321
+ devMiddleware: null;
319
322
  } & {
320
323
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
321
324
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -376,6 +379,7 @@ declare function getPageContextFromHooksClient(pageContext: {
376
379
  _allPageIds: string[];
377
380
  } & {
378
381
  isClientSide: true;
382
+ devMiddleware: null;
379
383
  } & {
380
384
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
381
385
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -78,6 +78,7 @@ declare function renderPageClient(renderArgs: RenderArgs): Promise<({
78
78
  _allPageIds: string[];
79
79
  } & {
80
80
  isClientSide: true;
81
+ devMiddleware: null;
81
82
  } & {
82
83
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
83
84
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -135,6 +136,7 @@ declare function renderPageClient(renderArgs: RenderArgs): Promise<({
135
136
  _allPageIds: string[];
136
137
  } & {
137
138
  isClientSide: true;
139
+ devMiddleware: null;
138
140
  } & {
139
141
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
140
142
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -268,6 +270,7 @@ declare function renderPageClient(renderArgs: RenderArgs): Promise<({
268
270
  _allPageIds: string[];
269
271
  } & {
270
272
  isClientSide: true;
273
+ devMiddleware: null;
271
274
  } & {
272
275
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
273
276
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -325,6 +328,7 @@ declare function renderPageClient(renderArgs: RenderArgs): Promise<({
325
328
  _allPageIds: string[];
326
329
  } & {
327
330
  isClientSide: true;
331
+ devMiddleware: null;
328
332
  } & {
329
333
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
330
334
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -459,6 +463,7 @@ declare function renderPageClient(renderArgs: RenderArgs): Promise<({
459
463
  _allPageIds: string[];
460
464
  } & {
461
465
  isClientSide: true;
466
+ devMiddleware: null;
462
467
  } & {
463
468
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
464
469
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -516,6 +521,7 @@ declare function renderPageClient(renderArgs: RenderArgs): Promise<({
516
521
  _allPageIds: string[];
517
522
  } & {
518
523
  isClientSide: true;
524
+ devMiddleware: null;
519
525
  } & {
520
526
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
521
527
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -653,6 +659,7 @@ declare function getPageContextBegin(isForErrorPage: boolean, { urlOriginal, isB
653
659
  _allPageIds: string[];
654
660
  } & {
655
661
  isClientSide: true;
662
+ devMiddleware: null;
656
663
  } & {
657
664
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
658
665
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -710,6 +717,7 @@ declare function getPageContextBegin(isForErrorPage: boolean, { urlOriginal, isB
710
717
  _allPageIds: string[];
711
718
  } & {
712
719
  isClientSide: true;
720
+ devMiddleware: null;
713
721
  } & {
714
722
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
715
723
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
@@ -311,13 +311,6 @@ async function renderPageClient(renderArgs) {
311
311
  else {
312
312
  objectAssign(pageContext, { is404: false });
313
313
  }
314
- const isClientRoutable = await isClientSideRoutable(pageContext.pageId, pageContext);
315
- if (isRenderOutdated())
316
- return;
317
- if (!isClientRoutable) {
318
- redirectHard(urlOriginal);
319
- return;
320
- }
321
314
  if (import.meta.env.DEV || globalThis.__VIKE__IS_DEBUG) {
322
315
  assertInfo(false, `Rendering error page ${errorPageId}`, { onlyOnce: false });
323
316
  }
@@ -42,6 +42,7 @@ declare function createPageContextClient(): Promise<{
42
42
  _allPageIds: string[];
43
43
  } & {
44
44
  isClientSide: true;
45
+ devMiddleware: null;
45
46
  };
46
47
  _pageFilesAll: import("../../shared-server-client/getPageFiles.js").PageFile[];
47
48
  } & import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").GlobalConfigPublic>;
@@ -32,4 +32,5 @@ declare function getGlobalContextClientInternal(): Promise<{
32
32
  _allPageIds: string[];
33
33
  } & {
34
34
  isClientSide: true;
35
+ devMiddleware: null;
35
36
  }>;
@@ -43,6 +43,7 @@ declare function getGlobalContextClientInternalShared(): Promise<{
43
43
  * https://vike.dev/globalContext#isClientSide
44
44
  */
45
45
  isClientSide: true;
46
+ devMiddleware: null;
46
47
  }>;
47
48
  type TypeIsNotExported = never;
48
49
  declare function getGlobalContext(): Promise<TypeIsNotExported>;
@@ -36,6 +36,8 @@ async function getGlobalContextClientInternalShared() {
36
36
  * https://vike.dev/globalContext#isClientSide
37
37
  */
38
38
  isClientSide: true,
39
+ // https://vike.dev/globalContext#devMiddleware
40
+ devMiddleware: null,
39
41
  };
40
42
  objectAssign(globalContextAddendum, getGlobalContextSerializedInHtml());
41
43
  return globalContextAddendum;
@@ -38,9 +38,20 @@ function clean() {
38
38
  const href = linkVike.getAttribute('href');
39
39
  assert(href && href.endsWith(suffix));
40
40
  let filePathAbsoluteUserRootDir = href.slice(0, -suffix.length);
41
- const prefix = '/@fs/';
42
- if (filePathAbsoluteUserRootDir.startsWith(prefix))
43
- filePathAbsoluteUserRootDir = filePathAbsoluteUserRootDir.slice(prefix.length);
41
+ const prefixFs = '/@fs/';
42
+ if (filePathAbsoluteUserRootDir.startsWith(prefixFs))
43
+ filePathAbsoluteUserRootDir = filePathAbsoluteUserRootDir.slice(prefixFs.length);
44
+ // CSS virtual module:
45
+ // ```js
46
+ // import 'virtual:some.css'
47
+ // ```
48
+ // ID becomes:
49
+ // ```
50
+ // <link href="/@id/__x00__virtual:some.css?direct" rel="stylesheet" type="text/css">
51
+ // ```
52
+ const prefixId = '/@id/';
53
+ if (filePathAbsoluteUserRootDir.startsWith(prefixId))
54
+ filePathAbsoluteUserRootDir = filePathAbsoluteUserRootDir.slice(prefixId.length).replace('__x00__', '\0');
44
55
  if (injectedByVite.some((filePathAbsoluteFilesystem) => filePathAbsoluteFilesystem.endsWith(filePathAbsoluteUserRootDir))) {
45
56
  linkVike.remove();
46
57
  }
@@ -5,6 +5,7 @@ import { assert } from '../../utils/assert.js';
5
5
  import { assertIsNotProductionRuntime } from '../../utils/assertSetup.js';
6
6
  import './assertEnvApiDev.js';
7
7
  import { startupLog } from './startupLog.js';
8
+ import { startServerEntry_parent, startServerEntry_child, getServerEntryFilePath_ifDevCli, isServerChildProcess, } from './serverEntryDev.js';
8
9
  assertIsNotProductionRuntime();
9
10
  /**
10
11
  * Programmatically trigger `$ vike dev`
@@ -13,7 +14,15 @@ assertIsNotProductionRuntime();
13
14
  */
14
15
  async function dev(options = {}) {
15
16
  const { viteConfigUser } = await prepareViteApiCall(options, 'dev');
16
- const server = await createServer(viteConfigUser);
17
+ // `$ vike dev` runs +serverEntry.js if there isn't +server.js — https://vike.dev/serverEntry
18
+ const serverEntryFilePath = await getServerEntryFilePath_ifDevCli();
19
+ const serverEntryIsChildProcess = isServerChildProcess();
20
+ if (serverEntryFilePath && !serverEntryIsChildProcess)
21
+ return await startServerEntry_parent();
22
+ const server = await createServer(serverEntryFilePath
23
+ ? // +serverEntry.js creates the server: it uses Vite's development server as middleware
24
+ setMiddlewareMode(viteConfigUser)
25
+ : viteConfigUser);
17
26
  const viteServer = server;
18
27
  const viteConfig = server.config;
19
28
  const viteVersion = viteConfig._viteVersionResolved;
@@ -22,9 +31,14 @@ async function dev(options = {}) {
22
31
  await viteServer.listen();
23
32
  if (options.startupLog)
24
33
  startupLog(viteConfig, viteServer);
34
+ if (serverEntryFilePath && serverEntryIsChildProcess)
35
+ await startServerEntry_child(viteServer, serverEntryFilePath);
25
36
  return {
26
37
  viteServer,
27
38
  viteConfig,
28
39
  viteVersion,
29
40
  };
30
41
  }
42
+ function setMiddlewareMode(viteConfig) {
43
+ return { ...viteConfig, server: { ...viteConfig.server, middlewareMode: true } };
44
+ }
@@ -0,0 +1,10 @@
1
+ export { startServerEntry_parent };
2
+ export { startServerEntry_child };
3
+ export { getServerEntryFilePath_ifDevCli };
4
+ export { isServerChildProcess };
5
+ import { type ViteDevServer } from 'vite';
6
+ import './assertEnvApiDev.js';
7
+ declare function startServerEntry_parent(): Promise<never>;
8
+ declare function startServerEntry_child(viteServer: ViteDevServer, serverEntryFilePath: string): Promise<void>;
9
+ declare function getServerEntryFilePath_ifDevCli(): Promise<string | null>;
10
+ declare function isServerChildProcess(): boolean;
@@ -0,0 +1,113 @@
1
+ export { startServerEntry_parent };
2
+ export { startServerEntry_child };
3
+ export { getServerEntryFilePath_ifDevCli };
4
+ export { isServerChildProcess };
5
+ // `$ vike dev` runs +serverEntry.js (if there isn't +server.js) — https://vike.dev/serverEntry
6
+ // - The parent process (`$ vike dev`) runs +serverEntry.js in a child process, and restarts the child process whenever a file imported by +serverEntry.js changes
7
+ // - The child process creates Vite's development server (in middleware mode) and runs +serverEntry.js using Vite's module runner
8
+ import { fork } from 'node:child_process';
9
+ import path from 'node:path';
10
+ import { normalizePath } from 'vite';
11
+ import pc from '@brillout/picocolors';
12
+ import { getVikeConfigInternal } from '../vite/shared/resolveVikeConfigInternal.js';
13
+ import { getServerEntryFilePath_ifDev } from '../vite/plugins/pluginUniversalDeploy/getServerConfig.js';
14
+ import { isVikeCli } from '../cli/context.js';
15
+ import { assert, assertInfo, assertUsage } from '../../utils/assert.js';
16
+ import { isRunnableDevEnvironment } from '../../utils/isRunnableDevEnvironment.js';
17
+ import './assertEnvApiDev.js';
18
+ const IS_SERVER_CHILD_PROCESS = '__VIKE_IS_SERVER_CHILD_PROCESS';
19
+ // The child process exits with this code to tell the parent process to restart it
20
+ const EXIT_CODE_RESTART = 33;
21
+ // Parent process — child_process.fork()
22
+ function startServerEntry_parent() {
23
+ const [scriptPath, ...args] = process.argv.slice(1);
24
+ assert(scriptPath);
25
+ let child;
26
+ let signalReceived;
27
+ const forkChild = () => {
28
+ child = fork(scriptPath, args, { stdio: 'inherit', env: { ...process.env, [IS_SERVER_CHILD_PROCESS]: '1' } });
29
+ child.on('exit', (code, signal) => {
30
+ if (code === EXIT_CODE_RESTART && !signalReceived)
31
+ forkChild();
32
+ else
33
+ exitLikeChild(code, signal ?? signalReceived ?? null);
34
+ });
35
+ };
36
+ const onSignal = (signal) => {
37
+ signalReceived = signal;
38
+ child.kill(signal);
39
+ };
40
+ process.on('SIGINT', onSignal);
41
+ process.on('SIGTERM', onSignal);
42
+ forkChild();
43
+ // The parent process exits when the child process exits
44
+ return new Promise(() => { });
45
+ }
46
+ // Exit with the same exit code or signal as the child process
47
+ function exitLikeChild(code, signal) {
48
+ if (signal) {
49
+ process.removeAllListeners(signal);
50
+ process.kill(process.pid, signal);
51
+ }
52
+ else {
53
+ process.exit(code ?? 1);
54
+ }
55
+ }
56
+ // Child process — viteServer.ssrLoadModule()
57
+ async function startServerEntry_child(viteServer, serverEntryFilePath) {
58
+ const { ssr } = viteServer.environments;
59
+ assertUsage(isRunnableDevEnvironment(ssr), `${pc.cyan('$ vike dev')} cannot run +serverEntry.js because Vite's ${pc.cyan('ssr')} environment isn't runnable`);
60
+ // Restart when +serverEntry.js or a file it imports changes
61
+ restartOnFileChange(viteServer, (filePath) => isImportedBy(ssr.moduleGraph.getModulesByFile(filePath), serverEntryFilePath));
62
+ // The user's server uses the current Vite development server (e.g. `app.use(devMiddleware)`) => we restart the process instead of letting Vite restart itself (e.g. upon vite.config.js changes)
63
+ viteServer.restart = async () => restart('Vite needs to restart');
64
+ try {
65
+ // Same module runner as the one Vike uses to load pages (`ssrLoadModule()`) => a module imported by both +serverEntry.js and a page is instantiated only once (like in production)
66
+ await viteServer.ssrLoadModule(serverEntryFilePath);
67
+ }
68
+ catch (err) {
69
+ console.error(err);
70
+ assertInfo(false, 'Waiting for file changes before restarting server...', { onlyOnce: false });
71
+ restartOnFileChange(viteServer, () => true);
72
+ }
73
+ }
74
+ function restartOnFileChange(viteServer, isRestartNeeded) {
75
+ const onFileChange = (filePath) => {
76
+ filePath = normalizePath(filePath);
77
+ if (isRestartNeeded(filePath))
78
+ restart(`${pc.cyan(path.relative(viteServer.config.root, filePath))} changed`);
79
+ };
80
+ viteServer.watcher.on('change', onFileChange);
81
+ viteServer.watcher.on('unlink', onFileChange);
82
+ }
83
+ function restart(reason) {
84
+ assertInfo(false, `${reason}, restarting server...`, { onlyOnce: false });
85
+ process.exit(EXIT_CODE_RESTART);
86
+ }
87
+ // Only `$ vike dev` runs +serverEntry.js, not the programmatic API `dev()`: the parent process re-runs the command (process.argv) in the child process
88
+ async function getServerEntryFilePath_ifDevCli() {
89
+ if (!isVikeCli())
90
+ return null;
91
+ const vikeConfig = await getVikeConfigInternal();
92
+ const serverEntryFilePath = getServerEntryFilePath_ifDev(vikeConfig);
93
+ return serverEntryFilePath;
94
+ }
95
+ // Whether one of the modules is +serverEntry.js or (transitively) imported by +serverEntry.js
96
+ // - Pages aren't imported by +serverEntry.js: Vike loads them over its own virtual entries => changing a page doesn't restart the server (Vite's HMR handles it)
97
+ function isImportedBy(modules, serverEntryFilePath) {
98
+ const visited = new Set();
99
+ const stack = [...(modules ?? [])];
100
+ while (stack.length > 0) {
101
+ const mod = stack.pop();
102
+ if (visited.has(mod))
103
+ continue;
104
+ visited.add(mod);
105
+ if (mod.file === serverEntryFilePath)
106
+ return true;
107
+ stack.push(...mod.importers);
108
+ }
109
+ return false;
110
+ }
111
+ function isServerChildProcess() {
112
+ return process.env[IS_SERVER_CHILD_PROCESS] === '1';
113
+ }
@@ -1,12 +1,24 @@
1
1
  export { createDevMiddleware };
2
2
  import { createServer } from 'vite';
3
3
  import { prepareViteApiCall } from './api/prepareViteApiCall.js';
4
+ import { getViteDevServer } from '../server/runtime/globalContext.js';
5
+ import { assertWarning } from '../utils/assert.js';
6
+ import pc from '@brillout/picocolors';
4
7
  /*
5
8
  * Create server middleware for development with HMR and lazy-transpiling.
6
9
  *
7
10
  * https://vike.dev/createDevMiddleware
8
11
  */
9
12
  async function createDevMiddleware(options = {}) {
13
+ {
14
+ const viteServer = getViteDevServer();
15
+ if (viteServer) {
16
+ assertWarning(false,
17
+ // E.g. `$ vike dev` already created it (+serverEntry.js, +server.js), or createDevMiddleware() was already called
18
+ `Development middleware already created: use ${pc.cyan('globalContext.devMiddleware')} to access it instead of calling ${pc.cyan('createDevMiddleware()')}`, { onlyOnce: true });
19
+ return { devMiddleware: viteServer.middlewares, viteServer, viteConfig: viteServer.config };
20
+ }
21
+ }
10
22
  const optionsMod = {
11
23
  ...options,
12
24
  viteConfig: {
@@ -21,4 +21,4 @@ declare function resolvePrerenderConfigLocal(pageConfig: PageConfigBuildTime): P
21
21
  declare function isDistServerRemoved(prerenderConfigGlobal: {
22
22
  isPrerenderingEnabledForAllPages: boolean;
23
23
  keepDistServer: boolean;
24
- }): boolean;
24
+ }, vikeConfig: Pick<VikeConfigInternal, '_pageConfigGlobal'>): boolean;
@@ -70,9 +70,12 @@ async function resolvePrerenderConfigLocal(pageConfig) {
70
70
  }
71
71
  // Whether pre-rendering removes dist/server/ once it's done
72
72
  // https://vike.dev/prerender#keepDistServer
73
- function isDistServerRemoved(prerenderConfigGlobal) {
73
+ function isDistServerRemoved(prerenderConfigGlobal, vikeConfig) {
74
74
  if (!prerenderConfigGlobal.isPrerenderingEnabledForAllPages)
75
75
  return false;
76
+ // +serverEntry.js => dist/server/index.mjs is the user's server entry
77
+ if (vikeConfig._pageConfigGlobal.configValueSources.serverEntry)
78
+ return false;
76
79
  return !prerenderConfigGlobal.keepDistServer;
77
80
  }
78
81
  function isObject2(value) {
@@ -76,12 +76,6 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
76
76
  isPrerendering: boolean;
77
77
  _requestId: number;
78
78
  } & import("../../types/PageContext.js").PageContextInit & {
79
- _nodeDev?: {
80
- req: import("http").IncomingMessage;
81
- res: import("http").ServerResponse;
82
- };
83
- _reqWeb?: Request;
84
- } & {
85
79
  _globalContext: ({
86
80
  config: import("../../types/index.js").ConfigResolved;
87
81
  _source: import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").Source;
@@ -118,6 +112,7 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
118
112
  _isPrerendering: false;
119
113
  assetsManifest: null;
120
114
  _viteDevServer: import("vite").ViteDevServer | undefined;
115
+ devMiddleware: import("vite").Connect.Server | null;
121
116
  viteConfig: import("vite").ResolvedConfig | undefined;
122
117
  } | {
123
118
  isClientSide: false;
@@ -126,6 +121,7 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
126
121
  _isProduction: true;
127
122
  assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
128
123
  _viteDevServer: null;
124
+ devMiddleware: null;
129
125
  _usesClientRouter: boolean;
130
126
  _isPrerendering: true;
131
127
  viteConfig: import("vite").ResolvedConfig;
@@ -136,12 +132,11 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
136
132
  _isProduction: true;
137
133
  assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
138
134
  _viteDevServer: null;
135
+ devMiddleware: null;
139
136
  _usesClientRouter: boolean;
140
137
  _isPrerendering: false;
141
138
  viteConfig: null;
142
139
  }) & {
143
- baseServer: string;
144
- baseAssets: string;
145
140
  viteConfigRuntime: {
146
141
  root: string;
147
142
  build: {
@@ -152,6 +147,9 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
152
147
  inject: boolean | undefined;
153
148
  };
154
149
  };
150
+ baseServer: string;
151
+ baseAssets: string;
152
+ middlewares: import("../../server/runtime/universal-middleware/core.js").Middleware[];
155
153
  })) & {
156
154
  prerenderContext: PrerenderContextPublic | undefined;
157
155
  };
@@ -159,12 +157,6 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
159
157
  _baseServer: string;
160
158
  _baseAssets: string;
161
159
  _pageContextInit: import("../../types/PageContext.js").PageContextInit & {
162
- _nodeDev?: {
163
- req: import("http").IncomingMessage;
164
- res: import("http").ServerResponse;
165
- };
166
- _reqWeb?: Request;
167
- } & {
168
160
  headers?: Record<string, unknown>;
169
161
  };
170
162
  _urlHandler: ((url: string) => string) | null;
@@ -142,7 +142,7 @@ async function runPrerender(options = {}, trigger) {
142
142
  const prerenderContextPublic = getPrerenderContextPublic(prerenderContext);
143
143
  objectAssign(vikeConfig.prerenderContext, prerenderContextPublic, true);
144
144
  setGlobalContext_prerenderContext(prerenderContextPublic);
145
- if (isDistServerRemoved(prerenderConfigGlobal)) {
145
+ if (isDistServerRemoved(prerenderConfigGlobal, vikeConfig)) {
146
146
  fs.rmSync(outDirServer, { recursive: true });
147
147
  }
148
148
  }
@@ -147,7 +147,7 @@ async function getPageFileEntries(config, includeAssetsImportedByServer, isServe
147
147
  if (isForClientSide && includeAssetsImportedByServer) {
148
148
  fileTypes.push('.page.server');
149
149
  }
150
- let pageFiles = await findPageFiles(config, fileTypes, false);
150
+ let pageFiles = await findPageFiles(config, fileTypes);
151
151
  const pageFileEntries = {};
152
152
  pageFiles = unique(pageFiles);
153
153
  pageFiles.forEach((pageFile) => {
@@ -184,7 +184,7 @@ async function disableAutoImportIfPrerendering(isBuild) {
184
184
  return;
185
185
  const vikeConfig = await getVikeConfigInternal();
186
186
  const prerenderConfigGlobal = await resolvePrerenderConfigGlobal(vikeConfig);
187
- if (isDistServerRemoved(prerenderConfigGlobal)) {
187
+ if (isDistServerRemoved(prerenderConfigGlobal, vikeConfig)) {
188
188
  return { vitePluginServerEntry: { disableAutoImport: true } };
189
189
  }
190
190
  }
@@ -9,7 +9,7 @@ declare const optimizeDeps: {
9
9
  };
10
10
  readonly ssr: {
11
11
  readonly optimizeDeps: {
12
- readonly exclude: ["@brillout/import", "@brillout/json-serializer", "@brillout/vite-plugin-server-entry", "vike"];
12
+ readonly exclude: ["@brillout/import", "@brillout/json-serializer", "@brillout/vite-plugin-server-entry", "vike", "@universal-middleware/core"];
13
13
  };
14
14
  };
15
15
  };
@@ -65,6 +65,8 @@ const optimizeDeps = {
65
65
  */
66
66
  '@brillout/vite-plugin-server-entry',
67
67
  'vike',
68
+ // Needed so that Vike doesn't get the user's @universal-middleware/core version (that might differ from Vike's @universal-middleware/core version). (Vite pre-bundles one copy per package name for every importer: https://github.com/vitejs/vite/issues/9948)
69
+ '@universal-middleware/core',
68
70
  ],
69
71
  },
70
72
  },
@@ -211,7 +213,7 @@ async function getPageDeps(config, pageConfigs, pageConfigGlobal) {
211
213
  }
212
214
  // V0.4 design
213
215
  {
214
- const pageFiles = await findPageFiles(config, ['.page', '.page.client'], true);
216
+ const pageFiles = await findPageFiles(config, ['.page', '.page.client']);
215
217
  const userRootDir = config.root;
216
218
  pageFiles.forEach((filePathAbsoluteUserRootDir) => {
217
219
  const entry = getFilePathResolved({ filePathAbsoluteUserRootDir, userRootDir });
@@ -1,5 +1,6 @@
1
1
  export { getServerConfig };
2
2
  export { isUniversalDeployVitePreview };
3
+ export { getServerEntryFilePath_ifDev };
3
4
  import type { ResolvedConfig } from 'vite';
4
5
  import type { VikeConfigInternal } from '../../shared/resolveVikeConfigInternal.js';
5
6
  import '../../assertEnvVite.js';
@@ -7,5 +8,7 @@ declare function getServerConfig(vikeConfig: VikeConfigInternal): {
7
8
  serverEntryId: string;
8
9
  serverEntryVike: string;
9
10
  serverFilePath: string | null;
11
+ serverEntryFilePath: string | null;
10
12
  } | undefined;
13
+ declare function getServerEntryFilePath_ifDev(vikeConfig: VikeConfigInternal): string | null;
11
14
  declare function isUniversalDeployVitePreview(vikeConfig: VikeConfigInternal, viteConfigResolved: ResolvedConfig): boolean | null;
@@ -1,5 +1,6 @@
1
1
  export { getServerConfig };
2
2
  export { isUniversalDeployVitePreview };
3
+ export { getServerEntryFilePath_ifDev };
3
4
  import { catchAllEntry } from '@universal-deploy/store';
4
5
  import { assert } from '../../../../utils/assert.js';
5
6
  import '../../assertEnvVite.js';
@@ -7,12 +8,15 @@ function getServerConfig(vikeConfig) {
7
8
  let serverEntryId;
8
9
  let serverFilePath = null;
9
10
  let serverEntryVike;
11
+ const serverEntryFilePath = getServerEntryFilePath(vikeConfig);
10
12
  // universal-deploy support must be manually enabled
11
13
  const serverConfig =
12
14
  // +config.js > `export default { server: true }`
13
15
  vikeConfig.config.server ||
14
16
  // +server.js exists
15
17
  !!vikeConfig._pageConfigGlobal.configValueSources.server ||
18
+ // +serverEntry.js exists
19
+ !!serverEntryFilePath ||
16
20
  false;
17
21
  if (serverConfig === false)
18
22
  return;
@@ -36,12 +40,34 @@ function getServerConfig(vikeConfig) {
36
40
  // It either points to the default fetchable endpoint (vike/fetch), or one defined by the user through +server.
37
41
  serverEntryVike,
38
42
  serverFilePath,
43
+ // +serverEntry.js => it's the production server entry dist/server/index.mjs (instead of @universal-deploy/node's)
44
+ serverEntryFilePath,
39
45
  };
40
46
  }
47
+ // https://vike.dev/serverEntry
48
+ function getServerEntryFilePath(vikeConfig) {
49
+ const source = vikeConfig._pageConfigGlobal.configValueSources.serverEntry?.[0];
50
+ if (!source)
51
+ return null;
52
+ assert(source.valueIsLoaded && source.valueIsFilePath && typeof source.value === 'string');
53
+ assert('filePathAbsoluteFilesystem' in source.definedAt);
54
+ // `source.value` is the import path, e.g. `some-npm-package/serverEntry` if the file cannot be resolved
55
+ return source.definedAt.filePathAbsoluteFilesystem ?? source.value;
56
+ }
57
+ // The +serverEntry.js that `$ vike dev` runs: only if there isn't +server.js (otherwise +serverEntry.js is production-only)
58
+ // https://vike.dev/serverEntry
59
+ function getServerEntryFilePath_ifDev(vikeConfig) {
60
+ if (vikeConfig._pageConfigGlobal.configValueSources.server)
61
+ return null;
62
+ return getServerEntryFilePath(vikeConfig);
63
+ }
41
64
  function isUniversalDeployVitePreview(vikeConfig, viteConfigResolved) {
42
65
  const isServerConfig = getServerConfig(vikeConfig);
43
66
  if (!isServerConfig)
44
67
  return null; // not UD
68
+ // +serverEntry.js => dist/server/index.mjs is the user's server entry => real preview
69
+ if (isServerConfig.serverEntryFilePath)
70
+ return false;
45
71
  // @universal-deploy/node -> real preview
46
72
  // else -> vite preview
47
73
  const udNodePlugin = viteConfigResolved.plugins.find((p) => p.name.match(/^ud:node:(?!.*:disabled$)/));
@@ -1,5 +1,5 @@
1
1
  export { pluginServerEntryAlias };
2
2
  import type { Plugin } from 'vite';
3
3
  import '../../assertEnvVite.js';
4
- /** Alias for virtual:ud:catch if no userland server entry */
4
+ /** `vike:server` => alias for virtual:ud:catch-all, also re-exporting the non-default exports of +server.js (if any) */
5
5
  declare function pluginServerEntryAlias(serverFilePath?: string | null): Plugin;