chrono-node 2.9.1 → 2.10.0

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 (211) hide show
  1. package/dist/cjs/locales/de/parsers/DECasualTimeParser.js +7 -0
  2. package/dist/cjs/locales/de/parsers/DECasualTimeParser.js.map +1 -1
  3. package/dist/cjs/locales/en/configuration.js +2 -0
  4. package/dist/cjs/locales/en/configuration.js.map +1 -1
  5. package/dist/cjs/locales/en/parsers/ENMonthNameLittleEndianParser.js +1 -1
  6. package/dist/cjs/locales/en/parsers/ENMonthNameLittleEndianParser.js.map +1 -1
  7. package/dist/cjs/locales/en/parsers/ENYearMonthNameParser.d.ts +6 -0
  8. package/dist/cjs/locales/en/parsers/ENYearMonthNameParser.js +31 -0
  9. package/dist/cjs/locales/en/parsers/ENYearMonthNameParser.js.map +1 -0
  10. package/dist/cjs/locales/fi/parsers/FICasualTimeParser.js +7 -0
  11. package/dist/cjs/locales/fi/parsers/FICasualTimeParser.js.map +1 -1
  12. package/dist/cjs/locales/fr/parsers/FRCasualTimeParser.js +5 -0
  13. package/dist/cjs/locales/fr/parsers/FRCasualTimeParser.js.map +1 -1
  14. package/dist/cjs/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +2 -1
  15. package/dist/cjs/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js.map +1 -1
  16. package/dist/cjs/locales/it/parsers/ITCasualTimeParser.js +5 -0
  17. package/dist/cjs/locales/it/parsers/ITCasualTimeParser.js.map +1 -1
  18. package/dist/cjs/locales/uk/parsers/UKTimeUnitWithinFormatParser.js +1 -1
  19. package/dist/cjs/locales/uk/parsers/UKTimeUnitWithinFormatParser.js.map +1 -1
  20. package/dist/cjs/locales/zh/hans/index.js +2 -0
  21. package/dist/cjs/locales/zh/hans/index.js.map +1 -1
  22. package/dist/cjs/locales/zh/hans/parsers/ZHHansAgoFormatParser.d.ts +6 -0
  23. package/dist/cjs/locales/zh/hans/parsers/ZHHansAgoFormatParser.js +80 -0
  24. package/dist/cjs/locales/zh/hans/parsers/ZHHansAgoFormatParser.js.map +1 -0
  25. package/dist/cjs/locales/zh/hant/index.js +2 -0
  26. package/dist/cjs/locales/zh/hant/index.js.map +1 -1
  27. package/dist/cjs/locales/zh/hant/parsers/ZHHantAgoFormatParser.d.ts +6 -0
  28. package/dist/cjs/locales/zh/hant/parsers/ZHHantAgoFormatParser.js +80 -0
  29. package/dist/cjs/locales/zh/hant/parsers/ZHHantAgoFormatParser.js.map +1 -0
  30. package/dist/cjs/results.js +15 -9
  31. package/dist/cjs/results.js.map +1 -1
  32. package/dist/esm/locales/de/parsers/DECasualTimeParser.js +7 -0
  33. package/dist/esm/locales/de/parsers/DECasualTimeParser.js.map +1 -1
  34. package/dist/esm/locales/en/configuration.js +2 -0
  35. package/dist/esm/locales/en/configuration.js.map +1 -1
  36. package/dist/esm/locales/en/parsers/ENMonthNameLittleEndianParser.js +1 -1
  37. package/dist/esm/locales/en/parsers/ENMonthNameLittleEndianParser.js.map +1 -1
  38. package/dist/esm/locales/en/parsers/ENYearMonthNameParser.d.ts +6 -0
  39. package/dist/esm/locales/en/parsers/ENYearMonthNameParser.js +28 -0
  40. package/dist/esm/locales/en/parsers/ENYearMonthNameParser.js.map +1 -0
  41. package/dist/esm/locales/fi/parsers/FICasualTimeParser.js +7 -0
  42. package/dist/esm/locales/fi/parsers/FICasualTimeParser.js.map +1 -1
  43. package/dist/esm/locales/fr/parsers/FRCasualTimeParser.js +5 -0
  44. package/dist/esm/locales/fr/parsers/FRCasualTimeParser.js.map +1 -1
  45. package/dist/esm/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +2 -1
  46. package/dist/esm/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js.map +1 -1
  47. package/dist/esm/locales/it/parsers/ITCasualTimeParser.js +5 -0
  48. package/dist/esm/locales/it/parsers/ITCasualTimeParser.js.map +1 -1
  49. package/dist/esm/locales/uk/parsers/UKTimeUnitWithinFormatParser.js +1 -1
  50. package/dist/esm/locales/uk/parsers/UKTimeUnitWithinFormatParser.js.map +1 -1
  51. package/dist/esm/locales/zh/hans/index.js +2 -0
  52. package/dist/esm/locales/zh/hans/index.js.map +1 -1
  53. package/dist/esm/locales/zh/hans/parsers/ZHHansAgoFormatParser.d.ts +6 -0
  54. package/dist/esm/locales/zh/hans/parsers/ZHHansAgoFormatParser.js +77 -0
  55. package/dist/esm/locales/zh/hans/parsers/ZHHansAgoFormatParser.js.map +1 -0
  56. package/dist/esm/locales/zh/hant/index.js +2 -0
  57. package/dist/esm/locales/zh/hant/index.js.map +1 -1
  58. package/dist/esm/locales/zh/hant/parsers/ZHHantAgoFormatParser.d.ts +6 -0
  59. package/dist/esm/locales/zh/hant/parsers/ZHHantAgoFormatParser.js +77 -0
  60. package/dist/esm/locales/zh/hant/parsers/ZHHantAgoFormatParser.js.map +1 -0
  61. package/dist/esm/results.js +14 -9
  62. package/dist/esm/results.js.map +1 -1
  63. package/package.json +5 -1
  64. package/src/locales/de/parsers/DECasualTimeParser.ts +7 -0
  65. package/src/locales/en/configuration.ts +2 -0
  66. package/src/locales/en/parsers/ENMonthNameLittleEndianParser.ts +1 -1
  67. package/src/locales/en/parsers/ENYearMonthNameParser.ts +38 -0
  68. package/src/locales/fi/parsers/FICasualTimeParser.ts +7 -0
  69. package/src/locales/fr/parsers/FRCasualTimeParser.ts +5 -0
  70. package/src/locales/fr/parsers/FRTimeUnitRelativeFormatParser.ts +2 -1
  71. package/src/locales/it/parsers/ITCasualTimeParser.ts +5 -0
  72. package/src/locales/uk/parsers/UKTimeUnitWithinFormatParser.ts +1 -1
  73. package/src/locales/zh/hans/index.ts +2 -0
  74. package/src/locales/zh/hans/parsers/ZHHansAgoFormatParser.ts +87 -0
  75. package/src/locales/zh/hant/index.ts +2 -0
  76. package/src/locales/zh/hant/parsers/ZHHantAgoFormatParser.ts +87 -0
  77. package/src/results.ts +40 -9
  78. package/test/calculation_duration.test.ts +0 -165
  79. package/test/calculation_weekdays.test.ts +0 -133
  80. package/test/de/de_casual.test.ts +0 -322
  81. package/test/de/de_dash.test.ts +0 -32
  82. package/test/de/de_month_name_little_endian.test.ts +0 -273
  83. package/test/de/de_time_exp.test.ts +0 -223
  84. package/test/de/de_time_units_casual_relative.test.ts +0 -120
  85. package/test/de/de_time_units_within.test.ts +0 -119
  86. package/test/de/de_weekday.test.ts +0 -158
  87. package/test/de/de_year.test.ts +0 -147
  88. package/test/debugging.test.ts +0 -17
  89. package/test/en/en.test.ts +0 -191
  90. package/test/en/en_casual.test.ts +0 -425
  91. package/test/en/en_inter_std.test.ts +0 -118
  92. package/test/en/en_merging_relative_dates.test.ts +0 -50
  93. package/test/en/en_month.test.ts +0 -295
  94. package/test/en/en_month_name_little_endian.test.ts +0 -448
  95. package/test/en/en_month_name_middle_endian.test.ts +0 -386
  96. package/test/en/en_performance.test.ts +0 -26
  97. package/test/en/en_relative.test.ts +0 -393
  98. package/test/en/en_slash.test.ts +0 -284
  99. package/test/en/en_time_exp.test.ts +0 -535
  100. package/test/en/en_time_units_ago.test.ts +0 -357
  101. package/test/en/en_time_units_casual_relative.test.ts +0 -186
  102. package/test/en/en_time_units_later.test.ts +0 -361
  103. package/test/en/en_time_units_within.test.ts +0 -417
  104. package/test/en/en_timezone_exp.test.ts +0 -410
  105. package/test/en/en_weekday.test.ts +0 -573
  106. package/test/en/en_year.test.ts +0 -138
  107. package/test/en/en_year_month_day.test.ts +0 -101
  108. package/test/en/negative_cases.test.ts +0 -99
  109. package/test/es/es_casual.test.ts +0 -175
  110. package/test/es/es_month_name_little_endian.test.ts +0 -217
  111. package/test/es/es_slash.test.ts +0 -26
  112. package/test/es/es_time_exp.test.ts +0 -175
  113. package/test/es/es_time_units_within.test.ts +0 -119
  114. package/test/fi/fi_casual.test.ts +0 -85
  115. package/test/fi/fi_casual_time.test.ts +0 -56
  116. package/test/fi/fi_month_name_little_endian.test.ts +0 -50
  117. package/test/fi/fi_time_exp.test.ts +0 -39
  118. package/test/fi/fi_time_units_ago.test.ts +0 -93
  119. package/test/fi/fi_time_units_casual_relative.test.ts +0 -117
  120. package/test/fi/fi_time_units_within.test.ts +0 -74
  121. package/test/fi/fi_weekday.test.ts +0 -90
  122. package/test/fr/fr_casual.test.ts +0 -300
  123. package/test/fr/fr_little_endian.test.ts +0 -320
  124. package/test/fr/fr_slash.test.ts +0 -49
  125. package/test/fr/fr_time_exp.test.ts +0 -588
  126. package/test/fr/fr_time_units_ago.test.ts +0 -103
  127. package/test/fr/fr_time_units_casual_relative.test.ts +0 -108
  128. package/test/fr/fr_time_units_within.test.ts +0 -129
  129. package/test/fr/fr_weekday.test.ts +0 -130
  130. package/test/it/it_casual.test.ts +0 -44
  131. package/test/it/it_month_name_little_endian.test.ts +0 -28
  132. package/test/it/it_month_name_middle_endian.test.ts +0 -39
  133. package/test/it/it_time_exp.test.ts +0 -84
  134. package/test/it/it_weekday.test.ts +0 -37
  135. package/test/it/it_year_month_day.test.ts +0 -41
  136. package/test/ja/ja_casual.test.ts +0 -73
  137. package/test/ja/ja_slash_date_format.test.ts +0 -60
  138. package/test/ja/ja_standard.test.ts +0 -235
  139. package/test/ja/ja_time_exp.test.ts +0 -305
  140. package/test/ja/ja_weekday.test.ts +0 -183
  141. package/test/nl/nl_casual.test.ts +0 -408
  142. package/test/nl/nl_month.test.ts +0 -205
  143. package/test/nl/nl_month_name_little_endian.test.ts +0 -358
  144. package/test/nl/nl_relative.test.ts +0 -242
  145. package/test/nl/nl_slash.test.ts +0 -206
  146. package/test/nl/nl_time_exp.test.ts +0 -79
  147. package/test/nl/nl_time_units_ago.test.ts +0 -243
  148. package/test/nl/nl_time_units_casual_relative.test.ts +0 -130
  149. package/test/nl/nl_time_units_later.test.ts +0 -250
  150. package/test/nl/nl_time_units_within.test.ts +0 -225
  151. package/test/nl/nl_weekday.test.ts +0 -216
  152. package/test/pt/pt_casual.test.ts +0 -175
  153. package/test/pt/pt_month_name_little_endian.test.ts +0 -217
  154. package/test/pt/pt_slash.test.ts +0 -26
  155. package/test/pt/pt_time_exp.test.ts +0 -175
  156. package/test/result.test.ts +0 -283
  157. package/test/ru/ru_casual.test.ts +0 -159
  158. package/test/ru/ru_month.test.ts +0 -70
  159. package/test/ru/ru_month_name_little_endian.test.ts +0 -145
  160. package/test/ru/ru_relative.test.ts +0 -107
  161. package/test/ru/ru_time_exp.test.ts +0 -111
  162. package/test/ru/ru_time_units_ago.test.ts +0 -48
  163. package/test/ru/ru_time_units_casual_relative.test.ts +0 -190
  164. package/test/ru/ru_time_units_within.test.ts +0 -16
  165. package/test/ru/ru_weekday.test.ts +0 -52
  166. package/test/sv/sv_casual.test.ts +0 -87
  167. package/test/sv/sv_month_name_little_endian.test.ts +0 -48
  168. package/test/sv/sv_time_units_casual_relative.test.ts +0 -143
  169. package/test/sv/sv_weekday.test.ts +0 -68
  170. package/test/system.test.ts +0 -247
  171. package/test/system_timezone.test.ts +0 -284
  172. package/test/test_util.ts +0 -135
  173. package/test/uk/uk_casual.test.ts +0 -153
  174. package/test/uk/uk_month.test.ts +0 -70
  175. package/test/uk/uk_month_name_little_endian.test.ts +0 -148
  176. package/test/uk/uk_relative.test.ts +0 -107
  177. package/test/uk/uk_time_exp.test.ts +0 -111
  178. package/test/uk/uk_time_units_ago.test.ts +0 -48
  179. package/test/uk/uk_time_units_casual_relative.test.ts +0 -142
  180. package/test/uk/uk_time_units_within.test.ts +0 -16
  181. package/test/uk/uk_weekday.test.ts +0 -52
  182. package/test/vi/vi_casual.test.ts +0 -84
  183. package/test/vi/vi_casual_time.test.ts +0 -77
  184. package/test/vi/vi_date_range.test.ts +0 -61
  185. package/test/vi/vi_forward_date.test.ts +0 -45
  186. package/test/vi/vi_month_year.test.ts +0 -40
  187. package/test/vi/vi_negative_cases.test.ts +0 -60
  188. package/test/vi/vi_slash.test.ts +0 -36
  189. package/test/vi/vi_standard.test.ts +0 -86
  190. package/test/vi/vi_strict.test.ts +0 -67
  191. package/test/vi/vi_time_exp.test.ts +0 -99
  192. package/test/vi/vi_time_units_ago.test.ts +0 -56
  193. package/test/vi/vi_time_units_casual_relative.test.ts +0 -56
  194. package/test/vi/vi_time_units_later.test.ts +0 -43
  195. package/test/vi/vi_time_units_within.test.ts +0 -24
  196. package/test/vi/vi_weekday.test.ts +0 -77
  197. package/test/vi/vi_year.test.ts +0 -42
  198. package/test/zh/hans/zh_hans_casual.test.ts +0 -242
  199. package/test/zh/hans/zh_hans_date.test.ts +0 -116
  200. package/test/zh/hans/zh_hans_deadline.test.ts +0 -175
  201. package/test/zh/hans/zh_hans_time_exp.test.ts +0 -508
  202. package/test/zh/hans/zh_hans_weekday.test.ts +0 -219
  203. package/test/zh/hant/zh_hant_casual.test.ts +0 -260
  204. package/test/zh/hant/zh_hant_date.test.ts +0 -116
  205. package/test/zh/hant/zh_hant_deadline.test.ts +0 -136
  206. package/test/zh/hant/zh_hant_time_exp.test.ts +0 -226
  207. package/test/zh/hant/zh_hant_weekday.test.ts +0 -175
  208. package/test/zh/zh.test.ts +0 -36
  209. package/tsconfig.build.esm.json +0 -8
  210. package/tsconfig.build.json +0 -10
  211. package/tsconfig.json +0 -29
