chrono-node 2.3.0 → 2.3.4

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 (74) hide show
  1. package/benchmark/benchmark.js +4 -0
  2. package/dist/common/casualReferences.js +3 -1
  3. package/dist/common/refiners/ForwardDateRefiner.js +1 -1
  4. package/dist/locales/de/constants.js +1 -1
  5. package/dist/locales/en/constants.d.ts +1 -1
  6. package/dist/locales/en/constants.js +5 -5
  7. package/dist/locales/en/parsers/ENCasualTimeParser.js +1 -1
  8. package/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js +6 -8
  9. package/dist/locales/en/parsers/ENRelativeDateFormatParser.js +3 -3
  10. package/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js +3 -3
  11. package/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js +1 -1
  12. package/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js +2 -2
  13. package/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js +1 -1
  14. package/dist/locales/fr/constants.js +1 -1
  15. package/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js +1 -1
  16. package/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +1 -1
  17. package/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js +1 -1
  18. package/dist/locales/nl/constants.js +8 -5
  19. package/dist/locales/nl/index.js +12 -3
  20. package/dist/locales/nl/parsers/NLRelativeDateFormatParser.d.ts +7 -0
  21. package/dist/locales/nl/parsers/NLRelativeDateFormatParser.js +57 -0
  22. package/dist/locales/nl/parsers/NLTimeExpressionParser.d.ts +1 -0
  23. package/dist/locales/nl/parsers/NLTimeExpressionParser.js +3 -0
  24. package/dist/locales/nl/parsers/NLTimeUnitAgoFormatParser.d.ts +9 -0
  25. package/dist/locales/nl/parsers/NLTimeUnitAgoFormatParser.js +23 -0
  26. package/dist/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.d.ts +7 -0
  27. package/dist/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js +25 -0
  28. package/dist/locales/nl/parsers/NLTimeUnitLaterFormatParser.d.ts +9 -0
  29. package/dist/locales/nl/parsers/NLTimeUnitLaterFormatParser.js +22 -0
  30. package/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js +1 -1
  31. package/dist/results.d.ts +2 -2
  32. package/dist/results.js +18 -12
  33. package/dist/timezone.d.ts +1 -1
  34. package/dist/timezone.js +3 -0
  35. package/dist/utils/pattern.js +1 -1
  36. package/package.json +1 -1
  37. package/src/common/casualReferences.ts +3 -1
  38. package/src/common/refiners/ForwardDateRefiner.ts +1 -1
  39. package/src/locales/de/constants.ts +1 -1
  40. package/src/locales/en/constants.ts +5 -5
  41. package/src/locales/en/parsers/ENCasualTimeParser.ts +1 -1
  42. package/src/locales/en/parsers/ENMonthNameLittleEndianParser.ts +9 -10
  43. package/src/locales/en/parsers/ENRelativeDateFormatParser.ts +3 -3
  44. package/src/locales/en/parsers/ENTimeUnitAgoFormatParser.ts +3 -4
  45. package/src/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.ts +1 -1
  46. package/src/locales/en/parsers/ENTimeUnitLaterFormatParser.ts +2 -2
  47. package/src/locales/en/parsers/ENTimeUnitWithinFormatParser.ts +1 -1
  48. package/src/locales/fr/constants.ts +1 -1
  49. package/src/locales/fr/parsers/FRTimeUnitAgoFormatParser.ts +1 -1
  50. package/src/locales/fr/parsers/FRTimeUnitRelativeFormatParser.ts +1 -1
  51. package/src/locales/fr/parsers/FRTimeUnitWithinFormatParser.ts +1 -1
  52. package/src/locales/nl/constants.ts +11 -5
  53. package/src/locales/nl/index.ts +12 -3
  54. package/src/locales/nl/parsers/NLRelativeDateFormatParser.ts +70 -0
  55. package/src/locales/nl/parsers/NLTimeExpressionParser.ts +4 -0
  56. package/src/locales/nl/parsers/NLTimeUnitAgoFormatParser.ts +26 -0
  57. package/src/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.ts +27 -0
  58. package/src/locales/nl/parsers/NLTimeUnitLaterFormatParser.ts +27 -0
  59. package/src/locales/nl/parsers/NLTimeUnitWithinFormatParser.ts +1 -1
  60. package/src/results.ts +22 -12
  61. package/src/timezone.ts +5 -1
  62. package/src/utils/pattern.ts +1 -1
  63. package/test/en/en_casual.test.ts +11 -0
  64. package/test/en/en_month_name_little_endian.test.ts +10 -0
  65. package/test/en/en_relative.test.ts +8 -0
  66. package/test/en/en_slash.test.ts +11 -0
  67. package/test/en/en_timezone_exp.test.ts +85 -10
  68. package/test/en/en_weekday.test.ts +69 -25
  69. package/test/en/negative_cases.test.ts +2 -0
  70. package/test/nl/nl_relative.test.ts +212 -0
  71. package/test/nl/nl_time_units_ago.test.ts +243 -0
  72. package/test/nl/nl_time_units_casual_relative.test.ts +130 -0
  73. package/test/nl/nl_time_units_later.test.ts +250 -0
  74. package/test/test_util.ts +5 -2
