diff --git a/packages/safe-chain/src/config/cliArguments.js b/packages/safe-chain/src/config/cliArguments.js index 918761c..e9d9f96 100644 --- a/packages/safe-chain/src/config/cliArguments.js +++ b/packages/safe-chain/src/config/cliArguments.js @@ -11,7 +11,14 @@ const state = { }; const SAFE_CHAIN_ARG_PREFIX = "--safe-chain-"; - +const SAFE_CHAIN_ENV_PREFIX = "SAFE_CHAIN_"; +const ENV_BOOL_TRUE_VALUES = ["1", "true", "yes"]; +/** + * + * @param {unknown} value + * @returns {boolean} + */ +const isEnvBoolTrue = (value) => !!value && ENV_BOOL_TRUE_VALUES.includes(String(value).toLowerCase()); /** * @param {string[]} args * @returns {string[]} @@ -63,13 +70,17 @@ function getLastArgEqualsValue(args, prefix) { * @returns {void} */ function setLoggingLevel(args) { - const safeChainLoggingArg = SAFE_CHAIN_ARG_PREFIX + "logging="; - - const level = getLastArgEqualsValue(args, safeChainLoggingArg); - if (!level) { - return; + // First, check environment variable + const envValue = process.env[SAFE_CHAIN_ENV_PREFIX + "LOGGING"]; + if (envValue) { + state.loggingLevel = envValue.toLowerCase(); + } + + // CLI flag overrides environment variable + const cliValue = getLastArgEqualsValue(args, SAFE_CHAIN_ARG_PREFIX + "logging="); + if (cliValue) { + state.loggingLevel = cliValue.toLowerCase(); } - state.loggingLevel = level.toLowerCase(); } export function getLoggingLevel() { @@ -81,9 +92,14 @@ export function getLoggingLevel() { * @returns {void} */ function setSkipMinimumPackageAge(args) { - const flagName = SAFE_CHAIN_ARG_PREFIX + "skip-minimum-package-age"; + // First, check environment variable + const envValue = process.env[SAFE_CHAIN_ENV_PREFIX + "SKIP_MINIMUM_PACKAGE_AGE"]; + if (isEnvBoolTrue(envValue)) { + state.skipMinimumPackageAge = true; + } - if (hasFlagArg(args, flagName)) { + // CLI flag overrides (always sets to true when present) + if (hasFlagArg(args, SAFE_CHAIN_ARG_PREFIX + "skip-minimum-package-age")) { state.skipMinimumPackageAge = true; } } diff --git a/packages/safe-chain/src/config/cliArguments.spec.js b/packages/safe-chain/src/config/cliArguments.spec.js index 8b505be..c774150 100644 --- a/packages/safe-chain/src/config/cliArguments.spec.js +++ b/packages/safe-chain/src/config/cliArguments.spec.js @@ -1,4 +1,4 @@ -import { describe, it } from "node:test"; +import { describe, it, afterEach } from "node:test"; import assert from "node:assert"; import { initializeCliArguments, @@ -309,3 +309,45 @@ describe("initializeCliArguments", () => { } }); }); + +describe("environment variable support", () => { + const originalEnv = { ...process.env }; + + afterEach(() => { + process.env = originalEnv; + }); + + it("should set logging level from SAFE_CHAIN_LOGGING env var", () => { + process.env.SAFE_CHAIN_LOGGING = "VERBOSE"; + initializeCliArguments(["install"]); + assert.strictEqual(getLoggingLevel(), "verbose"); + }); + + it("should let CLI flag override SAFE_CHAIN_LOGGING", () => { + process.env.SAFE_CHAIN_LOGGING = "silent"; + initializeCliArguments(["--safe-chain-logging=verbose", "install"]); + assert.strictEqual(getLoggingLevel(), "verbose"); + }); + + for (const truthyValue of ["1", "True", "YES"]) { + it(`should set skipMinimumPackageAge when env var is '${truthyValue}'`, () => { + process.env.SAFE_CHAIN_SKIP_MINIMUM_PACKAGE_AGE = truthyValue; + initializeCliArguments(["install"]); + assert.strictEqual(getSkipMinimumPackageAge(), true); + }); + } + + for (const falsyValue of ["0", "false", "no", ""]) { + it(`should not set skipMinimumPackageAge when env var is '${falsyValue}'`, () => { + process.env.SAFE_CHAIN_SKIP_MINIMUM_PACKAGE_AGE = falsyValue; + initializeCliArguments(["install"]); + assert.strictEqual(getSkipMinimumPackageAge(), undefined); + }); + } + + it("should let CLI flag override SAFE_CHAIN_SKIP_MINIMUM_PACKAGE_AGE", () => { + process.env.SAFE_CHAIN_SKIP_MINIMUM_PACKAGE_AGE = "false"; + initializeCliArguments(["--safe-chain-skip-minimum-package-age", "install"]); + assert.strictEqual(getSkipMinimumPackageAge(), true); + }); +});