diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue index 1c54317778b824..c5088d3101b03a 100644 --- a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue +++ b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue @@ -45,7 +45,7 @@ const { isCardActive, startAnimation } = useCardAnimation( >listen()
server.printUrls()server.printInfo() diff --git a/docs/guide/api-javascript.md b/docs/guide/api-javascript.md index 46ea0259011a0d..57c311370b0974 100644 --- a/docs/guide/api-javascript.md +++ b/docs/guide/api-javascript.md @@ -28,7 +28,7 @@ const server = await createServer({ }) await server.listen() -server.printUrls() +server.printInfo() server.bindCLIShortcuts({ print: true }) ``` @@ -248,7 +248,7 @@ const previewServer = await preview({ }, }) -previewServer.printUrls() +previewServer.printInfo() previewServer.bindCLIShortcuts({ print: true }) ``` @@ -281,7 +281,7 @@ interface PreviewServer { /** * Print server urls */ - printUrls(): void + printInfo(): void /** * Bind CLI shortcuts */ diff --git a/packages/vite/src/node/cli.ts b/packages/vite/src/node/cli.ts index b520b9b5144b46..24ee7fb830f378 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -214,7 +214,7 @@ cli }, ) - server.printUrls() + server.printInfo() const customShortcuts: CLIShortcut[] = [] if (profileSession) { customShortcuts.push({ @@ -394,7 +394,7 @@ cli open: options.open, }, }) - server.printUrls() + server.printInfo() server.bindCLIShortcuts({ print: true }) } catch (e) { createLogger(options.logLevel).error( diff --git a/packages/vite/src/node/env.ts b/packages/vite/src/node/env.ts index 897524612f3c7d..475dc7410d029a 100644 --- a/packages/vite/src/node/env.ts +++ b/packages/vite/src/node/env.ts @@ -5,13 +5,28 @@ import { type DotenvPopulateInput, expand } from 'dotenv-expand' import { arraify, normalizePath, tryStatSync } from './utils' import type { UserConfig } from './config' -export function getEnvFilesForMode(mode: string, envDir: string): string[] { +function getEnvFileNamesForMode(mode: string): string[] { return [ /** default file */ `.env`, /** local file */ `.env.local`, /** mode file */ `.env.${mode}`, /** mode local file */ `.env.${mode}.local`, - ].map((file) => normalizePath(path.join(envDir, file))) + ] +} + +export function getEnvFilesForMode(mode: string, envDir: string): string[] { + return getEnvFileNamesForMode(mode).map((fileName) => + normalizePath(path.join(envDir, fileName)), + ) +} + +export function getLoadedEnvFileNamesForMode( + mode: string, + envDir: string, +): string[] { + return getEnvFileNamesForMode(mode).filter((fileName) => + tryStatSync(normalizePath(path.join(envDir, fileName)))?.isFile(), + ) } export function loadEnv( diff --git a/packages/vite/src/node/logger.ts b/packages/vite/src/node/logger.ts index 8bfa027c61fcd2..c43dcb62f2f882 100644 --- a/packages/vite/src/node/logger.ts +++ b/packages/vite/src/node/logger.ts @@ -4,6 +4,7 @@ import readline from 'node:readline' import colors from 'picocolors' import type { RollupError } from 'rollup' import type { ResolvedServerUrls } from './server' +import { getLoadedEnvFileNamesForMode } from './env' export type LogType = 'error' | 'warn' | 'info' export type LogLevel = LogType | 'silent' @@ -165,19 +166,31 @@ export function createLogger( return logger } -export function printServerUrls( +export function printServerInfo( urls: ResolvedServerUrls, optionsHost: string | boolean | undefined, + mode: string, + envDir: string, info: Logger['info'], ): void { - const colorUrl = (url: string) => - colors.cyan(url.replace(/:(\d+)\//, (_, port) => `:${colors.bold(port)}/`)) + const formatUrl = (url: string) => + url.replace(/:(\d+)\//, (_, port) => `:${colors.bold(port)}/`) + for (const url of urls.local) { - info(` ${colors.green('➜')} ${colors.bold('Local')}: ${colorUrl(url)}`) + info( + ` ${colors.green('➜')} ${colors.bold('Local')}: ${colors.cyan(formatUrl(url))}`, + ) } for (const url of urls.network) { - info(` ${colors.green('➜')} ${colors.bold('Network')}: ${colorUrl(url)}`) + info( + ` ${colors.green('➜')} ${colors.bold('Network')}: ${colors.cyan(formatUrl(url))}`, + ) } + info(` ${colors.green('➜')} ${colors.bold('Mode')}: ${mode}`) + const envFiles = getLoadedEnvFileNamesForMode(mode, envDir) + info( + ` ${colors.green('➜')} ${colors.bold('Env')}: ${envFiles.length ? envFiles.join(' ') : 'no env files loaded'}`, + ) if (urls.network.length === 0 && optionsHost === undefined) { info( colors.dim(` ${colors.green('➜')} ${colors.bold('Network')}: use `) + diff --git a/packages/vite/src/node/preview.ts b/packages/vite/src/node/preview.ts index 2ff3984515a292..594fb0ae53cc58 100644 --- a/packages/vite/src/node/preview.ts +++ b/packages/vite/src/node/preview.ts @@ -31,7 +31,7 @@ import { shouldServeFile, teardownSIGTERMListener, } from './utils' -import { printServerUrls } from './logger' +import { printServerInfo } from './logger' import { bindCLIShortcuts } from './shortcuts' import type { BindCLIShortcutsOptions } from './shortcuts' import { configDefaults, resolveConfig } from './config' @@ -89,8 +89,13 @@ export interface PreviewServer { resolvedUrls: ResolvedServerUrls | null /** * Print server urls + * @deprecated use `printInfo` instead */ printUrls(): void + /** + * Print server info + */ + printInfo(): void /** * Bind CLI shortcuts */ @@ -157,8 +162,17 @@ export async function preview( }, resolvedUrls: null, printUrls() { + return this.printInfo() + }, + printInfo() { if (server.resolvedUrls) { - printServerUrls(server.resolvedUrls, options.host, logger.info) + printServerInfo( + server.resolvedUrls, + options.host, + config.mode, + config.envDir, + logger.info, + ) } else { throw new Error('cannot print server URLs before server is listening.') } diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index 772b163a745eb7..456dbcd71e631b 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -46,7 +46,7 @@ import type { BindCLIShortcutsOptions } from '../shortcuts' import { ERR_OUTDATED_OPTIMIZED_DEP } from '../../shared/constants' import { CLIENT_DIR, DEFAULT_DEV_PORT } from '../constants' import type { Logger } from '../logger' -import { printServerUrls } from '../logger' +import { printServerInfo } from '../logger' import { warnFutureDeprecation } from '../deprecations' import { createNoopWatcher, @@ -340,8 +340,13 @@ export interface ViteDevServer { close(): Promise /** * Print server urls + * @deprecated use `printInfo` instead */ printUrls(): void + /** + * Print server info + */ + printInfo(): void /** * Bind CLI shortcuts */ @@ -679,10 +684,15 @@ export async function _createServer( server.resolvedUrls = null }, printUrls() { + return this.printInfo() + }, + printInfo() { if (server.resolvedUrls) { - printServerUrls( + printServerInfo( server.resolvedUrls, serverConfig.host, + config.mode, + config.envDir, config.logger.info, ) } else if (middlewareMode) { @@ -1217,6 +1227,6 @@ export async function restartServerWithUrls( diffDnsOrderChange(prevUrls, server.resolvedUrls) ) { logger.info('') - server.printUrls() + server.printInfo() } } diff --git a/packages/vite/src/node/shortcuts.ts b/packages/vite/src/node/shortcuts.ts index 1bac571627008b..d9ea1d2f661b0e 100644 --- a/packages/vite/src/node/shortcuts.ts +++ b/packages/vite/src/node/shortcuts.ts @@ -102,10 +102,10 @@ const BASE_DEV_SHORTCUTS: CLIShortcut[] = [ }, { key: 'u', - description: 'show server url', + description: 'show server info', action(server) { server.config.logger.info('') - server.printUrls() + server.printInfo() }, }, { diff --git a/playground/cli/.env b/playground/cli/.env new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/playground/cli/__tests__/cli.spec.ts b/playground/cli/__tests__/cli.spec.ts index 399a05115dfd77..fb646ff29ed11c 100644 --- a/playground/cli/__tests__/cli.spec.ts +++ b/playground/cli/__tests__/cli.spec.ts @@ -28,7 +28,7 @@ test.runIf(isServe)('should restart', async () => { expect(logs).toEqual( expect.arrayContaining([expect.stringMatching('server restarted')]), ) - // Don't reprint the server URLs as they are the same + // Don't reprint the server info as they are the same expect(logs).not.toEqual( expect.arrayContaining([expect.stringMatching('http://localhost')]), )