chrono-node 2.6.1 → 2.6.3

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 +32 -2
  2. package/dist/cjs/common/refiners/AbstractMergeDateRangeRefiner.js +15 -7
  3. package/dist/cjs/common/refiners/AbstractMergeDateRangeRefiner.js.map +1 -1
  4. package/dist/cjs/common/refiners/ExtractTimezoneAbbrRefiner.d.ts +3 -4
  5. package/dist/cjs/common/refiners/ExtractTimezoneAbbrRefiner.js +6 -196
  6. package/dist/cjs/common/refiners/ExtractTimezoneAbbrRefiner.js.map +1 -1
  7. package/dist/cjs/common/refiners/ForwardDateRefiner.js +14 -14
  8. package/dist/cjs/common/refiners/ForwardDateRefiner.js.map +1 -1
  9. package/dist/cjs/configurations.js +1 -1
  10. package/dist/cjs/configurations.js.map +1 -1
  11. package/dist/cjs/index.d.ts +26 -4
  12. package/dist/cjs/index.js +16 -1
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/locales/en/constants.d.ts +4 -0
  15. package/dist/cjs/locales/en/constants.js +5 -18
  16. package/dist/cjs/locales/en/constants.js.map +1 -1
  17. package/dist/cjs/locales/en/index.js +1 -1
  18. package/dist/cjs/locales/en/index.js.map +1 -1
  19. package/dist/cjs/locales/en/parsers/ENMonthNameMiddleEndianParser.d.ts +1 -1
  20. package/dist/cjs/locales/en/parsers/ENMonthNameParser.d.ts +1 -1
  21. package/dist/cjs/locales/en/parsers/ENTimeUnitAgoFormatParser.js +2 -2
  22. package/dist/cjs/locales/en/parsers/ENTimeUnitAgoFormatParser.js.map +1 -1
  23. package/dist/cjs/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.d.ts +2 -0
  24. package/dist/cjs/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js +6 -1
  25. package/dist/cjs/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js.map +1 -1
  26. package/dist/cjs/locales/en/parsers/ENTimeUnitLaterFormatParser.js +1 -1
  27. package/dist/cjs/locales/en/parsers/ENTimeUnitLaterFormatParser.js.map +1 -1
  28. package/dist/cjs/locales/en/parsers/ENTimeUnitWithinFormatParser.d.ts +2 -0
  29. package/dist/cjs/locales/en/parsers/ENTimeUnitWithinFormatParser.js +10 -1
  30. package/dist/cjs/locales/en/parsers/ENTimeUnitWithinFormatParser.js.map +1 -1
  31. package/dist/cjs/locales/nl/parsers/NLMonthNameMiddleEndianParser.d.ts +1 -1
  32. package/dist/cjs/locales/ru/constants.js +4 -1
  33. package/dist/cjs/locales/ru/constants.js.map +1 -1
  34. package/dist/cjs/locales/ru/parsers/RUMonthNameParser.d.ts +1 -1
  35. package/dist/cjs/locales/zh/hans/parsers/ZHHansDateParser.d.ts +1 -1
  36. package/dist/cjs/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.d.ts +1 -1
  37. package/dist/cjs/locales/zh/hans/parsers/ZHHansTimeExpressionParser.d.ts +1 -1
  38. package/dist/cjs/locales/zh/hant/parsers/ZHHantDateParser.d.ts +1 -1
  39. package/dist/cjs/locales/zh/hant/parsers/ZHHantDeadlineFormatParser.d.ts +1 -1
  40. package/dist/cjs/locales/zh/hant/parsers/ZHHantTimeExpressionParser.d.ts +1 -1
  41. package/dist/cjs/package.json +1 -1
  42. package/dist/cjs/results.d.ts +1 -1
  43. package/dist/cjs/results.js +3 -3
  44. package/dist/cjs/results.js.map +1 -1
  45. package/dist/cjs/timezone.d.ts +5 -194
  46. package/dist/cjs/timezone.js +80 -7
  47. package/dist/cjs/timezone.js.map +1 -1
  48. package/dist/esm/common/refiners/AbstractMergeDateRangeRefiner.js +15 -7
  49. package/dist/esm/common/refiners/AbstractMergeDateRangeRefiner.js.map +1 -1
  50. package/dist/esm/common/refiners/ExtractTimezoneAbbrRefiner.d.ts +3 -4
  51. package/dist/esm/common/refiners/ExtractTimezoneAbbrRefiner.js +6 -196
  52. package/dist/esm/common/refiners/ExtractTimezoneAbbrRefiner.js.map +1 -1
  53. package/dist/esm/common/refiners/ForwardDateRefiner.js +14 -14
  54. package/dist/esm/common/refiners/ForwardDateRefiner.js.map +1 -1
  55. package/dist/esm/configurations.js +1 -1
  56. package/dist/esm/configurations.js.map +1 -1
  57. package/dist/esm/index.d.ts +26 -4
  58. package/dist/esm/index.js +15 -0
  59. package/dist/esm/index.js.map +1 -1
  60. package/dist/esm/locales/en/constants.d.ts +4 -0
  61. package/dist/esm/locales/en/constants.js +21 -0
  62. package/dist/esm/locales/en/constants.js.map +1 -1
  63. package/dist/esm/locales/en/index.js +1 -1
  64. package/dist/esm/locales/en/index.js.map +1 -1
  65. package/dist/esm/locales/en/parsers/ENMonthNameMiddleEndianParser.d.ts +1 -1
  66. package/dist/esm/locales/en/parsers/ENMonthNameParser.d.ts +1 -1
  67. package/dist/esm/locales/en/parsers/ENTimeUnitAgoFormatParser.js +3 -3
  68. package/dist/esm/locales/en/parsers/ENTimeUnitAgoFormatParser.js.map +1 -1
  69. package/dist/esm/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.d.ts +2 -0
  70. package/dist/esm/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js +7 -2
  71. package/dist/esm/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js.map +1 -1
  72. package/dist/esm/locales/en/parsers/ENTimeUnitLaterFormatParser.js +2 -2
  73. package/dist/esm/locales/en/parsers/ENTimeUnitLaterFormatParser.js.map +1 -1
  74. package/dist/esm/locales/en/parsers/ENTimeUnitWithinFormatParser.d.ts +2 -0
  75. package/dist/esm/locales/en/parsers/ENTimeUnitWithinFormatParser.js +11 -2
  76. package/dist/esm/locales/en/parsers/ENTimeUnitWithinFormatParser.js.map +1 -1
  77. package/dist/esm/locales/nl/parsers/NLMonthNameMiddleEndianParser.d.ts +1 -1
  78. package/dist/esm/locales/ru/constants.js +4 -1
  79. package/dist/esm/locales/ru/constants.js.map +1 -1
  80. package/dist/esm/locales/ru/parsers/RUMonthNameParser.d.ts +1 -1
  81. package/dist/esm/locales/zh/hans/parsers/ZHHansDateParser.d.ts +1 -1
  82. package/dist/esm/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.d.ts +1 -1
  83. package/dist/esm/locales/zh/hans/parsers/ZHHansTimeExpressionParser.d.ts +1 -1
  84. package/dist/esm/locales/zh/hant/parsers/ZHHantDateParser.d.ts +1 -1
  85. package/dist/esm/locales/zh/hant/parsers/ZHHantDeadlineFormatParser.d.ts +1 -1
  86. package/dist/esm/locales/zh/hant/parsers/ZHHantTimeExpressionParser.d.ts +1 -1
  87. package/dist/esm/package.json +1 -1
  88. package/dist/esm/results.d.ts +1 -1
  89. package/dist/esm/results.js +3 -3
  90. package/dist/esm/results.js.map +1 -1
  91. package/dist/esm/timezone.d.ts +5 -194
  92. package/dist/esm/timezone.js +74 -6
  93. package/dist/esm/timezone.js.map +1 -1
  94. package/package.json +6 -7
  95. package/src/common/refiners/AbstractMergeDateRangeRefiner.ts +13 -8
  96. package/src/common/refiners/ExtractTimezoneAbbrRefiner.ts +7 -201
  97. package/src/common/refiners/ForwardDateRefiner.ts +18 -16
  98. package/src/configurations.ts +3 -1
  99. package/src/index.ts +48 -3
  100. package/src/locales/en/constants.ts +30 -0
  101. package/src/locales/en/index.ts +1 -1
  102. package/src/locales/en/parsers/ENTimeUnitAgoFormatParser.ts +3 -3
  103. package/src/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.ts +10 -2
  104. package/src/locales/en/parsers/ENTimeUnitLaterFormatParser.ts +5 -2
  105. package/src/locales/en/parsers/ENTimeUnitWithinFormatParser.ts +16 -3
  106. package/src/locales/ru/constants.ts +4 -1
  107. package/src/results.ts +3 -3
  108. package/src/timezone.ts +124 -7
  109. package/test/de/de_time_exp.test.ts +7 -7
  110. package/test/en/en_month.test.ts +70 -0
  111. package/test/en/en_time_units_ago.test.ts +12 -0
  112. package/test/en/en_time_units_casual_relative.test.ts +18 -0
  113. package/test/en/en_time_units_later.test.ts +13 -10
  114. package/test/en/en_time_units_within.test.ts +12 -1
  115. package/test/en/en_timezone_exp.test.ts +142 -0
  116. package/test/en/en_weekday.test.ts +26 -0
  117. package/test/en/negative_cases.test.ts +2 -0
  118. package/test/fr/fr_time_exp.test.ts +2 -2
  119. package/test/system.test.ts +23 -1
