// Runs the Next CLI with apps/web/.env already in process.env. // // Next loads .env itself, but only after its CLI has parsed arguments, and the port is one // of those arguments (`-p`, defaulting to the PORT environment variable). PORT from the file // would therefore arrive too late. Passing `--env-file` to node instead is not an option: // the dev server re-execs itself with the parent's execArgv in NODE_OPTIONS, where node // refuses that flag. Loading the file here and importing the CLI in this process avoids both. import { existsSync, readFileSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { parseEnv } from 'node:util'; // A real environment variable always wins over the file, matching apps/api/src/lib/env.ts: // process.loadEnvFile overwrites process.env, which would let a stale checked out `.env` // beat the values a container or a one off command passed in. const envFile = join(dirname(dirname(fileURLToPath(import.meta.url))), '.env'); if (existsSync(envFile)) { for (const [key, value] of Object.entries(parseEnv(readFileSync(envFile, 'utf8')))) { if (process.env[key] === undefined && typeof value === 'string') process.env[key] = value; } } // The CLI parses process.argv, which still carries the subcommand this was invoked with. await import('next/dist/bin/next');