@miguelarios/pim-core 0.4.1 → 0.6.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/_shared.d.ts +11 -0
- package/dist/ics/_shared.d.ts.map +1 -0
- package/dist/ics/_shared.js +150 -0
- package/dist/ics/_shared.js.map +1 -0
- package/dist/ics/_tz-init.d.ts +2 -0
- package/dist/ics/_tz-init.d.ts.map +1 -0
- package/dist/ics/_tz-init.js +29 -0
- package/dist/ics/_tz-init.js.map +1 -0
- package/dist/ics/components.d.ts +26 -0
- package/dist/ics/components.d.ts.map +1 -0
- package/dist/ics/components.js +178 -0
- package/dist/ics/components.js.map +1 -0
- package/dist/ics/errors.d.ts +7 -0
- package/dist/ics/errors.d.ts.map +1 -0
- package/dist/ics/errors.js +13 -0
- package/dist/ics/errors.js.map +1 -0
- package/dist/ics/generate.d.ts +4 -0
- package/dist/ics/generate.d.ts.map +1 -0
- package/dist/ics/generate.js +101 -0
- package/dist/ics/generate.js.map +1 -0
- package/dist/ics/index.d.ts +11 -0
- package/dist/ics/index.d.ts.map +1 -0
- package/dist/ics/index.js +12 -0
- package/dist/ics/index.js.map +1 -0
- package/dist/ics/parse-events.d.ts +4 -0
- package/dist/ics/parse-events.d.ts.map +1 -0
- package/dist/ics/parse-events.js +223 -0
- package/dist/ics/parse-events.js.map +1 -0
- package/dist/ics/parse-journals.d.ts +4 -0
- package/dist/ics/parse-journals.d.ts.map +1 -0
- package/dist/ics/parse-journals.js +54 -0
- package/dist/ics/parse-journals.js.map +1 -0
- package/dist/ics/parse-todos.d.ts +4 -0
- package/dist/ics/parse-todos.d.ts.map +1 -0
- package/dist/ics/parse-todos.js +55 -0
- package/dist/ics/parse-todos.js.map +1 -0
- package/dist/ics/rrule.d.ts +2 -0
- package/dist/ics/rrule.d.ts.map +1 -0
- package/dist/ics/rrule.js +23 -0
- package/dist/ics/rrule.js.map +1 -0
- package/dist/ics/types.d.ts +100 -0
- package/dist/ics/types.d.ts.map +1 -0
- package/dist/ics/types.js +3 -0
- package/dist/ics/types.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/vcard.d.ts +16 -0
- package/dist/vcard.d.ts.map +1 -1
- package/dist/vcard.js +143 -20
- package/dist/vcard.js.map +1 -1
- package/package.json +7 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-events.d.ts","sourceRoot":"","sources":["../../src/ics/parse-events.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,CAAC;AAUvB,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAoKzD,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,WAAW,EAAE,CAiEf"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import ICAL from "ical.js";
|
|
2
|
+
import "./_tz-init.js";
|
|
3
|
+
import { parseAlarms, parseAttendees, parseCategories, parseGeo, parseOrganizer, timeToIso, } from "./_shared.js";
|
|
4
|
+
import { IcsParseError } from "./errors.js";
|
|
5
|
+
function nullIfEmpty(value) {
|
|
6
|
+
if (typeof value !== "string")
|
|
7
|
+
return null;
|
|
8
|
+
return value.length > 0 ? value : null;
|
|
9
|
+
}
|
|
10
|
+
function buildBaseEvent(component) {
|
|
11
|
+
const url = component.getFirstPropertyValue("url");
|
|
12
|
+
const status = component.getFirstPropertyValue("status");
|
|
13
|
+
const transp = component.getFirstPropertyValue("transp");
|
|
14
|
+
const rrule = component.getFirstPropertyValue("rrule");
|
|
15
|
+
const created = component.getFirstPropertyValue("created");
|
|
16
|
+
const lastModified = component.getFirstPropertyValue("last-modified");
|
|
17
|
+
const rdateProps = component.getAllProperties("rdate");
|
|
18
|
+
const rdates = [];
|
|
19
|
+
for (const prop of rdateProps) {
|
|
20
|
+
for (const v of prop.getValues()) {
|
|
21
|
+
if (v instanceof ICAL.Time)
|
|
22
|
+
rdates.push(timeToIso(v));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
let availability = null;
|
|
26
|
+
if (typeof transp === "string") {
|
|
27
|
+
if (transp.toUpperCase() === "OPAQUE")
|
|
28
|
+
availability = "busy";
|
|
29
|
+
else if (transp.toUpperCase() === "TRANSPARENT")
|
|
30
|
+
availability = "free";
|
|
31
|
+
}
|
|
32
|
+
const summary = component.getFirstPropertyValue("summary");
|
|
33
|
+
const uid = component.getFirstPropertyValue("uid");
|
|
34
|
+
const location = component.getFirstPropertyValue("location");
|
|
35
|
+
const description = component.getFirstPropertyValue("description");
|
|
36
|
+
return {
|
|
37
|
+
uid: typeof uid === "string" ? uid : "",
|
|
38
|
+
title: typeof summary === "string" ? summary : "",
|
|
39
|
+
all_day: false, // overwritten below per-instance
|
|
40
|
+
location: nullIfEmpty(location),
|
|
41
|
+
description: nullIfEmpty(description),
|
|
42
|
+
status: typeof status === "string" ? status.toLowerCase() : null,
|
|
43
|
+
availability,
|
|
44
|
+
url: typeof url === "string" && url.length > 0 ? url : null,
|
|
45
|
+
attendees: parseAttendees(component),
|
|
46
|
+
categories: parseCategories(component),
|
|
47
|
+
geo: parseGeo(component),
|
|
48
|
+
organizer: parseOrganizer(component),
|
|
49
|
+
recurrence_rule: rrule ? rrule.toString() : null,
|
|
50
|
+
rdates: rdates.length > 0 ? rdates : null,
|
|
51
|
+
created: created instanceof ICAL.Time ? created.toJSDate().toISOString() : null,
|
|
52
|
+
last_modified: lastModified instanceof ICAL.Time ? lastModified.toJSDate().toISOString() : null,
|
|
53
|
+
is_recurring: !!rrule,
|
|
54
|
+
alarms: parseAlarms(component),
|
|
55
|
+
occurrence_date: null,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function dateOnlyToIso(time) {
|
|
59
|
+
// For VALUE=DATE values, treat as UTC midnight rather than local-midnight.
|
|
60
|
+
// ICAL.Time.toJSDate() for date-only values uses the local Date constructor
|
|
61
|
+
// which makes the result depend on the test machine's tz; we want a
|
|
62
|
+
// deterministic ISO string anchored at UTC midnight.
|
|
63
|
+
const yyyy = time.year.toString().padStart(4, "0");
|
|
64
|
+
const mm = time.month.toString().padStart(2, "0");
|
|
65
|
+
const dd = time.day.toString().padStart(2, "0");
|
|
66
|
+
return `${yyyy}-${mm}-${dd}T00:00:00.000Z`;
|
|
67
|
+
}
|
|
68
|
+
function timeToEventIso(time) {
|
|
69
|
+
return time.isDate ? dateOnlyToIso(time) : time.toJSDate().toISOString();
|
|
70
|
+
}
|
|
71
|
+
// A floating time has no TZID and is not UTC ("Z"). In ical.js v2 the parser
|
|
72
|
+
// assigns ICAL.Timezone.localTimezone to such values, which makes
|
|
73
|
+
// toJSDate() interpret the wall-clock components in the host process tz.
|
|
74
|
+
// That makes parser output non-deterministic across machines. When the caller
|
|
75
|
+
// passes a `timezone` argument, treat it as the viewer's preferred zone and
|
|
76
|
+
// re-anchor the wall-clock there before converting to UTC.
|
|
77
|
+
function isFloating(time) {
|
|
78
|
+
if (time.isDate)
|
|
79
|
+
return false;
|
|
80
|
+
const zone = time.zone;
|
|
81
|
+
return zone === ICAL.Timezone.localTimezone || zone == null;
|
|
82
|
+
}
|
|
83
|
+
function timeToEventIsoWithTz(time, timezone) {
|
|
84
|
+
if (time.isDate)
|
|
85
|
+
return dateOnlyToIso(time);
|
|
86
|
+
if (timezone && isFloating(time)) {
|
|
87
|
+
const tz = ICAL.TimezoneService.get(timezone);
|
|
88
|
+
if (tz) {
|
|
89
|
+
// Build a fresh ICAL.Time with the same wall-clock components anchored
|
|
90
|
+
// in the requested zone. Mutating `time.zone` directly also works in
|
|
91
|
+
// ical.js v2 but constructing a new value avoids touching the caller's
|
|
92
|
+
// component tree.
|
|
93
|
+
const rebound = new ICAL.Time({
|
|
94
|
+
year: time.year,
|
|
95
|
+
month: time.month,
|
|
96
|
+
day: time.day,
|
|
97
|
+
hour: time.hour,
|
|
98
|
+
minute: time.minute,
|
|
99
|
+
second: time.second,
|
|
100
|
+
isDate: false,
|
|
101
|
+
}, tz);
|
|
102
|
+
return rebound.toJSDate().toISOString();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return time.toJSDate().toISOString();
|
|
106
|
+
}
|
|
107
|
+
function emitNonExpanded(component, isException, timezone) {
|
|
108
|
+
const base = buildBaseEvent(component);
|
|
109
|
+
const dtstart = component.getFirstPropertyValue("dtstart");
|
|
110
|
+
const dtend = component.getFirstPropertyValue("dtend");
|
|
111
|
+
if (!(dtstart instanceof ICAL.Time))
|
|
112
|
+
return [];
|
|
113
|
+
const allDay = dtstart.isDate;
|
|
114
|
+
const startIso = timeToEventIsoWithTz(dtstart, timezone);
|
|
115
|
+
const endIso = dtend instanceof ICAL.Time ? timeToEventIsoWithTz(dtend, timezone) : startIso;
|
|
116
|
+
let occDate = null;
|
|
117
|
+
if (isException) {
|
|
118
|
+
const recurId = component.getFirstPropertyValue("recurrence-id");
|
|
119
|
+
if (recurId instanceof ICAL.Time)
|
|
120
|
+
occDate = recurId.toJSDate().toISOString();
|
|
121
|
+
}
|
|
122
|
+
return [{ ...base, all_day: allDay, start: startIso, end: endIso, occurrence_date: occDate }];
|
|
123
|
+
}
|
|
124
|
+
function emitOccurrences(event, range, timezone) {
|
|
125
|
+
const out = [];
|
|
126
|
+
const rangeStart = ICAL.Time.fromJSDate(new Date(range.start), true);
|
|
127
|
+
const rangeEnd = ICAL.Time.fromJSDate(new Date(range.end), true);
|
|
128
|
+
const it = event.iterator();
|
|
129
|
+
// event.iterator().next() returns null/undefined when the series is exhausted
|
|
130
|
+
// (finite RRULEs with COUNT or UNTIL hit this branch). Range is half-open
|
|
131
|
+
// [start, end) per RFC 4791 §9.9 — an occurrence whose DTSTART equals
|
|
132
|
+
// range.end is excluded.
|
|
133
|
+
while (true) {
|
|
134
|
+
const next = it.next();
|
|
135
|
+
if (!next)
|
|
136
|
+
break;
|
|
137
|
+
if (next.compare(rangeEnd) >= 0)
|
|
138
|
+
break;
|
|
139
|
+
if (next.compare(rangeStart) < 0)
|
|
140
|
+
continue;
|
|
141
|
+
const details = event.getOccurrenceDetails(next);
|
|
142
|
+
const effective = details.item; // master or exception override
|
|
143
|
+
const base = buildBaseEvent(effective.component);
|
|
144
|
+
const allDay = details.startDate.isDate;
|
|
145
|
+
out.push({
|
|
146
|
+
...base,
|
|
147
|
+
all_day: allDay,
|
|
148
|
+
start: timeToEventIsoWithTz(details.startDate, timezone),
|
|
149
|
+
end: timeToEventIsoWithTz(details.endDate, timezone),
|
|
150
|
+
// occurrence_date is the original RRULE-generated slot (RECURRENCE-ID).
|
|
151
|
+
// For ordinary occurrences this equals startDate; for exception overrides
|
|
152
|
+
// it is the original time the occurrence was supposed to fire, which is
|
|
153
|
+
// what consumers need to reconcile overrides back to the master series.
|
|
154
|
+
occurrence_date: timeToEventIsoWithTz(details.recurrenceId, timezone),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
export function parseIcsEvents(icsContent, range, timezone) {
|
|
160
|
+
if (!icsContent.trim())
|
|
161
|
+
return [];
|
|
162
|
+
let root;
|
|
163
|
+
try {
|
|
164
|
+
root = ICAL.Component.fromString(icsContent);
|
|
165
|
+
}
|
|
166
|
+
catch (e) {
|
|
167
|
+
throw new IcsParseError("Invalid ICS content", e);
|
|
168
|
+
}
|
|
169
|
+
const veventComponents = root.getAllSubcomponents("vevent");
|
|
170
|
+
// Group by UID. Master events have no RECURRENCE-ID; exception VEVENTs do.
|
|
171
|
+
const groups = new Map();
|
|
172
|
+
for (const comp of veventComponents) {
|
|
173
|
+
// UID is REQUIRED by RFC 5545 §3.8.4.7 but real-world fixtures sometimes
|
|
174
|
+
// omit it (e.g. ical.js sample timezone_from_file.ics). Bucket UID-less
|
|
175
|
+
// VEVENTs under the empty string so they still surface to consumers
|
|
176
|
+
// rather than being silently dropped.
|
|
177
|
+
const rawUid = comp.getFirstPropertyValue("uid");
|
|
178
|
+
const uid = typeof rawUid === "string" ? rawUid : "";
|
|
179
|
+
let group = groups.get(uid);
|
|
180
|
+
if (!group) {
|
|
181
|
+
group = { master: null, exceptions: [] };
|
|
182
|
+
groups.set(uid, group);
|
|
183
|
+
}
|
|
184
|
+
if (comp.getFirstProperty("recurrence-id")) {
|
|
185
|
+
group.exceptions.push(comp);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
group.master = comp;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const out = [];
|
|
192
|
+
for (const [, group] of groups) {
|
|
193
|
+
if (!group.master) {
|
|
194
|
+
// Orphan exception VEVENTs (master not in this ICS) — emit each as standalone.
|
|
195
|
+
for (const ex of group.exceptions) {
|
|
196
|
+
out.push(...emitNonExpanded(ex, true, timezone));
|
|
197
|
+
}
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
let event;
|
|
201
|
+
try {
|
|
202
|
+
event = new ICAL.Event(group.master);
|
|
203
|
+
for (const ex of group.exceptions) {
|
|
204
|
+
event.relateException(new ICAL.Event(ex));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// If ICAL.Event construction fails for this group, skip it but don't fail the batch.
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (event.isRecurring() && range) {
|
|
212
|
+
out.push(...emitOccurrences(event, range, timezone));
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
out.push(...emitNonExpanded(group.master, false, timezone));
|
|
216
|
+
for (const ex of group.exceptions) {
|
|
217
|
+
out.push(...emitNonExpanded(ex, true, timezone));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return out;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=parse-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-events.js","sourceRoot":"","sources":["../../src/ics/parse-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-journals.d.ts","sourceRoot":"","sources":["../../src/ics/parse-journals.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAWhD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,CA2CpE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import ICAL from "ical.js";
|
|
2
|
+
import "./_tz-init.js";
|
|
3
|
+
import { parseCategories } from "./_shared.js";
|
|
4
|
+
import { IcsParseError } from "./errors.js";
|
|
5
|
+
function dateOnlyToString(t) {
|
|
6
|
+
// For VALUE=DATE properties, ical.js sets isDate=true and the JS Date is at midnight UTC.
|
|
7
|
+
// Emit YYYY-MM-DD without timezone interpretation.
|
|
8
|
+
const yr = t.year.toString().padStart(4, "0");
|
|
9
|
+
const mo = t.month.toString().padStart(2, "0");
|
|
10
|
+
const da = t.day.toString().padStart(2, "0");
|
|
11
|
+
return `${yr}-${mo}-${da}`;
|
|
12
|
+
}
|
|
13
|
+
export function parseIcsJournals(icsContent) {
|
|
14
|
+
if (!icsContent.trim())
|
|
15
|
+
return [];
|
|
16
|
+
let root;
|
|
17
|
+
try {
|
|
18
|
+
root = ICAL.Component.fromString(icsContent);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
throw new IcsParseError("Invalid ICS content", e);
|
|
22
|
+
}
|
|
23
|
+
const out = [];
|
|
24
|
+
for (const vjournal of root.getAllSubcomponents("vjournal")) {
|
|
25
|
+
try {
|
|
26
|
+
const dtstart = vjournal.getFirstPropertyValue("dtstart");
|
|
27
|
+
const status = vjournal.getFirstPropertyValue("status");
|
|
28
|
+
const created = vjournal.getFirstPropertyValue("created");
|
|
29
|
+
const lastModified = vjournal.getFirstPropertyValue("last-modified");
|
|
30
|
+
let dateStr = "";
|
|
31
|
+
if (dtstart instanceof ICAL.Time) {
|
|
32
|
+
dateStr = dtstart.isDate ? dateOnlyToString(dtstart) : dtstart.toJSDate().toISOString();
|
|
33
|
+
}
|
|
34
|
+
const rawUid = vjournal.getFirstPropertyValue("uid");
|
|
35
|
+
const rawSummary = vjournal.getFirstPropertyValue("summary");
|
|
36
|
+
const rawDescription = vjournal.getFirstPropertyValue("description");
|
|
37
|
+
out.push({
|
|
38
|
+
uid: typeof rawUid === "string" ? rawUid : "",
|
|
39
|
+
title: typeof rawSummary === "string" ? rawSummary : "",
|
|
40
|
+
date: dateStr,
|
|
41
|
+
description: typeof rawDescription === "string" ? rawDescription : null,
|
|
42
|
+
categories: parseCategories(vjournal),
|
|
43
|
+
status: typeof status === "string" ? status.toLowerCase() : null,
|
|
44
|
+
created: created instanceof ICAL.Time ? created.toJSDate().toISOString() : null,
|
|
45
|
+
last_modified: lastModified instanceof ICAL.Time ? lastModified.toJSDate().toISOString() : null,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Skip malformed VJOURNAL, don't fail whole batch.
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=parse-journals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-journals.js","sourceRoot":"","sources":["../../src/ics/parse-journals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-todos.d.ts","sourceRoot":"","sources":["../../src/ics/parse-todos.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CAkD9D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import ICAL from "ical.js";
|
|
2
|
+
import "./_tz-init.js";
|
|
3
|
+
import { parseAlarms, parseAttendees, parseCategories, parseOrganizer } from "./_shared.js";
|
|
4
|
+
import { IcsParseError } from "./errors.js";
|
|
5
|
+
export function parseIcsTodos(icsContent) {
|
|
6
|
+
if (!icsContent.trim())
|
|
7
|
+
return [];
|
|
8
|
+
let root;
|
|
9
|
+
try {
|
|
10
|
+
root = ICAL.Component.fromString(icsContent);
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
throw new IcsParseError("Invalid ICS content", e);
|
|
14
|
+
}
|
|
15
|
+
const out = [];
|
|
16
|
+
for (const vtodo of root.getAllSubcomponents("vtodo")) {
|
|
17
|
+
try {
|
|
18
|
+
const due = vtodo.getFirstPropertyValue("due");
|
|
19
|
+
const completed = vtodo.getFirstPropertyValue("completed");
|
|
20
|
+
const percent = vtodo.getFirstPropertyValue("percent-complete");
|
|
21
|
+
const priority = vtodo.getFirstPropertyValue("priority");
|
|
22
|
+
const status = vtodo.getFirstPropertyValue("status");
|
|
23
|
+
const created = vtodo.getFirstPropertyValue("created");
|
|
24
|
+
const lastModified = vtodo.getFirstPropertyValue("last-modified");
|
|
25
|
+
const rrule = vtodo.getFirstPropertyValue("rrule");
|
|
26
|
+
const recurId = vtodo.getFirstPropertyValue("recurrence-id");
|
|
27
|
+
const rawUid = vtodo.getFirstPropertyValue("uid");
|
|
28
|
+
const rawSummary = vtodo.getFirstPropertyValue("summary");
|
|
29
|
+
const rawDescription = vtodo.getFirstPropertyValue("description");
|
|
30
|
+
out.push({
|
|
31
|
+
uid: typeof rawUid === "string" ? rawUid : "",
|
|
32
|
+
title: typeof rawSummary === "string" ? rawSummary : "",
|
|
33
|
+
due: due instanceof ICAL.Time ? due.toJSDate().toISOString() : null,
|
|
34
|
+
completed: completed instanceof ICAL.Time ? completed.toJSDate().toISOString() : null,
|
|
35
|
+
percent_complete: typeof percent === "number" ? percent : null,
|
|
36
|
+
priority: typeof priority === "number" ? priority : null,
|
|
37
|
+
status: typeof status === "string" ? status.toLowerCase() : null,
|
|
38
|
+
description: typeof rawDescription === "string" ? rawDescription : null,
|
|
39
|
+
categories: parseCategories(vtodo),
|
|
40
|
+
attendees: parseAttendees(vtodo),
|
|
41
|
+
organizer: parseOrganizer(vtodo),
|
|
42
|
+
alarms: parseAlarms(vtodo),
|
|
43
|
+
recurrence_rule: rrule ? rrule.toString() : null,
|
|
44
|
+
created: created instanceof ICAL.Time ? created.toJSDate().toISOString() : null,
|
|
45
|
+
last_modified: lastModified instanceof ICAL.Time ? lastModified.toJSDate().toISOString() : null,
|
|
46
|
+
occurrence_date: recurId instanceof ICAL.Time ? recurId.toJSDate().toISOString() : null,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Skip malformed VTODO, don't fail whole batch.
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=parse-todos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-todos.js","sourceRoot":"","sources":["../../src/ics/parse-todos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rrule.d.ts","sourceRoot":"","sources":["../../src/ics/rrule.ts"],"names":[],"mappings":"AAEA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcnE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import ICAL from "ical.js";
|
|
2
|
+
export function normalizeRecurrenceRule(rule) {
|
|
3
|
+
if (typeof rule !== "string")
|
|
4
|
+
return null;
|
|
5
|
+
let trimmed = rule.trim();
|
|
6
|
+
if (!trimmed)
|
|
7
|
+
return null;
|
|
8
|
+
if (/^RRULE:/i.test(trimmed))
|
|
9
|
+
trimmed = trimmed.slice(6).trim();
|
|
10
|
+
if (/[\r\n]/.test(trimmed))
|
|
11
|
+
return null;
|
|
12
|
+
try {
|
|
13
|
+
const recur = ICAL.Recur.fromString(trimmed);
|
|
14
|
+
// Ensure it has a FREQ property to be valid
|
|
15
|
+
if (!recur.freq)
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return trimmed;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=rrule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rrule.js","sourceRoot":"","sources":["../../src/ics/rrule.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7C,4CAA4C;QAC5C,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export interface ParsedAlarm {
|
|
2
|
+
type: "relative" | "absolute";
|
|
3
|
+
trigger: number | string;
|
|
4
|
+
trigger_human: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ParsedAttendee {
|
|
7
|
+
name: string | null;
|
|
8
|
+
email: string;
|
|
9
|
+
status: string | null;
|
|
10
|
+
role: string | null;
|
|
11
|
+
type: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ParsedOrganizer {
|
|
14
|
+
name: string | null;
|
|
15
|
+
email: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ParsedGeo {
|
|
18
|
+
latitude: number;
|
|
19
|
+
longitude: number;
|
|
20
|
+
}
|
|
21
|
+
export interface ParsedEvent {
|
|
22
|
+
uid: string;
|
|
23
|
+
title: string;
|
|
24
|
+
start: string;
|
|
25
|
+
end: string;
|
|
26
|
+
all_day: boolean;
|
|
27
|
+
location: string | null;
|
|
28
|
+
description: string | null;
|
|
29
|
+
status: string | null;
|
|
30
|
+
availability: string | null;
|
|
31
|
+
url: string | null;
|
|
32
|
+
attendees: ParsedAttendee[];
|
|
33
|
+
categories: string[];
|
|
34
|
+
geo: ParsedGeo | null;
|
|
35
|
+
organizer: ParsedOrganizer | null;
|
|
36
|
+
recurrence_rule: string | null;
|
|
37
|
+
rdates: string[] | null;
|
|
38
|
+
created: string | null;
|
|
39
|
+
last_modified: string | null;
|
|
40
|
+
is_recurring: boolean;
|
|
41
|
+
alarms: ParsedAlarm[];
|
|
42
|
+
occurrence_date: string | null;
|
|
43
|
+
}
|
|
44
|
+
export interface ParsedTodo {
|
|
45
|
+
uid: string;
|
|
46
|
+
title: string;
|
|
47
|
+
due: string | null;
|
|
48
|
+
completed: string | null;
|
|
49
|
+
percent_complete: number | null;
|
|
50
|
+
priority: number | null;
|
|
51
|
+
status: string | null;
|
|
52
|
+
description: string | null;
|
|
53
|
+
categories: string[];
|
|
54
|
+
attendees: ParsedAttendee[];
|
|
55
|
+
organizer: ParsedOrganizer | null;
|
|
56
|
+
alarms: ParsedAlarm[];
|
|
57
|
+
recurrence_rule: string | null;
|
|
58
|
+
created: string | null;
|
|
59
|
+
last_modified: string | null;
|
|
60
|
+
occurrence_date: string | null;
|
|
61
|
+
}
|
|
62
|
+
export interface ParsedJournal {
|
|
63
|
+
uid: string;
|
|
64
|
+
title: string;
|
|
65
|
+
date: string;
|
|
66
|
+
description: string | null;
|
|
67
|
+
categories: string[];
|
|
68
|
+
status: string | null;
|
|
69
|
+
created: string | null;
|
|
70
|
+
last_modified: string | null;
|
|
71
|
+
}
|
|
72
|
+
export interface TimeRange {
|
|
73
|
+
start: string;
|
|
74
|
+
end: string;
|
|
75
|
+
}
|
|
76
|
+
export interface EventCreateProps {
|
|
77
|
+
title: string;
|
|
78
|
+
start: string;
|
|
79
|
+
end: string;
|
|
80
|
+
all_day?: boolean;
|
|
81
|
+
location?: string;
|
|
82
|
+
description?: string;
|
|
83
|
+
attendees?: Array<{
|
|
84
|
+
email: string;
|
|
85
|
+
}>;
|
|
86
|
+
uid?: string;
|
|
87
|
+
timezone?: string;
|
|
88
|
+
alarms?: Array<{
|
|
89
|
+
type: "relative" | "absolute";
|
|
90
|
+
trigger: number | string;
|
|
91
|
+
}>;
|
|
92
|
+
categories?: string[];
|
|
93
|
+
recurrence_rule?: string;
|
|
94
|
+
organizer?: {
|
|
95
|
+
email: string;
|
|
96
|
+
name?: string | null;
|
|
97
|
+
};
|
|
98
|
+
availability?: "busy" | "free";
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ics/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ics/types.ts"],"names":[],"mappings":"AAAA,iCAAiC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { type CalDavAccount, type CalDavConfig, loadCalDavConfig, type CardDavConfig, loadCardDavConfig, type EmailConfig, loadEmailConfig, } from "./config.js";
|
|
2
2
|
export { AuthenticationError, CalendarError, ConfigurationError, ConnectionError, ContactError, EmailError, ErrorCode, PimError, ValidationError, isRetryableError, toPimError, } from "./errors.js";
|
|
3
|
-
export { type Contact, type TypedValue, type PostalAddress, buildVCard, parseVCard, } from "./vcard.js";
|
|
3
|
+
export { type Contact, type TypedValue, type PostalAddress, type SocialProfile, buildVCard, parseVCard, } from "./vcard.js";
|
|
4
4
|
export { getTimezone, formatInTimezone, parseTimestamp, type ParsedTimestamp, } from "./timezone.js";
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,gBAAgB,EAChB,KAAK,aAAa,EAClB,iBAAiB,EACjB,KAAK,WAAW,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,gBAAgB,EAChB,KAAK,aAAa,EAClB,iBAAiB,EACjB,KAAK,WAAW,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,gBAAgB,EAEhB,iBAAiB,EAEjB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,gBAAgB,EAEhB,iBAAiB,EAEjB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAKL,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,GAEf,MAAM,eAAe,CAAC"}
|
package/dist/vcard.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ export interface PostalAddress {
|
|
|
10
10
|
postalCode?: string;
|
|
11
11
|
country?: string;
|
|
12
12
|
}
|
|
13
|
+
export interface SocialProfile {
|
|
14
|
+
type: string;
|
|
15
|
+
handle?: string;
|
|
16
|
+
url?: string;
|
|
17
|
+
}
|
|
13
18
|
export interface Contact {
|
|
14
19
|
uid: string;
|
|
15
20
|
fullName: string;
|
|
@@ -26,8 +31,19 @@ export interface Contact {
|
|
|
26
31
|
birthday?: string;
|
|
27
32
|
categories?: string[];
|
|
28
33
|
note?: string;
|
|
34
|
+
socialProfiles?: SocialProfile[];
|
|
29
35
|
otherProperties: string[];
|
|
30
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Normalize a raw TYPE parameter value into a clean label.
|
|
39
|
+
* - Splits on comma or semicolon
|
|
40
|
+
* - Lowercases all tokens
|
|
41
|
+
* - Strips surrounding double-quote characters (from TYPE="internet" RFC 6868 form)
|
|
42
|
+
* - Drops noise tokens: internet, voice, pref
|
|
43
|
+
* - Joins remaining tokens with "/"
|
|
44
|
+
* Returns undefined when no meaningful token remains.
|
|
45
|
+
*/
|
|
46
|
+
export declare function normalizeType(raw: string | undefined): string | undefined;
|
|
31
47
|
export declare function parseVCard(data: string): Contact;
|
|
32
48
|
export declare function buildVCard(contact: Contact): string;
|
|
33
49
|
//# sourceMappingURL=vcard.d.ts.map
|
package/dist/vcard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vcard.d.ts","sourceRoot":"","sources":["../src/vcard.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"vcard.d.ts","sourceRoot":"","sources":["../src/vcard.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAuDD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAQzE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA+EhD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAsEnD"}
|