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.
Files changed (198) hide show
  1. package/dist/client/runtime-client-routing/createPageContextClient.d.ts +5 -0
  2. package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +5 -0
  3. package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +26 -2
  4. package/dist/client/runtime-client-routing/getPageContextFromHooks.js +4 -5
  5. package/dist/client/runtime-client-routing/renderPageClient.d.ts +481 -10
  6. package/dist/client/runtime-client-routing/renderPageClient.js +116 -41
  7. package/dist/client/runtime-client-routing/streamedValues.d.ts +5 -0
  8. package/dist/client/runtime-client-routing/streamedValues.js +23 -0
  9. package/dist/client/runtime-server-routing/createPageContextClient.d.ts +5 -0
  10. package/dist/client/runtime-server-routing/entry.js +1 -1
  11. package/dist/client/runtime-server-routing/getGlobalContextClientInternal.d.ts +5 -0
  12. package/dist/client/shared/getGlobalContextClientInternalShared.d.ts +5 -0
  13. package/dist/client/shared/getGlobalContextClientInternalShared.js +2 -0
  14. package/dist/client/shared/getJsonSerializedInHtml.d.ts +2 -2
  15. package/dist/client/shared/getJsonSerializedInHtml.js +9 -6
  16. package/dist/client/shared/loadPageConfigsLazyClientSide.js +0 -4
  17. package/dist/client/shared/removeFoucBuster.js +14 -3
  18. package/dist/client/shared/streamedValues/asyncIterable.d.ts +4 -0
  19. package/dist/client/shared/streamedValues/asyncIterable.js +26 -0
  20. package/dist/client/shared/streamedValues/lines.d.ts +11 -0
  21. package/dist/client/shared/streamedValues/lines.js +19 -0
  22. package/dist/client/shared/streamedValues/promise.d.ts +4 -0
  23. package/dist/client/shared/streamedValues/promise.js +19 -0
  24. package/dist/client/shared/streamedValues/readableStream.d.ts +4 -0
  25. package/dist/client/shared/streamedValues/readableStream.js +44 -0
  26. package/dist/client/shared/streamedValues/registry.d.ts +21 -0
  27. package/dist/client/shared/streamedValues/registry.js +40 -0
  28. package/dist/client/shared/streamedValues.d.ts +7 -0
  29. package/dist/client/shared/streamedValues.js +82 -0
  30. package/dist/node/api/dev.js +15 -1
  31. package/dist/node/api/resolveViteConfigUser.js +2 -2
  32. package/dist/node/api/serverEntryDev.d.ts +10 -0
  33. package/dist/node/api/serverEntryDev.js +125 -0
  34. package/dist/node/createDevMiddleware.js +12 -0
  35. package/dist/node/prerender/resolvePrerenderConfig.d.ts +1 -1
  36. package/dist/node/prerender/resolvePrerenderConfig.js +4 -1
  37. package/dist/node/prerender/runPrerender.d.ts +18 -18
  38. package/dist/node/prerender/runPrerender.js +61 -16
  39. package/dist/node/vite/assertEnvVite.js +1 -1
  40. package/dist/node/vite/index.js +2 -0
  41. package/dist/node/vite/plugins/build/handleAssetsManifest.js +6 -2
  42. package/dist/node/vite/plugins/build/pluginBuildApp.js +25 -26
  43. package/dist/node/vite/plugins/build/pluginBuildConfig.d.ts +2 -2
  44. package/dist/node/vite/plugins/build/pluginBuildConfig.js +25 -17
  45. package/dist/node/vite/plugins/build/pluginDistFileNames.js +70 -50
  46. package/dist/node/vite/plugins/build/pluginEnvironmentEntries.d.ts +6 -0
  47. package/dist/node/vite/plugins/build/pluginEnvironmentEntries.js +71 -0
  48. package/dist/node/vite/plugins/build/pluginSuppressRollupWarning.js +19 -17
  49. package/dist/node/vite/plugins/pluginCommon.js +10 -7
  50. package/dist/node/vite/plugins/pluginDev/optimizeDeps.d.ts +1 -1
  51. package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +4 -2
  52. package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +6 -4
  53. package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.d.ts +3 -0
  54. package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.js +28 -2
  55. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.d.ts +1 -1
  56. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.js +22 -11
  57. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.d.ts +4 -0
  58. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.js +29 -0
  59. package/dist/node/vite/plugins/pluginUniversalDeploy.js +29 -5
  60. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.d.ts +2 -1
  61. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.js +29 -12
  62. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntryWithOldDesign.js +3 -2
  63. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFilePageEntry.js +7 -7
  64. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.d.ts +10 -6
  65. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js +5 -11
  66. package/dist/node/vite/plugins/pluginVirtualFiles.js +20 -0
  67. package/dist/node/vite/shared/addSsrMiddleware.js +11 -27
  68. package/dist/node/vite/shared/findPageFiles.d.ts +1 -1
  69. package/dist/node/vite/shared/findPageFiles.js +1 -11
  70. package/dist/node/vite/shared/getAssetsDir.d.ts +3 -2
  71. package/dist/node/vite/shared/getAssetsDir.js +3 -3
  72. package/dist/node/vite/shared/isViteCli.d.ts +3 -3
  73. package/dist/node/vite/shared/isViteCli.js +80 -84
  74. package/dist/node/vite/shared/isViteServerSide.js +2 -7
  75. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +6 -4
  76. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +17 -6
  77. package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +9 -2
  78. package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +5 -1
  79. package/dist/node/vite/shared/resolveVikeConfigInternal.js +86 -13
  80. package/dist/server/__internal/fetch-deprecated.d.ts +2 -0
  81. package/dist/server/__internal/fetch-deprecated.js +6 -0
  82. package/dist/server/__internal/fetch.d.ts +9 -0
  83. package/dist/server/__internal/fetch.js +5 -0
  84. package/dist/server/__internal/index.d.ts +1 -0
  85. package/dist/server/__internal/index.js +2 -0
  86. package/dist/server/createPageRenderer.d.ts +2 -2
  87. package/dist/server/createPageRenderer.js +2 -2
  88. package/dist/server/runtime/createDevMiddleware.js +3 -1
  89. package/dist/server/runtime/globalContext.d.ts +69 -10
  90. package/dist/server/runtime/globalContext.js +35 -2
  91. package/dist/server/runtime/index.d.ts +1 -1
  92. package/dist/server/runtime/index.js +1 -1
  93. package/dist/server/runtime/renderPageServer/analyzePage.js +3 -3
  94. package/dist/server/runtime/renderPageServer/createHttpResponse.d.ts +20 -9
  95. package/dist/server/runtime/renderPageServer/createHttpResponse.js +34 -21
  96. package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +13 -23
  97. package/dist/server/runtime/renderPageServer/csp.d.ts +2 -1
  98. package/dist/server/runtime/renderPageServer/csp.js +2 -1
  99. package/dist/server/runtime/renderPageServer/execHookOnError.js +1 -1
  100. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.d.ts +9 -0
  101. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.js +21 -9
  102. package/dist/server/runtime/renderPageServer/getHttpResponseBody.d.ts +2 -2
  103. package/dist/server/runtime/renderPageServer/getHttpResponseBody.js +19 -12
  104. package/dist/server/runtime/renderPageServer/getPageContextJson.d.ts +8 -0
  105. package/dist/server/runtime/renderPageServer/getPageContextJson.js +47 -0
  106. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.d.ts +2 -0
  107. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.js +1 -1
  108. package/dist/server/runtime/renderPageServer/handlePageContextRequestUrl.js +2 -2
  109. package/dist/server/runtime/renderPageServer/headersResponse.d.ts +11 -2
  110. package/dist/server/runtime/renderPageServer/headersResponse.js +22 -2
  111. package/dist/server/runtime/renderPageServer/html/injectAssets/getHtmlTags.js +5 -4
  112. package/dist/server/runtime/renderPageServer/html/injectAssets.d.ts +3 -2
  113. package/dist/server/runtime/renderPageServer/html/injectAssets.js +7 -1
  114. package/dist/server/runtime/renderPageServer/html/renderHtml.js +4 -2
  115. package/dist/server/runtime/renderPageServer/html/serializeContext.d.ts +5 -1
  116. package/dist/server/runtime/renderPageServer/html/serializeContext.js +12 -9
  117. package/dist/server/runtime/renderPageServer/html/stream.d.ts +13 -6
  118. package/dist/server/runtime/renderPageServer/html/stream.js +135 -32
  119. package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.d.ts +30 -0
  120. package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.js +92 -0
  121. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +10 -14
  122. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.js +5 -1
  123. package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.d.ts +15 -0
  124. package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.js +61 -0
  125. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +320 -55
  126. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.js +21 -12
  127. package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.d.ts +4 -0
  128. package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.js +12 -0
  129. package/dist/server/runtime/renderPageServer/streamedValues/lines.d.ts +10 -0
  130. package/dist/server/runtime/renderPageServer/streamedValues/lines.js +49 -0
  131. package/dist/server/runtime/renderPageServer/streamedValues/promise.d.ts +4 -0
  132. package/dist/server/runtime/renderPageServer/streamedValues/promise.js +14 -0
  133. package/dist/server/runtime/renderPageServer/streamedValues/pump.d.ts +10 -0
  134. package/dist/server/runtime/renderPageServer/streamedValues/pump.js +67 -0
  135. package/dist/server/runtime/renderPageServer/streamedValues/readableStream.d.ts +4 -0
  136. package/dist/server/runtime/renderPageServer/streamedValues/readableStream.js +12 -0
  137. package/dist/server/runtime/renderPageServer/streamedValues/registry.d.ts +28 -0
  138. package/dist/server/runtime/renderPageServer/streamedValues/registry.js +33 -0
  139. package/dist/server/runtime/renderPageServer.d.ts +65 -18
  140. package/dist/server/runtime/renderPageServer.js +31 -62
  141. package/dist/server/runtime/universal-middleware/core.d.ts +25 -0
  142. package/dist/server/runtime/universal-middleware/core.js +167 -0
  143. package/dist/server/runtime/universal-middleware/deprecated-export.d.ts +3 -0
  144. package/dist/server/runtime/universal-middleware/deprecated-export.js +10 -0
  145. package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.d.ts +15 -0
  146. package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.js +51 -0
  147. package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.d.ts +9 -0
  148. package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.js +22 -0
  149. package/dist/shared-server-client/createGlobalContextShared.d.ts +8 -0
  150. package/dist/shared-server-client/createGlobalContextShared.js +2 -1
  151. package/dist/shared-server-client/getPageContextPublicShared.js +0 -2
  152. package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.d.ts +8 -0
  153. package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.js +17 -7
  154. package/dist/shared-server-client/hooks/execHook.d.ts +1 -1
  155. package/dist/shared-server-client/hooks/execHook.js +2 -2
  156. package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.js +2 -0
  157. package/dist/shared-server-client/route/abort.d.ts +1 -1
  158. package/dist/shared-server-client/route/abort.js +4 -2
  159. package/dist/shared-server-client/streamedValues.d.ts +22 -0
  160. package/dist/shared-server-client/streamedValues.js +24 -0
  161. package/dist/shared-server-node/vike-environments.d.ts +4 -0
  162. package/dist/shared-server-node/vike-environments.js +10 -0
  163. package/dist/shared-server-node/virtualFileId.d.ts +7 -5
  164. package/dist/shared-server-node/virtualFileId.js +42 -42
  165. package/dist/types/Config.d.ts +10 -2
  166. package/dist/types/GlobalContext.d.ts +3 -3
  167. package/dist/types/PageConfig.d.ts +13 -5
  168. package/dist/types/PageContext.d.ts +18 -10
  169. package/dist/types/PageContext.js +1 -0
  170. package/dist/types/Server.d.ts +1 -1
  171. package/dist/types/VikeNamespace.d.ts +1 -1
  172. package/dist/types/index.d.ts +1 -0
  173. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  174. package/dist/utils/PROJECT_VERSION.js +1 -1
  175. package/dist/utils/assertViteVersion.d.ts +1 -3
  176. package/dist/utils/assertViteVersion.js +6 -9
  177. package/dist/utils/catchInfiniteLoop.js +33 -11
  178. package/dist/utils/deepEqual.d.ts +2 -1
  179. package/dist/utils/deepEqual.js +21 -6
  180. package/dist/utils/getContentTypeFromUrl.d.ts +2 -0
  181. package/dist/utils/getContentTypeFromUrl.js +39 -0
  182. package/dist/utils/injectRollupInputs.d.ts +2 -2
  183. package/dist/utils/injectRollupInputs.js +2 -2
  184. package/dist/utils/installUncaughtErrorHandlers.js +9 -0
  185. package/dist/utils/isDev.js +2 -7
  186. package/dist/utils/parseUrl-extras.js +4 -0
  187. package/fetch.js +2 -2
  188. package/package.json +35 -26
  189. package/universal-middleware.js +2 -2
  190. package/vike-server.d.ts +14 -0
  191. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.d.ts +0 -4
  192. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.js +0 -22
  193. package/dist/server/runtime/fetch.d.ts +0 -10
  194. package/dist/server/runtime/fetch.js +0 -5
  195. package/dist/server/runtime/universal-middleware.d.ts +0 -10
  196. package/dist/server/runtime/universal-middleware.js +0 -27
  197. package/dist/shared-server-client/addIs404ToPageProps.d.ts +0 -2
  198. package/dist/shared-server-client/addIs404ToPageProps.js +0 -17