@@ -0,0 +1,87 @@
1
+ import { ParsingContext } from "../../../../chrono";
2
+ import { AbstractParserWithWordBoundaryChecking } from "../../../../common/parsers/AbstractParserWithWordBoundary";
3
+ import { addDuration, Duration, reverseDuration } from "../../../../calculation/duration";
4
+ import { NUMBER, zhStringToNumber } from "../constants";
5
+
6
+ const PATTERN = new RegExp(
7
+ "(\\d+|[" +
8
+ Object.keys(NUMBER).join("") +
9
+ "]+|半|幾)(?:\\s*)" +
10
+ "(?:個)?" +
11
+ "(秒(?:鐘)?|分鐘|小時|鐘|日|天|星期|禮拜|月|年)" +
12
+ "(?:之)?前",
13
+ "i"
14
+ );
15
+
16
+ const NUMBER_GROUP = 1;
17
+ const UNIT_GROUP = 2;
18
+
19
+ export default class ZHHantAgoFormatParser extends AbstractParserWithWordBoundaryChecking {
20
+ innerPattern(): RegExp {
21
+ return PATTERN;
22
+ }
23
+
24
+ innerExtract(context: ParsingContext, match: RegExpMatchArray) {
25
+ const result = context.createParsingResult(match.index, match[0]);
26
+
27
+ let number = parseInt(match[NUMBER_GROUP]);
28
+ if (isNaN(number)) {
29
+ number = zhStringToNumber(match[NUMBER_GROUP]);
30
+ }
31
+
32
+ if (isNaN(number)) {
33
+ const string = match[NUMBER_GROUP];
34
+ if (string === "幾") {
35
+ number = 3;
36
+ } else if (string === "半") {
37
+ number = 0.5;
38
+ } else {
39
+ //just in case
40
+ return null;
41
+ }
42
+ }
43
+
44
+ let duration: Duration = {};
45
+ const unit = match[UNIT_GROUP];
46
+ const unitAbbr = unit[0];
47
+
48
+ if (unitAbbr.match(/[日天星禮月年]/)) {
49
+ if (unitAbbr == "日" || unitAbbr == "天") {
50
+ duration.day = number;
51
+ } else if (unitAbbr == "星" || unitAbbr == "禮") {
52
+ duration.week = number;
53
+ } else if (unitAbbr == "月") {
54
+ duration.month = number;
55
+ } else if (unitAbbr == "年") {
56
+ duration.year = number;
57
+ }
58
+
59
+ duration = reverseDuration(duration);
60
+
61
+ const date = addDuration(context.refDate, duration);
62
+ result.start.assign("year", date.getFullYear());
63
+ result.start.assign("month", date.getMonth() + 1);
64
+ result.start.assign("day", date.getDate());
65
+ return result;
66
+ }
67
+
68
+ if (unitAbbr == "秒") {
69
+ duration.second = number;
70
+ } else if (unitAbbr == "分") {
71
+ duration.minute = number;
72
+ } else if (unitAbbr == "小" || unitAbbr == "鐘") {
73
+ duration.hour = number;
74
+ }
75
+
76
+ duration = reverseDuration(duration);
77
+
78
+ const date = addDuration(context.refDate, duration);
79
+ result.start.imply("year", date.getFullYear());
80
+ result.start.imply("month", date.getMonth() + 1);
81
+ result.start.imply("day", date.getDate());
82
+ result.start.assign("hour", date.getHours());
83
+ result.start.assign("minute", date.getMinutes());
84
+ result.start.assign("second", date.getSeconds());
85
+ return result;
86
+ }
87
+ }
package/src/results.ts CHANGED
@@ -232,13 +232,26 @@ export class ParsingComponents implements ParsedComponents {
232
232
  }
