chrono-node 2.7.6 → 2.7.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/common/parsers/ISOFormatParser.d.ts +1 -12
  3. package/dist/cjs/common/parsers/ISOFormatParser.js +30 -28
  4. package/dist/cjs/common/parsers/ISOFormatParser.js.map +1 -1
  5. package/dist/cjs/common/parsers/SlashDateFormatParser.js +14 -7
  6. package/dist/cjs/common/parsers/SlashDateFormatParser.js.map +1 -1
  7. package/dist/cjs/common/refiners/ForwardDateRefiner.js +8 -5
  8. package/dist/cjs/common/refiners/ForwardDateRefiner.js.map +1 -1
  9. package/dist/cjs/locales/en/configuration.js +6 -2
  10. package/dist/cjs/locales/en/configuration.js.map +1 -1
  11. package/dist/cjs/locales/en/constants.d.ts +1 -1
  12. package/dist/cjs/locales/en/constants.js +6 -0
  13. package/dist/cjs/locales/en/constants.js.map +1 -1
  14. package/dist/cjs/locales/en/parsers/ENMonthNameParser.js +1 -1
  15. package/dist/cjs/locales/en/parsers/ENMonthNameParser.js.map +1 -1
  16. package/dist/cjs/locales/en/parsers/ENTimeExpressionParser.d.ts +2 -1
  17. package/dist/cjs/locales/en/parsers/ENTimeExpressionParser.js +7 -0
  18. package/dist/cjs/locales/en/parsers/ENTimeExpressionParser.js.map +1 -1
  19. package/dist/cjs/locales/en/parsers/ENTimeUnitAgoFormatParser.js +3 -0
  20. package/dist/cjs/locales/en/parsers/ENTimeUnitAgoFormatParser.js.map +1 -1
  21. package/dist/cjs/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js +3 -0
  22. package/dist/cjs/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js.map +1 -1
  23. package/dist/cjs/locales/en/parsers/ENTimeUnitLaterFormatParser.js +5 -2
  24. package/dist/cjs/locales/en/parsers/ENTimeUnitLaterFormatParser.js.map +1 -1
  25. package/dist/cjs/locales/en/parsers/ENTimeUnitWithinFormatParser.js +3 -0
  26. package/dist/cjs/locales/en/parsers/ENTimeUnitWithinFormatParser.js.map +1 -1
  27. package/dist/cjs/locales/en/parsers/ENWeekdayParser.d.ts +1 -1
  28. package/dist/cjs/locales/en/parsers/ENWeekdayParser.js +24 -3
  29. package/dist/cjs/locales/en/parsers/ENWeekdayParser.js.map +1 -1
  30. package/dist/cjs/locales/en/parsers/{ENCasualYearMonthDayParser.d.ts → ENYearMonthDayParser.d.ts} +3 -1
  31. package/dist/cjs/locales/en/parsers/{ENCasualYearMonthDayParser.js → ENYearMonthDayParser.js} +20 -8
  32. package/dist/cjs/locales/en/parsers/ENYearMonthDayParser.js.map +1 -0
  33. package/dist/cjs/locales/en/refiners/ENExtractYearSuffixRefiner.d.ts +5 -0
  34. package/dist/cjs/locales/en/refiners/ENExtractYearSuffixRefiner.js +31 -0
  35. package/dist/cjs/locales/en/refiners/ENExtractYearSuffixRefiner.js.map +1 -0
  36. package/dist/cjs/locales/en/refiners/ENMergeDateTimeRefiner.js +1 -1
  37. package/dist/cjs/locales/en/refiners/ENMergeDateTimeRefiner.js.map +1 -1
  38. package/dist/cjs/locales/en/refiners/ENUnlikelyFormatFilter.d.ts +6 -0
  39. package/dist/cjs/locales/en/refiners/ENUnlikelyFormatFilter.js +35 -0
  40. package/dist/cjs/locales/en/refiners/ENUnlikelyFormatFilter.js.map +1 -0
  41. package/dist/cjs/results.d.ts +2 -0
  42. package/dist/cjs/results.js +23 -4
  43. package/dist/cjs/results.js.map +1 -1
  44. package/dist/esm/common/parsers/ISOFormatParser.d.ts +1 -12
  45. package/dist/esm/common/parsers/ISOFormatParser.js +30 -28
  46. package/dist/esm/common/parsers/ISOFormatParser.js.map +1 -1
  47. package/dist/esm/common/parsers/SlashDateFormatParser.js +14 -7
  48. package/dist/esm/common/parsers/SlashDateFormatParser.js.map +1 -1
  49. package/dist/esm/common/refiners/ForwardDateRefiner.js +8 -5
  50. package/dist/esm/common/refiners/ForwardDateRefiner.js.map +1 -1
  51. package/dist/esm/locales/en/configuration.js +6 -2
  52. package/dist/esm/locales/en/configuration.js.map +1 -1
  53. package/dist/esm/locales/en/constants.d.ts +1 -1
  54. package/dist/esm/locales/en/constants.js +6 -0
  55. package/dist/esm/locales/en/constants.js.map +1 -1
  56. package/dist/esm/locales/en/parsers/ENMonthNameParser.js +1 -1
  57. package/dist/esm/locales/en/parsers/ENMonthNameParser.js.map +1 -1
  58. package/dist/esm/locales/en/parsers/ENTimeExpressionParser.d.ts +2 -1
  59. package/dist/esm/locales/en/parsers/ENTimeExpressionParser.js +7 -0
  60. package/dist/esm/locales/en/parsers/ENTimeExpressionParser.js.map +1 -1
  61. package/dist/esm/locales/en/parsers/ENTimeUnitAgoFormatParser.js +3 -0
  62. package/dist/esm/locales/en/parsers/ENTimeUnitAgoFormatParser.js.map +1 -1
  63. package/dist/esm/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js +3 -0
  64. package/dist/esm/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js.map +1 -1
  65. package/dist/esm/locales/en/parsers/ENTimeUnitLaterFormatParser.js +5 -2
  66. package/dist/esm/locales/en/parsers/ENTimeUnitLaterFormatParser.js.map +1 -1
  67. package/dist/esm/locales/en/parsers/ENTimeUnitWithinFormatParser.js +3 -0
  68. package/dist/esm/locales/en/parsers/ENTimeUnitWithinFormatParser.js.map +1 -1
  69. package/dist/esm/locales/en/parsers/ENWeekdayParser.d.ts +1 -1
  70. package/dist/esm/locales/en/parsers/ENWeekdayParser.js +24 -3
  71. package/dist/esm/locales/en/parsers/ENWeekdayParser.js.map +1 -1
  72. package/dist/esm/locales/en/parsers/{ENCasualYearMonthDayParser.d.ts → ENYearMonthDayParser.d.ts} +3 -1
  73. package/dist/esm/locales/en/parsers/{ENCasualYearMonthDayParser.js → ENYearMonthDayParser.js} +19 -7
  74. package/dist/esm/locales/en/parsers/ENYearMonthDayParser.js.map +1 -0
  75. package/dist/esm/locales/en/refiners/ENExtractYearSuffixRefiner.d.ts +5 -0
  76. package/dist/esm/locales/en/refiners/ENExtractYearSuffixRefiner.js +28 -0
  77. package/dist/esm/locales/en/refiners/ENExtractYearSuffixRefiner.js.map +1 -0
  78. package/dist/esm/locales/en/refiners/ENMergeDateTimeRefiner.js +1 -1
  79. package/dist/esm/locales/en/refiners/ENMergeDateTimeRefiner.js.map +1 -1
  80. package/dist/esm/locales/en/refiners/ENUnlikelyFormatFilter.d.ts +6 -0
  81. package/dist/esm/locales/en/refiners/ENUnlikelyFormatFilter.js +32 -0
  82. package/dist/esm/locales/en/refiners/ENUnlikelyFormatFilter.js.map +1 -0
  83. package/dist/esm/results.d.ts +2 -0
  84. package/dist/esm/results.js +23 -4
  85. package/dist/esm/results.js.map +1 -1
  86. package/package.json +1 -1
  87. package/src/common/parsers/ISOFormatParser.ts +30 -32
  88. package/src/common/parsers/SlashDateFormatParser.ts +14 -11
  89. package/src/common/refiners/ForwardDateRefiner.ts +8 -5
  90. package/src/locales/en/configuration.ts +10 -2
  91. package/src/locales/en/constants.ts +7 -1
  92. package/src/locales/en/parsers/ENMonthNameParser.ts +1 -1
  93. package/src/locales/en/parsers/ENTimeExpressionParser.ts +13 -1
  94. package/src/locales/en/parsers/ENTimeUnitAgoFormatParser.ts +3 -1
  95. package/src/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.ts +4 -2
  96. package/src/locales/en/parsers/ENTimeUnitLaterFormatParser.ts +5 -2
  97. package/src/locales/en/parsers/ENTimeUnitWithinFormatParser.ts +4 -2
  98. package/src/locales/en/parsers/ENWeekdayParser.ts +28 -4
  99. package/src/locales/en/parsers/{ENCasualYearMonthDayParser.ts → ENYearMonthDayParser.ts} +18 -7
  100. package/src/locales/en/refiners/ENExtractYearSuffixRefiner.ts +34 -0
  101. package/src/locales/en/refiners/ENMergeDateTimeRefiner.ts +1 -1
  102. package/src/locales/en/refiners/ENUnlikelyFormatFilter.ts +44 -0
  103. package/src/results.ts +26 -5
  104. package/test/en/en_casual.test.ts +4 -0
  105. package/test/en/en_inter_std.test.ts +30 -28
  106. package/test/en/en_merging_relative_dates.test.ts +3 -4
  107. package/test/en/en_month.test.ts +22 -1
  108. package/test/en/en_slash.test.ts +51 -42
  109. package/test/en/en_time_exp.test.ts +67 -0
  110. package/test/en/en_time_units_ago.test.ts +38 -0
  111. package/test/en/en_time_units_casual_relative.test.ts +8 -0
  112. package/test/en/en_time_units_later.test.ts +5 -0
  113. package/test/en/en_time_units_within.test.ts +7 -0
  114. package/test/en/en_weekday.test.ts +43 -0
  115. package/test/en/en_year.test.ts +26 -1
  116. package/test/en/{en_casual_year_month_day.test.ts → en_year_month_day.test.ts} +25 -4
  117. package/test/system.test.ts +2 -0
  118. package/dist/cjs/locales/en/parsers/ENCasualYearMonthDayParser.js.map +0 -1
  119. package/dist/esm/locales/en/parsers/ENCasualYearMonthDayParser.js.map +0 -1
