vike 0.4.247-commit-14351e3 → 0.4.247-commit-c3d567b

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 (39) hide show
  1. package/dist/node/api/dev.d.ts +4 -1
  2. package/dist/node/api/dev.js +55 -3
  3. package/dist/node/api/utils.d.ts +3 -0
  4. package/dist/node/api/utils.js +3 -0
  5. package/dist/node/cli/entry.js +1 -17
  6. package/dist/node/vite/plugins/build/pluginModuleBanner.js +3 -3
  7. package/dist/node/vite/plugins/pluginCommon.d.ts +1 -0
  8. package/dist/node/vite/plugins/pluginCommon.js +2 -0
  9. package/dist/node/vite/plugins/pluginDev.js +11 -8
  10. package/dist/node/vite/shared/loggerDev/errorWithCodeSnippet.d.ts +2 -1
  11. package/dist/node/vite/shared/loggerDev/errorWithCodeSnippet.js +5 -8
  12. package/dist/node/vite/shared/loggerDev.js +32 -43
  13. package/dist/node/vite/shared/loggerVite.d.ts +15 -2
  14. package/dist/node/vite/shared/loggerVite.js +108 -11
  15. package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.d.ts +3 -2
  16. package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +4 -2
  17. package/dist/node/vite/shared/resolveVikeConfigInternal.js +3 -3
  18. package/dist/server/{runtime/onLoad.js → onLoad.js} +8 -5
  19. package/dist/server/runtime/renderPageServer/addErrorHint.d.ts +1 -1
  20. package/dist/server/runtime/renderPageServer/addErrorHint.js +4 -8
  21. package/dist/server/runtime/renderPageServer.js +10 -3
  22. package/dist/server/utils.d.ts +1 -0
  23. package/dist/server/utils.js +2 -1
  24. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  25. package/dist/utils/PROJECT_VERSION.js +1 -1
  26. package/dist/utils/assert.js +8 -4
  27. package/dist/utils/colorVike.d.ts +2 -0
  28. package/dist/utils/colorVike.js +5 -0
  29. package/dist/utils/colors.d.ts +2 -0
  30. package/dist/utils/colors.js +5 -0
  31. package/dist/utils/debug.js +13 -9
  32. package/dist/utils/formatHintLog.d.ts +1 -1
  33. package/dist/utils/formatHintLog.js +6 -8
  34. package/dist/utils/getBetterError.d.ts +7 -1
  35. package/dist/utils/getBetterError.js +38 -10
  36. package/package.json +2 -2
  37. package/dist/node/vite/shared/loggerVite/removeSuperfluousViteLog.d.ts +0 -6
  38. package/dist/node/vite/shared/loggerVite/removeSuperfluousViteLog.js +0 -24
  39. /package/dist/server/{runtime/onLoad.d.ts → onLoad.d.ts} +0 -0
@@ -6,7 +6,10 @@ import type { ApiOptions } from './types.js';
6
6
  *
7
7
  * https://vike.dev/api#dev
8
8
  */
9
- declare function dev(options?: ApiOptions): Promise<{
9
+ declare function dev(options?: ApiOptions & {
10
+ startupLog?: boolean;
11
+ }): Promise<{
10
12
  viteServer: ViteDevServer;
11
13
  viteConfig: ResolvedConfig;
14
+ viteVersion: string;
12
15
  }>;
@@ -1,16 +1,68 @@
1
1
  export { dev };
2
2
  import { prepareViteApiCall } from './prepareViteApiCall.js';
3
- import { createServer } from 'vite';
3
+ import { createServer, version as viteVersionVike } from 'vite';
4
+ import { viteVersionUser } from '../vite/plugins/pluginCommon.js';
5
+ import { colorVike, colorVite, PROJECT_VERSION } from './utils.js';
6
+ import pc from '@brillout/picocolors';
7
+ import { processStartupLog } from '../vite/shared/loggerVite.js';
4
8
  /**
5
9
  * Programmatically trigger `$ vike dev`
6
10
  *
7
11
  * https://vike.dev/api#dev
8
12
  */
9
13
  async function dev(options = {}) {
14
+ const startTime = performance.now();
10
15
  const { viteConfigFromUserResolved } = await prepareViteApiCall(options, 'dev');
11
16
  const server = await createServer(viteConfigFromUserResolved);
17
+ const viteVersion = viteVersionUser ?? viteVersionVike;
18
+ const viteServer = server;
19
+ const viteConfig = server.config;
20
+ if (viteServer.httpServer)
21
+ await viteServer.listen();
22
+ if (options.startupLog)
23
+ printStartupLog(viteServer, viteConfig, viteVersion, startTime);
12
24
  return {
13
- viteServer: server,
14
- viteConfig: server.config,
25
+ viteServer,
26
+ viteConfig,
27
+ viteVersion,
15
28
  };
16
29
  }
30
+ async function printStartupLog(viteServer, viteConfig, viteVersion, startTime) {
31
+ const startupDurationString = pc.dim(`ready in ${pc.reset(pc.bold(String(Math.ceil(performance.now() - startTime))))} ms`);
32
+ const sep = pc.dim('·');
33
+ const firstLine = `\n ${colorVike('Vike')} ${pc.yellow(`v${PROJECT_VERSION}`)} ${sep} ${colorVite('Vite')} ${pc.cyan(`v${viteVersion}`)} ${sep} ${startupDurationString}\n`;
34
+ const ret = processStartupLog(firstLine, viteConfig);
35
+ console.log(ret.firstLine);
36
+ const { isCompact } = ret;
37
+ // We don't call viteServer.printUrls() because Vite throws an error if `resolvedUrls` is missing:
38
+ // https://github.com/vitejs/vite/blob/df5a30d2690a2ebc4824a79becdcef30538dc602/packages/vite/src/node/server/index.ts#L745
39
+ printServerUrls(viteServer.resolvedUrls || { local: ['http://localhost:3000'], network: [] }, viteConfig.server.host);
40
+ viteServer.bindCLIShortcuts({ print: true });
41
+ if (!isCompact)
42
+ console.log();
43
+ }
44
+ // Copied & adapted from Vite
45
+ // https://github.com/vitejs/vite/blob/df5a30d2690a2ebc4824a79becdcef30538dc602/packages/vite/src/node/logger.ts#L168-L188
46
+ function printServerUrls(urls, optionsHost) {
47
+ // [Begin] interop
48
+ const colors = pc;
49
+ const info = (msg) => console.log(msg);
50
+ // [End] interop
51
+ const colorUrl = (url) => colors.underline(removeTrailingSlash(url));
52
+ for (const url of urls.local) {
53
+ info(` ${colors.green('➜')} ${colors.bold('Local')}: ${colorUrl(url)}`);
54
+ }
55
+ for (const url of urls.network) {
56
+ info(` ${colors.green('➜')} ${colors.bold('Network')}: ${colorUrl(url)}`);
57
+ }
58
+ if (urls.network.length === 0 && optionsHost === undefined) {
59
+ info(colors.dim(` ${colors.green('➜')} ${colors.bold('Network')}: use `) +
60
+ colors.bold('--host') +
61
+ colors.dim(' to expose'));
62
+ }
63
+ }
64
+ function removeTrailingSlash(url) {
65
+ if (url.endsWith('/'))
66
+ return url.slice(0, -1); // remove trailing slash
67
+ return url;
68
+ }
@@ -6,3 +6,6 @@ export * from '../../utils/assertVersion.js';
6
6
  export * from '../../utils/pick.js';
7
7
  export * from '../../utils/assertSetup.js';
8
8
  export * from '../../utils/isCallable.js';
9
+ export * from '../../utils/colors.js';
10
+ export * from '../../utils/colorVike.js';
11
+ export * from '../../utils/PROJECT_VERSION.js';
@@ -10,3 +10,6 @@ export * from '../../utils/assertVersion.js';
10
10
  export * from '../../utils/pick.js';
11
11
  export * from '../../utils/assertSetup.js';
12
12
  export * from '../../utils/isCallable.js';
13
+ export * from '../../utils/colors.js';
14
+ export * from '../../utils/colorVike.js';
15
+ export * from '../../utils/PROJECT_VERSION.js';
@@ -1,4 +1,3 @@
1
- import { PROJECT_VERSION } from './utils.js';
2
1
  import { dev, build, preview } from '../api/index.js';
3
2
  import pc from '@brillout/picocolors';
4
3
  import { parseCli } from './parseCli.js';
@@ -21,23 +20,8 @@ async function cli() {
21
20
  }
22
21
  }