@@ -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
  },
@@ -191,7 +193,7 @@ async function getPageDeps(config, pageConfigs, pageConfigGlobal) {
191
193
  [...pageConfigs, pageConfigGlobal].forEach((pageConfig) => {
192
194
  Object.entries(pageConfig.configValueSources).forEach(([configName]) => {
193
195
  const runtimeEnv = {
194
- isForClientSide,
196
+ environmentName: isForClientSide ? 'client' : 'server',
195
197
  isDev: true,
196
198
  // TO-DO/eventually/remove-server-router: let's eventually remove support for Server Routing
197
199
  isClientRouting: true,
@@ -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 });
@@ -16,7 +16,10 @@ const filterRolldown = {
16
16
  include: new RegExp(escapeRegex(VIRTUAL_FILE_ID_constantsGlobalThis)),
17
17
  },
18
18
  };
19
- const filterFunction = (id) => id === VIRTUAL_FILE_ID_constantsGlobalThis || id === addVirtualFileIdPrefix(VIRTUAL_FILE_ID_constantsGlobalThis);
19
+ const filterFunction = (id) => id === VIRTUAL_FILE_ID_constantsGlobalThis ||
20
+ // Vite re-resolves the resolved ID and its URL when a plugin adds the module as a watch file (@vitejs/plugin-rsc)
21
+ id === addVirtualFileIdPrefix(VIRTUAL_FILE_ID_constantsGlobalThis) ||
22
+ id === `/@id/__x00__${VIRTUAL_FILE_ID_constantsGlobalThis}`;
20
23
  // ===
21
24
  function pluginReplaceConstantsGlobalThis() {
22
25
  let config;
@@ -63,9 +66,8 @@ function pluginReplaceConstantsGlobalThis() {
63
66
  resolveId: {
64
67
  filter: filterRolldown,
65
68
  handler(id) {
66
- assert(filterFunction(id));
67
- assert(id === VIRTUAL_FILE_ID_constantsGlobalThis);
68
- return addVirtualFileIdPrefix(id);
69
+ assert(filterFunction(id), { id });
70
+ return addVirtualFileIdPrefix(VIRTUAL_FILE_ID_constantsGlobalThis);
69
71
  },
70
72
  },
71
73
  load: {
@@ -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;
@@ -26,22 +30,44 @@ function getServerConfig(vikeConfig) {
26
30
  }
27
31
  else {
28
32
  serverEntryId = catchAllEntry;
29
- serverEntryVike = 'vike/fetch';
33
+ serverEntryVike = 'vike/__internal/fetch';
30
34
  }
31
35
  return {
32
36
  // Used to filter which module ID to transform.
33
37
  // It points to a fully resolved server entry or the virtual universal-deploy catchAll entry.
34
38
  serverEntryId,
35
39
  // This entry will be pushed to universal-deploy via `addEntry`.
36
- // It either points to the default fetchable endpoint (vike/fetch), or one defined by the user through +server.
40
+ // It either points to the default fetchable endpoint (vike/__internal/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;
@@ -1,35 +1,46 @@
1
1
  export { pluginServerEntryAlias };
2
2
  import { catchAllEntry } from '@universal-deploy/store';
3
+ import pc from '@brillout/picocolors';
3
4
  import { pluginCommon } from './common.js';
4
5
  import { escapeRegex } from '../../../../utils/escapeRegex.js';
5
- import { assert } from '../../../../utils/assert.js';
6
+ import { assert, assertWarning } from '../../../../utils/assert.js';
6
7
  import '../../assertEnvVite.js';
7
- const serverEntryAlias = 'vike:server-entry';
8
- const virtualFileId = '\0' + serverEntryAlias;
8
+ const serverAlias = 'vike:server';
9
+ // TO-DO/next-major-release: remove
10
+ const serverAliasDeprecated = 'vike:server-entry';
11
+ const virtualFileId = '\0' + serverAlias;
9
12
  // === Rolldown filter
10
- const filterRolldown = {
13
+ const filterRolldownResolveId = {
11
14
  id: {
12
- include: [new RegExp(escapeRegex(serverEntryAlias)), new RegExp(escapeRegex(virtualFileId))],
15
+ include: [serverAlias, serverAliasDeprecated, virtualFileId].map((id) => new RegExp(`^${escapeRegex(id)}$`)),
16
+ },
17
+ };
18
+ const filterRolldownLoad = {
19
+ id: {
20
+ include: [new RegExp(`^${escapeRegex(virtualFileId)}$`)],
13
21
  },
14
22
  };
15
23
  // ===
16
- /** Alias for virtual:ud:catch if no userland server entry */
24
+ /** `vike:server` => alias for virtual:ud:catch-all, also re-exporting the non-default exports of +server.js (if any) */
17
25
  function pluginServerEntryAlias(serverFilePath) {
18
26
  return {
19
27
  name: 'vike:pluginUniversalDeploy:alias',
20
28
  resolveId: {
21
- filter: filterRolldown,
22
- handler() {
29
+ filter: filterRolldownResolveId,
30
+ handler(id) {
31
+ assert(id === serverAlias || id === serverAliasDeprecated || id === virtualFileId);
32
+ assertWarning(id !== serverAliasDeprecated, `${pc.cyan(serverAliasDeprecated)} is deprecated in favor of ${pc.cyan(serverAlias)}, e.g. replace ${pc.cyan(`"main": "${serverAliasDeprecated}"`)} with ${pc.cyan(`"main": "${serverAlias}"`)} in your wrangler.jsonc`, { onlyOnce: true });
23
33
  if (!serverFilePath)
24
34
  return catchAllEntry;
25
35
  return virtualFileId;
26
36
  },
27
37
  },
28
38
  load: {
29
- filter: filterRolldown,
30
- handler() {
39
+ filter: filterRolldownLoad,
40
+ handler(id) {
41
+ assert(id === virtualFileId);
31
42
  assert(serverFilePath);
32
- // Also re-export non-default exports, to support Durable Objects
43
+ // Also re-export non-default exports, e.g. to support Durable Objects
33
44
  return `import mod from ${JSON.stringify(catchAllEntry)};
34
45
 
35
46
  export * from ${JSON.stringify(serverFilePath)};
@@ -0,0 +1,4 @@
1
+ export { pluginWrapServerFile };
2
+ import type { Plugin } from 'vite';
3
+ import '../../assertEnvVite.js';
4
+ declare function pluginWrapServerFile(serverFilePath: string): Plugin;
@@ -0,0 +1,29 @@
1
+ export { pluginWrapServerFile };
2
+ import { wrapper } from 'vite-plugin-wrapper';
3
+ import { escapeRegex } from '../../../../utils/escapeRegex.js';
4
+ import '../../assertEnvVite.js';
5
+ function pluginWrapServerFile(serverFilePath) {
6
+ return wrapper({
7
+ resolveId: {
8
+ filter: {
9
+ id: new RegExp(`${escapeRegex(serverFilePath)}$`),
10
+ },
11
+ },
12
+ load(id) {
13
+ return [
14
+ // === Side exports
15
+ `export * from ${JSON.stringify(id)};`,
16
+ '',
17
+ // === Default export
18
+ // `vikeFetch` acts as fallback if the user's +server.js doesn't export `fetch`
19
+ // - Example: https://vike.dev/cloudflare#durable-objects
20
+ // - Bloat (when `vikeFetch` isn't used) is negligible
21
+ "import vikeFetch from 'vike/__internal/fetch';",
22
+ `import * as mod from ${JSON.stringify(id)};`,
23
+ // Destructured because mod.default makes Rolldown warn when +server.js has no default export'
24
+ 'const { default: server } = mod;',
25
+ 'export default { ...server, ...server?.prod, fetch: server?.fetch ?? vikeFetch.fetch };',
26
+ ].join('\n');
27
+ },
28
+ });
29
+ }
@@ -6,11 +6,13 @@ import { pluginServerEntryInject } from './pluginUniversalDeploy/pluginServerEnt
6
6
  import { getDeployConfig } from './pluginUniversalDeploy/getDeployConfig.js';
7
7
  import { pluginCommon } from './pluginUniversalDeploy/common.js';
8
8
  import { hasVikeServerOrVikePhoton } from './pluginUniversalDeploy/detectDeprecated.js';
9
- import { getServerConfig } from './pluginUniversalDeploy/getServerConfig.js';
9
+ import { getServerConfig, getServerEntryFilePath_ifDev } from './pluginUniversalDeploy/getServerConfig.js';
10
10
  import { pluginServerEntryAlias } from './pluginUniversalDeploy/pluginServerEntryAlias.js';
11
- import { pluginUnwrapProdOptions } from './pluginUniversalDeploy/pluginUnwrapProdOptions.js';
11
+ import { pluginWrapServerFile } from './pluginUniversalDeploy/pluginWrapServerFile.js';
12
+ import { getViteCliCommand } from '../shared/isViteCli.js';
12
13
  import { unique } from '../../../utils/unique.js';
13
14
  import { assertUsage } from '../../../utils/assert.js';
15
+ import pc from '@brillout/picocolors';
14
16
  import '../assertEnvVite.js';
15
17
  function pluginUniversalDeploy(vikeConfig) {
16
18
  if (hasVikeServerOrVikePhoton(vikeConfig))
@@ -25,9 +27,31 @@ function pluginUniversalDeploy(vikeConfig) {
25
27
  }),
26
28
  precompress(vikeConfig.config.precompress),
27
29
  ];
28
- const { serverEntryVike, serverEntryId, serverFilePath } = serverConfig;
30
+ const { serverEntryVike, serverEntryId, serverFilePath, serverEntryFilePath } = serverConfig;
31
+ const isServerEntryDev = !!getServerEntryFilePath_ifDev(vikeConfig);
32
+ // Vite's CLI always starts Vite's own server => it can't run +serverEntry.js
33
+ assertUsage(!(isServerEntryDev && getViteCliCommand() === 'dev'), `${pc.cyan('+serverEntry.js')} (without ${pc.cyan('+server.js')}) requires ${pc.cyan('$ vike dev')} instead of ${pc.cyan('$ vite dev')} (because Vite's CLI always starts Vite's own server)`);
29
34
  return [
30
- ...universalDeploy({ node: { precompress: vikeConfig.config.precompress } }),
35
+ ...(!serverEntryFilePath
36
+ ? universalDeploy({ node: { precompress: vikeConfig.config.precompress } })
37
+ : [
38
+ // +serverEntry.js is the production server entry dist/server/index.mjs (instead of @universal-deploy/node's server)
39
+ // https://vike.dev/serverEntry
40
+ ...universalDeploy({
41
+ entry: {
42
+ id: serverEntryFilePath,
43
+ // Without +server.js, +serverEntry.js handles requests itself (it calls renderPage() instead of using vike:server) and `$ vike dev` runs it
44
+ catchAll: !isServerEntryDev,
45
+ },
46
+ }),
47
+ precompress(vikeConfig.config.precompress),
48
+ resolveTargets((targets) => {
49
+ const target = targets[0];
50
+ assertUsage(target === undefined, `+serverEntry cannot be used with ${target} (because it uses its own server entry)`);
51
+ }),
52
+ // dist/server/index.mjs loads dist/server/entry.mjs
53
+ pluginServerEntryInject(serverEntryFilePath),
54
+ ]),
31
55
  {
32
56
  name: 'vike:pluginUniversalDeploy:entries',
33
57
  config() {
@@ -55,6 +79,6 @@ function pluginUniversalDeploy(vikeConfig) {
55
79
  },
56
80
  pluginServerEntryInject(serverFilePath ?? serverEntryId),
57
81
  pluginServerEntryAlias(serverFilePath),
58
- !serverFilePath ? null : pluginUnwrapProdOptions(serverFilePath),
82
+ !serverFilePath ? null : pluginWrapServerFile(serverFilePath),
59
83
  ].filter((p) => p !== null);
60
84
  }
@@ -1,3 +1,4 @@
1
1
  export { generateVirtualFileGlobalEntry };
2
+ import type { RuntimeEnvRuntime } from './getConfigValueSourcesRelevant.js';
2
3
  import '../../assertEnvVite.js';
3
- declare function generateVirtualFileGlobalEntry(isForClientSide: boolean, isDev: boolean, id: string, isClientRouting: boolean): Promise<string>;
4
+ declare function generateVirtualFileGlobalEntry(runtimeEnv: RuntimeEnvRuntime, id: string): Promise<string>;
@@ -4,25 +4,31 @@ import { debug } from './debug.js';
4
4
  import { getVikeConfigInternal } from '../../shared/resolveVikeConfigInternal.js';
5
5
  import { serializeConfigValues, } from '../../../../shared-server-client/page-configs/serialize/serializeConfigValues.js';
6
6
  import { VIRTUAL_FILE_ID_constantsGlobalThis } from '../pluginReplaceConstantsGlobalThis.js';
7
+ import { getEnvironmentEntryPlaceholder } from '../build/pluginEnvironmentEntries.js';
7
8
  import '../../assertEnvVite.js';
8
- async function generateVirtualFileGlobalEntry(isForClientSide, isDev, id, isClientRouting) {
9
+ async function generateVirtualFileGlobalEntry(runtimeEnv, id) {
9
10
  const vikeConfig = await getVikeConfigInternal(true);
10
- const { _pageConfigs: pageConfigs, _pageConfigGlobal: pageConfigGlobal } = vikeConfig;
11
- return getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isClientRouting);
11
+ const { _pageConfigs: pageConfigs, _pageConfigGlobal: pageConfigGlobal, _additionalEnvironmentNames: additionalEnvironmentNames, } = vikeConfig;
12
+ return getCode(pageConfigs, pageConfigGlobal, runtimeEnv, id, additionalEnvironmentNames);
12
13
  }
13
- function getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isClientRouting) {
14
+ function getCode(pageConfigs, pageConfigGlobal, runtimeEnv, id, additionalEnvironmentNames) {
14
15
  const lines = [];
15
16
  const importStatements = [];
16
17
  const filesEnv = new Map();
18
+ const { environmentName, isDev } = runtimeEnv;
19
+ const isForClientSide = environmentName === 'client';
17
20
  if (!isForClientSide) {
18
21
  importStatements.push(`import '${VIRTUAL_FILE_ID_constantsGlobalThis}';`);
19
22
  }
20
23
  lines.push('export const pageConfigsSerialized = [');
21
- lines.push(getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, isDev, importStatements, filesEnv));
24
+ lines.push(getCodePageConfigsSerialized(pageConfigs, runtimeEnv, importStatements, filesEnv));
22
25
  lines.push('];');
23
26
  lines.push('export const pageConfigGlobalSerialized = {');
24
- lines.push(getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isClientRouting, isDev, importStatements, filesEnv));
27
+ lines.push(getCodePageConfigGlobalSerialized(pageConfigGlobal, runtimeEnv, importStatements, filesEnv));
25
28
  lines.push('};');
29
+ if (environmentName === 'server') {
30
+ lines.push(getCodeEnvironmentEntries(additionalEnvironmentNames, isDev, importStatements));
31
+ }
26
32
  if (!isForClientSide && isDev) {
27
33
  // https://vite.dev/guide/api-environment-frameworks.html
28
34
  lines.push('if (import.meta.hot) import.meta.hot.accept();');
@@ -31,10 +37,21 @@ function getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isCl
31
37
  if (!isForClientSide) {
32
38
  code = `import '${VIRTUAL_FILE_ID_constantsGlobalThis}';\n` + code;
33
39
  }
34
- debug(id, isForClientSide ? 'CLIENT-SIDE' : 'SERVER-SIDE', code);
40
+ debug(id, `${environmentName.toUpperCase()}-SIDE`, code);
35
41
  return code;
36
42
  }
37
- function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, isDev, importStatements, filesEnv) {
43
+ // The global entries of the additional environments (e.g. `rsc`), loaded by loadPageContextEnvironments.ts
44
+ // - In development, they're loaded with the environment's module runner instead
45
+ function getCodeEnvironmentEntries(additionalEnvironmentNames, isDev, importStatements) {
46
+ const entries = additionalEnvironmentNames.map((name, i) => {
47
+ if (isDev)
48
+ return `${JSON.stringify(name)}: null`;
49
+ importStatements.push(`import * as environmentEntry${i} from ${JSON.stringify(getEnvironmentEntryPlaceholder(name))};`);
50
+ return `${JSON.stringify(name)}: environmentEntry${i}`;
51
+ });
52
+ return `export const environmentEntries = { ${entries.join(', ')} };`;
53
+ }
54
+ function getCodePageConfigsSerialized(pageConfigs, runtimeEnv, importStatements, filesEnv) {
38
55
  const lines = [];
39
56
  pageConfigs.forEach((pageConfig) => {
40
57
  const { pageId, routeFilesystem, isErrorPage } = pageConfig;
@@ -42,20 +59,20 @@ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRout
42
59
  lines.push(` pageId: ${JSON.stringify(pageId)},`);
43
60
  lines.push(` isErrorPage: ${JSON.stringify(isErrorPage)},`);
44
61
  lines.push(` routeFilesystem: ${JSON.stringify(routeFilesystem)},`);
45
- const virtualFileId = JSON.stringify(generateVirtualFileId({ type: 'page-entry', pageId, isForClientSide }));
62
+ const virtualFileId = JSON.stringify(generateVirtualFileId({ type: 'page-entry', pageId, environmentName: runtimeEnv.environmentName }));
46
63
  lines.push(` loadVirtualFilePageEntry: () => ({ moduleId: ${virtualFileId}, moduleExportsPromise: import(${virtualFileId}) }),`);
47
64
  lines.push(` configValuesSerialized: {`);
48
- lines.push(...serializeConfigValues(pageConfig, importStatements, filesEnv, { isForClientSide, isClientRouting, isDev }, ' ', true));
65
+ lines.push(...serializeConfigValues(pageConfig, importStatements, filesEnv, runtimeEnv, ' ', true));
49
66
  lines.push(` },`);
50
67
  lines.push(` },`);
51
68
  });
52
69
  const code = lines.join('\n');
53
70
  return code;
54
71
  }
55
- function getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isClientRouting, isDev, importStatements, filesEnv) {
72
+ function getCodePageConfigGlobalSerialized(pageConfigGlobal, runtimeEnv, importStatements, filesEnv) {
56
73
  const lines = [];
57
74
  lines.push(` configValuesSerialized: {`);
58
- lines.push(...serializeConfigValues(pageConfigGlobal, importStatements, filesEnv, { isForClientSide, isClientRouting, isDev }, ' ', null));
75
+ lines.push(...serializeConfigValues(pageConfigGlobal, importStatements, filesEnv, runtimeEnv, ' ', null));
59
76
  lines.push(` },`);
60
77
  const code = lines.join('\n');
61
78
  return code;
@@ -18,7 +18,8 @@ import '../../assertEnvVite.js';
18
18
  async function generateVirtualFileGlobalEntryWithOldDesign(id, options, config, env, isDev) {
19
19
  const idParsed = parseVirtualFileId(id);
20
20
  assert(idParsed && idParsed.type === 'global-entry');
21
- const { isForClientSide, isClientRouting } = idParsed;
21
+ const { environmentName, isClientRouting } = idParsed;
22
+ const isForClientSide = environmentName === 'client';
22
23
  assert(isForClientSide === !isViteServerSide_extraSafe(config, env, options));
23
24
  const code = await getCode(config, isForClientSide, isClientRouting, isDev, id);
24
25
  return code;
@@ -75,7 +76,7 @@ export const pageFilesExportNamesEager = {};
75
76
  export const pageFilesList = [];
76
77
  export const neverLoaded = {};
77
78
 
78
- ${await generateVirtualFileGlobalEntry(isForClientSide, isDev, id, isClientRouting)}
79
+ ${await generateVirtualFileGlobalEntry({ environmentName: isForClientSide ? 'client' : 'server', isClientRouting, isDev }, id)}
79
80
 
80
81
  `;
81
82
  const vikeConfig = await getVikeConfigInternal();
@@ -18,7 +18,7 @@ async function generateVirtualFilePageEntry(id, isDev) {
18
18
  assert(result.isForClientSide === isForClientSide)
19
19
  }
20
20
  */
21
- const { pageId, isForClientSide } = result;
21
+ const { pageId, environmentName } = result;
22
22
  const vikeConfig = await getVikeConfigInternal(true);
23
23
  const { _pageConfigs: pageConfigs } = vikeConfig;
24
24
  const pageConfig = pageConfigs.find((pageConfig) => pageConfig.pageId === pageId);
@@ -31,20 +31,20 @@ async function generateVirtualFilePageEntry(id, isDev) {
31
31
  throw getProjectError(`Outdated request. Try again. ${getDebugInfoStr({ id, pageId })}`);
32
32
  }
33
33
  }
34
- const code = getCode(pageConfig, isForClientSide, pageId, resolveIncludeAssetsImportedByServer(vikeConfig.config), isDev);
35
- debug(id, isForClientSide ? 'CLIENT-SIDE' : 'SERVER-SIDE', code);
34
+ const code = getCode(pageConfig, environmentName, pageId, resolveIncludeAssetsImportedByServer(vikeConfig.config), isDev);
35
+ debug(id, `${environmentName.toUpperCase()}-SIDE`, code);
36
36
  return code;
37
37
  }
38
- function getCode(pageConfig, isForClientSide, pageId, includeAssetsImportedByServer, isDev) {
38
+ function getCode(pageConfig, environmentName, pageId, includeAssetsImportedByServer, isDev) {
39
39
  const lines = [];
40
40
  const importStatements = [];
41
41
  const filesEnv = new Map();
42
42
  const isClientRouting = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
43
43
  lines.push('export const configValuesSerialized = {');
44
- lines.push(...serializeConfigValues(pageConfig, importStatements, filesEnv, { isForClientSide, isClientRouting, isDev }, '', false));
44
+ lines.push(...serializeConfigValues(pageConfig, importStatements, filesEnv, { environmentName, isClientRouting, isDev }, '', false));
45
45
  lines.push('};');
46
- if (!handleAssetsManifest_isFixEnabled() && includeAssetsImportedByServer && isForClientSide && !isDev) {
47
- importStatements.push(`import '${extractAssetsAddQuery(generateVirtualFileId({ type: 'page-entry', pageId, isForClientSide: false }))}'`);
46
+ if (!handleAssetsManifest_isFixEnabled() && includeAssetsImportedByServer && environmentName === 'client' && !isDev) {
47
+ importStatements.push(`import '${extractAssetsAddQuery(generateVirtualFileId({ type: 'page-entry', pageId, environmentName: 'server' }))}'`);
48
48
  }
49
49
  const code = [...importStatements, ...lines].join('\n');
50
50
  return code;
@@ -3,14 +3,18 @@ export { getConfigValueSourceRelevantAnyEnv };
3
3
  export { isRuntimeEnvMatch };
4
4
  export { isConfigSourceValueNull };
5
5
  export type { RuntimeEnv };
6
+ export type { RuntimeEnvRuntime };
6
7
  import type { ConfigEnv, ConfigValueSource, PageConfigBuildTime, PageConfigGlobalBuildTime } from '../../../../types/PageConfig.js';
7
8
  import '../../assertEnvVite.js';
8
- type RuntimeEnv = {
9
- isForClientSide: boolean;
10
- isClientRouting: boolean;
11
- isDev?: boolean;
12
- } | {
13
- isForConfig: true;
9
+ type RuntimeEnv = (RuntimeEnvRuntime & {
10
+ isConfigEnvironment?: undefined;
11
+ }) | {
12
+ isConfigEnvironment: true;
13
+ };
14
+ type RuntimeEnvRuntime = {
15
+ environmentName: string;
16
+ isClientRouting?: boolean;
17
+ isDev: boolean;
14
18
  };
15
19
  type PageConfigPartial = Pick<PageConfigBuildTime | PageConfigGlobalBuildTime, 'configValueSources' | 'configDefinitions'>;
16
20
  declare function getConfigValueSourcesRelevant(configName: string, runtimeEnv: RuntimeEnv, pageConfig: PageConfigPartial): ConfigValueSource[];
@@ -44,19 +44,13 @@ function getConfigValueSourceRelevantAnyEnv(configName, pageConfig) {
44
44
  return source;
45
45
  }
46
46
  function isRuntimeEnvMatch(configEnv, runtimeEnv) {
47
- if ('isForConfig' in runtimeEnv)
47
+ if (runtimeEnv.isConfigEnvironment)
48
48
  return !!configEnv.config;
49
49
  // Runtime
50
- if (!runtimeEnv.isForClientSide) {
51
- if (!configEnv.server)
52
- return false;
53
- }
54
- else {
55
- if (!configEnv.client)
56
- return false;
57
- if (configEnv.client === 'if-client-routing' && !runtimeEnv.isClientRouting)
58
- return false;
59
- }
50
+ if (!configEnv[runtimeEnv.environmentName])
51
+ return false;
52
+ if (runtimeEnv.environmentName === 'client' && configEnv.clientRoutingOnly && !runtimeEnv.isClientRouting)
53
+ return false;
60
54
  // Production/development
61
55
  if (configEnv.production !== undefined) {
62
56
  assert(typeof configEnv.production === 'boolean');
@@ -2,6 +2,7 @@ export { pluginVirtualFiles };
2
2
  import { normalizePath } from 'vite';
3
3
  import { generateVirtualFilePageEntry } from './pluginVirtualFiles/generateVirtualFilePageEntry.js';
4
4
  import { generateVirtualFileGlobalEntryWithOldDesign } from './pluginVirtualFiles/generateVirtualFileGlobalEntryWithOldDesign.js';
5
+ import { generateVirtualFileGlobalEntry } from './pluginVirtualFiles/generateVirtualFileGlobalEntry.js';
5
6
  import { escapeRegex } from '../../../utils/escapeRegex.js';
6
7
  import { isScriptFile } from '../../../utils/isScriptFile.js';
7
8
  import { addVirtualFileIdPrefix, isVirtualFileId, removeVirtualFileIdPrefix, virtualFileIdPrefix1, virtualFileIdPrefix2, } from '../../../utils/virtualFileId.js';
@@ -9,6 +10,8 @@ import { assert } from '../../../utils/assert.js';
9
10
  import { assertPosixPath } from '../../../utils/path.js';
10
11
  import { parseVirtualFileId } from '../../../shared-server-node/virtualFileId.js';
11
12
  import { reloadVikeConfig, isV1Design, getVikeConfigInternalOptional } from '../shared/resolveVikeConfigInternal.js';
13
+ import { isEnvironmentBuiltIn } from '../../../shared-server-node/vike-environments.js';
14
+ import { isRunnableDevEnvironment } from '../../../utils/isRunnableDevEnvironment.js';
12
15
  import pc from '@brillout/picocolors';
13
16
  import { logConfigInfo } from '../shared/loggerDev.js';
14
17
  import { getFilePathToShowToUserModule } from '../shared/getFilePath.js';
@@ -73,6 +76,9 @@ function pluginVirtualFiles() {
73
76
  return code;
74
77
  }
75
78
  if (idParsed.type === 'global-entry') {
79
+ if (!isEnvironmentBuiltIn(idParsed.environmentName)) {
80
+ return generateVirtualFileGlobalEntry({ environmentName: idParsed.environmentName, isDev }, id);
81
+ }
76
82
  const code = await generateVirtualFileGlobalEntryWithOldDesign(id, options, config, this.environment, isDev);
77
83
  return code;
78
84
  }
@@ -179,6 +185,20 @@ function invalidateVikeVirtualFiles(server) {
179
185
  vikeVirtualFiles.forEach((mod) => {
180
186
  server.moduleGraph.invalidateModule(mod);
181
187
  });
188
+ // - `server.moduleGraph` only covers the `client` and `ssr` environments, while additional environments (e.g. `rsc`) also load Vike's virtual files
189
+ Object.values(server.environments).forEach((environment) => {
190
+ environment.moduleGraph.idToModuleMap.forEach((mod, id) => {
191
+ if (parseVirtualFileId(id))
192
+ environment.moduleGraph.invalidateModule(mod);
193
+ });
194
+ if (!isRunnableDevEnvironment(environment))
195
+ return;
196
+ const { evaluatedModules } = environment.runner;
197
+ evaluatedModules.idToModuleMap.forEach((mod, id) => {
198
+ if (parseVirtualFileId(id))
199
+ evaluatedModules.invalidateModule(mod);
200
+ });
201
+ });
182
202
  }
183
203
  function getVikeVirtualFiles(server) {
184
204
  const vikeVirtualFiles = Array.from(server.moduleGraph.urlToModuleMap.keys())
@@ -1,8 +1,10 @@
1
1
  export { addSsrMiddleware };
2
- import { renderPageServer } from '../../../server/runtime/renderPageServer.js';
3
- import { assertWarning } from '../../../utils/assert.js';
4
- import pc from '@brillout/picocolors';
2
+ import { vikeUniversalMiddleware } from '../../../server/runtime/universal-middleware/vikeUniversalMiddleware.js';
3
+ import { getAdapterRuntime } from '@universal-middleware/core';
4
+ import { createRequestAdapter } from '@universal-middleware/node/request';
5
+ import { sendResponse } from '@universal-middleware/node/response';
5
6
  import '../assertEnvVite.js';
7
+ const requestAdapter = createRequestAdapter();
6
8
  function addSsrMiddleware(middlewares, config, isPreview, isPrerenderingEnabled) {
7
9
  middlewares.use(async (req, res, next) => {
8
10
  if (res.headersSent)
@@ -10,26 +12,11 @@ function addSsrMiddleware(middlewares, config, isPreview, isPrerenderingEnabled)
10
12
  const url = req.originalUrl || req.url;
11
13
  if (!url)
12
14
  return next();
13
- const { headers } = req;
14
- const pageContextInit = {
15
- urlOriginal: url,
16
- headersOriginal: headers,
17
- _nodeDev: { req, res },
18
- };
19
- Object.defineProperty(pageContextInit, 'userAgent', {
20
- get() {
21
- // TO-DO/next-major-release: assertUsage() instead of assertWarning()
22
- assertWarning(false, `${pc.cyan('pageContext.userAgent')} is deprecated: use ${pc.cyan("pageContext.headers['user-agent']")} instead.`, {
23
- showStackTrace: true,
24
- onlyOnce: true,
25
- });
26
- return headers['user-agent'];
27
- },
28
- enumerable: false,
29
- });
30
- let pageContext;
15
+ let response;
31
16
  try {
32
- pageContext = await renderPageServer(pageContextInit);
17
+ const runtime = Object.assign(getAdapterRuntime('other', { params: undefined }), { req, res });
18
+ const context = { urlOriginal: url };
19
+ response = await vikeUniversalMiddleware(requestAdapter(req, res), context, runtime);
33
20
  }
34
21
  catch (err) {
35
22
  // Throwing an error in a connect middleware shuts down the server
@@ -39,7 +26,7 @@ function addSsrMiddleware(middlewares, config, isPreview, isPrerenderingEnabled)
39
26
  // - We purposely don't use next(err) to align behavior: we use our own/copied implementation of buildErrorMessage() regardless of whether the user uses Vite's dev middleware or Vite's standalone dev server
40
27
  return next();
41
28
  }
42
- if (pageContext.httpResponse.statusCode === 404 && isPreview && isPrerenderingEnabled) {
29
+ if (response.status === 404 && isPreview && isPrerenderingEnabled) {
43
30
  // Serve /dist/client/404.html instead
44
31
  return next();
45
32
  }
@@ -49,9 +36,6 @@ function addSsrMiddleware(middlewares, config, isPreview, isPrerenderingEnabled)
49
36
  if (value)
50
37
  res.setHeader(name, value);
51
38
  }
52
- const { httpResponse } = pageContext;
53
- httpResponse.headers.forEach(([name, value]) => res.setHeader(name, value));
54
- res.statusCode = httpResponse.statusCode;
55
- httpResponse.pipe(res);
39
+ await sendResponse(response, res);
56
40
  });
57
41
  }
@@ -2,4 +2,4 @@ export { findPageFiles };
2
2
  import type { ResolvedConfig } from 'vite';
3
3
  import type { FileType } from '../../../shared-server-client/getPageFiles/fileTypes.js';
4
4
  import '../assertEnvVite.js';
5
- declare function findPageFiles(config: ResolvedConfig, fileTypes: FileType[], isDev: boolean): Promise<string[]>;
5
+ declare function findPageFiles(config: ResolvedConfig, fileTypes: FileType[]): Promise<string[]>;