@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.
- package/build/esm/index.d.ts +2 -0
- package/build/esm/index.js +2 -0
- package/build/esm/types/calendar.types.d.ts +4 -0
- package/build/esm/utilities/DurationUtilBuilder.d.ts +112 -0
- package/build/esm/utilities/DurationUtilBuilder.js +29 -0
- package/build/esm/utilities/dateAssert.d.ts +6 -0
- package/build/esm/utilities/dateAssert.js +29 -0
- package/build/esm/utilities/duration.utility.d.ts +6 -6
- package/build/esm/utilities/duration.utility.js +9 -5
- package/build/index.d.ts +2 -0
- package/build/index.js +5 -1
- package/build/types/calendar.types.d.ts +4 -0
- package/build/utilities/DurationUtilBuilder.d.ts +112 -0
- package/build/utilities/DurationUtilBuilder.js +23 -0
- package/build/utilities/dateAssert.d.ts +6 -0
- package/build/utilities/dateAssert.js +31 -0
- package/build/utilities/duration.utility.d.ts +6 -6
- package/build/utilities/duration.utility.js +9 -5
- package/package.json +1 -1
package/build/esm/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/esm/index.js
CHANGED
|
@@ -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<
|
|
60
|
-
renderDateTimeUntil(
|
|
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
|
|
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(
|
|
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((
|
|
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(
|
|
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(
|
|
65
|
+
this.dates.format(beginning, 'MMM do') +
|
|
63
66
|
` (${daysFromNow * -1} days ago)`;
|
|
64
67
|
}
|
|
65
|
-
startDateAndTime +=
|
|
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<
|
|
60
|
-
renderDateTimeUntil(
|
|
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
|
|
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(
|
|
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((
|
|
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(
|
|
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(
|
|
70
|
+
this.dates.format(beginning, 'MMM do') +
|
|
68
71
|
` (${daysFromNow * -1} days ago)`;
|
|
69
72
|
}
|
|
70
|
-
startDateAndTime +=
|
|
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) {
|