@sprucelabs/calendar-utils 38.0.158 → 39.0.1

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.
@@ -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 { year, month, day } = date;
21
- const dateString = `${year}-${(month + 1)
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,14 @@ export default class LocaleImpl extends AbstractEventEmitter {
26
26
  this.offset = offset;
27
27
  this.currentZone = undefined;
28
28
  }
29
- getTimezoneOffsetMinutes(onDate) {
30
- if (onDate) {
31
- const dateRoundedToNearestHour = onDate - (onDate % 3600000);
32
- const key = `${this.getZoneName()}-${dateRoundedToNearestHour}`;
29
+ getTimezoneOffsetMinutes(onDate, timezone) {
30
+ if (onDate || timezone) {
31
+ const date = onDate ? onDate : Date.now();
32
+ const dateRoundedToNearestHour = date - (date % 3600000);
33
+ const zone = timezone !== null && timezone !== void 0 ? timezone : this.getZoneName();
34
+ const key = `${zone}-${dateRoundedToNearestHour}`;
33
35
  if (!(key in this.offsetsForDate)) {
34
- this.offsetsForDate[key] = this.zoneNameToOffsetMinutes(this.getZoneName(), onDate);
36
+ this.offsetsForDate[key] = this.zoneNameToOffsetMinutes(zone, onDate);
35
37
  }
36
38
  return this.offsetsForDate[key];
37
39
  }
@@ -1,11 +1,13 @@
1
1
  import { RRule } from 'rrule';
2
- import { CalendarEvent } from '../types/calendar.types';
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: 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">[];
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'>): import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent[];
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: Pick<CalendarEvent, 'repeats' | 'repeatsUntil' | 'daysOfWeek' | 'daysOfMonth' | 'interval' | 'startDateTimeMs' | 'occurrences' | 'nthOccurrences' | 'timeBlocks' | 'nthInRepeating' | 'totalInRepeating'>, date: number): Pick<import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent, "interval" | "startDateTimeMs" | "timeBlocks" | "repeats" | "daysOfWeek" | "daysOfMonth" | "repeatsUntil" | "occurrences" | "nthOccurrences" | "nthInRepeating" | "totalInRepeating"> | undefined;
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: new Date(e.startDateTimeMs),
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) => (Object.assign(Object.assign({}, e), { nthInRepeating: idx, totalInRepeating: allEvents.length, startDateTimeMs: r.getTime() })));
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
- if (!timestamp) {
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
- return formatDate(timestamp + offsetMinutes * 60 * 1000, format);
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 { year, month, day } = date;
23
- const dateString = `${year}-${(month + 1)
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";
@@ -22,12 +22,14 @@ class LocaleImpl extends mercury_event_emitter_1.AbstractEventEmitter {
22
22
  this.offset = offset;
23
23
  this.currentZone = undefined;
24
24
  }
25
- getTimezoneOffsetMinutes(onDate) {
26
- if (onDate) {
27
- const dateRoundedToNearestHour = onDate - (onDate % 3600000);
28
- const key = `${this.getZoneName()}-${dateRoundedToNearestHour}`;
25
+ getTimezoneOffsetMinutes(onDate, timezone) {
26
+ if (onDate || timezone) {
27
+ const date = onDate ? onDate : Date.now();
28
+ const dateRoundedToNearestHour = date - (date % 3600000);
29
+ const zone = timezone !== null && timezone !== void 0 ? timezone : this.getZoneName();
30
+ const key = `${zone}-${dateRoundedToNearestHour}`;
29
31
  if (!(key in this.offsetsForDate)) {
30
- this.offsetsForDate[key] = this.zoneNameToOffsetMinutes(this.getZoneName(), onDate);
32
+ this.offsetsForDate[key] = this.zoneNameToOffsetMinutes(zone, onDate);
31
33
  }
32
34
  return this.offsetsForDate[key];
33
35
  }
@@ -1,11 +1,13 @@
1
1
  import { RRule } from 'rrule';
2
- import { CalendarEvent } from '../types/calendar.types';
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: 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">[];
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'>): import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent[];
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: Pick<CalendarEvent, 'repeats' | 'repeatsUntil' | 'daysOfWeek' | 'daysOfMonth' | 'interval' | 'startDateTimeMs' | 'occurrences' | 'nthOccurrences' | 'timeBlocks' | 'nthInRepeating' | 'totalInRepeating'>, date: number): Pick<import("@sprucelabs/spruce-core-schemas").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent, "startDateTimeMs" | "timeBlocks" | "repeats" | "daysOfWeek" | "daysOfMonth" | "repeatsUntil" | "occurrences" | "interval" | "nthOccurrences" | "nthInRepeating" | "totalInRepeating"> | undefined;
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: new Date(e.startDateTimeMs),
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) => (Object.assign(Object.assign({}, e), { nthInRepeating: idx, totalInRepeating: allEvents.length, startDateTimeMs: r.getTime() })));
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
- if (!timestamp) {
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
- return (0, date_fns_1.format)(timestamp + offsetMinutes * 60 * 1000, format);
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', '');
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "38.0.158",
6
+ "version": "39.0.1",
7
7
  "files": [
8
8
  "build/**/*",
9
9
  "!build/__tests__",