vike 0.4.225-commit-2b7971f → 0.4.225-commit-6fc12fc

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 (85) hide show
  1. package/dist/cjs/node/api/build.js +7 -7
  2. package/dist/cjs/node/api/dev.js +2 -2
  3. package/dist/cjs/node/api/prepareViteApiCall.js +45 -30
  4. package/dist/cjs/node/api/prerender.js +2 -3
  5. package/dist/cjs/node/api/preview.js +25 -6
  6. package/dist/cjs/node/api/utils.js +1 -0
  7. package/dist/cjs/node/cli/entry.js +4 -2
  8. package/dist/cjs/node/cli/parseCli.js +10 -4
  9. package/dist/cjs/node/plugin/plugins/build/pluginAutoFullBuild.js +2 -2
  10. package/dist/cjs/node/plugin/plugins/build/pluginModuleBanner.js +51 -0
  11. package/dist/cjs/node/plugin/plugins/build.js +3 -1
  12. package/dist/cjs/node/plugin/plugins/commonConfig.js +4 -0
  13. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +4 -0
  14. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +19 -6
  15. package/dist/cjs/node/plugin/shared/getEnvVarObject.js +7 -0
  16. package/dist/cjs/node/prerender/runPrerender.js +2 -2
  17. package/dist/cjs/node/prerender/utils.js +1 -1
  18. package/dist/cjs/node/runtime/globalContext.js +8 -4
  19. package/dist/cjs/node/runtime/utils.js +1 -1
  20. package/dist/cjs/node/runtime-dev/createDevMiddleware.js +2 -2
  21. package/dist/cjs/node/shared/utils.js +1 -1
  22. package/dist/cjs/node/shared/virtual-files.js +14 -10
  23. package/dist/cjs/shared/modifyUrl.js +3 -5
  24. package/dist/cjs/shared/modifyUrlSameOrigin.js +42 -0
  25. package/dist/cjs/shared/utils.js +2 -1
  26. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  27. package/dist/cjs/utils/isNullish.js +16 -0
  28. package/dist/cjs/utils/objectFilter.js +10 -0
  29. package/dist/cjs/utils/pick.js +12 -0
  30. package/dist/esm/client/client-routing-runtime/navigate.d.ts +6 -5
  31. package/dist/esm/client/client-routing-runtime/navigate.js +6 -2
  32. package/dist/esm/client/client-routing-runtime/normalizeUrlArgument.js +1 -1
  33. package/dist/esm/node/api/build.js +7 -7
  34. package/dist/esm/node/api/dev.js +2 -2
  35. package/dist/esm/node/api/prepareViteApiCall.d.ts +2 -1
  36. package/dist/esm/node/api/prepareViteApiCall.js +47 -32
  37. package/dist/esm/node/api/prerender.js +2 -3
  38. package/dist/esm/node/api/preview.d.ts +1 -1
  39. package/dist/esm/node/api/preview.js +22 -6
  40. package/dist/esm/node/api/utils.d.ts +1 -0
  41. package/dist/esm/node/api/utils.js +1 -0
  42. package/dist/esm/node/cli/entry.js +4 -2
  43. package/dist/esm/node/cli/parseCli.js +10 -4
  44. package/dist/esm/node/plugin/plugins/build/pluginAutoFullBuild.js +2 -2
  45. package/dist/esm/node/plugin/plugins/build/pluginModuleBanner.d.ts +3 -0
  46. package/dist/esm/node/plugin/plugins/build/pluginModuleBanner.js +49 -0
  47. package/dist/esm/node/plugin/plugins/build.js +3 -1
  48. package/dist/esm/node/plugin/plugins/commonConfig.d.ts +3 -1
  49. package/dist/esm/node/plugin/plugins/commonConfig.js +4 -0
  50. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +4 -0
  51. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +8 -0
  52. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +19 -6
  53. package/dist/esm/node/plugin/shared/getEnvVarObject.js +7 -0
  54. package/dist/esm/node/prerender/runPrerender.js +2 -2
  55. package/dist/esm/node/prerender/utils.d.ts +1 -1
  56. package/dist/esm/node/prerender/utils.js +1 -1
  57. package/dist/esm/node/runtime/globalContext.d.ts +2 -3
  58. package/dist/esm/node/runtime/globalContext.js +8 -4
  59. package/dist/esm/node/runtime/utils.d.ts +1 -1
  60. package/dist/esm/node/runtime/utils.js +1 -1
  61. package/dist/esm/node/runtime-dev/createDevMiddleware.js +2 -2
  62. package/dist/esm/node/shared/utils.d.ts +1 -1
  63. package/dist/esm/node/shared/utils.js +1 -1
  64. package/dist/esm/node/shared/virtual-files.d.ts +2 -0
  65. package/dist/esm/node/shared/virtual-files.js +14 -10
  66. package/dist/esm/shared/modifyUrl.d.ts +2 -2
  67. package/dist/esm/shared/modifyUrl.js +3 -5
  68. package/dist/esm/shared/modifyUrlSameOrigin.d.ts +9 -0
  69. package/dist/esm/shared/modifyUrlSameOrigin.js +40 -0
  70. package/dist/esm/shared/page-configs/Config.d.ts +6 -0
  71. package/dist/esm/shared/utils.d.ts +2 -1
  72. package/dist/esm/shared/utils.js +2 -1
  73. package/dist/esm/types/index.d.ts +0 -1
  74. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  75. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  76. package/dist/esm/utils/isNullish.d.ts +3 -0
  77. package/dist/esm/utils/isNullish.js +11 -0
  78. package/dist/esm/utils/objectFilter.d.ts +1 -0
  79. package/dist/esm/utils/objectFilter.js +7 -0
  80. package/dist/esm/utils/pick.d.ts +1 -0
  81. package/dist/esm/utils/pick.js +9 -0
  82. package/package.json +2 -2
  83. package/dist/cjs/utils/isNotNullish.js +0 -5
  84. package/dist/esm/utils/isNotNullish.d.ts +0 -1
  85. package/dist/esm/utils/isNotNullish.js +0 -1
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.modifyUrlSameOrigin = modifyUrlSameOrigin;
4
+ const utils_js_1 = require("./utils.js");
5
+ function modifyUrlSameOrigin(url, modify) {
6
+ const urlParsed = (0, utils_js_1.parseUrl)(url, '/');
7
+ // Pathname
8
+ const pathname = modify.pathname ?? urlParsed.pathnameOriginal;
9
+ (0, utils_js_1.assertUsageUrlPathnameAbsolute)(pathname, 'modify.pathname');
10
+ // Search
11
+ let search = modify.search === null ? '' : !modify.search ? urlParsed.searchOriginal : resolveSearch(urlParsed, modify.search);
12
+ if (search === '?')
13
+ search = '';
14
+ // Hash
15
+ let hash;
16
+ if (modify.hash === null) {
17
+ hash = '';
18
+ }
19
+ else if (modify.hash === undefined) {
20
+ hash = urlParsed.hashOriginal ?? '';
21
+ }
22
+ else {
23
+ hash = modify.hash;
24
+ if (!hash.startsWith('#'))
25
+ hash = '#' + hash;
26
+ }
27
+ const urlModified = (0, utils_js_1.createUrlFromComponents)(urlParsed.origin, pathname, search, hash);
28
+ return urlModified;
29
+ }
30
+ function resolveSearch(urlParsed, search) {
31
+ let searchParams;
32
+ if (search instanceof URLSearchParams) {
33
+ // Overwrite
34
+ searchParams = search;
35
+ }
36
+ else {
37
+ // Merge
38
+ const searchMap = (0, utils_js_1.objectFilter)({ ...urlParsed.search, ...search }, (utils_js_1.isNotNullish_keyVal));
39
+ searchParams = new URLSearchParams(searchMap);
40
+ }
41
+ return '?' + searchParams.toString();
42
+ }
@@ -30,7 +30,7 @@ __exportStar(require("../utils/isBrowser.js"), exports);
30
30
  __exportStar(require("../utils/hasProp.js"), exports);