@@ -1,5 +1,6 @@
1
1
  import * as chrono from "../../src";
2
2
  import { testSingleCase, testUnexpectedResult } from "../test_util";
3
+ import ENTimeUnitCasualRelativeFormatParser from "../../src/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser";
3
4
 
4
5
  test("Test - Positive time units", () => {
5
6
  testSingleCase(chrono, "next 2 weeks", new Date(2016, 10 - 1, 1, 12), (result, text) => {
@@ -141,6 +142,23 @@ test("Test - Minus '-' sign", () => {
141
142
  });
142
143
  });
143
144
 
145
+ test("Test - Without custom parser without abbreviations", function () {
146
+ const custom = chrono.en.strict.clone();
147
+ custom.parsers.push(new ENTimeUnitCasualRelativeFormatParser(false));
148
+
149
+ testUnexpectedResult(custom, "-3y");
150
+ testUnexpectedResult(custom, "last 2m");
151
+
152
+ testSingleCase(custom, "-2 hours 5 minutes", new Date(2016, 10 - 1, 1, 12), (result, text) => {
153
+ expect(result.text).toBe(text);
154
+ expect(result.start.get("year")).toBe(2016);
155
+ expect(result.start.get("month")).toBe(10);
156
+ expect(result.start.get("day")).toBe(1);
157
+ expect(result.start.get("hour")).toBe(9);
158
+ expect(result.start.get("minute")).toBe(55);
159
+ });
160
+ });
161
+
144
162
  test("Test - Negative cases", () => {
145
163
  testUnexpectedResult(chrono.casual, "3y", new Date(2015, 7 - 1, 10, 12, 14));
146
164
  testUnexpectedResult(chrono.casual, "1 m", new Date(2015, 7 - 1, 10, 12, 14));
@@ -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
  import { Meridiem } from "../../src/";
4
4
 
5
5
  test("Test - Later Expression", function () {
@@ -262,6 +262,16 @@ test("Test - From now Expression", () => {
262
262
  });
263
263
 
264
264
  test("Test - Strict mode", function () {
265
+ testSingleCase(chrono, "the min after", new Date(2012, 7, 10, 12, 14), (result) => {
266
+ expect(result.index).toBe(0);
267
+ expect(result.text).toBe("the min after");
268
+ expect(result.start.get("hour")).toBe(12);
269
+ expect(result.start.get("minute")).toBe(15);
270
+ expect(result.start.get("meridiem")).toBe(Meridiem.PM);
271
+
272
+ expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 15));
273
+ });
274
+
265
275
  testSingleCase(chrono.strict, "15 minutes from now", new Date(2012, 7, 10, 12, 14), (result, text) => {
266
276
  expect(result.text).toBe(text);
267
277
  expect(result.start.get("hour")).toBe(12);
@@ -279,15 +289,8 @@ test("Test - Strict mode", function () {
279
289
  expect(result.start).toBeDate(new Date(2012, 7, 10, 13, 5));
280
290
  });
281
291
 
282
- testSingleCase(chrono, "the min after", new Date(2012, 7, 10, 12, 14), (result) => {
283
- expect(result.index).toBe(0);
284
- expect(result.text).toBe("the min after");
285
- expect(result.start.get("hour")).toBe(12);
286
- expect(result.start.get("minute")).toBe(15);
287
- expect(result.start.get("meridiem")).toBe(Meridiem.PM);
288
-
289
- expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 15));
290
- });
292
+ testUnexpectedResult(chrono.strict, "15m from now");
293
+ testUnexpectedResult(chrono.strict, "15s later");
291
294
  });
292
295
 
293
296
  test("Test - After with reference", () => {
@@ -1,5 +1,6 @@
1
1
  import * as chrono from "../../src";
2
- import { testSingleCase } from "../test_util";
2
+ import { testSingleCase, testUnexpectedResult } from "../test_util";
3
+ import { Meridiem } from "../../src";
3
4
 
4
5
  test("Test - The normal within expression", () => {
5
6
  testSingleCase(chrono, "we have to make something in 5 days.", new Date(2012, 7, 10), (result) => {
@@ -327,3 +328,13 @@ test("Test - Time units' certainty", () => {
327
328
  expect(result.start.isCertain("minute")).toBeFalsy();
328
329
  });
329
330
  });
331
+
332
+ test("Test - Strict mode", function () {
333
+ testSingleCase(chrono, "in 2hour", new Date(2016, 10 - 1, 1, 14, 52), (result, text) => {
334
+ expect(result.start.get("hour")).toBe(16);
335
+ expect(result.start.get("minute")).toBe(52);
336
+ });
337
+
338
+ testUnexpectedResult(chrono.strict, "in 15m");
339
+ testUnexpectedResult(chrono.strict, "within 5hr");
340
+ });
@@ -1,4 +1,6 @@
1
1
  import * as chrono from "../../src";
2
+ import { Month, Weekday } from "../../src";
3
+ import { getLastWeekdayOfMonth } from "../../src/timezone";
2
4
  import { testSingleCase } from "../test_util";
3
5
 
4
6
  test("Test - Parsing date/time with UTC offset", function () {
@@ -100,6 +102,146 @@ test("Test - Parsing date/time with timezone abbreviation", function () {
100
102
  });
101
103
  });
102
104
 
105
+ test("Test - Parsing date/time with ambiguous timezone abbreviations", function () {
106
+ // Test dates around transition to DST for ET
107
+ testSingleCase(chrono, "2022-03-12 23:00 ET", (result, text) => {
108
+ expect(result.text).toBe(text);
109
+ expect(result.start.get("hour")).toBe(23);
110
+ expect(result.start.get("timezoneOffset")).toBe(-5 * 60); // ET during standard time (EST) in 2022
111
+ });
112
+ testSingleCase(chrono, "2022-03-13 23:00 ET", (result, text) => {
113
+ expect(result.text).toBe(text);
114
+ expect(result.start.get("hour")).toBe(23);
115
+ expect(result.start.get("timezoneOffset")).toBe(-4 * 60); // ET during DST (EDT) in 2022
116
+ });
117
+ testSingleCase(chrono, "2021-03-13 23:00 ET", (result, text) => {
118
+ expect(result.text).toBe(text);
119
+ expect(result.start.get("hour")).toBe(23);
120
+ expect(result.start.get("timezoneOffset")).toBe(-5 * 60); // ET during standard time (EST) in 2021
121
+ });
122
+ testSingleCase(chrono, "2021-03-14 23:00 ET", (result, text) => {
123
+ expect(result.text).toBe(text);
124
+ expect(result.start.get("hour")).toBe(23);
125
+ expect(result.start.get("timezoneOffset")).toBe(-4 * 60); // ET during DST (EDT) in 2021
126
+ });
127
+
128
+ // Also test around transition *from* DST
129
+ testSingleCase(chrono, "2021-11-06 23:00 ET", (result, text) => {
130
+ expect(result.text).toBe(text);
131
+ expect(result.start.get("hour")).toBe(23);
132
+ expect(result.start.get("timezoneOffset")).toBe(-4 * 60); // ET during DST (EDT) in 2021
133
+ });
134
+ testSingleCase(chrono, "2021-11-07 23:00 ET", (result, text) => {
135
+ expect(result.text).toBe(text);
136
+ expect(result.start.get("hour")).toBe(23);
137
+ expect(result.start.get("timezoneOffset")).toBe(-5 * 60); // ET during standard time (EST) in 2021
138
+ });
139
+ testSingleCase(chrono, "2020-10-31 23:00 ET", (result, text) => {
140
+ expect(result.text).toBe(text);
141
+ expect(result.start.get("hour")).toBe(23);
142
+ expect(result.start.get("timezoneOffset")).toBe(-4 * 60); // ET during DST (EDT) in 2020
143
+ });
144
+ testSingleCase(chrono, "2020-11-01 23:00 ET", (result, text) => {
145
+ expect(result.text).toBe(text);
146
+ expect(result.start.get("hour")).toBe(23);
147
+ expect(result.start.get("timezoneOffset")).toBe(-5 * 60); // ET during standard time (EST) in 2020
148
+ });
149
+
150
+ // Same checks, but for CET (which transitions at different dates with different rules)
151
+ // Test dates around transition to DST for CET
152
+ testSingleCase(chrono, "2022-03-26 23:00 CET", (result, text) => {
153
+ expect(result.text).toBe(text);
154
+ expect(result.start.get("hour")).toBe(23);
155
+ expect(result.start.get("timezoneOffset")).toBe(60); // CET during standard time (CET) in 2022
156
+ });
157
+ testSingleCase(chrono, "2022-03-27 23:00 CET", (result, text) => {
158
+ expect(result.text).toBe(text);
159
+ expect(result.start.get("hour")).toBe(23);
160
+ expect(result.start.get("timezoneOffset")).toBe(2 * 60); // CET during DST (CEST) in 2022
161
+ });
162
+ testSingleCase(chrono, "2021-03-27 23:00 CET", (result, text) => {
163
+ expect(result.text).toBe(text);
164
+ expect(result.start.get("hour")).toBe(23);
165
+ expect(result.start.get("timezoneOffset")).toBe(60); // CET during standard time (CET) in 2021
166
+ });
167
+ testSingleCase(chrono, "2021-03-28 23:00 CET", (result, text) => {
168
+ expect(result.text).toBe(text);
169
+ expect(result.start.get("hour")).toBe(23);
170
+ expect(result.start.get("timezoneOffset")).toBe(2 * 60); // CET during DST (CEST) in 2021
171
+ });
172
+
173
+ // Also test around transition *from* DST for CET
174
+ testSingleCase(chrono, "2022-10-29 23:00 CET", (result, text) => {
175
+ expect(result.text).toBe(text);
176
+ expect(result.start.get("hour")).toBe(23);
177
+ expect(result.start.get("timezoneOffset")).toBe(2 * 60); // CET during DST (CEST) in 2022
178
+ });
179
+ testSingleCase(chrono, "2022-10-30 23:00 CET", (result, text) => {
180
+ expect(result.text).toBe(text);
181
+ expect(result.start.get("hour")).toBe(23);
182
+ expect(result.start.get("timezoneOffset")).toBe(60); // CET during standard time (CET) in 2022
183
+ });
184
+ testSingleCase(chrono, "2021-10-30 23:00 CET", (result, text) => {
185
+ expect(result.text).toBe(text);
186
+ expect(result.start.get("hour")).toBe(23);
187
+ expect(result.start.get("timezoneOffset")).toBe(2 * 60); // CET during DST (CEST) in 2021
188
+ });
189
+ testSingleCase(chrono, "2021-10-31 23:00 CET", (result, text) => {
190
+ expect(result.text).toBe(text);
191
+ expect(result.start.get("hour")).toBe(23);
192
+ expect(result.start.get("timezoneOffset")).toBe(60); // CET during standard time (CET) in 2021
193
+ });
194
+ });
195
+
196
+ test("Test - Timezone parsing overrides", function () {
197
+ // chrono.parse('at 10:00 XYZ', new Date(2023, 3, 20), {timezones: {XYZ: -180}})
198
+ // XYZ shouldn't be recognized or parsed as a timezone
199
+ testSingleCase(chrono, "Jan 1st 2023 at 10:00 XYZ", (result) => {
200
+ expect(result.text).toBe("Jan 1st 2023 at 10:00");
201
+ expect(result.start).toBeDate(new Date(2023, 1 - 1, 1, 10));
202
+ });
203
+ // Parse the correct tzoffset when XYZ is provided as a custom tz in parsingOptions
204
+ testSingleCase(
205
+ chrono,
206
+ "Jan 1st 2023 at 10:00 XYZ",
207
+ new Date(2023, 1, 1),
208
+ { timezones: { XYZ: -180 } },
209
+ (result) => {
210
+ expect(result.text).toBe("Jan 1st 2023 at 10:00 XYZ");
211
+ expect(result.start.get("timezoneOffset")).toBe(-180);
212
+ }
213
+ );
214
+ // Parse the correct tzoffset when XYZ is provided as a custom ambiguous tz in parsingOptions
215
+ const parseXYZAsAmbiguousTz = {
216
+ timezoneOffsetDuringDst: -120,
217
+ timezoneOffsetNonDst: -180,
218
+ dstStart: (year: number) => getLastWeekdayOfMonth(year, Month.MARCH, Weekday.SUNDAY, 2),
219
+ dstEnd: (year: number) => getLastWeekdayOfMonth(year, Month.OCTOBER, Weekday.SUNDAY, 3),
220
+ };
221
+ // Parsing a non-DST date
222
+ testSingleCase(
223
+ chrono,
224
+ "Jan 1st 2023 at 10:00 XYZ",
225
+ new Date(2023, 1, 1),
226
+ { timezones: { XYZ: parseXYZAsAmbiguousTz } },
227
+ (result) => {
228
+ expect(result.text).toBe("Jan 1st 2023 at 10:00 XYZ");
229
+ expect(result.start.get("timezoneOffset")).toBe(-180);
230
+ }
231
+ );
232
+ // Parsing a DST date
233
+ testSingleCase(
234
+ chrono,
235
+ "Jun 1st 2023 at 10:00 XYZ",
236
+ new Date(2023, 1, 1),
237
+ { timezones: { XYZ: parseXYZAsAmbiguousTz } },
238
+ (result) => {
239
+ expect(result.text).toBe("Jun 1st 2023 at 10:00 XYZ");
240
+ expect(result.start.get("timezoneOffset")).toBe(-120);
241
+ }
242
+ );
243
+ });
244
+
103
245
  test("Test - Parsing date with timezone abbreviation", function () {
104
246
  testSingleCase(chrono, "Wednesday, September 16, 2020, EST", (result, text) => {
105
247
  expect(result.text).toBe(text);
@@ -273,6 +273,32 @@ test("Test - Weekday Overlap", function () {
273
273
  });
274
274
  });
275
275
 
276
+ test("Test - Weekday range", () => {
277
+ testSingleCase(chrono.casual, "Friday to Monday", new Date(2023, 4 - 1, 9) /*Sunday*/, (result) => {
278
+ expect(result.start.get("year")).toBe(2023);
279
+ expect(result.start.get("month")).toBe(4);
280
+ expect(result.start.get("day")).toBe(7);
281
+ expect(result.start.get("weekday")).toBe(5);
282
+
283
+ expect(result.end.get("year")).toBe(2023);
284
+ expect(result.end.get("month")).toBe(4);
285
+ expect(result.end.get("day")).toBe(10);
286
+ expect(result.end.get("weekday")).toBe(1);
287
+ });
288
+
289
+ testSingleCase(chrono.casual, "Monday to Friday", new Date(2023, 4 - 1, 9) /*Sunday*/, (result) => {
290
+ expect(result.start.get("year")).toBe(2023);
291
+ expect(result.start.get("month")).toBe(4);
292
+ expect(result.start.get("day")).toBe(10);
293
+ expect(result.start.get("weekday")).toBe(1);
294
+
295
+ expect(result.end.get("year")).toBe(2023);
296
+ expect(result.end.get("month")).toBe(4);
297
+ expect(result.end.get("day")).toBe(14);
298
+ expect(result.end.get("weekday")).toBe(5);
299
+ });
300
+ });
301
+
276
302
  test("Test - forward dates only option", () => {
277
303
  testSingleCase(
278
304
  chrono.casual,
@@ -63,6 +63,8 @@ test("Test - Skip impossible dates/times", () => {
63
63
 
64
64
  testUnexpectedResult(chrono, "14PM");
65
65
  testUnexpectedResult(chrono, "25:12");
66
+
67
+ testUnexpectedResult(chrono, "An appointment on 13/31/2018");
66
68
  });
67
69
 
68
70
  test("Test - Skip version number pattern", () => {
@@ -488,13 +488,13 @@ test("Test - Timezone extraction", function () {
488
488
  expect(result.start.get("timezoneOffset")).toBe(-300);
489
489
  });
490
490
 
491
- testSingleCase(chrono.fr, "vendredi 15h CET", new Date(2016, 3, 28), (result, text) => {
491
+ testSingleCase(chrono.fr, "vendredi 15h CET", new Date(2016, 1, 28), (result, text) => {
492
492
  expect(result.text).toBe(text);
493
493
  expect(result.start.isCertain("timezoneOffset")).toBe(true);
494
494
  expect(result.start.get("timezoneOffset")).toBe(60);
495
495
  });
496
496
 
497
- testSingleCase(chrono.fr, "vendredi 15h cest", new Date(2016, 3, 28), (result, text) => {
497
+ testSingleCase(chrono.fr, "vendredi 15h cest", new Date(2016, 1, 28), (result, text) => {
498
498
  expect(result.text).toBe(text);
499
499
  expect(result.start.isCertain("timezoneOffset")).toBe(true);
500
500
  expect(result.start.get("timezoneOffset")).toBe(120);
@@ -1,8 +1,10 @@
1
1
  import * as chrono from "../src/";
2
- import { testSingleCase } from "./test_util";
2
+ import { testSingleCase, testUnexpectedResult } from "./test_util";
3
3
  import { Meridiem } from "../src";
4
4
  import UnlikelyFormatFilter from "../src/common/refiners/UnlikelyFormatFilter";
5
5
  import SlashDateFormatParser from "../src/common/parsers/SlashDateFormatParser";
6
+ import ENWeekdayParser from "../src/locales/en/parsers/ENWeekdayParser";
7
+ import ENTimeUnitCasualRelativeFormatParser from "../src/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser";
6
8
 
7
9
  //-------------------------------------
8
10
 
@@ -146,6 +148,26 @@ test("Test - Remove a refiner example", () => {
146
148
  });
147
149
  });
148
150
 
151
+ test("Test - Replace a parser example", () => {
152
+ const custom = chrono.en.casual.clone();
153
+ testSingleCase(custom, "next 5m", new Date(2016, 10 - 1, 1, 14, 52), (result, text) => {
154
+ expect(result.start.get("hour")).toBe(14);
155
+ expect(result.start.get("minute")).toBe(57);
156
+ });
157
+ testSingleCase(custom, "next 5 minutes", new Date(2016, 10 - 1, 1, 14, 52), (result, text) => {
158
+ expect(result.start.get("hour")).toBe(14);
159
+ expect(result.start.get("minute")).toBe(57);
160
+ });
161
+
162
+ const index = custom.parsers.findIndex((r) => r instanceof ENTimeUnitCasualRelativeFormatParser);
163
+ custom.parsers[index] = new ENTimeUnitCasualRelativeFormatParser(false);
164
+ testUnexpectedResult(custom, "next 5m");
165
+ testSingleCase(custom, "next 5 minutes", new Date(2016, 10 - 1, 1, 14, 52), (result, text) => {
166
+ expect(result.start.get("hour")).toBe(14);
167
+ expect(result.start.get("minute")).toBe(57);
168
+ });
169
+ });
170
+
149
171
  test("Test - Compare with native js", () => {
150
172
  const testByCompareWithNative = (text) => {
151
173
  const expectedDate = new Date(text);