@@ -27,34 +27,6 @@ test("Test - Single Expression", function () {
27
27
  expect(result.start).toBeDate(new Date(784043130000));
28
28
  });
29
29
 
30
- testSingleCase(chrono, "1994-11-05T13:15:30", new Date(2012, 7, 8), (result) => {
31
- expect(result.start).not.toBeNull();
32
- expect(result.start.get("year")).toBe(1994);
33
- expect(result.start.get("month")).toBe(11);
34
- expect(result.start.get("day")).toBe(5);
35
- expect(result.start.get("hour")).toBe(13);
36
- expect(result.start.get("minute")).toBe(15);
37
- expect(result.start.get("second")).toBe(30);
38
- expect(result.start.get("timezoneOffset")).toBe(0);
39
- expect(result.text).toBe("1994-11-05T13:15:30");
40
-
41
- expect(result.start).toBeDate(new Date(784041330000));
42
- });
43
-
44
- testSingleCase(chrono, "2015-07-31T12:00:00", new Date(2012, 7, 8), (result) => {
45
- expect(result.start).not.toBeNull();
46
- expect(result.start.get("year")).toBe(2015);
47
- expect(result.start.get("month")).toBe(7);
48
- expect(result.start.get("day")).toBe(31);
49
- expect(result.start.get("hour")).toBe(12);
50
- expect(result.start.get("minute")).toBe(0);
51
- expect(result.start.get("second")).toBe(0);
52
- expect(result.start.get("timezoneOffset")).toBe(0);
53
- expect(result.text).toBe("2015-07-31T12:00:00");
54
-
55
- expect(result.start).toBeDate(new Date(1438344000000));
56
- });
57
-
58
30
  testSingleCase(chrono, "1994-11-05T13:15:30Z", new Date(2012, 7, 8), (result) => {
59
31
  expect(result.start).not.toBeNull();
60
32
  expect(result.start.get("year")).toBe(1994);
@@ -114,3 +86,33 @@ test("Test - Single Expression", function () {
114
86
  expect(result.start).toBeDate(new Date(1462661100487));
115
87
  });
116
88
  });