233
233
 
234
234
  isValidDate(): boolean {
235
- const date = this.dateWithoutTimezoneAdjustment();
235
+ // Check calendar validity in UTC. The local Date constructor would wrongly reject real
236
+ // times falling in the system timezone's DST gap, making validity depend on where it runs.
237
+ const date = new Date(
238
+ Date.UTC(
239
+ this.get("year"),
240
+ this.get("month") - 1,
241
+ this.get("day"),
242
+ this.get("hour"),
243
+ this.get("minute"),
244
+ this.get("second"),
245
+ this.get("millisecond")
246
+ )
247
+ );
248
+ date.setUTCFullYear(this.get("year"));
236
249
 
237
- if (date.getFullYear() !== this.get("year")) return false;
238
- if (date.getMonth() !== this.get("month") - 1) return false;
239
- if (date.getDate() !== this.get("day")) return false;
240
- if (this.get("hour") != null && date.getHours() != this.get("hour")) return false;
241
- if (this.get("minute") != null && date.getMinutes() != this.get("minute")) return false;
250
+ if (date.getUTCFullYear() !== this.get("year")) return false;
251
+ if (date.getUTCMonth() !== this.get("month") - 1) return false;
252
+ if (date.getUTCDate() !== this.get("day")) return false;
253
+ if (this.get("hour") != null && date.getUTCHours() != this.get("hour")) return false;
254
+ if (this.get("minute") != null && date.getUTCMinutes() != this.get("minute")) return false;
242
255
 
243
256
  return true;
244
257
  }