@@ -364,6 +364,16 @@ test("Test - Forward Option", () => {
364
364
  expect(result.end.get("day")).toBe(23);
365
365
  expect(result.end.get("hour")).toBe(19);
366
366
  });
367
+
368
+ testSingleCase(chrono, "17 August 2013 - 19 August 2013", (result) => {
369
+ expect(result.start.get("year")).toBe(2013);
370
+ expect(result.start.get("month")).toBe(8);
371
+ expect(result.start.get("day")).toBe(17);
372
+
373
+ expect(result.end.get("year")).toBe(2013);
374
+ expect(result.end.get("month")).toBe(8);
375
+ expect(result.end.get("day")).toBe(19);
376
+ });
367
377
  });
368
378
 
369
379
  test("Test - Impossible Dates (Strict Mode)", function () {
@@ -230,4 +230,12 @@ test("Test - Relative date components' certainty and imply timezone", () => {
230
230
  expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (Japan Standard Time)"));
231
231
  expect(result).toBeDate(new Date("Sun Nov 29 2020 5:34:13 GMT+0100"));
232
232
  }
233
+
234
+ {
235
+ const text = "in 20 minutes";
236
+ const result = chrono.parse(text, { instant: refDate, timezone: null })[0] as ParsingResult;
237
+
238
+ expect(result.text).toBe(text);
239
+ expect(result.start.isCertain("timezoneOffset")).toBe(false);
240
+ }
233
241
  });
@@ -203,4 +203,15 @@ test("Test - forward dates only option", function () {
203
203
 
204
204
  expect(result.start).toBeDate(new Date(2000, 5 - 1, 31, 12));
205
205
  });
206
+
207
+ testSingleCase(chrono, "1/8 at 12pm", new Date("Sep 25 2021 12:00:00"), { forwardDate: true }, (result) => {
208
+ expect(result.text).toBe("1/8 at 12pm");
209
+
210
+ expect(result.start).not.toBeNull();
211
+ expect(result.start.get("year")).toBe(2022);
212
+ expect(result.start.get("month")).toBe(1);
213
+ expect(result.start.get("day")).toBe(8);
214
+
215
+ expect(result.start).toBeDate(new Date(2022, 1 - 1, 8, 12));
216
+ });
206
217
  });
@@ -81,20 +81,95 @@ test("Test - Parsing date with timezone abbreviation", function () {
81
81
  });
82
82
 
