vike 0.4.226 → 0.4.227-commit-c9cc081
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/dist/cjs/node/cli/entry.js +13 -8
- package/dist/cjs/node/plugin/plugins/build/pluginAutoFullBuild.js +6 -3
- package/dist/cjs/node/plugin/plugins/build/pluginDistPackageJsonFile.js +5 -2
- package/dist/cjs/node/plugin/plugins/build/pluginModuleBanner.js +16 -3
- package/dist/cjs/node/plugin/plugins/commonConfig.js +14 -2
- package/dist/cjs/node/plugin/plugins/devConfig/index.js +8 -6
- package/dist/cjs/node/plugin/plugins/envVars.js +27 -16
- package/dist/cjs/node/plugin/plugins/extractAssetsPlugin.js +12 -5
- package/dist/cjs/node/plugin/plugins/fileEnv.js +19 -12
- package/dist/cjs/node/plugin/plugins/importUserCode/index.js +8 -6
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -1
- package/dist/cjs/node/plugin/plugins/previewConfig.js +10 -6
- package/dist/cjs/node/plugin/shared/getResolvedConfig.js +6 -0
- package/dist/cjs/node/prerender/resolvePrerenderConfig.js +1 -0
- package/dist/cjs/node/prerender/runPrerender.js +18 -17
- package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
- package/dist/cjs/utils/assert.js +2 -5
- package/dist/cjs/utils/assertSingleInstance.js +19 -4
- package/dist/esm/node/cli/entry.js +13 -8
- package/dist/esm/node/plugin/plugins/build/pluginAutoFullBuild.js +6 -3
- package/dist/esm/node/plugin/plugins/build/pluginDistPackageJsonFile.js +4 -2
- package/dist/esm/node/plugin/plugins/build/pluginModuleBanner.js +13 -3
- package/dist/esm/node/plugin/plugins/commonConfig.d.ts +7 -1
- package/dist/esm/node/plugin/plugins/commonConfig.js +14 -2
- package/dist/esm/node/plugin/plugins/devConfig/index.js +8 -6
- package/dist/esm/node/plugin/plugins/envVars.js +24 -16
- package/dist/esm/node/plugin/plugins/extractAssetsPlugin.js +8 -5
- package/dist/esm/node/plugin/plugins/fileEnv.js +19 -12
- package/dist/esm/node/plugin/plugins/importUserCode/index.js +8 -6
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -1
- package/dist/esm/node/plugin/plugins/previewConfig.js +10 -6
- package/dist/esm/node/plugin/shared/getResolvedConfig.d.ts +2 -0
- package/dist/esm/node/plugin/shared/getResolvedConfig.js +3 -0
- package/dist/esm/node/prerender/resolvePrerenderConfig.d.ts +1 -0
- package/dist/esm/node/prerender/resolvePrerenderConfig.js +1 -0
- package/dist/esm/node/prerender/runPrerender.d.ts +1 -1
- package/dist/esm/node/prerender/runPrerender.js +18 -17
- package/dist/esm/shared/page-configs/Config.d.ts +10 -0
- package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
- package/dist/esm/utils/PROJECT_VERSION.js +1 -1
- package/dist/esm/utils/assert.js +2 -5
- package/dist/esm/utils/assertSingleInstance.js +19 -4
- package/package.json +2 -1
|
@@ -69,6 +69,7 @@ const getOutDirs_js_1 = require("../plugin/shared/getOutDirs.js");
|
|
|
69
69
|
const context_js_2 = require("../cli/context.js");
|
|
70
70
|
const isViteCliCall_js_1 = require("../plugin/shared/isViteCliCall.js");
|
|
71
71
|
const commonConfig_js_1 = require("../plugin/plugins/commonConfig.js");
|
|
72
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
72
73
|
async function runPrerenderFromAPI(options = {}) {
|
|
73
74
|
return await runPrerender(options, 'prerender()');
|
|
74
75
|
// - We purposely propagate the error to the user land, so that the error interrupts the user land. It's also, I guess, a nice-to-have that the user has control over the error.
|
|
@@ -88,11 +89,9 @@ async function runPrerenderFromCLIPrerenderCommand() {
|
|
|
88
89
|
runPrerender_forceExit();
|
|
89
90
|
(0, utils_js_1.assert)(false);
|
|
90
91
|
}
|
|
91
|
-
async function runPrerenderFromAutoRun(viteConfig
|
|
92
|
-
let prerenderContextPublic;
|
|
92
|
+
async function runPrerenderFromAutoRun(viteConfig) {
|
|
93
93
|
try {
|
|
94
|
-
|
|
95
|
-
prerenderContextPublic = ret.prerenderContextPublic;
|
|
94
|
+
await runPrerender({ viteConfig });
|
|
96
95
|
}
|
|
97
96
|
catch (err) {
|
|
98
97
|
// Avoid Rollup prefixing the error with [vike:build:pluginAutoFullBuild], see for example https://github.com/vikejs/vike/issues/472#issuecomment-1276274203
|
|
@@ -100,8 +99,6 @@ async function runPrerenderFromAutoRun(viteConfig, config) {
|
|
|
100
99
|
(0, logErrorHint_js_1.logErrorHint)(err);
|
|
101
100
|
process.exit(1);
|
|
102
101
|
}
|
|
103
|
-
const vike = (0, commonConfig_js_1.getVikeConfigPublic)(config);
|
|
104
|
-
vike.prerenderContext = prerenderContextPublic;
|
|
105
102
|
const forceExit = (0, context_js_2.isVikeCli)() || (0, isViteCliCall_js_1.isViteCliCall)();
|
|
106
103
|
return { forceExit };
|
|
107
104
|
}
|
|
@@ -118,7 +115,9 @@ async function runPrerender(options = {}, standaloneTrigger) {
|
|
|
118
115
|
await disableReactStreaming();
|
|
119
116
|
const viteConfig = await (0, vite_1.resolveConfig)(options.viteConfig || {}, 'build', 'production');
|
|
120
117
|
const vikeConfig = await (0, getVikeConfig_js_1.getVikeConfig)(viteConfig);
|
|
121
|
-
const
|
|
118
|
+
const vike = (0, commonConfig_js_1.getVikeConfigPublic)(viteConfig);
|
|
119
|
+
(0, utils_js_1.assert)(vike.prerenderContext.isPrerenderingEnabled);
|
|
120
|
+
const { outDirClient, outDirServer } = (0, getOutDirs_js_1.getOutDirs)(viteConfig);
|
|
122
121
|
const { root } = viteConfig;
|
|
123
122
|
const prerenderConfigGlobal = (0, resolvePrerenderConfig_js_1.resolvePrerenderConfigGlobal)(vikeConfig);
|
|
124
123
|
validatePrerenderConfig(prerenderConfigGlobal);
|
|
@@ -161,7 +160,11 @@ async function runPrerender(options = {}, standaloneTrigger) {
|
|
|
161
160
|
}
|
|
162
161
|
await warnMissingPages(prerenderContext.prerenderedPageContexts, globalContext, doNotPrerenderList, partial);
|
|
163
162
|
const prerenderContextPublic = makePublic(prerenderContext);
|
|
164
|
-
|
|
163
|
+
(0, utils_js_1.objectAssign)(vike.prerenderContext, prerenderContextPublic);
|
|
164
|
+
if (prerenderConfigGlobal.isPrerenderingEnabledForAllPages && !prerenderConfigGlobal.keepDistServer) {
|
|
165
|
+
node_fs_1.default.rmSync(outDirServer, { recursive: true });
|
|
166
|
+
}
|
|
167
|
+
return { viteConfig };
|
|
165
168
|
}
|
|
166
169
|
async function collectDoNoPrerenderList(pageConfigs, doNotPrerenderList, defaultLocalValue, concurrencyLimit, globalContext) {
|
|
167
170
|
// V1 design
|
|
@@ -630,6 +633,12 @@ async function write(urlOriginal, pageContext, fileType, fileContent, root, outD
|
|
|
630
633
|
(0, utils_js_1.assertPosixPath)(outDirClient);
|
|
631
634
|
(0, utils_js_1.assertPosixPath)(filePathRelative);
|
|
632
635
|
const filePath = path_1.default.posix.join(outDirClient, filePathRelative);
|
|
636
|
+
(0, utils_js_1.objectAssign)(pageContext, {
|
|
637
|
+
_prerenderResult: {
|
|
638
|
+
filePath,
|
|
639
|
+
fileContent
|
|
640
|
+
}
|
|
641
|
+
});
|
|
633
642
|
output.push({
|
|
634
643
|
filePath,
|
|
635
644
|
fileType,
|
|
@@ -637,15 +646,7 @@ async function write(urlOriginal, pageContext, fileType, fileContent, root, outD
|
|
|
637
646
|
pageContext
|
|
638
647
|
});
|
|
639
648
|
if (onPagePrerender) {
|
|
640
|
-
|
|
641
|
-
(0, utils_js_1.objectAssign)(prerenderPageContext, pageContext);
|
|
642
|
-
(0, utils_js_1.objectAssign)(prerenderPageContext, {
|
|
643
|
-
_prerenderResult: {
|
|
644
|
-
filePath,
|
|
645
|
-
fileContent
|
|
646
|
-
}
|
|
647
|
-
});
|
|
648
|
-
await onPagePrerender(prerenderPageContext);
|
|
649
|
+
await onPagePrerender(pageContext);
|
|
649
650
|
}
|
|
650
651
|
else {
|
|
651
652
|
const { promises } = await Promise.resolve().then(() => __importStar(require('fs')));
|
package/dist/cjs/utils/assert.js
CHANGED
|
@@ -98,12 +98,9 @@ function assertWarning(condition, msg, { onlyOnce, showStackTrace }) {
|
|
|
98
98
|
if (onlyOnce) {
|
|
99
99
|
const { alreadyLogged } = globalObject;
|
|
100
100
|
const key = onlyOnce === true ? msg : onlyOnce;
|
|
101
|
-
if (alreadyLogged.has(key))
|
|
101
|
+
if (alreadyLogged.has(key))
|
|
102
102
|
return;
|
|
103
|
-
|
|
104
|
-
else {
|
|
105
|
-
alreadyLogged.add(key);
|
|
106
|
-
}
|
|
103
|
+
alreadyLogged.add(key);
|
|
107
104
|
}
|
|
108
105
|
globalObject.onBeforeLog?.();
|
|
109
106
|
if (showStackTrace) {
|
|
@@ -16,13 +16,24 @@ const PROJECT_VERSION_js_1 = require("./PROJECT_VERSION.js");
|
|
|
16
16
|
/* Use original assertWarning() after all CJS is removed from node_modules/vike/dist/
|
|
17
17
|
import { assertWarning } from './assert.js'
|
|
18
18
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
let globalObject;
|
|
20
|
+
// getGlobalObjectSafe() can be called before this line
|
|
21
|
+
globalObject ?? (globalObject = genGlobalConfig());
|
|
22
|
+
function genGlobalConfig() {
|
|
23
|
+
return (0, getGlobalObject_js_1.getGlobalObject)('utils/assertSingleInstance.ts', {
|
|
24
|
+
instances: [],
|
|
25
|
+
alreadyLogged: new Set()
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// We need getGlobalObjectSafe() because globalObject is `undefined` when exported functions are called before globalObject is initialized
|
|
29
|
+
function getGlobalObjectSafe() {
|
|
30
|
+
globalObject ?? (globalObject = genGlobalConfig());
|
|
31
|
+
return globalObject;
|
|
32
|
+
}
|
|
23
33
|
const clientRuntimesClonflict = 'Client runtime of both Server Routing and Client Routing loaded https://vike.dev/client-runtimes-conflict';
|
|
24
34
|
const clientNotSingleInstance = 'Client runtime loaded twice https://vike.dev/client-runtime-duplicated';
|
|
25
35
|
function assertSingleInstance() {
|
|
36
|
+
const globalObject = getGlobalObjectSafe();
|
|
26
37
|
{
|
|
27
38
|
const versions = (0, unique_js_1.unique)(globalObject.instances);
|
|
28
39
|
assertWarning(versions.length <= 1,
|
|
@@ -39,6 +50,7 @@ function assertSingleInstance() {
|
|
|
39
50
|
}
|
|
40
51
|
}
|
|
41
52
|
function assertSingleInstance_onClientEntryServerRouting(isProduction) {
|
|
53
|
+
const globalObject = getGlobalObjectSafe();
|
|
42
54
|
assertWarning(globalObject.isClientRouting !== true, clientRuntimesClonflict, {
|
|
43
55
|
onlyOnce: true,
|
|
44
56
|
showStackTrace: true
|
|
@@ -53,6 +65,7 @@ function assertSingleInstance_onClientEntryServerRouting(isProduction) {
|
|
|
53
65
|
assertSingleInstance();
|
|
54
66
|
}
|
|
55
67
|
function assertSingleInstance_onClientEntryClientRouting(isProduction) {
|
|
68
|
+
const globalObject = getGlobalObjectSafe();
|
|
56
69
|
assertWarning(globalObject.isClientRouting !== false, clientRuntimesClonflict, {
|
|
57
70
|
onlyOnce: true,
|
|
58
71
|
showStackTrace: true
|
|
@@ -68,10 +81,12 @@ function assertSingleInstance_onClientEntryClientRouting(isProduction) {
|
|
|
68
81
|
}
|
|
69
82
|
// Called by utils/assert.ts which is (most certainly) loaded by all entries. That way we don't have to call a callback for every entry. (There are a lot of entries: `client/router/`, `client/`, `node/runtime/`, `node/plugin/`, `node/cli`.)
|
|
70
83
|
function assertSingleInstance_onAssertModuleLoad() {
|
|
84
|
+
const globalObject = getGlobalObjectSafe();
|
|
71
85
|
globalObject.instances.push(PROJECT_VERSION_js_1.PROJECT_VERSION);
|
|
72
86
|
assertSingleInstance();
|
|
73
87
|
}
|
|
74
88
|
function assertWarning(condition, errorMessage, { onlyOnce, showStackTrace }) {
|
|
89
|
+
const globalObject = getGlobalObjectSafe();
|
|
75
90
|
if (condition) {
|
|
76
91
|
return;
|
|
77
92
|
}
|
|
@@ -24,14 +24,19 @@ async function cmdDev() {
|
|
|
24
24
|
const startTime = performance.now();
|
|
25
25
|
try {
|
|
26
26
|
const { viteServer } = await dev();
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
if (viteServer.httpServer) {
|
|
28
|
+
await viteServer.listen();
|
|
29
|
+
const info = viteServer.config.logger.info;
|
|
30
|
+
const startupDurationString = pc.dim(`ready in ${pc.reset(pc.bold(String(Math.ceil(performance.now() - startTime))))} ms`);
|
|
31
|
+
const hasExistingLogs = process.stdout.bytesWritten > 0 || process.stderr.bytesWritten > 0;
|
|
32
|
+
info(` ${pc.yellow(`${pc.bold('Vike')} v${PROJECT_VERSION}`)} ${startupDurationString}\n`, {
|
|
33
|
+
clear: !hasExistingLogs
|
|
34
|
+
});
|
|
35
|
+
viteServer.printUrls();
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// vike-server => middleware mode => `viteServer.httpServer === null`
|
|
39
|
+
}
|
|
35
40
|
viteServer.bindCLIShortcuts({ print: true });
|
|
36
41
|
}
|
|
37
42
|
catch (err) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getResolvedConfig } from '../../shared/getResolvedConfig.js';
|
|
1
2
|
export { pluginAutoFullBuild };
|
|
2
3
|
export { isPrerenderForceExit };
|
|
3
4
|
import { build } from 'vite';
|
|
@@ -15,7 +16,7 @@ import { isViteClientBuild, isViteServerBuild_onlySsrEnv } from '../../shared/is
|
|
|
15
16
|
assertIsSingleModuleInstance('build/pluginAutoFullBuild.ts');
|
|
16
17
|
let forceExit = false;
|
|
17
18
|
function pluginAutoFullBuild() {
|
|
18
|
-
let
|
|
19
|
+
let vite5Config;
|
|
19
20
|
let vikeConfig;
|
|
20
21
|
return [
|
|
21
22
|
{
|
|
@@ -24,7 +25,7 @@ function pluginAutoFullBuild() {
|
|
|
24
25
|
enforce: 'pre',
|
|
25
26
|
async configResolved(config_) {
|
|
26
27
|
vikeConfig = await getVikeConfig(config_);
|
|
27
|
-
|
|
28
|
+
vite5Config = config_;
|
|
28
29
|
abortViteBuildSsr(vikeConfig);
|
|
29
30
|
},
|
|
30
31
|
writeBundle: {
|
|
@@ -33,6 +34,7 @@ function pluginAutoFullBuild() {
|
|
|
33
34
|
order: 'pre',
|
|
34
35
|
*/
|
|
35
36
|
async handler(options, bundle) {
|
|
37
|
+
const config = getResolvedConfig(this.environment?.config, vite5Config);
|
|
36
38
|
await handleAssetsManifest(config, this.environment, options, bundle);
|
|
37
39
|
await triggerFullBuild(config, vikeConfig, this.environment, bundle);
|
|
38
40
|
}
|
|
@@ -46,6 +48,7 @@ function pluginAutoFullBuild() {
|
|
|
46
48
|
sequential: true,
|
|
47
49
|
order: 'post',
|
|
48
50
|
handler() {
|
|
51
|
+
const config = getResolvedConfig(this.environment?.config, vite5Config);
|
|
49
52
|
onSetupBuild();
|
|
50
53
|
handleAssetsManifest_assertUsageCssTarget(config);
|
|
51
54
|
if (forceExit &&
|
|
@@ -90,7 +93,7 @@ async function triggerFullBuild(config, vikeConfig, viteEnv, bundle) {
|
|
|
90
93
|
// The server bulid is already called by builder.buildApp()
|
|
91
94
|
}
|
|
92
95
|
if (isPrerenderAutoRunEnabled(vikeConfig)) {
|
|
93
|
-
const res = await runPrerenderFromAutoRun(configInline
|
|
96
|
+
const res = await runPrerenderFromAutoRun(configInline);
|
|
94
97
|
forceExit = res.forceExit;
|
|
95
98
|
}
|
|
96
99
|
}
|
|
@@ -7,18 +7,20 @@
|
|
|
7
7
|
* Reproduction: https://github.com/brillout/vite-plugin-ssr-server-import-syntax
|
|
8
8
|
*/
|
|
9
9
|
// TODO/refactor: prefix all other plugins with `plugin` as well?
|
|
10
|
+
import { getResolvedConfig } from '../../shared/getResolvedConfig.js';
|
|
10
11
|
export { pluginDistPackageJsonFile };
|
|
11
12
|
import { rollupIsEsm } from '../../shared/rollupIsEsm.js';
|
|
12
13
|
import { isViteServerBuild } from '../../shared/isViteServerBuild.js';
|
|
13
14
|
function pluginDistPackageJsonFile() {
|
|
14
|
-
let
|
|
15
|
+
let vite5Config;
|
|
15
16
|
return {
|
|
16
17
|
name: 'vike:build:pluginDistPackageJsonFile',
|
|
17
18
|
apply: 'build',
|
|
18
19
|
configResolved(config_) {
|
|
19
|
-
|
|
20
|
+
vite5Config = config_;
|
|
20
21
|
},
|
|
21
22
|
generateBundle(options, bundle) {
|
|
23
|
+
const config = getResolvedConfig(this.environment?.config, vite5Config);
|
|
22
24
|
if (!isViteServerBuild(config))
|
|
23
25
|
return;
|
|
24
26
|
const isEsm = rollupIsEsm(options);
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { getResolvedConfig } from '../../shared/getResolvedConfig.js';
|
|
1
2
|
export { pluginModuleBanner };
|
|
3
|
+
import MagicString from 'magic-string';
|
|
2
4
|
import { assert } from '../../utils.js';
|
|
3
5
|
import { removeVirtualIdTag } from '../../../shared/virtual-files.js';
|
|
4
6
|
import { isViteServerBuild, isViteServerBuild_safe } from '../../shared/isViteServerBuild.js';
|
|
@@ -6,17 +8,18 @@ import { isViteServerBuild, isViteServerBuild_safe } from '../../shared/isViteSe
|
|
|
6
8
|
// But, anyways, we want to prepend the banner at the beginning of each module, not at the beginning of each file (I believe that's what Rollup's banner feature does).
|
|
7
9
|
const vikeModuleBannerPlaceholder = 'vikeModuleBannerPlaceholder';
|
|
8
10
|
function pluginModuleBanner() {
|
|
9
|
-
let
|
|
11
|
+
let vite5Config;
|
|
10
12
|
return {
|
|
11
13
|
name: 'vike:pluginModuleBanner',
|
|
12
14
|
enforce: 'post',
|
|
13
15
|
apply: 'build',
|
|
14
16
|
configResolved(config_) {
|
|
15
|
-
|
|
17
|
+
vite5Config = config_;
|
|
16
18
|
},
|
|
17
19
|
generateBundle: {
|
|
18
20
|
order: 'post',
|
|
19
21
|
handler(_options, bundle) {
|
|
22
|
+
const config = getResolvedConfig(this.environment?.config, vite5Config);
|
|
20
23
|
for (const module of Object.values(bundle)) {
|
|
21
24
|
if (module.type === 'chunk') {
|
|
22
25
|
if (isViteServerBuild(config)) {
|
|
@@ -35,6 +38,7 @@ function pluginModuleBanner() {
|
|
|
35
38
|
transform: {
|
|
36
39
|
order: 'post',
|
|
37
40
|
handler(code, id, options) {
|
|
41
|
+
const config = getResolvedConfig(this.environment?.config, vite5Config);
|
|
38
42
|
if (!isViteServerBuild_safe(config, options))
|
|
39
43
|
return;
|
|
40
44
|
if (id.startsWith('\0'))
|
|
@@ -42,7 +46,13 @@ function pluginModuleBanner() {
|
|
|
42
46
|
id = removeVirtualIdTag(id);
|
|
43
47
|
if (id.startsWith(config.root))
|
|
44
48
|
id = id.slice(config.root.length + 1);
|
|
45
|
-
|
|
49
|
+
const s = new MagicString(code);
|
|
50
|
+
// No need to insert a new line; Rollup formats the code and will insert a new line.
|
|
51
|
+
s.prepend(`${vikeModuleBannerPlaceholder}(${JSON.stringify(id)}); `);
|
|
52
|
+
return {
|
|
53
|
+
code: s.toString(),
|
|
54
|
+
map: s.generateMap({ hires: true, source: id })
|
|
55
|
+
};
|
|
46
56
|
}
|
|
47
57
|
}
|
|
48
58
|
};
|
|
@@ -20,8 +20,14 @@ declare module 'vite' {
|
|
|
20
20
|
type VikeConfigPublic = {
|
|
21
21
|
config: VikeConfigObject['global']['config'];
|
|
22
22
|
pages: VikeConfigObject['pages'];
|
|
23
|
-
prerenderContext
|
|
23
|
+
prerenderContext: PrerenderContext;
|
|
24
24
|
};
|
|
25
|
+
type PrerenderContext = {
|
|
26
|
+
isPrerenderingEnabled: boolean;
|
|
27
|
+
isPrerenderingEnabledForAllPages: boolean;
|
|
28
|
+
} & ({
|
|
29
|
+
[K in keyof PrerenderContextPublic]: null;
|
|
30
|
+
} | PrerenderContextPublic);
|
|
25
31
|
declare function commonConfig(vikeVitePluginOptions: unknown): Plugin[];
|
|
26
32
|
/**
|
|
27
33
|
* Get all the information Vike knows about the app in your Vite plugin.
|
|
@@ -14,6 +14,8 @@ import { temp_disablePrerenderAutoRun } from '../../prerender/context.js';
|
|
|
14
14
|
import { resolvePrerenderConfigGlobal } from '../../prerender/resolvePrerenderConfig.js';
|
|
15
15
|
const pluginName = 'vike:commonConfig';
|
|
16
16
|
function commonConfig(vikeVitePluginOptions) {
|
|
17
|
+
// We cache it => makes sure we only generate one object => we can mutate it at runPrerender()
|
|
18
|
+
let prerenderContext;
|
|
17
19
|
return [
|
|
18
20
|
{
|
|
19
21
|
name: `${pluginName}:pre`,
|
|
@@ -26,6 +28,15 @@ function commonConfig(vikeVitePluginOptions) {
|
|
|
26
28
|
const root = configFromUser.root ? normalizeViteRoot(configFromUser.root) : await getViteRoot(operation);
|
|
27
29
|
assert(root);
|
|
28
30
|
const vikeConfig = await getVikeConfig2(root, isDev, vikeVitePluginOptions);
|
|
31
|
+
const { isPrerenderingEnabled, isPrerenderingEnabledForAllPages } = resolvePrerenderConfigGlobal(vikeConfig);
|
|
32
|
+
prerenderContext ?? (prerenderContext = {
|
|
33
|
+
isPrerenderingEnabled,
|
|
34
|
+
isPrerenderingEnabledForAllPages,
|
|
35
|
+
output: null,
|
|
36
|
+
pageContexts: null
|
|
37
|
+
});
|
|
38
|
+
assert(prerenderContext.isPrerenderingEnabled === isPrerenderingEnabled);
|
|
39
|
+
assert(prerenderContext.isPrerenderingEnabledForAllPages === isPrerenderingEnabledForAllPages);
|
|
29
40
|
return {
|
|
30
41
|
_isDev: isDev,
|
|
31
42
|
_root: root,
|
|
@@ -33,11 +44,12 @@ function commonConfig(vikeVitePluginOptions) {
|
|
|
33
44
|
_vikeConfigObject: vikeConfig,
|
|
34
45
|
_vike: {
|
|
35
46
|
pages: vikeConfig.pages,
|
|
36
|
-
config: vikeConfig.global.config
|
|
47
|
+
config: vikeConfig.global.config,
|
|
48
|
+
prerenderContext
|
|
37
49
|
},
|
|
38
50
|
// TODO/v1-release: remove https://github.com/vikejs/vike/issues/2122
|
|
39
51
|
configVikePromise: Promise.resolve({
|
|
40
|
-
prerender:
|
|
52
|
+
prerender: isPrerenderingEnabled
|
|
41
53
|
})
|
|
42
54
|
};
|
|
43
55
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getResolvedConfig } from '../../shared/getResolvedConfig.js';
|
|
1
2
|
export { devConfig };
|
|
2
3
|
export { logDockerHint };
|
|
3
4
|
import { determineOptimizeDeps } from './determineOptimizeDeps.js';
|
|
@@ -12,7 +13,7 @@ if (isErrorDebug()) {
|
|
|
12
13
|
Error.stackTraceLimit = Infinity;
|
|
13
14
|
}
|
|
14
15
|
function devConfig() {
|
|
15
|
-
let
|
|
16
|
+
let vite5Config;
|
|
16
17
|
return [
|
|
17
18
|
{
|
|
18
19
|
name: 'vike:devConfig',
|
|
@@ -57,14 +58,14 @@ function devConfig() {
|
|
|
57
58
|
};
|
|
58
59
|
},
|
|
59
60
|
async configResolved(config_) {
|
|
60
|
-
|
|
61
|
-
await determineOptimizeDeps(
|
|
62
|
-
await determineFsAllowList(
|
|
61
|
+
vite5Config = config_;
|
|
62
|
+
await determineOptimizeDeps(vite5Config);
|
|
63
|
+
await determineFsAllowList(vite5Config);
|
|
63
64
|
if (!isErrorDebug()) {
|
|
64
65
|
await installHttpRequestAsyncStore();
|
|
65
|
-
improveViteLogs(
|
|
66
|
+
improveViteLogs(vite5Config);
|
|
66
67
|
}
|
|
67
|
-
logDockerHint(
|
|
68
|
+
logDockerHint(vite5Config.server.host);
|
|
68
69
|
}
|
|
69
70
|
},
|
|
70
71
|
{
|
|
@@ -75,6 +76,7 @@ function devConfig() {
|
|
|
75
76
|
configureServer: {
|
|
76
77
|
order: 'post',
|
|
77
78
|
handler(server) {
|
|
79
|
+
const config = getResolvedConfig(server?.config, vite5Config);
|
|
78
80
|
const hasHonoViteDevServer = !!config.plugins.find((p) => p.name === '@hono/vite-dev-server');
|
|
79
81
|
if (config.server.middlewareMode || hasHonoViteDevServer)
|
|
80
82
|
return;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import MagicString from 'magic-string';
|
|
1
2
|
export { envVarsPlugin };
|
|
2
3
|
import { loadEnv } from 'vite';
|
|
3
4
|
import { assert, assertPosixPath, assertUsage, assertWarning, escapeRegex, isArray, lowerFirst } from '../utils.js';
|
|
4
|
-
import { sourceMapPassthrough } from '../shared/rollupSourceMap.js';
|
|
5
5
|
import { getModuleFilePathAbsolute } from '../shared/getFilePath.js';
|
|
6
6
|
import { normalizeId } from '../shared/normalizeId.js';
|
|
7
7
|
import { isViteServerBuild_safe } from '../shared/isViteServerBuild.js';
|
|
8
|
+
import { getResolvedConfig } from '../shared/getResolvedConfig.js';
|
|
8
9
|
// TODO/enventually: (after we implemented vike.config.js)
|
|
9
10
|
// - Make import.meta.env work inside +config.js
|
|
10
11
|
// - For it to work, we'll probably need the user to define the settings (e.g. `envDir`) for loadEnv() inside vike.config.js instead of vite.config.js
|
|
@@ -16,17 +17,18 @@ const PUBLIC_ENV_WHITELIST = [
|
|
|
16
17
|
];
|
|
17
18
|
function envVarsPlugin() {
|
|
18
19
|
let envsAll;
|
|
19
|
-
let
|
|
20
|
+
let vite5Config;
|
|
20
21
|
return {
|
|
21
22
|
name: 'vike:envVars',
|
|
22
23
|
enforce: 'post',
|
|
23
24
|
configResolved(config_) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
envsAll = loadEnv(
|
|
27
|
-
|
|
25
|
+
vite5Config = config_;
|
|
26
|
+
vite5Config.command;
|
|
27
|
+
envsAll = loadEnv(vite5Config.mode, vite5Config.envDir || vite5Config.root, '');
|
|
28
|
+
vite5Config.plugins.sort(lowerFirst((plugin) => (plugin.name === 'vite:define' ? 1 : 0)));
|
|
28
29
|
},
|
|
29
30
|
transform(code, id, options) {
|
|
31
|
+
const config = getResolvedConfig(this.environment?.config, vite5Config);
|
|
30
32
|
id = normalizeId(id);
|
|
31
33
|
assertPosixPath(id);
|
|
32
34
|
if (id.includes('/node_modules/'))
|
|
@@ -38,6 +40,7 @@ function envVarsPlugin() {
|
|
|
38
40
|
return;
|
|
39
41
|
const isBuild = config.command === 'build';
|
|
40
42
|
const isClientSide = !isViteServerBuild_safe(config, options);
|
|
43
|
+
const s = new MagicString(code);
|
|
41
44
|
Object.entries(envsAll)
|
|
42
45
|
.filter(([key]) => {
|
|
43
46
|
// Already handled by Vite
|
|
@@ -46,12 +49,12 @@ function envVarsPlugin() {
|
|
|
46
49
|
})
|
|
47
50
|
.forEach(([envName, envVal]) => {
|
|
48
51
|
const envStatement = `import.meta.env.${envName}`;
|
|
49
|
-
const
|
|
52
|
+
const envStatementRegExStr = escapeRegex(envStatement) + '\\b';
|
|
50
53
|
// Security check
|
|
51
54
|
{
|
|
52
55
|
const isPrivate = !envName.startsWith(PUBLIC_ENV_PREFIX) && !PUBLIC_ENV_WHITELIST.includes(envName);
|
|
53
56
|
if (isPrivate && isClientSide) {
|
|
54
|
-
if (!
|
|
57
|
+
if (!new RegExp(envStatementRegExStr).test(code))
|
|
55
58
|
return;
|
|
56
59
|
const modulePath = getModuleFilePathAbsolute(id, config);
|
|
57
60
|
const errMsgAddendum = isBuild ? '' : ' (Vike will prevent your app from building for production)';
|
|
@@ -70,16 +73,21 @@ function envVarsPlugin() {
|
|
|
70
73
|
assert(!(isPrivate && isClientSide) || !isBuild);
|
|
71
74
|
}
|
|
72
75
|
// Apply
|
|
73
|
-
|
|
76
|
+
applyEnvVar(s, envStatementRegExStr, envVal);
|
|
74
77
|
});
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
if (!s.hasChanged())
|
|
79
|
+
return null;
|
|
80
|
+
return {
|
|
81
|
+
code: s.toString(),
|
|
82
|
+
map: s.generateMap({ hires: true, source: id })
|
|
83
|
+
};
|
|
80
84
|
}
|
|
81
85
|
};
|
|
82
86
|
}
|
|
83
|
-
function applyEnvVar(
|
|
84
|
-
|
|
87
|
+
function applyEnvVar(s, envStatementRegExStr, envVal) {
|
|
88
|
+
const envStatementRegEx = new RegExp(envStatementRegExStr, 'g');
|
|
89
|
+
let match;
|
|
90
|
+
while ((match = envStatementRegEx.exec(s.original))) {
|
|
91
|
+
s.overwrite(match.index, match.index + match[0].length, JSON.stringify(envVal));
|
|
92
|
+
}
|
|
85
93
|
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// - This is needed for HTML-only pages, and React Server Components.
|
|
5
5
|
// - We recommend using the debug flag to get an idea of how this plugin works: `$ DEBUG=vike:extractAssets pnpm exec vike build`. Then have a look at `dist/client/manifest.json` and see how `.page.server.js` entries have zero JavaScript but only CSS.
|
|
6
6
|
// - This appraoch supports import path aliases `vite.config.js#resolve.alias` https://vitejs.dev/config/#resolve-alias
|
|
7
|
+
import { getResolvedConfig } from '../shared/getResolvedConfig.js';
|
|
7
8
|
export { extractAssetsPlugin };
|
|
8
9
|
export { extractAssetsRE };
|
|
9
10
|
import { assert, assertPosixPath, styleFileRE, createDebugger, isScriptFile, assertUsage } from '../utils.js';
|
|
@@ -24,7 +25,7 @@ const urlRE = /(\?|&)url(?:&|$)/;
|
|
|
24
25
|
const EMPTY_MODULE_ID = 'virtual:vike:empty-module';
|
|
25
26
|
const debug = createDebugger('vike:extractAssets');
|
|
26
27
|
function extractAssetsPlugin() {
|
|
27
|
-
let
|
|
28
|
+
let vite5Config;
|
|
28
29
|
let vikeConfig;
|
|
29
30
|
let isFixEnabled;
|
|
30
31
|
return [
|
|
@@ -35,6 +36,7 @@ function extractAssetsPlugin() {
|
|
|
35
36
|
apply: 'build',
|
|
36
37
|
enforce: 'post',
|
|
37
38
|
async transform(src, id, options) {
|
|
39
|
+
const config = getResolvedConfig(this.environment?.config, vite5Config);
|
|
38
40
|
id = normalizeId(id);
|
|
39
41
|
if (!extractAssetsRE.test(id)) {
|
|
40
42
|
return;
|
|
@@ -63,6 +65,7 @@ function extractAssetsPlugin() {
|
|
|
63
65
|
// - Vite's `vite:resolve` plugin; https://github.com/vitejs/vite/blob/d649daba7682791178b711d9a3e44a6b5d00990c/packages/vite/src/node/plugins/resolve.ts#L105
|
|
64
66
|
enforce: 'pre',
|
|
65
67
|
async resolveId(source, importer, options) {
|
|
68
|
+
const config = getResolvedConfig(this.environment?.config, vite5Config);
|
|
66
69
|
if (isViteServerBuild_safe(config, options)) {
|
|
67
70
|
// When building for the server, there should never be a `?extractAssets` query
|
|
68
71
|
assert(!extractAssetsRE.test(source));
|
|
@@ -138,12 +141,12 @@ function extractAssetsPlugin() {
|
|
|
138
141
|
{
|
|
139
142
|
name: 'vike:extractAssets-4',
|
|
140
143
|
async configResolved(config_) {
|
|
141
|
-
|
|
142
|
-
vikeConfig = await getVikeConfig(
|
|
143
|
-
isFixEnabled = handleAssetsManifest_isFixEnabled(
|
|
144
|
+
vite5Config = config_;
|
|
145
|
+
vikeConfig = await getVikeConfig(vite5Config);
|
|
146
|
+
isFixEnabled = handleAssetsManifest_isFixEnabled(vite5Config);
|
|
144
147
|
if (!isFixEnabled) {
|
|
145
148
|
// https://github.com/vikejs/vike/issues/1060
|
|
146
|
-
assertUsage(!
|
|
149
|
+
assertUsage(!vite5Config.plugins.find((p) => p.name === 'vite-tsconfig-paths'), 'vite-tsconfig-paths not supported, remove it and use vite.config.js#resolve.alias instead');
|
|
147
150
|
}
|
|
148
151
|
}
|
|
149
152
|
}
|