From 752504dcc8a94f5b593df7422ab11683772c5b7f Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Thu, 13 Nov 2025 16:04:24 +0100 Subject: [PATCH] Add --safe-chain-skip-minimum-package-age cli flag --- .../safe-chain/src/config/cliArguments.js | 35 ++++++++++- .../src/config/cliArguments.spec.js | 62 ++++++++++++++++++- packages/safe-chain/src/config/settings.js | 9 ++- 3 files changed, 103 insertions(+), 3 deletions(-) diff --git a/packages/safe-chain/src/config/cliArguments.js b/packages/safe-chain/src/config/cliArguments.js index 04645d8..794c97a 100644 --- a/packages/safe-chain/src/config/cliArguments.js +++ b/packages/safe-chain/src/config/cliArguments.js @@ -1,8 +1,9 @@ /** - * @type {{loggingLevel: string | undefined}} + * @type {{loggingLevel: string | undefined, skipMinimumPackageAge: boolean | undefined}} */ const state = { loggingLevel: undefined, + skipMinimumPackageAge: undefined, }; const SAFE_CHAIN_ARG_PREFIX = "--safe-chain-"; @@ -14,6 +15,7 @@ const SAFE_CHAIN_ARG_PREFIX = "--safe-chain-"; export function initializeCliArguments(args) { // Reset state on each call state.loggingLevel = undefined; + state.skipMinimumPackageAge = undefined; const safeChainArgs = []; const remainingArgs = []; @@ -27,6 +29,7 @@ export function initializeCliArguments(args) { } setLoggingLevel(safeChainArgs); + setSkipMinimumPackageAge(safeChainArgs); return remainingArgs; } @@ -47,6 +50,20 @@ function getLastArgEqualsValue(args, prefix) { return undefined; } +/** + * @param {string[]} args + * @param {string} flagName + * @returns {boolean} + */ +function hasFlagArg(args, flagName) { + for (const arg of args) { + if (arg.toLowerCase() === flagName.toLowerCase()) { + return true; + } + } + return false; +} + /** * @param {string[]} args * @returns {void} @@ -64,3 +81,19 @@ function setLoggingLevel(args) { export function getLoggingLevel() { return state.loggingLevel; } + +/** + * @param {string[]} args + * @returns {void} + */ +function setSkipMinimumPackageAge(args) { + const flagName = SAFE_CHAIN_ARG_PREFIX + "skip-minimum-package-age"; + + if (hasFlagArg(args, flagName)) { + state.skipMinimumPackageAge = true; + } +} + +export function getSkipMinimumPackageAge() { + return state.skipMinimumPackageAge; +} diff --git a/packages/safe-chain/src/config/cliArguments.spec.js b/packages/safe-chain/src/config/cliArguments.spec.js index 415d34a..3c8b7da 100644 --- a/packages/safe-chain/src/config/cliArguments.spec.js +++ b/packages/safe-chain/src/config/cliArguments.spec.js @@ -1,6 +1,10 @@ import { describe, it } from "node:test"; import assert from "node:assert"; -import { initializeCliArguments, getLoggingLevel } from "./cliArguments.js"; +import { + initializeCliArguments, + getLoggingLevel, + getSkipMinimumPackageAge, +} from "./cliArguments.js"; describe("initializeCliArguments", () => { it("should return all args when no safe-chain args are present", () => { @@ -118,4 +122,60 @@ describe("initializeCliArguments", () => { assert.deepEqual(result, ["install"]); assert.strictEqual(getLoggingLevel(), "silent"); }); + + it("should not set skipMinimumPackageAge when flag is absent", () => { + const args = ["install", "express", "--save"]; + initializeCliArguments(args); + + assert.strictEqual(getSkipMinimumPackageAge(), undefined); + }); + + it("should set skipMinimumPackageAge to true when flag is present", () => { + const args = ["--safe-chain-skip-minimum-package-age", "install", "lodash"]; + const result = initializeCliArguments(args); + + assert.deepEqual(result, ["install", "lodash"]); + assert.strictEqual(getSkipMinimumPackageAge(), true); + }); + + it("should handle skip-minimum-package-age flag case-insensitively", () => { + const args = ["--SAFE-CHAIN-SKIP-MINIMUM-PACKAGE-AGE", "install"]; + initializeCliArguments(args); + + assert.strictEqual(getSkipMinimumPackageAge(), true); + }); + + it("should filter out skip-minimum-package-age flag from returned args", () => { + const args = [ + "install", + "--safe-chain-skip-minimum-package-age", + "express", + "--save", + ]; + const result = initializeCliArguments(args); + + assert.deepEqual(result, ["install", "express", "--save"]); + }); + + it("should handle skip-minimum-package-age with other safe-chain arguments", () => { + const args = [ + "--safe-chain-logging=verbose", + "--safe-chain-skip-minimum-package-age", + "install", + "lodash", + ]; + const result = initializeCliArguments(args); + + assert.deepEqual(result, ["install", "lodash"]); + assert.strictEqual(getLoggingLevel(), "verbose"); + assert.strictEqual(getSkipMinimumPackageAge(), true); + }); + + it("should handle skip-minimum-package-age flag in different positions", () => { + const args = ["install", "lodash", "--safe-chain-skip-minimum-package-age"]; + const result = initializeCliArguments(args); + + assert.deepEqual(result, ["install", "lodash"]); + assert.strictEqual(getSkipMinimumPackageAge(), true); + }); }); diff --git a/packages/safe-chain/src/config/settings.js b/packages/safe-chain/src/config/settings.js index ce5af2e..ce7f35c 100644 --- a/packages/safe-chain/src/config/settings.js +++ b/packages/safe-chain/src/config/settings.js @@ -42,6 +42,13 @@ export function getMinimumPackageAgeHours() { return defaultMinimumPackageAge; } +const defaultSkipMinimumPackageAge = false; export function skipMinimumPackageAge() { - return false; + const cliValue = cliArguments.getSkipMinimumPackageAge(); + + if (cliValue === true) { + return true; + } + + return defaultSkipMinimumPackageAge; }