89
+
90
+ test("Test - Single Expression with local timezeon", function () {
91
+ testSingleCase(chrono, "1994-11-05T13:15:30", new Date(2012, 7, 8), (result) => {
92
+ expect(result.text).toBe("1994-11-05T13:15:30");
93
+ expect(result.start.get("year")).toBe(1994);
94
+ expect(result.start.get("month")).toBe(11);
95
+ expect(result.start.get("day")).toBe(5);
96
+ expect(result.start.get("hour")).toBe(13);
97
+ expect(result.start.get("minute")).toBe(15);
98
+ expect(result.start.get("second")).toBe(30);
99
+ expect(result.start.get("millisecond")).toBe(0);
100
+
101
+ expect(result.start.isCertain("timezoneOffset")).toBe(false);
102
+ expect(result.start).toBeDate(new Date("1994-11-05T13:15:30"));
103
+ });
104
+
105
+ testSingleCase(chrono, "2015-07-31T12:00:00", new Date(2012, 7, 8), (result) => {
106
+ expect(result.text).toBe("2015-07-31T12:00:00");
107
+ expect(result.start.get("year")).toBe(2015);
108
+ expect(result.start.get("month")).toBe(7);
109
+ expect(result.start.get("day")).toBe(31);
110
+ expect(result.start.get("hour")).toBe(12);
111
+ expect(result.start.get("minute")).toBe(0);
112
+ expect(result.start.get("second")).toBe(0);
113
+ expect(result.start.get("millisecond")).toBe(0);
114
+
115
+ expect(result.start.isCertain("timezoneOffset")).toBe(false);
116
+ expect(result.start).toBeDate(new Date("2015-07-31T12:00:00"));
117
+ });
118
+ });
@@ -11,10 +11,9 @@ test("Test - Single Expression", function () {
11
11
  expect(result.start.get("day")).toBe(15);
12
12
  expect(result.start.get("weekday")).toBe(2);
13
13
 
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);
18
17
 
19
18
  expect(result.start).toBeDate(new Date(2022, 2 - 1, 15, 0));
20
19
  });
@@ -1,5 +1,5 @@
1
1
  import * as chrono from "../../src";
2
- import { testSingleCase } from "../test_util";
2
+ import { testSingleCase, testUnexpectedResult } from "../test_util";
3
3
 
