@sprucelabs/calendar-utils 38.0.158 → 39.0.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/build/esm/locales/DateUtilDecorator.d.ts +3 -1
- package/build/esm/locales/DateUtilDecorator.js +11 -6
- package/build/esm/locales/Locale.d.ts +1 -1
- package/build/esm/locales/Locale.js +2 -2
- package/build/esm/utilities/calendar.utility.d.ts +8 -5
- package/build/esm/utilities/calendar.utility.js +23 -10
- package/build/esm/utilities/date.utility.js +3 -5
- package/build/locales/DateUtilDecorator.d.ts +3 -1
- package/build/locales/DateUtilDecorator.js +13 -6
- package/build/locales/Locale.d.ts +1 -1
- package/build/locales/Locale.js +2 -2
- package/build/utilities/calendar.utility.d.ts +8 -5
- package/build/utilities/calendar.utility.js +22 -9
- package/build/utilities/date.utility.js +3 -5
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { DateUtil, Locale } from '../types/calendar.types';
|
|
1
|
+
import { DateUtil, Locale, TimezoneName } from '../types/calendar.types';
|
|
2
|
+
import { IDate } from '../utilities/date.utility';
|
|
2
3
|
export default class DateUtilDecorator {
|
|
3
4
|
private locale;
|
|
4
5
|
constructor(locale: Locale);
|
|
@@ -7,3 +8,4 @@ export default class DateUtilDecorator {
|
|
|
7
8
|
private addOffset;
|
|
8
9
|
private calculateOffset;
|
|
9
10
|
}
|
|
11
|
+
export declare function calculateOffsetAtDate(date: IDate, locale: Locale, timezone: TimezoneName): number;
|
|
@@ -17,12 +17,8 @@ export default class DateUtilDecorator {
|
|
|
17
17
|
}
|
|
18
18
|
else {
|
|
19
19
|
value = dateUtil.date(date);
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
.toString()
|
|
23
|
-
.padStart(2, '0')}-${day.toString().padStart(2, '0')}T12:00:00`;
|
|
24
|
-
const zonedDate = toDate(dateString).getTime();
|
|
25
|
-
const offset = this.calculateOffset(zonedDate);
|
|
20
|
+
const locale = this.locale;
|
|
21
|
+
const offset = calculateOffsetAtDate(date, locale, locale.getZoneName());
|
|
26
22
|
return value - offset;
|
|
27
23
|
}
|
|
28
24
|
return this.addOffset(value);
|
|
@@ -56,3 +52,12 @@ export default class DateUtilDecorator {
|
|
|
56
52
|
return this.locale.getTimezoneOffsetMinutes(value) * 60 * 1000;
|
|
57
53
|
}
|
|
58
54
|
}
|
|
55
|
+
export function calculateOffsetAtDate(date, locale, timezone) {
|
|
56
|
+
const { year, month, day } = date;
|
|
57
|
+
const dateString = `${year}-${(month + 1).toString().padStart(2, '0')}-${day
|
|
58
|
+
.toString()
|
|
59
|
+
.padStart(2, '0')}T12:00:00-00:00`;
|
|
60
|
+
const zonedDate = toDate(dateString).getTime();
|
|
61
|
+
const offset = locale.getTimezoneOffsetMinutes(zonedDate, timezone) * 60 * 1000;
|
|
62
|
+
return offset;
|
|
63
|
+
}
|
|
@@ -8,7 +8,7 @@ export default class LocaleImpl extends AbstractEventEmitter<LocaleContract> imp
|
|
|
8
8
|
private _timezoneChoices?;
|
|
9
9
|
constructor();
|
|
10
10
|
setTimezoneOffsetMinutes(offset: number): void;
|
|
11
|
-
getTimezoneOffsetMinutes(onDate?: number): number;
|
|
11
|
+
getTimezoneOffsetMinutes(onDate?: number, timezone?: TimezoneName): number;
|
|
12
12
|
setZoneName(zone: TimezoneName): Promise<void>;
|
|
13
13
|
getZoneName(): "Pacific/Niue" | "Pacific/Pago_Pago" | "Pacific/Rarotonga" | "Pacific/Honolulu" | "Pacific/Tahiti" | "Pacific/Marquesas" | "Pacific/Gambier" | "America/Adak" | "America/Anchorage" | "America/Juneau" | "America/Metlakatla" | "America/Nome" | "America/Sitka" | "America/Yakutat" | "Pacific/Pitcairn" | "America/Hermosillo" | "America/Dawson_Creek" | "America/Fort_Nelson" | "America/Phoenix" | "America/Los_Angeles" | "America/Tijuana" | "America/Vancouver" | "America/Dawson" | "America/Whitehorse" | "America/Belize" | "America/Costa_Rica" | "America/El_Salvador" | "America/Guatemala" | "America/Managua" | "America/Regina" | "America/Swift_Current" | "America/Tegucigalpa" | "Pacific/Easter" | "Pacific/Galapagos" | "America/Chihuahua" | "America/Mazatlan" | "America/Boise" | "America/Cambridge_Bay" | "America/Denver" | "America/Edmonton" | "America/Inuvik" | "America/Ojinaga" | "America/Yellowknife" | "America/Eirunepe" | "America/Rio_Branco" | "America/Bahia_Banderas" | "America/North_Dakota/Beulah" | "America/North_Dakota/Center" | "America/Chicago" | "America/Indiana/Knox" | "America/Matamoros" | "America/Menominee" | "America/Merida" | "America/Mexico_City" | "America/Monterrey" | "America/North_Dakota/New_Salem" | "America/Rainy_River" | "America/Rankin_Inlet" | "America/Resolute" | "America/Indiana/Tell_City" | "America/Winnipeg" | "America/Bogota" | "America/Cancun" | "America/Jamaica" | "America/Panama" | "America/Guayaquil" | "America/Lima" | "America/Boa_Vista" | "America/Campo_Grande" | "America/Cuiaba" | "America/Manaus" | "America/Porto_Velho" | "America/Barbados" | "America/Martinique" | "America/Puerto_Rico" | "America/Santo_Domingo" | "America/La_Paz" | "America/Santiago" | "America/Havana" | "America/Detroit" | "America/Grand_Turk" | "America/Indiana/Indianapolis" | "America/Iqaluit" | "America/Kentucky/Louisville" | "America/Indiana/Marengo" | "America/Kentucky/Monticello" | "America/New_York" | "America/Nipigon" | "America/Pangnirtung" | "America/Indiana/Petersburg" | "America/Port-au-Prince" | "America/Thunder_Bay" | "America/Toronto" | "America/Indiana/Vevay" | "America/Indiana/Vincennes" | "America/Indiana/Winamac" | "America/Guyana" | "America/Asuncion" | "America/Caracas" | "America/Argentina/Buenos_Aires" | "America/Argentina/Catamarca" | "America/Argentina/Cordoba" | "America/Argentina/Jujuy" | "America/Argentina/La_Rioja" | "America/Argentina/Mendoza" | "America/Argentina/Rio_Gallegos" | "America/Argentina/Salta" | "America/Argentina/San_Juan" | "America/Argentina/San_Luis" | "America/Argentina/Tucuman" | "America/Argentina/Ushuaia" | "Atlantic/Bermuda" | "America/Glace_Bay" | "America/Goose_Bay" | "America/Halifax" | "America/Moncton" | "America/Thule" | "America/Araguaina" | "America/Bahia" | "America/Belem" | "America/Fortaleza" | "America/Maceio" | "America/Recife" | "America/Santarem" | "America/Sao_Paulo" | "Atlantic/Stanley" | "America/Cayenne" | "Antarctica/Palmer" | "America/Punta_Arenas" | "Antarctica/Rothera" | "America/Paramaribo" | "America/Montevideo" | "America/St_Johns" | "America/Noronha" | "Atlantic/South_Georgia" | "America/Miquelon" | "America/Nuuk" | "Atlantic/Cape_Verde" | "Atlantic/Azores" | "UTC" | "America/Scoresbysund" | "Etc/GMT" | "Africa/Abidjan" | "Africa/Bissau" | "America/Danmarkshavn" | "Africa/Monrovia" | "Atlantic/Reykjavik" | "Africa/Sao_Tome" | "Africa/Algiers" | "Africa/Tunis" | "Europe/Dublin" | "Africa/Casablanca" | "Europe/London" | "Africa/Lagos" | "Africa/Ndjamena" | "Atlantic/Canary" | "Atlantic/Faroe" | "Europe/Lisbon" | "Atlantic/Madeira" | "Africa/El_Aaiun" | "Africa/Juba" | "Africa/Khartoum" | "Africa/Maputo" | "Africa/Windhoek" | "Europe/Amsterdam" | "Europe/Andorra" | "Europe/Belgrade" | "Europe/Berlin" | "Europe/Brussels" | "Europe/Budapest" | "Africa/Ceuta" | "Europe/Copenhagen" | "Europe/Gibraltar" | "Europe/Luxembourg" | "Europe/Madrid" | "Europe/Malta" | "Europe/Monaco" | "Europe/Oslo" | "Europe/Paris" | "Europe/Prague" | "Europe/Rome" | "Europe/Stockholm" | "Europe/Tirane" | "Europe/Vienna" | "Europe/Warsaw" | "Europe/Zurich" | "Africa/Cairo" | "Europe/Kaliningrad" | "Africa/Tripoli" | "Africa/Johannesburg" | "Antarctica/Troll" | "Asia/Baghdad" | "Asia/Qatar" | "Asia/Riyadh" | "Africa/Nairobi" | "Asia/Amman" | "Europe/Athens" | "Asia/Beirut" | "Europe/Bucharest" | "Europe/Chisinau" | "Asia/Damascus" | "Asia/Gaza" | "Asia/Hebron" | "Europe/Helsinki" | "Europe/Kiev" | "Asia/Nicosia" | "Europe/Riga" | "Europe/Sofia" | "Europe/Tallinn" | "Europe/Uzhgorod" | "Europe/Vilnius" | "Europe/Zaporozhye" | "Asia/Famagusta" | "Asia/Jerusalem" | "Europe/Kirov" | "Europe/Minsk" | "Europe/Moscow" | "Europe/Simferopol" | "Europe/Istanbul" | "Europe/Volgograd" | "Asia/Yerevan" | "Europe/Astrakhan" | "Asia/Baku" | "Asia/Tbilisi" | "Asia/Dubai" | "Indian/Mauritius" | "Indian/Reunion" | "Europe/Samara" | "Europe/Saratov" | "Indian/Mahe" | "Europe/Ulyanovsk" | "Asia/Kabul" | "Asia/Tehran" | "Indian/Kerguelen" | "Indian/Maldives" | "Antarctica/Mawson" | "Asia/Karachi" | "Asia/Dushanbe" | "Asia/Ashgabat" | "Asia/Samarkand" | "Asia/Tashkent" | "Asia/Aqtau" | "Asia/Aqtobe" | "Asia/Atyrau" | "Asia/Oral" | "Asia/Qyzylorda" | "Asia/Yekaterinburg" | "Asia/Colombo" | "Asia/Kolkata" | "Asia/Kathmandu" | "Asia/Dhaka" | "Asia/Thimphu" | "Asia/Almaty" | "Asia/Qostanay" | "Indian/Chagos" | "Asia/Bishkek" | "Asia/Omsk" | "Asia/Urumqi" | "Antarctica/Vostok" | "Indian/Cocos" | "Asia/Yangon" | "Asia/Barnaul" | "Indian/Christmas" | "Antarctica/Davis" | "Asia/Hovd" | "Asia/Bangkok" | "Asia/Ho_Chi_Minh" | "Asia/Krasnoyarsk" | "Asia/Novokuznetsk" | "Asia/Novosibirsk" | "Asia/Tomsk" | "Asia/Jakarta" | "Asia/Pontianak" | "Australia/Perth" | "Asia/Brunei" | "Asia/Makassar" | "Asia/Macau" | "Asia/Shanghai" | "Asia/Hong_Kong" | "Asia/Irkutsk" | "Asia/Kuala_Lumpur" | "Asia/Kuching" | "Asia/Manila" | "Asia/Singapore" | "Asia/Taipei" | "Asia/Choibalsan" | "Asia/Ulaanbaatar" | "Australia/Eucla" | "Asia/Dili" | "Asia/Jayapura" | "Asia/Tokyo" | "Asia/Pyongyang" | "Asia/Seoul" | "Pacific/Palau" | "Asia/Chita" | "Asia/Khandyga" | "Asia/Yakutsk" | "Australia/Darwin" | "Australia/Adelaide" | "Australia/Broken_Hill" | "Australia/Brisbane" | "Australia/Lindeman" | "Pacific/Guam" | "Pacific/Chuuk" | "Australia/Hobart" | "Antarctica/Macquarie" | "Australia/Melbourne" | "Australia/Sydney" | "Pacific/Port_Moresby" | "Asia/Ust-Nera" | "Asia/Vladivostok" | "Australia/Lord_Howe" | "Pacific/Bougainville" | "Antarctica/Casey" | "Pacific/Kosrae" | "Asia/Magadan" | "Pacific/Noumea" | "Pacific/Norfolk" | "Pacific/Pohnpei" | "Asia/Sakhalin" | "Pacific/Guadalcanal" | "Asia/Srednekolymsk" | "Pacific/Efate" | "Asia/Anadyr" | "Pacific/Fiji" | "Pacific/Tarawa" | "Pacific/Kwajalein" | "Pacific/Majuro" | "Pacific/Nauru" | "Pacific/Auckland" | "Asia/Kamchatka" | "Pacific/Funafuti" | "Pacific/Wake" | "Pacific/Wallis" | "Pacific/Chatham" | "Pacific/Apia" | "Pacific/Fakaofo" | "Pacific/Tongatapu" | "Pacific/Kiritimati";
|
|
14
14
|
offsetMinutesToZoneName(offset: number): "Pacific/Niue" | "Pacific/Pago_Pago" | "Pacific/Rarotonga" | "Pacific/Honolulu" | "Pacific/Tahiti" | "Pacific/Marquesas" | "Pacific/Gambier" | "America/Adak" | "America/Anchorage" | "America/Juneau" | "America/Metlakatla" | "America/Nome" | "America/Sitka" | "America/Yakutat" | "Pacific/Pitcairn" | "America/Hermosillo" | "America/Dawson_Creek" | "America/Fort_Nelson" | "America/Phoenix" | "America/Los_Angeles" | "America/Tijuana" | "America/Vancouver" | "America/Dawson" | "America/Whitehorse" | "America/Belize" | "America/Costa_Rica" | "America/El_Salvador" | "America/Guatemala" | "America/Managua" | "America/Regina" | "America/Swift_Current" | "America/Tegucigalpa" | "Pacific/Easter" | "Pacific/Galapagos" | "America/Chihuahua" | "America/Mazatlan" | "America/Boise" | "America/Cambridge_Bay" | "America/Denver" | "America/Edmonton" | "America/Inuvik" | "America/Ojinaga" | "America/Yellowknife" | "America/Eirunepe" | "America/Rio_Branco" | "America/Bahia_Banderas" | "America/North_Dakota/Beulah" | "America/North_Dakota/Center" | "America/Chicago" | "America/Indiana/Knox" | "America/Matamoros" | "America/Menominee" | "America/Merida" | "America/Mexico_City" | "America/Monterrey" | "America/North_Dakota/New_Salem" | "America/Rainy_River" | "America/Rankin_Inlet" | "America/Resolute" | "America/Indiana/Tell_City" | "America/Winnipeg" | "America/Bogota" | "America/Cancun" | "America/Jamaica" | "America/Panama" | "America/Guayaquil" | "America/Lima" | "America/Boa_Vista" | "America/Campo_Grande" | "America/Cuiaba" | "America/Manaus" | "America/Porto_Velho" | "America/Barbados" | "America/Martinique" | "America/Puerto_Rico" | "America/Santo_Domingo" | "America/La_Paz" | "America/Santiago" | "America/Havana" | "America/Detroit" | "America/Grand_Turk" | "America/Indiana/Indianapolis" | "America/Iqaluit" | "America/Kentucky/Louisville" | "America/Indiana/Marengo" | "America/Kentucky/Monticello" | "America/New_York" | "America/Nipigon" | "America/Pangnirtung" | "America/Indiana/Petersburg" | "America/Port-au-Prince" | "America/Thunder_Bay" | "America/Toronto" | "America/Indiana/Vevay" | "America/Indiana/Vincennes" | "America/Indiana/Winamac" | "America/Guyana" | "America/Asuncion" | "America/Caracas" | "America/Argentina/Buenos_Aires" | "America/Argentina/Catamarca" | "America/Argentina/Cordoba" | "America/Argentina/Jujuy" | "America/Argentina/La_Rioja" | "America/Argentina/Mendoza" | "America/Argentina/Rio_Gallegos" | "America/Argentina/Salta" | "America/Argentina/San_Juan" | "America/Argentina/San_Luis" | "America/Argentina/Tucuman" | "America/Argentina/Ushuaia" | "Atlantic/Bermuda" | "America/Glace_Bay" | "America/Goose_Bay" | "America/Halifax" | "America/Moncton" | "America/Thule" | "America/Araguaina" | "America/Bahia" | "America/Belem" | "America/Fortaleza" | "America/Maceio" | "America/Recife" | "America/Santarem" | "America/Sao_Paulo" | "Atlantic/Stanley" | "America/Cayenne" | "Antarctica/Palmer" | "America/Punta_Arenas" | "Antarctica/Rothera" | "America/Paramaribo" | "America/Montevideo" | "America/St_Johns" | "America/Noronha" | "Atlantic/South_Georgia" | "America/Miquelon" | "America/Nuuk" | "Atlantic/Cape_Verde" | "Atlantic/Azores" | "UTC" | "America/Scoresbysund" | "Etc/GMT" | "Africa/Abidjan" | "Africa/Bissau" | "America/Danmarkshavn" | "Africa/Monrovia" | "Atlantic/Reykjavik" | "Africa/Sao_Tome" | "Africa/Algiers" | "Africa/Tunis" | "Europe/Dublin" | "Africa/Casablanca" | "Europe/London" | "Africa/Lagos" | "Africa/Ndjamena" | "Atlantic/Canary" | "Atlantic/Faroe" | "Europe/Lisbon" | "Atlantic/Madeira" | "Africa/El_Aaiun" | "Africa/Juba" | "Africa/Khartoum" | "Africa/Maputo" | "Africa/Windhoek" | "Europe/Amsterdam" | "Europe/Andorra" | "Europe/Belgrade" | "Europe/Berlin" | "Europe/Brussels" | "Europe/Budapest" | "Africa/Ceuta" | "Europe/Copenhagen" | "Europe/Gibraltar" | "Europe/Luxembourg" | "Europe/Madrid" | "Europe/Malta" | "Europe/Monaco" | "Europe/Oslo" | "Europe/Paris" | "Europe/Prague" | "Europe/Rome" | "Europe/Stockholm" | "Europe/Tirane" | "Europe/Vienna" | "Europe/Warsaw" | "Europe/Zurich" | "Africa/Cairo" | "Europe/Kaliningrad" | "Africa/Tripoli" | "Africa/Johannesburg" | "Antarctica/Troll" | "Asia/Baghdad" | "Asia/Qatar" | "Asia/Riyadh" | "Africa/Nairobi" | "Asia/Amman" | "Europe/Athens" | "Asia/Beirut" | "Europe/Bucharest" | "Europe/Chisinau" | "Asia/Damascus" | "Asia/Gaza" | "Asia/Hebron" | "Europe/Helsinki" | "Europe/Kiev" | "Asia/Nicosia" | "Europe/Riga" | "Europe/Sofia" | "Europe/Tallinn" | "Europe/Uzhgorod" | "Europe/Vilnius" | "Europe/Zaporozhye" | "Asia/Famagusta" | "Asia/Jerusalem" | "Europe/Kirov" | "Europe/Minsk" | "Europe/Moscow" | "Europe/Simferopol" | "Europe/Istanbul" | "Europe/Volgograd" | "Asia/Yerevan" | "Europe/Astrakhan" | "Asia/Baku" | "Asia/Tbilisi" | "Asia/Dubai" | "Indian/Mauritius" | "Indian/Reunion" | "Europe/Samara" | "Europe/Saratov" | "Indian/Mahe" | "Europe/Ulyanovsk" | "Asia/Kabul" | "Asia/Tehran" | "Indian/Kerguelen" | "Indian/Maldives" | "Antarctica/Mawson" | "Asia/Karachi" | "Asia/Dushanbe" | "Asia/Ashgabat" | "Asia/Samarkand" | "Asia/Tashkent" | "Asia/Aqtau" | "Asia/Aqtobe" | "Asia/Atyrau" | "Asia/Oral" | "Asia/Qyzylorda" | "Asia/Yekaterinburg" | "Asia/Colombo" | "Asia/Kolkata" | "Asia/Kathmandu" | "Asia/Dhaka" | "Asia/Thimphu" | "Asia/Almaty" | "Asia/Qostanay" | "Indian/Chagos" | "Asia/Bishkek" | "Asia/Omsk" | "Asia/Urumqi" | "Antarctica/Vostok" | "Indian/Cocos" | "Asia/Yangon" | "Asia/Barnaul" | "Indian/Christmas" | "Antarctica/Davis" | "Asia/Hovd" | "Asia/Bangkok" | "Asia/Ho_Chi_Minh" | "Asia/Krasnoyarsk" | "Asia/Novokuznetsk" | "Asia/Novosibirsk" | "Asia/Tomsk" | "Asia/Jakarta" | "Asia/Pontianak" | "Australia/Perth" | "Asia/Brunei" | "Asia/Makassar" | "Asia/Macau" | "Asia/Shanghai" | "Asia/Hong_Kong" | "Asia/Irkutsk" | "Asia/Kuala_Lumpur" | "Asia/Kuching" | "Asia/Manila" | "Asia/Singapore" | "Asia/Taipei" | "Asia/Choibalsan" | "Asia/Ulaanbaatar" | "Australia/Eucla" | "Asia/Dili" | "Asia/Jayapura" | "Asia/Tokyo" | "Asia/Pyongyang" | "Asia/Seoul" | "Pacific/Palau" | "Asia/Chita" | "Asia/Khandyga" | "Asia/Yakutsk" | "Australia/Darwin" | "Australia/Adelaide" | "Australia/Broken_Hill" | "Australia/Brisbane" | "Australia/Lindeman" | "Pacific/Guam" | "Pacific/Chuuk" | "Australia/Hobart" | "Antarctica/Macquarie" | "Australia/Melbourne" | "Australia/Sydney" | "Pacific/Port_Moresby" | "Asia/Ust-Nera" | "Asia/Vladivostok" | "Australia/Lord_Howe" | "Pacific/Bougainville" | "Antarctica/Casey" | "Pacific/Kosrae" | "Asia/Magadan" | "Pacific/Noumea" | "Pacific/Norfolk" | "Pacific/Pohnpei" | "Asia/Sakhalin" | "Pacific/Guadalcanal" | "Asia/Srednekolymsk" | "Pacific/Efate" | "Asia/Anadyr" | "Pacific/Fiji" | "Pacific/Tarawa" | "Pacific/Kwajalein" | "Pacific/Majuro" | "Pacific/Nauru" | "Pacific/Auckland" | "Asia/Kamchatka" | "Pacific/Funafuti" | "Pacific/Wake" | "Pacific/Wallis" | "Pacific/Chatham" | "Pacific/Apia" | "Pacific/Fakaofo" | "Pacific/Tongatapu" | "Pacific/Kiritimati";
|
|
@@ -26,12 +26,12 @@ export default class LocaleImpl extends AbstractEventEmitter {
|
|
|
26
26
|
this.offset = offset;
|
|
27
27
|
this.currentZone = undefined;
|
|
28
28
|
}
|
|
29
|
-
getTimezoneOffsetMinutes(onDate) {
|
|
29
|
+
getTimezoneOffsetMinutes(onDate, timezone) {
|
|
30
30
|
if (onDate) {
|
|
31
31
|
const dateRoundedToNearestHour = onDate - (onDate % 3600000);
|
|
32
32
|
const key = `${this.getZoneName()}-${dateRoundedToNearestHour}`;
|
|
33
33
|
if (!(key in this.offsetsForDate)) {
|
|
34
|
-
this.offsetsForDate[key] = this.zoneNameToOffsetMinutes(this.getZoneName(), onDate);
|
|
34
|
+
this.offsetsForDate[key] = this.zoneNameToOffsetMinutes(timezone !== null && timezone !== void 0 ? timezone : this.getZoneName(), onDate);
|
|
35
35
|
}
|
|
36
36
|
return this.offsetsForDate[key];
|
|
37
37
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { RRule } from 'rrule';
|
|
2
|
-
import
|
|
2
|
+
import LocaleImpl from '../locales/Locale';
|
|
3
|
+
import { CalendarEvent, TimezoneName } from '../types/calendar.types';
|
|
3
4
|
declare const calendarUtil: {
|
|
4
5
|
freqMapToRRule: {
|
|
5
6
|
weekly: import("rrule").Frequency;
|
|
6
7
|
monthly: import("rrule").Frequency;
|
|
7
8
|
daily: import("rrule").Frequency;
|
|
8
9
|
};
|
|
10
|
+
locale: LocaleImpl;
|
|
9
11
|
weekDaysMapToRRuleDays: {
|
|
10
12
|
mon: import("rrule").Weekday;
|
|
11
13
|
tue: import("rrule").Weekday;
|
|
@@ -15,10 +17,11 @@ declare const calendarUtil: {
|
|
|
15
17
|
sat: import("rrule").Weekday;
|
|
16
18
|
sun: import("rrule").Weekday;
|
|
17
19
|
};
|
|
18
|
-
applyRuleAndGetEvents(e:
|
|
19
|
-
applyRuleAndGetEventsWithoutExclusion(e: Pick<CalendarEvent, 'repeats' | 'repeatsUntil' | 'daysOfWeek' | 'daysOfMonth' | 'interval' | 'startDateTimeMs' | 'occurrences' | 'nthOccurrences' | 'timeBlocks' | 'nthInRepeating' | 'totalInRepeating'>, dateUntil: number): Pick<import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent, "interval" | "startDateTimeMs" | "timeBlocks" | "repeats" | "daysOfWeek" | "daysOfMonth" | "repeatsUntil" | "occurrences" | "nthOccurrences" | "nthInRepeating" | "totalInRepeating">[];
|
|
20
|
-
mapRulesToEvents(rule: RRule, e: Pick<CalendarEvent, 'startDateTimeMs'
|
|
20
|
+
applyRuleAndGetEvents(e: RepeatingCalendarEvent, dateUntil: number, timezone: TimezoneName): Pick<import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent, "interval" | "startDateTimeMs" | "timeBlocks" | "repeats" | "daysOfWeek" | "daysOfMonth" | "repeatsUntil" | "occurrences" | "nthOccurrences" | "nthInRepeating" | "totalInRepeating">[];
|
|
21
|
+
applyRuleAndGetEventsWithoutExclusion(e: Pick<CalendarEvent, 'repeats' | 'repeatsUntil' | 'daysOfWeek' | 'daysOfMonth' | 'interval' | 'startDateTimeMs' | 'occurrences' | 'nthOccurrences' | 'timeBlocks' | 'nthInRepeating' | 'totalInRepeating'>, dateUntil: number, timezone: TimezoneName): Pick<import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent, "interval" | "startDateTimeMs" | "timeBlocks" | "repeats" | "daysOfWeek" | "daysOfMonth" | "repeatsUntil" | "occurrences" | "nthOccurrences" | "nthInRepeating" | "totalInRepeating">[];
|
|
22
|
+
mapRulesToEvents(rule: RRule, e: Pick<CalendarEvent, 'startDateTimeMs'>, timezone: TimezoneName): import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent[];
|
|
21
23
|
isExcluded(e: Pick<CalendarEvent, 'exclusionDates' | 'startDateTimeMs'>): boolean;
|
|
22
|
-
getEventFromRangeByDate(values:
|
|
24
|
+
getEventFromRangeByDate(values: RepeatingCalendarEvent, date: number, timezone: TimezoneName): Pick<import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent, "interval" | "startDateTimeMs" | "timeBlocks" | "repeats" | "daysOfWeek" | "daysOfMonth" | "repeatsUntil" | "occurrences" | "nthOccurrences" | "nthInRepeating" | "totalInRepeating"> | undefined;
|
|
23
25
|
};
|
|
24
26
|
export default calendarUtil;
|
|
27
|
+
export type RepeatingCalendarEvent = Pick<CalendarEvent, 'repeats' | 'repeatsUntil' | 'daysOfWeek' | 'daysOfMonth' | 'interval' | 'startDateTimeMs' | 'occurrences' | 'nthOccurrences' | 'timeBlocks' | 'nthInRepeating' | 'totalInRepeating'>;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { RRule } from 'rrule';
|
|
1
|
+
import { RRule, datetime } from 'rrule';
|
|
2
|
+
import { calculateOffsetAtDate } from '../locales/DateUtilDecorator.js';
|
|
3
|
+
import LocaleImpl from '../locales/Locale.js';
|
|
2
4
|
import dateUtil from './date.utility.js';
|
|
3
5
|
const calendarUtil = {
|
|
4
6
|
freqMapToRRule: {
|
|
@@ -6,6 +8,7 @@ const calendarUtil = {
|
|
|
6
8
|
monthly: RRule.MONTHLY,
|
|
7
9
|
daily: RRule.DAILY,
|
|
8
10
|
},
|
|
11
|
+
locale: new LocaleImpl(),
|
|
9
12
|
weekDaysMapToRRuleDays: {
|
|
10
13
|
mon: RRule.MO,
|
|
11
14
|
tue: RRule.TU,
|
|
@@ -15,12 +18,12 @@ const calendarUtil = {
|
|
|
15
18
|
sat: RRule.SA,
|
|
16
19
|
sun: RRule.SU,
|
|
17
20
|
},
|
|
18
|
-
applyRuleAndGetEvents(e, dateUntil) {
|
|
19
|
-
const events = this.applyRuleAndGetEventsWithoutExclusion(e, dateUntil);
|
|
21
|
+
applyRuleAndGetEvents(e, dateUntil, timezone) {
|
|
22
|
+
const events = this.applyRuleAndGetEventsWithoutExclusion(e, dateUntil, timezone);
|
|
20
23
|
const excludedEvents = events.filter((e) => !this.isExcluded(e));
|
|
21
24
|
return excludedEvents;
|
|
22
25
|
},
|
|
23
|
-
applyRuleAndGetEventsWithoutExclusion(e, dateUntil) {
|
|
26
|
+
applyRuleAndGetEventsWithoutExclusion(e, dateUntil, timezone) {
|
|
24
27
|
var _a, _b, _c, _d;
|
|
25
28
|
let repeatsUntil;
|
|
26
29
|
if (e.repeats) {
|
|
@@ -30,11 +33,16 @@ const calendarUtil = {
|
|
|
30
33
|
else {
|
|
31
34
|
repeatsUntil = dateUntil;
|
|
32
35
|
}
|
|
36
|
+
const offset = this.locale.getTimezoneOffsetMinutes(e.startDateTimeMs, timezone) *
|
|
37
|
+
60 *
|
|
38
|
+
1000;
|
|
39
|
+
const startSplit = dateUtil.splitDate(e.startDateTimeMs + offset);
|
|
40
|
+
const dtstart = datetime(startSplit.year, startSplit.month + 1, startSplit.day, startSplit.hour, startSplit.minute);
|
|
33
41
|
const rule = new RRule({
|
|
34
42
|
freq: this.freqMapToRRule[e.repeats],
|
|
35
43
|
interval: (_a = e.interval) !== null && _a !== void 0 ? _a : 1,
|
|
36
44
|
byweekday: (_b = e.daysOfWeek) === null || _b === void 0 ? void 0 : _b.map((d) => this.weekDaysMapToRRuleDays[d]),
|
|
37
|
-
dtstart
|
|
45
|
+
dtstart,
|
|
38
46
|
bymonthday: (_c = e.daysOfMonth) === null || _c === void 0 ? void 0 : _c.map((d) => parseInt(d)),
|
|
39
47
|
until: new Date(repeatsUntil),
|
|
40
48
|
count: e.occurrences,
|
|
@@ -45,14 +53,19 @@ const calendarUtil = {
|
|
|
45
53
|
return o;
|
|
46
54
|
}),
|
|
47
55
|
});
|
|
48
|
-
const events = this.mapRulesToEvents(rule, e);
|
|
56
|
+
const events = this.mapRulesToEvents(rule, e, timezone);
|
|
49
57
|
return events;
|
|
50
58
|
}
|
|
51
59
|
return [e];
|
|
52
60
|
},
|
|
53
|
-
mapRulesToEvents(rule, e) {
|
|
61
|
+
mapRulesToEvents(rule, e, timezone) {
|
|
54
62
|
const allEvents = rule.all();
|
|
55
|
-
let events = allEvents.map((r, idx) =>
|
|
63
|
+
let events = allEvents.map((r, idx) => {
|
|
64
|
+
const iosDate = dateUtil.splitDate(r.getTime());
|
|
65
|
+
const startDateTimeMs = dateUtil.date(iosDate);
|
|
66
|
+
const offset = calculateOffsetAtDate(iosDate, this.locale, timezone);
|
|
67
|
+
return Object.assign(Object.assign({}, e), { nthInRepeating: idx, totalInRepeating: allEvents.length, startDateTimeMs: startDateTimeMs - offset });
|
|
68
|
+
});
|
|
56
69
|
return events;
|
|
57
70
|
},
|
|
58
71
|
isExcluded(e) {
|
|
@@ -72,10 +85,10 @@ const calendarUtil = {
|
|
|
72
85
|
}
|
|
73
86
|
return false;
|
|
74
87
|
},
|
|
75
|
-
getEventFromRangeByDate(values, date) {
|
|
88
|
+
getEventFromRangeByDate(values, date, timezone) {
|
|
76
89
|
const dateUntil = dateUtil.addYears(new Date().getTime(), 10);
|
|
77
90
|
const searchDate = dateUtil.splitDate(date);
|
|
78
|
-
const repeatingEvents = this.applyRuleAndGetEvents(values, dateUntil);
|
|
91
|
+
const repeatingEvents = this.applyRuleAndGetEvents(values, dateUntil, timezone);
|
|
79
92
|
return repeatingEvents.find((e) => {
|
|
80
93
|
const event = dateUtil.splitDate(e.startDateTimeMs);
|
|
81
94
|
if (searchDate.year === event.year &&
|
|
@@ -4,10 +4,7 @@ import { daysOfWeek } from '../constants.js';
|
|
|
4
4
|
const dateUtil = {
|
|
5
5
|
eventDaysOfWeek: daysOfWeek,
|
|
6
6
|
getStartOfDay(timestamp) {
|
|
7
|
-
|
|
8
|
-
timestamp = new Date().getTime();
|
|
9
|
-
}
|
|
10
|
-
const date = new Date(timestamp);
|
|
7
|
+
const date = timestamp ? new Date(timestamp) : new Date();
|
|
11
8
|
date.setUTCHours(0, 0, 0, 0);
|
|
12
9
|
return date.getTime();
|
|
13
10
|
},
|
|
@@ -528,7 +525,8 @@ const dateUtil = {
|
|
|
528
525
|
format(timestamp, format) {
|
|
529
526
|
const date = new Date(timestamp);
|
|
530
527
|
const offsetMinutes = date.getTimezoneOffset();
|
|
531
|
-
|
|
528
|
+
const offsetMs = timestamp + offsetMinutes * 60 * 1000;
|
|
529
|
+
return formatDate(offsetMs, format);
|
|
532
530
|
},
|
|
533
531
|
formatTime(timestamp) {
|
|
534
532
|
return this.format(timestamp, 'h:mmaaa').replace(':00', '');
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { DateUtil, Locale } from '../types/calendar.types';
|
|
1
|
+
import { DateUtil, Locale, TimezoneName } from '../types/calendar.types';
|
|
2
|
+
import { IDate } from '../utilities/date.utility';
|
|
2
3
|
export default class DateUtilDecorator {
|
|
3
4
|
private locale;
|
|
4
5
|
constructor(locale: Locale);
|
|
@@ -7,3 +8,4 @@ export default class DateUtilDecorator {
|
|
|
7
8
|
private addOffset;
|
|
8
9
|
private calculateOffset;
|
|
9
10
|
}
|
|
11
|
+
export declare function calculateOffsetAtDate(date: IDate, locale: Locale, timezone: TimezoneName): number;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateOffsetAtDate = void 0;
|
|
3
4
|
const schema_1 = require("@sprucelabs/schema");
|
|
4
5
|
const date_fns_tz_1 = require("date-fns-tz");
|
|
5
6
|
class DateUtilDecorator {
|
|
@@ -19,12 +20,8 @@ class DateUtilDecorator {
|
|
|
19
20
|
}
|
|
20
21
|
else {
|
|
21
22
|
value = dateUtil.date(date);
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
.toString()
|
|
25
|
-
.padStart(2, '0')}-${day.toString().padStart(2, '0')}T12:00:00`;
|
|
26
|
-
const zonedDate = (0, date_fns_tz_1.toDate)(dateString).getTime();
|
|
27
|
-
const offset = this.calculateOffset(zonedDate);
|
|
23
|
+
const locale = this.locale;
|
|
24
|
+
const offset = calculateOffsetAtDate(date, locale, locale.getZoneName());
|
|
28
25
|
return value - offset;
|
|
29
26
|
}
|
|
30
27
|
return this.addOffset(value);
|
|
@@ -59,3 +56,13 @@ class DateUtilDecorator {
|
|
|
59
56
|
}
|
|
60
57
|
}
|
|
61
58
|
exports.default = DateUtilDecorator;
|
|
59
|
+
function calculateOffsetAtDate(date, locale, timezone) {
|
|
60
|
+
const { year, month, day } = date;
|
|
61
|
+
const dateString = `${year}-${(month + 1).toString().padStart(2, '0')}-${day
|
|
62
|
+
.toString()
|
|
63
|
+
.padStart(2, '0')}T12:00:00-00:00`;
|
|
64
|
+
const zonedDate = (0, date_fns_tz_1.toDate)(dateString).getTime();
|
|
65
|
+
const offset = locale.getTimezoneOffsetMinutes(zonedDate, timezone) * 60 * 1000;
|
|
66
|
+
return offset;
|
|
67
|
+
}
|
|
68
|
+
exports.calculateOffsetAtDate = calculateOffsetAtDate;
|
|
@@ -8,7 +8,7 @@ export default class LocaleImpl extends AbstractEventEmitter<LocaleContract> imp
|
|
|
8
8
|
private _timezoneChoices?;
|
|
9
9
|
constructor();
|
|
10
10
|
setTimezoneOffsetMinutes(offset: number): void;
|
|
11
|
-
getTimezoneOffsetMinutes(onDate?: number): number;
|
|
11
|
+
getTimezoneOffsetMinutes(onDate?: number, timezone?: TimezoneName): number;
|
|
12
12
|
setZoneName(zone: TimezoneName): Promise<void>;
|
|
13
13
|
getZoneName(): "Pacific/Niue" | "Pacific/Pago_Pago" | "Pacific/Rarotonga" | "Pacific/Honolulu" | "Pacific/Tahiti" | "Pacific/Marquesas" | "Pacific/Gambier" | "America/Adak" | "America/Anchorage" | "America/Juneau" | "America/Metlakatla" | "America/Nome" | "America/Sitka" | "America/Yakutat" | "Pacific/Pitcairn" | "America/Hermosillo" | "America/Dawson_Creek" | "America/Fort_Nelson" | "America/Phoenix" | "America/Los_Angeles" | "America/Tijuana" | "America/Vancouver" | "America/Dawson" | "America/Whitehorse" | "America/Belize" | "America/Costa_Rica" | "America/El_Salvador" | "America/Guatemala" | "America/Managua" | "America/Regina" | "America/Swift_Current" | "America/Tegucigalpa" | "Pacific/Easter" | "Pacific/Galapagos" | "America/Chihuahua" | "America/Mazatlan" | "America/Boise" | "America/Cambridge_Bay" | "America/Denver" | "America/Edmonton" | "America/Inuvik" | "America/Ojinaga" | "America/Yellowknife" | "America/Eirunepe" | "America/Rio_Branco" | "America/Bahia_Banderas" | "America/North_Dakota/Beulah" | "America/North_Dakota/Center" | "America/Chicago" | "America/Indiana/Knox" | "America/Matamoros" | "America/Menominee" | "America/Merida" | "America/Mexico_City" | "America/Monterrey" | "America/North_Dakota/New_Salem" | "America/Rainy_River" | "America/Rankin_Inlet" | "America/Resolute" | "America/Indiana/Tell_City" | "America/Winnipeg" | "America/Bogota" | "America/Cancun" | "America/Jamaica" | "America/Panama" | "America/Guayaquil" | "America/Lima" | "America/Boa_Vista" | "America/Campo_Grande" | "America/Cuiaba" | "America/Manaus" | "America/Porto_Velho" | "America/Barbados" | "America/Martinique" | "America/Puerto_Rico" | "America/Santo_Domingo" | "America/La_Paz" | "America/Santiago" | "America/Havana" | "America/Detroit" | "America/Grand_Turk" | "America/Indiana/Indianapolis" | "America/Iqaluit" | "America/Kentucky/Louisville" | "America/Indiana/Marengo" | "America/Kentucky/Monticello" | "America/New_York" | "America/Nipigon" | "America/Pangnirtung" | "America/Indiana/Petersburg" | "America/Port-au-Prince" | "America/Thunder_Bay" | "America/Toronto" | "America/Indiana/Vevay" | "America/Indiana/Vincennes" | "America/Indiana/Winamac" | "America/Guyana" | "America/Asuncion" | "America/Caracas" | "America/Argentina/Buenos_Aires" | "America/Argentina/Catamarca" | "America/Argentina/Cordoba" | "America/Argentina/Jujuy" | "America/Argentina/La_Rioja" | "America/Argentina/Mendoza" | "America/Argentina/Rio_Gallegos" | "America/Argentina/Salta" | "America/Argentina/San_Juan" | "America/Argentina/San_Luis" | "America/Argentina/Tucuman" | "America/Argentina/Ushuaia" | "Atlantic/Bermuda" | "America/Glace_Bay" | "America/Goose_Bay" | "America/Halifax" | "America/Moncton" | "America/Thule" | "America/Araguaina" | "America/Bahia" | "America/Belem" | "America/Fortaleza" | "America/Maceio" | "America/Recife" | "America/Santarem" | "America/Sao_Paulo" | "Atlantic/Stanley" | "America/Cayenne" | "Antarctica/Palmer" | "America/Punta_Arenas" | "Antarctica/Rothera" | "America/Paramaribo" | "America/Montevideo" | "America/St_Johns" | "America/Noronha" | "Atlantic/South_Georgia" | "America/Miquelon" | "America/Nuuk" | "Atlantic/Cape_Verde" | "Atlantic/Azores" | "UTC" | "America/Scoresbysund" | "Etc/GMT" | "Africa/Abidjan" | "Africa/Bissau" | "America/Danmarkshavn" | "Africa/Monrovia" | "Atlantic/Reykjavik" | "Africa/Sao_Tome" | "Africa/Algiers" | "Africa/Tunis" | "Europe/Dublin" | "Africa/Casablanca" | "Europe/London" | "Africa/Lagos" | "Africa/Ndjamena" | "Atlantic/Canary" | "Atlantic/Faroe" | "Europe/Lisbon" | "Atlantic/Madeira" | "Africa/El_Aaiun" | "Africa/Juba" | "Africa/Khartoum" | "Africa/Maputo" | "Africa/Windhoek" | "Europe/Amsterdam" | "Europe/Andorra" | "Europe/Belgrade" | "Europe/Berlin" | "Europe/Brussels" | "Europe/Budapest" | "Africa/Ceuta" | "Europe/Copenhagen" | "Europe/Gibraltar" | "Europe/Luxembourg" | "Europe/Madrid" | "Europe/Malta" | "Europe/Monaco" | "Europe/Oslo" | "Europe/Paris" | "Europe/Prague" | "Europe/Rome" | "Europe/Stockholm" | "Europe/Tirane" | "Europe/Vienna" | "Europe/Warsaw" | "Europe/Zurich" | "Africa/Cairo" | "Europe/Kaliningrad" | "Africa/Tripoli" | "Africa/Johannesburg" | "Antarctica/Troll" | "Asia/Baghdad" | "Asia/Qatar" | "Asia/Riyadh" | "Africa/Nairobi" | "Asia/Amman" | "Europe/Athens" | "Asia/Beirut" | "Europe/Bucharest" | "Europe/Chisinau" | "Asia/Damascus" | "Asia/Gaza" | "Asia/Hebron" | "Europe/Helsinki" | "Europe/Kiev" | "Asia/Nicosia" | "Europe/Riga" | "Europe/Sofia" | "Europe/Tallinn" | "Europe/Uzhgorod" | "Europe/Vilnius" | "Europe/Zaporozhye" | "Asia/Famagusta" | "Asia/Jerusalem" | "Europe/Kirov" | "Europe/Minsk" | "Europe/Moscow" | "Europe/Simferopol" | "Europe/Istanbul" | "Europe/Volgograd" | "Asia/Yerevan" | "Europe/Astrakhan" | "Asia/Baku" | "Asia/Tbilisi" | "Asia/Dubai" | "Indian/Mauritius" | "Indian/Reunion" | "Europe/Samara" | "Europe/Saratov" | "Indian/Mahe" | "Europe/Ulyanovsk" | "Asia/Kabul" | "Asia/Tehran" | "Indian/Kerguelen" | "Indian/Maldives" | "Antarctica/Mawson" | "Asia/Karachi" | "Asia/Dushanbe" | "Asia/Ashgabat" | "Asia/Samarkand" | "Asia/Tashkent" | "Asia/Aqtau" | "Asia/Aqtobe" | "Asia/Atyrau" | "Asia/Oral" | "Asia/Qyzylorda" | "Asia/Yekaterinburg" | "Asia/Colombo" | "Asia/Kolkata" | "Asia/Kathmandu" | "Asia/Dhaka" | "Asia/Thimphu" | "Asia/Almaty" | "Asia/Qostanay" | "Indian/Chagos" | "Asia/Bishkek" | "Asia/Omsk" | "Asia/Urumqi" | "Antarctica/Vostok" | "Indian/Cocos" | "Asia/Yangon" | "Asia/Barnaul" | "Indian/Christmas" | "Antarctica/Davis" | "Asia/Hovd" | "Asia/Bangkok" | "Asia/Ho_Chi_Minh" | "Asia/Krasnoyarsk" | "Asia/Novokuznetsk" | "Asia/Novosibirsk" | "Asia/Tomsk" | "Asia/Jakarta" | "Asia/Pontianak" | "Australia/Perth" | "Asia/Brunei" | "Asia/Makassar" | "Asia/Macau" | "Asia/Shanghai" | "Asia/Hong_Kong" | "Asia/Irkutsk" | "Asia/Kuala_Lumpur" | "Asia/Kuching" | "Asia/Manila" | "Asia/Singapore" | "Asia/Taipei" | "Asia/Choibalsan" | "Asia/Ulaanbaatar" | "Australia/Eucla" | "Asia/Dili" | "Asia/Jayapura" | "Asia/Tokyo" | "Asia/Pyongyang" | "Asia/Seoul" | "Pacific/Palau" | "Asia/Chita" | "Asia/Khandyga" | "Asia/Yakutsk" | "Australia/Darwin" | "Australia/Adelaide" | "Australia/Broken_Hill" | "Australia/Brisbane" | "Australia/Lindeman" | "Pacific/Guam" | "Pacific/Chuuk" | "Australia/Hobart" | "Antarctica/Macquarie" | "Australia/Melbourne" | "Australia/Sydney" | "Pacific/Port_Moresby" | "Asia/Ust-Nera" | "Asia/Vladivostok" | "Australia/Lord_Howe" | "Pacific/Bougainville" | "Antarctica/Casey" | "Pacific/Kosrae" | "Asia/Magadan" | "Pacific/Noumea" | "Pacific/Norfolk" | "Pacific/Pohnpei" | "Asia/Sakhalin" | "Pacific/Guadalcanal" | "Asia/Srednekolymsk" | "Pacific/Efate" | "Asia/Anadyr" | "Pacific/Fiji" | "Pacific/Tarawa" | "Pacific/Kwajalein" | "Pacific/Majuro" | "Pacific/Nauru" | "Pacific/Auckland" | "Asia/Kamchatka" | "Pacific/Funafuti" | "Pacific/Wake" | "Pacific/Wallis" | "Pacific/Chatham" | "Pacific/Apia" | "Pacific/Fakaofo" | "Pacific/Tongatapu" | "Pacific/Kiritimati";
|
|
14
14
|
offsetMinutesToZoneName(offset: number): "Pacific/Niue" | "Pacific/Pago_Pago" | "Pacific/Rarotonga" | "Pacific/Honolulu" | "Pacific/Tahiti" | "Pacific/Marquesas" | "Pacific/Gambier" | "America/Adak" | "America/Anchorage" | "America/Juneau" | "America/Metlakatla" | "America/Nome" | "America/Sitka" | "America/Yakutat" | "Pacific/Pitcairn" | "America/Hermosillo" | "America/Dawson_Creek" | "America/Fort_Nelson" | "America/Phoenix" | "America/Los_Angeles" | "America/Tijuana" | "America/Vancouver" | "America/Dawson" | "America/Whitehorse" | "America/Belize" | "America/Costa_Rica" | "America/El_Salvador" | "America/Guatemala" | "America/Managua" | "America/Regina" | "America/Swift_Current" | "America/Tegucigalpa" | "Pacific/Easter" | "Pacific/Galapagos" | "America/Chihuahua" | "America/Mazatlan" | "America/Boise" | "America/Cambridge_Bay" | "America/Denver" | "America/Edmonton" | "America/Inuvik" | "America/Ojinaga" | "America/Yellowknife" | "America/Eirunepe" | "America/Rio_Branco" | "America/Bahia_Banderas" | "America/North_Dakota/Beulah" | "America/North_Dakota/Center" | "America/Chicago" | "America/Indiana/Knox" | "America/Matamoros" | "America/Menominee" | "America/Merida" | "America/Mexico_City" | "America/Monterrey" | "America/North_Dakota/New_Salem" | "America/Rainy_River" | "America/Rankin_Inlet" | "America/Resolute" | "America/Indiana/Tell_City" | "America/Winnipeg" | "America/Bogota" | "America/Cancun" | "America/Jamaica" | "America/Panama" | "America/Guayaquil" | "America/Lima" | "America/Boa_Vista" | "America/Campo_Grande" | "America/Cuiaba" | "America/Manaus" | "America/Porto_Velho" | "America/Barbados" | "America/Martinique" | "America/Puerto_Rico" | "America/Santo_Domingo" | "America/La_Paz" | "America/Santiago" | "America/Havana" | "America/Detroit" | "America/Grand_Turk" | "America/Indiana/Indianapolis" | "America/Iqaluit" | "America/Kentucky/Louisville" | "America/Indiana/Marengo" | "America/Kentucky/Monticello" | "America/New_York" | "America/Nipigon" | "America/Pangnirtung" | "America/Indiana/Petersburg" | "America/Port-au-Prince" | "America/Thunder_Bay" | "America/Toronto" | "America/Indiana/Vevay" | "America/Indiana/Vincennes" | "America/Indiana/Winamac" | "America/Guyana" | "America/Asuncion" | "America/Caracas" | "America/Argentina/Buenos_Aires" | "America/Argentina/Catamarca" | "America/Argentina/Cordoba" | "America/Argentina/Jujuy" | "America/Argentina/La_Rioja" | "America/Argentina/Mendoza" | "America/Argentina/Rio_Gallegos" | "America/Argentina/Salta" | "America/Argentina/San_Juan" | "America/Argentina/San_Luis" | "America/Argentina/Tucuman" | "America/Argentina/Ushuaia" | "Atlantic/Bermuda" | "America/Glace_Bay" | "America/Goose_Bay" | "America/Halifax" | "America/Moncton" | "America/Thule" | "America/Araguaina" | "America/Bahia" | "America/Belem" | "America/Fortaleza" | "America/Maceio" | "America/Recife" | "America/Santarem" | "America/Sao_Paulo" | "Atlantic/Stanley" | "America/Cayenne" | "Antarctica/Palmer" | "America/Punta_Arenas" | "Antarctica/Rothera" | "America/Paramaribo" | "America/Montevideo" | "America/St_Johns" | "America/Noronha" | "Atlantic/South_Georgia" | "America/Miquelon" | "America/Nuuk" | "Atlantic/Cape_Verde" | "Atlantic/Azores" | "UTC" | "America/Scoresbysund" | "Etc/GMT" | "Africa/Abidjan" | "Africa/Bissau" | "America/Danmarkshavn" | "Africa/Monrovia" | "Atlantic/Reykjavik" | "Africa/Sao_Tome" | "Africa/Algiers" | "Africa/Tunis" | "Europe/Dublin" | "Africa/Casablanca" | "Europe/London" | "Africa/Lagos" | "Africa/Ndjamena" | "Atlantic/Canary" | "Atlantic/Faroe" | "Europe/Lisbon" | "Atlantic/Madeira" | "Africa/El_Aaiun" | "Africa/Juba" | "Africa/Khartoum" | "Africa/Maputo" | "Africa/Windhoek" | "Europe/Amsterdam" | "Europe/Andorra" | "Europe/Belgrade" | "Europe/Berlin" | "Europe/Brussels" | "Europe/Budapest" | "Africa/Ceuta" | "Europe/Copenhagen" | "Europe/Gibraltar" | "Europe/Luxembourg" | "Europe/Madrid" | "Europe/Malta" | "Europe/Monaco" | "Europe/Oslo" | "Europe/Paris" | "Europe/Prague" | "Europe/Rome" | "Europe/Stockholm" | "Europe/Tirane" | "Europe/Vienna" | "Europe/Warsaw" | "Europe/Zurich" | "Africa/Cairo" | "Europe/Kaliningrad" | "Africa/Tripoli" | "Africa/Johannesburg" | "Antarctica/Troll" | "Asia/Baghdad" | "Asia/Qatar" | "Asia/Riyadh" | "Africa/Nairobi" | "Asia/Amman" | "Europe/Athens" | "Asia/Beirut" | "Europe/Bucharest" | "Europe/Chisinau" | "Asia/Damascus" | "Asia/Gaza" | "Asia/Hebron" | "Europe/Helsinki" | "Europe/Kiev" | "Asia/Nicosia" | "Europe/Riga" | "Europe/Sofia" | "Europe/Tallinn" | "Europe/Uzhgorod" | "Europe/Vilnius" | "Europe/Zaporozhye" | "Asia/Famagusta" | "Asia/Jerusalem" | "Europe/Kirov" | "Europe/Minsk" | "Europe/Moscow" | "Europe/Simferopol" | "Europe/Istanbul" | "Europe/Volgograd" | "Asia/Yerevan" | "Europe/Astrakhan" | "Asia/Baku" | "Asia/Tbilisi" | "Asia/Dubai" | "Indian/Mauritius" | "Indian/Reunion" | "Europe/Samara" | "Europe/Saratov" | "Indian/Mahe" | "Europe/Ulyanovsk" | "Asia/Kabul" | "Asia/Tehran" | "Indian/Kerguelen" | "Indian/Maldives" | "Antarctica/Mawson" | "Asia/Karachi" | "Asia/Dushanbe" | "Asia/Ashgabat" | "Asia/Samarkand" | "Asia/Tashkent" | "Asia/Aqtau" | "Asia/Aqtobe" | "Asia/Atyrau" | "Asia/Oral" | "Asia/Qyzylorda" | "Asia/Yekaterinburg" | "Asia/Colombo" | "Asia/Kolkata" | "Asia/Kathmandu" | "Asia/Dhaka" | "Asia/Thimphu" | "Asia/Almaty" | "Asia/Qostanay" | "Indian/Chagos" | "Asia/Bishkek" | "Asia/Omsk" | "Asia/Urumqi" | "Antarctica/Vostok" | "Indian/Cocos" | "Asia/Yangon" | "Asia/Barnaul" | "Indian/Christmas" | "Antarctica/Davis" | "Asia/Hovd" | "Asia/Bangkok" | "Asia/Ho_Chi_Minh" | "Asia/Krasnoyarsk" | "Asia/Novokuznetsk" | "Asia/Novosibirsk" | "Asia/Tomsk" | "Asia/Jakarta" | "Asia/Pontianak" | "Australia/Perth" | "Asia/Brunei" | "Asia/Makassar" | "Asia/Macau" | "Asia/Shanghai" | "Asia/Hong_Kong" | "Asia/Irkutsk" | "Asia/Kuala_Lumpur" | "Asia/Kuching" | "Asia/Manila" | "Asia/Singapore" | "Asia/Taipei" | "Asia/Choibalsan" | "Asia/Ulaanbaatar" | "Australia/Eucla" | "Asia/Dili" | "Asia/Jayapura" | "Asia/Tokyo" | "Asia/Pyongyang" | "Asia/Seoul" | "Pacific/Palau" | "Asia/Chita" | "Asia/Khandyga" | "Asia/Yakutsk" | "Australia/Darwin" | "Australia/Adelaide" | "Australia/Broken_Hill" | "Australia/Brisbane" | "Australia/Lindeman" | "Pacific/Guam" | "Pacific/Chuuk" | "Australia/Hobart" | "Antarctica/Macquarie" | "Australia/Melbourne" | "Australia/Sydney" | "Pacific/Port_Moresby" | "Asia/Ust-Nera" | "Asia/Vladivostok" | "Australia/Lord_Howe" | "Pacific/Bougainville" | "Antarctica/Casey" | "Pacific/Kosrae" | "Asia/Magadan" | "Pacific/Noumea" | "Pacific/Norfolk" | "Pacific/Pohnpei" | "Asia/Sakhalin" | "Pacific/Guadalcanal" | "Asia/Srednekolymsk" | "Pacific/Efate" | "Asia/Anadyr" | "Pacific/Fiji" | "Pacific/Tarawa" | "Pacific/Kwajalein" | "Pacific/Majuro" | "Pacific/Nauru" | "Pacific/Auckland" | "Asia/Kamchatka" | "Pacific/Funafuti" | "Pacific/Wake" | "Pacific/Wallis" | "Pacific/Chatham" | "Pacific/Apia" | "Pacific/Fakaofo" | "Pacific/Tongatapu" | "Pacific/Kiritimati";
|
package/build/locales/Locale.js
CHANGED
|
@@ -22,12 +22,12 @@ class LocaleImpl extends mercury_event_emitter_1.AbstractEventEmitter {
|
|
|
22
22
|
this.offset = offset;
|
|
23
23
|
this.currentZone = undefined;
|
|
24
24
|
}
|
|
25
|
-
getTimezoneOffsetMinutes(onDate) {
|
|
25
|
+
getTimezoneOffsetMinutes(onDate, timezone) {
|
|
26
26
|
if (onDate) {
|
|
27
27
|
const dateRoundedToNearestHour = onDate - (onDate % 3600000);
|
|
28
28
|
const key = `${this.getZoneName()}-${dateRoundedToNearestHour}`;
|
|
29
29
|
if (!(key in this.offsetsForDate)) {
|
|
30
|
-
this.offsetsForDate[key] = this.zoneNameToOffsetMinutes(this.getZoneName(), onDate);
|
|
30
|
+
this.offsetsForDate[key] = this.zoneNameToOffsetMinutes(timezone !== null && timezone !== void 0 ? timezone : this.getZoneName(), onDate);
|
|
31
31
|
}
|
|
32
32
|
return this.offsetsForDate[key];
|
|
33
33
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { RRule } from 'rrule';
|
|
2
|
-
import
|
|
2
|
+
import LocaleImpl from '../locales/Locale';
|
|
3
|
+
import { CalendarEvent, TimezoneName } from '../types/calendar.types';
|
|
3
4
|
declare const calendarUtil: {
|
|
4
5
|
freqMapToRRule: {
|
|
5
6
|
weekly: import("rrule").Frequency;
|
|
6
7
|
monthly: import("rrule").Frequency;
|
|
7
8
|
daily: import("rrule").Frequency;
|
|
8
9
|
};
|
|
10
|
+
locale: LocaleImpl;
|
|
9
11
|
weekDaysMapToRRuleDays: {
|
|
10
12
|
mon: import("rrule").Weekday;
|
|
11
13
|
tue: import("rrule").Weekday;
|
|
@@ -15,10 +17,11 @@ declare const calendarUtil: {
|
|
|
15
17
|
sat: import("rrule").Weekday;
|
|
16
18
|
sun: import("rrule").Weekday;
|
|
17
19
|
};
|
|
18
|
-
applyRuleAndGetEvents(e:
|
|
19
|
-
applyRuleAndGetEventsWithoutExclusion(e: Pick<CalendarEvent, 'repeats' | 'repeatsUntil' | 'daysOfWeek' | 'daysOfMonth' | 'interval' | 'startDateTimeMs' | 'occurrences' | 'nthOccurrences' | 'timeBlocks' | 'nthInRepeating' | 'totalInRepeating'>, dateUntil: number): Pick<import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent, "startDateTimeMs" | "timeBlocks" | "repeats" | "daysOfWeek" | "daysOfMonth" | "repeatsUntil" | "occurrences" | "interval" | "nthOccurrences" | "nthInRepeating" | "totalInRepeating">[];
|
|
20
|
-
mapRulesToEvents(rule: RRule, e: Pick<CalendarEvent, 'startDateTimeMs'
|
|
20
|
+
applyRuleAndGetEvents(e: RepeatingCalendarEvent, dateUntil: number, timezone: TimezoneName): Pick<import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent, "startDateTimeMs" | "timeBlocks" | "repeats" | "daysOfWeek" | "daysOfMonth" | "repeatsUntil" | "occurrences" | "interval" | "nthOccurrences" | "nthInRepeating" | "totalInRepeating">[];
|
|
21
|
+
applyRuleAndGetEventsWithoutExclusion(e: Pick<CalendarEvent, 'repeats' | 'repeatsUntil' | 'daysOfWeek' | 'daysOfMonth' | 'interval' | 'startDateTimeMs' | 'occurrences' | 'nthOccurrences' | 'timeBlocks' | 'nthInRepeating' | 'totalInRepeating'>, dateUntil: number, timezone: TimezoneName): Pick<import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent, "startDateTimeMs" | "timeBlocks" | "repeats" | "daysOfWeek" | "daysOfMonth" | "repeatsUntil" | "occurrences" | "interval" | "nthOccurrences" | "nthInRepeating" | "totalInRepeating">[];
|
|
22
|
+
mapRulesToEvents(rule: RRule, e: Pick<CalendarEvent, 'startDateTimeMs'>, timezone: TimezoneName): import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent[];
|
|
21
23
|
isExcluded(e: Pick<CalendarEvent, 'exclusionDates' | 'startDateTimeMs'>): boolean;
|
|
22
|
-
getEventFromRangeByDate(values:
|
|
24
|
+
getEventFromRangeByDate(values: RepeatingCalendarEvent, date: number, timezone: TimezoneName): Pick<import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent, "startDateTimeMs" | "timeBlocks" | "repeats" | "daysOfWeek" | "daysOfMonth" | "repeatsUntil" | "occurrences" | "interval" | "nthOccurrences" | "nthInRepeating" | "totalInRepeating"> | undefined;
|
|
23
25
|
};
|
|
24
26
|
export default calendarUtil;
|
|
27
|
+
export type RepeatingCalendarEvent = Pick<CalendarEvent, 'repeats' | 'repeatsUntil' | 'daysOfWeek' | 'daysOfMonth' | 'interval' | 'startDateTimeMs' | 'occurrences' | 'nthOccurrences' | 'timeBlocks' | 'nthInRepeating' | 'totalInRepeating'>;
|
|
@@ -4,6 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const rrule_1 = require("rrule");
|
|
7
|
+
const DateUtilDecorator_1 = require("../locales/DateUtilDecorator");
|
|
8
|
+
const Locale_1 = __importDefault(require("../locales/Locale"));
|
|
7
9
|
const date_utility_1 = __importDefault(require("./date.utility"));
|
|
8
10
|
const calendarUtil = {
|
|
9
11
|
freqMapToRRule: {
|
|
@@ -11,6 +13,7 @@ const calendarUtil = {
|
|
|
11
13
|
monthly: rrule_1.RRule.MONTHLY,
|
|
12
14
|
daily: rrule_1.RRule.DAILY,
|
|
13
15
|
},
|
|
16
|
+
locale: new Locale_1.default(),
|
|
14
17
|
weekDaysMapToRRuleDays: {
|
|
15
18
|
mon: rrule_1.RRule.MO,
|
|
16
19
|
tue: rrule_1.RRule.TU,
|
|
@@ -20,12 +23,12 @@ const calendarUtil = {
|
|
|
20
23
|
sat: rrule_1.RRule.SA,
|
|
21
24
|
sun: rrule_1.RRule.SU,
|
|
22
25
|
},
|
|
23
|
-
applyRuleAndGetEvents(e, dateUntil) {
|
|
24
|
-
const events = this.applyRuleAndGetEventsWithoutExclusion(e, dateUntil);
|
|
26
|
+
applyRuleAndGetEvents(e, dateUntil, timezone) {
|
|
27
|
+
const events = this.applyRuleAndGetEventsWithoutExclusion(e, dateUntil, timezone);
|
|
25
28
|
const excludedEvents = events.filter((e) => !this.isExcluded(e));
|
|
26
29
|
return excludedEvents;
|
|
27
30
|
},
|
|
28
|
-
applyRuleAndGetEventsWithoutExclusion(e, dateUntil) {
|
|
31
|
+
applyRuleAndGetEventsWithoutExclusion(e, dateUntil, timezone) {
|
|
29
32
|
var _a, _b, _c, _d;
|
|
30
33
|
let repeatsUntil;
|
|
31
34
|
if (e.repeats) {
|
|
@@ -35,11 +38,16 @@ const calendarUtil = {
|
|
|
35
38
|
else {
|
|
36
39
|
repeatsUntil = dateUntil;
|
|
37
40
|
}
|
|
41
|
+
const offset = this.locale.getTimezoneOffsetMinutes(e.startDateTimeMs, timezone) *
|
|
42
|
+
60 *
|
|
43
|
+
1000;
|
|
44
|
+
const startSplit = date_utility_1.default.splitDate(e.startDateTimeMs + offset);
|
|
45
|
+
const dtstart = (0, rrule_1.datetime)(startSplit.year, startSplit.month + 1, startSplit.day, startSplit.hour, startSplit.minute);
|
|
38
46
|
const rule = new rrule_1.RRule({
|
|
39
47
|
freq: this.freqMapToRRule[e.repeats],
|
|
40
48
|
interval: (_a = e.interval) !== null && _a !== void 0 ? _a : 1,
|
|
41
49
|
byweekday: (_b = e.daysOfWeek) === null || _b === void 0 ? void 0 : _b.map((d) => this.weekDaysMapToRRuleDays[d]),
|
|
42
|
-
dtstart
|
|
50
|
+
dtstart,
|
|
43
51
|
bymonthday: (_c = e.daysOfMonth) === null || _c === void 0 ? void 0 : _c.map((d) => parseInt(d)),
|
|
44
52
|
until: new Date(repeatsUntil),
|
|
45
53
|
count: e.occurrences,
|
|
@@ -50,14 +58,19 @@ const calendarUtil = {
|
|
|
50
58
|
return o;
|
|
51
59
|
}),
|
|
52
60
|
});
|
|
53
|
-
const events = this.mapRulesToEvents(rule, e);
|
|
61
|
+
const events = this.mapRulesToEvents(rule, e, timezone);
|
|
54
62
|
return events;
|
|
55
63
|
}
|
|
56
64
|
return [e];
|
|
57
65
|
},
|
|
58
|
-
mapRulesToEvents(rule, e) {
|
|
66
|
+
mapRulesToEvents(rule, e, timezone) {
|
|
59
67
|
const allEvents = rule.all();
|
|
60
|
-
let events = allEvents.map((r, idx) =>
|
|
68
|
+
let events = allEvents.map((r, idx) => {
|
|
69
|
+
const iosDate = date_utility_1.default.splitDate(r.getTime());
|
|
70
|
+
const startDateTimeMs = date_utility_1.default.date(iosDate);
|
|
71
|
+
const offset = (0, DateUtilDecorator_1.calculateOffsetAtDate)(iosDate, this.locale, timezone);
|
|
72
|
+
return Object.assign(Object.assign({}, e), { nthInRepeating: idx, totalInRepeating: allEvents.length, startDateTimeMs: startDateTimeMs - offset });
|
|
73
|
+
});
|
|
61
74
|
return events;
|
|
62
75
|
},
|
|
63
76
|
isExcluded(e) {
|
|
@@ -77,10 +90,10 @@ const calendarUtil = {
|
|
|
77
90
|
}
|
|
78
91
|
return false;
|
|
79
92
|
},
|
|
80
|
-
getEventFromRangeByDate(values, date) {
|
|
93
|
+
getEventFromRangeByDate(values, date, timezone) {
|
|
81
94
|
const dateUntil = date_utility_1.default.addYears(new Date().getTime(), 10);
|
|
82
95
|
const searchDate = date_utility_1.default.splitDate(date);
|
|
83
|
-
const repeatingEvents = this.applyRuleAndGetEvents(values, dateUntil);
|
|
96
|
+
const repeatingEvents = this.applyRuleAndGetEvents(values, dateUntil, timezone);
|
|
84
97
|
return repeatingEvents.find((e) => {
|
|
85
98
|
const event = date_utility_1.default.splitDate(e.startDateTimeMs);
|
|
86
99
|
if (searchDate.year === event.year &&
|
|
@@ -6,10 +6,7 @@ const constants_1 = require("../constants");
|
|
|
6
6
|
const dateUtil = {
|
|
7
7
|
eventDaysOfWeek: constants_1.daysOfWeek,
|
|
8
8
|
getStartOfDay(timestamp) {
|
|
9
|
-
|
|
10
|
-
timestamp = new Date().getTime();
|
|
11
|
-
}
|
|
12
|
-
const date = new Date(timestamp);
|
|
9
|
+
const date = timestamp ? new Date(timestamp) : new Date();
|
|
13
10
|
date.setUTCHours(0, 0, 0, 0);
|
|
14
11
|
return date.getTime();
|
|
15
12
|
},
|
|
@@ -530,7 +527,8 @@ const dateUtil = {
|
|
|
530
527
|
format(timestamp, format) {
|
|
531
528
|
const date = new Date(timestamp);
|
|
532
529
|
const offsetMinutes = date.getTimezoneOffset();
|
|
533
|
-
|
|
530
|
+
const offsetMs = timestamp + offsetMinutes * 60 * 1000;
|
|
531
|
+
return (0, date_fns_1.format)(offsetMs, format);
|
|
534
532
|
},
|
|
535
533
|
formatTime(timestamp) {
|
|
536
534
|
return this.format(timestamp, 'h:mmaaa').replace(':00', '');
|