iamcal 1.0.1 → 1.0.3
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/README.md +8 -4
- package/lib/index.d.ts +110 -9
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +418 -7
- package/lib/io.js +28 -3
- package/lib/parse.js +135 -30
- package/lib/types.d.ts +6 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +3 -0
- package/package.json +18 -11
- package/src/index.ts +383 -23
- package/src/types.ts +5 -0
- package/lib/index.js.map +0 -1
- package/lib/io.js.map +0 -1
- package/lib/parse.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# iamcal
|
|
1
|
+
# iamcal [](https://github.com/olillin/iamcal/actions/workflows/npm-test.yml) [](https://www.npmjs.com/package/iamcal)
|
|
2
2
|
|
|
3
3
|
A library for reading, modifying and writing [ICalendar](https://en.wikipedia.org/wiki/ICalendar) files.
|
|
4
4
|
|
|
@@ -10,9 +10,11 @@ A library for reading, modifying and writing [ICalendar](https://en.wikipedia.or
|
|
|
10
10
|
npm install iamcal
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
## Getting started
|
|
13
|
+
## Getting started
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
### Parsing and editing a calendar
|
|
16
|
+
|
|
17
|
+
This code:
|
|
16
18
|
|
|
17
19
|
```typescript
|
|
18
20
|
import { Calendar } from 'iamcal'
|
|
@@ -58,4 +60,6 @@ DTSTART:20241211T200000Z
|
|
|
58
60
|
DTEND:20241211T230000Z
|
|
59
61
|
END:VEVENT
|
|
60
62
|
END:VCALENDAR
|
|
61
|
-
```
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Creating a new calendar
|
package/lib/index.d.ts
CHANGED
|
@@ -1,36 +1,137 @@
|
|
|
1
|
-
|
|
2
|
-
name: string;
|
|
3
|
-
params: string[];
|
|
4
|
-
value: string;
|
|
5
|
-
}
|
|
1
|
+
import { Property } from './types';
|
|
6
2
|
export declare class Component {
|
|
7
3
|
name: string;
|
|
8
|
-
properties:
|
|
9
|
-
components:
|
|
10
|
-
constructor(name: string, properties?:
|
|
4
|
+
properties: Property[];
|
|
5
|
+
components: Component[];
|
|
6
|
+
constructor(name: string, properties?: Property[], components?: Component[]);
|
|
11
7
|
serialize(): string;
|
|
12
8
|
getProperty(name: string): Property | null;
|
|
13
9
|
setProperty(name: string, value: string): void;
|
|
10
|
+
removePropertiesWithName(name: string): void;
|
|
14
11
|
getPropertyParams(name: string): string[] | null;
|
|
15
12
|
setPropertyParams(name: string, params: string[]): void;
|
|
13
|
+
addComponent(component: Component): void;
|
|
14
|
+
removeComponent(component: Component): boolean;
|
|
15
|
+
getComponents(name: string): Component[];
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Represents a VCALENDAR component, the root component of an iCalendar file.
|
|
19
|
+
*/
|
|
17
20
|
export declare class Calendar extends Component {
|
|
18
21
|
name: string;
|
|
22
|
+
/**
|
|
23
|
+
* @param prodid A unique identifier of the program creating the calendar.
|
|
24
|
+
*
|
|
25
|
+
* Example: `-//Google Inc//Google Calendar 70.9054//EN`
|
|
26
|
+
*/
|
|
27
|
+
constructor(prodid: string);
|
|
28
|
+
/**
|
|
29
|
+
* @param prodid A unique identifier of the program creating the calendar.
|
|
30
|
+
*
|
|
31
|
+
* Example: `-//Google Inc//Google Calendar 70.9054//EN`
|
|
32
|
+
* @param version The version of the iCalendar specification that this calendar uses.
|
|
33
|
+
*/
|
|
34
|
+
constructor(prodid: string, version: string);
|
|
35
|
+
/**
|
|
36
|
+
* @param component A VCALENDAR component.
|
|
37
|
+
*/
|
|
38
|
+
constructor(component: Component);
|
|
39
|
+
events(): CalendarEvent[];
|
|
40
|
+
removeEvent(event: CalendarEvent): boolean;
|
|
41
|
+
removeEvent(uid: string): boolean;
|
|
42
|
+
prodId(): string;
|
|
43
|
+
setProdId(value: string): void;
|
|
44
|
+
version(): string;
|
|
45
|
+
setVersion(value: string): void;
|
|
46
|
+
calScale(): string | undefined;
|
|
47
|
+
setCalScale(value: string): void;
|
|
48
|
+
removeCalScale(): void;
|
|
49
|
+
method(): string | undefined;
|
|
50
|
+
setMethod(value: string): void;
|
|
51
|
+
removeMethod(): void;
|
|
52
|
+
calendarName(): string | undefined;
|
|
53
|
+
setCalendarName(value: string): void;
|
|
54
|
+
removeCalendarName(): void;
|
|
55
|
+
calendarDescription(): string | undefined;
|
|
56
|
+
setCalendarDescription(value: string): void;
|
|
57
|
+
removeCalendarDescription(): void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Represents a VTIMEZONE component, containing time zone definitions.
|
|
61
|
+
*/
|
|
62
|
+
export declare class TimeZone extends Component {
|
|
63
|
+
constructor(id: string);
|
|
19
64
|
constructor(component: Component);
|
|
20
|
-
|
|
65
|
+
id(): string;
|
|
66
|
+
setId(value: string): void;
|
|
67
|
+
lastMod(): Date | undefined;
|
|
68
|
+
setLastMod(value: Date): void;
|
|
69
|
+
removeLastMod(): void;
|
|
70
|
+
url(): string | undefined;
|
|
71
|
+
setUrl(value: string): void;
|
|
72
|
+
removeUrl(): void;
|
|
73
|
+
/** Get all time offsets. */
|
|
74
|
+
offsets(): TimeZoneOffset[];
|
|
75
|
+
/** Get standard/winter time offsets. */
|
|
76
|
+
standardOffsets(): TimeZoneOffset[];
|
|
77
|
+
/** Get daylight savings time offsets. */
|
|
78
|
+
daylightOffsets(): TimeZoneOffset[];
|
|
79
|
+
}
|
|
80
|
+
export type OffsetType = 'DAYLIGHT' | 'STANDARD';
|
|
81
|
+
type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
|
|
82
|
+
export type Offset = `${'-' | '+'}${Digit}${Digit}${Digit}${Digit}`;
|
|
83
|
+
/** Represents a STANDARD or DAYLIGHT component, defining a time zone offset. */
|
|
84
|
+
declare class TimeZoneOffset extends Component {
|
|
85
|
+
/**
|
|
86
|
+
*
|
|
87
|
+
* @param type If this is a STANDARD or DAYLIGHT component.
|
|
88
|
+
* @param start From when this offset is active.
|
|
89
|
+
* @param offsetFrom The offset that is in use prior to this time zone observance.
|
|
90
|
+
* @param offsetTo The offset that is in use during this time zone observance.
|
|
91
|
+
*/
|
|
92
|
+
constructor(type: OffsetType, start: Date, offsetFrom: Offset, offsetTo: Offset);
|
|
93
|
+
constructor(component: Component);
|
|
94
|
+
start(): Date;
|
|
95
|
+
setStart(value: Date): void;
|
|
96
|
+
offsetFrom(): Offset;
|
|
97
|
+
setOffsetFrom(value: Offset): void;
|
|
98
|
+
offsetTo(): Offset;
|
|
99
|
+
setOffsetTo(value: Offset): void;
|
|
100
|
+
comment(): string | undefined;
|
|
101
|
+
setComment(value: string): void;
|
|
102
|
+
removeComment(): void;
|
|
103
|
+
timeZoneName(): string | undefined;
|
|
104
|
+
setTimeZoneName(value: string): void;
|
|
105
|
+
removeTimeZoneName(): void;
|
|
21
106
|
}
|
|
22
107
|
export declare class CalendarEvent extends Component {
|
|
23
108
|
name: string;
|
|
109
|
+
constructor(uid: string, dtstamp: Date);
|
|
24
110
|
constructor(component: Component);
|
|
111
|
+
stamp(): Date;
|
|
112
|
+
setStamp(value: Date): void;
|
|
113
|
+
uid(): string;
|
|
114
|
+
setUid(value: string): void;
|
|
25
115
|
summary(): string;
|
|
26
116
|
setSummary(value: string): void;
|
|
117
|
+
removeSummary(): void;
|
|
27
118
|
description(): string;
|
|
28
119
|
setDescription(value: string): void;
|
|
120
|
+
removeDescription(): void;
|
|
29
121
|
location(): string | undefined;
|
|
30
122
|
setLocation(value: string): void;
|
|
123
|
+
removeLocation(): void;
|
|
31
124
|
start(): Date;
|
|
32
125
|
setStart(value: Date): void;
|
|
126
|
+
removeStart(): void;
|
|
33
127
|
end(): Date;
|
|
34
128
|
setEnd(value: Date): void;
|
|
129
|
+
removeEnd(): void;
|
|
130
|
+
created(): Date | undefined;
|
|
131
|
+
setCreated(value: Date): void;
|
|
132
|
+
removeCreated(): void;
|
|
133
|
+
geo(): [number, number] | undefined;
|
|
134
|
+
setGeo(latitude: number, longitude: number): void;
|
|
35
135
|
}
|
|
136
|
+
export {};
|
|
36
137
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAKlC,qBAAa,SAAS;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,QAAQ,EAAE,CAAA;IACtB,UAAU,EAAE,SAAS,EAAE,CAAA;gBAEX,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE;IAc3E,SAAS,IAAI,MAAM;IA+BnB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAS1C,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAcvC,wBAAwB,CAAC,IAAI,EAAE,MAAM;IAOrC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAShD,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;IAQhD,YAAY,CAAC,SAAS,EAAE,SAAS;IAIjC,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAU9C,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;CAW3C;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACnC,IAAI,SAAc;IAElB;;;;OAIG;gBACS,MAAM,EAAE,MAAM;IAC1B;;;;;OAKG;gBACS,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAC3C;;OAEG;gBACS,SAAS,EAAE,SAAS;IAehC,MAAM,IAAI,aAAa,EAAE;IAIzB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAC1C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAejC,MAAM,IAAI,MAAM;IAIhB,SAAS,CAAC,KAAK,EAAE,MAAM;IAIvB,OAAO,IAAI,MAAM;IAIjB,UAAU,CAAC,KAAK,EAAE,MAAM;IAIxB,QAAQ,IAAI,MAAM,GAAG,SAAS;IAI9B,WAAW,CAAC,KAAK,EAAE,MAAM;IAIzB,cAAc;IAId,MAAM,IAAI,MAAM,GAAG,SAAS;IAI5B,SAAS,CAAC,KAAK,EAAE,MAAM;IAIvB,YAAY;IAIZ,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC,eAAe,CAAC,KAAK,EAAE,MAAM;IAI7B,kBAAkB;IAIlB,mBAAmB,IAAI,MAAM,GAAG,SAAS;IAIzC,sBAAsB,CAAC,KAAK,EAAE,MAAM;IAIpC,yBAAyB;CAG5B;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,SAAS;gBACvB,EAAE,EAAE,MAAM;gBACV,SAAS,EAAE,SAAS;IAahC,EAAE,IAAI,MAAM;IAIZ,KAAK,CAAC,KAAK,EAAE,MAAM;IAInB,OAAO,IAAI,IAAI,GAAG,SAAS;IAM3B,UAAU,CAAC,KAAK,EAAE,IAAI;IAItB,aAAa;IAIb,GAAG,IAAI,MAAM,GAAG,SAAS;IAIzB,MAAM,CAAC,KAAK,EAAE,MAAM;IAIpB,SAAS;IAIT,4BAA4B;IAC5B,OAAO,IAAI,cAAc,EAAE;IAU3B,wCAAwC;IACxC,eAAe,IAAI,cAAc,EAAE;IAInC,yCAAyC;IACzC,eAAe,IAAI,cAAc,EAAE;CAGtC;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,CAAA;AAChD,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AACtE,MAAM,MAAM,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,CAAA;AACnE,gFAAgF;AAChF,cAAM,cAAe,SAAQ,SAAS;IAClC;;;;;;OAMG;gBACS,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;gBACnE,SAAS,EAAE,SAAS;IAkBhC,KAAK,IAAI,IAAI;IAIb,QAAQ,CAAC,KAAK,EAAE,IAAI;IAIpB,UAAU,IAAI,MAAM;IAIpB,aAAa,CAAC,KAAK,EAAE,MAAM;IAI3B,QAAQ,IAAI,MAAM;IAIlB,WAAW,CAAC,KAAK,EAAE,MAAM;IAIzB,OAAO,IAAI,MAAM,GAAG,SAAS;IAI7B,UAAU,CAAC,KAAK,EAAE,MAAM;IAIxB,aAAa;IAIb,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC,eAAe,CAAC,KAAK,EAAE,MAAM;IAI7B,kBAAkB;CAGrB;AAED,qBAAa,aAAc,SAAQ,SAAS;IACxC,IAAI,SAAW;gBAEH,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;gBAC1B,SAAS,EAAE,SAAS;IAehC,KAAK,IAAI,IAAI;IAIb,QAAQ,CAAC,KAAK,EAAE,IAAI;IAIpB,GAAG,IAAI,MAAM;IAIb,MAAM,CAAC,KAAK,EAAE,MAAM;IAIpB,OAAO,IAAI,MAAM;IAIjB,UAAU,CAAC,KAAK,EAAE,MAAM;IAIxB,aAAa;IAIb,WAAW,IAAI,MAAM;IAIrB,cAAc,CAAC,KAAK,EAAE,MAAM;IAI5B,iBAAiB;IAIjB,QAAQ,IAAI,MAAM,GAAG,SAAS;IAI9B,WAAW,CAAC,KAAK,EAAE,MAAM;IAIzB,cAAc;IAId,KAAK,IAAI,IAAI;IAIb,QAAQ,CAAC,KAAK,EAAE,IAAI;IAIpB,WAAW;IAIX,GAAG,IAAI,IAAI;IAIX,MAAM,CAAC,KAAK,EAAE,IAAI;IAIlB,SAAS;IAIT,OAAO,IAAI,IAAI,GAAG,SAAS;IAM3B,UAAU,CAAC,KAAK,EAAE,IAAI;IAItB,aAAa;IAIb,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;IASnC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAG7C"}
|
package/lib/index.js
CHANGED
|
@@ -1,8 +1,419 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CalendarEvent = exports.TimeZone = exports.Calendar = exports.Component = void 0;
|
|
2
4
|
// Max line length as defined by RFC 5545 3.1.
|
|
3
|
-
const MAX_LINE_LENGTH=75;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
const MAX_LINE_LENGTH = 75;
|
|
6
|
+
class Component {
|
|
7
|
+
name;
|
|
8
|
+
properties;
|
|
9
|
+
components;
|
|
10
|
+
constructor(name, properties, components) {
|
|
11
|
+
this.name = name;
|
|
12
|
+
if (properties) {
|
|
13
|
+
this.properties = properties;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
this.properties = new Array();
|
|
17
|
+
}
|
|
18
|
+
if (components) {
|
|
19
|
+
this.components = components;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
this.components = new Array();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
serialize() {
|
|
26
|
+
// Create lines
|
|
27
|
+
const lines = [`BEGIN:${this.name}`];
|
|
28
|
+
for (let property of this.properties) {
|
|
29
|
+
let line = property['name'] + //
|
|
30
|
+
property.params.map(p => ';' + p).join('') +
|
|
31
|
+
':' +
|
|
32
|
+
property['value'];
|
|
33
|
+
// Wrap lines
|
|
34
|
+
while (line.length > MAX_LINE_LENGTH) {
|
|
35
|
+
lines.push(line.substring(0, MAX_LINE_LENGTH));
|
|
36
|
+
line = ' ' + line.substring(MAX_LINE_LENGTH);
|
|
37
|
+
}
|
|
38
|
+
lines.push(line);
|
|
39
|
+
}
|
|
40
|
+
for (let component of this.components) {
|
|
41
|
+
lines.push(component.serialize());
|
|
42
|
+
}
|
|
43
|
+
lines.push(`END:${this.name}`);
|
|
44
|
+
// Join lines
|
|
45
|
+
const serialized = lines.join('\n');
|
|
46
|
+
return serialized;
|
|
47
|
+
}
|
|
48
|
+
getProperty(name) {
|
|
49
|
+
for (const property of this.properties) {
|
|
50
|
+
if (property.name === name) {
|
|
51
|
+
return property;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
setProperty(name, value) {
|
|
57
|
+
for (const property of this.properties) {
|
|
58
|
+
if (property.name === name) {
|
|
59
|
+
property.value = value;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
this.properties.push({
|
|
64
|
+
name: name,
|
|
65
|
+
params: [],
|
|
66
|
+
value: value,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
removePropertiesWithName(name) {
|
|
70
|
+
const index = this.properties.findIndex(p => p.name === name);
|
|
71
|
+
if (index === -1)
|
|
72
|
+
return;
|
|
73
|
+
// Remove property at index
|
|
74
|
+
this.properties.splice(index, 1);
|
|
75
|
+
}
|
|
76
|
+
getPropertyParams(name) {
|
|
77
|
+
for (const property of this.properties) {
|
|
78
|
+
if (property.name === name) {
|
|
79
|
+
return property.params;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
setPropertyParams(name, params) {
|
|
85
|
+
for (const property of this.properties) {
|
|
86
|
+
if (property.name === name) {
|
|
87
|
+
property.params = params;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
addComponent(component) {
|
|
92
|
+
this.components.push(component);
|
|
93
|
+
}
|
|
94
|
+
removeComponent(component) {
|
|
95
|
+
const index = this.components.indexOf(component);
|
|
96
|
+
if (index === -1)
|
|
97
|
+
return false;
|
|
98
|
+
// Remove element at index from list
|
|
99
|
+
this.components.splice(index, 1);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
getComponents(name) {
|
|
103
|
+
const components = [];
|
|
104
|
+
for (let component of this.components) {
|
|
105
|
+
if (component.name === name) {
|
|
106
|
+
components.push(component);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return components;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.Component = Component;
|
|
113
|
+
/**
|
|
114
|
+
* Represents a VCALENDAR component, the root component of an iCalendar file.
|
|
115
|
+
*/
|
|
116
|
+
class Calendar extends Component {
|
|
117
|
+
name = 'VCALENDAR';
|
|
118
|
+
constructor(a, b) {
|
|
119
|
+
var component;
|
|
120
|
+
if (a instanceof Component) {
|
|
121
|
+
component = a;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
const prodid = a;
|
|
125
|
+
const version = b ?? '2.0';
|
|
126
|
+
component = new Component('VCALENDAR');
|
|
127
|
+
component.setProperty('PRODID', prodid);
|
|
128
|
+
component.setProperty('VERSION', version);
|
|
129
|
+
}
|
|
130
|
+
super(component.name, component.properties, component.components);
|
|
131
|
+
}
|
|
132
|
+
events() {
|
|
133
|
+
return this.getComponents('VEVENT').map(c => new CalendarEvent(c));
|
|
134
|
+
}
|
|
135
|
+
removeEvent(a) {
|
|
136
|
+
if (a instanceof CalendarEvent) {
|
|
137
|
+
const event = a;
|
|
138
|
+
return this.removeComponent(event);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const uid = a;
|
|
142
|
+
for (const event of this.events()) {
|
|
143
|
+
if (event.uid() !== uid)
|
|
144
|
+
continue;
|
|
145
|
+
return this.removeComponent(event);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
prodId() {
|
|
151
|
+
return this.getProperty('PRODID').value;
|
|
152
|
+
}
|
|
153
|
+
setProdId(value) {
|
|
154
|
+
this.setProperty('PRODID', value);
|
|
155
|
+
}
|
|
156
|
+
version() {
|
|
157
|
+
return this.getProperty('VERSION').value;
|
|
158
|
+
}
|
|
159
|
+
setVersion(value) {
|
|
160
|
+
this.setProperty('VERSION', value);
|
|
161
|
+
}
|
|
162
|
+
calScale() {
|
|
163
|
+
return this.getProperty('CALSCALE')?.value;
|
|
164
|
+
}
|
|
165
|
+
setCalScale(value) {
|
|
166
|
+
this.setProperty('CALSCALE', value);
|
|
167
|
+
}
|
|
168
|
+
removeCalScale() {
|
|
169
|
+
this.removePropertiesWithName('CALSCALE');
|
|
170
|
+
}
|
|
171
|
+
method() {
|
|
172
|
+
return this.getProperty('METHOD')?.value;
|
|
173
|
+
}
|
|
174
|
+
setMethod(value) {
|
|
175
|
+
this.setProperty('METHOD', value);
|
|
176
|
+
}
|
|
177
|
+
removeMethod() {
|
|
178
|
+
this.removePropertiesWithName('METHOD');
|
|
179
|
+
}
|
|
180
|
+
calendarName() {
|
|
181
|
+
return this.getProperty('X-WR-CALNAME')?.value;
|
|
182
|
+
}
|
|
183
|
+
setCalendarName(value) {
|
|
184
|
+
this.setProperty('X-WR-CALNAME', value);
|
|
185
|
+
}
|
|
186
|
+
removeCalendarName() {
|
|
187
|
+
this.removePropertiesWithName('X-WR-CALNAME');
|
|
188
|
+
}
|
|
189
|
+
calendarDescription() {
|
|
190
|
+
return this.getProperty('X-WR-CALDESC')?.value;
|
|
191
|
+
}
|
|
192
|
+
setCalendarDescription(value) {
|
|
193
|
+
this.setProperty('X-WR-CALDESC', value);
|
|
194
|
+
}
|
|
195
|
+
removeCalendarDescription() {
|
|
196
|
+
this.removePropertiesWithName('X-WR-CALDESC');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.Calendar = Calendar;
|
|
200
|
+
/**
|
|
201
|
+
* Represents a VTIMEZONE component, containing time zone definitions.
|
|
202
|
+
*/
|
|
203
|
+
class TimeZone extends Component {
|
|
204
|
+
constructor(a) {
|
|
205
|
+
var component;
|
|
206
|
+
if (a instanceof Component) {
|
|
207
|
+
component = a;
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
const tzid = a;
|
|
211
|
+
component = new Component('VTIMEZONE');
|
|
212
|
+
component.setProperty('TZID', tzid);
|
|
213
|
+
}
|
|
214
|
+
super(component.name, component.properties, component.components);
|
|
215
|
+
}
|
|
216
|
+
id() {
|
|
217
|
+
return this.getProperty('TZID').value;
|
|
218
|
+
}
|
|
219
|
+
setId(value) {
|
|
220
|
+
this.setProperty('TZID', value);
|
|
221
|
+
}
|
|
222
|
+
lastMod() {
|
|
223
|
+
const text = this.getProperty('LAST-MOD');
|
|
224
|
+
if (!text)
|
|
225
|
+
return;
|
|
226
|
+
return new Date(text.value);
|
|
227
|
+
}
|
|
228
|
+
setLastMod(value) {
|
|
229
|
+
this.setProperty('LAST-MOD', value.toISOString());
|
|
230
|
+
}
|
|
231
|
+
removeLastMod() {
|
|
232
|
+
this.removePropertiesWithName('LAST-MOD');
|
|
233
|
+
}
|
|
234
|
+
url() {
|
|
235
|
+
return this.getProperty('TZURL')?.value;
|
|
236
|
+
}
|
|
237
|
+
setUrl(value) {
|
|
238
|
+
this.setProperty('TZURL', value);
|
|
239
|
+
}
|
|
240
|
+
removeUrl() {
|
|
241
|
+
this.removePropertiesWithName('TZURL');
|
|
242
|
+
}
|
|
243
|
+
/** Get all time offsets. */
|
|
244
|
+
offsets() {
|
|
245
|
+
const offsets = [];
|
|
246
|
+
this.components.forEach(component => {
|
|
247
|
+
if (component.name === 'STANDARD' || component.name === 'DAYLIGHT') {
|
|
248
|
+
offsets.push(new TimeZoneOffset(component));
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
return offsets;
|
|
252
|
+
}
|
|
253
|
+
/** Get standard/winter time offsets. */
|
|
254
|
+
standardOffsets() {
|
|
255
|
+
return this.getComponents('STANDARD').map(c => new TimeZoneOffset(c));
|
|
256
|
+
}
|
|
257
|
+
/** Get daylight savings time offsets. */
|
|
258
|
+
daylightOffsets() {
|
|
259
|
+
return this.getComponents('DAYLIGHT').map(c => new TimeZoneOffset(c));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
exports.TimeZone = TimeZone;
|
|
263
|
+
/** Represents a STANDARD or DAYLIGHT component, defining a time zone offset. */
|
|
264
|
+
class TimeZoneOffset extends Component {
|
|
265
|
+
constructor(a, b, c, d) {
|
|
266
|
+
var component;
|
|
267
|
+
if (a instanceof Component) {
|
|
268
|
+
component = a;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
const name = a;
|
|
272
|
+
const start = b;
|
|
273
|
+
const offsetFrom = c;
|
|
274
|
+
const offsetTo = d;
|
|
275
|
+
component = new Component(name);
|
|
276
|
+
component.setProperty('DTSTART', start.toISOString());
|
|
277
|
+
component.setProperty('TZOFFSETFROM', offsetFrom);
|
|
278
|
+
component.setProperty('TZOFFSETTO', offsetTo);
|
|
279
|
+
}
|
|
280
|
+
super(component.name, component.properties, component.components);
|
|
281
|
+
}
|
|
282
|
+
start() {
|
|
283
|
+
return new Date(this.getProperty('DTSTART').value);
|
|
284
|
+
}
|
|
285
|
+
setStart(value) {
|
|
286
|
+
this.setProperty('DTSTART', value.toISOString());
|
|
287
|
+
}
|
|
288
|
+
offsetFrom() {
|
|
289
|
+
return this.getProperty('TZOFFSETFROM').value;
|
|
290
|
+
}
|
|
291
|
+
setOffsetFrom(value) {
|
|
292
|
+
this.setProperty('TZOFFSETFROM', value);
|
|
293
|
+
}
|
|
294
|
+
offsetTo() {
|
|
295
|
+
return this.getProperty('TZOFFSETTO').value;
|
|
296
|
+
}
|
|
297
|
+
setOffsetTo(value) {
|
|
298
|
+
this.setProperty('TZOFFSETTO', value);
|
|
299
|
+
}
|
|
300
|
+
comment() {
|
|
301
|
+
return this.getProperty('COMMENT')?.value;
|
|
302
|
+
}
|
|
303
|
+
setComment(value) {
|
|
304
|
+
this.setProperty('COMMENT', value);
|
|
305
|
+
}
|
|
306
|
+
removeComment() {
|
|
307
|
+
this.removePropertiesWithName('COMMENT');
|
|
308
|
+
}
|
|
309
|
+
timeZoneName() {
|
|
310
|
+
return this.getProperty('TZNAME')?.value;
|
|
311
|
+
}
|
|
312
|
+
setTimeZoneName(value) {
|
|
313
|
+
this.setProperty('TZNAME', value);
|
|
314
|
+
}
|
|
315
|
+
removeTimeZoneName() {
|
|
316
|
+
this.removePropertiesWithName('TZNAME');
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
class CalendarEvent extends Component {
|
|
320
|
+
name = 'VEVENT';
|
|
321
|
+
constructor(a, b) {
|
|
322
|
+
var component;
|
|
323
|
+
if (b) {
|
|
324
|
+
const uid = a;
|
|
325
|
+
const dtstamp = b;
|
|
326
|
+
component = new Component('VEVENT');
|
|
327
|
+
component.setProperty('UID', uid);
|
|
328
|
+
component.setProperty('DTSTAMP', dtstamp.toISOString());
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
component = a;
|
|
332
|
+
}
|
|
333
|
+
super(component.name, component.properties, component.components);
|
|
334
|
+
}
|
|
335
|
+
stamp() {
|
|
336
|
+
return new Date(this.getProperty('DTSTAMP').value);
|
|
337
|
+
}
|
|
338
|
+
setStamp(value) {
|
|
339
|
+
this.setProperty('DTSTAMP', value.toISOString());
|
|
340
|
+
}
|
|
341
|
+
uid() {
|
|
342
|
+
return this.getProperty('UID').value;
|
|
343
|
+
}
|
|
344
|
+
setUid(value) {
|
|
345
|
+
this.setProperty('UID', value);
|
|
346
|
+
}
|
|
347
|
+
summary() {
|
|
348
|
+
return this.getProperty('SUMMARY').value;
|
|
349
|
+
}
|
|
350
|
+
setSummary(value) {
|
|
351
|
+
this.setProperty('SUMMARY', value);
|
|
352
|
+
}
|
|
353
|
+
removeSummary() {
|
|
354
|
+
this.removePropertiesWithName('SUMMARY');
|
|
355
|
+
}
|
|
356
|
+
description() {
|
|
357
|
+
return this.getProperty('DESCRIPTION').value;
|
|
358
|
+
}
|
|
359
|
+
setDescription(value) {
|
|
360
|
+
this.setProperty('DESCRIPTION', value);
|
|
361
|
+
}
|
|
362
|
+
removeDescription() {
|
|
363
|
+
this.removePropertiesWithName('DESCRIPTION');
|
|
364
|
+
}
|
|
365
|
+
location() {
|
|
366
|
+
return this.getProperty('LOCATION')?.value;
|
|
367
|
+
}
|
|
368
|
+
setLocation(value) {
|
|
369
|
+
this.setProperty('LOCATION', value);
|
|
370
|
+
}
|
|
371
|
+
removeLocation() {
|
|
372
|
+
this.removePropertiesWithName('LOCATION');
|
|
373
|
+
}
|
|
374
|
+
start() {
|
|
375
|
+
return new Date(this.getProperty('DTSTART').value);
|
|
376
|
+
}
|
|
377
|
+
setStart(value) {
|
|
378
|
+
this.setProperty('DTSTART', value.toISOString());
|
|
379
|
+
}
|
|
380
|
+
removeStart() {
|
|
381
|
+
this.removePropertiesWithName('DTSTART');
|
|
382
|
+
}
|
|
383
|
+
end() {
|
|
384
|
+
return new Date(this.getProperty('DTEND').value);
|
|
385
|
+
}
|
|
386
|
+
setEnd(value) {
|
|
387
|
+
this.setProperty('DTEND', value.toISOString());
|
|
388
|
+
}
|
|
389
|
+
removeEnd() {
|
|
390
|
+
this.removePropertiesWithName('DTEND');
|
|
391
|
+
}
|
|
392
|
+
created() {
|
|
393
|
+
const text = this.getProperty('CREATED')?.value;
|
|
394
|
+
if (!text)
|
|
395
|
+
return;
|
|
396
|
+
return new Date(text);
|
|
397
|
+
}
|
|
398
|
+
setCreated(value) {
|
|
399
|
+
this.setProperty('CREATED', value.toISOString());
|
|
400
|
+
}
|
|
401
|
+
removeCreated() {
|
|
402
|
+
this.removePropertiesWithName('CREATED');
|
|
403
|
+
}
|
|
404
|
+
geo() {
|
|
405
|
+
const text = this.getProperty('GEO')?.value;
|
|
406
|
+
if (!text)
|
|
407
|
+
return;
|
|
408
|
+
const pattern = /^[+-]?\d+(\.\d+)?,[+-]?\d+(\.\d+)?$/;
|
|
409
|
+
if (!pattern.test(text))
|
|
410
|
+
throw new Error(`Failed to parse GEO property: ${text}`);
|
|
411
|
+
const [longitude, latitude] = text.split(',');
|
|
412
|
+
return [parseFloat(longitude), parseFloat(latitude)];
|
|
413
|
+
}
|
|
414
|
+
setGeo(latitude, longitude) {
|
|
415
|
+
const text = `${latitude},${longitude}`;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
exports.CalendarEvent = CalendarEvent;
|
|
419
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsOENBQThDO0FBQzlDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQTtBQUUxQixNQUFhLFNBQVM7SUFDbEIsSUFBSSxDQUFRO0lBQ1osVUFBVSxDQUFZO0lBQ3RCLFVBQVUsQ0FBYTtJQUV2QixZQUFZLElBQVksRUFBRSxVQUF1QixFQUFFLFVBQXdCO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksVUFBVSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUNoQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQTtRQUNqQyxDQUFDO1FBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQ2hDLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFBO1FBQ2pDLENBQUM7SUFDTCxDQUFDO0lBRUQsU0FBUztRQUNMLGVBQWU7UUFDZixNQUFNLEtBQUssR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFFcEMsS0FBSyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkMsSUFBSSxJQUFJLEdBQ0osUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3JCLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLEdBQUc7Z0JBQ0gsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBRXJC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
|