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.
- package/dist/cjs/locales/de/parsers/DECasualTimeParser.js +7 -0
- package/dist/cjs/locales/de/parsers/DECasualTimeParser.js.map +1 -1
- package/dist/cjs/locales/en/configuration.js +2 -0
- package/dist/cjs/locales/en/configuration.js.map +1 -1
- package/dist/cjs/locales/en/parsers/ENMonthNameLittleEndianParser.js +1 -1
- package/dist/cjs/locales/en/parsers/ENMonthNameLittleEndianParser.js.map +1 -1
- package/dist/cjs/locales/en/parsers/ENYearMonthNameParser.d.ts +6 -0
- package/dist/cjs/locales/en/parsers/ENYearMonthNameParser.js +31 -0
- package/dist/cjs/locales/en/parsers/ENYearMonthNameParser.js.map +1 -0
- package/dist/cjs/locales/fi/parsers/FICasualTimeParser.js +7 -0
- package/dist/cjs/locales/fi/parsers/FICasualTimeParser.js.map +1 -1
- package/dist/cjs/locales/fr/parsers/FRCasualTimeParser.js +5 -0
- package/dist/cjs/locales/fr/parsers/FRCasualTimeParser.js.map +1 -1
- package/dist/cjs/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +2 -1
- package/dist/cjs/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js.map +1 -1
- package/dist/cjs/locales/it/parsers/ITCasualTimeParser.js +5 -0
- package/dist/cjs/locales/it/parsers/ITCasualTimeParser.js.map +1 -1
- package/dist/cjs/locales/uk/parsers/UKTimeUnitWithinFormatParser.js +1 -1
- package/dist/cjs/locales/uk/parsers/UKTimeUnitWithinFormatParser.js.map +1 -1
- package/dist/cjs/locales/zh/hans/index.js +2 -0
- package/dist/cjs/locales/zh/hans/index.js.map +1 -1
- package/dist/cjs/locales/zh/hans/parsers/ZHHansAgoFormatParser.d.ts +6 -0
- package/dist/cjs/locales/zh/hans/parsers/ZHHansAgoFormatParser.js +80 -0
- package/dist/cjs/locales/zh/hans/parsers/ZHHansAgoFormatParser.js.map +1 -0
- package/dist/cjs/locales/zh/hant/index.js +2 -0
- package/dist/cjs/locales/zh/hant/index.js.map +1 -1
- package/dist/cjs/locales/zh/hant/parsers/ZHHantAgoFormatParser.d.ts +6 -0
- package/dist/cjs/locales/zh/hant/parsers/ZHHantAgoFormatParser.js +80 -0
- package/dist/cjs/locales/zh/hant/parsers/ZHHantAgoFormatParser.js.map +1 -0
- package/dist/cjs/results.js +15 -9
- package/dist/cjs/results.js.map +1 -1
- package/dist/esm/locales/de/parsers/DECasualTimeParser.js +7 -0
- package/dist/esm/locales/de/parsers/DECasualTimeParser.js.map +1 -1
- package/dist/esm/locales/en/configuration.js +2 -0
- package/dist/esm/locales/en/configuration.js.map +1 -1
- package/dist/esm/locales/en/parsers/ENMonthNameLittleEndianParser.js +1 -1
- package/dist/esm/locales/en/parsers/ENMonthNameLittleEndianParser.js.map +1 -1
- package/dist/esm/locales/en/parsers/ENYearMonthNameParser.d.ts +6 -0
- package/dist/esm/locales/en/parsers/ENYearMonthNameParser.js +28 -0
- package/dist/esm/locales/en/parsers/ENYearMonthNameParser.js.map +1 -0
- package/dist/esm/locales/fi/parsers/FICasualTimeParser.js +7 -0
- package/dist/esm/locales/fi/parsers/FICasualTimeParser.js.map +1 -1
- package/dist/esm/locales/fr/parsers/FRCasualTimeParser.js +5 -0
- package/dist/esm/locales/fr/parsers/FRCasualTimeParser.js.map +1 -1
- package/dist/esm/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +2 -1
- package/dist/esm/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js.map +1 -1
- package/dist/esm/locales/it/parsers/ITCasualTimeParser.js +5 -0
- package/dist/esm/locales/it/parsers/ITCasualTimeParser.js.map +1 -1
- package/dist/esm/locales/uk/parsers/UKTimeUnitWithinFormatParser.js +1 -1
- package/dist/esm/locales/uk/parsers/UKTimeUnitWithinFormatParser.js.map +1 -1
- package/dist/esm/locales/zh/hans/index.js +2 -0
- package/dist/esm/locales/zh/hans/index.js.map +1 -1
- package/dist/esm/locales/zh/hans/parsers/ZHHansAgoFormatParser.d.ts +6 -0
- package/dist/esm/locales/zh/hans/parsers/ZHHansAgoFormatParser.js +77 -0
- package/dist/esm/locales/zh/hans/parsers/ZHHansAgoFormatParser.js.map +1 -0
- package/dist/esm/locales/zh/hant/index.js +2 -0
- package/dist/esm/locales/zh/hant/index.js.map +1 -1
- package/dist/esm/locales/zh/hant/parsers/ZHHantAgoFormatParser.d.ts +6 -0
- package/dist/esm/locales/zh/hant/parsers/ZHHantAgoFormatParser.js +77 -0
- package/dist/esm/locales/zh/hant/parsers/ZHHantAgoFormatParser.js.map +1 -0
- package/dist/esm/results.js +14 -9
- package/dist/esm/results.js.map +1 -1
- package/package.json +5 -1
- package/src/locales/de/parsers/DECasualTimeParser.ts +7 -0
- package/src/locales/en/configuration.ts +2 -0
- package/src/locales/en/parsers/ENMonthNameLittleEndianParser.ts +1 -1
- package/src/locales/en/parsers/ENYearMonthNameParser.ts +38 -0
- package/src/locales/fi/parsers/FICasualTimeParser.ts +7 -0
- package/src/locales/fr/parsers/FRCasualTimeParser.ts +5 -0
- package/src/locales/fr/parsers/FRTimeUnitRelativeFormatParser.ts +2 -1
- package/src/locales/it/parsers/ITCasualTimeParser.ts +5 -0
- package/src/locales/uk/parsers/UKTimeUnitWithinFormatParser.ts +1 -1
- package/src/locales/zh/hans/index.ts +2 -0
- package/src/locales/zh/hans/parsers/ZHHansAgoFormatParser.ts +87 -0
- package/src/locales/zh/hant/index.ts +2 -0
- package/src/locales/zh/hant/parsers/ZHHantAgoFormatParser.ts +87 -0
- package/src/results.ts +40 -9
- package/test/calculation_duration.test.ts +0 -165
- package/test/calculation_weekdays.test.ts +0 -133
- package/test/de/de_casual.test.ts +0 -322
- package/test/de/de_dash.test.ts +0 -32
- package/test/de/de_month_name_little_endian.test.ts +0 -273
- package/test/de/de_time_exp.test.ts +0 -223
- package/test/de/de_time_units_casual_relative.test.ts +0 -120
- package/test/de/de_time_units_within.test.ts +0 -119
- package/test/de/de_weekday.test.ts +0 -158
- package/test/de/de_year.test.ts +0 -147
- package/test/debugging.test.ts +0 -17
- package/test/en/en.test.ts +0 -191
- package/test/en/en_casual.test.ts +0 -425
- package/test/en/en_inter_std.test.ts +0 -118
- package/test/en/en_merging_relative_dates.test.ts +0 -50
- package/test/en/en_month.test.ts +0 -295
- package/test/en/en_month_name_little_endian.test.ts +0 -448
- package/test/en/en_month_name_middle_endian.test.ts +0 -386
- package/test/en/en_performance.test.ts +0 -26
- package/test/en/en_relative.test.ts +0 -393
- package/test/en/en_slash.test.ts +0 -284
- package/test/en/en_time_exp.test.ts +0 -535
- package/test/en/en_time_units_ago.test.ts +0 -357
- package/test/en/en_time_units_casual_relative.test.ts +0 -186
- package/test/en/en_time_units_later.test.ts +0 -361
- package/test/en/en_time_units_within.test.ts +0 -417
- package/test/en/en_timezone_exp.test.ts +0 -410
- package/test/en/en_weekday.test.ts +0 -573
- package/test/en/en_year.test.ts +0 -138
- package/test/en/en_year_month_day.test.ts +0 -101
- package/test/en/negative_cases.test.ts +0 -99
- package/test/es/es_casual.test.ts +0 -175
- package/test/es/es_month_name_little_endian.test.ts +0 -217
- package/test/es/es_slash.test.ts +0 -26
- package/test/es/es_time_exp.test.ts +0 -175
- package/test/es/es_time_units_within.test.ts +0 -119
- package/test/fi/fi_casual.test.ts +0 -85
- package/test/fi/fi_casual_time.test.ts +0 -56
- package/test/fi/fi_month_name_little_endian.test.ts +0 -50
- package/test/fi/fi_time_exp.test.ts +0 -39
- package/test/fi/fi_time_units_ago.test.ts +0 -93
- package/test/fi/fi_time_units_casual_relative.test.ts +0 -117
- package/test/fi/fi_time_units_within.test.ts +0 -74
- package/test/fi/fi_weekday.test.ts +0 -90
- package/test/fr/fr_casual.test.ts +0 -300
- package/test/fr/fr_little_endian.test.ts +0 -320
- package/test/fr/fr_slash.test.ts +0 -49
- package/test/fr/fr_time_exp.test.ts +0 -588
- package/test/fr/fr_time_units_ago.test.ts +0 -103
- package/test/fr/fr_time_units_casual_relative.test.ts +0 -108
- package/test/fr/fr_time_units_within.test.ts +0 -129
- package/test/fr/fr_weekday.test.ts +0 -130
- package/test/it/it_casual.test.ts +0 -44
- package/test/it/it_month_name_little_endian.test.ts +0 -28
- package/test/it/it_month_name_middle_endian.test.ts +0 -39
- package/test/it/it_time_exp.test.ts +0 -84
- package/test/it/it_weekday.test.ts +0 -37
- package/test/it/it_year_month_day.test.ts +0 -41
- package/test/ja/ja_casual.test.ts +0 -73
- package/test/ja/ja_slash_date_format.test.ts +0 -60
- package/test/ja/ja_standard.test.ts +0 -235
- package/test/ja/ja_time_exp.test.ts +0 -305
- package/test/ja/ja_weekday.test.ts +0 -183
- package/test/nl/nl_casual.test.ts +0 -408
- package/test/nl/nl_month.test.ts +0 -205
- package/test/nl/nl_month_name_little_endian.test.ts +0 -358
- package/test/nl/nl_relative.test.ts +0 -242
- package/test/nl/nl_slash.test.ts +0 -206
- package/test/nl/nl_time_exp.test.ts +0 -79
- package/test/nl/nl_time_units_ago.test.ts +0 -243
- package/test/nl/nl_time_units_casual_relative.test.ts +0 -130
- package/test/nl/nl_time_units_later.test.ts +0 -250
- package/test/nl/nl_time_units_within.test.ts +0 -225
- package/test/nl/nl_weekday.test.ts +0 -216
- package/test/pt/pt_casual.test.ts +0 -175
- package/test/pt/pt_month_name_little_endian.test.ts +0 -217
- package/test/pt/pt_slash.test.ts +0 -26
- package/test/pt/pt_time_exp.test.ts +0 -175
- package/test/result.test.ts +0 -283
- package/test/ru/ru_casual.test.ts +0 -159
- package/test/ru/ru_month.test.ts +0 -70
- package/test/ru/ru_month_name_little_endian.test.ts +0 -145
- package/test/ru/ru_relative.test.ts +0 -107
- package/test/ru/ru_time_exp.test.ts +0 -111
- package/test/ru/ru_time_units_ago.test.ts +0 -48
- package/test/ru/ru_time_units_casual_relative.test.ts +0 -190
- package/test/ru/ru_time_units_within.test.ts +0 -16
- package/test/ru/ru_weekday.test.ts +0 -52
- package/test/sv/sv_casual.test.ts +0 -87
- package/test/sv/sv_month_name_little_endian.test.ts +0 -48
- package/test/sv/sv_time_units_casual_relative.test.ts +0 -143
- package/test/sv/sv_weekday.test.ts +0 -68
- package/test/system.test.ts +0 -247
- package/test/system_timezone.test.ts +0 -284
- package/test/test_util.ts +0 -135
- package/test/uk/uk_casual.test.ts +0 -153
- package/test/uk/uk_month.test.ts +0 -70
- package/test/uk/uk_month_name_little_endian.test.ts +0 -148
- package/test/uk/uk_relative.test.ts +0 -107
- package/test/uk/uk_time_exp.test.ts +0 -111
- package/test/uk/uk_time_units_ago.test.ts +0 -48
- package/test/uk/uk_time_units_casual_relative.test.ts +0 -142
- package/test/uk/uk_time_units_within.test.ts +0 -16
- package/test/uk/uk_weekday.test.ts +0 -52
- package/test/vi/vi_casual.test.ts +0 -84
- package/test/vi/vi_casual_time.test.ts +0 -77
- package/test/vi/vi_date_range.test.ts +0 -61
- package/test/vi/vi_forward_date.test.ts +0 -45
- package/test/vi/vi_month_year.test.ts +0 -40
- package/test/vi/vi_negative_cases.test.ts +0 -60
- package/test/vi/vi_slash.test.ts +0 -36
- package/test/vi/vi_standard.test.ts +0 -86
- package/test/vi/vi_strict.test.ts +0 -67
- package/test/vi/vi_time_exp.test.ts +0 -99
- package/test/vi/vi_time_units_ago.test.ts +0 -56
- package/test/vi/vi_time_units_casual_relative.test.ts +0 -56
- package/test/vi/vi_time_units_later.test.ts +0 -43
- package/test/vi/vi_time_units_within.test.ts +0 -24
- package/test/vi/vi_weekday.test.ts +0 -77
- package/test/vi/vi_year.test.ts +0 -42
- package/test/zh/hans/zh_hans_casual.test.ts +0 -242
- package/test/zh/hans/zh_hans_date.test.ts +0 -116
- package/test/zh/hans/zh_hans_deadline.test.ts +0 -175
- package/test/zh/hans/zh_hans_time_exp.test.ts +0 -508
- package/test/zh/hans/zh_hans_weekday.test.ts +0 -219
- package/test/zh/hant/zh_hant_casual.test.ts +0 -260
- package/test/zh/hant/zh_hant_date.test.ts +0 -116
- package/test/zh/hant/zh_hant_deadline.test.ts +0 -136
- package/test/zh/hant/zh_hant_time_exp.test.ts +0 -226
- package/test/zh/hant/zh_hant_weekday.test.ts +0 -175
- package/test/zh/zh.test.ts +0 -36
- package/tsconfig.build.esm.json +0 -8
- package/tsconfig.build.json +0 -10
- 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
|
-
|
|
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.
|
|
238
|
-
if (date.
|
|
239
|
-
if (date.
|
|
240
|
-
if (this.get("hour") != null && date.
|
|
241
|
-
if (this.get("minute") != null && date.
|
|
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
|
|
256
|
-
|
|
257
|
-
|
|
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
|
-
});
|