Skip to content

Commit 9c54ad0

Browse files
committed
Adds DateCompare utility for use by Fetch and Import for cache durations
1 parent e187bc0 commit 9c54ad0

File tree

4 files changed

+86
-1
lines changed

4 files changed

+86
-1
lines changed

index.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
const TemplatePath = require("./src/TemplatePath.js");
22
const isPlainObject = require("./src/IsPlainObject.js");
33
const Merge = require("./src/Merge.js");
4+
const DateCompare = require("./src/DateCompare.js");
45
const { DeepCopy } = Merge;
56

67
module.exports = {
78
TemplatePath,
89
isPlainObject,
910
Merge,
1011
DeepCopy,
12+
DateCompare,
1113
};

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
"!test/**"
1212
],
1313
"scripts": {
14-
"test": "node --test"
14+
"test": "node --test",
15+
"watch": "node --test --watch"
1516
},
1617
"license": "MIT",
1718
"engines": {

src/DateCompare.js

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
class DateCompare {
2+
static isTimestampWithinDuration(timestamp, duration, compareDate = Date.now()) {
3+
// in the cache and no duration
4+
if (!duration || duration === "*" || duration === Infinity) {
5+
// no duration specified (plugin default is 1d, but if this is falsy assume infinite)
6+
// "*" is infinite duration
7+
return true;
8+
}
9+
10+
let expiration = timestamp + this.getDurationMs(duration);
11+
12+
// still valid
13+
if (expiration > compareDate) {
14+
return true;
15+
}
16+
17+
// expired
18+
return false;
19+
}
20+
21+
static getDurationMs(duration = "0s") {
22+
let durationUnits = duration.slice(-1);
23+
let durationMultiplier;
24+
if (durationUnits === "s") {
25+
durationMultiplier = 1;
26+
} else if (durationUnits === "m") {
27+
durationMultiplier = 60;
28+
} else if (durationUnits === "h") {
29+
durationMultiplier = 60 * 60;
30+
} else if (durationUnits === "d") {
31+
durationMultiplier = 60 * 60 * 24;
32+
} else if (durationUnits === "w") {
33+
durationMultiplier = 60 * 60 * 24 * 7;
34+
} else if (durationUnits === "y") {
35+
durationMultiplier = 60 * 60 * 24 * 365;
36+
}
37+
38+
let durationValue = parseInt(duration.slice(0, duration.length - 1), 10);
39+
return durationValue * durationMultiplier * 1000;
40+
}
41+
}
42+
43+
module.exports = DateCompare;

test/DateCompareTest.js

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const assert = require("node:assert/strict")
2+
const test = require("node:test");
3+
4+
const DateCompare = require("../src/DateCompare.js");
5+
6+
test("Basic usage empty duration is the same as infinite duration", (t) => {
7+
let jan1 = Date.UTC(2024,0,1);
8+
assert.equal(DateCompare.isTimestampWithinDuration(jan1), true);
9+
assert.equal(DateCompare.isTimestampWithinDuration(Date.now()), true);
10+
assert.equal(DateCompare.isTimestampWithinDuration(jan1, Infinity), true);
11+
assert.equal(DateCompare.isTimestampWithinDuration(Date.now(), Infinity), true);
12+
});
13+
14+
test("Basic usage false, now", (t) => {
15+
assert.equal(DateCompare.isTimestampWithinDuration(Date.now(), "0s"), false);
16+
assert.equal(DateCompare.isTimestampWithinDuration(Date.now(), "0s", Date.now()), false);
17+
});
18+
19+
test("Basic usage false, old date", (t) => {
20+
let jan1 = Date.UTC(2024,0,1);
21+
assert.equal(DateCompare.isTimestampWithinDuration(jan1, "24h"), false);
22+
assert.equal(DateCompare.isTimestampWithinDuration(jan1, "24h", Date.now()), false);
23+
});
24+
25+
test("Basic usage true, now", (t) => {
26+
assert.equal(DateCompare.isTimestampWithinDuration(Date.now(), "1s"), true);
27+
});
28+
29+
test("Basic usage true, old date", (t) => {
30+
let jan1 = Date.UTC(2024,0,1);
31+
let jan2 = Date.UTC(2024,0,2);
32+
assert.equal(DateCompare.isTimestampWithinDuration(jan1, "25h", jan2), true);
33+
});
34+
35+
test("Basic usage equality is false, needs to be > not >=", (t) => {
36+
let jan1 = Date.UTC(2024,0,1);
37+
let jan2 = Date.UTC(2024,0,2);
38+
assert.equal(DateCompare.isTimestampWithinDuration(jan1, "24h", jan2), false);
39+
});

0 commit comments

Comments
 (0)