31
31
  __exportStar(require("../utils/isPlainObject.js"), exports);
32
32
  __exportStar(require("../utils/compareString.js"), exports);
33
- __exportStar(require("../utils/isNotNullish.js"), exports);
33
+ __exportStar(require("../utils/isNullish.js"), exports);
34
34
  __exportStar(require("../utils/stringifyStringArray.js"), exports);
35
35
  __exportStar(require("../utils/cast.js"), exports);
36
36
  __exportStar(require("../utils/isPropertyGetter.js"), exports);
@@ -42,3 +42,4 @@ __exportStar(require("../utils/isArray.js"), exports);
42
42
  __exportStar(require("../utils/changeEnumerable.js"), exports);
43
43
  __exportStar(require("../utils/objectDefineProperty.js"), exports);
44
44
  __exportStar(require("../utils/isScriptFile.js"), exports);
45
+ __exportStar(require("../utils/objectFilter.js"), exports);
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PROJECT_VERSION = void 0;
4
4
  // Automatically updated by @brillout/release-me
5
- exports.PROJECT_VERSION = '0.4.225-commit-2b7971f';
5
+ exports.PROJECT_VERSION = '0.4.225-commit-6fc12fc';
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isNullish = isNullish;
4
+ exports.isNotNullish = isNotNullish;
5
+ exports.isNotNullish_keyVal = isNotNullish_keyVal;
6
+ function isNullish(val) {
7
+ return val === null || val === undefined;
8
+ }
9
+ // someArray.filter(isNotNullish)
10
+ function isNotNullish(p) {
11
+ return !isNullish(p);
12
+ }
13
+ // objectFilter(obj).filter(isNotNullish_keyVal)
14
+ function isNotNullish_keyVal(arg) {
15
+ return !isNullish(arg[1]);
16
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.objectFilter = objectFilter;
4
+ // Type inference for:
5
+ // ```js
6
+ // Object.fromEntries(Object.entries(obj).filter(someFilter))
7
+ // ```
8
+ function objectFilter(obj, filter) {
9
+ return Object.fromEntries(Object.entries(obj).filter(filter));
10
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pick = pick;
4
+ function pick(obj, keys) {
5
+ const result = {};
6
+ for (const key of keys) {
7
+ if (key in obj) {
8
+ result[key] = obj[key];
9
+ }
10
+ }
11
+ return result;
12
+ }
@@ -1,5 +1,10 @@
1
1
  export { navigate };
2
2
  export { reload };
3
+ type Options = {
4
+ keepScrollPosition?: boolean;
5
+ overwriteLastHistoryEntry?: boolean;
6
+ pageContext?: Record<string, unknown>;
7
+ };
3
8
  /** Programmatically navigate to a new page.
4
9
  *
5
10
  * https://vike.dev/navigate
@@ -8,9 +13,5 @@ export { reload };
8
13
  * @param keepScrollPosition - Don't scroll to the top of the page, instead keep the current scroll position.
9
14
  * @param overwriteLastHistoryEntry - Don't create a new entry in the browser's history, instead let the new URL replace the current URL. (This effectively removes the current URL from the browser history).
10
15
  */
11
- declare function navigate(url: string, { keepScrollPosition, overwriteLastHistoryEntry, pageContext }?: {
12
- keepScrollPosition?: boolean;
13
- overwriteLastHistoryEntry?: boolean;
14
- pageContext?: Record<string, unknown>;
15
- }): Promise<void>;
16
+ declare function navigate(url: string, options?: Options): Promise<void>;
16
17
  declare function reload(): Promise<void>;
@@ -1,5 +1,6 @@
1
1
  export { navigate };
2
2
  export { reload };
3
+ // import { modifyUrlSameOrigin, ModifyUrlSameOriginOptions } from '../../shared/modifyUrlSameOrigin.js'
3
4
  import { getCurrentUrl } from '../shared/getCurrentUrl.js';
4
5
  import { normalizeUrlArgument } from './normalizeUrlArgument.js';
5
6
  import { firstRenderStartPromise, renderPageClientSide } from './renderPageClientSide.js';
@@ -13,11 +14,14 @@ assertClientRouting();
13
14
  * @param keepScrollPosition - Don't scroll to the top of the page, instead keep the current scroll position.
14
15
  * @param overwriteLastHistoryEntry - Don't create a new entry in the browser's history, instead let the new URL replace the current URL. (This effectively removes the current URL from the browser history).
15
16
  */
16
- async function navigate(url, { keepScrollPosition = false, overwriteLastHistoryEntry = false, pageContext } = {}) {
17
+ async function navigate(url, options) {
18
+ // let url = normalizeUrlArgument(options.url ?? getCurrentUrl(), 'navigate')
19
+ // url = modifyUrlSameOrigin(url, options)
17
20
  normalizeUrlArgument(url, 'navigate');
18
21
  // If `hydrationCanBeAborted === false` (e.g. Vue) then we can apply navigate() only after hydration is done
19
22
  await firstRenderStartPromise;
20
- const scrollTarget = { preserveScroll: keepScrollPosition };
23
+ const { keepScrollPosition, overwriteLastHistoryEntry, pageContext } = options ?? {};
24
+ const scrollTarget = { preserveScroll: keepScrollPosition ?? false };
21
25
  await renderPageClientSide({
22
26
  scrollTarget,
23
27
  urlOriginal: url,
@@ -2,7 +2,7 @@ export { normalizeUrlArgument };
2
2
  import { assertUsage, isUrl, isUrlRelative } from './utils.js';
3
3
  function normalizeUrlArgument(url, fnName) {
4
4
  // Succinct error message to save client-side KBs
5
- const errMsg = `[${fnName}(url)] Invalid URL ${url}`;
5
+ const errMsg = `URL ${url} passed to ${fnName}() is invalid`;
6
6
  assertUsage(isUrl(url), errMsg);
7
7
  if (url.startsWith(location.origin)) {
8
8
  // Use normalizeClientSideUrl() instead?
@@ -11,13 +11,13 @@ import { assertVersion } from './utils.js';
11
11
  * https://vike.dev/api#build
12
12
  */
13
13
  async function build(options = {}) {
14
- const { viteConfigEnhanced, vikeConfig } = await prepareViteApiCall(options, 'build');
14
+ const { viteConfigFromUserEnhanced, vikeConfig } = await prepareViteApiCall(options, 'build');
15
15
  // Pass it to pluginAutoFullBuild()
16
- if (viteConfigEnhanced)
17
- viteConfigEnhanced._viteConfigEnhanced = viteConfigEnhanced;
16
+ if (viteConfigFromUserEnhanced)
17
+ viteConfigFromUserEnhanced._viteConfigFromUserEnhanced = viteConfigFromUserEnhanced;
18
18
  if (vikeConfig.global.config.vite6BuilderApp) {
19
19
  assertVersion('Vite', version, '6.0.0');
20
- const builder = await createBuilder(viteConfigEnhanced);
20
+ const builder = await createBuilder(viteConfigFromUserEnhanced);
21
21
  // See Vite plugin vike:build:pluginBuildApp
22
22
  await builder.buildApp();
23
23
  }
@@ -30,14 +30,14 @@ async function build(options = {}) {
30
30
  // > See: https://github.com/vikejs/vike/blob/c6c7533a56b3a16fc43ed644fc5c10c02d0ff375/vike/node/plugin/plugins/autoFullBuild.ts#L98
31
31
  // > We purposely don't start the pre-rendering in this `build()` function but in a Rollup hook instead.
32
32
  // > Rationale: https://github.com/vikejs/vike/issues/2123
33
- await buildVite(viteConfigEnhanced);
33
+ await buildVite(viteConfigFromUserEnhanced);
34
34
  // After pre-rendering, when using the Vike CLI, the process is forcefully exited at the end of the buildVite() call above.
35
35
  if (isVikeCli() && isPrerendering())
36
36
  assert(false);
37
37
  }
38
38
  return {
39
- /* We don't return `viteConfig` because `viteConfigEnhanced` is `InlineConfig` not `ResolvedConfig`
40
- viteConfig: viteConfigEnhanced,
39
+ /* We don't return `viteConfig` because `viteConfigFromUserEnhanced` is `InlineConfig` not `ResolvedConfig`
40
+ viteConfig: viteConfigFromUserEnhanced,
41
41
  */
42
42
  };
43
43
  }
@@ -7,8 +7,8 @@ import { createServer } from 'vite';
7
7
  * https://vike.dev/api#dev
8
8
  */
9
9
  async function dev(options = {}) {
10
- const { viteConfigEnhanced } = await prepareViteApiCall(options, 'dev');
11
- const server = await createServer(viteConfigEnhanced);
10
+ const { viteConfigFromUserEnhanced } = await prepareViteApiCall(options, 'dev');
11
+ const server = await createServer(viteConfigFromUserEnhanced);
12
12
  return {
13
13
  viteServer: server,
14
14
  viteConfig: server.config
@@ -7,7 +7,8 @@ import type { APIOptions, Operation } from './types.js';
7
7
  import { type VikeConfigObject } from '../plugin/plugins/importUserCode/v1-design/getVikeConfig.js';
8
8
  declare function prepareViteApiCall(options: APIOptions, operation: Operation): Promise<{
9
9
  vikeConfig: VikeConfigObject;
10
- viteConfigEnhanced: InlineConfig | undefined;
10
+ viteConfigResolved: ResolvedConfig;
11
+ viteConfigFromUserEnhanced: InlineConfig | undefined;
11
12
  }>;
12
13
  declare function getViteRoot(operation: Operation): Promise<string>;
13
14
  declare function normalizeViteRoot(root: string): string;
@@ -4,9 +4,9 @@ export { assertViteRoot };
4
4
  export { normalizeViteRoot };
5
5
  import { loadConfigFromFile, mergeConfig, resolveConfig } from 'vite';
6
6
  import { clearContextApiOperation, setContextApiOperation } from './context.js';
7
- import { getVikeConfig2 } from '../plugin/plugins/importUserCode/v1-design/getVikeConfig.js';
7
+ import { getVikeConfig2, getVikeConfigFromCliOrEnv } from '../plugin/plugins/importUserCode/v1-design/getVikeConfig.js';
8
8
  import path from 'path';
9
- import { assert, assertUsage, getGlobalObject, isObject, toPosixPath } from './utils.js';
9
+ import { assert, assertUsage, getGlobalObject, isObject, pick, toPosixPath } from './utils.js';
10
10
  import pc from '@brillout/picocolors';
11
11
  import { clearGlobalContext } from '../runtime/globalContext.js';
12
12
  import { getEnvVarObject } from '../plugin/shared/getEnvVarObject.js';
@@ -14,34 +14,37 @@ const globalObject = getGlobalObject('api/prepareViteApiCall.ts', {});
14
14
  async function prepareViteApiCall(options, operation) {
15
15
  clear();
16
16
  setContextApiOperation(operation, options);
17
- const viteConfigFromOptions = options.viteConfig;
18
- return enhanceViteConfig(viteConfigFromOptions, operation);
17
+ const viteConfigFromUserApiOptions = options.viteConfig;
18
+ return resolveConfigs(viteConfigFromUserApiOptions, operation);
19
19
  }
20
20
  // For subsequent API calls, e.g. calling prerender() after build()
21
21
  function clear() {
22
22
  clearContextApiOperation();
23
23
  clearGlobalContext();
24
24
  }
25
- async function enhanceViteConfig(viteConfigFromOptions, operation) {
26
- const viteInfo = await getViteInfo(viteConfigFromOptions, operation);
27
- await assertViteRoot2(viteInfo.root, viteInfo.viteConfigEnhanced, operation);
25
+ async function resolveConfigs(viteConfigFromUserApiOptions, operation) {
26
+ const viteInfo = await getViteInfo(viteConfigFromUserApiOptions, operation);
27
+ const { viteConfigResolved } = await assertViteRoot2(viteInfo.root, viteInfo.viteConfigFromUserEnhanced, operation);
28
28
  const vikeConfig = await getVikeConfig2(viteInfo.root, operation === 'dev', viteInfo.vikeVitePluginOptions);
29
- const viteConfigEnhanced = addViteSettingsSetByVikeConfig(viteInfo.viteConfigEnhanced, vikeConfig);
29
+ const viteConfigFromUserEnhanced = applyVikeViteConfig(viteInfo.viteConfigFromUserEnhanced, vikeConfig);
30
30
  return {
31
31
  vikeConfig,
32
- viteConfigEnhanced
32
+ viteConfigResolved, // ONLY USE if strictly necessary. (We plan to remove assertViteRoot2() as explained in the comments of that function.)
33
+ viteConfigFromUserEnhanced
33
34
  };
34
35
  }
35
- function addViteSettingsSetByVikeConfig(viteConfigEnhanced, vikeConfig) {
36
+ // Apply +vite
37
+ // - For example, Vike extensions adding Vite plugins
38
+ function applyVikeViteConfig(viteConfigFromUserEnhanced, vikeConfig) {
36
39
  const viteConfigs = vikeConfig.global._from.configsCumulative.vite;
37
40
  if (!viteConfigs)
38
- return viteConfigEnhanced;
41
+ return viteConfigFromUserEnhanced;
39
42
  viteConfigs.values.forEach((v) => {
40
43
  assertUsage(isObject(v.value), `${v.definedAt} should be an object`);
41
- viteConfigEnhanced = mergeConfig(viteConfigEnhanced ?? {}, v.value);
44
+ viteConfigFromUserEnhanced = mergeConfig(viteConfigFromUserEnhanced ?? {}, v.value);
42
45
  assertUsage(!findVikeVitePlugin(v.value), "Using the +vite setting to add Vike's Vite plugin is forbidden");
43
46
  });
44
- return viteConfigEnhanced;
47
+ return viteConfigFromUserEnhanced;
45
48
  }
46
49
  async function getViteRoot(operation) {
47
50
  if (!globalObject.root)
@@ -49,19 +52,30 @@ async function getViteRoot(operation) {
49
52
  assert(globalObject.root);
50
53
  return globalObject.root;
51
54
  }
52
- async function getViteInfo(viteConfigFromOptions, operation) {
53
- let viteConfigEnhanced = viteConfigFromOptions;
55
+ async function getViteInfo(viteConfigFromUserApiOptions, operation) {
56
+ let viteConfigFromUserEnhanced = viteConfigFromUserApiOptions;
54
57
  // Precedence:
55
- // - viteConfigFromUserEnvVar (highest precendence)
56
- // - viteConfigFromOptions
57
- // - viteConfigFromUserViteFile (lowest precendence)
58
+ // 1) viteConfigFromUserEnvVar (highest precendence)
59
+ // 2) viteConfigFromUserVikeConfig
60
+ // 2) viteConfigFromUserApiOptions
61
+ // 3) viteConfigFromUserViteFile (lowest precendence)
62
+ // Resolve Vike's +mode setting
63
+ {
64
+ const viteConfigFromUserVikeConfig = pick(getVikeConfigFromCliOrEnv().vikeConfigFromCliOrEnv, ['mode']);
65
+ if (Object.keys(viteConfigFromUserVikeConfig).length > 0) {
66
+ viteConfigFromUserEnhanced = mergeConfig(viteConfigFromUserEnhanced ?? {}, viteConfigFromUserVikeConfig);
67
+ }
68
+ }
69
+ // Resolve VITE_CONFIG
58
70
  const viteConfigFromUserEnvVar = getEnvVarObject('VITE_CONFIG');
59
- if (viteConfigFromUserEnvVar)
60
- viteConfigEnhanced = mergeConfig(viteConfigEnhanced ?? {}, viteConfigFromUserEnvVar);
61
- const viteConfigFromUserViteFile = await loadViteConfigFile(viteConfigEnhanced, operation);
71
+ if (viteConfigFromUserEnvVar) {
72
+ viteConfigFromUserEnhanced = mergeConfig(viteConfigFromUserEnhanced ?? {}, viteConfigFromUserEnvVar);
73
+ }
74
+ // Resolve vite.config.js
75
+ const viteConfigFromUserViteFile = await loadViteConfigFile(viteConfigFromUserEnhanced, operation);
62
76
  // Correct precedence, replicates Vite:
63
77
  // https://github.com/vitejs/vite/blob/4f5845a3182fc950eb9cd76d7161698383113b18/packages/vite/src/node/config.ts#L1001
64
- const viteConfigResolved = mergeConfig(viteConfigFromUserViteFile ?? {}, viteConfigEnhanced ?? {});
78
+ const viteConfigResolved = mergeConfig(viteConfigFromUserViteFile ?? {}, viteConfigFromUserEnhanced ?? {});
65
79
  const root = normalizeViteRoot(viteConfigResolved.root ?? process.cwd());
66
80
  globalObject.root = root;
67
81
  // - Find options `vike(options)` set in vite.config.js
@@ -76,16 +90,16 @@ async function getViteInfo(viteConfigFromOptions, operation) {
76
90
  // Add Vike to plugins if not present.
77
91
  // Using a dynamic import because the script calling the Vike API may not live in the same place as vite.config.js, thus vike/plugin may resolved to two different node_modules/vike directories.
78
92
  const { plugin: vikePlugin } = await import('../plugin/index.js');
79
- viteConfigEnhanced = {
80
- ...viteConfigEnhanced,
81
- plugins: [...(viteConfigEnhanced?.plugins ?? []), vikePlugin()]
93
+ viteConfigFromUserEnhanced = {
94
+ ...viteConfigFromUserEnhanced,
95
+ plugins: [...(viteConfigFromUserEnhanced?.plugins ?? []), vikePlugin()]
82
96
  };
83
- const res = findVikeVitePlugin(viteConfigEnhanced);
97
+ const res = findVikeVitePlugin(viteConfigFromUserEnhanced);
84
98
  assert(res);
85
99
  vikeVitePluginOptions = res.vikeVitePluginOptions;
86
100
  }
87
101
  assert(vikeVitePluginOptions);
88
- return { root, vikeVitePluginOptions, viteConfigEnhanced };
102
+ return { root, vikeVitePluginOptions, viteConfigFromUserEnhanced };
89
103
  }
90
104
  function findVikeVitePlugin(viteConfig) {
91
105
  let vikeVitePluginOptions;
@@ -103,8 +117,8 @@ function findVikeVitePlugin(viteConfig) {
103
117
  return { vikeVitePluginOptions };
104
118
  }
105
119
  // Copied from https://github.com/vitejs/vite/blob/4f5845a3182fc950eb9cd76d7161698383113b18/packages/vite/src/node/config.ts#L961-L1005
106
- async function loadViteConfigFile(viteConfigFromOptions, operation) {
107
- const [inlineConfig, command, defaultMode, _defaultNodeEnv, isPreview] = getResolveConfigArgs(viteConfigFromOptions, operation);
120
+ async function loadViteConfigFile(viteConfigFromUserApiOptions, operation) {
121
+ const [inlineConfig, command, defaultMode, _defaultNodeEnv, isPreview] = getResolveConfigArgs(viteConfigFromUserApiOptions, operation);
108
122
  let config = inlineConfig;
109
123
  let mode = inlineConfig.mode || defaultMode;
110
124
  const configEnv = {
@@ -136,11 +150,12 @@ function normalizeViteRoot(root) {
136
150
  path.resolve(root));
137
151
  }
138
152
  const errMsg = `A Vite plugin is modifying Vite's setting ${pc.cyan('root')} which is forbidden`;
139
- async function assertViteRoot2(root, viteConfigEnhanced, operation) {
140
- const args = getResolveConfigArgs(viteConfigEnhanced, operation);
141
- // We can eventually this resolveConfig() call (along with removing the whole assertViteRoot2() function which is redundant with the assertViteRoot() function) so that Vike doesn't make any resolveConfig() (except for pre-rendering which is required). But let's keep it for now, just to see whether calling resolveConfig() can be problematic.
153
+ async function assertViteRoot2(root, viteConfigFromUserEnhanced, operation) {
154
+ const args = getResolveConfigArgs(viteConfigFromUserEnhanced, operation);
155
+ // We can eventually remove this resolveConfig() call (along with removing the whole assertViteRoot2() function which is redundant with the assertViteRoot() function) so that Vike doesn't make any resolveConfig() (except for pre-rendering and preview which is required). But let's keep it for now, just to see whether calling resolveConfig() can be problematic.
142
156
  const viteConfigResolved = await resolveConfig(...args);
143
157
  assertUsage(normalizeViteRoot(viteConfigResolved.root) === normalizeViteRoot(root), errMsg);
158
+ return { viteConfigResolved };
144
159
  }
145
160
  function assertViteRoot(root, config) {
146
161
  if (globalObject.root)
@@ -1,15 +1,14 @@
1
1
  export { prerender };
2
2
  import { runPrerenderFromAPI } from '../prerender/runPrerender.js';
3
3
  import { prepareViteApiCall } from './prepareViteApiCall.js';
4
- // TODO/soon use importServerProductionIndex()
5
4
  /**
6
5
  * Programmatically trigger `$ vike prerender`
7
6
  *
8
7
  * https://vike.dev/api#prerender
9
8
  */
10
9
  async function prerender(options = {}) {
11
- const { viteConfigEnhanced } = await prepareViteApiCall(options, 'prerender');
12
- options.viteConfig = viteConfigEnhanced;
10
+ const { viteConfigFromUserEnhanced } = await prepareViteApiCall(options, 'prerender');
11
+ options.viteConfig = viteConfigFromUserEnhanced;
13
12
  const { viteConfig } = await runPrerenderFromAPI(options);
14
13
  return {
15
14
  viteConfig
@@ -7,6 +7,6 @@ import type { APIOptions } from './types.js';
7
7
  * https://vike.dev/api#preview
8
8
  */
9
9
  declare function preview(options?: APIOptions): Promise<{
10
- viteServer: PreviewServer;
10
+ viteServer?: PreviewServer;
11
11
  viteConfig: ResolvedConfig;
12
12
  }>;
@@ -1,16 +1,32 @@
1
1
  export { preview };
2
2
  import { prepareViteApiCall } from './prepareViteApiCall.js';
3
3
  import { preview as previewVite } from 'vite';
4
+ import { importServerProductionIndex } from '@brillout/vite-plugin-server-entry/runtime';
5
+ import { getOutDirs } from '../plugin/shared/getOutDirs.js';
6
+ import { assertWarning } from './utils.js';
7
+ import pc from '@brillout/picocolors';
8
+ import path from 'node:path';
4
9
  /**
5
10
  * Programmatically trigger `$ vike preview`
6
11
  *
7
12
  * https://vike.dev/api#preview
8
13
  */
9
14
  async function preview(options = {}) {
10
- const { viteConfigEnhanced } = await prepareViteApiCall(options, 'preview');
11
- const server = await previewVite(viteConfigEnhanced);
12
- return {
13
- viteServer: server,
14
- viteConfig: server.config
15
- };
15
+ const { viteConfigFromUserEnhanced, viteConfigResolved } = await prepareViteApiCall(options, 'preview');
16
+ if (viteConfigResolved.vitePluginServerEntry?.inject) {
17
+ const outDir = getOutDirs(viteConfigResolved).outDirRoot;
18
+ const { outServerIndex } = await importServerProductionIndex({ outDir });
19
+ const outServerIndexRelative = path.relative(viteConfigResolved.root, outServerIndex);
20
+ assertWarning(false, `Never run ${pc.cyan('$ vike preview')} in production, run ${pc.cyan(`$ node ${outServerIndexRelative}`)} instead.`, { onlyOnce: true });
21
+ return {
22
+ viteConfig: viteConfigResolved
23
+ };
24
+ }
25
+ else {
26
+ const server = await previewVite(viteConfigFromUserEnhanced);
27
+ return {
28
+ viteServer: server,
29
+ viteConfig: server.config
30
+ };
31
+ }
16
32
  }
@@ -3,3 +3,4 @@ export * from '../../utils/getGlobalObject.js';
3
3
  export * from '../../utils/path.js';
4
4
  export * from '../../utils/isObject.js';
5
5
  export * from '../../utils/assertVersion.js';
6
+ export * from '../../utils/pick.js';
@@ -7,3 +7,4 @@ export * from '../../utils/getGlobalObject.js';
7
7
  export * from '../../utils/path.js';
8
8
  export * from '../../utils/isObject.js';
9
9
  export * from '../../utils/assertVersion.js';
10
+ export * from '../../utils/pick.js';
@@ -57,8 +57,10 @@ async function cmdBuild() {
57
57
  async function cmdPreview() {
58
58
  try {
59
59
  const { viteServer } = await preview();
60
- viteServer.printUrls();
61
- viteServer.bindCLIShortcuts({ print: true });
60
+ if (viteServer) {
61
+ viteServer.printUrls();
62
+ viteServer.bindCLIShortcuts({ print: true });
63
+ }
62
64
  }
63
65
  catch (err) {
64
66
  console.error(pc.red(`Error while starting preview server:`));
@@ -6,7 +6,7 @@ const commands = [
6
6
  { name: 'dev', desc: 'Start development server' },
7
7
  { name: 'build', desc: 'Build for production' },
8
8
  { name: 'preview', desc: 'Start preview server using production build (only works for SSG apps)' },
9
- { name: 'prerender', desc: 'Pre-render pages (only needed when partial.disableAutoRun is true)' }
9
+ { name: 'prerender', desc: 'Pre-render pages (only needed when prerender.disableAutoRun is true)' }
10
10
  ];
11
11
  function parseCli() {
12
12
  const command = getCommand();
@@ -57,10 +57,16 @@ function showHelp() {
57
57
  `vike@${PROJECT_VERSION}`,
58
58
  '',
59
59
  'Usage:',
60
- ...[...commands, { name: '-v', desc: "Print Vike's installed version" }].map((c) => ` ${pc.dim('$')} ${pc.bold(`vike ${c.name}`)}${' '.repeat(nameMaxLength - c.name.length)}${TAB}${pc.dim(`# ${c.desc}`)}`),
60
+ ...[...commands, { name: '-v', desc: "Print Vike's installed version" }].map((c) => ` ${pc.dim('$')} vike ${c.name.startsWith('-') ? pc.cyan(`${c.name}`) : pc.bold(`${c.name}`)}${' '.repeat(nameMaxLength - c.name.length)}${TAB}${pc.dim(`# ${c.desc}`)}`),
61
61
  '',
62
- `Vike settings can be passed over the ${pc.cyan('VIKE_CONFIG')} environment variable or as ${pc.cyan('CLI options')} such as --host.`,
63
- `Vite settings can be passed over the ${pc.cyan('VITE_CONFIG')} environment variable.`,
62
+ 'Common CLI options:',
63
+ [`vike dev ${pc.cyan('--host')}`, `vike dev ${pc.cyan('--port')} 80`, `vike build ${pc.cyan('--mode')} staging`]
64
+ .map((o) => ` ${pc.dim('$')} ${o}`)
65
+ .join('\n'),
66
+ '',
67
+ `More Vike settings can be passed over the ${pc.cyan('VIKE_CONFIG')} environment variable or as ${pc.cyan('CLI options')}.`,
68
+ `More Vite settings can be passed over the ${pc.cyan('VITE_CONFIG')} environment variable.`,
69
+ ``,
64
70
  `See ${pc.underline('https://vike.dev/cli')} for more information.`
65
71
  ].join('\n'));
66
72
  process.exit(1);
@@ -124,8 +124,8 @@ function isPrerenderForceExit() {
124
124
  }
125
125
  function getFullBuildInlineConfig(config) {
126
126
  const configFromCli = !isViteCliCall() ? null : getViteConfigFromCli();
127
- if (config._viteConfigEnhanced) {
128
- return config._viteConfigEnhanced;
127
+ if (config._viteConfigFromUserEnhanced) {
128
+ return config._viteConfigFromUserEnhanced;
129
129
  }
130
130
  else {
131
131
  return {
@@ -0,0 +1,3 @@
1
+ export { pluginModuleBanner };
2
+ import type { Plugin } from 'vite';
3
+ declare function pluginModuleBanner(): Plugin;
@@ -0,0 +1,49 @@
1
+ export { pluginModuleBanner };
2
+ import { assert } from '../../utils.js';
3
+ import { removeVirtualIdTag } from '../../../shared/virtual-files.js';
4
+ import { isViteServerBuild, isViteServerBuild_safe } from '../../shared/isViteServerBuild.js';
5
+ // Rollup's banner feature doesn't work with Vite: https://github.com/vitejs/vite/issues/8412
6
+ // 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
+ const vikeModuleBannerPlaceholder = 'vikeModuleBannerPlaceholder';
8
+ function pluginModuleBanner() {
9
+ let config;
10
+ return {
11
+ name: 'vike:pluginModuleBanner',
12
+ enforce: 'post',
13
+ apply: 'build',
14
+ configResolved(config_) {
15
+ config = config_;
16
+ },
17
+ generateBundle: {
18
+ order: 'post',
19
+ handler(_options, bundle) {
20
+ for (const module of Object.values(bundle)) {
21
+ if (module.type === 'chunk') {
22
+ if (isViteServerBuild(config)) {
23
+ const codeOld = module.code;
24
+ const codeNew = codeOld.replace(/vikeModuleBannerPlaceholder\("([^"]*)"\);/g, '/* $1 [vike:pluginModuleBanner] */');
25
+ assert(!codeNew.includes(vikeModuleBannerPlaceholder));
26
+ module.code = codeNew;
27
+ }
28
+ else {
29
+ assert(!module.code.includes(vikeModuleBannerPlaceholder));
30
+ }
31
+ }
32
+ }
33
+ }
34
+ },
35
+ transform: {
36
+ order: 'post',
37
+ handler(code, id, options) {
38
+ if (!isViteServerBuild_safe(config, options))
39
+ return;
40
+ if (id.startsWith('\0'))
41
+ id = id;
42
+ id = removeVirtualIdTag(id);
43
+ if (id.startsWith(config.root))
44
+ id = id.slice(config.root.length + 1);
45
+ return `${vikeModuleBannerPlaceholder}(${JSON.stringify(id)}); ${code}`;
46
+ }
47
+ }
48
+ };
49
+ }
@@ -6,6 +6,7 @@ import { pluginDistFileNames } from './build/pluginDistFileNames.js';
6
6
  import { pluginAutoFullBuild } from './build/pluginAutoFullBuild.js';
7
7
  import { pluginBuildEntry } from './build/pluginBuildEntry.js';
8
8
  import { pluginBuildConfig } from './build/pluginBuildConfig.js';
9
+ import { pluginModuleBanner } from './build/pluginModuleBanner.js';
9
10
  function build() {
10
11
  return [
11
12
  ...pluginBuildConfig(),
@@ -14,6 +15,7 @@ function build() {
14
15
  ...pluginBuildEntry(),
15
16
  pluginDistPackageJsonFile(),
16
17
  pluginSuppressRollupWarning(),
17
- pluginDistFileNames()
18
+ pluginDistFileNames(),
19
+ pluginModuleBanner()
18
20
  ];
19
21
  }
@@ -4,13 +4,15 @@ export type { VikeConfigPublic };
4
4
  import { type InlineConfig, type Plugin, type ResolvedConfig, type UserConfig } from 'vite';
5
5
  import { type VikeConfigObject } from './importUserCode/v1-design/getVikeConfig.js';
6
6
  import type { PrerenderContextPublic } from '../../prerender/runPrerender.js';
7
+ import type { VitePluginServerEntryOptions } from '@brillout/vite-plugin-server-entry/plugin';
7
8
  declare module 'vite' {
8
9
  interface UserConfig {
9
10
  _isDev?: boolean;
10
11
  _vikeVitePluginOptions?: unknown;
12
+ vitePluginServerEntry?: VitePluginServerEntryOptions;
11
13
  _root?: string;
12
14
  _baseViteOriginal?: string;
13
- _viteConfigEnhanced?: InlineConfig;
15
+ _viteConfigFromUserEnhanced?: InlineConfig;
14
16
  _vike?: VikeConfigPublic;
15
17
  _vikeConfigObject?: VikeConfigObject;
16
18
  }
@@ -66,6 +66,10 @@ function commonConfig(vikeVitePluginOptions) {
66
66
  assertEsm(config.root);
67
67
  assertVikeCliOrApi(config);
68
68
  temp_supportOldInterface(config);
69
+ // Only emit dist/server/entry.mjs if necessary
70
+ if (config.vitePluginServerEntry?.inject &&
71
+ !resolvePrerenderConfigGlobal(config._vikeConfigObject).isPrerenderingEnabled)
72
+ config.vitePluginServerEntry.disableServerEntryEmit = true;
69
73
  }
70
74
  },
71
75
  config: {
@@ -131,6 +131,10 @@ const configDefinitionsBuiltIn = {
131
131
  env: { config: true },
132
132
  global: true
133
133
  },
134
+ mode: {
135
+ env: { config: true },
136
+ global: true
137
+ },
134
138
  injectScriptsAt: {
135
139
  env: { server: true }
136
140
  },