feat: allow safe-chain cliArguments from environment

This commit is contained in:
sasumaki 2025-11-26 01:01:00 +02:00
parent 5b6fe659c2
commit 14b85bd1b8
2 changed files with 68 additions and 10 deletions

View file

@ -8,7 +8,14 @@ const state = {
}; };
const SAFE_CHAIN_ARG_PREFIX = "--safe-chain-"; 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 * @param {string[]} args
* @returns {string[]} * @returns {string[]}
@ -57,13 +64,17 @@ function getLastArgEqualsValue(args, prefix) {
* @returns {void} * @returns {void}
*/ */
function setLoggingLevel(args) { function setLoggingLevel(args) {
const safeChainLoggingArg = SAFE_CHAIN_ARG_PREFIX + "logging="; // First, check environment variable
const envValue = process.env[SAFE_CHAIN_ENV_PREFIX + "LOGGING"];
const level = getLastArgEqualsValue(args, safeChainLoggingArg); if (envValue) {
if (!level) { state.loggingLevel = envValue.toLowerCase();
return; }
// 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() { export function getLoggingLevel() {
@ -75,9 +86,14 @@ export function getLoggingLevel() {
* @returns {void} * @returns {void}
*/ */
function setSkipMinimumPackageAge(args) { 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; state.skipMinimumPackageAge = true;
} }
} }

View file

@ -1,4 +1,4 @@
import { describe, it } from "node:test"; import { describe, it, afterEach } from "node:test";
import assert from "node:assert"; import assert from "node:assert";
import { import {
initializeCliArguments, initializeCliArguments,
@ -179,3 +179,45 @@ describe("initializeCliArguments", () => {
assert.strictEqual(getSkipMinimumPackageAge(), true); assert.strictEqual(getSkipMinimumPackageAge(), true);
}); });
}); });
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);
});
});