vike 0.4.267 → 0.4.268-commit-ca58695

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/RenderErrorPage.js +2 -2
  2. package/abort.js +2 -2
  3. package/dist/client/__internal/index.d.ts +3 -0
  4. package/dist/client/__internal/index.js +4 -0
  5. package/dist/client/runtime-client-routing/createPageContextClient.d.ts +5 -0
  6. package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +5 -0
  7. package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +28 -2
  8. package/dist/client/runtime-client-routing/getPageContextFromHooks.js +5 -5
  9. package/dist/client/runtime-client-routing/renderPageClient.d.ts +490 -10
  10. package/dist/client/runtime-client-routing/renderPageClient.js +149 -43
  11. package/dist/client/runtime-client-routing/streamedValues.d.ts +5 -0
  12. package/dist/client/runtime-client-routing/streamedValues.js +23 -0
  13. package/dist/client/runtime-server-routing/createPageContextClient.d.ts +5 -0
  14. package/dist/client/runtime-server-routing/entry.js +1 -1
  15. package/dist/client/runtime-server-routing/getGlobalContextClientInternal.d.ts +5 -0
  16. package/dist/client/shared/getGlobalContextClientInternalShared.d.ts +5 -0
  17. package/dist/client/shared/getGlobalContextClientInternalShared.js +2 -0
  18. package/dist/client/shared/getJsonSerializedInHtml.d.ts +2 -2
  19. package/dist/client/shared/getJsonSerializedInHtml.js +9 -6
  20. package/dist/client/shared/loadPageConfigsLazyClientSide.js +0 -4
  21. package/dist/client/shared/removeFoucBuster.js +14 -3
  22. package/dist/client/shared/streamedValues/asyncIterable.d.ts +4 -0
  23. package/dist/client/shared/streamedValues/asyncIterable.js +26 -0
  24. package/dist/client/shared/streamedValues/lines.d.ts +11 -0
  25. package/dist/client/shared/streamedValues/lines.js +19 -0
  26. package/dist/client/shared/streamedValues/promise.d.ts +4 -0
  27. package/dist/client/shared/streamedValues/promise.js +19 -0
  28. package/dist/client/shared/streamedValues/readableStream.d.ts +4 -0
  29. package/dist/client/shared/streamedValues/readableStream.js +44 -0
  30. package/dist/client/shared/streamedValues/registry.d.ts +21 -0
  31. package/dist/client/shared/streamedValues/registry.js +40 -0
  32. package/dist/client/shared/streamedValues.d.ts +7 -0
  33. package/dist/client/shared/streamedValues.js +82 -0
  34. package/dist/node/api/dev.js +15 -1
  35. package/dist/node/api/resolveViteConfigUser.js +2 -2
  36. package/dist/node/api/serverEntryDev.d.ts +10 -0
  37. package/dist/node/api/serverEntryDev.js +125 -0
  38. package/dist/node/createDevMiddleware.js +12 -0
  39. package/dist/node/prerender/resolvePrerenderConfig.d.ts +1 -1
  40. package/dist/node/prerender/resolvePrerenderConfig.js +4 -1
  41. package/dist/node/prerender/runPrerender.d.ts +18 -18
  42. package/dist/node/prerender/runPrerender.js +61 -16
  43. package/dist/node/vite/assertEnvVite.js +1 -1
  44. package/dist/node/vite/index.js +2 -0
  45. package/dist/node/vite/plugins/build/handleAssetsManifest.js +6 -2
  46. package/dist/node/vite/plugins/build/pluginBuildApp.js +25 -26
  47. package/dist/node/vite/plugins/build/pluginBuildConfig.d.ts +2 -2
  48. package/dist/node/vite/plugins/build/pluginBuildConfig.js +25 -17
  49. package/dist/node/vite/plugins/build/pluginDistFileNames.js +70 -50
  50. package/dist/node/vite/plugins/build/pluginEnvironmentEntries.d.ts +6 -0
  51. package/dist/node/vite/plugins/build/pluginEnvironmentEntries.js +71 -0
  52. package/dist/node/vite/plugins/build/pluginSuppressRollupWarning.js +19 -17
  53. package/dist/node/vite/plugins/pluginCommon.js +10 -7
  54. package/dist/node/vite/plugins/pluginDev/optimizeDeps.d.ts +2 -2
  55. package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +6 -2
  56. package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +6 -4
  57. package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.d.ts +3 -0
  58. package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.js +28 -2
  59. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.d.ts +1 -1
  60. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.js +22 -11
  61. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.d.ts +4 -0
  62. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.js +29 -0
  63. package/dist/node/vite/plugins/pluginUniversalDeploy.js +29 -5
  64. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.d.ts +2 -1
  65. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.js +29 -12
  66. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntryWithOldDesign.js +3 -2
  67. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFilePageEntry.js +7 -7
  68. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.d.ts +10 -6
  69. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js +5 -11
  70. package/dist/node/vite/plugins/pluginVirtualFiles.js +20 -0
  71. package/dist/node/vite/shared/addSsrMiddleware.js +11 -27
  72. package/dist/node/vite/shared/findPageFiles.d.ts +1 -1
  73. package/dist/node/vite/shared/findPageFiles.js +1 -11
  74. package/dist/node/vite/shared/getAssetsDir.d.ts +3 -2
  75. package/dist/node/vite/shared/getAssetsDir.js +3 -3
  76. package/dist/node/vite/shared/isViteCli.d.ts +3 -3
  77. package/dist/node/vite/shared/isViteCli.js +80 -84
  78. package/dist/node/vite/shared/isViteServerSide.js +2 -7
  79. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +6 -4
  80. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +17 -6
  81. package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +9 -2
  82. package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +5 -1
  83. package/dist/node/vite/shared/resolveVikeConfigInternal.js +86 -13
  84. package/dist/server/__internal/fetch-deprecated.d.ts +2 -0
  85. package/dist/server/__internal/fetch-deprecated.js +6 -0
  86. package/dist/server/__internal/fetch.d.ts +9 -0
  87. package/dist/server/__internal/fetch.js +5 -0
  88. package/dist/server/__internal/index.d.ts +4 -0
  89. package/dist/server/__internal/index.js +8 -0
  90. package/dist/server/createPageRenderer.d.ts +2 -2
  91. package/dist/server/createPageRenderer.js +2 -2
  92. package/dist/server/runtime/createDevMiddleware.js +3 -1
  93. package/dist/server/runtime/globalContext.d.ts +69 -10
  94. package/dist/server/runtime/globalContext.js +35 -2
  95. package/dist/server/runtime/index.d.ts +1 -1
  96. package/dist/server/runtime/index.js +1 -1
  97. package/dist/server/runtime/renderPageServer/analyzePage.js +3 -3
  98. package/dist/server/runtime/renderPageServer/createHttpResponse.d.ts +20 -9
  99. package/dist/server/runtime/renderPageServer/createHttpResponse.js +34 -21
  100. package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +13 -23
  101. package/dist/server/runtime/renderPageServer/csp.d.ts +2 -1
  102. package/dist/server/runtime/renderPageServer/csp.js +2 -1
  103. package/dist/server/runtime/renderPageServer/execHookOnError.js +1 -1
  104. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.d.ts +9 -0
  105. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.js +21 -9
  106. package/dist/server/runtime/renderPageServer/getHttpResponseBody.d.ts +2 -2
  107. package/dist/server/runtime/renderPageServer/getHttpResponseBody.js +19 -12
  108. package/dist/server/runtime/renderPageServer/getPageContextJson.d.ts +8 -0
  109. package/dist/server/runtime/renderPageServer/getPageContextJson.js +47 -0
  110. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.d.ts +2 -0
  111. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.js +1 -1
  112. package/dist/server/runtime/renderPageServer/handlePageContextRequestUrl.js +2 -2
  113. package/dist/server/runtime/renderPageServer/headersResponse.d.ts +11 -2
  114. package/dist/server/runtime/renderPageServer/headersResponse.js +22 -2
  115. package/dist/server/runtime/renderPageServer/html/injectAssets/getHtmlTags.js +5 -4
  116. package/dist/server/runtime/renderPageServer/html/injectAssets.d.ts +3 -2
  117. package/dist/server/runtime/renderPageServer/html/injectAssets.js +7 -1
  118. package/dist/server/runtime/renderPageServer/html/renderHtml.js +4 -2
  119. package/dist/server/runtime/renderPageServer/html/serializeContext.d.ts +5 -1
  120. package/dist/server/runtime/renderPageServer/html/serializeContext.js +12 -9
  121. package/dist/server/runtime/renderPageServer/html/stream.d.ts +13 -6
  122. package/dist/server/runtime/renderPageServer/html/stream.js +135 -32
  123. package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.d.ts +30 -0
  124. package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.js +92 -0
  125. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +10 -14
  126. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.js +5 -1
  127. package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.d.ts +15 -0
  128. package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.js +61 -0
  129. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +320 -55
  130. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.js +21 -12
  131. package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.d.ts +4 -0
  132. package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.js +12 -0
  133. package/dist/server/runtime/renderPageServer/streamedValues/lines.d.ts +10 -0
  134. package/dist/server/runtime/renderPageServer/streamedValues/lines.js +49 -0
  135. package/dist/server/runtime/renderPageServer/streamedValues/promise.d.ts +4 -0
  136. package/dist/server/runtime/renderPageServer/streamedValues/promise.js +14 -0
  137. package/dist/server/runtime/renderPageServer/streamedValues/pump.d.ts +10 -0
  138. package/dist/server/runtime/renderPageServer/streamedValues/pump.js +67 -0
  139. package/dist/server/runtime/renderPageServer/streamedValues/readableStream.d.ts +4 -0
  140. package/dist/server/runtime/renderPageServer/streamedValues/readableStream.js +12 -0
  141. package/dist/server/runtime/renderPageServer/streamedValues/registry.d.ts +28 -0
  142. package/dist/server/runtime/renderPageServer/streamedValues/registry.js +33 -0
  143. package/dist/server/runtime/renderPageServer.d.ts +65 -18
  144. package/dist/server/runtime/renderPageServer.js +33 -62
  145. package/dist/server/runtime/universal-middleware/core.d.ts +25 -0
  146. package/dist/server/runtime/universal-middleware/core.js +167 -0
  147. package/dist/server/runtime/universal-middleware/deprecated-export.d.ts +3 -0
  148. package/dist/server/runtime/universal-middleware/deprecated-export.js +10 -0
  149. package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.d.ts +15 -0
  150. package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.js +51 -0
  151. package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.d.ts +9 -0
  152. package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.js +22 -0
  153. package/dist/shared-server-client/createGlobalContextShared.d.ts +8 -0
  154. package/dist/shared-server-client/createGlobalContextShared.js +2 -1
  155. package/dist/shared-server-client/getPageContextPublicShared.js +1 -3
  156. package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.d.ts +8 -0
  157. package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.js +17 -7
  158. package/dist/shared-server-client/hooks/execHook.d.ts +1 -1
  159. package/dist/shared-server-client/hooks/execHook.js +2 -2
  160. package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.js +2 -0
  161. package/dist/shared-server-client/route/abort.d.ts +1 -1
  162. package/dist/shared-server-client/route/abort.js +4 -2
  163. package/dist/shared-server-client/streamedValues.d.ts +22 -0
  164. package/dist/shared-server-client/streamedValues.js +24 -0
  165. package/dist/shared-server-node/vike-environments.d.ts +4 -0
  166. package/dist/shared-server-node/vike-environments.js +10 -0
  167. package/dist/shared-server-node/virtualFileId.d.ts +7 -5
  168. package/dist/shared-server-node/virtualFileId.js +42 -42
  169. package/dist/types/Config.d.ts +11 -3
  170. package/dist/types/GlobalContext.d.ts +3 -3
  171. package/dist/types/PageConfig.d.ts +13 -5
  172. package/dist/types/PageContext.d.ts +18 -10
  173. package/dist/types/PageContext.js +1 -0
  174. package/dist/types/Server.d.ts +1 -1
  175. package/dist/types/VikeNamespace.d.ts +1 -1
  176. package/dist/types/index.d.ts +1 -0
  177. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  178. package/dist/utils/PROJECT_VERSION.js +1 -1
  179. package/dist/utils/assertViteVersion.d.ts +1 -3
  180. package/dist/utils/assertViteVersion.js +6 -9
  181. package/dist/utils/catchInfiniteLoop.js +33 -11
  182. package/dist/utils/deepEqual.d.ts +2 -1
  183. package/dist/utils/deepEqual.js +21 -6
  184. package/dist/utils/getContentTypeFromUrl.d.ts +2 -0
  185. package/dist/utils/getContentTypeFromUrl.js +39 -0
  186. package/dist/utils/injectRollupInputs.d.ts +2 -2
  187. package/dist/utils/injectRollupInputs.js +2 -2
  188. package/dist/utils/installUncaughtErrorHandlers.js +9 -0
  189. package/dist/utils/isDev.js +2 -7
  190. package/dist/utils/parseUrl-extras.js +4 -0
  191. package/fetch.js +2 -2
  192. package/modifyUrl.js +2 -2
  193. package/package.json +42 -26
  194. package/routing.js +2 -2
  195. package/universal-middleware.js +2 -2
  196. package/vike-server.d.ts +14 -0
  197. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.d.ts +0 -4
  198. package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.js +0 -22
  199. package/dist/server/runtime/fetch.d.ts +0 -10
  200. package/dist/server/runtime/fetch.js +0 -5
  201. package/dist/server/runtime/universal-middleware.d.ts +0 -10
  202. package/dist/server/runtime/universal-middleware.js +0 -27
  203. package/dist/shared-server-client/addIs404ToPageProps.d.ts +0 -2
  204. package/dist/shared-server-client/addIs404ToPageProps.js +0 -17