4
4
  test("Test - Month-Year expression", function () {
5
5
  testSingleCase(chrono, "September 2012", (result) => {
@@ -69,6 +69,14 @@ test("Test - Month-Year expression", function () {
69
69
  expect(result.start).toBeDate(new Date(2012, 9 - 1, 1, 12));
70
70
  });
71
71
 
72
+ testSingleCase(chrono, "in June of 2022", (result) => {
73
+ expect(result.text).toContain("June of 2022");
74
+
75
+ expect(result.start).not.toBeNull();
76
+ expect(result.start.get("year")).toBe(2022);
77
+ expect(result.start.get("month")).toBe(6);
78
+ });
79
+
72
80
  testSingleCase(chrono, "Statement of comprehensive income for the year ended Dec. 2021", (result) => {
73
81
  expect(result.text).toBe("Dec. 2021");
74
82
 
@@ -272,3 +280,16 @@ test("Test - Month should not have timezone", () => {
272
280
  }
273
281
  );
274
282
  });
283
+
284
+ test("Test - Month only in different context", () => {
285
+ testSingleCase(chrono.casual, "May", (result) => {
286
+ expect(result.text).toContain("May");
287
+ });
288
+
289
+ testSingleCase(chrono.casual, "in May", (result) => {
290
+ expect(result.text).toContain("May");
291
+ });
292
+
293
+ testUnexpectedResult(chrono.casual, "The mountain may not move");
294
+ testUnexpectedResult(chrono.casual, "May not be correct");
295
+ });
@@ -8,31 +8,7 @@ test("Test - Parsing Offset Expression", function () {
8
8
  });
9
9
  });
10
10
 
11
- test("Test - Single Expression", function () {
12
- testSingleCase(chrono, "The event is going ahead (04/2016)", new Date(2012, 7, 10), (result) => {
13
- expect(result.start).not.toBeNull();
14
- expect(result.start.get("year")).toBe(2016);
15
- expect(result.start.get("month")).toBe(4);
16
- expect(result.start.get("day")).toBe(1);
17
-
18
- expect(result.index).toBe(26);
19
- expect(result.text).toBe("04/2016");
20
-
21
- expect(result.start).toBeDate(new Date(2016, 4 - 1, 1, 12));
22
- });
23
-
24
- testSingleCase(chrono, "Published: 06/2004", new Date(2012, 7, 10), (result) => {
25
- expect(result.start).not.toBeNull();
26
- expect(result.start.get("year")).toBe(2004);
27
- expect(result.start.get("month")).toBe(6);
28
- expect(result.start.get("day")).toBe(1);
29
-
30
- expect(result.index).toBe(11);
31
- expect(result.text).toBe("06/2004");
32
-
33
- expect(result.start).toBeDate(new Date(2004, 6 - 1, 1, 12));
34
- });
35
-
11
+ test("Test - Single Expression (MM/dd/yyyy)", function () {
36
12
  testSingleCase(chrono, "8/10/2012", new Date(2012, 7, 10), (result) => {
37
13
  expect(result.start).not.toBeNull();
38
14
  expect(result.start.get("year")).toBe(2012);
@@ -41,6 +17,7 @@ test("Test - Single Expression", function () {
41
17
 
42
18
  expect(result.index).toBe(0);
43
19
  expect(result.text).toBe("8/10/2012");
20
+ expect(result.tags()).toContain("parser/SlashDateFormatParser");
44
21
 
45
22
  expect(result.start.isCertain("day")).toBe(true);
46
23
  expect(result.start.isCertain("month")).toBe(true);
@@ -61,22 +38,6 @@ test("Test - Single Expression", function () {
61
38
  expect(result.start).toBeDate(new Date(2012, 8 - 1, 1, 12));
62
39
  });
63
40
 
64
- testSingleCase(chrono, "8/10", new Date(2012, 7, 10), (result) => {
65
- expect(result.start).not.toBeNull();
66
- expect(result.start.get("year")).toBe(2012);
67
- expect(result.start.get("month")).toBe(8);
68
- expect(result.start.get("day")).toBe(10);
69
-
70
- expect(result.index).toBe(0);
71
- expect(result.text).toBe("8/10");
72
-
73
- expect(result.start.isCertain("day")).toBe(true);
74
- expect(result.start.isCertain("month")).toBe(true);
75
- expect(result.start.isCertain("year")).toBe(false);
76
-
77
- expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
78
- });
79
-
80
41
  testSingleCase(chrono, "The Deadline is 8/10/2012", new Date(2012, 7, 10), (result) => {
81
42
  expect(result.index).toBe(16);
82
43
  expect(result.text).toBe("8/10/2012");
@@ -103,7 +64,7 @@ test("Test - Single Expression", function () {
103
64
  });
104
65
  });
105
66
 
106
- test("Test - Single Expression Little-Endian", function () {
67
+ test("Test - Single Expression Little-Endian (dd/MM/yyyy)", function () {
107
68
  testSingleCase(chrono.en.GB, "8/10/2012", new Date(2012, 7, 10), (result) => {
108
69
  expect(result.start).not.toBeNull();
109
70
  expect(result.start.get("year")).toBe(2012);
@@ -153,15 +114,61 @@ test("Test - Single Expression Little-Endian with Month name", function () {
153
114
  });
154
115
  });
155
116
 
117
+ test("Test - Single Expression Shorten (mm/yyyy)", () => {
118
+ testSingleCase(chrono, "The event is going ahead (04/2016)", new Date(2012, 7, 10), (result) => {
119
+ expect(result.start).not.toBeNull();
120
+ expect(result.start.get("year")).toBe(2016);
121
+ expect(result.start.get("month")).toBe(4);
122
+ expect(result.start.get("day")).toBe(1);
123
+
124
+ expect(result.index).toBe(26);
125
+ expect(result.text).toBe("04/2016");
126
+
127
+ expect(result.start).toBeDate(new Date(2016, 4 - 1, 1, 12));
128
+ });
129
+
130
+ testSingleCase(chrono, "Published: 06/2004", new Date(2012, 7, 10), (result) => {
131
+ expect(result.start).not.toBeNull();
132
+ expect(result.start.get("year")).toBe(2004);
133
+ expect(result.start.get("month")).toBe(6);
134
+ expect(result.start.get("day")).toBe(1);
135
+
136
+ expect(result.index).toBe(11);
137
+ expect(result.text).toBe("06/2004");
138
+
139
+ expect(result.start).toBeDate(new Date(2004, 6 - 1, 1, 12));
140
+ });
141
+ });
142
+
143
+ test("Test - Single Expression Shorten (dd/mm)", () => {
144
+ testSingleCase(chrono, "8/10", new Date(2012, 7, 10), (result) => {
145
+ expect(result.start).not.toBeNull();
146
+ expect(result.start.get("year")).toBe(2012);
147
+ expect(result.start.get("month")).toBe(8);
148
+ expect(result.start.get("day")).toBe(10);
149
+
150
+ expect(result.index).toBe(0);
151
+ expect(result.text).toBe("8/10");
152
+
153
+ expect(result.start.isCertain("day")).toBe(true);
154
+ expect(result.start.isCertain("month")).toBe(true);
155
+ expect(result.start.isCertain("year")).toBe(false);
156
+
157
+ expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
158
+ });
159
+ });
160
+
156
161
  test("Test - Range Expression", function () {
157
162
  testSingleCase(chrono.en, "8/10/2012 - 8/15/2012", new Date(2012, 7, 10), (result) => {
158
163
  expect(result.index).toBe(0);
159
164
  expect(result.text).toBe("8/10/2012 - 8/15/2012");
165
+ expect(result.tags()).toContain("parser/SlashDateFormatParser");
160
166
 
161
167
  expect(result.start).not.toBeNull();
162
168
  expect(result.start.get("year")).toBe(2012);
163
169
  expect(result.start.get("month")).toBe(8);
164
170
  expect(result.start.get("day")).toBe(10);
171
+ expect(result.start.tags()).toContain("parser/SlashDateFormatParser");
165
172
 
166
173
  expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
167
174
 
@@ -169,6 +176,7 @@ test("Test - Range Expression", function () {
169
176
  expect(result.end.get("year")).toBe(2012);
170
177
  expect(result.end.get("month")).toBe(8);
171
178
  expect(result.end.get("day")).toBe(15);
179
+ expect(result.end.tags()).toContain("parser/SlashDateFormatParser");
172
180
 
173
181
  expect(result.end).toBeDate(new Date(2012, 8 - 1, 15, 12));
174
182
  });
@@ -235,6 +243,7 @@ test("Test - Impossible Dates and Unexpected Results", function () {
235
243
  testUnexpectedResult(chrono, "06/-31/2022");
236
244
  testUnexpectedResult(chrono, "18/13/2022");
237
245
  testUnexpectedResult(chrono, "15/28/2022");
246
+ testUnexpectedResult(chrono, "4/13/1");
238
247
  });
239
248
 
240
249
  test("Test - forward dates only option", function () {
@@ -21,19 +21,35 @@ test("Test - Time expression", function () {
21
21
  expect(result.start.get("minute")).toBe(32);
22
22
  expect(result.start.get("second")).toBe(13);
23
23
  expect(result.start.get("meridiem")).toBe(Meridiem.PM);
24
+
25
+ expect(result.tags()).toContain("parser/ENTimeExpressionParser");
26
+ expect(result.start.tags()).toContain("parser/ENTimeExpressionParser");
24
27
  });
25
28
  });
26
29
 
27
30
  test("Test - Time expression after date", function () {
28
31
  testSingleCase(chrono, "05/31/2024 14:15", new Date(2016, 10 - 1, 1, 8), (result, text) => {
29
32
  expect(result.text).toBe(text);
33
+
34
+ expect(result.start.get("year")).toBe(2024);
35
+ expect(result.start.get("month")).toBe(5);
36
+ expect(result.start.get("day")).toBe(31);
37
+
30
38
  expect(result.start.get("hour")).toBe(14);
31
39
  expect(result.start.get("minute")).toBe(15);
32
40
  expect(result.start.get("meridiem")).toBe(Meridiem.PM);
41
+
42
+ expect(result.tags()).toContain("parser/ENTimeExpressionParser");
43
+ expect(result.start.tags()).toContain("parser/ENTimeExpressionParser");
33
44
  });
34
45
 
35
46
  testSingleCase(chrono, "05/31/2024.14:15", new Date(2016, 10 - 1, 1, 8), (result, text) => {
36
47
  expect(result.text).toBe(text);
48
+
49
+ expect(result.start.get("year")).toBe(2024);
50
+ expect(result.start.get("month")).toBe(5);
51
+ expect(result.start.get("day")).toBe(31);
52
+
37
53
  expect(result.start.get("hour")).toBe(14);
38
54
  expect(result.start.get("minute")).toBe(15);
39
55
  expect(result.start.get("meridiem")).toBe(Meridiem.PM);
@@ -41,6 +57,11 @@ test("Test - Time expression after date", function () {
41
57
 
42
58
  testSingleCase(chrono, "05/31/2024:14:15", new Date(2016, 10 - 1, 1, 8), (result, text) => {
43
59
  expect(result.text).toBe(text);
60
+
61
+ expect(result.start.get("year")).toBe(2024);
62
+ expect(result.start.get("month")).toBe(5);
63
+ expect(result.start.get("day")).toBe(31);
64
+
44
65
  expect(result.start.get("hour")).toBe(14);
45
66
  expect(result.start.get("minute")).toBe(15);
46
67
  expect(result.start.get("meridiem")).toBe(Meridiem.PM);
@@ -48,25 +69,71 @@ test("Test - Time expression after date", function () {
48
69
 
49
70
  testSingleCase(chrono, "05/31/2024-14:15", new Date(2016, 10 - 1, 1, 8), (result, text) => {
50
71
  expect(result.text).toBe(text);
72
+
73
+ expect(result.start.get("year")).toBe(2024);
74
+ expect(result.start.get("month")).toBe(5);
75
+ expect(result.start.get("day")).toBe(31);
76
+
77
+ expect(result.start.get("hour")).toBe(14);
78
+ expect(result.start.get("minute")).toBe(15);
79
+ expect(result.start.get("meridiem")).toBe(Meridiem.PM);
80
+ });
81
+ });
82
+
83
+ test("Test - Time expression before date", () => {
84
+ testSingleCase(chrono, "14:15 05/31/2024", new Date(2016, 10 - 1, 1, 8), (result, text) => {
85
+ expect(result.text).toBe(text);
86
+
87
+ expect(result.start.get("year")).toBe(2024);
88
+ expect(result.start.get("month")).toBe(5);
89
+ expect(result.start.get("day")).toBe(31);
90
+
51
91
  expect(result.start.get("hour")).toBe(14);
52
92
  expect(result.start.get("minute")).toBe(15);
53
93
  expect(result.start.get("meridiem")).toBe(Meridiem.PM);
54
94
  });
95
+
96
+ testSingleCase(chrono, "8:23 AM, Jul 9", new Date(2016, 10 - 1, 1, 8), (result, text) => {
97
+ expect(result.text).toBe(text);
98
+
99
+ expect(result.start.get("year")).toBe(2016);
100
+ expect(result.start.get("month")).toBe(7);
101
+ expect(result.start.get("day")).toBe(9);
102
+
103
+ expect(result.start.get("hour")).toBe(8);
104
+ expect(result.start.get("minute")).toBe(23);
105
+ expect(result.start.get("meridiem")).toBe(Meridiem.AM);
106
+ });
107
+
108
+ testSingleCase(chrono, "8:23 AM ∙ Jul 9", new Date(2016, 10 - 1, 1, 8), (result, text) => {
109
+ expect(result.text).toBe(text);
110
+
111
+ expect(result.start.get("year")).toBe(2016);
112
+ expect(result.start.get("month")).toBe(7);
113
+ expect(result.start.get("day")).toBe(9);
114
+
115
+ expect(result.start.get("hour")).toBe(8);
116
+ expect(result.start.get("minute")).toBe(23);
117
+ expect(result.start.get("meridiem")).toBe(Meridiem.AM);
118
+ });
55
119
  });
56
120
 
57
121
  test("Test - Time range expression", function () {
58
122
  testSingleCase(chrono, "10:00:00 - 21:45:00", new Date(2016, 10 - 1, 1, 8), (result, text) => {
59
123
  expect(result.text).toBe(text);
124
+ expect(result.tags()).toContain("parser/ENTimeExpressionParser");
60
125
 
61
126
  expect(result.start.get("hour")).toBe(10);
62
127
  expect(result.start.get("minute")).toBe(0);
63
128
  expect(result.start.get("second")).toBe(0);
64
129
  expect(result.start.get("meridiem")).toBe(Meridiem.AM);
130
+ expect(result.start.tags()).toContain("parser/ENTimeExpressionParser");
65
131
 
66
132
  expect(result.end.get("hour")).toBe(21);
67
133
  expect(result.end.get("minute")).toBe(45);
68
134
  expect(result.end.get("second")).toBe(0);
69
135
  expect(result.end.get("meridiem")).toBe(Meridiem.PM);
136
+ expect(result.end.tags()).toContain("parser/ENTimeExpressionParser");
70
137
  });
71
138
 
72
139
  testSingleCase(chrono, "10:00:00 until 21:45:00", new Date(2016, 10 - 1, 1, 11), (result, text) => {
@@ -11,6 +11,7 @@ test("Test - Single Expression", function () {
11
11
 
12
12
  expect(result.index).toBe(0);
13
13
  expect(result.text).toBe("5 days ago");
14
+ expect(result.tags()).toContain("result/relativeDate");
14
15
 
15
16
  expect(result.start).toBeDate(new Date(2012, 8 - 1, 5));
16
17
  });
@@ -30,6 +31,9 @@ test("Test - Single Expression", function () {
30
31
  testSingleCase(chrono, "15 minute ago", new Date(2012, 7, 10, 12, 14), (result) => {
31
32
  expect(result.index).toBe(0);
32
33
  expect(result.text).toBe("15 minute ago");
34
+ expect(result.tags()).toContain("result/relativeDate");
35
+ expect(result.tags()).toContain("result/relativeDateAndTime");
36
+
33
37
  expect(result.start.get("hour")).toBe(11);
34
38
  expect(result.start.get("minute")).toBe(59);
35
39
  expect(result.start.get("meridiem")).toBe(Meridiem.AM);
@@ -312,8 +316,42 @@ test("Test - Strict mode", function () {
312
316
  testUnexpectedResult(chrono.strict, "5 h ago", new Date(2012, 7, 10, 12, 14));
313
317
  });
314
318
 
319
+ test("Test - Forward date", () => {
320
+ // Note that it is actually impossible for X ago to be "forward dates".
321
+ // In such situation, we still return the correct actual extracted dates and make sure the option doesn't affect the results.
322
+ const reference = new Date("2024-09-10T12:00:00");
323
+ const options = { forwardDate: true };
324
+
325
+ testSingleCase(chrono, "2 days ago", reference, options, (result, text) => {
326
+ expect(result.start.get("year")).toBe(2024);
327
+ expect(result.start.get("month")).toBe(9);
328
+ expect(result.start.get("day")).toBe(8);
329
+ });
330
+
331
+ testSingleCase(chrono, "2 weeks ago", reference, options, (result, text) => {
332
+ expect(result.start.get("year")).toBe(2024);
333
+ expect(result.start.get("month")).toBe(8);
334
+ expect(result.start.get("day")).toBe(27);
335
+ });
336
+
337
+ testSingleCase(chrono, "2 months ago", reference, options, (result, text) => {
338
+ expect(result.start.get("year")).toBe(2024);
339
+ expect(result.start.get("month")).toBe(7);
340
+ expect(result.start.get("day")).toBe(10);
341
+ });
342
+
343
+ testSingleCase(chrono, "2 years ago", reference, options, (result, text) => {
344
+ expect(result.start.get("year")).toBe(2022);
345
+ expect(result.start.get("month")).toBe(9);
346
+ expect(result.start.get("day")).toBe(10);
347
+ });
348
+ });
349
+
315
350
  test("Test - Negative cases", function () {
316
351
  testUnexpectedResult(chrono, "15 hours 29 min");
317
352
  testUnexpectedResult(chrono, "a few hour");
318
353
  testUnexpectedResult(chrono, "5 days");
354
+
355
+ testUnexpectedResult(chrono, "am ago");
356
+ testUnexpectedResult(chrono, "them ago");
319
357
  });
@@ -5,6 +5,8 @@ import ENTimeUnitCasualRelativeFormatParser from "../../src/locales/en/parsers/E
5
5
  test("Test - Positive time units", () => {
6
6
  testSingleCase(chrono, "next 2 weeks", new Date(2016, 10 - 1, 1, 12), (result, text) => {
7
7
  expect(result.text).toBe(text);
8
+ expect(result.tags()).toContain("result/relativeDate");
9
+
8
10
  expect(result.start.get("year")).toBe(2016);
9
11
  expect(result.start.get("month")).toBe(10);
10
12
  expect(result.start.get("day")).toBe(15);
@@ -44,6 +46,9 @@ test("Test - Positive time units", () => {
44
46
 
45
47
  testSingleCase(chrono, "after an hour", new Date(2016, 10 - 1, 1, 15), (result, text) => {
46
48
  expect(result.text).toBe(text);
49
+ expect(result.tags()).toContain("result/relativeDate");
50
+ expect(result.tags()).toContain("result/relativeDateAndTime");
51
+
47
52
  expect(result.start.get("year")).toBe(2016);
48
53
  expect(result.start.get("month")).toBe(10);
49
54
  expect(result.start.get("day")).toBe(1);
@@ -164,4 +169,7 @@ test("Test - Negative cases", () => {
164
169
  testUnexpectedResult(chrono.casual, "1 m", new Date(2015, 7 - 1, 10, 12, 14));
165
170
  testUnexpectedResult(chrono.casual, "the day", new Date(2015, 7 - 1, 10, 12, 14));
166
171
  testUnexpectedResult(chrono.casual, "a day", new Date(2015, 7 - 1, 10, 12, 14));
172
+
173
+ testUnexpectedResult(chrono, "+am");
174
+ testUnexpectedResult(chrono, "+them");
167
175
  });
@@ -11,6 +11,7 @@ test("Test - Later Expression", function () {
11
11
 
12
12
  expect(result.index).toBe(0);
13
13
  expect(result.text).toBe("2 days later");
14
+ expect(result.tags()).toContain("result/relativeDate");
14
15
 
15
16
  expect(result.start.isCertain("day")).toBe(true);
16
17
  expect(result.start.isCertain("month")).toBe(true);
@@ -354,3 +355,7 @@ test("Test - Plus after reference", () => {
354
355
  expect(result.start.get("minute")).toBe(10);
355
356
  });
356
357
  });
358
+
359
+ test("Test - Negative cases", () => {
360
+ testUnexpectedResult(chrono, "tell them later");
361
+ });
@@ -6,6 +6,7 @@ test("Test - The normal within expression", () => {
6
6
  testSingleCase(chrono, "we have to make something in 5 days.", new Date(2012, 7, 10), (result) => {
7
7
  expect(result.index).toBe(26);
8
8
  expect(result.text).toBe("in 5 days");
9
+ expect(result.tags()).toContain("result/relativeDate");
9
10
 
10
11
  expect(result.start).not.toBeNull();
11
12
  expect(result.start.get("year")).toBe(2012);
@@ -408,3 +409,9 @@ test("Test - Forward date option", () => {
408
409
  expect(result.start.get("day")).toBe(1);
409
410
  });
410
411
  });
412
+
413
+ test("Test - Negative cases", () => {
414
+ testUnexpectedResult(chrono, "in am");
415
+ testUnexpectedResult(chrono, "in them");
416
+ testUnexpectedResult(chrono, "the second half");
417
+ });
@@ -219,6 +219,49 @@ test("Test - Weekday casual `Next` guessing", function () {
219
219
  }
220
220
  });
221
221
 
222
+ test("Test - Casual 'weekend' and 'weekday'", () => {
223
+ {
224
+ const refDateOnFriday = new Date(2024, 10 - 1, 18, 12, 0);
225
+ testSingleCase(chrono.casual, "last weekend", refDateOnFriday, (result, text) => {
226
+ expect(result.text).toBe(text);
227
+ expect(result.start).toBeDate(new Date(2024, 10 - 1, 13, 12)); // Sunday
228
+ });
229
+ testSingleCase(chrono.casual, "this weekend", refDateOnFriday, (result, text) => {
230
+ expect(result.text).toBe(text);
231
+ expect(result.start).toBeDate(new Date(2024, 10 - 1, 19, 12)); // Saturday
232
+ });
233
+ testSingleCase(chrono.casual, "next weekend", refDateOnFriday, (result, text) => {
234
+ expect(result.text).toBe(text);
235
+ expect(result.start).toBeDate(new Date(2024, 10 - 1, 26, 12)); // Saturday
236
+ });
237
+ }
238
+ });
239
+
240
+ test("Test - Casual 'weekday' mentioning", () => {
241
+ {
242
+ const refDateOnFriday = new Date(2024, 10 - 1, 18, 12, 0);
243
+ testSingleCase(chrono.casual, "last weekday", refDateOnFriday, (result, text) => {
244
+ expect(result.text).toBe(text);
245
+ expect(result.start).toBeDate(new Date(2024, 10 - 1, 17, 12)); // Thursday
246
+ });
247
+ testSingleCase(chrono.casual, "next weekday", refDateOnFriday, (result, text) => {
248
+ expect(result.text).toBe(text);
249
+ expect(result.start).toBeDate(new Date(2024, 10 - 1, 21, 12)); // Monday
250
+ });
251
+ }
252
+ {
253
+ const refDateOnSaturday = new Date(2024, 10 - 1, 19, 12, 0);
254
+ testSingleCase(chrono.casual, "last weekday", refDateOnSaturday, (result, text) => {
255
+ expect(result.text).toBe(text);
256
+ expect(result.start).toBeDate(new Date(2024, 10 - 1, 18, 12)); // Friday
257
+ });
258
+ testSingleCase(chrono.casual, "next weekday", refDateOnSaturday, (result, text) => {
259
+ expect(result.text).toBe(text);
260
+ expect(result.start).toBeDate(new Date(2024, 10 - 1, 21, 12)); // Monday
261
+ });
262
+ }
263
+ });
264
+
222
265
  test("Test - Weekday With Casual Time", function () {
223
266
  testSingleCase(chrono.casual, "Lets meet on Tuesday morning", new Date(2015, 3, 18), (result) => {
224
267
  expect(result.index).toBe(10);
@@ -1,6 +1,6 @@
1
1
  import * as chrono from "../../src";
2
2
  import { testSingleCase, testUnexpectedResult } from "../test_util";
3
- import ENTimeExpressionParser from "../../src/locales/en/parsers/ENTimeExpressionParser";
3
+ import { Meridiem } from "../../src";
4
4
 
5
5
  test("Test - Year numbers with BCE/CE Era label", () => {
6
6
  testSingleCase(chrono, "10 August 234 BCE", new Date(2012, 7, 10), (result) => {
@@ -73,3 +73,28 @@ test("Test - Year numbers with Buddhist Era label", () => {
73
73
  expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
74
74
  });
75
75
  });
76
+
77
+ test("Test - Year number after date/time expression", () => {
78
+ testSingleCase(chrono, "Thu Oct 26 11:00:09 2023", new Date(2016, 10 - 1, 1, 8), (result, text) => {
79
+ expect(result.start.get("year")).toBe(2023);
80
+ expect(result.start.get("month")).toBe(10);
81
+ expect(result.start.get("day")).toBe(26);
82
+
83
+ expect(result.start.get("hour")).toBe(11);
84
+ expect(result.start.get("minute")).toBe(0);
85
+ expect(result.start.get("second")).toBe(9);
86
+ expect(result.start.get("meridiem")).toBe(Meridiem.AM);
87
+ });
88
+
89
+ testSingleCase(chrono, "Thu Oct 26 11:00:09 EDT 2023", new Date(2016, 10 - 1, 1, 8), (result, text) => {
90
+ expect(result.start.get("year")).toBe(2023);
91
+ expect(result.start.get("month")).toBe(10);
92
+ expect(result.start.get("day")).toBe(26);
93
+
94
+ expect(result.start.get("hour")).toBe(11);
95
+ expect(result.start.get("minute")).toBe(0);
96
+ expect(result.start.get("second")).toBe(9);
97
+ expect(result.start.get("meridiem")).toBe(Meridiem.AM);
98
+ expect(result.start.get("timezoneOffset")).toBe(-240);
99
+ });
100
+ });
@@ -1,7 +1,7 @@
1
1
  import { testSingleCase, testUnexpectedResult } from "../test_util";
2
2
  import * as chrono from "../../src";
3
3
 
4
- test("Test - Single Expression Start with Year", function () {
4
+ test("Test - Single Expression (yyyy/MM/dd)", function () {
5
5
  testSingleCase(chrono, "2012/8/10", new Date(2012, 7, 10), (result) => {
6
6
  expect(result.start).not.toBeNull();
7
7
  expect(result.start.get("year")).toBe(2012);
@@ -41,7 +41,7 @@ test("Test - Single Expression Start with Year", function () {
41
41
  });
42
42
  });
43
43
 
44
- test("Test - Single Expression Start with Year and Month Name", function () {
44
+ test("Test - Single Expression with month name (yyyy/MMM/dd)", function () {
45
45
  testSingleCase(chrono, "2012/Aug/10", new Date(2012, 7, 10), (result) => {
46
46
  expect(result.start).not.toBeNull();
47
47
  expect(result.start.get("year")).toBe(2012);
@@ -73,8 +73,29 @@ test("Test - Single Expression Start with Year and Month Name", function () {
73
73
  });
74
74
  });
75
75
 
76
- test("Test - Negative year-month-day like pattern", function () {
77
- testUnexpectedResult(chrono, "2012-80-10", new Date(2012, 7, 10));
76
+ test("Test - Allow swap date/month order in casual mode", () => {
77
+ testUnexpectedResult(chrono.strict, "2024/13/1");
78
+ testUnexpectedResult(chrono.strict, "2024-13-01");
78
79
 
80
+ testSingleCase(chrono.casual, "2024/13/1", new Date(2012, 7, 10), (result) => {
81
+ expect(result.start.get("year")).toBe(2024);
82
+ expect(result.start.get("month")).toBe(1);
83
+ expect(result.start.get("day")).toBe(13);
84
+ });
85
+
86
+ testSingleCase(chrono.casual, "2024-13-01", new Date(2012, 7, 10), (result) => {
87
+ expect(result.start.get("year")).toBe(2024);
88
+ expect(result.start.get("month")).toBe(1);
89
+ expect(result.start.get("day")).toBe(13);
90
+ });
91
+ });
92
+
93
+ test("Test - Not parse unlikely xxxx-xx-xx pattern", function () {
94
+ testUnexpectedResult(chrono, "2012/80/10", new Date(2012, 7, 10));
79
95
  testUnexpectedResult(chrono, "2012 80 10", new Date(2012, 7, 10));
80
96
  });
97
+
98
+ test("Test - Not parse impossible dates", function () {
99
+ testUnexpectedResult(chrono, "2014-08-32");
100
+ testUnexpectedResult(chrono, "2014-02-30");
101
+ });
@@ -241,4 +241,6 @@ test("Test - Compare with native js", () => {
241
241
  testByCompareWithNative("Fri, 31 Mar 2000 07:00:00 UTC");
242
242
 
243
243
  testByCompareWithNative("2014-12-14T18:22:14.759Z");
244
+
245
+ testByCompareWithNative("2024-01-01T00:00");
244
246
  });
@@ -1 +0,0 @@
1
- {"version":3,"file":"ENCasualYearMonthDayParser.js","sourceRoot":"","sources":["../../../../../src/locales/en/parsers/ENCasualYearMonthDayParser.ts"],"names":[],"mappings":";;AACA,4CAAgD;AAChD,oDAAyD;AACzD,2GAAgH;AAShH,MAAM,OAAO,GAAG,IAAI,MAAM,CACtB,uBAAuB;IACnB,OAAO,yBAAe,CAAC,4BAAgB,CAAC,4BAA4B;IACpE,cAAc;IACd,WAAW,EACf,GAAG,CACN,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,MAAqB,0BAA2B,SAAQ,uEAAsC;IAC1F,YAAY;QACR,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,OAAuB,EAAE,KAAuB;QACzD,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC;YACnC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACrC,CAAC,CAAC,4BAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAE9D,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE;YACzB,OAAO,IAAI,CAAC;SACf;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAE/C,OAAO;YACH,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,IAAI;SACb,CAAC;IACN,CAAC;CACJ;AAvBD,6CAuBC"}