diff --git a/index.js b/index.js index 1cfa0e2..00a3123 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,7 @@ const TemplatePath = require("./src/TemplatePath.js"); const isPlainObject = require("./src/IsPlainObject.js"); const Merge = require("./src/Merge.js"); +const DateCompare = require("./src/DateCompare.js"); const { DeepCopy } = Merge; module.exports = { @@ -8,4 +9,5 @@ module.exports = { isPlainObject, Merge, DeepCopy, + DateCompare, }; \ No newline at end of file diff --git a/package.json b/package.json index 8fe2594..5d9e5d4 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "!test/**" ], "scripts": { - "test": "node --test" + "test": "node --test", + "watch": "node --test --watch" }, "license": "MIT", "engines": { diff --git a/src/DateCompare.js b/src/DateCompare.js new file mode 100644 index 0000000..7850152 --- /dev/null +++ b/src/DateCompare.js @@ -0,0 +1,43 @@ +class DateCompare { + static isTimestampWithinDuration(timestamp, duration, compareDate = Date.now()) { + // in the cache and no duration + if (!duration || duration === "*" || duration === Infinity) { + // no duration specified (plugin default is 1d, but if this is falsy assume infinite) + // "*" is infinite duration + return true; + } + + let expiration = timestamp + this.getDurationMs(duration); + + // still valid + if (expiration > compareDate) { + return true; + } + + // expired + return false; + } + + static getDurationMs(duration = "0s") { + let durationUnits = duration.slice(-1); + let durationMultiplier; + if (durationUnits === "s") { + durationMultiplier = 1; + } else if (durationUnits === "m") { + durationMultiplier = 60; + } else if (durationUnits === "h") { + durationMultiplier = 60 * 60; + } else if (durationUnits === "d") { + durationMultiplier = 60 * 60 * 24; + } else if (durationUnits === "w") { + durationMultiplier = 60 * 60 * 24 * 7; + } else if (durationUnits === "y") { + durationMultiplier = 60 * 60 * 24 * 365; + } + + let durationValue = parseInt(duration.slice(0, duration.length - 1), 10); + return durationValue * durationMultiplier * 1000; + } +} + +module.exports = DateCompare; \ No newline at end of file diff --git a/test/DateCompareTest.js b/test/DateCompareTest.js new file mode 100644 index 0000000..0442093 --- /dev/null +++ b/test/DateCompareTest.js @@ -0,0 +1,39 @@ +const assert = require("node:assert/strict") +const test = require("node:test"); + +const DateCompare = require("../src/DateCompare.js"); + +test("Basic usage empty duration is the same as infinite duration", (t) => { + let jan1 = Date.UTC(2024,0,1); + assert.equal(DateCompare.isTimestampWithinDuration(jan1), true); + assert.equal(DateCompare.isTimestampWithinDuration(Date.now()), true); + assert.equal(DateCompare.isTimestampWithinDuration(jan1, Infinity), true); + assert.equal(DateCompare.isTimestampWithinDuration(Date.now(), Infinity), true); +}); + +test("Basic usage false, now", (t) => { + assert.equal(DateCompare.isTimestampWithinDuration(Date.now(), "0s"), false); + assert.equal(DateCompare.isTimestampWithinDuration(Date.now(), "0s", Date.now()), false); +}); + +test("Basic usage false, old date", (t) => { + let jan1 = Date.UTC(2024,0,1); + assert.equal(DateCompare.isTimestampWithinDuration(jan1, "24h"), false); + assert.equal(DateCompare.isTimestampWithinDuration(jan1, "24h", Date.now()), false); +}); + +test("Basic usage true, now", (t) => { + assert.equal(DateCompare.isTimestampWithinDuration(Date.now(), "1s"), true); +}); + +test("Basic usage true, old date", (t) => { + let jan1 = Date.UTC(2024,0,1); + let jan2 = Date.UTC(2024,0,2); + assert.equal(DateCompare.isTimestampWithinDuration(jan1, "25h", jan2), true); +}); + +test("Basic usage equality is false, needs to be > not >=", (t) => { + let jan1 = Date.UTC(2024,0,1); + let jan2 = Date.UTC(2024,0,2); + assert.equal(DateCompare.isTimestampWithinDuration(jan1, "24h", jan2), false); +}); \ No newline at end of file