@sprucelabs/calendar-utils 40.0.139 → 40.1.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.
@@ -3,6 +3,7 @@ export { default as dateUtil } from './utilities/date.utility';
3
3
  export * from './utilities/date.utility';
4
4
  export * from './types/calendar.types';
5
5
  export { default as durationUtil } from './utilities/duration.utility';
6
+ export { default as dateAssert } from './utilities/dateAssert';
6
7
  export * from './utilities/duration.utility';
7
8
  export { default as PeopleSorter } from './utilities/PeopleSorter';
8
9
  export { default as LocaleImpl } from './locales/Locale';
@@ -21,3 +22,4 @@ export { default as RepeatingRuleTextGenerator } from './utilities/RepeatingRule
21
22
  export * from './dates';
22
23
  export { SpruceSchemas } from './.spruce/schemas/schemas.types';
23
24
  export * from './constants';
25
+ export { default as DurationUtilBuilder } from './utilities/DurationUtilBuilder';
@@ -3,6 +3,7 @@ export { default as dateUtil } from './utilities/date.utility.js';
3
3
  export * from './utilities/date.utility.js';
4
4
  export * from './types/calendar.types.js';
5
5
  export { default as durationUtil } from './utilities/duration.utility.js';
6
+ export { default as dateAssert } from './utilities/dateAssert.js';
6
7
  export * from './utilities/duration.utility.js';
7
8
  export { default as PeopleSorter } from './utilities/PeopleSorter.js';
8
9
  export { default as LocaleImpl } from './locales/Locale.js';
@@ -20,3 +21,4 @@ export { default as sortTimezoneChoices } from './utilities/sortTimezoneChoices.
20
21
  export { default as RepeatingRuleTextGenerator } from './utilities/RepeatingRuleTextGenerator.js';
21
22
  export * from './dates.js';
22
23
  export * from './constants.js';
24
+ export { default as DurationUtilBuilder } from './utilities/DurationUtilBuilder.js';
@@ -2,6 +2,7 @@ import { timezoneChoices } from '@sprucelabs/spruce-core-schemas';
2
2
  import { SpruceSchemas } from './../.spruce/schemas/schemas.types';
3
3
  import LocaleImpl from '../locales/Locale';
4
4
  import dateUtil from '../utilities/date.utility';
5
+ import durationUtil from '../utilities/duration.utility';
5
6
  type D = typeof dateUtil;
