@pipobscure/ical 0.0.1
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/LICENSE +190 -0
- package/README.md +661 -0
- package/dist/alarm.d.ts +35 -0
- package/dist/alarm.d.ts.map +1 -0
- package/dist/alarm.js +87 -0
- package/dist/alarm.js.map +1 -0
- package/dist/calendar.d.ts +52 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +121 -0
- package/dist/calendar.js.map +1 -0
- package/dist/component.d.ts +48 -0
- package/dist/component.d.ts.map +1 -0
- package/dist/component.js +170 -0
- package/dist/component.js.map +1 -0
- package/dist/event.d.ts +74 -0
- package/dist/event.d.ts.map +1 -0
- package/dist/event.js +263 -0
- package/dist/event.js.map +1 -0
- package/dist/freebusy.d.ts +45 -0
- package/dist/freebusy.d.ts.map +1 -0
- package/dist/freebusy.js +111 -0
- package/dist/freebusy.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/journal.d.ts +48 -0
- package/dist/journal.d.ts.map +1 -0
- package/dist/journal.js +148 -0
- package/dist/journal.js.map +1 -0
- package/dist/parse.d.ts +27 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +140 -0
- package/dist/parse.js.map +1 -0
- package/dist/property-registry.d.ts +31 -0
- package/dist/property-registry.d.ts.map +1 -0
- package/dist/property-registry.js +83 -0
- package/dist/property-registry.js.map +1 -0
- package/dist/property.d.ts +36 -0
- package/dist/property.d.ts.map +1 -0
- package/dist/property.js +135 -0
- package/dist/property.js.map +1 -0
- package/dist/timezone.d.ts +55 -0
- package/dist/timezone.d.ts.map +1 -0
- package/dist/timezone.js +141 -0
- package/dist/timezone.js.map +1 -0
- package/dist/todo.d.ts +67 -0
- package/dist/todo.d.ts.map +1 -0
- package/dist/todo.js +220 -0
- package/dist/todo.js.map +1 -0
- package/dist/tokenize.d.ts +22 -0
- package/dist/tokenize.d.ts.map +1 -0
- package/dist/tokenize.js +95 -0
- package/dist/tokenize.js.map +1 -0
- package/dist/types.d.ts +100 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/value-types.d.ts +81 -0
- package/dist/value-types.d.ts.map +1 -0
- package/dist/value-types.js +445 -0
- package/dist/value-types.js.map +1 -0
- package/package.json +45 -0
- package/src/alarm.ts +105 -0
- package/src/calendar.ts +153 -0
- package/src/component.ts +193 -0
- package/src/event.ts +307 -0
- package/src/freebusy.ts +133 -0
- package/src/index.ts +85 -0
- package/src/journal.ts +174 -0
- package/src/parse.ts +166 -0
- package/src/property-registry.ts +124 -0
- package/src/property.ts +163 -0
- package/src/timezone.ts +169 -0
- package/src/todo.ts +253 -0
- package/src/tokenize.ts +99 -0
- package/src/types.ts +135 -0
- package/src/value-types.ts +498 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VTIMEZONE, DAYLIGHT, and STANDARD components (RFC 5545 §3.6.5)
|
|
3
|
+
*
|
|
4
|
+
* VTIMEZONE contains one or more DAYLIGHT or STANDARD sub-components that
|
|
5
|
+
* define the UTC offset rules.
|
|
6
|
+
*/
|
|
7
|
+
import { Component } from './component.js';
|
|
8
|
+
import type { ICalDateTime, ICalUtcOffset, ICalRecur } from './types.js';
|
|
9
|
+
export declare class TimezoneRule extends Component {
|
|
10
|
+
constructor(type: 'STANDARD' | 'DAYLIGHT');
|
|
11
|
+
get dtstart(): ICalDateTime | null;
|
|
12
|
+
set dtstart(v: ICalDateTime);
|
|
13
|
+
get tzoffsetfrom(): ICalUtcOffset | null;
|
|
14
|
+
set tzoffsetfrom(v: ICalUtcOffset);
|
|
15
|
+
get tzoffsetto(): ICalUtcOffset | null;
|
|
16
|
+
set tzoffsetto(v: ICalUtcOffset);
|
|
17
|
+
get tzname(): string | null;
|
|
18
|
+
set tzname(v: string);
|
|
19
|
+
get rrule(): ICalRecur | null;
|
|
20
|
+
set rrule(v: ICalRecur);
|
|
21
|
+
toString(): string;
|
|
22
|
+
}
|
|
23
|
+
export declare class Standard extends TimezoneRule {
|
|
24
|
+
constructor();
|
|
25
|
+
}
|
|
26
|
+
export declare class Daylight extends TimezoneRule {
|
|
27
|
+
constructor();
|
|
28
|
+
}
|
|
29
|
+
export declare class Timezone extends Component {
|
|
30
|
+
constructor();
|
|
31
|
+
/** TZID is required (RFC 5545 §3.6.5). */
|
|
32
|
+
get tzid(): string | null;
|
|
33
|
+
set tzid(v: string);
|
|
34
|
+
get tzurl(): string | null;
|
|
35
|
+
set tzurl(v: string);
|
|
36
|
+
get lastModified(): ICalDateTime | null;
|
|
37
|
+
set lastModified(v: ICalDateTime);
|
|
38
|
+
get standardRules(): TimezoneRule[];
|
|
39
|
+
get daylightRules(): TimezoneRule[];
|
|
40
|
+
addStandard(rule: Standard): this;
|
|
41
|
+
addDaylight(rule: Daylight): this;
|
|
42
|
+
toString(): string;
|
|
43
|
+
static fromRaw(props: ReadonlyArray<{
|
|
44
|
+
name: string;
|
|
45
|
+
params: Record<string, string>;
|
|
46
|
+
value: string;
|
|
47
|
+
}>, subcomponents: Component[]): Timezone;
|
|
48
|
+
}
|
|
49
|
+
/** Build a TimezoneRule (STANDARD or DAYLIGHT) from raw parsed data. */
|
|
50
|
+
export declare function buildTimezoneRule(type: string, props: ReadonlyArray<{
|
|
51
|
+
name: string;
|
|
52
|
+
params: Record<string, string>;
|
|
53
|
+
value: string;
|
|
54
|
+
}>): TimezoneRule;
|
|
55
|
+
//# sourceMappingURL=timezone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timezone.d.ts","sourceRoot":"","sources":["../src/timezone.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIzE,qBAAa,YAAa,SAAQ,SAAS;gBAC7B,IAAI,EAAE,UAAU,GAAG,UAAU;IAIzC,IAAI,OAAO,IAAI,YAAY,GAAG,IAAI,CAKjC;IACD,IAAI,OAAO,CAAC,CAAC,EAAE,YAAY,EAE1B;IAED,IAAI,YAAY,IAAI,aAAa,GAAG,IAAI,CAKvC;IACD,IAAI,YAAY,CAAC,CAAC,EAAE,aAAa,EAEhC;IAED,IAAI,UAAU,IAAI,aAAa,GAAG,IAAI,CAKrC;IACD,IAAI,UAAU,CAAC,CAAC,EAAE,aAAa,EAE9B;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM,EAEnB;IAED,IAAI,KAAK,IAAI,SAAS,GAAG,IAAI,CAG5B;IACD,IAAI,KAAK,CAAC,CAAC,EAAE,SAAS,EAErB;IAIQ,QAAQ,IAAI,MAAM;CAM5B;AAED,qBAAa,QAAS,SAAQ,YAAY;;CAEzC;AAED,qBAAa,QAAS,SAAQ,YAAY;;CAEzC;AAID,qBAAa,QAAS,SAAQ,SAAS;;IAKrC,0CAA0C;IAC1C,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,CAExB;IACD,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAEjB;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IACD,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAElB;IAED,IAAI,YAAY,IAAI,YAAY,GAAG,IAAI,CAKtC;IACD,IAAI,YAAY,CAAC,CAAC,EAAE,YAAY,EAE/B;IAED,IAAI,aAAa,IAAI,YAAY,EAAE,CAElC;IAED,IAAI,aAAa,IAAI,YAAY,EAAE,CAElC;IAED,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAKjC,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAOxB,QAAQ,IAAI,MAAM;IAU3B,MAAM,CAAC,OAAO,CACZ,KAAK,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EACrF,aAAa,EAAE,SAAS,EAAE,GACzB,QAAQ;CAUZ;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GACpF,YAAY,CAMd"}
|
package/dist/timezone.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VTIMEZONE, DAYLIGHT, and STANDARD components (RFC 5545 §3.6.5)
|
|
3
|
+
*
|
|
4
|
+
* VTIMEZONE contains one or more DAYLIGHT or STANDARD sub-components that
|
|
5
|
+
* define the UTC offset rules.
|
|
6
|
+
*/
|
|
7
|
+
import { Component } from './component.js';
|
|
8
|
+
import { parseProperty } from './property.js';
|
|
9
|
+
// ── STANDARD / DAYLIGHT ──────────────────────────────────────────────────
|
|
10
|
+
export class TimezoneRule extends Component {
|
|
11
|
+
constructor(type) {
|
|
12
|
+
super(type);
|
|
13
|
+
}
|
|
14
|
+
get dtstart() {
|
|
15
|
+
const v = this.getValue('DTSTART');
|
|
16
|
+
return typeof v === 'object' && v !== null && v.type === 'date-time'
|
|
17
|
+
? v
|
|
18
|
+
: null;
|
|
19
|
+
}
|
|
20
|
+
set dtstart(v) {
|
|
21
|
+
this.setProperty('DTSTART', v);
|
|
22
|
+
}
|
|
23
|
+
get tzoffsetfrom() {
|
|
24
|
+
const v = this.getValue('TZOFFSETFROM');
|
|
25
|
+
return typeof v === 'object' && v !== null && v.type === 'utc-offset'
|
|
26
|
+
? v
|
|
27
|
+
: null;
|
|
28
|
+
}
|
|
29
|
+
set tzoffsetfrom(v) {
|
|
30
|
+
this.setProperty('TZOFFSETFROM', v);
|
|
31
|
+
}
|
|
32
|
+
get tzoffsetto() {
|
|
33
|
+
const v = this.getValue('TZOFFSETTO');
|
|
34
|
+
return typeof v === 'object' && v !== null && v.type === 'utc-offset'
|
|
35
|
+
? v
|
|
36
|
+
: null;
|
|
37
|
+
}
|
|
38
|
+
set tzoffsetto(v) {
|
|
39
|
+
this.setProperty('TZOFFSETTO', v);
|
|
40
|
+
}
|
|
41
|
+
get tzname() {
|
|
42
|
+
return this.getProperty('TZNAME')?.text ?? null;
|
|
43
|
+
}
|
|
44
|
+
set tzname(v) {
|
|
45
|
+
this.setProperty('TZNAME', v);
|
|
46
|
+
}
|
|
47
|
+
get rrule() {
|
|
48
|
+
const v = this.getValue('RRULE');
|
|
49
|
+
return typeof v === 'object' && v !== null && v.type === 'recur' ? v : null;
|
|
50
|
+
}
|
|
51
|
+
set rrule(v) {
|
|
52
|
+
this.setProperty('RRULE', v);
|
|
53
|
+
}
|
|
54
|
+
// ── Strict validation ────────────────────────────────────────────────
|
|
55
|
+
toString() {
|
|
56
|
+
if (!this.dtstart)
|
|
57
|
+
throw new Error(`${this.type}: DTSTART is required`);
|
|
58
|
+
if (!this.tzoffsetfrom)
|
|
59
|
+
throw new Error(`${this.type}: TZOFFSETFROM is required`);
|
|
60
|
+
if (!this.tzoffsetto)
|
|
61
|
+
throw new Error(`${this.type}: TZOFFSETTO is required`);
|
|
62
|
+
return super.toString();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export class Standard extends TimezoneRule {
|
|
66
|
+
constructor() { super('STANDARD'); }
|
|
67
|
+
}
|
|
68
|
+
export class Daylight extends TimezoneRule {
|
|
69
|
+
constructor() { super('DAYLIGHT'); }
|
|
70
|
+
}
|
|
71
|
+
// ── VTIMEZONE ─────────────────────────────────────────────────────────────
|
|
72
|
+
export class Timezone extends Component {
|
|
73
|
+
constructor() {
|
|
74
|
+
super('VTIMEZONE');
|
|
75
|
+
}
|
|
76
|
+
/** TZID is required (RFC 5545 §3.6.5). */
|
|
77
|
+
get tzid() {
|
|
78
|
+
return this.getProperty('TZID')?.text ?? null;
|
|
79
|
+
}
|
|
80
|
+
set tzid(v) {
|
|
81
|
+
this.setProperty('TZID', v);
|
|
82
|
+
}
|
|
83
|
+
get tzurl() {
|
|
84
|
+
return this.getProperty('TZURL')?.text ?? null;
|
|
85
|
+
}
|
|
86
|
+
set tzurl(v) {
|
|
87
|
+
this.setProperty('TZURL', v);
|
|
88
|
+
}
|
|
89
|
+
get lastModified() {
|
|
90
|
+
const v = this.getValue('LAST-MODIFIED');
|
|
91
|
+
return typeof v === 'object' && v !== null && v.type === 'date-time'
|
|
92
|
+
? v
|
|
93
|
+
: null;
|
|
94
|
+
}
|
|
95
|
+
set lastModified(v) {
|
|
96
|
+
this.setProperty('LAST-MODIFIED', v);
|
|
97
|
+
}
|
|
98
|
+
get standardRules() {
|
|
99
|
+
return this.getComponents('STANDARD');
|
|
100
|
+
}
|
|
101
|
+
get daylightRules() {
|
|
102
|
+
return this.getComponents('DAYLIGHT');
|
|
103
|
+
}
|
|
104
|
+
addStandard(rule) {
|
|
105
|
+
this.addComponent(rule);
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
addDaylight(rule) {
|
|
109
|
+
this.addComponent(rule);
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
// ── Strict validation ────────────────────────────────────────────────
|
|
113
|
+
toString() {
|
|
114
|
+
if (!this.tzid)
|
|
115
|
+
throw new Error('VTIMEZONE: TZID is required');
|
|
116
|
+
if (this.components.length === 0) {
|
|
117
|
+
throw new Error('VTIMEZONE: at least one STANDARD or DAYLIGHT sub-component is required');
|
|
118
|
+
}
|
|
119
|
+
return super.toString();
|
|
120
|
+
}
|
|
121
|
+
// ── Factory ──────────────────────────────────────────────────────────
|
|
122
|
+
static fromRaw(props, subcomponents) {
|
|
123
|
+
const tz = new Timezone();
|
|
124
|
+
for (const { name, params, value } of props) {
|
|
125
|
+
tz.addProperty(parseProperty(name, value, params));
|
|
126
|
+
}
|
|
127
|
+
for (const sub of subcomponents) {
|
|
128
|
+
tz.addComponent(sub);
|
|
129
|
+
}
|
|
130
|
+
return tz;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Build a TimezoneRule (STANDARD or DAYLIGHT) from raw parsed data. */
|
|
134
|
+
export function buildTimezoneRule(type, props) {
|
|
135
|
+
const rule = type.toUpperCase() === 'DAYLIGHT' ? new Daylight() : new Standard();
|
|
136
|
+
for (const { name, params, value } of props) {
|
|
137
|
+
rule.addProperty(parseProperty(name, value, params));
|
|
138
|
+
}
|
|
139
|
+
return rule;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=timezone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timezone.js","sourceRoot":"","sources":["../src/timezone.ts"],"names":[],"mappings":"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"}
|
package/dist/todo.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VTODO component (RFC 5545 §3.6.2)
|
|
3
|
+
*
|
|
4
|
+
* UID and DTSTAMP are required.
|
|
5
|
+
* DTSTART and DUE/DURATION are optional.
|
|
6
|
+
* DTEND MUST NOT be present when DURATION is present.
|
|
7
|
+
*/
|
|
8
|
+
import { Component } from './component.js';
|
|
9
|
+
import { Property } from './property.js';
|
|
10
|
+
import { Alarm } from './alarm.js';
|
|
11
|
+
import type { ICalDate, ICalDateTime, ICalDuration, ICalRecur, ICalGeo, ICalValue } from './types.js';
|
|
12
|
+
export declare class Todo extends Component {
|
|
13
|
+
constructor();
|
|
14
|
+
get uid(): string | null;
|
|
15
|
+
set uid(v: string);
|
|
16
|
+
get dtstamp(): ICalDateTime | null;
|
|
17
|
+
set dtstamp(v: ICalDateTime | Date);
|
|
18
|
+
get dtstart(): ICalDateTime | ICalDate | null;
|
|
19
|
+
set dtstart(v: ICalDateTime | ICalDate | Date);
|
|
20
|
+
get due(): ICalDateTime | ICalDate | null;
|
|
21
|
+
set due(v: ICalDateTime | ICalDate | Date);
|
|
22
|
+
get completed(): ICalDateTime | null;
|
|
23
|
+
set completed(v: ICalDateTime | Date);
|
|
24
|
+
get duration(): ICalDuration | null;
|
|
25
|
+
set duration(v: ICalDuration);
|
|
26
|
+
get summary(): string | null;
|
|
27
|
+
set summary(v: string);
|
|
28
|
+
get description(): string | null;
|
|
29
|
+
set description(v: string);
|
|
30
|
+
get location(): string | null;
|
|
31
|
+
set location(v: string);
|
|
32
|
+
get status(): 'NEEDS-ACTION' | 'COMPLETED' | 'IN-PROCESS' | 'CANCELLED' | string | null;
|
|
33
|
+
set status(v: string);
|
|
34
|
+
get priority(): number | null;
|
|
35
|
+
set priority(v: number);
|
|
36
|
+
get percentComplete(): number | null;
|
|
37
|
+
set percentComplete(v: number);
|
|
38
|
+
get sequence(): number | null;
|
|
39
|
+
set sequence(v: number);
|
|
40
|
+
get klass(): string | null;
|
|
41
|
+
set klass(v: string);
|
|
42
|
+
get url(): string | null;
|
|
43
|
+
set url(v: string);
|
|
44
|
+
get geo(): ICalGeo | null;
|
|
45
|
+
set geo(v: ICalGeo);
|
|
46
|
+
get organizer(): string | null;
|
|
47
|
+
set organizer(v: string);
|
|
48
|
+
get created(): ICalDateTime | null;
|
|
49
|
+
set created(v: ICalDateTime | Date);
|
|
50
|
+
get lastModified(): ICalDateTime | null;
|
|
51
|
+
set lastModified(v: ICalDateTime | Date);
|
|
52
|
+
get attendees(): Property[];
|
|
53
|
+
addAttendee(calAddress: string, params?: Record<string, string>): this;
|
|
54
|
+
get categories(): ICalValue[];
|
|
55
|
+
set categories(v: string[]);
|
|
56
|
+
get rrules(): ICalRecur[];
|
|
57
|
+
addRrule(v: ICalRecur): this;
|
|
58
|
+
get alarms(): Alarm[];
|
|
59
|
+
addAlarm(alarm: Alarm): this;
|
|
60
|
+
toString(): string;
|
|
61
|
+
static fromRaw(props: ReadonlyArray<{
|
|
62
|
+
name: string;
|
|
63
|
+
params: Record<string, string>;
|
|
64
|
+
value: string;
|
|
65
|
+
}>, subcomponents?: Component[]): Todo;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=todo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo.d.ts","sourceRoot":"","sources":["../src/todo.ts"],"names":[],"mappings":"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"}
|
package/dist/todo.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VTODO component (RFC 5545 §3.6.2)
|
|
3
|
+
*
|
|
4
|
+
* UID and DTSTAMP are required.
|
|
5
|
+
* DTSTART and DUE/DURATION are optional.
|
|
6
|
+
* DTEND MUST NOT be present when DURATION is present.
|
|
7
|
+
*/
|
|
8
|
+
import { Component } from './component.js';
|
|
9
|
+
import { parseProperty } from './property.js';
|
|
10
|
+
export class Todo extends Component {
|
|
11
|
+
constructor() {
|
|
12
|
+
super('VTODO');
|
|
13
|
+
}
|
|
14
|
+
// ── Required ─────────────────────────────────────────────────────────
|
|
15
|
+
get uid() {
|
|
16
|
+
return this.getProperty('UID')?.text ?? null;
|
|
17
|
+
}
|
|
18
|
+
set uid(v) {
|
|
19
|
+
this.setProperty('UID', v);
|
|
20
|
+
}
|
|
21
|
+
get dtstamp() {
|
|
22
|
+
const v = this.getValue('DTSTAMP');
|
|
23
|
+
return v && typeof v === 'object' && v.type === 'date-time' ? v : null;
|
|
24
|
+
}
|
|
25
|
+
set dtstamp(v) {
|
|
26
|
+
this.setProperty('DTSTAMP', v instanceof Date
|
|
27
|
+
? { type: 'date-time', year: v.getUTCFullYear(), month: v.getUTCMonth() + 1, day: v.getUTCDate(), hour: v.getUTCHours(), minute: v.getUTCMinutes(), second: v.getUTCSeconds(), utc: true }
|
|
28
|
+
: v);
|
|
29
|
+
}
|
|
30
|
+
// ── Date/time ─────────────────────────────────────────────────────────
|
|
31
|
+
get dtstart() {
|
|
32
|
+
const v = this.getValue('DTSTART');
|
|
33
|
+
if (!v || typeof v !== 'object')
|
|
34
|
+
return null;
|
|
35
|
+
return v.type === 'date-time' || v.type === 'date' ? v : null;
|
|
36
|
+
}
|
|
37
|
+
set dtstart(v) {
|
|
38
|
+
if (v instanceof Date) {
|
|
39
|
+
this.setProperty('DTSTART', { type: 'date-time', year: v.getUTCFullYear(), month: v.getUTCMonth() + 1, day: v.getUTCDate(), hour: v.getUTCHours(), minute: v.getUTCMinutes(), second: v.getUTCSeconds(), utc: true });
|
|
40
|
+
}
|
|
41
|
+
else if (v.type === 'date') {
|
|
42
|
+
this.setProperty('DTSTART', v, { VALUE: 'DATE' });
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this.setProperty('DTSTART', v);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
get due() {
|
|
49
|
+
const v = this.getValue('DUE');
|
|
50
|
+
if (!v || typeof v !== 'object')
|
|
51
|
+
return null;
|
|
52
|
+
return v.type === 'date-time' || v.type === 'date' ? v : null;
|
|
53
|
+
}
|
|
54
|
+
set due(v) {
|
|
55
|
+
if (v instanceof Date) {
|
|
56
|
+
this.setProperty('DUE', { type: 'date-time', year: v.getUTCFullYear(), month: v.getUTCMonth() + 1, day: v.getUTCDate(), hour: v.getUTCHours(), minute: v.getUTCMinutes(), second: v.getUTCSeconds(), utc: true });
|
|
57
|
+
}
|
|
58
|
+
else if (v.type === 'date') {
|
|
59
|
+
this.setProperty('DUE', v, { VALUE: 'DATE' });
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
this.setProperty('DUE', v);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
get completed() {
|
|
66
|
+
const v = this.getValue('COMPLETED');
|
|
67
|
+
return v && typeof v === 'object' && v.type === 'date-time' ? v : null;
|
|
68
|
+
}
|
|
69
|
+
set completed(v) {
|
|
70
|
+
this.setProperty('COMPLETED', v instanceof Date
|
|
71
|
+
? { type: 'date-time', year: v.getUTCFullYear(), month: v.getUTCMonth() + 1, day: v.getUTCDate(), hour: v.getUTCHours(), minute: v.getUTCMinutes(), second: v.getUTCSeconds(), utc: true }
|
|
72
|
+
: v);
|
|
73
|
+
}
|
|
74
|
+
get duration() {
|
|
75
|
+
const v = this.getValue('DURATION');
|
|
76
|
+
return v && typeof v === 'object' && v.type === 'duration' ? v : null;
|
|
77
|
+
}
|
|
78
|
+
set duration(v) {
|
|
79
|
+
this.setProperty('DURATION', v);
|
|
80
|
+
}
|
|
81
|
+
// ── Descriptive ──────────────────────────────────────────────────────
|
|
82
|
+
get summary() {
|
|
83
|
+
return this.getProperty('SUMMARY')?.text ?? null;
|
|
84
|
+
}
|
|
85
|
+
set summary(v) {
|
|
86
|
+
this.setProperty('SUMMARY', v);
|
|
87
|
+
}
|
|
88
|
+
get description() {
|
|
89
|
+
return this.getProperty('DESCRIPTION')?.text ?? null;
|
|
90
|
+
}
|
|
91
|
+
set description(v) {
|
|
92
|
+
this.setProperty('DESCRIPTION', v);
|
|
93
|
+
}
|
|
94
|
+
get location() {
|
|
95
|
+
return this.getProperty('LOCATION')?.text ?? null;
|
|
96
|
+
}
|
|
97
|
+
set location(v) {
|
|
98
|
+
this.setProperty('LOCATION', v);
|
|
99
|
+
}
|
|
100
|
+
get status() {
|
|
101
|
+
return this.getProperty('STATUS')?.text ?? null;
|
|
102
|
+
}
|
|
103
|
+
set status(v) {
|
|
104
|
+
this.setProperty('STATUS', v);
|
|
105
|
+
}
|
|
106
|
+
get priority() {
|
|
107
|
+
return this.getProperty('PRIORITY')?.number ?? null;
|
|
108
|
+
}
|
|
109
|
+
set priority(v) {
|
|
110
|
+
this.setProperty('PRIORITY', Math.max(0, Math.min(9, Math.trunc(v))));
|
|
111
|
+
}
|
|
112
|
+
get percentComplete() {
|
|
113
|
+
return this.getProperty('PERCENT-COMPLETE')?.number ?? null;
|
|
114
|
+
}
|
|
115
|
+
set percentComplete(v) {
|
|
116
|
+
this.setProperty('PERCENT-COMPLETE', Math.max(0, Math.min(100, Math.trunc(v))));
|
|
117
|
+
}
|
|
118
|
+
get sequence() {
|
|
119
|
+
return this.getProperty('SEQUENCE')?.number ?? null;
|
|
120
|
+
}
|
|
121
|
+
set sequence(v) {
|
|
122
|
+
this.setProperty('SEQUENCE', Math.max(0, Math.trunc(v)));
|
|
123
|
+
}
|
|
124
|
+
get klass() {
|
|
125
|
+
return this.getProperty('CLASS')?.text ?? null;
|
|
126
|
+
}
|
|
127
|
+
set klass(v) {
|
|
128
|
+
this.setProperty('CLASS', v);
|
|
129
|
+
}
|
|
130
|
+
get url() {
|
|
131
|
+
return this.getProperty('URL')?.text ?? null;
|
|
132
|
+
}
|
|
133
|
+
set url(v) {
|
|
134
|
+
this.setProperty('URL', v);
|
|
135
|
+
}
|
|
136
|
+
get geo() {
|
|
137
|
+
const v = this.getValue('GEO');
|
|
138
|
+
return v && typeof v === 'object' && v.type === 'geo' ? v : null;
|
|
139
|
+
}
|
|
140
|
+
set geo(v) {
|
|
141
|
+
this.setProperty('GEO', v);
|
|
142
|
+
}
|
|
143
|
+
get organizer() {
|
|
144
|
+
return this.getProperty('ORGANIZER')?.text ?? null;
|
|
145
|
+
}
|
|
146
|
+
set organizer(v) {
|
|
147
|
+
this.setProperty('ORGANIZER', v);
|
|
148
|
+
}
|
|
149
|
+
get created() {
|
|
150
|
+
const v = this.getValue('CREATED');
|
|
151
|
+
return v && typeof v === 'object' && v.type === 'date-time' ? v : null;
|
|
152
|
+
}
|
|
153
|
+
set created(v) {
|
|
154
|
+
this.setProperty('CREATED', v instanceof Date
|
|
155
|
+
? { type: 'date-time', year: v.getUTCFullYear(), month: v.getUTCMonth() + 1, day: v.getUTCDate(), hour: v.getUTCHours(), minute: v.getUTCMinutes(), second: v.getUTCSeconds(), utc: true }
|
|
156
|
+
: v);
|
|
157
|
+
}
|
|
158
|
+
get lastModified() {
|
|
159
|
+
const v = this.getValue('LAST-MODIFIED');
|
|
160
|
+
return v && typeof v === 'object' && v.type === 'date-time' ? v : null;
|
|
161
|
+
}
|
|
162
|
+
set lastModified(v) {
|
|
163
|
+
this.setProperty('LAST-MODIFIED', v instanceof Date
|
|
164
|
+
? { type: 'date-time', year: v.getUTCFullYear(), month: v.getUTCMonth() + 1, day: v.getUTCDate(), hour: v.getUTCHours(), minute: v.getUTCMinutes(), second: v.getUTCSeconds(), utc: true }
|
|
165
|
+
: v);
|
|
166
|
+
}
|
|
167
|
+
// ── Multi-occurrence ──────────────────────────────────────────────────
|
|
168
|
+
get attendees() {
|
|
169
|
+
return this.getProperties('ATTENDEE');
|
|
170
|
+
}
|
|
171
|
+
addAttendee(calAddress, params = {}) {
|
|
172
|
+
this.appendProperty('ATTENDEE', calAddress, params);
|
|
173
|
+
return this;
|
|
174
|
+
}
|
|
175
|
+
get categories() {
|
|
176
|
+
return this.getValues('CATEGORIES');
|
|
177
|
+
}
|
|
178
|
+
set categories(v) {
|
|
179
|
+
this.setProperty('CATEGORIES', v);
|
|
180
|
+
}
|
|
181
|
+
get rrules() {
|
|
182
|
+
return this.getProperties('RRULE')
|
|
183
|
+
.map((p) => p.scalar)
|
|
184
|
+
.filter((v) => typeof v === 'object' && v !== null && v.type === 'recur');
|
|
185
|
+
}
|
|
186
|
+
addRrule(v) {
|
|
187
|
+
this.appendProperty('RRULE', v);
|
|
188
|
+
return this;
|
|
189
|
+
}
|
|
190
|
+
get alarms() {
|
|
191
|
+
return this.getComponents('VALARM');
|
|
192
|
+
}
|
|
193
|
+
addAlarm(alarm) {
|
|
194
|
+
this.addComponent(alarm);
|
|
195
|
+
return this;
|
|
196
|
+
}
|
|
197
|
+
// ── Validation ────────────────────────────────────────────────────────
|
|
198
|
+
toString() {
|
|
199
|
+
if (!this.uid)
|
|
200
|
+
throw new Error('VTODO: UID is required');
|
|
201
|
+
if (!this.getProperty('DTSTAMP'))
|
|
202
|
+
throw new Error('VTODO: DTSTAMP is required');
|
|
203
|
+
if (this.getProperty('DUE') && this.getProperty('DURATION')) {
|
|
204
|
+
throw new Error('VTODO: DUE and DURATION MUST NOT both be present');
|
|
205
|
+
}
|
|
206
|
+
return super.toString();
|
|
207
|
+
}
|
|
208
|
+
// ── Factory ──────────────────────────────────────────────────────────
|
|
209
|
+
static fromRaw(props, subcomponents = []) {
|
|
210
|
+
const todo = new Todo();
|
|
211
|
+
for (const { name, params, value } of props) {
|
|
212
|
+
todo.addProperty(parseProperty(name, value, params));
|
|
213
|
+
}
|
|
214
|
+
for (const sub of subcomponents) {
|
|
215
|
+
todo.addComponent(sub);
|
|
216
|
+
}
|
|
217
|
+
return todo;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=todo.js.map
|
package/dist/todo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo.js","sourceRoot":"","sources":["../src/todo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Low-level iCalendar tokenizer.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - CRLF, LF, and bare CR line endings (tolerant)
|
|
6
|
+
* - Line unfolding (RFC 5545 §3.1: lines starting with SPACE or HTAB are continuations)
|
|
7
|
+
* - Content line parsing: name, parameters, value
|
|
8
|
+
* - Quoted parameter values
|
|
9
|
+
* - Multi-value parameters (comma-separated)
|
|
10
|
+
*/
|
|
11
|
+
import type { ContentLine } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Parse a single content line into its name, parameters, and value.
|
|
14
|
+
* Returns null for empty or unparseable lines (tolerant).
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseContentLine(line: string): ContentLine | null;
|
|
17
|
+
/**
|
|
18
|
+
* Tokenize an iCalendar string into an array of content lines.
|
|
19
|
+
* Tolerant: skips blank lines and unparseable content.
|
|
20
|
+
*/
|
|
21
|
+
export declare function tokenize(src: string): ContentLine[];
|
|
22
|
+
//# sourceMappingURL=tokenize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAU9C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA0DjE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CASnD"}
|
package/dist/tokenize.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Low-level iCalendar tokenizer.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - CRLF, LF, and bare CR line endings (tolerant)
|
|
6
|
+
* - Line unfolding (RFC 5545 §3.1: lines starting with SPACE or HTAB are continuations)
|
|
7
|
+
* - Content line parsing: name, parameters, value
|
|
8
|
+
* - Quoted parameter values
|
|
9
|
+
* - Multi-value parameters (comma-separated)
|
|
10
|
+
*/
|
|
11
|
+
/** Normalize line endings and unfold continuation lines. */
|
|
12
|
+
function unfold(str) {
|
|
13
|
+
return str
|
|
14
|
+
.replace(/\r\n/g, '\n')
|
|
15
|
+
.replace(/\r/g, '\n')
|
|
16
|
+
.replace(/\n[ \t]/g, ''); // RFC 5545 §3.1 unfolding
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse a single content line into its name, parameters, and value.
|
|
20
|
+
* Returns null for empty or unparseable lines (tolerant).
|
|
21
|
+
*/
|
|
22
|
+
export function parseContentLine(line) {
|
|
23
|
+
const len = line.length;
|
|
24
|
+
if (len === 0)
|
|
25
|
+
return null;
|
|
26
|
+
let i = 0;
|
|
27
|
+
// ── name ──────────────────────────────────────────────────────────────────
|
|
28
|
+
// RFC 5545: name = iana-token / x-name
|
|
29
|
+
// iana-token = 1*(ALPHA / DIGIT / "-")
|
|
30
|
+
const nameStart = i;
|
|
31
|
+
while (i < len && line[i] !== ':' && line[i] !== ';')
|
|
32
|
+
i++;
|
|
33
|
+
const name = line.slice(nameStart, i).trim().toUpperCase();
|
|
34
|
+
if (!name)
|
|
35
|
+
return null;
|
|
36
|
+
// ── parameters ────────────────────────────────────────────────────────────
|
|
37
|
+
const params = {};
|
|
38
|
+
while (i < len && line[i] === ';') {
|
|
39
|
+
i++; // consume ';'
|
|
40
|
+
// param-name
|
|
41
|
+
const pnStart = i;
|
|
42
|
+
while (i < len && line[i] !== '=' && line[i] !== ';' && line[i] !== ':')
|
|
43
|
+
i++;
|
|
44
|
+
const paramName = line.slice(pnStart, i).trim().toUpperCase();
|
|
45
|
+
const values = [];
|
|
46
|
+
if (i < len && line[i] === '=') {
|
|
47
|
+
i++; // consume '='
|
|
48
|
+
// One or more comma-separated param-values
|
|
49
|
+
do {
|
|
50
|
+
if (i < len && line[i] === '"') {
|
|
51
|
+
// Quoted string (DQUOTE *QSAFE-CHAR DQUOTE)
|
|
52
|
+
i++; // consume opening '"'
|
|
53
|
+
const vStart = i;
|
|
54
|
+
while (i < len && line[i] !== '"')
|
|
55
|
+
i++;
|
|
56
|
+
values.push(line.slice(vStart, i));
|
|
57
|
+
if (i < len)
|
|
58
|
+
i++; // consume closing '"'
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Unquoted param-value: everything up to ',' ';' ':'
|
|
62
|
+
const vStart = i;
|
|
63
|
+
while (i < len && line[i] !== ',' && line[i] !== ';' && line[i] !== ':')
|
|
64
|
+
i++;
|
|
65
|
+
values.push(line.slice(vStart, i).trim());
|
|
66
|
+
}
|
|
67
|
+
} while (i < len && line[i] === ',' && ++i); // consume ',' between values
|
|
68
|
+
}
|
|
69
|
+
if (paramName) {
|
|
70
|
+
params[paramName] = values.length === 1 ? (values[0] ?? '') : values;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ── value ─────────────────────────────────────────────────────────────────
|
|
74
|
+
if (i < len && line[i] === ':')
|
|
75
|
+
i++; // consume ':'
|
|
76
|
+
const value = line.slice(i);
|
|
77
|
+
return { name, params, value };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Tokenize an iCalendar string into an array of content lines.
|
|
81
|
+
* Tolerant: skips blank lines and unparseable content.
|
|
82
|
+
*/
|
|
83
|
+
export function tokenize(src) {
|
|
84
|
+
const lines = unfold(src).split('\n');
|
|
85
|
+
const result = [];
|
|
86
|
+
for (const line of lines) {
|
|
87
|
+
if (!line.trim())
|
|
88
|
+
continue;
|
|
89
|
+
const parsed = parseContentLine(line);
|
|
90
|
+
if (parsed)
|
|
91
|
+
result.push(parsed);
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=tokenize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":"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"}
|