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.
Files changed (43) hide show
  1. package/dist/cjs/node/cli/entry.js +13 -8
  2. package/dist/cjs/node/plugin/plugins/build/pluginAutoFullBuild.js +6 -3
  3. package/dist/cjs/node/plugin/plugins/build/pluginDistPackageJsonFile.js +5 -2
  4. package/dist/cjs/node/plugin/plugins/build/pluginModuleBanner.js +16 -3
  5. package/dist/cjs/node/plugin/plugins/commonConfig.js +14 -2
  6. package/dist/cjs/node/plugin/plugins/devConfig/index.js +8 -6
  7. package/dist/cjs/node/plugin/plugins/envVars.js +27 -16
  8. package/dist/cjs/node/plugin/plugins/extractAssetsPlugin.js +12 -5
  9. package/dist/cjs/node/plugin/plugins/fileEnv.js +19 -12
  10. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +8 -6
  11. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -1
  12. package/dist/cjs/node/plugin/plugins/previewConfig.js +10 -6
  13. package/dist/cjs/node/plugin/shared/getResolvedConfig.js +6 -0
  14. package/dist/cjs/node/prerender/resolvePrerenderConfig.js +1 -0
  15. package/dist/cjs/node/prerender/runPrerender.js +18 -17
  16. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  17. package/dist/cjs/utils/assert.js +2 -5
  18. package/dist/cjs/utils/assertSingleInstance.js +19 -4
  19. package/dist/esm/node/cli/entry.js +13 -8
  20. package/dist/esm/node/plugin/plugins/build/pluginAutoFullBuild.js +6 -3
  21. package/dist/esm/node/plugin/plugins/build/pluginDistPackageJsonFile.js +4 -2
  22. package/dist/esm/node/plugin/plugins/build/pluginModuleBanner.js +13 -3
  23. package/dist/esm/node/plugin/plugins/commonConfig.d.ts +7 -1
  24. package/dist/esm/node/plugin/plugins/commonConfig.js +14 -2
  25. package/dist/esm/node/plugin/plugins/devConfig/index.js +8 -6
  26. package/dist/esm/node/plugin/plugins/envVars.js +24 -16
  27. package/dist/esm/node/plugin/plugins/extractAssetsPlugin.js +8 -5
  28. package/dist/esm/node/plugin/plugins/fileEnv.js +19 -12
  29. package/dist/esm/node/plugin/plugins/importUserCode/index.js +8 -6
  30. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -1
  31. package/dist/esm/node/plugin/plugins/previewConfig.js +10 -6
  32. package/dist/esm/node/plugin/shared/getResolvedConfig.d.ts +2 -0
  33. package/dist/esm/node/plugin/shared/getResolvedConfig.js +3 -0
  34. package/dist/esm/node/prerender/resolvePrerenderConfig.d.ts +1 -0
  35. package/dist/esm/node/prerender/resolvePrerenderConfig.js +1 -0
  36. package/dist/esm/node/prerender/runPrerender.d.ts +1 -1
  37. package/dist/esm/node/prerender/runPrerender.js +18 -17
  38. package/dist/esm/shared/page-configs/Config.d.ts +10 -0
  39. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  40. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  41. package/dist/esm/utils/assert.js +2 -5
  42. package/dist/esm/utils/assertSingleInstance.js +19 -4
  43. 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, config) {
92
- let prerenderContextPublic;
92
+ async function runPrerenderFromAutoRun(viteConfig) {
93
93
  try {
94
- const ret = await runPrerender({ viteConfig });
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 { outDirClient } = (0, getOutDirs_js_1.getOutDirs)(viteConfig);
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
- return { viteConfig, prerenderContextPublic };
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
- const prerenderPageContext = {};
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')));
@@ -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.226';
5
+ exports.PROJECT_VERSION = '0.4.227-commit-c9cc081';
@@ -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
- const globalObject = (0, getGlobalObject_js_1.getGlobalObject)('utils/assertSingleInstance.ts', {
20
- instances: [],
21
- alreadyLogged: new Set()
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
- await viteServer.listen();
28
- const info = viteServer.config.logger.info;
29
- const startupDurationString = pc.dim(`ready in ${pc.reset(pc.bold(String(Math.ceil(performance.now() - startTime))))} ms`);
30
- const hasExistingLogs = process.stdout.bytesWritten > 0 || process.stderr.bytesWritten > 0;
31
- info(` ${pc.yellow(`${pc.bold('Vike')} v${PROJECT_VERSION}`)} ${startupDurationString}\n`, {
32
- clear: !hasExistingLogs
33
- });
34
- viteServer.printUrls();
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 config;
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
- config = config_;
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, config);
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 config;
15
+ let vite5Config;
15
16
  return {
16
17
  name: 'vike:build:pluginDistPackageJsonFile',
17
18
  apply: 'build',
18
19
  configResolved(config_) {
19
- config = config_;
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 config;
11
+ let vite5Config;
10
12
  return {
11
13
  name: 'vike:pluginModuleBanner',
12
14
  enforce: 'post',
13
15
  apply: 'build',
14
16
  configResolved(config_) {
15
- config = config_;
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
- return `${vikeModuleBannerPlaceholder}(${JSON.stringify(id)}); ${code}`;
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?: PrerenderContextPublic;
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: resolvePrerenderConfigGlobal(vikeConfig).isPrerenderingEnabled
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 config;
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
- config = config_;
61
- await determineOptimizeDeps(config);
62
- await determineFsAllowList(config);
61
+ vite5Config = config_;
62
+ await determineOptimizeDeps(vite5Config);
63
+ await determineFsAllowList(vite5Config);
63
64
  if (!isErrorDebug()) {
64
65
  await installHttpRequestAsyncStore();
65
- improveViteLogs(config);
66
+ improveViteLogs(vite5Config);
66
67
  }
67
- logDockerHint(config.server.host);
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 config;
20
+ let vite5Config;
20
21
  return {
21
22
  name: 'vike:envVars',
22
23
  enforce: 'post',
23
24
  configResolved(config_) {
24
- config = config_;
25
- config.command;
26
- envsAll = loadEnv(config.mode, config.envDir || config.root, '');
27
- config.plugins.sort(lowerFirst((plugin) => (plugin.name === 'vite:define' ? 1 : 0)));
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 envStatementRegEx = new RegExp(escapeRegex(envStatement) + '\\b', 'g');
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 (!envStatementRegEx.test(code))
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
- code = applyEnvVar(envStatementRegEx, envVal, code);
76
+ applyEnvVar(s, envStatementRegExStr, envVal);
74
77
  });
75
- // Line numbers didn't change.
76
- // - We only break the column number of a couple of lines, wich is acceptable.
77
- // - Anyways, I'm not even sure Vite supports high-resolution column number source mapping.
78
- const ret = sourceMapPassthrough(code);
79
- return ret;
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(envStatementRegEx, envVal, code) {
84
- return code.replace(envStatementRegEx, JSON.stringify(envVal));
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 config;
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
- config = config_;
142
- vikeConfig = await getVikeConfig(config);
143
- isFixEnabled = handleAssetsManifest_isFixEnabled(config);
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(!config.plugins.find((p) => p.name === 'vite-tsconfig-paths'), 'vite-tsconfig-paths not supported, remove it and use vite.config.js#resolve.alias instead');
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
  }