diff --git a/src/commands/dev-child.ts b/src/commands/dev-child.ts index 18480e69..0c391a22 100644 --- a/src/commands/dev-child.ts +++ b/src/commands/dev-child.ts @@ -2,14 +2,15 @@ import type { NuxtDevContext, NuxtDevIPCMessage } from '../utils/dev' import process from 'node:process' +import { setupDotenv } from 'c12' import { defineCommand } from 'citty' import { resolve } from 'pathe' -import { isTest } from 'std-env' +import { isTest } from 'std-env' import { createNuxtDevServer } from '../utils/dev' import { overrideEnv } from '../utils/env' import { logger } from '../utils/logger' -import { cwdArgs, envNameArgs, legacyRootDirArgs, logLevelArgs } from './_shared' +import { cwdArgs, dotEnvArgs, envNameArgs, legacyRootDirArgs, logLevelArgs } from './_shared' export default defineCommand({ meta: { @@ -22,6 +23,7 @@ export default defineCommand({ ...logLevelArgs, ...envNameArgs, ...legacyRootDirArgs, + ...dotEnvArgs, }, async run(ctx) { if (!process.send && !isTest) { @@ -30,9 +32,14 @@ export default defineCommand({ ) } + const envFileName = typeof ctx.args.dotenv === 'string' + ? (ctx.args.dotenv || '.env') + : undefined + // Prepare overrideEnv('development') const cwd = resolve(ctx.args.cwd || ctx.args.rootDir) + await setupDotenv({ cwd, fileName: envFileName }) // Get dev context info const devContext: NuxtDevContext @@ -64,7 +71,7 @@ export default defineCommand({ overrides: ctx.data?.overrides, logLevel: ctx.args.logLevel as 'silent' | 'info' | 'verbose', clear: !!ctx.args.clear, - dotenv: !!ctx.args.dotenv, + dotenv: envFileName, envName: ctx.args.envName, port: process.env._PORT ?? undefined, devContext, diff --git a/src/commands/dev.ts b/src/commands/dev.ts index c78a3921..9ede9dc4 100644 --- a/src/commands/dev.ts +++ b/src/commands/dev.ts @@ -46,11 +46,15 @@ const command = defineCommand({ }, }, async run(ctx) { + const envFileName = typeof ctx.args.dotenv === 'string' + ? (ctx.args.dotenv || '.env') + : undefined + // Prepare overrideEnv('development') const cwd = resolve(ctx.args.cwd || ctx.args.rootDir) await showVersions(cwd) - await setupDotenv({ cwd, fileName: ctx.args.dotenv }) + await setupDotenv({ cwd, fileName: envFileName }) // Load Nuxt Config const { loadNuxtConfig } = await loadKit(cwd) @@ -82,7 +86,7 @@ const command = defineCommand({ overrides: ctx.data?.overrides, logLevel: ctx.args.logLevel as 'silent' | 'info' | 'verbose', clear: ctx.args.clear, - dotenv: !!ctx.args.dotenv, + dotenv: envFileName, envName: ctx.args.envName, loadingTemplate: nuxtOptions.devServer.loadingTemplate, devContext: {}, diff --git a/src/commands/preview.ts b/src/commands/preview.ts index e25f48b8..2d495e7c 100644 --- a/src/commands/preview.ts +++ b/src/commands/preview.ts @@ -89,14 +89,22 @@ export default defineCommand({ ), ) - const envExists = ctx.args.dotenv - ? existsSync(resolve(cwd, ctx.args.dotenv)) - : existsSync(cwd) - if (envExists) { - logger.info( - `Loading \`${ctx.args.dotenv || '.env'}\`. This will not be loaded when running the server in production.`, - ) - await setupDotenv({ cwd, fileName: ctx.args.dotenv }) + if (typeof ctx.args.dotenv === 'string') { + const envFileName = ctx.args.dotenv || '.env' + + const envExists = existsSync(resolve(cwd, envFileName)) + + if (envExists) { + logger.info( + `Loading \`${envFileName}\`. This will not be loaded when running the server in production.`, + ) + + await setupDotenv({ cwd, fileName: envFileName }) + } + else { + logger.error(`Cannot find \`${envFileName}\`.`) + process.exit(1) + } } logger.info(`Starting preview command: \`${nitroJSON.commands.preview}\``) diff --git a/src/utils/dev.ts b/src/utils/dev.ts index 920ee632..c4f313c8 100644 --- a/src/utils/dev.ts +++ b/src/utils/dev.ts @@ -38,7 +38,7 @@ export interface NuxtDevContext { interface NuxtDevServerOptions { cwd: string logLevel: 'silent' | 'info' | 'verbose' - dotenv: boolean + dotenv: string | undefined envName: string clear: boolean overrides: NuxtConfig @@ -177,6 +177,12 @@ class NuxtDevServer extends EventEmitter { const kit = await loadKit(this.options.cwd) this._currentNuxt = await kit.loadNuxt({ cwd: this.options.cwd, + dotenv: this.options.dotenv + ? { + cwd: this.options.cwd, + fileName: this.options.dotenv, + } + : undefined, dev: true, ready: false, envName: this.options.envName, @@ -315,7 +321,7 @@ class NuxtDevServer extends EventEmitter { return } const file = relative(this.options.cwd, _file) - if (file === (this.options.dotenv || '.env')) { + if (this.options.dotenv && file === this.options.dotenv) { this.emit('restart') } if (RESTART_RE.test(file)) {