@@ -252,9 +265,27 @@ export class ParsingComponents implements ParsedComponents {
252
265
  }
253
266
 
254
267
  date(): Date {
255
- const date = this.dateWithoutTimezoneAdjustment();
256
- const timezoneAdjustment = this.reference.getSystemTimezoneAdjustmentMinute(date, this.get("timezoneOffset"));
257
- return new Date(date.getTime() + timezoneAdjustment * 60000);
268
+ const timezoneOffset = this.get("timezoneOffset") ?? this.reference.timezoneOffset;
269
+ if (timezoneOffset === null || timezoneOffset === undefined) {
270
+ // No timezone known: interpret the components as system-local time.
271
+ return this.dateWithoutTimezoneAdjustment();
272
+ }
273
+
274
+ // The offset fully determines the instant, so build it from UTC. The local Date constructor
275
+ // would be ambiguous for wall-clock times in the system timezone's DST gap/overlap.
276
+ const date = new Date(
277
+ Date.UTC(
278
+ this.get("year"),
279
+ this.get("month") - 1,
280
+ this.get("day"),
281
+ this.get("hour"),
282
+ this.get("minute"),
283
+ this.get("second"),
284
+ this.get("millisecond")
285
+ )
286
+ );
287
+ date.setUTCFullYear(this.get("year"));
288
+ return new Date(date.getTime() - timezoneOffset * 60000);
258
289
  }