6
7
  /**
7
8
  * @deprecated DateUtils -> DateUtil
@@ -10,6 +11,9 @@ export interface DateUtils extends D {
10
11
  }
11
12
  export interface DateUtil extends D {
12
13
  }
14
+ type Du = typeof durationUtil;
15
+ export interface DurationUtil extends Du {
16
+ }
13
17
  export type CalendarEvent = SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent;
14
18
  export type DayOfWeek = NonNullable<CalendarEvent['daysOfWeek']>[number];
15
19
  export type TimezoneChoices = typeof timezoneChoices;
@@ -0,0 +1,112 @@
1
+ import { TimezoneName } from '../types/calendar.types';
2
+ export default class DurationUtilBuilder {
3
+ static durationUtil: {
4
+ dates: {
5
+ eventDaysOfWeek: {
6
+ sun: string;
7
+ mon: string;
8
+ tue: string;
9
+ wed: string;
10
+ thur: string;
11
+ fri: string;
12
+ sat: string;
13
+ };
14
+ getStartOfDay(timestamp?: number | undefined): number;
15
+ getStartOfWeek(timestamp?: number | undefined): number;
16
+ getEndOfDay(timestamp?: number | undefined): number;
17
+ getEndOfWeek(timestamp: number): number;
18
+ getStartOfMonth(timestamp?: number | undefined): number;
19
+ getEndOfMonth(timestamp?: number | undefined): number;
20
+ addMinutes(startTimestamp: number, minutes: number): number;
21
+ addMilliseconds(startTimestamp: number, ms: number): number;
22
+ addDays(startTimestamp: number, days: number): number;
23
+ addWeeks(startTimestamp: number, weeks: number): number;
24
+ addMonths(timestamp: number, months: number): number;
25
+ addYears(timestamp: number, years: number): number;
26
+ getDurationMs(timestamp: number, endTimestamp: number): number;
27
+ getDurationMinutes(timestamp: number, endTimestamp: number): number;
28
+ getDurationDays(timestamp: number, endTimestamp: number): number;
29
+ getDayOfWeek(timestamp: number): "sun" | "mon" | "tue" | "wed" | "thur" | "fri" | "sat";
30
+ getDayOfWeekIndex(timestamp: number): number;
31
+ splitDate(timestamp: number): {
32
+ year: number;
33
+ month: number;
34
+ day: number;
35
+ hour: number;
36
+ minute: number;
37
+ };
38
+ setTimeOfDay(timestamp: number, hours: number, minutes?: number | undefined, seconds?: number | undefined, milliseconds?: number | undefined): number;
39
+ getDateNDaysFromStartOfDay(days: number, timestamp?: number | undefined): number;
40
+ getDateNMonthsFromStartOfDay(count: number, timestamp?: number | undefined): number;
41
+ getDateNMonthsFromStartOfMonth(count: number, timestamp?: number | undefined): number;
42
+ date(date?: import("./date.utility").IDate | undefined): number;
43
+ format(timestamp: number, format: string): string;
44
+ formatTime(timestamp: number): string;
45
+ formatDate(timestamp: number): string;
46
+ formatDateTime(timestamp: number): string;
47
+ add(timestamp: number, count: number, unit: import("./date.utility").DateUnit): any;
48
+ isSameDay(timestamp1: number, timestamp2: number): boolean;
49
+ getTotalDaysInMonth(year: number, month: number): number;
50
+ };
51
+ msToFriendly(duration: number): string;
52
+ renderDuration(durationMs: number): string;
53
+ dateTimeUntilFriendly(start: number, prefixes?: Partial<import("./duration.utility").TimeUntilOptions> | undefined): string;
54
+ renderDateTimeUntil(beginning: number, end: number, prefixes?: Partial<import("./duration.utility").TimeUntilOptions> | undefined): string;
55
+ renderTimeRange(date1: number, date2: number): string;
56
+ };
57
+ static getForTimezone(timezone: TimezoneName): Promise<{
58
+ dates: {
59
+ eventDaysOfWeek: {
60
+ sun: string;
61
+ mon: string;
62
+ tue: string;
63
+ wed: string;
64
+ thur: string;
65
+ fri: string;
66
+ sat: string;
67
+ };
68
+ getStartOfDay(timestamp?: number | undefined): number;
69
+ getStartOfWeek(timestamp?: number | undefined): number;
70
+ getEndOfDay(timestamp?: number | undefined): number;
71
+ getEndOfWeek(timestamp: number): number;
72
+ getStartOfMonth(timestamp?: number | undefined): number;
73
+ getEndOfMonth(timestamp?: number | undefined): number;
74
+ addMinutes(startTimestamp: number, minutes: number): number;
75
+ addMilliseconds(startTimestamp: number, ms: number): number;
76
+ addDays(startTimestamp: number, days: number): number;
77
+ addWeeks(startTimestamp: number, weeks: number): number;
78
+ addMonths(timestamp: number, months: number): number;
79
+ addYears(timestamp: number, years: number): number;
80
+ getDurationMs(timestamp: number, endTimestamp: number): number;
81
+ getDurationMinutes(timestamp: number, endTimestamp: number): number;
82
+ getDurationDays(timestamp: number, endTimestamp: number): number;
83
+ getDayOfWeek(timestamp: number): "sun" | "mon" | "tue" | "wed" | "thur" | "fri" | "sat";
84
+ getDayOfWeekIndex(timestamp: number): number;
85
+ splitDate(timestamp: number): {
86
+ year: number;
87
+ month: number;
88
+ day: number;
89
+ hour: number;
90
+ minute: number;
91
+ };
92
+ setTimeOfDay(timestamp: number, hours: number, minutes?: number | undefined, seconds?: number | undefined, milliseconds?: number | undefined): number;
93
+ getDateNDaysFromStartOfDay(days: number, timestamp?: number | undefined): number;
94
+ getDateNMonthsFromStartOfDay(count: number, timestamp?: number | undefined): number;
95
+ getDateNMonthsFromStartOfMonth(count: number, timestamp?: number | undefined): number;
96
+ date(date?: import("./date.utility").IDate | undefined): number;
97
+ format(timestamp: number, format: string): string;
98
+ formatTime(timestamp: number): string;
99
+ formatDate(timestamp: number): string;
100
+ formatDateTime(timestamp: number): string;
101
+ add(timestamp: number, count: number, unit: import("./date.utility").DateUnit): any;
102
+ isSameDay(timestamp1: number, timestamp2: number): boolean;
103
+ getTotalDaysInMonth(year: number, month: number): number;
104
+ };
105
+ msToFriendly(duration: number): string;
106
+ renderDuration(durationMs: number): string;
107
+ dateTimeUntilFriendly(start: number, prefixes?: Partial<import("./duration.utility").TimeUntilOptions> | undefined): string;
108
+ renderDateTimeUntil(beginning: number, end: number, prefixes?: Partial<import("./duration.utility").TimeUntilOptions> | undefined): string;
109
+ renderTimeRange(date1: number, date2: number): string;
110
+ }>;
111
+ static reset(): void;
112
+ }
@@ -0,0 +1,29 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import DateUtilDecorator from '../locales/DateUtilDecorator.js';
11
+ import LocaleImpl from '../locales/Locale.js';
12
+ import dateUtil from './date.utility.js';
13
+ import durationUtil from './duration.utility.js';
14
+ class DurationUtilBuilder {
15
+ static getForTimezone(timezone) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const locale = new LocaleImpl();
18
+ yield locale.setZoneName(timezone);
19
+ const durationUtilCopy = Object.assign({}, this.durationUtil);
20
+ durationUtilCopy.dates = new DateUtilDecorator(locale).makeLocaleAware(dateUtil);
21
+ return durationUtilCopy;
22
+ });
23
+ }
24
+ static reset() {
25
+ this.durationUtil = Object.assign({}, durationUtil);
26
+ }
27
+ }
28
+ DurationUtilBuilder.durationUtil = Object.assign({}, durationUtil);
29
+ export default DurationUtilBuilder;
@@ -0,0 +1,6 @@
1
+ import { DateUtil, DurationUtil, TimezoneName } from '../types/calendar.types';
2
+ declare const dateAssert: {
3
+ isLocaleAware(datesOrDuration: DateUtil | DurationUtil): void;
4
+ currentTimezoneEquals(datesOrDuration: DateUtil | DurationUtil, timezone: TimezoneName): void;
5
+ };
6
+ export default dateAssert;
@@ -0,0 +1,29 @@
1
+ import { assert } from '@sprucelabs/test-utils';
2
+ const dateAssert = {
3
+ isLocaleAware(datesOrDuration) {
4
+ //@ts-ignore
5
+ if (datesOrDuration.dates) {
6
+ //@ts-ignore
7
+ this.isLocaleAware(datesOrDuration.dates);
8
+ return;
9
+ }
10
+ assert.isTrue(
11
+ //@ts-ignore
12
+ datesOrDuration.__beenDecorated, `DateUtil is not locale aware. Try using the DateUtilDecorator to make it locale aware.`);
13
+ },
14
+ currentTimezoneEquals(datesOrDuration, timezone) {
15
+ this.isLocaleAware(datesOrDuration);
16
+ //@ts-ignore
17
+ if (datesOrDuration.dates) {
18
+ this.currentTimezoneEquals(
19
+ //@ts-ignore
20
+ datesOrDuration.dates, timezone);
21
+ return;
22
+ }
23
+ //@ts-ignore
24
+ const locale = datesOrDuration.__locale;
25
+ const actual = locale.getZoneName();
26
+ assert.isEqual(actual, timezone, `Timezone is not ${timezone}, it is ${actual}`);
27
+ },
28
+ };
29
+ export default dateAssert;
@@ -1,11 +1,10 @@
1
+ import { TimezoneName } from '../types/calendar.types';
1
2
  declare const durationUtil: {
2
3
  dates: {
3
4
  eventDaysOfWeek: {
4
5
  sun: string;
5
6
  mon: string;
6
- tue: string; /**
7
- * @deprecated durationUtil.msToFriendly(...) -> durationUtil.renderDuration(...)
8
- */
7
+ tue: string;
9
8
  wed: string;
