Skip to content

Commit 31bcae3

Browse files
author
Wanasit Tanakitrungruang
committedSep 16, 2024·
Fix: Forward dates option affect relative timeago results
1 parent 696d247 commit 31bcae3

File tree

4 files changed

+50
-14
lines changed

4 files changed

+50
-14
lines changed
 

‎src/common/refiners/ForwardDateRefiner.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default class ForwardDateRefiner implements Refiner {
1515
return results;
1616
}
1717

18-
results.forEach(function (result) {
18+
results.forEach((result) => {
1919
let refMoment = dayjs(context.refDate);
2020

2121
if (result.start.isOnlyTime() && refMoment.isAfter(result.start.dayjs())) {
@@ -28,6 +28,9 @@ export default class ForwardDateRefiner implements Refiner {
2828
implySimilarDate(result.end, refMoment);
2929
}
3030
}
31+
context.debug(() => {
32+
console.log(`${this.constructor.name} adjusted ${result} time result (${result.start})`);
33+
});
3134
}
3235

3336
if (result.start.isOnlyWeekdayComponent() && refMoment.isAfter(result.start.dayjs())) {
@@ -41,7 +44,7 @@ export default class ForwardDateRefiner implements Refiner {
4144
result.start.imply("month", refMoment.month() + 1);
4245
result.start.imply("year", refMoment.year());
4346
context.debug(() => {
44-
console.log(`Forward weekly adjusted for ${result} (${result.start})`);
47+
console.log(`${this.constructor.name} adjusted ${result} weekday (${result.start})`);
4548
});
4649

4750
if (result.end && result.end.isOnlyWeekdayComponent()) {
@@ -56,7 +59,7 @@ export default class ForwardDateRefiner implements Refiner {
5659
result.end.imply("month", refMoment.month() + 1);
5760
result.end.imply("year", refMoment.year());
5861
context.debug(() => {
59-
console.log(`Forward weekly adjusted for ${result} (${result.end})`);
62+
console.log(`${this.constructor.name} adjusted ${result} weekday (${result.end})`);
6063
});
6164
}
6265
}
@@ -67,13 +70,13 @@ export default class ForwardDateRefiner implements Refiner {
6770
for (let i = 0; i < 3 && refMoment.isAfter(result.start.dayjs()); i++) {
6871
result.start.imply("year", result.start.get("year") + 1);
6972
context.debug(() => {
70-
console.log(`Forward yearly adjusted for ${result} (${result.start})`);
73+
console.log(`${this.constructor.name} adjusted ${result} year (${result.start})`);
7174
});
7275

7376
if (result.end && !result.end.isCertain("year")) {
7477
result.end.imply("year", result.end.get("year") + 1);
7578
context.debug(() => {
76-
console.log(`Forward yearly adjusted for ${result} (${result.end})`);
79+
console.log(`${this.constructor.name} adjusted ${result} month (${result.start})`);
7780
});
7881
}
7982
}

‎src/results.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,9 @@ export class ParsingComponents implements ParsedComponents {
132132
}
133133

134134
isOnlyTime(): boolean {
135-
return !this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month");
135+
return (
136+
!this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month") && !this.isCertain("year")
137+
);
136138
}
137139

138140
isOnlyWeekdayComponent(): boolean {
@@ -230,11 +232,12 @@ export class ParsingComponents implements ParsedComponents {
230232
components.assign("day", date.date());
231233
components.assign("month", date.month() + 1);
232234
components.assign("year", date.year());
235+
} else if (fragments["week"]) {
236+
components.assign("day", date.date());
237+
components.assign("month", date.month() + 1);
238+
components.assign("year", date.year());
239+
components.imply("weekday", date.day());
233240
} else {
234-
if (fragments["week"]) {
235-
components.imply("weekday", date.day());
236-
}
237-
238241
components.imply("day", date.date());
239242
if (fragments["month"]) {
240243
components.assign("month", date.month() + 1);

‎test/en/en_merging_relative_dates.test.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@ test("Test - Single Expression", function () {
1111
expect(result.start.get("day")).toBe(15);
1212
expect(result.start.get("weekday")).toBe(2);
1313

14-
expect(result.start.isCertain("day")).toBe(false);
15-
expect(result.start.isCertain("month")).toBe(false);
16-
expect(result.start.isCertain("year")).toBe(false);
17-
expect(result.start.isCertain("weekday")).toBe(false);
14+
expect(result.start.isCertain("day")).toBe(true);
15+
expect(result.start.isCertain("month")).toBe(true);
16+
expect(result.start.isCertain("year")).toBe(true);
1817

1918
expect(result.start).toBeDate(new Date(2022, 2 - 1, 15, 0));
2019
});

‎test/en/en_time_units_ago.test.ts

+31
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,37 @@ test("Test - Strict mode", function () {
312312
testUnexpectedResult(chrono.strict, "5 h ago", new Date(2012, 7, 10, 12, 14));
313313
});
314314

315+
test("Test - Forward date", () => {
316+
// Note that it is actually impossible for X ago to be "forward dates".
317+
// In such situation, we still return the correct actual extracted dates and make sure the option doesn't affect the results.
318+
const reference = new Date("2024-09-10T12:00:00");
319+
const options = { forwardDate: true };
320+
321+
testSingleCase(chrono, "2 days ago", reference, options, (result, text) => {
322+
expect(result.start.get("year")).toBe(2024);
323+
expect(result.start.get("month")).toBe(9);
324+
expect(result.start.get("day")).toBe(8);
325+
});
326+
327+
testSingleCase(chrono, "2 weeks ago", reference, options, (result, text) => {
328+
expect(result.start.get("year")).toBe(2024);
329+
expect(result.start.get("month")).toBe(8);
330+
expect(result.start.get("day")).toBe(27);
331+
});
332+
333+
testSingleCase(chrono, "2 months ago", reference, options, (result, text) => {
334+
expect(result.start.get("year")).toBe(2024);
335+
expect(result.start.get("month")).toBe(7);
336+
expect(result.start.get("day")).toBe(10);
337+
});
338+
339+
testSingleCase(chrono, "2 years ago", reference, options, (result, text) => {
340+
expect(result.start.get("year")).toBe(2022);
341+
expect(result.start.get("month")).toBe(9);
342+
expect(result.start.get("day")).toBe(10);
343+
});
344+
});
345+
315346
test("Test - Negative cases", function () {
316347
testUnexpectedResult(chrono, "15 hours 29 min");
317348
testUnexpectedResult(chrono, "a few hour");

0 commit comments

Comments
 (0)
Please sign in to comment.