Skip to content

Commit

Permalink
Implement method to get end-of-life date for a dependency
Browse files Browse the repository at this point in the history
This will search a list of release cycles to get the end-of-life date
for the cycle that best matches the dependency version.
  • Loading branch information
danlivings-dxw committed Sep 17, 2024
1 parent b974107 commit eff3d6f
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 5 deletions.
44 changes: 40 additions & 4 deletions utils/endOfLifeDateApi/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,24 +66,60 @@ export class EndOfLifeDateApiClient {
* @
*/

/**
* Finds the release cycle for the given dependency version from the specified list of release cycles
* @param {Dependency} dependency
* @param {Cycle[]} cycles
* @returns {Cycle}
*/
const findDependencyCycle = (dependency, cycles) => cycles.find((cycle) => cycle.cycle === dependency.major?.toString())
?? cycles.find((cycle) => cycle.cycle === dependency.major?.toString() + "." + dependency.minor?.toString())
?? cycles.find((cycle) => cycle.codename?.toLowerCase()?.includes(dependency.tag?.toLowerCase()));

/**
*
* @param {Cycle} cycle
* @returns {Date}
*/
const getEolDate = (cycle) => {
const date = cycle.eol ?? cycle.lts ?? cycle.support;

if (typeof date !== "string") return undefined;

return new Date(date);
};

/**
* Gets the state of the given dependency according to the specified list of release cycles
* @param {Dependency} dependency
* @param {Cycle[]} cycles
* @returns {DependencyState}
*/
export const getDependencyState = (dependency, cycles) => {
const cycle = cycles.find((cycle) => cycle.cycle === dependency.major?.toString())
?? cycles.find((cycle) => cycle.cycle === dependency.major?.toString() + "." + dependency.minor?.toString())
?? cycles.find((cycle) => cycle.codename?.toLowerCase()?.includes(dependency.tag?.toLowerCase()));
const cycle = findDependencyCycle(dependency, cycles);

if (!cycle) return "unknown";

if (new Date(cycle.eol) < Date.now()) return "endOfLife";
const eolDate = getEolDate(cycle);
if (eolDate && (eolDate < Date.now())) return "endOfLife";

if (cycle !== cycles[0]) return "majorUpdateAvailable";

if (cycle.latest !== dependency.version) return "minorUpdateAvailable";

return "upToDate";
};

/**
* Gets the end-of-life date of the given dependency according to the specified list of release cycles
* @param {Dependency} dependency
* @param {Cycle[]} cycles
* @returns {Date}
*/
export const getDependencyEndOfLifeDate = (dependency, cycles) => {
const cycle = findDependencyCycle(dependency, cycles);

if (!cycle) return undefined;

return getEolDate(cycle);
};
37 changes: 36 additions & 1 deletion utils/endOfLifeDateApi/index.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { describe, it } from "node:test";
import expect from "node:assert";
import { getDependencyState } from "./index.js";
import { getDependencyEndOfLifeDate, getDependencyState } from "./index.js";
import { Dependency } from "../../model/Dependency.js";

describe("getDependencyState", () => {
Expand Down Expand Up @@ -104,3 +104,38 @@ describe("getDependencyState", () => {
);
})
});

describe("getDependencyEndOfLifeDate", () => {
it("should return undefined by default", () => {
const dependency = new Dependency("ruby", "3.3.5");
const cycles = [];

const result = getDependencyEndOfLifeDate(dependency, cycles);

expect.strictEqual(
result,
undefined,
);
});

it("should return the end-of-life date from the correct cycle", () => {
const dependency = new Dependency("ruby", "3.3.5");
const cycles = [
{
cycle: "4",
eol: "9999-01-01",
},
{
cycle: "3",
eol: "2024-01-01",
},
];

const result = getDependencyEndOfLifeDate(dependency, cycles);

expect.deepStrictEqual(
result,
new Date("2024-01-01"),
);
});
});

0 comments on commit eff3d6f

Please sign in to comment.