diff --git a/packages/cli-helpers/src/index.ts b/packages/cli-helpers/src/index.ts index a420eb66c355..0a1d770aebe8 100644 --- a/packages/cli-helpers/src/index.ts +++ b/packages/cli-helpers/src/index.ts @@ -3,6 +3,12 @@ export * from './lib/index.js' export * from './lib/colors.js' +export { loadEnvFiles } from './lib/loadEnvFiles.js' +export { + loadDefaultEnvFiles, + loadNodeEnvDerivedEnvFile, + loadUserSpecifiedEnvFiles, +} from './lib/loadEnvFiles.js' export * from './lib/paths.js' export * from './lib/project.js' export * from './lib/version.js' diff --git a/packages/cli/src/__tests__/__fixtures__/redwood-app-env-collision/.env.base b/packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-collision/.env.base similarity index 100% rename from packages/cli/src/__tests__/__fixtures__/redwood-app-env-collision/.env.base rename to packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-collision/.env.base diff --git a/packages/cli/src/__tests__/__fixtures__/redwood-app-env-collision/.env.collision b/packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-collision/.env.collision similarity index 100% rename from packages/cli/src/__tests__/__fixtures__/redwood-app-env-collision/.env.collision rename to packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-collision/.env.collision diff --git a/packages/cli/src/__tests__/__fixtures__/redwood-app-env-many/.env.dev b/packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-many/.env.dev similarity index 100% rename from packages/cli/src/__tests__/__fixtures__/redwood-app-env-many/.env.dev rename to packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-many/.env.dev diff --git a/packages/cli/src/__tests__/__fixtures__/redwood-app-env-many/.env.prod b/packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-many/.env.prod similarity index 100% rename from packages/cli/src/__tests__/__fixtures__/redwood-app-env-many/.env.prod rename to packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-many/.env.prod diff --git a/packages/cli/src/__tests__/__fixtures__/redwood-app-env-node-env/.env.bazinga b/packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-node-env/.env.bazinga similarity index 100% rename from packages/cli/src/__tests__/__fixtures__/redwood-app-env-node-env/.env.bazinga rename to packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-node-env/.env.bazinga diff --git a/packages/cli/src/__tests__/__fixtures__/redwood-app-env-node-env/.env.prod b/packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-node-env/.env.prod similarity index 100% rename from packages/cli/src/__tests__/__fixtures__/redwood-app-env-node-env/.env.prod rename to packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-node-env/.env.prod diff --git a/packages/cli/src/__tests__/__fixtures__/redwood-app-env-prod/.env.prod b/packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-prod/.env.prod similarity index 100% rename from packages/cli/src/__tests__/__fixtures__/redwood-app-env-prod/.env.prod rename to packages/cli-helpers/src/lib/__tests__/__fixtures__/redwood-app-env-prod/.env.prod diff --git a/packages/cli/src/__tests__/loadEnvFiles.test.js b/packages/cli-helpers/src/lib/__tests__/loadEnvFiles.test.ts similarity index 96% rename from packages/cli/src/__tests__/loadEnvFiles.test.js rename to packages/cli-helpers/src/lib/__tests__/loadEnvFiles.test.ts index 0628758cfcbd..ac5b1e5ff202 100644 --- a/packages/cli/src/__tests__/loadEnvFiles.test.js +++ b/packages/cli-helpers/src/lib/__tests__/loadEnvFiles.test.ts @@ -6,10 +6,10 @@ import { loadDefaultEnvFiles, loadNodeEnvDerivedEnvFile, loadUserSpecifiedEnvFiles, -} from '../lib/loadEnvFiles' +} from '../loadEnvFiles.js' describe('loadEnvFiles', () => { - let originalProcessEnv + let originalProcessEnv: NodeJS.Process['env'] beforeAll(() => { originalProcessEnv = { ...process.env } }) @@ -133,7 +133,7 @@ describe('loadEnvFiles', () => { loadUserSpecifiedEnvFiles(cwd, ['missing']) } catch (error) { // Just testing that the error message reports the file it tried to load. - expect(error.message).toMatch(/\.env\.missing/) + expect((error as Error).message).toMatch(/\.env\.missing/) } }) }) diff --git a/packages/cli/src/index.js b/packages/cli/src/index.js index e91c0b3d8d03..74d6b74317a5 100644 --- a/packages/cli/src/index.js +++ b/packages/cli/src/index.js @@ -7,7 +7,7 @@ import fs from 'fs-extra' import { hideBin, Parser } from 'yargs/helpers' import yargs from 'yargs/yargs' -import { recordTelemetryAttributes } from '@redwoodjs/cli-helpers' +import { loadEnvFiles, recordTelemetryAttributes } from '@redwoodjs/cli-helpers' import { telemetryMiddleware } from '@redwoodjs/telemetry' import * as buildCommand from './commands/build' @@ -34,7 +34,6 @@ import * as typeCheckCommand from './commands/type-check' import * as upgradeCommand from './commands/upgrade' import { findUp } from './lib' import { exitWithError } from './lib/exit' -import { loadEnvFiles } from './lib/loadEnvFiles' import * as updateCheck from './lib/updateCheck' import { loadPlugins } from './plugin' import { startTelemetry, shutdownTelemetry } from './telemetry/index' diff --git a/packages/cli/src/lib/loadEnvFiles.js b/packages/cli/src/lib/loadEnvFiles.js index cf77c3666f30..57cf019ea159 100644 --- a/packages/cli/src/lib/loadEnvFiles.js +++ b/packages/cli/src/lib/loadEnvFiles.js @@ -1,79 +1,16 @@ // @ts-check -import path from 'path' - -import { config as dotenvConfig } from 'dotenv' -import { config as dotenvDefaultsConfig } from 'dotenv-defaults' -import fs from 'fs-extra' -import { hideBin, Parser } from 'yargs/helpers' - -import { getPaths } from '@redwoodjs/project-config' - -export function loadEnvFiles() { - if (process.env.REDWOOD_ENV_FILES_LOADED) { - return - } - - const { base } = getPaths() - - loadDefaultEnvFiles(base) - loadNodeEnvDerivedEnvFile(base) - - const { loadEnvFiles } = Parser(hideBin(process.argv), { - array: ['load-env-files'], - default: { - loadEnvFiles: [], - }, - }) - if (loadEnvFiles.length > 0) { - loadUserSpecifiedEnvFiles(base, loadEnvFiles) - } - - process.env.REDWOOD_ENV_FILES_LOADED = 'true' -} - -/** - * @param {string} cwd - */ -export function loadDefaultEnvFiles(cwd) { - dotenvDefaultsConfig({ - path: path.join(cwd, '.env'), - defaults: path.join(cwd, '.env.defaults'), - multiline: true, - }) -} - -/** - * @param {string} cwd - */ -export function loadNodeEnvDerivedEnvFile(cwd) { - if (!process.env.NODE_ENV) { - return - } - - const nodeEnvDerivedEnvFilePath = path.join( - cwd, - `.env.${process.env.NODE_ENV}`, - ) - if (!fs.existsSync(nodeEnvDerivedEnvFilePath)) { - return - } - - dotenvConfig({ path: nodeEnvDerivedEnvFilePath, override: true }) -} +export { + loadEnvFiles, + loadDefaultEnvFiles, + loadNodeEnvDerivedEnvFile, + loadUserSpecifiedEnvFiles, +} from '@redwoodjs/cli-helpers' /** - * @param {string} cwd + * Retaining the file here as per https://github.com/redwoodjs/redwood/pull/11885#issuecomment-2575847407 + * + * This ensures there are no breaking changes in case people are deep-importing any of these methods. + * + * This file can finally be removed in the next major version as a documented breaking change. */ -export function loadUserSpecifiedEnvFiles(cwd, loadEnvFiles) { - for (const suffix of loadEnvFiles) { - const envPath = path.join(cwd, `.env.${suffix}`) - if (!fs.pathExistsSync(envPath)) { - throw new Error( - `Couldn't find an .env file at '${envPath}' as specified by '--load-env-files'`, - ) - } - - dotenvConfig({ path: envPath, override: true }) - } -}