@@ -0,0 +1,21 @@
1
+ export { createReceiver };
2
+ export type { StreamedValueType };
3
+ import { type Reviver } from '@brillout/json-serializer/parse';
4
+ import type { Line } from '../../../shared-server-client/streamedValues.js';
5
+ import '../../assertEnvClient.js';
6
+ type StreamedValueType = {
7
+ marker: string;
8
+ /** `parseValue()` parses the value of a `v` line, which can contain further streamed values */
9
+ revive: (parseValue: (value: unknown) => unknown) => StreamedValue;
10
+ };
11
+ type StreamedValue = {
12
+ value: unknown;
13
+ push: (line: Line) => void;
14
+ fail: (err: unknown) => void;
15
+ };
16
+ declare function createReceiver(): {
17
+ reviver: Reviver;
18
+ onLine(lineStr: string): void;
19
+ /** The response failed, ended or was cancelled: the values that didn't end fail */
20
+ fail(err: unknown): void;
21
+ };
@@ -0,0 +1,40 @@
1
+ // The types of streamed pageContext values (see shared-server-client/streamedValues.ts), and the receiver: its reviver
2
+ // replaces the markers with values, which it then feeds with their lines.
3
+ export { createReceiver };
4
+ import { parseTransform } from '@brillout/json-serializer/parse';
5
+ import { assert } from '../../../utils/assert.js';
6
+ import { readableStream } from './readableStream.js';
7
+ import { promise } from './promise.js';
8
+ import { asyncIterable } from './asyncIterable.js';
9
+ import '../../assertEnvClient.js';
10
+ const types = [readableStream, promise, asyncIterable];
11
+ function createReceiver() {
12
+ const streamedValues = new Map();
13
+ const parseValue = (value) => parseTransform(value, { reviver });
14
+ const reviver = (_path, value) => {
15
+ const type = types.find((type) => value.startsWith(type.marker));
16
+ if (!type)
17
+ return undefined;
18
+ const id = value.slice(type.marker.length);
19
+ assert(/^\d+$/.test(id));
20
+ // The same value referenced twice
21
+ let streamedValue = streamedValues.get(Number(id));
22
+ if (!streamedValue) {
23
+ streamedValue = type.revive(parseValue);
24
+ streamedValues.set(Number(id), streamedValue);
25
+ }
26
+ return { replacement: streamedValue.value };
27
+ };
28
+ return {
29
+ reviver,
30
+ onLine(lineStr) {
31
+ const line = JSON.parse(lineStr);
32
+ // Unknown if contained in a chunk nobody read
33
+ streamedValues.get(line.s)?.push(line);
34
+ },
35
+ /** The response failed, ended or was cancelled: the values that didn't end fail */
36
+ fail(err) {
37
+ streamedValues.forEach((streamedValue) => streamedValue.fail(err));
38
+ },
39
+ };
40
+ }
@@ -0,0 +1,7 @@
1
+ export { parsePageContextHtml };
2
+ export { readPageContextJsonStreamed };
3
+ export { cancelStreamedValues };
4
+ import '../assertEnvClient.js';
5
+ declare function parsePageContextHtml(pageContextJson: string): unknown;
6
+ declare function readPageContextJsonStreamed(response: Response): Promise<Record<string, unknown>>;
7
+ declare function cancelStreamedValues(pageContext: object, isRendered: boolean): void;
@@ -0,0 +1,82 @@
1
+ // Streamed pageContext values, client-side (see shared-server-client/streamedValues.ts): the lines that follow the
2
+ // serialized pageContext feed the values of a receiver (see ./streamedValues/registry.ts).
3
+ //
4
+ // Loaded only if the pageContext has streamed values (see getJsonSerializedInHtml.ts and
5
+ // ../runtime-client-routing/streamedValues.ts).
6
+ export { parsePageContextHtml };
7
+ export { readPageContextJsonStreamed };
8
+ export { cancelStreamedValues };
9
+ import { parse } from '@brillout/json-serializer/parse';
10
+ import { assert } from '../../utils/assert.js';
11
+ import { isObject } from '../../utils/isObject.js';
12
+ import { createReceiver } from './streamedValues/registry.js';
13
+ import '../assertEnvClient.js';
14
+ // First render: the `<script>` tags that follow `<script id="vike_pageContext">` push the lines to `self.__vike_streamed`,
15
+ // before and after Vike's client runtime is loaded.
16
+ function parsePageContextHtml(pageContextJson) {
17
+ const receiver = createReceiver();
18
+ const [pageContext] = parse(pageContextJson, { reviver: receiver.reviver });
19
+ const g = self;
20
+ const linesQueued = Array.isArray(g.__vike_streamed) ? g.__vike_streamed : [];
21
+ g.__vike_streamed = { push: receiver.onLine };
22
+ linesQueued.forEach(receiver.onLine);
23
+ return pageContext;
24
+ }
25
+ // Client-side navigation: the `.pageContext.json` response (see server/runtime/renderPageServer/getPageContextJson.ts),
26
+ // `[pageContext` then one `,line` per line then `]`. The pageContext is returned as soon as its line arrives.
27
+ async function readPageContextJsonStreamed(response) {
28
+ const reader = response.body.getReader();
29
+ const lines = readLines(reader);
30
+ const { done, value: lineFirst } = await lines.next();
31
+ assert(!done && lineFirst[0] === '[');
32
+ const receiver = createReceiver();
33
+ const pageContextFromServer = parse(lineFirst.slice(1), { reviver: receiver.reviver });
34
+ assert(isObject(pageContextFromServer));
35
+ responsesStreaming.push(reader);
36
+ (async () => {
37
+ try {
38
+ for await (const line of lines) {
39
+ if (line !== ']')
40
+ receiver.onLine(line.slice(1));
41
+ }
42
+ receiver.fail(new Error('The pageContext.json response ended before the streamed pageContext values ended'));
43
+ }
44
+ catch (err) {
45
+ // E.g. the server aborted the response
46
+ receiver.fail(err);
47
+ }
48
+ })();
49
+ return { ...pageContextFromServer, _streamedValuesReader: reader };
50
+ }
51
+ async function* readLines(reader) {
52
+ const decoder = new TextDecoder();
53
+ // Joined once per line: joining upon each chunk would be quadratic
54
+ let parts = [];
55
+ while (true) {
56
+ const { done, value } = await reader.read();
57
+ if (done)
58
+ return;
59
+ const chunk = decoder.decode(value, { stream: true });
60
+ let lineStart = 0;
61
+ let lineEnd;
62
+ while ((lineEnd = chunk.indexOf('\n', lineStart)) !== -1) {
63
+ yield parts.join('') + chunk.slice(lineStart, lineEnd);
64
+ parts = [];
65
+ lineStart = lineEnd + 1;
66
+ }
67
+ parts.push(chunk.slice(lineStart));
68
+ }
69
+ }
70
+ // Once a page is rendered, the streamed values fetched before it are cancelled (the previous page's, and superseded
71
+ // navigations'): the previous page keeps its values while it's shown.
72
+ let responsesStreaming = [];
73
+ // Cancels the streamed values of `pageContext` (a superseded navigation), or, once `pageContext` is rendered, all the others
74
+ function cancelStreamedValues(pageContext, isRendered) {
75
+ const { _streamedValuesReader } = pageContext;
76
+ responsesStreaming = responsesStreaming.filter((reader) => {
77
+ if ((reader === _streamedValuesReader) === isRendered)
78
+ return true;
79
+ reader.cancel().catch(() => { });
80
+ return false;
81
+ });
82
+ }
@@ -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
+ }
@@ -15,7 +15,7 @@ import { toPosixPath } from '../../utils/path.js';
15
15
  import pc from '@brillout/picocolors';