23
22
  async function cmdDev() {
24
- const startTime = performance.now();
25
23
  try {
26
- const { viteServer } = await dev();
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
- }
40
- viteServer.bindCLIShortcuts({ print: true });
24
+ await dev({ startupLog: true });
41
25
  }
42
26
  catch (err) {
43
27
  console.error(pc.red(`Error while starting dev server:`));
@@ -24,9 +24,9 @@ function pluginModuleBanner() {
24
24
  },
25
25
  transform: {
26
26
  order: 'post',
27
- /* Using a Rolldown hook filter doesn't make sense here we use applyToEnvironment() to conditionally apply this plugin.
28
- filter: {},
29
- */
27
+ /* Using a Rolldown hook filter doesn't make sense here: we apply this transformer to each module. But we use applyToEnvironment() to conditionally apply this plugin.
28
+ filter: {},
29
+ */
30
30
  handler(code, id) {
31
31
  const { minify } = this.environment.config.build;
32
32
  assert(minify === false, { minify });
@@ -1,4 +1,5 @@
1
1
  export { pluginCommon };
2
+ export declare let viteVersionUser: string | null | undefined;
2
3
  import { type InlineConfig, type Plugin } from 'vite';
3
4
  import type { VitePluginServerEntryOptions } from '@brillout/vite-plugin-server-entry/plugin';
4
5
  declare module 'vite' {
@@ -1,4 +1,5 @@
1
1
  export { pluginCommon };
2
+ export let viteVersionUser = null;
2
3
  import { assert, assertUsage, assertWarning, hasProp, isDevCheck, isDocker, isExactlyOneTruthy, isObject, isVitest, } from '../utils.js';
3
4
  import { assertRollupInput } from './build/pluginBuildConfig.js';
4
5
  import { installRequireShim_setUserRootDir } from '@brillout/require-shim';
@@ -19,6 +20,7 @@ function pluginCommon(vikeVitePluginOptions) {
19
20
  config: {
20
21
  order: 'pre',
21
22
  async handler(configFromUser, env) {
23
+ viteVersionUser = this?.meta?.viteVersion; // is `undefined` on old Vite versions
22
24
  const isDev = isDevCheck(env);
23
25
  const isBuild = env.command === 'build';
24
26
  const isPreview = env.isPreview;
@@ -4,11 +4,9 @@ import { determineOptimizeDeps } from './pluginDev/determineOptimizeDeps.js';
4
4
  import { determineFsAllowList } from './pluginDev/determineFsAllowList.js';
5
5
  import { addSsrMiddleware } from '../shared/addSsrMiddleware.js';
6
6
  import { applyDev, assertWarning, isDocker, isDebugError } from '../utils.js';
7
- import { improveViteLogs } from '../shared/loggerVite.js';
7
+ import { interceptViteLogs } from '../shared/loggerVite.js';
8
8
  import pc from '@brillout/picocolors';
9
- if (isDebugError()) {
10
- Error.stackTraceLimit = Infinity;
11
- }
9
+ import { swallowViteLogConnected, swallowViteLogConnected_clean } from '../shared/loggerVite.js';
12
10
  function pluginDev() {
13
11
  let config;
14
12
  return [
@@ -44,21 +42,20 @@ function pluginDev() {
44
42
  config = config_;
45
43
  await determineOptimizeDeps(config);
46
44
  await determineFsAllowList(config);
47
- if (!isDebugError()) {
48
- improveViteLogs(config);
49
- }
45
+ interceptViteLogs(config);
50
46
  logDockerHint(config.server.host);
51
47
  },
52
48
  },
53
49
  },
54
50
  {
55
- name: 'vike:pluginDev:addSsrMiddleware',
51
+ name: 'vike:pluginDev:post',
56
52
  apply: applyDev,
57
53
  // The SSR middleware should be last middleware
58
54
  enforce: 'post',
59
55
  configureServer: {
60
56
  order: 'post',
61
57
  handler(server) {
58
+ swallowViteLogConnected_clean(); // If inside a configureServer() `pre` hook => too early
62
59
  const hasHonoViteDevServer = !!config.plugins.find((p) => p.name === '@hono/vite-dev-server');
63
60
  if (config.server.middlewareMode || hasHonoViteDevServer)
64
61
  return;
@@ -76,6 +73,12 @@ function pluginDev() {
76
73
  }
77
74
  },
78
75
  },
76
+ configResolved: {
77
+ order: 'post',
78
+ handler() {
79
+ swallowViteLogConnected();
80
+ },
81
+ },
79
82
  },
80
83
  ];
81
84
  }
@@ -10,6 +10,7 @@ type ErrorWithCodeSnippet = {
10
10
  plugin?: string;
11
11
  };
12
12
  declare function isErrorWithCodeSnippet(err: unknown): err is ErrorWithCodeSnippet;
13
- declare function getPrettyErrorWithCodeSnippet(err: ErrorWithCodeSnippet, userRootDir: string): string;
13
+ declare function getPrettyErrorWithCodeSnippet(err: ErrorWithCodeSnippet, userRootDir: string): `Failed to transpile ${string} because:
14
+ ${string}`;
14
15
  declare function getPrettyErrMessage(err: ErrorWithCodeSnippet): string | null;
15
16
  declare function isEquivalentErrorWithCodeSnippet(err1: unknown, err2: unknown): boolean;
@@ -45,11 +45,7 @@ function getPrettyErrorWithCodeSnippet(err, userRootDir) {
45
45
  //*/
46
46
  assert(isErrorWithCodeSnippet(err));
47
47
  let { id, frame } = err;
48
- const msgFirstLine = [
49
- pc.red('Failed to transpile'),
50
- pc.bold(pc.red(getFilePathToShowToUserUnknown(id, userRootDir))),
51
- pc.red('because:'),
52
- ].join(' ');
48
+ const msgFirstLine = `${pc.red('Failed to transpile')} ${pc.bold(pc.red(getFilePathToShowToUserUnknown(id, userRootDir)))} ${pc.red('because:')}`;
53
49
  const errMsg = getPrettyErrMessage(err);
54
50
  if (errMsg && containsCodeSnippet(errMsg)) {
55
51
  // Conditionally swallowing frame is a risky move but worth it thanks to logErrorDebugNote()
@@ -65,15 +61,16 @@ function getPrettyErrorWithCodeSnippet(err, userRootDir) {
65
61
  assert(frame);
66
62
  frame = pc.yellow(frame);
67
63
  }
68
- let msg = [msgFirstLine, errMsg, frame].filter(Boolean).join('\n');
69
- msg = removeEmptyLines(msg);
64
+ let errMsgCodeSnippet = [errMsg, frame].filter(Boolean).join('\n');
65
+ errMsgCodeSnippet = removeEmptyLines(errMsgCodeSnippet);
66
+ const errMsgFormatted = `${msgFirstLine}\n${errMsgCodeSnippet}`;
70
67
  /* Vite already does a fairly good job at showing a concise error in the layover
71
68
  server.ws.send({
72
69
  type: 'error',
73
70
  err: msg
74
71
  })
75
72
  */
76
- return msg;
73
+ return errMsgFormatted;
77
74
  }
78
75
  function getPrettyErrMessage(err) {
79
76
  const { id, frame } = err;
@@ -12,7 +12,7 @@ export { logErrorServerDev };
12
12
  import { isAbortError } from '../../../shared-server-client/route/abort.js';
13
13
  import { getViteConfig } from '../../../server/runtime/globalContext.js';
14
14
  import { assertPageContext_logRuntime, setLogRuntimeDev, } from '../../../server/runtime/loggerRuntime.js';
15
- import { addOnBeforeAssertErr, assert, assertIsNotProductionRuntime, formatHintLog, hasGreen, hasProp, hasRed, hasYellow, isDebugError, stripAnsi, } from '../utils.js';
15
+ import { addOnBeforeAssertErr, assert, assertIsNotProductionRuntime, colorVike, colorVite, formatHintLog, hasGreen, hasProp, hasRed, hasYellow, isDebugError, stripAnsi, } from '../utils.js';
16
16
  import { isErrorWithCodeSnippet, getPrettyErrorWithCodeSnippet } from './loggerDev/errorWithCodeSnippet.js';
17
17
  import { getConfigExecutionErrorIntroMsg, getConfigBuildErrorFormatted, } from './resolveVikeConfigInternal/transpileAndExecuteFile.js';
18
18
  import pc from '@brillout/picocolors';
@@ -27,6 +27,8 @@ addOnBeforeAssertErr((err) => {
27
27
  // We must directly apply vite.ssrFixStacktrace() to `assertWarning(..., { showStackTrace: true })` because warnings aren't caught by the try-catch of renderPageServer()
28
28
  applyViteSourceMapToStackTrace(err);
29
29
  });
30
+ // Note shown to user when Vike completely modifies the error message (which is somewhat risky)
31
+ const errorDebugNote = pc.dim(formatHintLog("Error isn't helpful? See https://vike.dev/debug#verbose-errors"));
30
32
  function logRuntimeInfoDev(msg, pageContext, logType) {
31
33
  assertPageContext_logRuntime(pageContext);
32
34
  const tagSource = getTagSource(pageContext?._requestId);
@@ -55,10 +57,9 @@ function logErrorServerDev(err, pageContext, errorComesFromVite = false) {
55
57
  // We handle transpile errors globally because wrapping viteDevServer.ssrLoadModule() wouldn't be enough: transpile errors can be thrown not only when calling viteDevServer.ssrLoadModule() but also later when loading user code with import() (since Vite lazy-transpiles import() calls)
56
58
  const viteConfig = getViteConfig();
57
59
  assert(viteConfig);
58
- let message = getPrettyErrorWithCodeSnippet(err, viteConfig.root);
59
- assert(stripAnsi(message).startsWith('Failed to transpile'));
60
- message = prependTags(message, '[vite]', tagSource, 'error');
61
- message = appendErrorDebugNote(message);
60
+ const errMsgFormatted = getPrettyErrorWithCodeSnippet(err, viteConfig.root);
61
+ assert(stripAnsi(errMsgFormatted).startsWith('Failed to transpile'));
62
+ const message = `${getTags(errMsgFormatted, '[vite]', tagSource, 'error')}${errMsgFormatted}\n${errorDebugNote}`;
62
63
  const errBetter = getBetterError(err, { message, hideStack: true });
63
64
  logErr(errBetter);
64
65
  return;
@@ -67,8 +68,7 @@ function logErrorServerDev(err, pageContext, errorComesFromVite = false) {
67
68
  const errMsgFormatted = getConfigBuildErrorFormatted(err);
68
69
  if (errMsgFormatted) {
69
70
  assert(stripAnsi(errMsgFormatted).startsWith('Failed to transpile'));
70
- let message = errMsgFormatted;
71
- message = prependTags(message, '[vike]', tagSource, 'error');
71
+ const message = `${getTagsError(errMsgFormatted, tagSource)}${errMsgFormatted}\n${errorDebugNote}`;
72
72
  const errBetter = getBetterError(err, { message, hideStack: true });
73
73
  logErr(errBetter);
74
74
  return;
@@ -78,9 +78,8 @@ function logErrorServerDev(err, pageContext, errorComesFromVite = false) {
78
78
  const errIntro = getConfigExecutionErrorIntroMsg(err);
79
79
  if (errIntro) {
80
80
  assert(stripAnsi(errIntro).startsWith('Failed to execute'));
81
- let message = getErrMsgWithIntro(err, errIntro);
82
- message = prependTags(message, '[vike]', tagSource, 'error');
83
- const errBetter = getBetterError(err, { message });
81
+ const prepend = `${getTagsError(errIntro, tagSource)}${errIntro}\n`;
82
+ const errBetter = getBetterError(err, { message: { prepend } });
84
83
  logErr(errBetter);
85
84
  return;
86
85
  }
@@ -90,26 +89,24 @@ function logErrorServerDev(err, pageContext, errorComesFromVite = false) {
90
89
  if (hook) {
91
90
  const { hookName, hookFilePath } = hook;
92
91
  const errIntro = pc.red(`Following error was thrown by the ${hookName}() hook defined at ${hookFilePath}`);
93
- let message = getErrMsgWithIntro(err, errIntro);
94
- message = prependTags(message, '[vike]', tagSource, 'error');
95
- const errBetter = getBetterError(err, { message });
92
+ const prepend = `${getTagsError(errIntro, tagSource)}${errIntro}\n`;
93
+ const errBetter = getBetterError(err, { message: { prepend } });
96
94
  logErr(errBetter);
97
95
  return;
98
96
  }
99
97
  }
100
98
  if (tagSource) {
101
99
  const errIntro = pc.bold(pc.red(`[Error] ${errorComesFromVite ? 'Transpilation error' : 'An error was thrown'}:`));
102
- let message = getErrMsgWithIntro(err, errIntro);
103
- message = prependTags(message, '[vike]', tagSource, 'error');
104
- const errBetter = getBetterError(err, { message });
100
+ const prepend = `${getTagsError(errIntro, tagSource)}${errIntro}\n`;
101
+ const errBetter = getBetterError(err, { message: { prepend } });
105
102
  logErr(errBetter);
106
103
  return;
107
104
  }
108
105
  logErr(err);
109
106
  }
110
- function logDev(msg, logType, tagSource, tagTool, doNotPrependTags) {
111
- if (!doNotPrependTags) {
112
- msg = prependTags(msg, tagTool, tagSource, logType);
107
+ function logDev(msg, logType, tagSource, tagTool, doNotAddTags) {
108
+ if (!doNotAddTags) {
109
+ msg = getTags(msg, tagTool, tagSource, logType) + msg;
113
110
  }
114
111
  if (logType === 'info') {
115
112
  console.log(msg);
@@ -130,11 +127,6 @@ function logDev(msg, logType, tagSource, tagTool, doNotPrependTags) {
130
127
  }
131
128
  assert(false);
132
129
  }
133
- // Note shown to user when Vike modifies errors in a risky fashion.
134
- function appendErrorDebugNote(errMsg) {
135
- const errorDebugNote = pc.dim(formatHintLog("Error isn't helpful? See https://vike.dev/debug#verbose-errors"));
136
- return errMsg + '\n' + errorDebugNote;
137
- }
138
130
  function getTagSource(requestId = null) {
139
131
  const requestIdFromStore = getHttpRequestId_withAsyncHook();
140
132
  if (requestIdFromStore !== null) {
@@ -148,7 +140,7 @@ function getTagSource(requestId = null) {
148
140
  if (requestId === null)
149
141
  return null;
150
142
  // const tagSource = requestId % 2 === 1 ? (`request-${requestId}` as const) : (`request(${requestId})` as const)
151
- const tagSource = `request(${requestId})`;
143
+ const tagSource = `request-${requestId}`;
152
144
  return tagSource;
153
145
  }
154
146
  function applyViteSourceMapToStackTrace(thing) {
@@ -162,29 +154,26 @@ function applyViteSourceMapToStackTrace(thing) {
162
154
  // Apply Vite's source maps
163
155
  viteDevServer.ssrFixStacktrace(thing);
164
156
  }
165
- function prependTags(msg, tagTool, tagSource, logType) {
166
- const color = (s) => {
157
+ function getTagsError(msg, tagSource) {
158
+ return getTags(msg, '[vike]', tagSource, 'error');
159
+ }
160
+ function getTags(msg, tagTool, tagSource, logType) {
161
+ const tagToolColored = (() => {
167
162
  if (logType === 'error' && !hasRed(msg))
168
- return pc.bold(pc.red(s));
163
+ return pc.bold(pc.red(tagTool));
169
164
  if (logType === 'error-resolve' && !hasGreen(msg))
170
- return pc.bold(pc.green(s));
165
+ return pc.bold(pc.green(tagTool));
171
166
  if (logType === 'warn' && !hasYellow(msg))
172
- return pc.yellow(s);
167
+ return pc.yellow(tagTool);
173
168
  if (tagTool === '[vite]')
174
- return pc.bold(pc.cyan(s));
169
+ return colorVite(tagTool);
175
170
  if (tagTool === '[vike]')
176
- return pc.bold(pc.cyan(s));
171
+ return colorVike(tagTool);
177
172
  assert(false);
178
- };
179
- let tag = color(tagTool);
180
- if (tagSource) {
181
- tag = tag + pc.dim(`[${tagSource}]`);
182
- }
173
+ })();
183
174
  const timestamp = pc.dim(new Date().toLocaleTimeString());
184
- const whitespace = /\s|\[/.test(stripAnsi(msg)[0]) ? '' : ' ';
185
- return `${timestamp} ${tag}${whitespace}${msg}`;
186
- }
187
- function getErrMsgWithIntro(err, errIntro) {
188
- const errMsg = String(err?.message || '');
189
- return errIntro + '\n' + errMsg;
175
+ const whitespace = (/\s|\[/.test(stripAnsi(msg)[0]) ? '' : ' ');
176
+ const tagSourceStr = (!tagSource ? '' : pc.dim(`[${tagSource}]`));
177
+ const tags = `${timestamp} ${tagToolColored}${tagSourceStr}${whitespace}`;
178
+ return tags;
190
179
  }
@@ -1,3 +1,16 @@
1
- export { improveViteLogs };
1
+ export { interceptViteLogs };
2
+ export { processStartupLog };
3
+ export { swallowViteLogForceOptimization_enable };
4
+ export { swallowViteLogForceOptimization_disable };
5
+ export { swallowViteLogConnected };
6
+ export { swallowViteLogConnected_clean };
2
7
  import type { ResolvedConfig } from 'vite';
3
- declare function improveViteLogs(config: ResolvedConfig): void;
8
+ declare function interceptViteLogs(config: ResolvedConfig): void;
9
+ declare function processStartupLog(firstLine: string, config: ResolvedConfig): {
10
+ firstLine: string;
11
+ isCompact: boolean;
12
+ };
13
+ declare function swallowViteLogForceOptimization_enable(): void;
14
+ declare function swallowViteLogForceOptimization_disable(): void;
15
+ declare function swallowViteLogConnected(): void;
16
+ declare function swallowViteLogConnected_clean(): void;
@@ -1,17 +1,32 @@
1
- export { improveViteLogs };
2
- import { assert, isDebugError, removeEmptyLines, trimWithAnsi, trimWithAnsiTrailOnly } from '../utils.js';
1
+ export { interceptViteLogs };
2
+ export { processStartupLog };
3
+ export { swallowViteLogForceOptimization_enable };
4
+ export { swallowViteLogForceOptimization_disable };
5
+ export { swallowViteLogConnected };
6
+ export { swallowViteLogConnected_clean };
7
+ import { assert, getGlobalObject, isDebugError, removeEmptyLines, trimWithAnsi, trimWithAnsiTrailOnly, } from '../utils.js';
3
8
  import { getHttpRequestId_withAsyncHook } from '../../../server/runtime/asyncHook.js';
4
9
  import { logErrorServerDev, logVite } from './loggerDev.js';
5
- import { removeSuperfluousViteLog } from './loggerVite/removeSuperfluousViteLog.js';
6
- function improveViteLogs(config) {
10
+ const globalObject = getGlobalObject('vite/shared/loggerDev.ts', {
11
+ processStartupLog_isCompact: null,
12
+ processStartupLog_hasViteLoggedStartup: null,
13
+ processStartupLog_hasViteLoggedHelpShortcut: null,
14
+ swallowViteLogForceOptimization_enabled: false,
15
+ swallowViteLogConnected_originalConsoleLog: null,
16
+ });
17
+ function interceptViteLogs(config) {
18
+ if (isDebugError())
19
+ return;
7
20
  intercept('info', config);
8
21
  intercept('warn', config);
9
22
  intercept('error', config);
10
23
  }
11
24
  function intercept(loggerType, config) {
25
+ let isBeginning = true;
26
+ setTimeout(() => (isBeginning = false), 10 * 1000);
12
27
  config.logger[loggerType] = (msg, options = {}) => {
13
28
  assert(!isDebugError());
14
- if (removeSuperfluousViteLog(msg))
29
+ if (swallowViteLogForceOptimization(msg))
15
30
  return;
16
31
  if (!!options.timestamp) {
17
32
  msg = trimWithAnsi(msg);
@@ -20,7 +35,9 @@ function intercept(loggerType, config) {
20
35
  // No timestamp => no "[vite]" tag prepended => we don't trim the beginning of the message
21
36
  msg = trimWithAnsiTrailOnly(msg);
22
37
  }
23
- msg = cleanFirstViteLog(msg);
38
+ if (isBeginning) {
39
+ msg = processStartupLog_onViteLog(msg, config);
40
+ }
24
41
  if (options.error) {
25
42
  // Vite does a poor job of handling errors.
26
43
  // - It doesn't format error code snippets.
@@ -41,12 +58,92 @@ function intercept(loggerType, config) {
41
58
  logVite(msg, loggerType, requestId, prependViteTag);
42
59
  };
43
60
  }
44
- function cleanFirstViteLog(msg) {
45
- const isFirstVitLog = msg.includes('VITE') && msg.includes('ready');
46
- if (isFirstVitLog) {
47
- return removeEmptyLines(msg);
61
+ // - Clears screen if zero previous log
62
+ // - Manages new lines
63
+ function processStartupLog(firstLine, config) {
64
+ const shouldClear = processStartupLog_shouldClear(config);
65
+ if (shouldClear) {
66
+ config.logger.clearScreen('info');
48
67
  }
49
68
  else {
50
- return msg;
69
+ // Remove leading new line (for both Vite and Vike's startup log)
70
+ firstLine = removeEmptyLines(firstLine);
71
+ }
72
+ return { firstLine, isCompact: !shouldClear };
73
+ }
74
+ function processStartupLog_shouldClear(config) {
75
+ const hasLoggedBefore = process.stdout.bytesWritten !== 0 || process.stderr.bytesWritten !== 0;
76
+ const notDisabled = config.clearScreen !== false;
77
+ const shouldClear = notDisabled && !hasLoggedBefore;
78
+ return shouldClear;
79
+ }
80
+ function processStartupLog_onViteLog(msg, config) {
81
+ {
82
+ const isFirstVitLog = msg.includes('VITE') && msg.includes('ready');
83
+ if (isFirstVitLog && !globalObject.processStartupLog_hasViteLoggedStartup) {
84
+ globalObject.processStartupLog_hasViteLoggedStartup = true;
85
+ let { firstLine, isCompact } = processStartupLog(msg, config);
86
+ globalObject.processStartupLog_isCompact = isCompact;
87
+ if (!isCompact)
88
+ firstLine += '\n';
89
+ return firstLine;
90
+ }
91
+ }
92
+ {
93
+ const isViteHelpShortcutLog = msg.includes('press') && msg.includes('to show help');
94
+ if (isViteHelpShortcutLog && !globalObject.processStartupLog_hasViteLoggedHelpShortcut) {
95
+ globalObject.processStartupLog_hasViteLoggedHelpShortcut = true;
96
+ if (globalObject.processStartupLog_hasViteLoggedStartup && globalObject.processStartupLog_isCompact === false) {
97
+ return msg + '\n';
98
+ }
99
+ }
100
+ }
101
+ return msg;
102
+ }
103
+ function swallowViteLogForceOptimization(msg) {
104
+ if (!globalObject.swallowViteLogForceOptimization_enabled) {
105
+ return false;
106
+ }
107
+ if (msg.toLowerCase().includes('forced') && msg.toLowerCase().includes('optimization')) {
108
+ assert(msg === 'Forced re-optimization of dependencies', msg); // assertion fails => Vite changed its message => update this function
109
+ return true;
110
+ }
111
+ return false;
112
+ }
113
+ function swallowViteLogForceOptimization_enable() {
114
+ if (isDebugError())
115
+ return;
116
+ globalObject.swallowViteLogForceOptimization_enabled = true;
117
+ }
118
+ function swallowViteLogForceOptimization_disable() {
119
+ globalObject.swallowViteLogForceOptimization_enabled = false;
120
+ }
121
+ // Suppress "[vite] connected." message. (It doesn't go through Vite's logger thus we must monkey patch the console.log() function.)
122
+ function swallowViteLogConnected() {
123
+ if (isDebugError())
124
+ return;
125
+ if (globalObject.swallowViteLogConnected_originalConsoleLog)
126
+ return;
127
+ globalObject.swallowViteLogConnected_originalConsoleLog = console.log;
128
+ console.log = swallowViteLogConnected_logPatch;
129
+ setTimeout(swallowViteLogConnected_clean, 3000);
130
+ }
131
+ // Remove console.log() monkey patch
132
+ function swallowViteLogConnected_clean() {
133
+ // Don't remove console.log() patches from other libraries (e.g. instrumentation)
134
+ if (console.log === swallowViteLogConnected_logPatch)
135
+ return;
136
+ assert(globalObject.swallowViteLogConnected_originalConsoleLog);
137
+ console.log = globalObject.swallowViteLogConnected_originalConsoleLog;
138
+ globalObject.swallowViteLogConnected_originalConsoleLog = null;
139
+ }
140
+ function swallowViteLogConnected_logPatch(...args) {
141
+ const originalConsoleLog = globalObject.swallowViteLogConnected_originalConsoleLog;
142
+ assert(originalConsoleLog);
143
+ const msg = args.join(' ');
144
+ if (msg === '[vite] connected.') {
145
+ swallowViteLogConnected_clean();
146
+ return; // swallow
51
147
  }
148
+ originalConsoleLog.apply(console, args);
52
149
  }
@@ -13,6 +13,7 @@ type EsbuildCache = {
13
13
  vikeConfigDependencies: Set<string>;
14
14
  };
15
15
  declare function transpileAndExecuteFile(filePath: FilePathResolved, userRootDir: string, isExtensionConfig: boolean, esbuildCache: EsbuildCache): Promise<FileExports>;
16
- declare function getConfigBuildErrorFormatted(err: unknown): null | string;
17
- declare function getConfigExecutionErrorIntroMsg(err: unknown): `Failed to transpile ${string} because:` | `Failed to execute ${string} because:` | null;
16
+ declare function getConfigBuildErrorFormatted(err: unknown): `Failed to transpile ${string} because:
17
+ ${string}` | null;
18
+ declare function getConfigExecutionErrorIntroMsg(err: unknown): `Failed to execute ${string} because:` | null;
18
19
  declare function isTemporaryBuildFile(filePath: string): boolean;
@@ -322,7 +322,8 @@ function getConfigBuildErrorFormatted(err) {
322
322
  if (!(formatted in err))
323
323
  return null;
324
324
  assert(typeof err[formatted] === 'string');
325
- return err[formatted];
325
+ const errMsgFormatted = err[formatted];
326
+ return errMsgFormatted;
326
327
  }
327
328
  async function formatBuildErr(err, filePath) {
328
329
  assert(isObject(err) && err.errors);
@@ -333,7 +334,8 @@ async function formatBuildErr(err, filePath) {
333
334
  .map((m) => m.trim())
334
335
  .join('\n');
335
336
  const msgIntro = getErrIntroMsg('transpile', filePath);
336
- err[formatted] = `${msgIntro}\n${msgEsbuild}`;
337
+ const errMsgFormatted = `${msgIntro}\n${msgEsbuild}`;
338
+ err[formatted] = errMsgFormatted;
337
339
  }
338
340
  const execErrIntroMsg = new WeakMap();
339
341
  function getConfigExecutionErrorIntroMsg(err) {
@@ -15,7 +15,7 @@ import { configDefinitionsBuiltIn, } from './resolveVikeConfigInternal/configDef
15
15
  import { getLocationId, getFilesystemRouteString, getFilesystemRouteDefinedBy, isInherited, sortAfterInheritanceOrder, applyFilesystemRoutingRootEffect, } from './resolveVikeConfigInternal/filesystemRouting.js';
16
16
  import { getViteDevServer, vikeConfigErrorRecoverMsg } from '../../../server/runtime/globalContext.js';
17
17
  import { logConfigInfo, logErrorServerDev } from './loggerDev.js';
18
- import { removeSuperfluousViteLog_enable, removeSuperfluousViteLog_disable, } from './loggerVite/removeSuperfluousViteLog.js';
18
+ import { swallowViteLogForceOptimization_enable, swallowViteLogForceOptimization_disable } from './loggerVite.js';
19
19
  import pc from '@brillout/picocolors';
20
20
  import { getConfigDefinedAt, getDefinedByString, } from '../../../shared-server-client/page-configs/getConfigDefinedAt.js';
21
21
  import { loadPointerImport, loadValueFile } from './resolveVikeConfigInternal/loadFileAtConfigTime.js';
@@ -1106,7 +1106,7 @@ function resolvePrerenderContext(vikeConfig) {
1106
1106
  function restartViteDevServer() {
1107
1107
  const viteDevServer = getViteDevServer();
1108
1108
  assert(viteDevServer);
1109
- removeSuperfluousViteLog_enable();
1109
+ swallowViteLogForceOptimization_enable();
1110
1110
  (async () => {
1111
1111
  try {
1112
1112
  await viteDevServer.restart(true);
@@ -1116,7 +1116,7 @@ function restartViteDevServer() {
1116
1116
  console.error(err);
1117
1117
  }
1118
1118
  })();
1119
- removeSuperfluousViteLog_disable();
1119
+ swallowViteLogForceOptimization_disable();
1120
1120
  }
1121
1121
  function getVikeConfigDummy(esbuildCache) {
1122
1122
  const pageConfigsDummy = [];
@@ -1,14 +1,17 @@
1
1
  export { onLoad };
2
- import { assertIsNotBrowser } from '../../utils/assertIsNotBrowser.js';
3
- import { assertNodeVersion } from '../../utils/assertNodeVersion.js';
4
- import { setAlwaysShowStackTrace } from '../../utils/assert.js';
2
+ import { assertIsNotBrowser } from '../utils/assertIsNotBrowser.js';
3
+ import { assertNodeVersion } from '../utils/assertNodeVersion.js';
4
+ import { setAlwaysShowStackTrace } from '../utils/assert.js';
5
5
  import { installRequireShim } from '@brillout/require-shim';
6
- import { isDebugError } from '../../utils/debug.js';
6
+ import { isDebugError } from '../utils/debug.js';
7
7
  function onLoad() {
8
8
  assertIsNotBrowser();
9
9
  assertNodeVersion();
10
- if (isDebugError())
10
+ if (isDebugError()) {
11
+ // Is also executed upon `$ vike build` because node/vite/utils.ts imports server/utils.ts
12
+ Error.stackTraceLimit = Infinity;
11
13
  setAlwaysShowStackTrace();
14
+ }
12
15
  addEcosystemStamp();
13
16
  installRequireShim();
14
17
  }
@@ -1,4 +1,4 @@
1
1
  export { addErrorHint };
2
2
  export { getErrorHint };
3
3
  declare function addErrorHint(error: unknown): unknown;
4
- declare function getErrorHint(error: unknown): null | string;
4
+ declare function getErrorHint(error: unknown): "The error could be a CJS/ESM issue, see https://vike.dev/broken-npm-package" | `To fix this error, see ${string}` | null;
@@ -84,22 +84,18 @@ function addErrorHint(error) {
84
84
  /* Collect errors for ./addErrorHint.spec.ts
85
85
  collectError(error)
86
86
  //*/
87
- let hint = getErrorHint(error);
87
+ const hint = getErrorHint(error);
88
88
  if (!hint)
89
89
  return error;
90
- hint = formatHintLog(hint);
91
- hint = pc.bold(hint);
92
- let message = String(error?.message || '');
93
- message = message + '\n' + hint;
94
- const errBetter = getBetterError(error, { message });
95
- return errBetter;
90
+ const append = `\n${pc.bold(formatHintLog(hint))}`;
91
+ return getBetterError(error, { message: { append } });
96
92
  }
97
93
  function getErrorHint(error) {
98
94
  {
99
95
  const knownErr = isKnownError(error);
100
96
  if (knownErr) {
101
97
  if (knownErr.link) {
102
- return hintLinkPrefix + knownErr.link;
98
+ return `${hintLinkPrefix}${knownErr.link}`;
103
99
  }
104
100
  else {
105
101
  return hintDefault;
@@ -219,8 +219,15 @@ function logHttpRequest(urlOriginal, pageContextInit, requestId) {
219
219
  const pageContext_logRuntime = getPageContext_logRuntimeEarly(pageContextInit, requestId);
220
220
  logRuntimeInfo?.(getRequestInfoMessage(urlOriginal), pageContext_logRuntime, 'info');
221
221
  }
222
+ /*
223
+ const arrowRight = pc.dim('>>')
224
+ const arrowLeft = pc.dim('<<')
225
+ /*/
226
+ const arrowRight = pc.dim('»');
227
+ const arrowLeft = pc.dim('«');
228
+ //*/
222
229
  function getRequestInfoMessage(urlOriginal) {
223
- return `HTTP request: ${prettyUrl(urlOriginal)}`;
230
+ return `HTTP request ${arrowRight} ${prettyUrl(urlOriginal)}`;
224
231
  }
225
232
  function logHttpResponse(urlOriginalPretty, pageContextReturn) {
226
233
  const statusCode = pageContextReturn.httpResponse?.statusCode ?? null;
@@ -236,7 +243,7 @@ function logHttpResponse(urlOriginalPretty, pageContextReturn) {
236
243
  // - We should show `HTTP response ${urlOriginalPretty} ERR` instead.
237
244
  // - Maybe we can/should make the error available at pageContext.errorWhileRendering
238
245
  assert(errorWhileRendering === null || errorWhileRendering === undefined);
239
- msg = `HTTP response ${prettyUrl(urlOriginalPretty)} ${pc.dim('null')}`;
246
+ msg = `HTTP response ${arrowLeft} ${prettyUrl(urlOriginalPretty)} ${pc.dim('null')}`;
240
247
  // Erroneous value (it should sometimes be `false`) but it's fine as it doesn't seem to have much of an impact.
241
248
  isNominal = true;
242
249
  }
@@ -245,7 +252,7 @@ function logHttpResponse(urlOriginalPretty, pageContextReturn) {
245
252
  isNominal = isSuccess || statusCode === 404;
246
253
  const color = (s) => pc.bold(isSuccess ? pc.green(String(s)) : pc.red(String(s)));
247
254
  const isRedirect = statusCode && 300 <= statusCode && statusCode <= 399;
248
- const type = isRedirect ? 'redirect' : 'response';
255
+ const type = isRedirect ? 'redirect' : `response ${arrowLeft}`;
249
256
  if (isRedirect) {
250
257
  assert(pageContextReturn.httpResponse);
251
258
  const headerRedirect = pageContextReturn.httpResponse.headers
@@ -43,6 +43,7 @@ export * from '../utils/path.js';
43
43
  export * from '../utils/isHtml.js';
44
44
  export * from '../utils/virtualFileId.js';
45
45
  export * from '../utils/colors.js';
46
+ export * from '../utils/colorVike.js';
46
47
  export * from '../utils/getTerminalWidth.js';
47
48
  export * from '../utils/truncateString.js';
48
49
  export * from '../utils/formatHintLog.js';
@@ -1,7 +1,7 @@
1
1
  // Utils needed by Vike's server runtime
2
2
  import '../utils/trackLogs.js';
3
3
  // We call onLoad() here so that it's called even when only a subset of the runtime is loaded. (Making the assert() calls inside onLoad() a lot stronger.)
4
- import { onLoad } from './runtime/onLoad.js';
4
+ import { onLoad } from './onLoad.js';
5
5
  onLoad();
6
6
  export * from '../utils/assert.js';
7
7
  export * from '../utils/cast.js';
@@ -47,6 +47,7 @@ export * from '../utils/path.js';
47
47
  export * from '../utils/isHtml.js';
48
48
  export * from '../utils/virtualFileId.js';
49
49
  export * from '../utils/colors.js';
50
+ export * from '../utils/colorVike.js';
50
51
  export * from '../utils/getTerminalWidth.js';
51
52
  export * from '../utils/truncateString.js';
52
53
  export * from '../utils/formatHintLog.js';
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.247-commit-14351e3";
1
+ export declare const PROJECT_VERSION: "0.4.247-commit-c3d567b";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.247-commit-14351e3';
2
+ export const PROJECT_VERSION = '0.4.247-commit-c3d567b';
@@ -11,6 +11,7 @@ import { assertSingleInstance_onAssertModuleLoad } from './assertSingleInstance.
11
11
  import { createErrorWithCleanStackTrace } from './createErrorWithCleanStackTrace.js';
12
12
  import { getGlobalObject } from './getGlobalObject.js';
13
13
  import { PROJECT_VERSION } from './PROJECT_VERSION.js';
14
+ import { colorVike } from './colorVike.js';
14
15
  import pc from '@brillout/picocolors';
15
16
  const globalObject = getGlobalObject('utils/assert.ts', {
16
17
  alreadyLogged: new Set(),
@@ -20,7 +21,6 @@ const projectTag = `[vike]`;
20
21
  const projectTagWithVersion = `[vike@${PROJECT_VERSION}]`;
21
22
  const bugTag = 'Bug';
22
23
  const numberOfStackTraceLinesToRemove = 2;
23
- // @__NO_SIDE_EFFECTS__
24
24
  function assert(condition, debugInfo) {
25
25
  if (condition)
26
26
  return;
@@ -122,8 +122,12 @@ function addOnBeforeAssertErr(onBeforeAssertErr) {
122
122
  }
123
123
  function addPrefixAssertType(msg, tag) {
124
124
  let prefix = `[${tag}]`;
125
- const color = tag === 'Warning' ? 'yellow' : 'red';
126
- prefix = pc.bold(pc[color](prefix));
125
+ if (tag === 'Warning') {
126
+ prefix = pc.yellow(prefix);
127
+ }
128
+ else {
129
+ prefix = pc.bold(pc.red(prefix));
130
+ }
127
131
  return `${prefix}${msg}`;
128
132
  }
129
133
  function addWhitespace(msg) {
@@ -136,7 +140,7 @@ function addWhitespace(msg) {
136
140
  }
137
141
  function addPrefixProjectName(msg, showProjectVersion = false) {
138
142
  const prefix = showProjectVersion ? projectTagWithVersion : projectTag;
139
- return `${prefix}${msg}`;
143
+ return `${colorVike(prefix)}${msg}`;
140
144
  }
141
145
  function isVikeBug(err) {
142
146
  return String(err).includes(`[${bugTag}]`);
@@ -0,0 +1,2 @@
1
+ export { colorVike };
2
+ declare function colorVike<Str extends string>(str: Str): Str;
@@ -0,0 +1,5 @@
1
+ export { colorVike };
2
+ import pc from '@brillout/picocolors';
3
+ function colorVike(str) {
4
+ return pc.bold(pc.yellow(str));
5
+ }
@@ -2,6 +2,8 @@ export { stripAnsi };
2
2
  export { hasRed };
3
3
  export { hasGreen };
4
4
  export { hasYellow };
5
+ export { colorVite };
6
+ declare function colorVite<Str extends string>(str: Str): Str;
5
7
  declare function stripAnsi(string: string): string;
6
8
  declare function hasRed(str: string): boolean;
7
9
  declare function hasGreen(str: string): boolean;
@@ -2,9 +2,14 @@ export { stripAnsi };
2
2
  export { hasRed };
3
3
  export { hasGreen };
4
4
  export { hasYellow };
5
+ export { colorVite };
6
+ import pc from '@brillout/picocolors';
5
7
  import { assertIsNotBrowser } from './assertIsNotBrowser.js';
6
8
  assertIsNotBrowser();
7
9
  const ansiRegex = getAnsiRegex();
10
+ function colorVite(str) {
11
+ return pc.bold(pc.cyan(str));
12
+ }
8
13
  // Copied from https://github.com/chalk/strip-ansi/blob/1fdc531d4046cbaa830460f5c74452bf1f0a0884/index.js
9
14
  function stripAnsi(string) {
10
15
  // Even though the regex is global, we don't need to reset the `.lastIndex`
@@ -9,11 +9,6 @@ import { getTerminalWidth } from './getTerminalWidth.js';
9
9
  import pc from '@brillout/picocolors';
10
10
  import { isArray } from './isArray.js';
11
11
  import { isObject } from './isObject.js';
12
- // Assert tree-shaking (ensure this module is loaded on the client-side only if debug is enabled).
13
- assert(!globalThis.__VIKE__IS_CLIENT ||
14
- globalThis.__VIKE__IS_DEBUG ||
15
- // Vite doesn't do tree-shaking in dev (maybe it will with Rolldown?)
16
- import.meta.env.DEV);
17
12
  const flags = [
18
13
  'vike',
19
14
  'vike:crawl',
@@ -36,13 +31,18 @@ const flags = [
36
31
  'vike:vite-rpc',
37
32
  ];
38
33
  const flagsSkipWildcard = ['vike:log'];
34
+ // Assert tree-shaking (ensure this module is loaded on the client-side only if debug is enabled).
35
+ const isUsed = !globalThis.__VIKE__IS_CLIENT ||
36
+ globalThis.__VIKE__IS_DEBUG ||
37
+ // Vite doesn't do tree-shaking in dev (maybe it will with Rolldown?)
38
+ import.meta.env.DEV;
39
39
  // We purposely read process.env.DEBUG early, in order to avoid users from the temptation to set process.env.DEBUG with JavaScript, since reading & writing process.env.DEBUG dynamically leads to inconsistencies such as https://github.com/vikejs/vike/issues/2239
40
- const DEBUG = getDEBUG() ?? '';
41
- if (isDebug())
42
- Error.stackTraceLimit = Infinity;
43
- assertFlagsActivated();
40
+ const DEBUG = (isUsed && getDEBUG()) || '';
41
+ if (isUsed)
42
+ assertFlagsActivated();
44
43
  function createDebug(flag, optionsGlobal) {
45
44
  assert(flags.includes(flag));
45
+ assert(isUsed);
46
46
  const debugWithOptions = (optionsLocal) => {
47
47
  return (...msgs) => {
48
48
  const options = { ...optionsGlobal, ...optionsLocal };
@@ -57,6 +57,7 @@ function debug(flag, ...msgs) {
57
57
  return debug_(flag, {}, ...msgs);
58
58
  }
59
59
  function debug_(flag, options, ...msgs) {
60
+ assert(isUsed);
60
61
  if (!isDebug(flag))
61
62
  return;
62
63
  let [msgFirst, ...msgsRest] = msgs;
@@ -84,6 +85,7 @@ function debug_(flag, options, ...msgs) {
84
85
  });
85
86
  }
86
87
  function isDebug(flag) {
88
+ assert(isUsed);
87
89
  assert(flag === undefined || (flag && flags.includes(flag)));
88
90
  const { flagsActivated, isAll, isGlobal } = getFlagsActivated();
89
91
  if (flag) {
@@ -157,6 +159,7 @@ function replaceFunctionSerializer(_key, value) {
157
159
  return value;
158
160
  }
159
161
  function assertFlagsActivated() {
162
+ assert(isUsed);
160
163
  const { flagsActivated } = getFlagsActivated();
161
164
  flagsActivated.forEach((flag) => {
162
165
  assertUsage(flags.includes(flag), `Unknown DEBUG flag ${pc.cyan(flag)}. Valid flags:\n${flags.map((f) => ` ${pc.cyan(f)}`).join('\n')}`);
@@ -169,6 +172,7 @@ function getFlagsActivated() {
169
172
  return { flagsActivated, isAll, isGlobal };
170
173
  }
171
174
  function getDEBUG() {
175
+ assert(isUsed);
172
176
  let DEBUG;
173
177
  // ssr.noExternal
174
178
  /* // Full implementation:
@@ -1,2 +1,2 @@
1
1
  export { formatHintLog };
2
- declare function formatHintLog(msg: string): string;
2
+ declare function formatHintLog<Msg extends string>(msg: Msg): `| ${Msg} |`;
@@ -1,15 +1,13 @@
1
+ export { formatHintLog };
1
2
  import { assert } from './assert.js';
2
3
  import { stripAnsi } from './colors.js';
3
- export { formatHintLog };
4
4
  function formatHintLog(msg) {
5
5
  assert(msg.length > 0);
6
6
  const msgLength = stripAnsi(msg).length;
7
7
  const sep = '─'.repeat(msgLength);
8
- return [
9
- // prettier-ignore
10
- // biome-ignore format:
11
- `┌─${sep}─┐`,
12
- `│ ${msg} │`,
13
- `└─${sep}─┘`,
14
- ].join('\n');
8
+ const top = `┌─${sep}─┐\n`;
9
+ const mid = `│ ${msg} │\n`;
10
+ const bot = `└─${sep}─┘`;
11
+ const msgWrapped = `${top}${mid}${bot}`;
12
+ return msgWrapped;
15
13
  }
@@ -1,9 +1,15 @@
1
1
  export { getBetterError };
2
2
  declare function getBetterError(err: unknown, modifications: {
3
- message?: string;
3
+ message?: string | {
4
+ prepend?: string;
5
+ append?: string;
6
+ };
4
7
  stack?: string;
5
8
  hideStack?: true;
6
9
  }): {
7
10
  message: string;
8
11
  stack: string;
12
+ hideStack?: true;
13
+ } & {
14
+ getOriginalError: () => any;
9
15
  };
@@ -1,7 +1,9 @@
1
1
  export { getBetterError };
2
- // TO-DO/eventually: make it a library `@brillout/better-error`
3
- // TODO: fix? Reprod: 7f4baa40ec95fa55319f85a38a50291460790683
2
+ // TO-DO/maybe: make it a library `@brillout/better-error`
4
3
  import { isObject } from './isObject.js';
4
+ import { assertIsNotBrowser } from './assertIsNotBrowser.js';
5
+ import { objectAssign } from './objectAssign.js';
6
+ assertIsNotBrowser();
5
7
  function getBetterError(err, modifications) {
6
8
  let errBetter;
7
9
  // Normalize
@@ -17,16 +19,42 @@ function getBetterError(err, modifications) {
17
19
  warnMalformed(err);
18
20
  errBetter.stack = new Error(errBetter.message).stack;
19
21
  }
20
- if (!errBetter.stack.includes(errBetter.message)) {
21
- warnMalformed(err);
22
+ // Modifications: err.hideStack and err.stack
23
+ const { message: modsMessage, ...mods } = modifications;
24
+ Object.assign(errBetter, mods);
25
+ // Modifications: err.message
26
+ if (typeof modsMessage === 'string') {
27
+ // Modify err.message
28
+ const messagePrev = errBetter.message;
29
+ const messageNext = modsMessage;
30
+ errBetter.message = messageNext;
31
+ // Update err.stack
32
+ const messagePrevIdx = errBetter.stack.indexOf(messagePrev);
33
+ if (messagePrevIdx >= 0) {
34
+ // Completely replace the beginning of err.stack — removing prefix such as "SyntaxError: "
35
+ // - Following isn't always true: `err.stack.startsWith(err.message)` — because err.stack can start with "SyntaxError: " whereas err.message doesn't
36
+ const stack = errBetter.stack.slice(messagePrevIdx + messagePrev.length);
37
+ errBetter.stack = messageNext + stack;
38
+ }
39
+ else {
40
+ warnMalformed(err);
41
+ }
42
+ }
43
+ else {
44
+ if (modsMessage?.append) {
45
+ const messagePrev = errBetter.message;
46
+ const messageNext = errBetter.message + modsMessage.append;
47
+ errBetter.message = messageNext;
48
+ errBetter.stack = errBetter.stack.replace(messagePrev, messageNext);
49
+ }
50
+ if (modsMessage?.prepend) {
51
+ const { prepend } = modsMessage;
52
+ errBetter.message = prepend + errBetter.message;
53
+ errBetter.stack = prepend + errBetter.stack;
54
+ }
22
55
  }
23
- // Modifications
24
- const errMessageOriginal = errBetter.message;
25
- Object.assign(errBetter, modifications);
26
- if (modifications.message)
27
- errBetter.stack = errBetter.stack.replaceAll(errMessageOriginal, modifications.message);
28
56
  // Enable users to retrieve the original error
29
- Object.assign(errBetter, { getOriginalError: () => err?.getOriginalError?.() ?? err });
57
+ objectAssign(errBetter, { getOriginalError: () => err?.getOriginalError?.() ?? err });
30
58
  return errBetter;
31
59
  }
32
60
  // TO-DO/eventually: think about whether logging this warning is a good idea
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.247-commit-14351e3",
3
+ "version": "0.4.247-commit-c3d567b",
4
4
  "repository": "https://github.com/vikejs/vike",
5
5
  "exports": {
6
6
  "./server": {
@@ -249,7 +249,7 @@
249
249
  "react-streaming": "^0.4.13",
250
250
  "rimraf": "^5.0.5",
251
251
  "typescript": "^5.9.3",
252
- "vite": "^7.1.5"
252
+ "vite": "^7.2.6"
253
253
  },
254
254
  "scripts": {
255
255
  "dev": "tsc --watch",
@@ -1,6 +0,0 @@
1
- export { removeSuperfluousViteLog };
2
- export { removeSuperfluousViteLog_enable };
3
- export { removeSuperfluousViteLog_disable };
4
- declare function removeSuperfluousViteLog(msg: string): boolean;
5
- declare function removeSuperfluousViteLog_enable(): void;
6
- declare function removeSuperfluousViteLog_disable(): void;
@@ -1,24 +0,0 @@
1
- export { removeSuperfluousViteLog };
2
- export { removeSuperfluousViteLog_enable };
3
- export { removeSuperfluousViteLog_disable };
4
- import { assert, getGlobalObject } from '../../utils.js';
5
- const globalObject = getGlobalObject('removeSuperfluousViteLog.ts', {
6
- enabled: false,
7
- });
8
- const superfluousLog = 'Forced re-optimization of dependencies';
9
- function removeSuperfluousViteLog(msg) {
10
- if (!globalObject.enabled) {
11
- return false;
12
- }
13
- if (msg.toLowerCase().includes('forced') && msg.toLowerCase().includes('optimization')) {
14
- assert(msg === superfluousLog, msg); // assertion fails => Vite changed its message => update this function
15
- return true;
16
- }
17
- return false;
18
- }
19
- function removeSuperfluousViteLog_enable() {
20
- globalObject.enabled = true;
21
- }
22
- function removeSuperfluousViteLog_disable() {
23
- globalObject.enabled = false;
24
- }