vike 0.4.267 → 0.4.268-commit-45c1759
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RenderErrorPage.js +2 -2
- package/abort.js +2 -2
- package/dist/client/__internal/index.d.ts +2 -0
- package/dist/client/__internal/index.js +3 -0
- package/dist/client/runtime-client-routing/createPageContextClient.d.ts +5 -0
- package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +5 -0
- package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +26 -2
- package/dist/client/runtime-client-routing/getPageContextFromHooks.js +4 -5
- package/dist/client/runtime-client-routing/renderPageClient.d.ts +481 -10
- package/dist/client/runtime-client-routing/renderPageClient.js +116 -41
- package/dist/client/runtime-client-routing/streamedValues.d.ts +5 -0
- package/dist/client/runtime-client-routing/streamedValues.js +23 -0
- package/dist/client/runtime-server-routing/createPageContextClient.d.ts +5 -0
- package/dist/client/runtime-server-routing/entry.js +1 -1
- package/dist/client/runtime-server-routing/getGlobalContextClientInternal.d.ts +5 -0
- package/dist/client/shared/getGlobalContextClientInternalShared.d.ts +5 -0
- package/dist/client/shared/getGlobalContextClientInternalShared.js +2 -0
- package/dist/client/shared/getJsonSerializedInHtml.d.ts +2 -2
- package/dist/client/shared/getJsonSerializedInHtml.js +9 -6
- package/dist/client/shared/loadPageConfigsLazyClientSide.js +0 -4
- package/dist/client/shared/removeFoucBuster.js +14 -3
- package/dist/client/shared/streamedValues/asyncIterable.d.ts +4 -0
- package/dist/client/shared/streamedValues/asyncIterable.js +26 -0
- package/dist/client/shared/streamedValues/lines.d.ts +11 -0
- package/dist/client/shared/streamedValues/lines.js +19 -0
- package/dist/client/shared/streamedValues/promise.d.ts +4 -0
- package/dist/client/shared/streamedValues/promise.js +19 -0
- package/dist/client/shared/streamedValues/readableStream.d.ts +4 -0
- package/dist/client/shared/streamedValues/readableStream.js +44 -0
- package/dist/client/shared/streamedValues/registry.d.ts +21 -0
- package/dist/client/shared/streamedValues/registry.js +40 -0
- package/dist/client/shared/streamedValues.d.ts +7 -0
- package/dist/client/shared/streamedValues.js +82 -0
- package/dist/node/api/dev.js +15 -1
- package/dist/node/api/resolveViteConfigUser.js +2 -2
- package/dist/node/api/serverEntryDev.d.ts +10 -0
- package/dist/node/api/serverEntryDev.js +125 -0
- package/dist/node/createDevMiddleware.js +12 -0
- package/dist/node/prerender/resolvePrerenderConfig.d.ts +1 -1
- package/dist/node/prerender/resolvePrerenderConfig.js +4 -1
- package/dist/node/prerender/runPrerender.d.ts +18 -18
- package/dist/node/prerender/runPrerender.js +61 -16
- package/dist/node/vite/assertEnvVite.js +1 -1
- package/dist/node/vite/index.js +2 -0
- package/dist/node/vite/plugins/build/handleAssetsManifest.js +6 -2
- package/dist/node/vite/plugins/build/pluginBuildApp.js +25 -26
- package/dist/node/vite/plugins/build/pluginBuildConfig.d.ts +2 -2
- package/dist/node/vite/plugins/build/pluginBuildConfig.js +25 -17
- package/dist/node/vite/plugins/build/pluginDistFileNames.js +70 -50
- package/dist/node/vite/plugins/build/pluginEnvironmentEntries.d.ts +6 -0
- package/dist/node/vite/plugins/build/pluginEnvironmentEntries.js +71 -0
- package/dist/node/vite/plugins/build/pluginSuppressRollupWarning.js +19 -17
- package/dist/node/vite/plugins/pluginCommon.js +10 -7
- package/dist/node/vite/plugins/pluginDev/optimizeDeps.d.ts +2 -2
- package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +6 -2
- package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +6 -4
- package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.d.ts +3 -0
- package/dist/node/vite/plugins/pluginUniversalDeploy/getServerConfig.js +28 -2
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.d.ts +1 -1
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginServerEntryAlias.js +22 -11
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.d.ts +4 -0
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginWrapServerFile.js +29 -0
- package/dist/node/vite/plugins/pluginUniversalDeploy.js +29 -5
- package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.d.ts +2 -1
- package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.js +29 -12
- package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntryWithOldDesign.js +3 -2
- package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFilePageEntry.js +7 -7
- package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.d.ts +10 -6
- package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js +5 -11
- package/dist/node/vite/plugins/pluginVirtualFiles.js +20 -0
- package/dist/node/vite/shared/addSsrMiddleware.js +11 -27
- package/dist/node/vite/shared/findPageFiles.d.ts +1 -1
- package/dist/node/vite/shared/findPageFiles.js +1 -11
- package/dist/node/vite/shared/getAssetsDir.d.ts +3 -2
- package/dist/node/vite/shared/getAssetsDir.js +3 -3
- package/dist/node/vite/shared/isViteCli.d.ts +3 -3
- package/dist/node/vite/shared/isViteCli.js +80 -84
- package/dist/node/vite/shared/isViteServerSide.js +2 -7
- package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +6 -4
- package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +17 -6
- package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +9 -2
- package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +5 -1
- package/dist/node/vite/shared/resolveVikeConfigInternal.js +86 -13
- package/dist/server/__internal/fetch-deprecated.d.ts +2 -0
- package/dist/server/__internal/fetch-deprecated.js +6 -0
- package/dist/server/__internal/fetch.d.ts +9 -0
- package/dist/server/__internal/fetch.js +5 -0
- package/dist/server/__internal/index.d.ts +4 -0
- package/dist/server/__internal/index.js +8 -0
- package/dist/server/createPageRenderer.d.ts +2 -2
- package/dist/server/createPageRenderer.js +2 -2
- package/dist/server/runtime/createDevMiddleware.js +3 -1
- package/dist/server/runtime/globalContext.d.ts +69 -10
- package/dist/server/runtime/globalContext.js +35 -2
- package/dist/server/runtime/index.d.ts +1 -1
- package/dist/server/runtime/index.js +1 -1
- package/dist/server/runtime/renderPageServer/analyzePage.js +3 -3
- package/dist/server/runtime/renderPageServer/createHttpResponse.d.ts +20 -9
- package/dist/server/runtime/renderPageServer/createHttpResponse.js +34 -21
- package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +13 -23
- package/dist/server/runtime/renderPageServer/csp.d.ts +2 -1
- package/dist/server/runtime/renderPageServer/csp.js +2 -1
- package/dist/server/runtime/renderPageServer/execHookOnError.js +1 -1
- package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.d.ts +9 -0
- package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.js +21 -9
- package/dist/server/runtime/renderPageServer/getHttpResponseBody.d.ts +2 -2
- package/dist/server/runtime/renderPageServer/getHttpResponseBody.js +19 -12
- package/dist/server/runtime/renderPageServer/getPageContextJson.d.ts +8 -0
- package/dist/server/runtime/renderPageServer/getPageContextJson.js +47 -0
- package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.d.ts +2 -0
- package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.js +1 -1
- package/dist/server/runtime/renderPageServer/handlePageContextRequestUrl.js +2 -2
- package/dist/server/runtime/renderPageServer/headersResponse.d.ts +11 -2
- package/dist/server/runtime/renderPageServer/headersResponse.js +22 -2
- package/dist/server/runtime/renderPageServer/html/injectAssets/getHtmlTags.js +5 -4
- package/dist/server/runtime/renderPageServer/html/injectAssets.d.ts +3 -2
- package/dist/server/runtime/renderPageServer/html/injectAssets.js +7 -1
- package/dist/server/runtime/renderPageServer/html/renderHtml.js +4 -2
- package/dist/server/runtime/renderPageServer/html/serializeContext.d.ts +5 -1
- package/dist/server/runtime/renderPageServer/html/serializeContext.js +12 -9
- package/dist/server/runtime/renderPageServer/html/stream.d.ts +13 -6
- package/dist/server/runtime/renderPageServer/html/stream.js +135 -32
- package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.d.ts +30 -0
- package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.js +92 -0
- package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +10 -14
- package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.js +5 -1
- package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.d.ts +15 -0
- package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.js +61 -0
- package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +320 -55
- package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.js +21 -12
- package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.d.ts +4 -0
- package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.js +12 -0
- package/dist/server/runtime/renderPageServer/streamedValues/lines.d.ts +10 -0
- package/dist/server/runtime/renderPageServer/streamedValues/lines.js +49 -0
- package/dist/server/runtime/renderPageServer/streamedValues/promise.d.ts +4 -0
- package/dist/server/runtime/renderPageServer/streamedValues/promise.js +14 -0
- package/dist/server/runtime/renderPageServer/streamedValues/pump.d.ts +10 -0
- package/dist/server/runtime/renderPageServer/streamedValues/pump.js +67 -0
- package/dist/server/runtime/renderPageServer/streamedValues/readableStream.d.ts +4 -0
- package/dist/server/runtime/renderPageServer/streamedValues/readableStream.js +12 -0
- package/dist/server/runtime/renderPageServer/streamedValues/registry.d.ts +28 -0
- package/dist/server/runtime/renderPageServer/streamedValues/registry.js +33 -0
- package/dist/server/runtime/renderPageServer.d.ts +65 -18
- package/dist/server/runtime/renderPageServer.js +33 -62
- package/dist/server/runtime/universal-middleware/core.d.ts +25 -0
- package/dist/server/runtime/universal-middleware/core.js +167 -0
- package/dist/server/runtime/universal-middleware/deprecated-export.d.ts +3 -0
- package/dist/server/runtime/universal-middleware/deprecated-export.js +10 -0
- package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.d.ts +15 -0
- package/dist/server/runtime/universal-middleware/getMiddlewaresPipe.js +51 -0
- package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.d.ts +9 -0
- package/dist/server/runtime/universal-middleware/vikeUniversalMiddleware.js +22 -0
- package/dist/shared-server-client/createGlobalContextShared.d.ts +8 -0
- package/dist/shared-server-client/createGlobalContextShared.js +2 -1
- package/dist/shared-server-client/getPageContextPublicShared.js +0 -2
- package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.d.ts +8 -0
- package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.js +17 -7
- package/dist/shared-server-client/hooks/execHook.d.ts +1 -1
- package/dist/shared-server-client/hooks/execHook.js +2 -2
- package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.js +2 -0
- package/dist/shared-server-client/route/abort.d.ts +1 -1
- package/dist/shared-server-client/route/abort.js +4 -2
- package/dist/shared-server-client/streamedValues.d.ts +22 -0
- package/dist/shared-server-client/streamedValues.js +24 -0
- package/dist/shared-server-node/vike-environments.d.ts +4 -0
- package/dist/shared-server-node/vike-environments.js +10 -0
- package/dist/shared-server-node/virtualFileId.d.ts +7 -5
- package/dist/shared-server-node/virtualFileId.js +42 -42
- package/dist/types/Config.d.ts +11 -3
- package/dist/types/GlobalContext.d.ts +3 -3
- package/dist/types/PageConfig.d.ts +13 -5
- package/dist/types/PageContext.d.ts +18 -10
- package/dist/types/PageContext.js +1 -0
- package/dist/types/Server.d.ts +1 -1
- package/dist/types/VikeNamespace.d.ts +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/utils/PROJECT_VERSION.d.ts +1 -1
- package/dist/utils/PROJECT_VERSION.js +1 -1
- package/dist/utils/assertViteVersion.d.ts +1 -3
- package/dist/utils/assertViteVersion.js +6 -9
- package/dist/utils/catchInfiniteLoop.js +33 -11
- package/dist/utils/deepEqual.d.ts +2 -1
- package/dist/utils/deepEqual.js +21 -6
- package/dist/utils/getContentTypeFromUrl.d.ts +2 -0
- package/dist/utils/getContentTypeFromUrl.js +39 -0
- package/dist/utils/injectRollupInputs.d.ts +2 -2
- package/dist/utils/injectRollupInputs.js +2 -2
- package/dist/utils/installUncaughtErrorHandlers.js +9 -0
- package/dist/utils/isDev.js +2 -7
- package/dist/utils/parseUrl-extras.js +4 -0
- package/fetch.js +2 -2
- package/modifyUrl.js +2 -2
- package/package.json +42 -26
- package/routing.js +2 -2
- package/universal-middleware.js +2 -2
- package/vike-server.d.ts +14 -0
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.d.ts +0 -4
- package/dist/node/vite/plugins/pluginUniversalDeploy/pluginUnwrapProdOptions.js +0 -22
- package/dist/server/runtime/fetch.d.ts +0 -10
- package/dist/server/runtime/fetch.js +0 -5
- package/dist/server/runtime/universal-middleware.d.ts +0 -10
- package/dist/server/runtime/universal-middleware.js +0 -27
- package/dist/shared-server-client/addIs404ToPageProps.d.ts +0 -2
- package/dist/shared-server-client/addIs404ToPageProps.js +0 -17
|
@@ -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
|
+
}
|
package/dist/node/api/dev.js
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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 =
|
|
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:
|
|
37
|
+
fileType: 'HTML' | 'JSON';
|
|
38
38
|
fileContent: string;
|
|
39
39
|
pageContext: PageContext;
|
|
40
|
-
}
|
|
41
|
-
|
|
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;
|
|
@@ -21,6 +21,7 @@ import { preservePropertyGetters } from '../../utils/preservePropertyGetters.js'
|
|
|
21
21
|
import { assertPosixPath } from '../../utils/path.js';
|
|
22
22
|
import { urlToFile } from '../../utils/urlToFile.js';
|
|
23
23
|
import { prependBase } from '../../utils/parseUrl-extras.js';
|
|
24
|
+
import { parseUrl } from '../../utils/parseUrl.js';
|
|
24
25
|
import { prerenderPage } from '../../server/runtime/renderPageServer/renderPageServerAfterRoute.js';
|
|
25
26
|
import { createPageContextServer } from '../../server/runtime/renderPageServer/createPageContextServer.js';
|
|
26
27
|
import pc from '@brillout/picocolors';
|
|
@@ -43,6 +44,8 @@ import { resolvePrerenderConfigGlobal, resolvePrerenderConfigLocal, isDistServer
|
|
|
43
44
|
import { getOutDirsAllFromRootNormalized } from '../vite/shared/getOutDirs.js';
|
|
44
45
|
import fs from 'node:fs';
|
|
45
46
|
import { getPublicProxy } from '../../shared-server-client/getPublicProxy.js';
|
|
47
|
+
import { getPageContextPublicServer } from '../../server/runtime/renderPageServer/getPageContextPublicServer.js';
|
|
48
|
+
import { isObject } from '../../utils/isObject.js';
|
|
46
49
|
import { getStaticRedirectsForPrerender } from '../../server/runtime/renderPageServer/resolveRedirects.js';
|
|
47
50
|
import { updateType } from '../../utils/updateType.js';
|
|
48
51
|
const docLink = 'https://vike.dev/i18n#pre-rendering';
|
|
@@ -139,7 +142,7 @@ async function runPrerender(options = {}, trigger) {
|
|
|
139
142
|
const prerenderContextPublic = getPrerenderContextPublic(prerenderContext);
|
|
140
143
|
objectAssign(vikeConfig.prerenderContext, prerenderContextPublic, true);
|
|
141
144
|
setGlobalContext_prerenderContext(prerenderContextPublic);
|
|
142
|
-
if (isDistServerRemoved(prerenderConfigGlobal)) {
|
|
145
|
+
if (isDistServerRemoved(prerenderConfigGlobal, vikeConfig)) {
|
|
143
146
|
fs.rmSync(outDirServer, { recursive: true });
|
|
144
147
|
}
|
|
145
148
|
}
|
|
@@ -482,6 +485,7 @@ async function callOnPrerenderStartHook(prerenderContext, globalContext, concurr
|
|
|
482
485
|
});
|
|
483
486
|
const prerenderContextPublic = getPrerenderContextPublic(prerenderContext);
|
|
484
487
|
let result = await execHookSingleWithoutPageContext(onPrerenderStartHook, globalContext, () => hookFn(prerenderContextPublic));
|
|
488
|
+
prerenderContext.pageContexts = prerenderContext.pageContexts.map(getPageContextOriginal);
|
|
485
489
|
// Before applying result
|
|
486
490
|
prerenderContext.pageContexts.forEach((pageContext) => {
|
|
487
491
|
;
|
|
@@ -507,7 +511,7 @@ async function callOnPrerenderStartHook(prerenderContext, globalContext, concurr
|
|
|
507
511
|
assertUsage(isObjectWithKeys(result, ['prerenderContext']) &&
|
|
508
512
|
hasProp(result, 'prerenderContext', 'object') &&
|
|
509
513
|
hasProp(result.prerenderContext, 'pageContexts', 'array'), rightUsage);
|
|
510
|
-
prerenderContext.pageContexts = result.prerenderContext.pageContexts;
|
|
514
|
+
prerenderContext.pageContexts = result.prerenderContext.pageContexts.map(getPageContextOriginal);
|
|
511
515
|
prerenderContext.pageContexts.forEach((pageContext) => {
|
|
512
516
|
// TO-DO/next-major-release: remove
|
|
513
517
|
if (pageContext.url && !isPropertyGetter(pageContext, 'url')) {
|
|
@@ -546,11 +550,12 @@ async function prerenderPages(prerenderContext, concurrencyLimit, onComplete) {
|
|
|
546
550
|
assertIsNotAbort(err, pc.cyan(pageContextBeforeRender.urlOriginal));
|
|
547
551
|
throw err;
|
|
548
552
|
}
|
|
549
|
-
const { documentHtml, pageContext } = res;
|
|
553
|
+
const { documentHtml, content, pageContext } = res;
|
|
550
554
|
const pageContextSerialized = pageContext.is404 ? null : res.pageContextSerialized;
|
|
551
555
|
await onComplete({
|
|
552
556
|
pageContext,
|
|
553
557
|
htmlString: documentHtml,
|
|
558
|
+
content,
|
|
554
559
|
pageContextSerialized,
|
|
555
560
|
});
|
|
556
561
|
})));
|
|
@@ -579,7 +584,13 @@ async function warnMissingPages(prerenderedPageContexts, globalContext, doNotPre
|
|
|
579
584
|
assertWarning(partial, `Cannot pre-render page ${pageAt} because it has a non-static route, while there isn't any ${hookName}() hook returning an URL matching the page's route. You must use a ${hookName}() hook (https://vike.dev/${hookName}) for providing the list of URLs to be pre-rendered for that page. If you want to skip pre-rendering that page, you can remove this warning by setting +prerender to false at ${pageAt} (https://vike.dev/pre-rendering#partial) or by setting +prerender.partial to true (https://vike.dev/prerender#partial).`, { onlyOnce: true });
|
|
580
585
|
});
|
|
581
586
|
}
|
|
582
|
-
async function writeFiles({ pageContext, htmlString, pageContextSerialized }, prerenderContext, onPagePrerender, logLevel) {
|
|
587
|
+
async function writeFiles({ pageContext, htmlString, content, pageContextSerialized }, prerenderContext, onPagePrerender, logLevel) {
|
|
588
|
+
if (content !== null) {
|
|
589
|
+
assert(htmlString === null && pageContextSerialized === null);
|
|
590
|
+
await write(pageContext, 'CONTENT', content, onPagePrerender, prerenderContext, logLevel);
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
assert(htmlString !== null);
|
|
583
594
|
const writeJobs = [write(pageContext, 'HTML', htmlString, onPagePrerender, prerenderContext, logLevel)];
|
|
584
595
|
if (pageContextSerialized !== null) {
|
|
585
596
|
writeJobs.push(write(pageContext, 'JSON', pageContextSerialized, onPagePrerender, prerenderContext, logLevel));
|
|
@@ -594,10 +605,13 @@ async function write(pageContext, fileType, fileContent, onPagePrerender, preren
|
|
|
594
605
|
const doNotCreateExtraDirectory = prerenderContext._noExtraDir ?? pageContext.is404;
|
|
595
606
|
fileUrl = urlToFile(urlOriginal, '.html', doNotCreateExtraDirectory);
|
|
596
607
|
}
|
|
597
|
-
else {
|
|
598
|
-
assert(fileType === 'JSON');
|
|
608
|
+
else if (fileType === 'JSON') {
|
|
599
609
|
fileUrl = getPageContextRequestUrl(urlOriginal);
|
|
600
610
|
}
|
|
611
|
+
else {
|
|
612
|
+
assert(fileType === 'CONTENT');
|
|
613
|
+
fileUrl = getContentFileUrl(pageContext);
|
|
614
|
+
}
|
|
601
615
|
assertPosixPath(fileUrl);
|
|
602
616
|
assert(fileUrl.startsWith('/'));
|
|
603
617
|
const filePathRelative = fileUrl.slice(1);
|
|
@@ -614,14 +628,15 @@ async function write(pageContext, fileType, fileContent, onPagePrerender, preren
|
|
|
614
628
|
fileContent,
|
|
615
629
|
},
|
|
616
630
|
});
|
|
617
|
-
|
|
618
|
-
filePath,
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
631
|
+
if (fileType === 'CONTENT') {
|
|
632
|
+
prerenderContext.output.push({ filePath, fileType, fileContent, pageContext });
|
|
633
|
+
}
|
|
634
|
+
else {
|
|
635
|
+
assert(typeof fileContent === 'string');
|
|
636
|
+
prerenderContext.output.push({ filePath, fileType, fileContent, pageContext });
|
|
637
|
+
}
|
|
623
638
|
if (onPagePrerender) {
|
|
624
|
-
await onPagePrerender(pageContext);
|
|
639
|
+
await onPagePrerender(getPageContextPublicPrerendered(pageContext));
|
|
625
640
|
}
|
|
626
641
|
else {
|
|
627
642
|
const { promises } = await import('node:fs');
|
|
@@ -640,6 +655,18 @@ async function write(pageContext, fileType, fileContent, onPagePrerender, preren
|
|
|
640
655
|
}
|
|
641
656
|
}
|
|
642
657
|
}
|
|
658
|
+
// With `pageContext.content` the URL is the file path: `/feed.atom` => `dist/client/feed.atom`
|
|
659
|
+
function getContentFileUrl(pageContext) {
|
|
660
|
+
const { urlOriginal } = pageContext;
|
|
661
|
+
// The query string and the hash are ignored: a static host serves the file at the pathname
|
|
662
|
+
const { pathnameOriginal } = parseUrl(urlOriginal, '/');
|
|
663
|
+
const errPrefix = `Cannot pre-render ${pc.cyan(urlOriginal)} with ${pc.code('pageContext.content')}`;
|
|
664
|
+
const errSuffix = "pre-rendering writes the content to the file at the URL's pathname (e.g. /feed.atom => dist/client/feed.atom)";
|
|
665
|
+
assertUsage(!pageContext.is404, `${errPrefix} because it's the 404 page`);
|
|
666
|
+
const segments = pathnameOriginal.split('/').slice(1);
|
|
667
|
+
assertUsage(segments.every((s) => s !== '' && s !== '.' && s !== '..'), `${errPrefix} because the URL's pathname isn't a file path: ${errSuffix}`);
|
|
668
|
+
return pathnameOriginal;
|
|
669
|
+
}
|
|
643
670
|
function normalizeOnPrerenderHookResult(prerenderResult, prerenderHookFile, hookName) {
|
|
644
671
|
if (isArray(prerenderResult)) {
|
|
645
672
|
return prerenderResult.map(normalize);
|
|
@@ -730,14 +757,31 @@ function getPrerenderContextPublic(prerenderContext) {
|
|
|
730
757
|
configurable: true,
|
|
731
758
|
});
|
|
732
759
|
}
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
760
|
+
prerenderContext.pageContexts = prerenderContext.pageContexts.map((pageContext) => {
|
|
761
|
+
// Required because of https://vike.dev/i18n#pre-rendering
|
|
762
|
+
// - Users copy pageContext, e.g. `{ ...pageContext, locale }`, and Vike renders the copies => the copies need to be original objects
|
|
736
763
|
changeEnumerable(pageContext, '_isOriginalObject', true);
|
|
764
|
+
return getPageContextPublicServer(pageContext);
|
|
765
|
+
});
|
|
766
|
+
prerenderContext.output.forEach((file) => {
|
|
767
|
+
file.pageContext = getPageContextPublicPrerendered(file.pageContext);
|
|
737
768
|
});
|
|
738
769
|
const prerenderContextPublic = getPublicProxy(prerenderContext, 'prerenderContext');
|
|
739
770
|
return prerenderContextPublic;
|
|
740
771
|
}
|
|
772
|
+
// The user may return the public pageContext objects passed to +onPrerenderStart
|
|
773
|
+
function getPageContextOriginal(pageContext) {
|
|
774
|
+
const obj = pageContext;
|
|
775
|
+
if (isObject(obj) && obj._isProxyObject)
|
|
776
|
+
return obj._originalObject;
|
|
777
|
+
return pageContext;
|
|
778
|
+
}
|
|
779
|
+
function getPageContextPublicPrerendered(pageContext) {
|
|
780
|
+
// Pre-rendered redirects don't have any real pageContext object, but only a plain object `{ urlOriginal, pageId: null, is404: false, isRedirect: true }` which we cannot pass to getPageContextPublicServer() as it only accepts real pageContext objects (it asserts pageContext._isOriginalObject)
|
|
781
|
+
if (pageContext.isRedirect)
|
|
782
|
+
return pageContext;
|
|
783
|
+
return getPageContextPublicServer(pageContext);
|
|
784
|
+
}
|
|
741
785
|
async function prerenderRedirects(globalContext, onComplete, showWarningUponDynamicRedirects) {
|
|
742
786
|
const redirects = globalContext.config.redirects ?? [];
|
|
743
787
|
const redirectsStatic = getStaticRedirectsForPrerender(redirects, showWarningUponDynamicRedirects);
|
|
@@ -748,6 +792,7 @@ async function prerenderRedirects(globalContext, onComplete, showWarningUponDyna
|
|
|
748
792
|
await onComplete({
|
|
749
793
|
pageContext: { urlOriginal, pageId: null, is404: false, isRedirect: true },
|
|
750
794
|
htmlString,
|
|
795
|
+
content: null,
|
|
751
796
|
pageContextSerialized: null,
|
|
752
797
|
});
|
|
753
798
|
}
|
|
@@ -11,7 +11,7 @@ function assertEnvVite() {
|
|
|
11
11
|
markSetup_vikeVitePlugin();
|
|
12
12
|
assertIsNotBrowser();
|
|
13
13
|
assertNodeVersion();
|
|
14
|
-
assertViteVersion(viteVersion);
|
|
14
|
+
assertViteVersion(viteVersion); // Early check — more reliable check using `this.meta.viteVersion` later
|
|
15
15
|
assertIsNotProductionRuntime(); // Don't bloat server with heavy dependencies like Vite
|
|
16
16
|
}
|
|
17
17
|
function onLoad() {
|
package/dist/node/vite/index.js
CHANGED
|
@@ -32,6 +32,7 @@ import { pluginSuppressRollupWarning } from './plugins/build/pluginSuppressRollu
|
|
|
32
32
|
import { pluginDistFileNames } from './plugins/build/pluginDistFileNames.js';
|
|
33
33
|
import { pluginProdBuildEntry } from './plugins/build/pluginProdBuildEntry.js';
|
|
34
34
|
import { pluginBuildConfig } from './plugins/build/pluginBuildConfig.js';
|
|
35
|
+
import { pluginEnvironmentEntries } from './plugins/build/pluginEnvironmentEntries.js';
|
|
35
36
|
import { pluginModuleBanner } from './plugins/build/pluginModuleBanner.js';
|
|
36
37
|
import { pluginReplaceConstantsNonRunnableDev } from './plugins/non-runnable-dev/pluginReplaceConstantsNonRunnableDev.js';
|
|
37
38
|
import { isVikeCliOrApi } from '../../shared-server-node/api-context.js';
|
|
@@ -83,6 +84,7 @@ function plugin(vikeVitePluginOptions = {}) {
|
|
|
83
84
|
function pluginBuild() {
|
|
84
85
|
return [
|
|
85
86
|
...pluginBuildConfig(),
|
|
87
|
+
...pluginEnvironmentEntries(),
|
|
86
88
|
...pluginBuildApp(),
|
|
87
89
|
...pluginProdBuildEntry(),
|
|
88
90
|
...pluginDistPackageJsonFile(),
|
|
@@ -45,7 +45,7 @@ async function fixServerAssets(config) {
|
|
|
45
45
|
}
|
|
46
46
|
async function copyAssets(filesToMove, filesToRemove, config) {
|
|
47
47
|
const { outDirClient, outDirServer } = getOutDirs(config, undefined);
|
|
48
|
-
const assetsDir = getAssetsDir(config);
|
|
48
|
+
const assetsDir = getAssetsDir(config.environments.ssr.build);
|
|
49
49
|
const assetsDirServer = path.posix.join(outDirServer, assetsDir);
|
|
50
50
|
if (!filesToMove.length && !filesToRemove.length && !existsSync(assetsDirServer))
|
|
51
51
|
return;
|
|
@@ -180,7 +180,11 @@ function getPageId(key) {
|
|
|
180
180
|
// to:
|
|
181
181
|
// virtual:vike:page-entry:client:/pages/index
|
|
182
182
|
// (This seems to be needed only for vitest tests that use Vite's build() API with an inline config.)
|
|
183
|
-
|
|
183
|
+
const prefix = key.split('virtual:vike')[0];
|
|
184
|
+
// Skip virtual modules wrapping a Vike virtual module, e.g. virtual:vite-rsc/client-references/group/facade:virtual:vike:page-entry:client:/pages/index
|
|
185
|
+
if (prefix && !prefix.endsWith('/'))
|
|
186
|
+
return null;
|
|
187
|
+
key = key.substring(prefix.length);
|
|
184
188
|
const result = parseVirtualFileId(key);
|
|
185
189
|
return result && result.type === 'page-entry' ? result.pageId : null;
|
|
186
190
|
}
|