83
83
  test("Test - Not parsing timezone from relative time", function () {
84
- const refDate = new Date(2020, 11 - 1, 14, 13, 48, 22);
84
+ {
85
+ const refInstant = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
86
+ const expectedInstant = new Date("Sun Nov 29 2020 14:24:13 GMT+0900 (Japan Standard Time)");
87
+
88
+ testSingleCase(chrono, "in 1 hour get eggs and milk", refInstant, (result, text) => {
89
+ expect(result.text).toBe("in 1 hour");
90
+ expect(result.start.get("timezoneOffset")).toBe(-refInstant.getTimezoneOffset());
91
+ expect(result.start).toBeDate(expectedInstant);
92
+ });
93
+ }
94
+
95
+ {
96
+ const refInstant = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
97
+ const expectedInstant = new Date("Sun Nov 29 2020 14:24:13 GMT+0900 (Japan Standard Time)");
98
+
99
+ testSingleCase(chrono, "in 1 hour GMT", refInstant, (result, text) => {
100
+ expect(result.text).toBe("in 1 hour");
101
+ expect(result.start).toBeDate(expectedInstant);
102
+ });
103
+ }
104
+
105
+ {
106
+ const refInstant = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
107
+ const expectedInstant = new Date("Sun Nov 29 2020 14:24:13 GMT+0900 (Japan Standard Time)");
108
+
109
+ testSingleCase(chrono, "in 1 hour GMT", { instant: refInstant, timezone: "JST" }, (result, text) => {
110
+ expect(result.text).toBe("in 1 hour");
111
+ expect(result.start).toBeDate(expectedInstant);
112
+ });
113
+ }
114
+
115
+ {
116
+ const refInstant = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
117
+ const expectedInstant = new Date("Sun Nov 29 2020 14:24:13 GMT+0900 (Japan Standard Time)");
118
+
119
+ testSingleCase(chrono, "in 1 hour GMT", { instant: refInstant, timezone: "BST" }, (result, text) => {
120
+ expect(result.text).toBe("in 1 hour");
121
+ expect(result.start).toBeDate(expectedInstant);
122
+ });
123
+ }
124
+ });
85
125
 