10
9
  thur: string;
11
10
  fri: string;
@@ -56,16 +55,17 @@ declare const durationUtil: {
56
55
  /**
57
56
  * @deprecated durationUtil.dateTimeUntilFriendly(...) -> durationUtil.renderDateTimeUntil(...)
58
57
  */
59
- dateTimeUntilFriendly(start: number, prefixes?: Partial<TimeUntilPrefixOptions>): string;
60
- renderDateTimeUntil(start: number, now: number, prefixes?: Partial<TimeUntilPrefixOptions>): string;
58
+ dateTimeUntilFriendly(start: number, prefixes?: Partial<TimeUntilOptions>): string;
59
+ renderDateTimeUntil(beginning: number, end: number, prefixes?: Partial<TimeUntilOptions>): string;
61
60
  renderTimeRange(date1: number, date2: number): string;
62
61
  };
63
62
  export default durationUtil;
64
- export interface TimeUntilPrefixOptions {
63
+ export interface TimeUntilOptions {
65
64
  yesterday?: string | null;
66
65
  today?: string | null;
67
66
  tomorrow?: string | null;
68
67
  future?: string | null;
69
68
  past?: string | null;
70
69
  shouldCapitalize?: boolean;
70
+ timezoneName?: TimezoneName;
71
71
  }
@@ -38,11 +38,13 @@ const durationUtil = {
38
38
  dateTimeUntilFriendly(start, prefixes) {
39
39
  return this.renderDateTimeUntil(start, new Date().getTime(), prefixes);
40
40
  },
41
- renderDateTimeUntil(start, now, prefixes) {
41
+ renderDateTimeUntil(beginning, end, prefixes) {
42
42
  const { today = null, tomorrow = null, yesterday = null, future = null, past = null, shouldCapitalize, } = prefixes !== null && prefixes !== void 0 ? prefixes : {};
43
43
  let prefix = today;
44
44
  let startDateAndTime = 'today';
45
- const daysFromNow = Math.round((start - now) / (1000 * 3600 * 24));
45
+ const daysFromNow = Math.round((this.dates.getStartOfDay(beginning) -
46
+ this.dates.getStartOfDay(end)) /
47
+ (1000 * 3600 * 24));
46
48
  if (daysFromNow === -1) {
47
49
  prefix = yesterday;
48
50
  startDateAndTime = 'yesterday';
@@ -54,15 +56,17 @@ const durationUtil = {
54
56
  else if (daysFromNow > 1) {
55
57
  prefix = future;
56
58
  startDateAndTime =
57
- this.dates.format(start, 'MMM do') + ` (in ${daysFromNow} days)`;
59
+ this.dates.format(beginning, 'MMM do') +
60
+ ` (in ${daysFromNow} days)`;
58
61
  }
59
62
  else if (daysFromNow < -1) {
60
63
  prefix = past;
61
64
  startDateAndTime =
62
- this.dates.format(start, 'MMM do') +
65
+ this.dates.format(beginning, 'MMM do') +
63
66
  ` (${daysFromNow * -1} days ago)`;
64
67
  }
65
- startDateAndTime += ` @ ${this.dates.format(start, 'h:mmaaa')}`.replace(':00', '');
68
+ startDateAndTime +=
69
+ ` @ ${this.dates.format(beginning, 'h:mmaaa')}`.replace(':00', '');
66
70
  return optionallUcFirst(`${prefix ? `${prefix} ` : ''}${startDateAndTime}`, shouldCapitalize);
67
71
  },
68
72
  renderTimeRange(date1, date2) {
package/build/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export { default as dateUtil } from './utilities/date.utility';
3
3
  export * from './utilities/date.utility';
4
4
  export * from './types/calendar.types';
5
5
  export { default as durationUtil } from './utilities/duration.utility';
6
+ export { default as dateAssert } from './utilities/dateAssert';
6
7
  export * from './utilities/duration.utility';
7
8
  export { default as PeopleSorter } from './utilities/PeopleSorter';
8
9
  export { default as LocaleImpl } from './locales/Locale';
@@ -21,3 +22,4 @@ export { default as RepeatingRuleTextGenerator } from './utilities/RepeatingRule
21
22
  export * from './dates';
22
23
  export { SpruceSchemas } from './.spruce/schemas/schemas.types';
23
24
  export * from './constants';
25
+ export { default as DurationUtilBuilder } from './utilities/DurationUtilBuilder';
package/build/index.js CHANGED
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.RepeatingRuleTextGenerator = exports.sortTimezoneChoices = exports.DateParser = exports.calendarEventLineIconSchema = exports.eventTimeBlockSchema = exports.eventExclusionDateSchema = exports.calendarEventTargetSchema = exports.calendarEventSchema = exports.calculateEventDurationMinutes = exports.calculateEventDurationMillis = exports.TimezoneChoiceSorter = exports.DateUtilDecorator = exports.LocaleImpl = exports.PeopleSorter = exports.durationUtil = exports.dateUtil = exports.calendarUtil = void 0;
20
+ exports.DurationUtilBuilder = exports.RepeatingRuleTextGenerator = exports.sortTimezoneChoices = exports.DateParser = exports.calendarEventLineIconSchema = exports.eventTimeBlockSchema = exports.eventExclusionDateSchema = exports.calendarEventTargetSchema = exports.calendarEventSchema = exports.calculateEventDurationMinutes = exports.calculateEventDurationMillis = exports.TimezoneChoiceSorter = exports.DateUtilDecorator = exports.LocaleImpl = exports.PeopleSorter = exports.dateAssert = exports.durationUtil = exports.dateUtil = exports.calendarUtil = void 0;
21
21
  var calendar_utility_1 = require("./utilities/calendar.utility");
22
22
  Object.defineProperty(exports, "calendarUtil", { enumerable: true, get: function () { return __importDefault(calendar_utility_1).default; } });
23
23
  var date_utility_1 = require("./utilities/date.utility");
@@ -26,6 +26,8 @@ __exportStar(require("./utilities/date.utility"), exports);
26
26
  __exportStar(require("./types/calendar.types"), exports);
27
27
  var duration_utility_1 = require("./utilities/duration.utility");
28
28
  Object.defineProperty(exports, "durationUtil", { enumerable: true, get: function () { return __importDefault(duration_utility_1).default; } });
29
+ var dateAssert_1 = require("./utilities/dateAssert");
30
+ Object.defineProperty(exports, "dateAssert", { enumerable: true, get: function () { return __importDefault(dateAssert_1).default; } });
29
31
  __exportStar(require("./utilities/duration.utility"), exports);
30
32
  var PeopleSorter_1 = require("./utilities/PeopleSorter");
31
33
  Object.defineProperty(exports, "PeopleSorter", { enumerable: true, get: function () { return __importDefault(PeopleSorter_1).default; } });
@@ -57,3 +59,5 @@ var RepeatingRuleTextGenerator_1 = require("./utilities/RepeatingRuleTextGenerat
57
59
  Object.defineProperty(exports, "RepeatingRuleTextGenerator", { enumerable: true, get: function () { return __importDefault(RepeatingRuleTextGenerator_1).default; } });
58
60
  __exportStar(require("./dates"), exports);
59
61
  __exportStar(require("./constants"), exports);
62
+ var DurationUtilBuilder_1 = require("./utilities/DurationUtilBuilder");
63
+ Object.defineProperty(exports, "DurationUtilBuilder", { enumerable: true, get: function () { return __importDefault(DurationUtilBuilder_1).default; } });
@@ -2,6 +2,7 @@ import { timezoneChoices } from '@sprucelabs/spruce-core-schemas';
2
2
  import { SpruceSchemas } from './../.spruce/schemas/schemas.types';
3
3
  import LocaleImpl from '../locales/Locale';
4
4
  import dateUtil from '../utilities/date.utility';
5
+ import durationUtil from '../utilities/duration.utility';
5
6
  type D = typeof dateUtil;
6
7
  /**
7
8
  * @deprecated DateUtils -> DateUtil
@@ -10,6 +11,9 @@ export interface DateUtils extends D {
10
11
  }
11
12
  export interface DateUtil extends D {
12
13
  }
14
+ type Du = typeof durationUtil;
15
+ export interface DurationUtil extends Du {
16
+ }
13
17
  export type CalendarEvent = SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEvent;
14
18
  export type DayOfWeek = NonNullable<CalendarEvent['daysOfWeek']>[number];
15
19
  export type TimezoneChoices = typeof timezoneChoices;
@@ -0,0 +1,112 @@
1
+ import { TimezoneName } from '../types/calendar.types';
2
+ export default class DurationUtilBuilder {
3
+ static durationUtil: {
4
+ dates: {
5
+ eventDaysOfWeek: {
6
+ sun: string;
7
+ mon: string;
8
+ tue: string;
9
+ wed: string;
10
+ thur: string;
11
+ fri: string;
12
+ sat: string;
13
+ };
14
+ getStartOfDay(timestamp?: number | undefined): number;
15
+ getStartOfWeek(timestamp?: number | undefined): number;
16
+ getEndOfDay(timestamp?: number | undefined): number;
17
+ getEndOfWeek(timestamp: number): number;
18
+ getStartOfMonth(timestamp?: number | undefined): number;
19
+ getEndOfMonth(timestamp?: number | undefined): number;
20
+ addMinutes(startTimestamp: number, minutes: number): number;
21
+ addMilliseconds(startTimestamp: number, ms: number): number;
22
+ addDays(startTimestamp: number, days: number): number;
23
+ addWeeks(startTimestamp: number, weeks: number): number;
24
+ addMonths(timestamp: number, months: number): number;
25
+ addYears(timestamp: number, years: number): number;
26
+ getDurationMs(timestamp: number, endTimestamp: number): number;
27
+ getDurationMinutes(timestamp: number, endTimestamp: number): number;
28
+ getDurationDays(timestamp: number, endTimestamp: number): number;
29
+ getDayOfWeek(timestamp: number): "sun" | "mon" | "tue" | "wed" | "thur" | "fri" | "sat";
30
+ getDayOfWeekIndex(timestamp: number): number;
31
+ splitDate(timestamp: number): {
32
+ year: number;
33
+ month: number;
34
+ day: number;
35
+ hour: number;
36
+ minute: number;
37
+ };
38
+ setTimeOfDay(timestamp: number, hours: number, minutes?: number | undefined, seconds?: number | undefined, milliseconds?: number | undefined): number;
39
+ getDateNDaysFromStartOfDay(days: number, timestamp?: number | undefined): number;
40
+ getDateNMonthsFromStartOfDay(count: number, timestamp?: number | undefined): number;
41
+ getDateNMonthsFromStartOfMonth(count: number, timestamp?: number | undefined): number;
42
+ date(date?: import("./date.utility").IDate | undefined): number;
43
+ format(timestamp: number, format: string): string;
44
+ formatTime(timestamp: number): string;
45
+ formatDate(timestamp: number): string;
46
+ formatDateTime(timestamp: number): string;
47
+ add(timestamp: number, count: number, unit: import("./date.utility").DateUnit): any;
48
+ isSameDay(timestamp1: number, timestamp2: number): boolean;
49
+ getTotalDaysInMonth(year: number, month: number): number;
50
+ };
51
+ msToFriendly(duration: number): string;
52
+ renderDuration(durationMs: number): string;
53
+ dateTimeUntilFriendly(start: number, prefixes?: Partial<import("./duration.utility").TimeUntilOptions> | undefined): string;
54
+ renderDateTimeUntil(beginning: number, end: number, prefixes?: Partial<import("./duration.utility").TimeUntilOptions> | undefined): string;
55
+ renderTimeRange(date1: number, date2: number): string;
56
+ };
57
+ static getForTimezone(timezone: TimezoneName): Promise<{
58
+ dates: {
59
+ eventDaysOfWeek: {
60
+ sun: string;
61
+ mon: string;
62
+ tue: string;
63
+ wed: string;
64
+ thur: string;
65
+ fri: string;
66
+ sat: string;
67
+ };
68
+ getStartOfDay(timestamp?: number | undefined): number;
69
+ getStartOfWeek(timestamp?: number | undefined): number;
70
+ getEndOfDay(timestamp?: number | undefined): number;
71
+ getEndOfWeek(timestamp: number): number;
72
+ getStartOfMonth(timestamp?: number | undefined): number;
73
+ getEndOfMonth(timestamp?: number | undefined): number;
74
+ addMinutes(startTimestamp: number, minutes: number): number;
75
+ addMilliseconds(startTimestamp: number, ms: number): number;
76
+ addDays(startTimestamp: number, days: number): number;
77
+ addWeeks(startTimestamp: number, weeks: number): number;
78
+ addMonths(timestamp: number, months: number): number;
79
+ addYears(timestamp: number, years: number): number;
80
+ getDurationMs(timestamp: number, endTimestamp: number): number;
81
+ getDurationMinutes(timestamp: number, endTimestamp: number): number;
82
+ getDurationDays(timestamp: number, endTimestamp: number): number;
83
+ getDayOfWeek(timestamp: number): "sun" | "mon" | "tue" | "wed" | "thur" | "fri" | "sat";
84
+ getDayOfWeekIndex(timestamp: number): number;
85
+ splitDate(timestamp: number): {
86
+ year: number;
87
+ month: number;
88
+ day: number;
89
+ hour: number;
90
+ minute: number;
91
+ };
92
+ setTimeOfDay(timestamp: number, hours: number, minutes?: number | undefined, seconds?: number | undefined, milliseconds?: number | undefined): number;
93
+ getDateNDaysFromStartOfDay(days: number, timestamp?: number | undefined): number;
94
+ getDateNMonthsFromStartOfDay(count: number, timestamp?: number | undefined): number;
95
+ getDateNMonthsFromStartOfMonth(count: number, timestamp?: number | undefined): number;
96
+ date(date?: import("./date.utility").IDate | undefined): number;
97
+ format(timestamp: number, format: string): string;
98
+ formatTime(timestamp: number): string;
99
+ formatDate(timestamp: number): string;
100
+ formatDateTime(timestamp: number): string;
101
+ add(timestamp: number, count: number, unit: import("./date.utility").DateUnit): any;
102
+ isSameDay(timestamp1: number, timestamp2: number): boolean;
103
+ getTotalDaysInMonth(year: number, month: number): number;
104
+ };
105
+ msToFriendly(duration: number): string;
106
+ renderDuration(durationMs: number): string;
107
+ dateTimeUntilFriendly(start: number, prefixes?: Partial<import("./duration.utility").TimeUntilOptions> | undefined): string;
108
+ renderDateTimeUntil(beginning: number, end: number, prefixes?: Partial<import("./duration.utility").TimeUntilOptions> | undefined): string;
109
+ renderTimeRange(date1: number, date2: number): string;
110
+ }>;
111
+ static reset(): void;
112
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const DateUtilDecorator_1 = __importDefault(require("../locales/DateUtilDecorator"));
7
+ const Locale_1 = __importDefault(require("../locales/Locale"));
8
+ const date_utility_1 = __importDefault(require("./date.utility"));
9
+ const duration_utility_1 = __importDefault(require("./duration.utility"));
10
+ class DurationUtilBuilder {
11
+ static async getForTimezone(timezone) {
12
+ const locale = new Locale_1.default();
13
+ await locale.setZoneName(timezone);
14
+ const durationUtilCopy = { ...this.durationUtil };
15
+ durationUtilCopy.dates = new DateUtilDecorator_1.default(locale).makeLocaleAware(date_utility_1.default);
16
+ return durationUtilCopy;
17
+ }
18
+ static reset() {
19
+ this.durationUtil = { ...duration_utility_1.default };
20
+ }
21
+ }
22
+ DurationUtilBuilder.durationUtil = { ...duration_utility_1.default };
23
+ exports.default = DurationUtilBuilder;
@@ -0,0 +1,6 @@
1
+ import { DateUtil, DurationUtil, TimezoneName } from '../types/calendar.types';
2
+ declare const dateAssert: {
3
+ isLocaleAware(datesOrDuration: DateUtil | DurationUtil): void;
4
+ currentTimezoneEquals(datesOrDuration: DateUtil | DurationUtil, timezone: TimezoneName): void;
5
+ };
6
+ export default dateAssert;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_utils_1 = require("@sprucelabs/test-utils");
4
+ const dateAssert = {
5
+ isLocaleAware(datesOrDuration) {
6
+ //@ts-ignore
7
+ if (datesOrDuration.dates) {
8
+ //@ts-ignore
9
+ this.isLocaleAware(datesOrDuration.dates);
10
+ return;
11
+ }
12
+ test_utils_1.assert.isTrue(
13
+ //@ts-ignore
14
+ datesOrDuration.__beenDecorated, `DateUtil is not locale aware. Try using the DateUtilDecorator to make it locale aware.`);
15
+ },
16
+ currentTimezoneEquals(datesOrDuration, timezone) {
17
+ this.isLocaleAware(datesOrDuration);
18
+ //@ts-ignore
19
+ if (datesOrDuration.dates) {
20
+ this.currentTimezoneEquals(
21
+ //@ts-ignore
22
+ datesOrDuration.dates, timezone);
23
+ return;
24
+ }
25
+ //@ts-ignore
26
+ const locale = datesOrDuration.__locale;
27
+ const actual = locale.getZoneName();
28
+ test_utils_1.assert.isEqual(actual, timezone, `Timezone is not ${timezone}, it is ${actual}`);
29
+ },
30
+ };
31
+ exports.default = dateAssert;
@@ -1,11 +1,10 @@
1
+ import { TimezoneName } from '../types/calendar.types';
1
2
  declare const durationUtil: {
2
3
  dates: {
3
4
  eventDaysOfWeek: {
4
5
  sun: string;
5
6
  mon: string;
6
- tue: string; /**
7
- * @deprecated durationUtil.msToFriendly(...) -> durationUtil.renderDuration(...)
8
- */
7
+ tue: string;
9
8
  wed: string;
10
9
  thur: string;
11
10
  fri: string;
@@ -56,16 +55,17 @@ declare const durationUtil: {
56
55
  /**
57
56
  * @deprecated durationUtil.dateTimeUntilFriendly(...) -> durationUtil.renderDateTimeUntil(...)
58
57
  */
59
- dateTimeUntilFriendly(start: number, prefixes?: Partial<TimeUntilPrefixOptions>): string;
60
- renderDateTimeUntil(start: number, now: number, prefixes?: Partial<TimeUntilPrefixOptions>): string;
58
+ dateTimeUntilFriendly(start: number, prefixes?: Partial<TimeUntilOptions>): string;
59
+ renderDateTimeUntil(beginning: number, end: number, prefixes?: Partial<TimeUntilOptions>): string;
61
60
  renderTimeRange(date1: number, date2: number): string;
62
61
  };
63
62
  export default durationUtil;
64
- export interface TimeUntilPrefixOptions {
63
+ export interface TimeUntilOptions {
65
64
  yesterday?: string | null;
66
65
  today?: string | null;
67
66
  tomorrow?: string | null;
68
67
  future?: string | null;
69
68
  past?: string | null;
70
69
  shouldCapitalize?: boolean;
70
+ timezoneName?: TimezoneName;
71
71
  }
@@ -43,11 +43,13 @@ const durationUtil = {
43
43
  dateTimeUntilFriendly(start, prefixes) {
44
44
  return this.renderDateTimeUntil(start, new Date().getTime(), prefixes);
45
45
  },
46
- renderDateTimeUntil(start, now, prefixes) {
46
+ renderDateTimeUntil(beginning, end, prefixes) {
47
47
  const { today = null, tomorrow = null, yesterday = null, future = null, past = null, shouldCapitalize, } = prefixes !== null && prefixes !== void 0 ? prefixes : {};
48
48
  let prefix = today;
49
49
  let startDateAndTime = 'today';
50
- const daysFromNow = Math.round((start - now) / (1000 * 3600 * 24));
50
+ const daysFromNow = Math.round((this.dates.getStartOfDay(beginning) -
51
+ this.dates.getStartOfDay(end)) /
52
+ (1000 * 3600 * 24));
51
53
  if (daysFromNow === -1) {
52
54
  prefix = yesterday;
53
55
  startDateAndTime = 'yesterday';
@@ -59,15 +61,17 @@ const durationUtil = {
59
61
  else if (daysFromNow > 1) {
60
62
  prefix = future;
61
63
  startDateAndTime =
62
- this.dates.format(start, 'MMM do') + ` (in ${daysFromNow} days)`;
64
+ this.dates.format(beginning, 'MMM do') +
65
+ ` (in ${daysFromNow} days)`;
63
66
  }
64
67
  else if (daysFromNow < -1) {
65
68
  prefix = past;
66
69
  startDateAndTime =
67
- this.dates.format(start, 'MMM do') +
70
+ this.dates.format(beginning, 'MMM do') +
68
71
  ` (${daysFromNow * -1} days ago)`;
69
72
  }
70
- startDateAndTime += ` @ ${this.dates.format(start, 'h:mmaaa')}`.replace(':00', '');
73
+ startDateAndTime +=
74
+ ` @ ${this.dates.format(beginning, 'h:mmaaa')}`.replace(':00', '');
71
75
  return optionallUcFirst(`${prefix ? `${prefix} ` : ''}${startDateAndTime}`, shouldCapitalize);
72
76
  },
73
77
  renderTimeRange(date1, date2) {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "40.0.139",
6
+ "version": "40.1.0",
7
7
  "files": [
8
8
  "build/**/*",
9
9
  "!build/__tests__",