16
16
  import { getEnvVarObject } from '../../utils/getEnvVarObject.js';
17
17
  import { getVikeApiOperation, isVikeCliOrApi } from '../../shared-server-node/api-context.js';
18
- import { getViteCliCommand, getViteCliArgs } from '../vite/shared/isViteCli.js';
18
+ import { getViteCliCommand, getViteCliArgsMinimal } from '../vite/shared/isViteCli.js';
19
19
  import './assertEnvApiDevAndProd.js';
20
20
  const globalObject = getGlobalObject('resolveViteConfigUser.ts', {});
21
21
  const debug = createDebug('vike:vite-config-user');
@@ -83,7 +83,7 @@ async function resolve(viteContext) {
83
83
  // Vite CLI args (when invoked via Vite's CLI rather than Vike's API).
84
84
  // - Without this, Vike loads vite.config.js blind to `vite [root]` / `-c <file>` and ends up with the wrong root when those Vite CLI args are used.
85
85
  {
86
- const viteConfigFromViteCli = getViteCliArgs();
86
+ const viteConfigFromViteCli = getViteCliArgsMinimal();
87
87
  addConfig(viteConfigFromViteCli);
88
88
  if (debug.isActivated)
89
89
  debug('viteConfigFromViteCli', viteConfigFromViteCli);
@@ -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,125 @@
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
+ closeOnSignal(viteServer);
65
+ try {
66
+ // 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)
67
+ await viteServer.ssrLoadModule(serverEntryFilePath);
68
+ }
69
+ catch (err) {
70
+ console.error(err);
71
+ assertInfo(false, 'Waiting for file changes before restarting server...', { onlyOnce: false });
72
+ restartOnFileChange(viteServer, () => true);
73
+ }
74
+ }
75
+ function restartOnFileChange(viteServer, isRestartNeeded) {
76
+ const onFileChange = (filePath) => {
77
+ filePath = normalizePath(filePath);
78
+ if (isRestartNeeded(filePath))
79
+ restart(`${pc.cyan(path.relative(viteServer.config.root, filePath))} changed`);
80
+ };
81
+ viteServer.watcher.on('change', onFileChange);
82
+ viteServer.watcher.on('unlink', onFileChange);
83
+ }
84
+ // The user's server may handle SIGINT/SIGTERM without exiting the process (e.g. graceful shutdown: close the server and let the process exit once it's idle) => close Vite's development server, otherwise it keeps the process alive
85
+ function closeOnSignal(viteServer) {
86
+ for (const signal of ['SIGINT', 'SIGTERM']) {
87
+ process.once(signal, () => {
88
+ void viteServer.close();
89
+ // Listening to a signal disables Node.js's default behavior of terminating the process => if the user's server doesn't listen to it, then we terminate the process ourselves
90
+ if (process.listenerCount(signal) === 0)
91
+ process.kill(process.pid, signal);
92
+ });
93
+ }
94
+ }
95
+ function restart(reason) {
96
+ assertInfo(false, `${reason}, restarting server...`, { onlyOnce: false });
97
+ process.exit(EXIT_CODE_RESTART);
98
+ }
99
+ // Only `$ vike dev` runs +serverEntry.js, not the programmatic API `dev()`: the parent process re-runs the command (process.argv) in the child process
100
+ async function getServerEntryFilePath_ifDevCli() {
101
+ if (!isVikeCli())
102
+ return null;
103
+ const vikeConfig = await getVikeConfigInternal();
104
+ const serverEntryFilePath = getServerEntryFilePath_ifDev(vikeConfig);
105
+ return serverEntryFilePath;
106
+ }
107
+ // Whether one of the modules is +serverEntry.js or (transitively) imported by +serverEntry.js
108
+ // - 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)
109
+ function isImportedBy(modules, serverEntryFilePath) {
110
+ const visited = new Set();
111
+ const stack = [...(modules ?? [])];
112
+ while (stack.length > 0) {
113
+ const mod = stack.pop();
114
+ if (visited.has(mod))
115
+ continue;
116
+ visited.add(mod);
117
+ if (mod.file === serverEntryFilePath)
118
+ return true;
119
+ stack.push(...mod.importers);
120
+ }
121
+ return false;
122
+ }
123
+ function isServerChildProcess() {
124
+ return process.env[IS_SERVER_CHILD_PROCESS] === '1';
125
+ }
@@ -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) {
@@ -32,13 +32,17 @@ type PrerenderContext = {
32
32
  _userRootDir: string;
33
33
  _outDirClient: string;
34
34
  };
35
- type Output<PageContext = PageContextPrerendered> = {
35
+ type Output<PageContext = PageContextPrerendered> = ({
36
36
  filePath: string;
37
- fileType: FileType;
37
+ fileType: 'HTML' | 'JSON';
38
38
  fileContent: string;
39
39
  pageContext: PageContext;
40
- }[];
41
- type FileType = 'HTML' | 'JSON';
40
+ } | {
41
+ filePath: string;
42
+ fileType: 'CONTENT';
43
+ fileContent: string | Uint8Array;
44
+ pageContext: PageContext;
45
+ })[];
42
46
  type PageContext = Awaited<ReturnType<typeof createPageContextPrerendering>> & {
43
47
  _urlOriginalBeforeHook?: string;
44
48
  };
@@ -72,12 +76,6 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
72
76
  isPrerendering: boolean;
73
77
  _requestId: number;
74
78
  } & import("../../types/PageContext.js").PageContextInit & {
75
- _nodeDev?: {
76
- req: import("http").IncomingMessage;
77
- res: import("http").ServerResponse;
78
- };
79
- _reqWeb?: Request;
80
- } & {
81
79
  _globalContext: ({
82
80
  config: import("../../types/index.js").ConfigResolved;
83
81
  _source: import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").Source;
@@ -101,6 +99,10 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
101
99
  _pageFilesAll: PageFile[];
102
100
  _pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
103
101
  _pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
102
+ _environmentEntries: Record<string, {
103
+ pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
104
+ pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
105
+ } | null>;
104
106
  _allPageIds: string[];
105
107
  } & (({
106
108
  isClientSide: false;
@@ -110,6 +112,7 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
110
112
  _isPrerendering: false;
111
113
  assetsManifest: null;
112
114
  _viteDevServer: import("vite").ViteDevServer | undefined;
115
+ devMiddleware: import("vite").Connect.Server | null;
113
116
  viteConfig: import("vite").ResolvedConfig | undefined;
114
117
  } | {
115
118
  isClientSide: false;
@@ -118,6 +121,7 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
118
121
  _isProduction: true;
119
122
  assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
120
123
  _viteDevServer: null;
124
+ devMiddleware: null;
121
125
  _usesClientRouter: boolean;
122
126
  _isPrerendering: true;
123
127
  viteConfig: import("vite").ResolvedConfig;
@@ -128,12 +132,11 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
128
132
  _isProduction: true;
129
133
  assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
130
134
  _viteDevServer: null;
135
+ devMiddleware: null;
131
136
  _usesClientRouter: boolean;
132
137
  _isPrerendering: false;
133
138
  viteConfig: null;
134
139
  }) & {
135
- baseServer: string;
136
- baseAssets: string;
137
140
  viteConfigRuntime: {
138
141
  root: string;
139
142
  build: {
@@ -144,6 +147,9 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
144
147
  inject: boolean | undefined;
145
148
  };
146
149
  };
150
+ baseServer: string;
151
+ baseAssets: string;
152
+ middlewares: import("../../server/runtime/universal-middleware/core.js").Middleware[];
147
153
  })) & {
148
154
  prerenderContext: PrerenderContextPublic | undefined;
149
155
  };
@@ -151,12 +157,6 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
151
157
  _baseServer: string;
152
158
  _baseAssets: string;
153
159
  _pageContextInit: import("../../types/PageContext.js").PageContextInit & {
154
- _nodeDev?: {
155
- req: import("http").IncomingMessage;
156
- res: import("http").ServerResponse;
157
- };
158
- _reqWeb?: Request;
159
- } & {
160
160
  headers?: Record<string, unknown>;
161
161
  };
162
162
  _urlHandler: ((url: string) => string) | null;