@mcp-monorepo/ics 1.1.0 → 1.3.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/ics-parser/errors.d.ts +16 -0
- package/dist/ics-parser/errors.d.ts.map +1 -0
- package/dist/ics-parser/errors.js +31 -0
- package/dist/ics-parser/errors.js.map +1 -0
- package/dist/ics-parser/event-expander.d.ts +71 -0
- package/dist/ics-parser/event-expander.d.ts.map +1 -0
- package/dist/ics-parser/event-expander.js +328 -0
- package/dist/ics-parser/event-expander.js.map +1 -0
- package/dist/ics-parser/index.d.ts +67 -0
- package/dist/ics-parser/index.d.ts.map +1 -0
- package/dist/ics-parser/index.js +91 -0
- package/dist/ics-parser/index.js.map +1 -0
- package/dist/ics-parser/parser.d.ts +26 -0
- package/dist/ics-parser/parser.d.ts.map +1 -0
- package/dist/ics-parser/parser.js +99 -0
- package/dist/ics-parser/parser.js.map +1 -0
- package/dist/ics-parser/property-parsers.d.ts +66 -0
- package/dist/ics-parser/property-parsers.d.ts.map +1 -0
- package/dist/ics-parser/property-parsers.js +226 -0
- package/dist/ics-parser/property-parsers.js.map +1 -0
- package/dist/ics-parser/rrule-expander.d.ts +10 -0
- package/dist/ics-parser/rrule-expander.d.ts.map +1 -0
- package/dist/ics-parser/rrule-expander.js +305 -0
- package/dist/ics-parser/rrule-expander.js.map +1 -0
- package/dist/ics-parser/timezone-processor.d.ts +40 -0
- package/dist/ics-parser/timezone-processor.d.ts.map +1 -0
- package/dist/ics-parser/timezone-processor.js +219 -0
- package/dist/ics-parser/timezone-processor.js.map +1 -0
- package/dist/ics-parser/types.d.ts +119 -0
- package/dist/ics-parser/types.d.ts.map +1 -0
- package/dist/ics-parser/types.js +2 -0
- package/dist/ics-parser/types.js.map +1 -0
- package/dist/ics-parser/utils.d.ts +16 -0
- package/dist/ics-parser/utils.d.ts.map +1 -0
- package/dist/ics-parser/utils.js +19 -0
- package/dist/ics-parser/utils.js.map +1 -0
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +10 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +39 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/event-store-2.d.ts +11 -0
- package/dist/lib/event-store-2.d.ts.map +1 -0
- package/dist/lib/event-store-2.js +90 -0
- package/dist/lib/event-store-2.js.map +1 -0
- package/dist/lib/format-date.d.ts +7 -1
- package/dist/lib/format-date.d.ts.map +1 -1
- package/dist/lib/format-date.js +9 -2
- package/dist/lib/format-date.js.map +1 -1
- package/dist/lib/types.d.ts +0 -34
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/tools/fetch-events.d.ts.map +1 -1
- package/dist/tools/fetch-events.js +31 -26
- package/dist/tools/fetch-events.js.map +1 -1
- package/dist/tools/search-events.d.ts.map +1 -1
- package/dist/tools/search-events.js +50 -17
- package/dist/tools/search-events.js.map +1 -1
- package/package.json +10 -6
- package/dist/lib/event-store.d.ts +0 -9
- package/dist/lib/event-store.d.ts.map +0 -1
- package/dist/lib/event-store.js +0 -88
- package/dist/lib/event-store.js.map +0 -1
- package/dist/lib/filter-events.d.ts +0 -3
- package/dist/lib/filter-events.d.ts.map +0 -1
- package/dist/lib/filter-events.js +0 -10
- package/dist/lib/filter-events.js.map +0 -1
- package/dist/lib/recurrrence.d.ts +0 -3
- package/dist/lib/recurrrence.d.ts.map +0 -1
- package/dist/lib/recurrrence.js +0 -49
- package/dist/lib/recurrrence.js.map +0 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type VComponent, type IcsProperty, type ParsedIcs } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Unfolds multi-line properties in an ICS file.
|
|
4
|
+
* @param rawLines - An array of lines from the ICS file.
|
|
5
|
+
* @returns An array of unfolded lines.
|
|
6
|
+
*/
|
|
7
|
+
export declare function unfoldLines(rawLines: string[]): string[];
|
|
8
|
+
/**
|
|
9
|
+
* Parses a single line into a property with a key, value, and parameters.
|
|
10
|
+
* @param line - An unfolded line from the ICS file.
|
|
11
|
+
* @returns An IcsProperty object or undefined if the line is invalid.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseProperty(line: string): IcsProperty | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Parses an array of lines into a tree of VComponents.
|
|
16
|
+
* @param lines - An array of unfolded ICS lines.
|
|
17
|
+
* @returns An array of top-level VComponents.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildComponentTree(lines: string[]): VComponent[];
|
|
20
|
+
/**
|
|
21
|
+
* Parses a raw ICS string into a structured object containing events and timezones.
|
|
22
|
+
* @param icsString - The full content of the .ics file.
|
|
23
|
+
* @returns A ParsedIcs object.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseIcs(icsString: string): ParsedIcs;
|
|
26
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/ics-parser/parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAE9E;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAiBxD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAqBnE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAyBhE;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAcrD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { CalendarNotFoundError } from './errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Unfolds multi-line properties in an ICS file.
|
|
4
|
+
* @param rawLines - An array of lines from the ICS file.
|
|
5
|
+
* @returns An array of unfolded lines.
|
|
6
|
+
*/
|
|
7
|
+
export function unfoldLines(rawLines) {
|
|
8
|
+
const unfolded = [];
|
|
9
|
+
let currentLine = '';
|
|
10
|
+
for (const line of rawLines) {
|
|
11
|
+
if (line.startsWith(' ') || line.startsWith('\t')) {
|
|
12
|
+
currentLine += line.substring(1);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
if (currentLine) {
|
|
16
|
+
unfolded.push(currentLine);
|
|
17
|
+
}
|
|
18
|
+
currentLine = line;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (currentLine) {
|
|
22
|
+
unfolded.push(currentLine);
|
|
23
|
+
}
|
|
24
|
+
return unfolded;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parses a single line into a property with a key, value, and parameters.
|
|
28
|
+
* @param line - An unfolded line from the ICS file.
|
|
29
|
+
* @returns An IcsProperty object or undefined if the line is invalid.
|
|
30
|
+
*/
|
|
31
|
+
export function parseProperty(line) {
|
|
32
|
+
const separatorIndex = line.indexOf(':');
|
|
33
|
+
if (separatorIndex === -1) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
const keyPart = line.substring(0, separatorIndex);
|
|
37
|
+
const value = line.substring(separatorIndex + 1);
|
|
38
|
+
const keySegments = keyPart.split(';');
|
|
39
|
+
const key = keySegments[0];
|
|
40
|
+
const params = {};
|
|
41
|
+
for (let i = 1; i < keySegments.length; i++) {
|
|
42
|
+
const [paramKey, paramValue] = keySegments[i].split('=');
|
|
43
|
+
if (paramKey && paramValue) {
|
|
44
|
+
params[paramKey] = paramValue;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { key, value, params };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parses an array of lines into a tree of VComponents.
|
|
51
|
+
* @param lines - An array of unfolded ICS lines.
|
|
52
|
+
* @returns An array of top-level VComponents.
|
|
53
|
+
*/
|
|
54
|
+
export function buildComponentTree(lines) {
|
|
55
|
+
const componentStack = [];
|
|
56
|
+
const topLevelComponents = [];
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
if (line.startsWith('BEGIN:')) {
|
|
59
|
+
const type = line.substring(6).trim();
|
|
60
|
+
const newComponent = { type, properties: [], subComponents: [] };
|
|
61
|
+
if (componentStack.length > 0) {
|
|
62
|
+
componentStack[componentStack.length - 1].subComponents.push(newComponent);
|
|
63
|
+
}
|
|
64
|
+
componentStack.push(newComponent);
|
|
65
|
+
}
|
|
66
|
+
else if (line.startsWith('END:')) {
|
|
67
|
+
const endedComponent = componentStack.pop();
|
|
68
|
+
if (endedComponent && componentStack.length === 0) {
|
|
69
|
+
topLevelComponents.push(endedComponent);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (componentStack.length > 0) {
|
|
73
|
+
const prop = parseProperty(line);
|
|
74
|
+
if (prop) {
|
|
75
|
+
componentStack[componentStack.length - 1].properties.push(prop);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return topLevelComponents;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Parses a raw ICS string into a structured object containing events and timezones.
|
|
83
|
+
* @param icsString - The full content of the .ics file.
|
|
84
|
+
* @returns A ParsedIcs object.
|
|
85
|
+
*/
|
|
86
|
+
export function parseIcs(icsString) {
|
|
87
|
+
const rawLines = icsString.replace(/\r\n/g, '\n').split('\n');
|
|
88
|
+
const unfolded = unfoldLines(rawLines);
|
|
89
|
+
const allComponents = buildComponentTree(unfolded);
|
|
90
|
+
const calendar = allComponents.find((c) => c.type === 'VCALENDAR');
|
|
91
|
+
if (!calendar) {
|
|
92
|
+
throw new CalendarNotFoundError();
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
events: calendar.subComponents.filter((c) => c.type === 'VEVENT'),
|
|
96
|
+
timezones: calendar.subComponents.filter((c) => c.type === 'VTIMEZONE'),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/ics-parser/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
import { type CalAddress, type Geo, type IcsProperty, type RecurrenceRule, type TimeZoneResolver } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Extracts the raw string value from an ICS property.
|
|
5
|
+
* @param prop - The ICS property.
|
|
6
|
+
* @returns The string value or undefined.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseString(prop: IcsProperty | undefined): string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Parses the string value of an ICS property into an integer.
|
|
11
|
+
* @param prop - The ICS property.
|
|
12
|
+
* @returns The integer value or undefined if parsing fails.
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseInteger(prop: IcsProperty | undefined): number | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Parses one or more CATEGORIES properties into a flat array of category strings.
|
|
17
|
+
* Handles comma-separated values within a single property.
|
|
18
|
+
* @param props - An array of CATEGORIES properties.
|
|
19
|
+
* @returns An array of category strings.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseCategories(props: IcsProperty[]): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Parses a GEO property value (e.g., '37.386013;-122.082932') into a structured Geo object.
|
|
24
|
+
* @param prop - The GEO property.
|
|
25
|
+
* @returns A Geo object or undefined if parsing fails.
|
|
26
|
+
*/
|
|
27
|
+
export declare function parseGeo(prop: IcsProperty | undefined): Geo | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Parses a calendar user address property (like ORGANIZER or ATTENDEE) into a structured CalAddress object,
|
|
30
|
+
* extracting the email, common name, and other parameters.
|
|
31
|
+
* @param prop - The ICS property for a calendar user.
|
|
32
|
+
* @returns A CalAddress object or undefined.
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseCalAddress(prop: IcsProperty | undefined): CalAddress | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Parses an iCalendar DATE-TIME or DATE property into a Luxon DateTime object.
|
|
37
|
+
* Handles different formats, including date-only values, UTC time, and times with a TZID parameter.
|
|
38
|
+
* It uses the provided timezone resolver for VTIMEZONE definitions and falls back to Luxon's
|
|
39
|
+
* built-in IANA database for standard timezones.
|
|
40
|
+
* @param prop - The IcsProperty containing the date value and parameters.
|
|
41
|
+
* @param resolver - The optional timezone resolver for VTIMEZONE components.
|
|
42
|
+
* @returns A Luxon DateTime object.
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseIcsDateTime(prop: IcsProperty, resolver?: TimeZoneResolver): DateTime;
|
|
45
|
+
/**
|
|
46
|
+
* Parses an iCalendar UTC offset string (e.g., "+0100" or "-0500") into minutes.
|
|
47
|
+
* @param offsetString - The UTC offset string from a TZOFFSETFROM or TZOFFSETTO property.
|
|
48
|
+
* @returns The offset in total minutes.
|
|
49
|
+
*/
|
|
50
|
+
export declare function parseOffset(offsetString: string): number;
|
|
51
|
+
/**
|
|
52
|
+
* Parses a property containing a comma-separated list of date or date-time values
|
|
53
|
+
* (e.g., from an RDATE or EXDATE property) into an array of Luxon DateTime objects.
|
|
54
|
+
* @param prop - The IcsProperty containing the comma-separated date values.
|
|
55
|
+
* @param resolver - The optional timezone resolver.
|
|
56
|
+
* @returns An array of Luxon DateTime objects.
|
|
57
|
+
*/
|
|
58
|
+
export declare function parseDateTimeList(prop: IcsProperty, resolver?: TimeZoneResolver): DateTime[];
|
|
59
|
+
/**
|
|
60
|
+
* Parses a raw RRULE string into a structured `RecurrenceRule` object, breaking
|
|
61
|
+
* down its components like FREQ, UNTIL, BYDAY, etc..
|
|
62
|
+
* @param rruleString - The raw value of the RRULE property.
|
|
63
|
+
* @returns A structured RecurrenceRule object.
|
|
64
|
+
*/
|
|
65
|
+
export declare function parseRruleString(rruleString: string): RecurrenceRule;
|
|
66
|
+
//# sourceMappingURL=property-parsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-parsers.d.ts","sourceRoot":"","sources":["../../src/ics-parser/property-parsers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,MAAM,OAAO,CAAA;AAGjD,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,GAAG,EACR,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EAEtB,MAAM,YAAY,CAAA;AAInB;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE7E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI9E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAO9D;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,CAKvE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAQrF;AAID;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,QAAQ,CA6CzF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,QAAQ,EAAE,CAE5F;AAID;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CA8EpE"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { DateTime, FixedOffsetZone } from 'luxon';
|
|
2
|
+
import { InvalidRruleError, TimeZoneDefinitionNotFoundError } from './errors.js';
|
|
3
|
+
// --- Primitive & Simple Structure Parsers ---
|
|
4
|
+
/**
|
|
5
|
+
* Extracts the raw string value from an ICS property.
|
|
6
|
+
* @param prop - The ICS property.
|
|
7
|
+
* @returns The string value or undefined.
|
|
8
|
+
*/
|
|
9
|
+
export function parseString(prop) {
|
|
10
|
+
return prop?.value;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Parses the string value of an ICS property into an integer.
|
|
14
|
+
* @param prop - The ICS property.
|
|
15
|
+
* @returns The integer value or undefined if parsing fails.
|
|
16
|
+
*/
|
|
17
|
+
export function parseInteger(prop) {
|
|
18
|
+
if (!prop?.value)
|
|
19
|
+
return undefined;
|
|
20
|
+
const num = parseInt(prop.value, 10);
|
|
21
|
+
return isNaN(num) ? undefined : num;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parses one or more CATEGORIES properties into a flat array of category strings.
|
|
25
|
+
* Handles comma-separated values within a single property.
|
|
26
|
+
* @param props - An array of CATEGORIES properties.
|
|
27
|
+
* @returns An array of category strings.
|
|
28
|
+
*/
|
|
29
|
+
export function parseCategories(props) {
|
|
30
|
+
return props.flatMap((p) => p.value
|
|
31
|
+
.split(',')
|
|
32
|
+
.map((cat) => cat.trim())
|
|
33
|
+
.filter(Boolean));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parses a GEO property value (e.g., '37.386013;-122.082932') into a structured Geo object.
|
|
37
|
+
* @param prop - The GEO property.
|
|
38
|
+
* @returns A Geo object or undefined if parsing fails.
|
|
39
|
+
*/
|
|
40
|
+
export function parseGeo(prop) {
|
|
41
|
+
if (!prop?.value)
|
|
42
|
+
return undefined;
|
|
43
|
+
const [lat, lon] = prop.value.split(';').map(parseFloat);
|
|
44
|
+
if (isNaN(lat) || isNaN(lon))
|
|
45
|
+
return undefined;
|
|
46
|
+
return { lat, lon };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Parses a calendar user address property (like ORGANIZER or ATTENDEE) into a structured CalAddress object,
|
|
50
|
+
* extracting the email, common name, and other parameters.
|
|
51
|
+
* @param prop - The ICS property for a calendar user.
|
|
52
|
+
* @returns A CalAddress object or undefined.
|
|
53
|
+
*/
|
|
54
|
+
export function parseCalAddress(prop) {
|
|
55
|
+
if (!prop?.value)
|
|
56
|
+
return undefined;
|
|
57
|
+
return {
|
|
58
|
+
email: prop.value.replace(/^mailto:/i, ''),
|
|
59
|
+
commonName: prop.params['CN'],
|
|
60
|
+
partstat: prop.params['PARTSTAT'],
|
|
61
|
+
role: prop.params['ROLE'],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// --- Date, Time & Offset Parsers ---
|
|
65
|
+
/**
|
|
66
|
+
* Parses an iCalendar DATE-TIME or DATE property into a Luxon DateTime object.
|
|
67
|
+
* Handles different formats, including date-only values, UTC time, and times with a TZID parameter.
|
|
68
|
+
* It uses the provided timezone resolver for VTIMEZONE definitions and falls back to Luxon's
|
|
69
|
+
* built-in IANA database for standard timezones.
|
|
70
|
+
* @param prop - The IcsProperty containing the date value and parameters.
|
|
71
|
+
* @param resolver - The optional timezone resolver for VTIMEZONE components.
|
|
72
|
+
* @returns A Luxon DateTime object.
|
|
73
|
+
*/
|
|
74
|
+
export function parseIcsDateTime(prop, resolver) {
|
|
75
|
+
const { value, params } = prop;
|
|
76
|
+
const tzid = params['TZID'] === 'Romance Standard Time' ? 'Europe/Paris' : params['TZID'];
|
|
77
|
+
const isDateOnly = params['VALUE'] === 'DATE';
|
|
78
|
+
if (isDateOnly) {
|
|
79
|
+
// For date-only values, parse as a date and treat it as local or in the specified zone's start of day.
|
|
80
|
+
return DateTime.fromFormat(value, 'yyyyMMdd', { zone: tzid || 'local' });
|
|
81
|
+
}
|
|
82
|
+
if (value.endsWith('Z')) {
|
|
83
|
+
// Value is explicitly in UTC.
|
|
84
|
+
return DateTime.fromISO(value, { zone: 'utc' });
|
|
85
|
+
}
|
|
86
|
+
if (tzid && resolver) {
|
|
87
|
+
try {
|
|
88
|
+
const localDt = DateTime.fromFormat(value, "yyyyMMdd'T'HHmmss", { zone: 'local' });
|
|
89
|
+
if (!localDt.isValid)
|
|
90
|
+
return localDt;
|
|
91
|
+
const offsetMinutes = resolver(localDt, tzid);
|
|
92
|
+
const zone = FixedOffsetZone.instance(offsetMinutes);
|
|
93
|
+
return localDt.setZone(zone, { keepLocalTime: true });
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
if (!(error instanceof TimeZoneDefinitionNotFoundError)) {
|
|
97
|
+
throw error; // Re-throw unexpected errors.
|
|
98
|
+
}
|
|
99
|
+
// If a TimeZoneDefinitionNotFoundError is caught, it means the TZID was not in the VTIMEZONE components.
|
|
100
|
+
// We fall through to let Luxon try and resolve it as a standard IANA timezone.
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (tzid) {
|
|
104
|
+
// Per RFC 5545, parse with the specified timezone identifier.
|
|
105
|
+
// Fallback logic for standard IANA timezones (e.g., 'Europe/Paris') or when resolver fails.
|
|
106
|
+
// Luxon handles DST gaps by rolling forward to the next valid time,
|
|
107
|
+
// which correctly determines the absolute instant in time.
|
|
108
|
+
return DateTime.fromFormat(value, "yyyyMMdd'T'HHmmss", { zone: tzid });
|
|
109
|
+
}
|
|
110
|
+
// A time without 'Z' or TZID is a "floating" time.
|
|
111
|
+
// We parse it as local time according to the machine's settings.
|
|
112
|
+
return DateTime.fromFormat(value, "yyyyMMdd'T'HHmmss", { zone: 'local' });
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Parses an iCalendar UTC offset string (e.g., "+0100" or "-0500") into minutes.
|
|
116
|
+
* @param offsetString - The UTC offset string from a TZOFFSETFROM or TZOFFSETTO property.
|
|
117
|
+
* @returns The offset in total minutes.
|
|
118
|
+
*/
|
|
119
|
+
export function parseOffset(offsetString) {
|
|
120
|
+
if (!/^[+-]\d{4}$/.test(offsetString)) {
|
|
121
|
+
throw new Error(`Invalid offset string: ${offsetString}`);
|
|
122
|
+
}
|
|
123
|
+
const sign = offsetString.startsWith('-') ? -1 : 1;
|
|
124
|
+
const hours = parseInt(offsetString.substring(1, 3), 10);
|
|
125
|
+
const minutes = parseInt(offsetString.substring(3, 5), 10);
|
|
126
|
+
return sign * (hours * 60 + minutes);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Parses a property containing a comma-separated list of date or date-time values
|
|
130
|
+
* (e.g., from an RDATE or EXDATE property) into an array of Luxon DateTime objects.
|
|
131
|
+
* @param prop - The IcsProperty containing the comma-separated date values.
|
|
132
|
+
* @param resolver - The optional timezone resolver.
|
|
133
|
+
* @returns An array of Luxon DateTime objects.
|
|
134
|
+
*/
|
|
135
|
+
export function parseDateTimeList(prop, resolver) {
|
|
136
|
+
return prop.value.split(',').map((val) => parseIcsDateTime({ ...prop, value: val }, resolver));
|
|
137
|
+
}
|
|
138
|
+
// --- Rule Parsers ---
|
|
139
|
+
/**
|
|
140
|
+
* Parses a raw RRULE string into a structured `RecurrenceRule` object, breaking
|
|
141
|
+
* down its components like FREQ, UNTIL, BYDAY, etc..
|
|
142
|
+
* @param rruleString - The raw value of the RRULE property.
|
|
143
|
+
* @returns A structured RecurrenceRule object.
|
|
144
|
+
*/
|
|
145
|
+
export function parseRruleString(rruleString) {
|
|
146
|
+
const parts = rruleString.split(';');
|
|
147
|
+
const rule = {};
|
|
148
|
+
for (const part of parts) {
|
|
149
|
+
if (!part.includes('='))
|
|
150
|
+
continue;
|
|
151
|
+
const [key, value] = part.split('=');
|
|
152
|
+
switch (key.toUpperCase()) {
|
|
153
|
+
case 'FREQ': {
|
|
154
|
+
const validFreqs = [
|
|
155
|
+
'YEARLY',
|
|
156
|
+
'MONTHLY',
|
|
157
|
+
'WEEKLY',
|
|
158
|
+
'DAILY',
|
|
159
|
+
'HOURLY',
|
|
160
|
+
'MINUTELY',
|
|
161
|
+
'SECONDLY',
|
|
162
|
+
];
|
|
163
|
+
const freqValue = value.toUpperCase();
|
|
164
|
+
if (!validFreqs.includes(freqValue)) {
|
|
165
|
+
throw new InvalidRruleError(`Invalid FREQ value: ${value}`);
|
|
166
|
+
}
|
|
167
|
+
rule.freq = freqValue;
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
case 'INTERVAL':
|
|
171
|
+
rule.interval = parseInt(value, 10);
|
|
172
|
+
break;
|
|
173
|
+
case 'COUNT':
|
|
174
|
+
rule.count = parseInt(value, 10);
|
|
175
|
+
break;
|
|
176
|
+
case 'WKST':
|
|
177
|
+
rule.wkst = value;
|
|
178
|
+
break;
|
|
179
|
+
case 'UNTIL': {
|
|
180
|
+
const isUtc = value.endsWith('Z');
|
|
181
|
+
// RFC5545 states UNTIL MUST be a UTC date-time
|
|
182
|
+
rule.until = DateTime.fromISO(value, { zone: isUtc ? 'utc' : 'local' }).toUTC();
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
case 'BYDAY':
|
|
186
|
+
rule.byday = value.split(',').map((day) => {
|
|
187
|
+
const match = day.match(/([+-]?\d+)?(SU|MO|TU|WE|TH|FR|SA)/);
|
|
188
|
+
if (!match)
|
|
189
|
+
throw new InvalidRruleError(`Invalid BYDAY value: ${day}`);
|
|
190
|
+
const weekday = match[2];
|
|
191
|
+
const n = match[1] ? parseInt(match[1], 10) : undefined;
|
|
192
|
+
return { weekday, n };
|
|
193
|
+
});
|
|
194
|
+
break;
|
|
195
|
+
case 'BYMONTH':
|
|
196
|
+
rule.bymonth = value.split(',').map((v) => parseInt(v, 10));
|
|
197
|
+
break;
|
|
198
|
+
case 'BYMONTHDAY':
|
|
199
|
+
rule.bymonthday = value.split(',').map((v) => parseInt(v, 10));
|
|
200
|
+
break;
|
|
201
|
+
case 'BYYEARDAY':
|
|
202
|
+
rule.byyearday = value.split(',').map((v) => parseInt(v, 10));
|
|
203
|
+
break;
|
|
204
|
+
case 'BYWEEKNO':
|
|
205
|
+
rule.byweekno = value.split(',').map((v) => parseInt(v, 10));
|
|
206
|
+
break;
|
|
207
|
+
case 'BYHOUR':
|
|
208
|
+
rule.byhour = value.split(',').map((v) => parseInt(v, 10));
|
|
209
|
+
break;
|
|
210
|
+
case 'BYMINUTE':
|
|
211
|
+
rule.byminute = value.split(',').map((v) => parseInt(v, 10));
|
|
212
|
+
break;
|
|
213
|
+
case 'BYSECOND':
|
|
214
|
+
rule.bysecond = value.split(',').map((v) => parseInt(v, 10));
|
|
215
|
+
break;
|
|
216
|
+
case 'BYSETPOS':
|
|
217
|
+
rule.bysetpos = value.split(',').map((v) => parseInt(v, 10));
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (!rule.freq) {
|
|
222
|
+
throw new InvalidRruleError('RRULE string must contain a FREQ part.');
|
|
223
|
+
}
|
|
224
|
+
return rule;
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=property-parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-parsers.js","sourceRoot":"","sources":["../../src/ics-parser/property-parsers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAEjD,OAAO,EAAE,iBAAiB,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAA;AAWhF,+CAA+C;AAE/C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAA6B;IACvD,OAAO,IAAI,EAAE,KAAK,CAAA;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAA6B;IACxD,IAAI,CAAC,IAAI,EAAE,KAAK;QAAE,OAAO,SAAS,CAAA;IAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAA;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACzB,CAAC,CAAC,KAAK;SACJ,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,OAAO,CAAC,CACnB,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAA6B;IACpD,IAAI,CAAC,IAAI,EAAE,KAAK;QAAE,OAAO,SAAS,CAAA;IAClC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACxD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IAC9C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAA6B;IAC3D,IAAI,CAAC,IAAI,EAAE,KAAK;QAAE,OAAO,SAAS,CAAA;IAClC,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QACjC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;KAC1B,CAAA;AACH,CAAC;AAED,sCAAsC;AAEtC;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAiB,EAAE,QAA2B;IAC7E,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,uBAAuB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACzF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAA;IAE7C,IAAI,UAAU,EAAE,CAAC;QACf,uGAAuG;QACvG,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,8BAA8B;QAC9B,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;YAElF,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,OAAO,OAAO,CAAA;YAEpC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAE7C,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;YACpD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,+BAA+B,CAAC,EAAE,CAAC;gBACxD,MAAM,KAAK,CAAA,CAAC,8BAA8B;YAC5C,CAAC;YACD,yGAAyG;YACzG,+EAA+E;QACjF,CAAC;IACH,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,8DAA8D;QAC9D,4FAA4F;QAC5F,oEAAoE;QACpE,2DAA2D;QAC3D,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACxE,CAAC;IAED,mDAAmD;IACnD,iEAAiE;IACjE,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,YAAoB;IAC9C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACxD,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1D,OAAO,IAAI,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,QAA2B;IAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAA;AAChG,CAAC;AAED,uBAAuB;AAEvB;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,IAAI,GAA4B,EAAE,CAAA;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAQ;QACjC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpC,QAAQ,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1B,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,UAAU,GAAG;oBACjB,QAAQ;oBACR,SAAS;oBACT,QAAQ;oBACR,OAAO;oBACP,QAAQ;oBACR,UAAU;oBACV,UAAU;iBACe,CAAA;gBAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,EAAU,CAAA;gBAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBACpC,MAAM,IAAI,iBAAiB,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAA;gBAC7D,CAAC;gBACD,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;gBACrB,MAAK;YACP,CAAC;YACD,KAAK,UAAU;gBACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;gBACnC,MAAK;YACP,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;gBAChC,MAAK;YACP,KAAK,MAAM;gBACT,IAAI,CAAC,IAAI,GAAG,KAAgB,CAAA;gBAC5B,MAAK;YACP,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBACjC,+CAA+C;gBAC/C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAA;gBAC/E,MAAK;YACP,CAAC;YACD,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;oBAC5D,IAAI,CAAC,KAAK;wBAAE,MAAM,IAAI,iBAAiB,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAA;oBACtE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAY,CAAA;oBACnC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;oBACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;gBACvB,CAAC,CAAC,CAAA;gBACF,MAAK;YACP,KAAK,SAAS;gBACZ,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC3D,MAAK;YACP,KAAK,YAAY;gBACf,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC9D,MAAK;YACP,KAAK,WAAW;gBACd,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC7D,MAAK;YACP,KAAK,UAAU;gBACb,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC5D,MAAK;YACP,KAAK,QAAQ;gBACX,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC1D,MAAK;YACP,KAAK,UAAU;gBACb,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC5D,MAAK;YACP,KAAK,UAAU;gBACb,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC5D,MAAK;YACP,KAAK,UAAU;gBACb,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC5D,MAAK;QACT,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,iBAAiB,CAAC,wCAAwC,CAAC,CAAA;IACvE,CAAC;IACD,OAAO,IAAsB,CAAA;AAC/B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
import { type RRuleOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* **REFACTORED**: A generator that expands a recurrence rule into a sequence of dates.
|
|
5
|
+
* This implementation uses an "iterative advancement" strategy to avoid generating
|
|
6
|
+
* huge arrays of candidates, making it significantly more performant.
|
|
7
|
+
* @param options - The start date of the event series (`rangeStart`), the rule, and the query `rangeEnd`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function expandRrule(options: RRuleOptions): Generator<DateTime, void, unknown>;
|
|
10
|
+
//# sourceMappingURL=rrule-expander.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rrule-expander.d.ts","sourceRoot":"","sources":["../../src/ics-parser/rrule-expander.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAuB,MAAM,OAAO,CAAA;AAGrD,OAAO,EAAgD,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AA0E5F;;;;;GAKG;AACH,wBAAiB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAiCtF"}
|