259
290
 
260
291
  addTag(tag: string): ParsingComponents {
@@ -1,165 +0,0 @@
1
- import { addDuration, reverseDuration } from "../src/calculation/duration";
2
-
3
- test("Test - Adding Duration w/ single timeunit", () => {
4
- {
5
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
6
- const output = addDuration(reference, { "year": 1 });
7
- expect(output).toStrictEqual(new Date("Sun, Aug 27 2023 12:52:11"));
8
- }
9
- {
10
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
11
- const output = addDuration(reference, { "month": 1 });
12
- expect(output).toStrictEqual(new Date("Wed, Sep 27 2022 12:52:11"));
13
- }
14
- {
15
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
16
- const output = addDuration(reference, { "week": 1 });
17
- expect(output).toStrictEqual(new Date("Sat, Sep 3 2022 12:52:11"));
18
- }
19
- {
20
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
21
- const output = addDuration(reference, { "day": 1 });
22
- expect(output).toStrictEqual(new Date("Sat, Aug 28 2022 12:52:11"));
23
- }
24
- {
25
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
26
- const output = addDuration(reference, { "hour": 1 });
27
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 13:52:11"));
28
- }
29
- {
30
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
31
- const output = addDuration(reference, { "minute": 1 });
32
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 12:53:11"));
33
- }
34
- {
35
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
36
- const output = addDuration(reference, { "second": 1 });
37
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 12:52:12"));
38
- }
39
- {
40
- const reference = new Date("Sat, Aug 27 2022 12:52:11:00");
41
- const output = addDuration(reference, { "millisecond": 1 });
42
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 12:52:11:01"));
43
- }
44
- });
45
-
46
- test("Test - Adding Duration w/ single timeunit shorten", () => {
47
- {
48
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
49
- const output = addDuration(reference, { "y": 1 });
50
- expect(output).toStrictEqual(new Date("Sun, Aug 27 2023 12:52:11"));
51
- }
52
- {
53
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
54
- const output = addDuration(reference, { "M": 1 });
55
- expect(output).toStrictEqual(new Date("Wed, Sep 27 2022 12:52:11"));
56
- }
57
- {
58
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
59
- const output = addDuration(reference, { "w": 1 });
60
- expect(output).toStrictEqual(new Date("Sat, Sep 3 2022 12:52:11"));
61
- }
62
- {
63
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
64
- const output = addDuration(reference, { "d": 1 });
65
- expect(output).toStrictEqual(new Date("Sat, Aug 28 2022 12:52:11"));
66
- }
67
- {
68
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
69
- const output = addDuration(reference, { "h": 1 });
70
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 13:52:11"));
71
- }
72
- {
73
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
74
- const output = addDuration(reference, { "m": 1 });
75
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 12:53:11"));
76
- }
77
- {
78
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
79
- const output = addDuration(reference, { "s": 1 });
80
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 12:52:12"));
81
- }
82
- {
83
- const reference = new Date("Sat, Aug 27 2022 12:52:11:00");
84
- const output = addDuration(reference, { "ms": 1 });
85
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 12:52:11:01"));
86
- }
87
- });
88
-
89
- test("Test - Adding Duration w/ multiple timeunits", () => {
90
- {
91
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
92
- const output = addDuration(reference, { "month": 1, "day": 4 });
93
- expect(output).toStrictEqual(new Date("Wed, Oct 1 2022 12:52:11"));
94
- }
95
- {
96
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
97
- const output = addDuration(reference, { "month": 1, "day": 4, "hour": 12 });
98
- expect(output).toStrictEqual(new Date("Wed, Oct 2 2022 00:52:11"));
99
- }
100
- });
101
-
102
- test("Test - Adding Duration w/ fractions", () => {
103
- {
104
- // 0.5 year (aka. half year) => 6 months
105
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
106
- const output = addDuration(reference, { "year": 0.5 });
107
- expect(output).toStrictEqual(new Date("Mon, Feb 27 2023 12:52:11"));
108
- }
109
- {
110
- // 0.5 month => 2 weeks
111
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
112
- const output = addDuration(reference, { "month": 0.5 });
113
- expect(output).toStrictEqual(new Date("Sat, Sep 10 2022 12:52:11"));
114
- }
115
- {
116
- // 0.5 week => 4 days (actually 3.5 days, but we round up to 4 days)
117
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
118
- const output = addDuration(reference, { "week": 0.5 });
119
- expect(output).toStrictEqual(new Date("Sat, Aug 31 2022 12:52:11"));
120
- }
121
- {
122
- // 0.5 day (aka. half day) => 12 hours
123
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
124
- const output = addDuration(reference, { "day": 0.5 });
125
- expect(output).toStrictEqual(new Date("Sat, Aug 28 2022 00:52:11"));
126
- }
127
- {
128
- // 0.5 hour (aka. half hour) => 30 minutes
129
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
130
- const output = addDuration(reference, { "hour": 0.5 });
131
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 13:22:11"));
132
- }
133
- {
134
- // 0.5 minute (aka. half minute) => 30 seconds
135
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
136
- const output = addDuration(reference, { "minute": 0.5 });
137
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 12:52:41"));
138
- }
139
- {
140
- // 0.5 second (aka. half second) => 500 milliseconds
141
- const reference = new Date("Sat, Aug 27 2022 12:52:11:00");
142
- const output = addDuration(reference, { "second": 0.5 });
143
- expect(output).toStrictEqual(new Date("Sat, Aug 27 2022 12:52:11:500"));
144
- }
145
- });
146
-
147
- test("Test - Adding Duration w/ multiple fractions", () => {
148
- {
149
- // 0.5 year (aka. half year) => 6 months
150
- const reference = new Date("Sat, Aug 27 2022 12:52:11");
151
- const output = addDuration(reference, { "year": 0.5, "month": 2 });
152
- expect(output).toStrictEqual(new Date("Thu, April 27 2023 12:52:11"));
153
- }
154
- });
155
-
156
- test("Test - Reverse Duration", () => {
157
- {
158
- const timeunits = { year: 5, month: 5 };
159
- expect(reverseDuration(timeunits)).toStrictEqual({ year: -5, month: -5 });
160
- }
161
- {
162
- const timeunits = { year: -5, month: -5 };
163
- expect(reverseDuration(timeunits)).toStrictEqual({ year: 5, month: 5 });
164
- }
165
- });
@@ -1,133 +0,0 @@
1
- import { createParsingComponentsAtWeekday, getDaysToWeekday } from "../src/calculation/weekdays";
2
- import { Weekday } from "../src";
3
- import { ReferenceWithTimezone } from "../src/results";
4
-
5
- test("Test - This Weekday Calculation", () => {
6
- {
7
- const reference = new ReferenceWithTimezone(new Date("Sat, 20 Aug 2022 12:00:00"));
8
- const output = createParsingComponentsAtWeekday(reference, Weekday.MONDAY, "this");
9
- expect(output.date()).toStrictEqual(new Date("Mon, Aug 22 2022 12:00:00"));
10
- }
11
- {
12
- const reference = new ReferenceWithTimezone(new Date("Sun, 21 Aug 2022 12:00:00"));
13
- const output = createParsingComponentsAtWeekday(reference, Weekday.FRIDAY, "this");
14
- expect(output.date()).toStrictEqual(new Date("Fri, Aug 26 2022 12:00:00"));
15
- }
16
- {
17
- const reference = new ReferenceWithTimezone(new Date("Tue, Aug 2 2022 12:00:00"));
18
- const output = createParsingComponentsAtWeekday(reference, Weekday.SUNDAY, "this");
19
- expect(output.date()).toStrictEqual(new Date("Sun, Aug 7 2022 12:00:00"));
20
- }
21
- });
22
-
23
- test("Test - Last Weekday Calculation", () => {
24
- {
25
- const reference = new ReferenceWithTimezone(new Date("Sat, 20 Aug 2022 12:00:00"));
26
- const output = createParsingComponentsAtWeekday(reference, Weekday.FRIDAY, "last");
27
- expect(output.date()).toStrictEqual(new Date("Fri, Aug 19 2022 12:00:00"));
28
- }
29
- {
30
- const reference = new ReferenceWithTimezone(new Date("Sat, 20 Aug 2022 12:00:00"));
31
- const output = createParsingComponentsAtWeekday(reference, Weekday.MONDAY, "last");
32
- expect(output.date()).toStrictEqual(new Date("Mon, Aug 15 2022 12:00:00"));
33
- }
34
- {
35
- const reference = new ReferenceWithTimezone(new Date("Sat, 20 Aug 2022 12:00:00"));
36
- const output = createParsingComponentsAtWeekday(reference, Weekday.SUNDAY, "last");
37
- expect(output.date()).toStrictEqual(new Date("Sun, Aug 14 2022 12:00:00"));
38
- }
39
- {
40
- const reference = new ReferenceWithTimezone(new Date("Sat, 20 Aug 2022 12:00:00"));
41
- const output = createParsingComponentsAtWeekday(reference, Weekday.SATURDAY, "last");
42
- expect(output.date()).toStrictEqual(new Date("Sat, Aug 13 2022 12:00:00"));
43
- }
44
- });
45
-
46
- test("Test - Next Weekday Calculation", () => {
47
- {
48
- const reference = new ReferenceWithTimezone(new Date("Sun, Aug 21 2022 12:00:00"));
49
- const output = createParsingComponentsAtWeekday(reference, Weekday.MONDAY, "next");
50
- expect(output.date()).toStrictEqual(new Date("Mon, Aug 22 2022 12:00:00"));
51
- }
52
- {
53
- const reference = new ReferenceWithTimezone(new Date("Sun, Aug 21 2022 12:00:00"));
54
- const output = createParsingComponentsAtWeekday(reference, Weekday.SATURDAY, "next");
55
- expect(output.date()).toStrictEqual(new Date("Sat, Aug 27 2022 12:00:00"));
56
- }
57
- {
58
- const reference = new ReferenceWithTimezone(new Date("Sun, Aug 21 2022 12:00:00"));
59
- const output = createParsingComponentsAtWeekday(reference, Weekday.SUNDAY, "next");
60
- expect(output.date()).toStrictEqual(new Date("Sun, Aug 28 2022 12:00:00"));
61
- }
62
- {
63
- const reference = new ReferenceWithTimezone(new Date("Sat, Aug 20 2022 12:00:00"));
64
- const output = createParsingComponentsAtWeekday(reference, Weekday.FRIDAY, "next");
65
- expect(output.date()).toStrictEqual(new Date("Fri, Aug 26 2022 12:00:00"));
66
- }
67
- {
68
- const reference = new ReferenceWithTimezone(new Date("Sat, Aug 20 2022 12:00:00"));
69
- const output = createParsingComponentsAtWeekday(reference, Weekday.SATURDAY, "next");
70
- expect(output.date()).toStrictEqual(new Date("Sat, Aug 27 2022 12:00:00"));
71
- }
72
- {
73
- const reference = new ReferenceWithTimezone(new Date("Sat, Aug 20 2022 12:00:00"));
74
- const output = createParsingComponentsAtWeekday(reference, Weekday.SUNDAY, "next");
75
- expect(output.date()).toStrictEqual(new Date("Sun, Aug 28 2022 12:00:00"));
76
- }
77
- {
78
- const reference = new ReferenceWithTimezone(new Date("Tue, Aug 2 2022 12:00:00"));
79
- const output = createParsingComponentsAtWeekday(reference, Weekday.MONDAY, "next");
80
- expect(output.date()).toStrictEqual(new Date("Mon, Aug 8 2022 12:00:00"));
81
- }
82
- {
83
- const reference = new ReferenceWithTimezone(new Date("Tue, Aug 2 2022 12:00:00"));
84
- const output = createParsingComponentsAtWeekday(reference, Weekday.FRIDAY, "next");
85
- expect(output.date()).toStrictEqual(new Date("Fri, Aug 12 2022 12:00:00"));
86
- }
87
-
88
- {
89
- const reference = new ReferenceWithTimezone(new Date("Tue, Aug 2 2022 12:00:00"));
90
- const output = createParsingComponentsAtWeekday(reference, Weekday.SUNDAY, "next");
91
- expect(output.date()).toStrictEqual(new Date("Sun, Aug 14 2022 12:00:00"));
92
- }
93
- });
94
-
95
- test("Test - Closest Weekday Calculation", () => {
96
- {
97
- const refDate = new Date("Sat, 20 Aug 2022 12:00:00");
98
- expect(getDaysToWeekday(refDate, Weekday.MONDAY)).toBe(2);
99
- }
100
- {
101
- const refDate = new Date("Sat, 20 Aug 2022 12:00:00");
102
- expect(getDaysToWeekday(refDate, Weekday.TUESDAY)).toBe(3);
103
- }
104
- {
105
- const refDate = new Date("Sat, 20 Aug 2022 12:00:00");
106
- expect(getDaysToWeekday(refDate, Weekday.FRIDAY)).toBe(-1);
107
- }
108
- {
109
- const refDate = new Date("Sat, 20 Aug 2022 12:00:00");
110
- expect(getDaysToWeekday(refDate, Weekday.THURSDAY)).toBe(-2);
111
- }
112
- {
113
- const refDate = new Date("Sat, 20 Aug 2022 12:00:00");
114
- expect(getDaysToWeekday(refDate, Weekday.WEDNESDAY)).toBe(-3);
115
- }
116
- });
117
-
118
- test("Test - Weekdays calculation with timezone", () => {
119
- // Thu Feb 27 2025 17:00:00 GMT+0000
120
- // Thu Feb 27 2025 09:00:00 GMT-0800 (PST)
121
- // Fri Feb 28 2025 02:00:00 GMT+0900 (JST)
122
- const refInstant = new Date("2025-02-27T17:00:00.000Z");
123
- {
124
- const reference = ReferenceWithTimezone.fromInput({ instant: refInstant, timezone: "JST" });
125
- const output = createParsingComponentsAtWeekday(reference, Weekday.FRIDAY, "this");
126
- expect(output.date()).toStrictEqual(new Date("Fri Feb 28 2025 12:00:00 GMT+0900 (JST)"));
127
- }
128
- {
129
- const reference = ReferenceWithTimezone.fromInput({ instant: refInstant, timezone: "PST" });
130
- const output = createParsingComponentsAtWeekday(reference, Weekday.FRIDAY, "this");
131
- expect(output.date()).toStrictEqual(new Date("Fri Feb 28 2025 12:00:00 GMT-0800 (PST)"));
132
- }
133
- });