86
- testSingleCase(chrono, "in 1 hour get eggs and milk", refDate, (result, text) => {
87
- expect(result.text).toBe("in 1 hour");
88
- expect(result.start.get("timezoneOffset")).toBe(-refDate.getTimezoneOffset());
126
+ test("Test - Relative time (Now) is not effected by timezone setting", function () {
127
+ const refInstant = new Date(1637674343000);
128
+
129
+ testSingleCase(chrono, "now", { instant: refInstant }, (result) => {
130
+ expect(result.text).toBe("now");
131
+ expect(result.start).toBeDate(refInstant);
132
+ });
133
+
134
+ testSingleCase(chrono, "now", { instant: refInstant, timezone: null }, (result) => {
135
+ expect(result.text).toBe("now");
136
+ expect(result.start).toBeDate(refInstant);
137
+ });
138
+
139
+ testSingleCase(chrono, "now", { instant: refInstant, timezone: "BST" }, (result) => {
140
+ expect(result.text).toBe("now");
141
+ expect(result.start).toBeDate(refInstant);
142
+ });
143
+
144
+ testSingleCase(chrono, "now", { instant: refInstant, timezone: "JST" }, (result) => {
145
+ expect(result.text).toBe("now");
146
+ expect(result.start).toBeDate(refInstant);
89
147
  });
148
+ });
90
149
 
91
- // This test fail when the system/assume timezone is exactly similar to the mentioned timezone
92
- // Temporary disable this test
150
+ test("Test - Relative time (2 hour later) is not effected by timezone setting", function () {
151
+ const refInstant = new Date(1637674343000);
152
+ const expectedInstant = new Date(1637674343000 + 2 * 60 * 60 * 1000);
93
153
 
94
- // testSingleCase(chrono, "in 3 hours GMT", refDate, (result, text) => {
95
- // expect(result.text).toBe("in 3 hours");
96
- // expect(result.start.get("timezoneOffset")).toBe(-refDate.getTimezoneOffset());
97
- // });
154
+ testSingleCase(chrono, "2 hour later", { instant: refInstant }, (result) => {
155
+ expect(result.text).toBe("2 hour later");
156
+ expect(result.start).toBeDate(expectedInstant);
157
+ });
158
+
159
+ testSingleCase(chrono, "2 hour later", { instant: refInstant, timezone: null }, (result) => {
160
+ expect(result.text).toBe("2 hour later");
161
+ expect(result.start).toBeDate(expectedInstant);
162
+ });
163
+
164
+ testSingleCase(chrono, "2 hour later", { instant: refInstant, timezone: "BST" }, (result) => {
165
+ expect(result.text).toBe("2 hour later");
166
+ expect(result.start).toBeDate(expectedInstant);
167
+ });
168
+
169
+ testSingleCase(chrono, "2 hour later", { instant: refInstant, timezone: "JST" }, (result) => {
170
+ expect(result.text).toBe("2 hour later");
171
+ expect(result.start).toBeDate(expectedInstant);
172
+ });
98
173
  });
99
174
 
100
175
  test("Test - Parsing timezone from relative date when valid", function () {
@@ -20,30 +20,6 @@ test("Test - Single Expression", function () {
20
20
  expect(result.start).toBeDate(new Date(2012, 7, 6, 12));
21
21
  });
22
22
 
23
- testSingleCase(
24
- chrono.casual,
25
- "Monday (forward dates only)",
26
- new Date(2012, 7, 9),
27
- { forwardDate: true },
28
- (result) => {
29
- expect(result.index).toBe(0);
30
- expect(result.text).toBe("Monday");
31
-
32
- expect(result.start).not.toBeNull();
33
- expect(result.start.get("year")).toBe(2012);
34
- expect(result.start.get("month")).toBe(8);
35
- expect(result.start.get("day")).toBe(13);
36
- expect(result.start.get("weekday")).toBe(1);
37
-
38
- expect(result.start.isCertain("day")).toBe(false);
39
- expect(result.start.isCertain("month")).toBe(false);
40
- expect(result.start.isCertain("year")).toBe(false);
41
- expect(result.start.isCertain("weekday")).toBe(true);
42
-
43
- expect(result.start).toBeDate(new Date(2012, 7, 13, 12));
44
- }
45
- );
46
-
47
23
  testSingleCase(chrono.casual, "Thursday", new Date(2012, 7, 9), (result) => {
48
24
  expect(result.index).toBe(0);
49
25
  expect(result.text).toBe("Thursday");
@@ -182,7 +158,31 @@ test("Test - Weekday Overlap", function () {
182
158
  });
183
159
  });
184
160
 
185
- test("Test - forward dates only option", function () {
161
+ test("Test - forward dates only option", () => {
162
+ testSingleCase(
163
+ chrono.casual,
164
+ "Monday (forward dates only)",
165
+ new Date(2012, 7, 9),
166
+ { forwardDate: true },
167
+ (result) => {
168
+ expect(result.index).toBe(0);
169
+ expect(result.text).toBe("Monday");
170
+
171
+ expect(result.start).not.toBeNull();
172
+ expect(result.start.get("year")).toBe(2012);
173
+ expect(result.start.get("month")).toBe(8);
174
+ expect(result.start.get("day")).toBe(13);
175
+ expect(result.start.get("weekday")).toBe(1);
176
+
177
+ expect(result.start.isCertain("day")).toBe(false);
178
+ expect(result.start.isCertain("month")).toBe(false);
179
+ expect(result.start.isCertain("year")).toBe(false);
180
+ expect(result.start.isCertain("weekday")).toBe(true);
181
+
182
+ expect(result.start).toBeDate(new Date(2012, 7, 13, 12));
183
+ }
184
+ );
185
+
186
186
  testSingleCase(
187
187
  chrono.casual,
188
188
  "this Friday to this Monday",
@@ -219,4 +219,48 @@ test("Test - forward dates only option", function () {
219
219
  expect(result.end).toBeDate(new Date(2016, 8 - 1, 8, 12));
220
220
  }
221
221
  );
222
+
223
+ testSingleCase(
224
+ chrono.casual,
225
+ "sunday morning",
226
+ new Date("August 15, 2021, 20:00"),
227
+ { forwardDate: true },
228
+ (result) => {
229
+ expect(result.index).toBe(0);
230
+ expect(result.text).toBe("sunday morning");
231
+
232
+ expect(result.start).not.toBeNull();
233
+ expect(result.start.get("year")).toBe(2021);
234
+ expect(result.start.get("month")).toBe(8);
235
+ expect(result.start.get("day")).toBe(22);
236
+ expect(result.start.get("weekday")).toBe(0);
237
+
238
+ expect(result.start.isCertain("day")).toBe(false);
239
+ expect(result.start.isCertain("month")).toBe(false);
240
+ expect(result.start.isCertain("year")).toBe(false);
241
+ expect(result.start.isCertain("weekday")).toBe(true);
242
+
243
+ expect(result.start).toBeDate(new Date(2021, 8 - 1, 22, 6));
244
+ }
245
+ );
246
+
247
+ testSingleCase(
248
+ chrono.casual,
249
+ "vacation monday - friday",
250
+ new Date("thursday 13 June 2019"),
251
+ { forwardDate: true },
252
+ (result) => {
253
+ expect(result.text).toBe("monday - friday");
254
+
255
+ expect(result.start).not.toBeNull();
256
+ expect(result.start.get("year")).toBe(2019);
257
+ expect(result.start.get("month")).toBe(6);
258
+ expect(result.start.get("day")).toBe(17);
259
+
260
+ expect(result.end).not.toBeNull();
261
+ expect(result.end.get("year")).toBe(2019);
262
+ expect(result.end.get("month")).toBe(6);
263
+ expect(result.end.get("day")).toBe(21);
264
+ }
265
+ );
222
266
  });
@@ -21,6 +21,8 @@ test("Test - Skip random non-date patterns", function () {
21
21
  testUnexpectedResult(chrono, "Total: $1,194.09 [image: View Reservation");
22
22
 
23
23
  testUnexpectedResult(chrono, "at 6.5 kilograms");
24
+
25
+ testUnexpectedResult(chrono, "ah that is unusual", null, { forwardDate: true });
24
26
  });
25
27
 
26
28
  test("Test - URLs % encoded", function () {
@@ -0,0 +1,212 @@
1
+ import * as chrono from "../../src";
2
+ import { testSingleCase } from "../test_util";
3
+ import { ParsingResult } from "../../src/results";
4
+
5
+ test("Test - 'This' expressions", () => {
6
+ // this week
7
+ testSingleCase(chrono.nl, "deze week", new Date(2017, 11 - 1, 19, 12), (result, text) => {
8
+ expect(result.text).toBe(text);
9
+ expect(result.start.get("year")).toBe(2017);
10
+ expect(result.start.get("month")).toBe(11);
11
+ expect(result.start.get("day")).toBe(19);
12
+ expect(result.start.get("hour")).toBe(12);
13
+ });
14
+
15
+ // this month
16
+ testSingleCase(chrono.nl, "deze maand", new Date(2017, 11 - 1, 19, 12), (result, text) => {
17
+ expect(result.text).toBe(text);
18
+ expect(result.start.get("year")).toBe(2017);
19
+ expect(result.start.get("month")).toBe(11);
20
+ expect(result.start.get("day")).toBe(1);
21
+ expect(result.start.get("hour")).toBe(12);
22
+ });
23
+
24
+ // this year
25
+ testSingleCase(chrono.nl, "dit jaar", new Date(2017, 11 - 1, 19, 12), (result, text) => {
26
+ expect(result.text).toBe(text);
27
+ expect(result.start.get("year")).toBe(2017);
28
+ expect(result.start.get("month")).toBe(1);
29
+ expect(result.start.get("day")).toBe(1);
30
+ expect(result.start.get("hour")).toBe(12);
31
+ });
32
+ });
33
+
34
+ test("Test - Past relative expressions", () => {
35
+ // last week
36
+ testSingleCase(chrono.nl, "afgelopen week", new Date(2016, 10 - 1, 1, 12), (result, text) => {
37
+ expect(result.text).toBe(text);
38
+ expect(result.start.get("year")).toBe(2016);
39
+ expect(result.start.get("month")).toBe(9);
40
+ expect(result.start.get("day")).toBe(24);
41
+ expect(result.start.get("hour")).toBe(12);
42
+ });
43
+
44
+ // last month
45
+ testSingleCase(chrono.nl, "afgelopen maand", new Date(2016, 10 - 1, 1, 12), (result, text) => {
46
+ expect(result.text).toBe(text);
47
+ expect(result.start.get("year")).toBe(2016);
48
+ expect(result.start.get("month")).toBe(9);
49
+ expect(result.start.get("day")).toBe(1);
50
+ expect(result.start.get("hour")).toBe(12);
51
+ });
52
+
53
+ // last day
54
+ testSingleCase(chrono.nl, "afgelopen dag", new Date(2016, 10 - 1, 1, 12), (result, text) => {
55
+ expect(result.text).toBe(text);
56
+ expect(result.start.get("year")).toBe(2016);
57
+ expect(result.start.get("month")).toBe(9);
58
+ expect(result.start.get("day")).toBe(30);
59
+ expect(result.start.get("hour")).toBe(12);
60
+ });
61
+
62
+ // past week
63
+ testSingleCase(chrono.nl, "vorige week", new Date(2016, 10 - 1, 1, 12), (result, text) => {
64
+ expect(result.text).toBe(text);
65
+ expect(result.start.get("year")).toBe(2016);
66
+ expect(result.start.get("month")).toBe(9);
67
+ expect(result.start.get("day")).toBe(24);
68
+ expect(result.start.get("hour")).toBe(12);
69
+ });
70
+ });
71
+
72
+ test("Test - Future relative expressions", () => {
73
+ // next hour
74
+ testSingleCase(chrono.nl, "komende uur", new Date(2016, 10 - 1, 1, 12), (result, text) => {
75
+ expect(result.text).toBe(text);
76
+ expect(result.start.get("year")).toBe(2016);
77
+ expect(result.start.get("month")).toBe(10);
78
+ expect(result.start.get("day")).toBe(1);
79
+ expect(result.start.get("hour")).toBe(13);
80
+ });
81
+
82
+ // next week
83
+ testSingleCase(chrono.nl, "volgende week", new Date(2016, 10 - 1, 1, 12), (result, text) => {
84
+ expect(result.text).toBe(text);
85
+ expect(result.start.get("year")).toBe(2016);
86
+ expect(result.start.get("month")).toBe(10);
87
+ expect(result.start.get("day")).toBe(8);
88
+ expect(result.start.get("hour")).toBe(12);
89
+ });
90
+
91
+ // next day
92
+ testSingleCase(chrono.nl, "volgende dag", new Date(2016, 10 - 1, 1, 12), (result, text) => {
93
+ expect(result.text).toBe(text);
94
+ expect(result.start.get("year")).toBe(2016);
95
+ expect(result.start.get("month")).toBe(10);
96
+ expect(result.start.get("day")).toBe(2);
97
+ expect(result.start.get("hour")).toBe(12);
98
+ });
99
+
100
+ // next month
101
+ testSingleCase(chrono.nl, "volgende maand", new Date(2016, 10 - 1, 1, 12), (result, text) => {
102
+ expect(result.text).toBe(text);
103
+ expect(result.start.get("year")).toBe(2016);
104
+ expect(result.start.get("month")).toBe(11);
105
+ expect(result.start.get("day")).toBe(1);
106
+ expect(result.start.get("hour")).toBe(12);
107
+
108
+ expect(result.start.isCertain("year")).toBe(true);
109
+ expect(result.start.isCertain("month")).toBe(true);
110
+ expect(result.start.isCertain("day")).toBe(false);
111
+ expect(result.start.isCertain("hour")).toBe(false);
112
+ });
113
+
114
+ // next year
115
+ testSingleCase(chrono.nl, "volgend jaar", new Date(2020, 11 - 1, 22, 12, 11, 32, 6), (result, text) => {
116
+ expect(result.text).toBe(text);
117
+ expect(result.start.get("year")).toBe(2021);
118
+ expect(result.start.get("month")).toBe(11);
119
+ expect(result.start.get("day")).toBe(22);
120
+ expect(result.start.get("hour")).toBe(12);
121
+ expect(result.start.get("minute")).toBe(11);
122
+ expect(result.start.get("second")).toBe(32);
123
+ expect(result.start.get("millisecond")).toBe(6);
124
+
125
+ expect(result.start.isCertain("year")).toBe(true);
126
+ expect(result.start.isCertain("month")).toBe(false);
127
+ expect(result.start.isCertain("day")).toBe(false);
128
+ expect(result.start.isCertain("hour")).toBe(false);
129
+ expect(result.start.isCertain("minute")).toBe(false);
130
+ expect(result.start.isCertain("second")).toBe(false);
131
+ expect(result.start.isCertain("millisecond")).toBe(false);
132
+ expect(result.start.isCertain("timezoneOffset")).toBe(false);
133
+ });
134
+ });
135
+
136
+ test("Test - Relative date components' certainty", () => {
137
+ const refDate = new Date(2016, 10 - 1, 7, 12);
138
+
139
+ // next hour
140
+ testSingleCase(chrono.nl, "komende uur", refDate, (result, text) => {
141
+ expect(result.text).toBe(text);
142
+ expect(result.start.get("year")).toBe(2016);
143
+ expect(result.start.get("month")).toBe(10);
144
+ expect(result.start.get("day")).toBe(7);
145
+ expect(result.start.get("hour")).toBe(13);
146
+ expect(result.start.get("timezoneOffset")).toBe(refDate.getTimezoneOffset() * -1);
147
+
148
+ expect(result.start.isCertain("year")).toBe(true);
149
+ expect(result.start.isCertain("month")).toBe(true);
150
+ expect(result.start.isCertain("day")).toBe(true);
151
+ expect(result.start.isCertain("hour")).toBe(true);
152
+ expect(result.start.isCertain("timezoneOffset")).toBe(true);
153
+ });
154
+
155
+ // next month
156
+ testSingleCase(chrono.nl, "volgende maand", refDate, (result, text) => {
157
+ const expectedDate = new Date(2016, 11, 7, 12);
158
+
159
+ expect(result.text).toBe(text);
160
+ expect(result.start.get("year")).toBe(2016);
161
+ expect(result.start.get("month")).toBe(11);
162
+ expect(result.start.get("day")).toBe(7);
163
+ expect(result.start.get("hour")).toBe(12);
164
+ expect(result.start.get("timezoneOffset")).toBe(-expectedDate.getTimezoneOffset());
165
+
166
+ expect(result.start.isCertain("year")).toBe(true);
167
+ expect(result.start.isCertain("month")).toBe(true);
168
+ expect(result.start.isCertain("day")).toBe(false);
169
+ expect(result.start.isCertain("hour")).toBe(false);
170
+ expect(result.start.isCertain("timezoneOffset")).toBe(false);
171
+ });
172
+ });
173
+
174
+ test("Test - Relative date components' certainty and imply timezone", () => {
175
+ const refDate = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
176
+
177
+ {
178
+ // now
179
+ const text = "nu";
180
+ const result = chrono.nl.parse(text, refDate)[0] as ParsingResult;
181
+
182
+ expect(result.text).toBe(text);
183
+ result.start.imply("timezoneOffset", 60);
184
+
185
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)"));
186
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 5:24:13 GMT+0100"));
187
+ }
188
+
189
+ {
190
+ // tomorrow at 5pm
191
+ const text = "morgen om 17 uur";
192
+ const result = chrono.nl.parse(text, refDate)[0] as ParsingResult;
193
+
194
+ expect(result.text).toBe(text);
195
+ result.start.imply("timezoneOffset", 60);
196
+
197
+ expect(result).toBeDate(new Date("Sun Dec 1 2020 1:00:00 GMT+0900 (Japan Standard Time)"));
198
+ expect(result).toBeDate(new Date("Sun Nov 30 2020 17:00:00 GMT+0100"));
199
+ }
200
+
201
+ {
202
+ // in 10 minutes
203
+ const text = "binnen 10 minuten";
204
+ const result = chrono.nl.parse(text, refDate)[0] as ParsingResult;
205
+
206
+ expect(result.text).toBe(text);
207
+ result.start.imply("timezoneOffset", 60);
208
+
209
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (Japan Standard Time)"));
210
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 5:34:13 GMT+0100"));
211
+ }
212
+ });