@bash-app/bash-common 30.198.0 → 30.201.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/utils/__tests__/recurrenceUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/recurrenceUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/recurrenceUtils.test.js +65 -0
- package/dist/utils/__tests__/recurrenceUtils.test.js.map +1 -0
- package/dist/utils/recurrenceUtils.d.ts +12 -0
- package/dist/utils/recurrenceUtils.d.ts.map +1 -1
- package/dist/utils/recurrenceUtils.js +47 -0
- package/dist/utils/recurrenceUtils.js.map +1 -1
- package/package.json +1 -1
- package/prisma/schema.prisma +4 -0
- package/src/utils/__tests__/recurrenceUtils.test.ts +96 -0
- package/src/utils/recurrenceUtils.ts +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurrenceUtils.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/recurrenceUtils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { RecurrenceEndsType, RecurringFrequency, } from "@prisma/client";
|
|
2
|
+
import { DateTime } from "luxon";
|
|
3
|
+
import { getCompactRunFirstAndLastOccurrence, getRecurringBashEventPossibleLuxonTimes, } from "../recurrenceUtils.js";
|
|
4
|
+
function buildRecurrence(partial) {
|
|
5
|
+
return {
|
|
6
|
+
id: "r1",
|
|
7
|
+
bashEventId: "e1",
|
|
8
|
+
interval: 1,
|
|
9
|
+
frequency: RecurringFrequency.Daily,
|
|
10
|
+
ends: null,
|
|
11
|
+
repeatCount: 3,
|
|
12
|
+
endsType: RecurrenceEndsType.AFTER_COUNT,
|
|
13
|
+
repeatOnDays: [],
|
|
14
|
+
repeatOnDayOfMonth: null,
|
|
15
|
+
repeatYearlyDate: null,
|
|
16
|
+
createdAt: new Date(),
|
|
17
|
+
updatedAt: new Date(),
|
|
18
|
+
...partial,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
describe("getCompactRunFirstAndLastOccurrence", () => {
|
|
22
|
+
it("returns first and last occurrence for a 3-night daily run (same-day start/end)", () => {
|
|
23
|
+
// Daily recurrence without `ends` only expands ~1 year from local "now"; keep the event in that window.
|
|
24
|
+
const base = DateTime.utc().plus({ weeks: 2 }).startOf("day");
|
|
25
|
+
const start = base.set({ hour: 20, minute: 0, second: 0, millisecond: 0 }).toJSDate();
|
|
26
|
+
const end = base.set({ hour: 22, minute: 0, second: 0, millisecond: 0 }).toJSDate();
|
|
27
|
+
const recurrence = buildRecurrence({
|
|
28
|
+
frequency: RecurringFrequency.Daily,
|
|
29
|
+
interval: 1,
|
|
30
|
+
repeatCount: 3,
|
|
31
|
+
endsType: RecurrenceEndsType.AFTER_COUNT,
|
|
32
|
+
});
|
|
33
|
+
expect(recurrence.frequency).toBe(RecurringFrequency.Daily);
|
|
34
|
+
const occ = getRecurringBashEventPossibleLuxonTimes(start, recurrence);
|
|
35
|
+
expect(occ.length).toBeGreaterThanOrEqual(2);
|
|
36
|
+
const result = getCompactRunFirstAndLastOccurrence(start, end, recurrence, "UTC");
|
|
37
|
+
expect(result).not.toBeNull();
|
|
38
|
+
expect(result.first.toISODate()).toBe(base.toISODate());
|
|
39
|
+
expect(result.last.toISODate()).toBe(base.plus({ days: 2 }).toISODate());
|
|
40
|
+
});
|
|
41
|
+
it("returns null when start and end are on different calendar days (continuous span)", () => {
|
|
42
|
+
const start = new Date("2026-04-03T20:00:00.000Z");
|
|
43
|
+
const end = new Date("2026-04-05T22:00:00.000Z");
|
|
44
|
+
const recurrence = buildRecurrence({});
|
|
45
|
+
expect(getCompactRunFirstAndLastOccurrence(start, end, recurrence, "UTC")).toBeNull();
|
|
46
|
+
});
|
|
47
|
+
it("returns null for weekly recurrence", () => {
|
|
48
|
+
const start = new Date("2026-04-03T20:00:00.000Z");
|
|
49
|
+
const end = new Date("2026-04-03T22:00:00.000Z");
|
|
50
|
+
const recurrence = buildRecurrence({
|
|
51
|
+
frequency: RecurringFrequency.Weekly,
|
|
52
|
+
repeatOnDays: [],
|
|
53
|
+
});
|
|
54
|
+
expect(getCompactRunFirstAndLastOccurrence(start, end, recurrence, "UTC")).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
it("returns null for a single extra occurrence", () => {
|
|
57
|
+
const start = new Date("2026-04-03T20:00:00.000Z");
|
|
58
|
+
const end = new Date("2026-04-03T22:00:00.000Z");
|
|
59
|
+
const recurrence = buildRecurrence({
|
|
60
|
+
repeatCount: 1,
|
|
61
|
+
});
|
|
62
|
+
expect(getCompactRunFirstAndLastOccurrence(start, end, recurrence, "UTC")).toBeNull();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=recurrenceUtils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurrenceUtils.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/recurrenceUtils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,18 @@ import { DateTime } from "luxon";
|
|
|
3
3
|
import { DateTimeArgType } from "../definitions.js";
|
|
4
4
|
export declare function getRecurringBashEventPossibleDateTimes(startDateTime: DateTimeArgType, recurrence: Recurrence | undefined | null): Date[];
|
|
5
5
|
export declare function getRecurringBashEventPossibleLuxonTimes(startDateTime: DateTimeArgType, recurrence: Recurrence | undefined | null): DateTime[];
|
|
6
|
+
/**
|
|
7
|
+
* For a daily run-of-shows (same start/end clock each night), returns the first and last
|
|
8
|
+
* occurrence instants so UIs can show "Apr 3–5" instead of the first day plus "+N more".
|
|
9
|
+
*
|
|
10
|
+
* Returns null unless: Daily interval 1, `endDateTime` on the same calendar day as
|
|
11
|
+
* `startDateTime` (per-show duration), and all generated occurrences are on consecutive
|
|
12
|
+
* calendar days in `eventTimezone`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getCompactRunFirstAndLastOccurrence(startDateTime: DateTimeArgType, endDateTime: DateTimeArgType | null | undefined, recurrence: Recurrence | undefined | null, eventTimezone?: string | null): {
|
|
15
|
+
first: DateTime;
|
|
16
|
+
last: DateTime;
|
|
17
|
+
} | null;
|
|
6
18
|
export declare function freqToGrammarString(freq: RecurringFrequency, interval: number | undefined, toLowerCase?: boolean): string;
|
|
7
19
|
export declare function findEarliestPossibleBashEventDate(startDateTimeArg: DateTimeArgType): DateTime | undefined;
|
|
8
20
|
//# sourceMappingURL=recurrenceUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recurrenceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/recurrenceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAUpD,wBAAgB,sCAAsC,CACpD,aAAa,EAAE,eAAe,EAC9B,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GACxC,IAAI,EAAE,CAMR;AAED,wBAAgB,uCAAuC,CACrD,aAAa,EAAE,eAAe,EAC9B,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GACxC,QAAQ,EAAE,CAMZ;AAwQD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CAqBR;AAED,wBAAgB,iCAAiC,CAC/C,gBAAgB,EAAE,eAAe,GAChC,QAAQ,GAAG,SAAS,CAEtB"}
|
|
1
|
+
{"version":3,"file":"recurrenceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/recurrenceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAUpD,wBAAgB,sCAAsC,CACpD,aAAa,EAAE,eAAe,EAC9B,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GACxC,IAAI,EAAE,CAMR;AAED,wBAAgB,uCAAuC,CACrD,aAAa,EAAE,eAAe,EAC9B,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GACxC,QAAQ,EAAE,CAMZ;AAwQD;;;;;;;GAOG;AACH,wBAAgB,mCAAmC,CACjD,aAAa,EAAE,eAAe,EAC9B,WAAW,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC/C,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,EACzC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CA8C5C;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CAqBR;AAED,wBAAgB,iCAAiC,CAC/C,gBAAgB,EAAE,eAAe,GAChC,QAAQ,GAAG,SAAS,CAEtB"}
|
|
@@ -203,6 +203,53 @@ function getYearlyRecurringDates(beginningDateTime, recurrence) {
|
|
|
203
203
|
}
|
|
204
204
|
return recurrenceDates;
|
|
205
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* For a daily run-of-shows (same start/end clock each night), returns the first and last
|
|
208
|
+
* occurrence instants so UIs can show "Apr 3–5" instead of the first day plus "+N more".
|
|
209
|
+
*
|
|
210
|
+
* Returns null unless: Daily interval 1, `endDateTime` on the same calendar day as
|
|
211
|
+
* `startDateTime` (per-show duration), and all generated occurrences are on consecutive
|
|
212
|
+
* calendar days in `eventTimezone`.
|
|
213
|
+
*/
|
|
214
|
+
export function getCompactRunFirstAndLastOccurrence(startDateTime, endDateTime, recurrence, eventTimezone) {
|
|
215
|
+
if (!recurrence || recurrence.frequency !== RecurringFrequency.Daily) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
if ((recurrence.interval ?? 1) !== 1) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
if (!startDateTime || !endDateTime) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
const zone = eventTimezone?.trim() || undefined;
|
|
225
|
+
const z = zone ?? "local";
|
|
226
|
+
// Use wall-time in the event zone (not dateTimeFromDate default local interpretation only).
|
|
227
|
+
const start = DateTime.fromJSDate(startDateTime instanceof Date
|
|
228
|
+
? startDateTime
|
|
229
|
+
: new Date(startDateTime)).setZone(z);
|
|
230
|
+
const end = DateTime.fromJSDate(endDateTime instanceof Date
|
|
231
|
+
? endDateTime
|
|
232
|
+
: new Date(endDateTime)).setZone(z);
|
|
233
|
+
if (!start.hasSame(end, "day")) {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
const occ = getRecurringBashEventPossibleLuxonTimes(startDateTime, recurrence);
|
|
237
|
+
if (occ.length < 2) {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
const sorted = [...occ].sort((a, b) => a.toMillis() - b.toMillis());
|
|
241
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
242
|
+
const prevDay = sorted[i - 1].setZone(z).startOf("day");
|
|
243
|
+
const currDay = sorted[i].setZone(z).startOf("day");
|
|
244
|
+
if (!prevDay.plus({ days: 1 }).equals(currDay)) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
first: sorted[0].setZone(z),
|
|
250
|
+
last: sorted[sorted.length - 1].setZone(z),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
206
253
|
export function freqToGrammarString(freq, interval, toLowerCase = false) {
|
|
207
254
|
if (!interval) {
|
|
208
255
|
return freq;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recurrenceUtils.js","sourceRoot":"","sources":["../../src/utils/recurrenceUtils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"recurrenceUtils.js","sourceRoot":"","sources":["../../src/utils/recurrenceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAEjD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,8BAA8B,GAC/B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,UAAU,sCAAsC,CACpD,aAA8B,EAC9B,UAAyC;IAEzC,OAAO,+CAA+C,CACpD,aAAa,EACb,UAAU,EACV,IAAI,CACK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,aAA8B,EAC9B,UAAyC;IAEzC,OAAO,+CAA+C,CACpD,aAAa,EACb,UAAU,EACV,KAAK,CACQ,CAAC;AAClB,CAAC;AAED,SAAS,+CAA+C,CACtD,aAA8B,EAC9B,UAAyC,EACzC,MAAe;IAEf,IACE,CAAC,UAAU;QACX,CAAC,UAAU,CAAC,SAAS;QACrB,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,KAAK,EACjD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,eAAe,GAAe,EAAE,CAAC;IAErC,0EAA0E;IAC1E,kEAAkE;IAClE,MAAM,kBAAkB,GACtB,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,OAAO;QACnD,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,MAAM,CAAC;IAErD,MAAM,aAAa,GAAG,kBAAkB;QACtC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClF,CAAC,CAAC,iCAAiC,CAAC,aAAa,CAAa,CAAC;IAEjE,QAAQ,UAAU,CAAC,SAAS,EAAE,CAAC;QAC7B,KAAK,kBAAkB,CAAC,KAAK;YAC3B,eAAe,GAAG,sBAAsB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACpE,MAAM;QACR,KAAK,kBAAkB,CAAC,MAAM;YAC5B,eAAe,GAAG,uBAAuB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACrE,MAAM;QACR,KAAK,kBAAkB,CAAC,OAAO;YAC7B,eAAe,GAAG,wBAAwB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACtE,MAAM;QACR,KAAK,kBAAkB,CAAC,MAAM;YAC5B,eAAe,GAAG,uBAAuB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACrE,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,0BAA0B,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,8DAA8D;IAC9D,IAAI,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QACzD,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,eAAe;SACnB,GAAG,CAAC,CAAC,IAAc,EAAU,EAAE,CAC9B,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAC9C;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,OAAe,EAAmB,EAAE;QACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CACnC,OAAO,EACP,8BAA8B,CAC/B,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAC7B,iBAA2B,EAC3B,UAAsB;IAEtB,IAAI,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;IAE1C,sDAAsD;IACtD,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI;QACpC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAErD,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,CAAC;IAE/D,MAAM,eAAe,GAAe,EAAE,CAAC;IACvC,IAAI,WAAW,GAAG,iBAAiB,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9E,IAAI,WAAW,IAAI,iBAAiB,EAAE,CAAC;YACrC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QACD,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAC9B,iBAA2B,EAC3B,UAAsB;IAEtB,IAAI,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,MAAM,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI;QACpC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,8EAA8E;IAE5I,MAAM,eAAe,GAAe,EAAE,CAAC;IACvC,IAAI,wBAAwB,GAAG,iBAAiB,CAAC;IAEjD,mDAAmD;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,OAAO,GAAoB,IAAI,CAAC;QACpC,KAAK,MAAM,aAAa,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YACpD,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;YACpD,OAAO,GAAG,wBAAwB,CAAC,GAAG,CAAC;gBACrC,OAAO,EAAE,YAA8B;aACxC,CAAC,CAAC;YACH,IAAI,OAAO,GAAG,cAAc,IAAI,OAAO,GAAG,iBAAiB,EAAE,CAAC;gBAC5D,SAAS,CAAC,oEAAoE;YAChF,CAAC;YACD,6EAA6E;YAC7E,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;YACtD,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,wBAAwB,GAAG,0BAA0B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,0BAA0B,CACjC,IAAc,EACd,QAAgB;IAEhB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU;IAC1B,CAAC;IACD,qGAAqG;IACrG,MAAM,iBAAiB,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,SAAS,wBAAwB,CAC/B,iBAA2B,EAC3B,UAAsB;IAEtB,IAAI,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI;QACpC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,UAAU,CAAC,kBAAkB,IAAI,iBAAiB,CAAC,GAAG,CAAC;IAE1E,MAAM,eAAe,GAAe,EAAE,CAAC;IACvC,IAAI,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAE5G,6EAA6E;IAC7E,IAAI,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACpC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,WAAW,IAAI,cAAc,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QACzD,UAAU,EAAE,CAAC;QAEb,IAAI,WAAW,IAAI,iBAAiB,EAAE,CAAC;YACrC,2CAA2C;YAC3C,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;YACrE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QACD,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrD,4DAA4D;QAC5D,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAC9B,iBAA2B,EAC3B,UAAsB;IAEtB,IAAI,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,MAAM,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI;QACpC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEtD,yEAAyE;IACzE,MAAM,QAAQ,GAAG,UAAU,CAAC,gBAAgB;QAC1C,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAC/C,CAAC,CAAC,iBAAiB,CAAC;IAEtB,MAAM,eAAe,GAAe,EAAE,CAAC;IACvC,IAAI,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC7B,IAAI,EAAE,iBAAiB,CAAC,IAAI;QAC5B,IAAI,EAAE,iBAAiB,CAAC,IAAI;QAC5B,MAAM,EAAE,iBAAiB,CAAC,MAAM;QAChC,MAAM,EAAE,iBAAiB,CAAC,MAAM;KACjC,CAAC,CAAC;IAEH,oEAAoE;IACpE,IAAI,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACpC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,WAAW,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,WAAW,IAAI,iBAAiB,EAAE,CAAC;YACrC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QACD,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mCAAmC,CACjD,aAA8B,EAC9B,WAA+C,EAC/C,UAAyC,EACzC,aAA6B;IAE7B,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAChD,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;IAC1B,4FAA4F;IAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAC/B,aAAa,YAAY,IAAI;QAC3B,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,IAAI,IAAI,CAAC,aAAuB,CAAC,CACtC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAC7B,WAAW,YAAY,IAAI;QACzB,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,IAAI,IAAI,CAAC,WAAqB,CAAC,CACpC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,uCAAuC,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC/E,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAwB,EACxB,QAA4B,EAC5B,cAAuB,KAAK;IAE5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC9B,IAAI,MAAM,GAAW,IAAI,CAAC;IAC1B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,kBAAkB,CAAC,KAAK;YAC3B,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YACnC,MAAM;QACR,KAAK,kBAAkB,CAAC,MAAM;YAC5B,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YACrC,MAAM;QACR,KAAK,kBAAkB,CAAC,OAAO;YAC7B,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC,MAAM;QACR,KAAK,kBAAkB,CAAC,MAAM;YAC5B,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YACrC,MAAM;IACV,CAAC;IACD,OAAO,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,gBAAiC;IAEjC,OAAO,yCAAyC,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,yCAAyC,CAChD,gBAAiC,EACjC,SAAkB;IAElB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IACD,4CAA4C;IAC5C,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzC,MAAM,gBAAgB,GAAG,eAAe,CACtC,eAAe,CAAC,QAAQ,EAAE,EAC1B,gBAAgB,CACjB,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,OAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC;IAChE,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
package/prisma/schema.prisma
CHANGED
|
@@ -6008,6 +6008,8 @@ model BirthdayDealSuggestion {
|
|
|
6008
6008
|
linkUrl String? @db.Text
|
|
6009
6009
|
suggestedQualityTier BirthdayOfferQualityTier? // Suggester's experience: Awesome, Okay, or Lame
|
|
6010
6010
|
signupDaysInAdvance Int? // When requiresAdvanceSignup: how many days before birthday
|
|
6011
|
+
/// User-selected expiration hint while the suggestion is pending (mirrors catalog enum)
|
|
6012
|
+
suggestedExpirationType BirthdayFreebieExpirationType?
|
|
6011
6013
|
status BirthdayDealSuggestionStatus @default(Pending)
|
|
6012
6014
|
createdAt DateTime @default(now())
|
|
6013
6015
|
reviewedAt DateTime?
|
|
@@ -6029,6 +6031,8 @@ enum BirthdayFreebieExpirationType {
|
|
|
6029
6031
|
DayOf
|
|
6030
6032
|
Valid30Days
|
|
6031
6033
|
ValidDays
|
|
6034
|
+
/// No stated end to the redemption window (e.g. ongoing club perk)
|
|
6035
|
+
NeverExpires
|
|
6032
6036
|
}
|
|
6033
6037
|
|
|
6034
6038
|
enum BirthdayOfferQualityTier {
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Recurrence,
|
|
3
|
+
RecurrenceEndsType,
|
|
4
|
+
RecurringFrequency,
|
|
5
|
+
} from "@prisma/client";
|
|
6
|
+
import { DateTime } from "luxon";
|
|
7
|
+
import {
|
|
8
|
+
getCompactRunFirstAndLastOccurrence,
|
|
9
|
+
getRecurringBashEventPossibleLuxonTimes,
|
|
10
|
+
} from "../recurrenceUtils.js";
|
|
11
|
+
|
|
12
|
+
function buildRecurrence(partial: Partial<Recurrence>): Recurrence {
|
|
13
|
+
return {
|
|
14
|
+
id: "r1",
|
|
15
|
+
bashEventId: "e1",
|
|
16
|
+
interval: 1,
|
|
17
|
+
frequency: RecurringFrequency.Daily,
|
|
18
|
+
ends: null,
|
|
19
|
+
repeatCount: 3,
|
|
20
|
+
endsType: RecurrenceEndsType.AFTER_COUNT,
|
|
21
|
+
repeatOnDays: [],
|
|
22
|
+
repeatOnDayOfMonth: null,
|
|
23
|
+
repeatYearlyDate: null,
|
|
24
|
+
createdAt: new Date(),
|
|
25
|
+
updatedAt: new Date(),
|
|
26
|
+
...partial,
|
|
27
|
+
} as Recurrence;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
describe("getCompactRunFirstAndLastOccurrence", () => {
|
|
31
|
+
it("returns first and last occurrence for a 3-night daily run (same-day start/end)", () => {
|
|
32
|
+
// Daily recurrence without `ends` only expands ~1 year from local "now"; keep the event in that window.
|
|
33
|
+
const base = DateTime.utc().plus({ weeks: 2 }).startOf("day");
|
|
34
|
+
const start = base.set({ hour: 20, minute: 0, second: 0, millisecond: 0 }).toJSDate();
|
|
35
|
+
const end = base.set({ hour: 22, minute: 0, second: 0, millisecond: 0 }).toJSDate();
|
|
36
|
+
const recurrence = buildRecurrence({
|
|
37
|
+
frequency: RecurringFrequency.Daily,
|
|
38
|
+
interval: 1,
|
|
39
|
+
repeatCount: 3,
|
|
40
|
+
endsType: RecurrenceEndsType.AFTER_COUNT,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
expect(recurrence.frequency).toBe(RecurringFrequency.Daily);
|
|
44
|
+
|
|
45
|
+
const occ = getRecurringBashEventPossibleLuxonTimes(start, recurrence);
|
|
46
|
+
expect(occ.length).toBeGreaterThanOrEqual(2);
|
|
47
|
+
|
|
48
|
+
const result = getCompactRunFirstAndLastOccurrence(
|
|
49
|
+
start,
|
|
50
|
+
end,
|
|
51
|
+
recurrence,
|
|
52
|
+
"UTC"
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
expect(result).not.toBeNull();
|
|
56
|
+
expect(result!.first.toISODate()).toBe(base.toISODate());
|
|
57
|
+
expect(result!.last.toISODate()).toBe(
|
|
58
|
+
base.plus({ days: 2 }).toISODate()
|
|
59
|
+
);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("returns null when start and end are on different calendar days (continuous span)", () => {
|
|
63
|
+
const start = new Date("2026-04-03T20:00:00.000Z");
|
|
64
|
+
const end = new Date("2026-04-05T22:00:00.000Z");
|
|
65
|
+
const recurrence = buildRecurrence({});
|
|
66
|
+
|
|
67
|
+
expect(
|
|
68
|
+
getCompactRunFirstAndLastOccurrence(start, end, recurrence, "UTC")
|
|
69
|
+
).toBeNull();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("returns null for weekly recurrence", () => {
|
|
73
|
+
const start = new Date("2026-04-03T20:00:00.000Z");
|
|
74
|
+
const end = new Date("2026-04-03T22:00:00.000Z");
|
|
75
|
+
const recurrence = buildRecurrence({
|
|
76
|
+
frequency: RecurringFrequency.Weekly,
|
|
77
|
+
repeatOnDays: [],
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
expect(
|
|
81
|
+
getCompactRunFirstAndLastOccurrence(start, end, recurrence, "UTC")
|
|
82
|
+
).toBeNull();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("returns null for a single extra occurrence", () => {
|
|
86
|
+
const start = new Date("2026-04-03T20:00:00.000Z");
|
|
87
|
+
const end = new Date("2026-04-03T22:00:00.000Z");
|
|
88
|
+
const recurrence = buildRecurrence({
|
|
89
|
+
repeatCount: 1,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
expect(
|
|
93
|
+
getCompactRunFirstAndLastOccurrence(start, end, recurrence, "UTC")
|
|
94
|
+
).toBeNull();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
@@ -294,6 +294,67 @@ function getYearlyRecurringDates(
|
|
|
294
294
|
return recurrenceDates;
|
|
295
295
|
}
|
|
296
296
|
|
|
297
|
+
/**
|
|
298
|
+
* For a daily run-of-shows (same start/end clock each night), returns the first and last
|
|
299
|
+
* occurrence instants so UIs can show "Apr 3–5" instead of the first day plus "+N more".
|
|
300
|
+
*
|
|
301
|
+
* Returns null unless: Daily interval 1, `endDateTime` on the same calendar day as
|
|
302
|
+
* `startDateTime` (per-show duration), and all generated occurrences are on consecutive
|
|
303
|
+
* calendar days in `eventTimezone`.
|
|
304
|
+
*/
|
|
305
|
+
export function getCompactRunFirstAndLastOccurrence(
|
|
306
|
+
startDateTime: DateTimeArgType,
|
|
307
|
+
endDateTime: DateTimeArgType | null | undefined,
|
|
308
|
+
recurrence: Recurrence | undefined | null,
|
|
309
|
+
eventTimezone?: string | null
|
|
310
|
+
): { first: DateTime; last: DateTime } | null {
|
|
311
|
+
if (!recurrence || recurrence.frequency !== RecurringFrequency.Daily) {
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
if ((recurrence.interval ?? 1) !== 1) {
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
if (!startDateTime || !endDateTime) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const zone = eventTimezone?.trim() || undefined;
|
|
322
|
+
const z = zone ?? "local";
|
|
323
|
+
// Use wall-time in the event zone (not dateTimeFromDate default local interpretation only).
|
|
324
|
+
const start = DateTime.fromJSDate(
|
|
325
|
+
startDateTime instanceof Date
|
|
326
|
+
? startDateTime
|
|
327
|
+
: new Date(startDateTime as string)
|
|
328
|
+
).setZone(z);
|
|
329
|
+
const end = DateTime.fromJSDate(
|
|
330
|
+
endDateTime instanceof Date
|
|
331
|
+
? endDateTime
|
|
332
|
+
: new Date(endDateTime as string)
|
|
333
|
+
).setZone(z);
|
|
334
|
+
if (!start.hasSame(end, "day")) {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
const occ = getRecurringBashEventPossibleLuxonTimes(startDateTime, recurrence);
|
|
339
|
+
if (occ.length < 2) {
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
const sorted = [...occ].sort((a, b) => a.toMillis() - b.toMillis());
|
|
344
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
345
|
+
const prevDay = sorted[i - 1].setZone(z).startOf("day");
|
|
346
|
+
const currDay = sorted[i].setZone(z).startOf("day");
|
|
347
|
+
if (!prevDay.plus({ days: 1 }).equals(currDay)) {
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return {
|
|
353
|
+
first: sorted[0].setZone(z),
|
|
354
|
+
last: sorted[sorted.length - 1].setZone(z),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
|
|
297
358
|
export function freqToGrammarString(
|
|
298
359
|
freq: RecurringFrequency,
|
|
299
360
|
interval: number | undefined,
|