@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.
Files changed (78) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +661 -0
  3. package/dist/alarm.d.ts +35 -0
  4. package/dist/alarm.d.ts.map +1 -0
  5. package/dist/alarm.js +87 -0
  6. package/dist/alarm.js.map +1 -0
  7. package/dist/calendar.d.ts +52 -0
  8. package/dist/calendar.d.ts.map +1 -0
  9. package/dist/calendar.js +121 -0
  10. package/dist/calendar.js.map +1 -0
  11. package/dist/component.d.ts +48 -0
  12. package/dist/component.d.ts.map +1 -0
  13. package/dist/component.js +170 -0
  14. package/dist/component.js.map +1 -0
  15. package/dist/event.d.ts +74 -0
  16. package/dist/event.d.ts.map +1 -0
  17. package/dist/event.js +263 -0
  18. package/dist/event.js.map +1 -0
  19. package/dist/freebusy.d.ts +45 -0
  20. package/dist/freebusy.d.ts.map +1 -0
  21. package/dist/freebusy.js +111 -0
  22. package/dist/freebusy.js.map +1 -0
  23. package/dist/index.d.ts +41 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +43 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/journal.d.ts +48 -0
  28. package/dist/journal.d.ts.map +1 -0
  29. package/dist/journal.js +148 -0
  30. package/dist/journal.js.map +1 -0
  31. package/dist/parse.d.ts +27 -0
  32. package/dist/parse.d.ts.map +1 -0
  33. package/dist/parse.js +140 -0
  34. package/dist/parse.js.map +1 -0
  35. package/dist/property-registry.d.ts +31 -0
  36. package/dist/property-registry.d.ts.map +1 -0
  37. package/dist/property-registry.js +83 -0
  38. package/dist/property-registry.js.map +1 -0
  39. package/dist/property.d.ts +36 -0
  40. package/dist/property.d.ts.map +1 -0
  41. package/dist/property.js +135 -0
  42. package/dist/property.js.map +1 -0
  43. package/dist/timezone.d.ts +55 -0
  44. package/dist/timezone.d.ts.map +1 -0
  45. package/dist/timezone.js +141 -0
  46. package/dist/timezone.js.map +1 -0
  47. package/dist/todo.d.ts +67 -0
  48. package/dist/todo.d.ts.map +1 -0
  49. package/dist/todo.js +220 -0
  50. package/dist/todo.js.map +1 -0
  51. package/dist/tokenize.d.ts +22 -0
  52. package/dist/tokenize.d.ts.map +1 -0
  53. package/dist/tokenize.js +95 -0
  54. package/dist/tokenize.js.map +1 -0
  55. package/dist/types.d.ts +100 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +3 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/value-types.d.ts +81 -0
  60. package/dist/value-types.d.ts.map +1 -0
  61. package/dist/value-types.js +445 -0
  62. package/dist/value-types.js.map +1 -0
  63. package/package.json +45 -0
  64. package/src/alarm.ts +105 -0
  65. package/src/calendar.ts +153 -0
  66. package/src/component.ts +193 -0
  67. package/src/event.ts +307 -0
  68. package/src/freebusy.ts +133 -0
  69. package/src/index.ts +85 -0
  70. package/src/journal.ts +174 -0
  71. package/src/parse.ts +166 -0
  72. package/src/property-registry.ts +124 -0
  73. package/src/property.ts +163 -0
  74. package/src/timezone.ts +169 -0
  75. package/src/todo.ts +253 -0
  76. package/src/tokenize.ts +99 -0
  77. package/src/types.ts +135 -0
  78. package/src/value-types.ts +498 -0
package/dist/alarm.js ADDED
@@ -0,0 +1,87 @@
1
+ /**
2
+ * VALARM component (RFC 5545 §3.6.6)
3
+ *
4
+ * ACTION is required. TRIGGER is required.
5
+ * Three alarm types: AUDIO, DISPLAY, EMAIL.
6
+ */
7
+ import { Component } from './component.js';
8
+ import { parseProperty } from './property.js';
9
+ export class Alarm extends Component {
10
+ constructor() {
11
+ super('VALARM');
12
+ }
13
+ // ── Required properties ──────────────────────────────────────────────
14
+ get action() {
15
+ return this.getProperty('ACTION')?.text ?? null;
16
+ }
17
+ set action(v) {
18
+ this.setProperty('ACTION', v);
19
+ }
20
+ /** TRIGGER: relative (DURATION) or absolute (DATE-TIME). */
21
+ get trigger() {
22
+ const p = this.getProperty('TRIGGER');
23
+ if (!p)
24
+ return null;
25
+ const v = p.scalar;
26
+ if (typeof v === 'object' && v !== null && (v.type === 'duration' || v.type === 'date-time')) {
27
+ return v;
28
+ }
29
+ return null;
30
+ }
31
+ set trigger(v) {
32
+ const params = v.type === 'date-time' ? { VALUE: 'DATE-TIME' } : {};
33
+ this.setProperty('TRIGGER', v, params);
34
+ }
35
+ // ── Optional properties ──────────────────────────────────────────────
36
+ get description() {
37
+ return this.getProperty('DESCRIPTION')?.text ?? null;
38
+ }
39
+ set description(v) {
40
+ this.setProperty('DESCRIPTION', v);
41
+ }
42
+ get summary() {
43
+ return this.getProperty('SUMMARY')?.text ?? null;
44
+ }
45
+ set summary(v) {
46
+ this.setProperty('SUMMARY', v);
47
+ }
48
+ get repeat() {
49
+ return this.getProperty('REPEAT')?.number ?? null;
50
+ }
51
+ set repeat(v) {
52
+ this.setProperty('REPEAT', v);
53
+ }
54
+ get duration() {
55
+ const v = this.getValue('DURATION');
56
+ return typeof v === 'object' && v !== null && v.type === 'duration'
57
+ ? v
58
+ : null;
59
+ }
60
+ set duration(v) {
61
+ this.setProperty('DURATION', v);
62
+ }
63
+ get attendees() {
64
+ return this.getProperties('ATTENDEE');
65
+ }
66
+ addAttendee(calAddress, params = {}) {
67
+ this.appendProperty('ATTENDEE', calAddress, params);
68
+ return this;
69
+ }
70
+ // ── Strict validation before serialization ───────────────────────────
71
+ toString() {
72
+ if (!this.action)
73
+ throw new Error('VALARM: ACTION is required');
74
+ if (!this.getProperty('TRIGGER'))
75
+ throw new Error('VALARM: TRIGGER is required');
76
+ return super.toString();
77
+ }
78
+ // ── Factory ──────────────────────────────────────────────────────────
79
+ static fromRaw(props) {
80
+ const alarm = new Alarm();
81
+ for (const { name, params, value } of props) {
82
+ alarm.addProperty(parseProperty(name, value, params));
83
+ }
84
+ return alarm;
85
+ }
86
+ }
87
+ //# sourceMappingURL=alarm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm.js","sourceRoot":"","sources":["../src/alarm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * VCALENDAR component (RFC 5545 §3.4, §3.6)
3
+ *
4
+ * Top-level container. VERSION and PRODID are required.
5
+ * Contains VEVENT, VTODO, VJOURNAL, VFREEBUSY, and VTIMEZONE sub-components.
6
+ */
7
+ import { Component } from './component.js';
8
+ import { Event } from './event.js';
9
+ import { Todo } from './todo.js';
10
+ import { Journal } from './journal.js';
11
+ import { FreeBusy } from './freebusy.js';
12
+ import { Timezone } from './timezone.js';
13
+ export declare class Calendar extends Component {
14
+ constructor();
15
+ /** RFC 5545 requires VERSION:2.0 */
16
+ get version(): string | null;
17
+ set version(v: string);
18
+ /** e.g. '-//My App//My App v1.0//EN' */
19
+ get prodid(): string | null;
20
+ set prodid(v: string);
21
+ /** Defaults to GREGORIAN when absent */
22
+ get calscale(): string | null;
23
+ set calscale(v: string);
24
+ /** iTIP method (REQUEST, REPLY, CANCEL, etc.) */
25
+ get method(): string | null;
26
+ set method(v: string);
27
+ get events(): Event[];
28
+ get todos(): Todo[];
29
+ get journals(): Journal[];
30
+ get freebusys(): FreeBusy[];
31
+ get timezones(): Timezone[];
32
+ addEvent(event: Event): this;
33
+ addTodo(todo: Todo): this;
34
+ addJournal(journal: Journal): this;
35
+ addFreebusy(fb: FreeBusy): this;
36
+ addTimezone(tz: Timezone): this;
37
+ /** Find an event/todo/journal by UID. */
38
+ getByUid(uid: string): Event | Todo | Journal | undefined;
39
+ /** Look up a VTIMEZONE by TZID. */
40
+ getTimezone(tzid: string): Timezone | undefined;
41
+ toString(): string;
42
+ static fromRaw(props: ReadonlyArray<{
43
+ name: string;
44
+ params: Record<string, string>;
45
+ value: string;
46
+ }>, subcomponents: Component[]): Calendar;
47
+ /**
48
+ * Create a minimal valid VCALENDAR with sensible defaults.
49
+ */
50
+ static create(prodid: string, method?: string): Calendar;
51
+ }
52
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,qBAAa,QAAS,SAAQ,SAAS;;IAOrC,oCAAoC;IACpC,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAE3B;IACD,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,EAEpB;IAED,wCAAwC;IACxC,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM,EAEnB;IAID,wCAAwC;IACxC,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IACD,IAAI,QAAQ,CAAC,CAAC,EAAE,MAAM,EAErB;IAED,iDAAiD;IACjD,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM,EAEnB;IAID,IAAI,MAAM,IAAI,KAAK,EAAE,CAEpB;IAED,IAAI,KAAK,IAAI,IAAI,EAAE,CAElB;IAED,IAAI,QAAQ,IAAI,OAAO,EAAE,CAExB;IAED,IAAI,SAAS,IAAI,QAAQ,EAAE,CAE1B;IAED,IAAI,SAAS,IAAI,QAAQ,EAAE,CAE1B;IAID,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAK5B,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAKzB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAK/B,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAO/B,yCAAyC;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS;IAKzD,mCAAmC;IACnC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAMtC,QAAQ,IAAI,MAAM;IAQ3B,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;IAWX;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ;CAOzD"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * VCALENDAR component (RFC 5545 §3.4, §3.6)
3
+ *
4
+ * Top-level container. VERSION and PRODID are required.
5
+ * Contains VEVENT, VTODO, VJOURNAL, VFREEBUSY, and VTIMEZONE sub-components.
6
+ */
7
+ import { Component } from './component.js';
8
+ import { parseProperty } from './property.js';
9
+ export class Calendar extends Component {
10
+ constructor() {
11
+ super('VCALENDAR');
12
+ }
13
+ // ── Required properties ──────────────────────────────────────────────
14
+ /** RFC 5545 requires VERSION:2.0 */
15
+ get version() {
16
+ return this.getProperty('VERSION')?.text ?? null;
17
+ }
18
+ set version(v) {
19
+ this.setProperty('VERSION', v);
20
+ }
21
+ /** e.g. '-//My App//My App v1.0//EN' */
22
+ get prodid() {
23
+ return this.getProperty('PRODID')?.text ?? null;
24
+ }
25
+ set prodid(v) {
26
+ this.setProperty('PRODID', v);
27
+ }
28
+ // ── Optional calendar properties ─────────────────────────────────────
29
+ /** Defaults to GREGORIAN when absent */
30
+ get calscale() {
31
+ return this.getProperty('CALSCALE')?.text ?? null;
32
+ }
33
+ set calscale(v) {
34
+ this.setProperty('CALSCALE', v);
35
+ }
36
+ /** iTIP method (REQUEST, REPLY, CANCEL, etc.) */
37
+ get method() {
38
+ return this.getProperty('METHOD')?.text ?? null;
39
+ }
40
+ set method(v) {
41
+ this.setProperty('METHOD', v);
42
+ }
43
+ // ── Sub-component accessors ──────────────────────────────────────────
44
+ get events() {
45
+ return this.getComponents('VEVENT');
46
+ }
47
+ get todos() {
48
+ return this.getComponents('VTODO');
49
+ }
50
+ get journals() {
51
+ return this.getComponents('VJOURNAL');
52
+ }
53
+ get freebusys() {
54
+ return this.getComponents('VFREEBUSY');
55
+ }
56
+ get timezones() {
57
+ return this.getComponents('VTIMEZONE');
58
+ }
59
+ // ── Fluent add methods ───────────────────────────────────────────────
60
+ addEvent(event) {
61
+ this.addComponent(event);
62
+ return this;
63
+ }
64
+ addTodo(todo) {
65
+ this.addComponent(todo);
66
+ return this;
67
+ }
68
+ addJournal(journal) {
69
+ this.addComponent(journal);
70
+ return this;
71
+ }
72
+ addFreebusy(fb) {
73
+ this.addComponent(fb);
74
+ return this;
75
+ }
76
+ addTimezone(tz) {
77
+ this.addComponent(tz);
78
+ return this;
79
+ }
80
+ // ── Lookup helpers ───────────────────────────────────────────────────
81
+ /** Find an event/todo/journal by UID. */
82
+ getByUid(uid) {
83
+ const all = [...this.events, ...this.todos, ...this.journals];
84
+ return all.find((c) => c.uid === uid);
85
+ }
86
+ /** Look up a VTIMEZONE by TZID. */
87
+ getTimezone(tzid) {
88
+ return this.timezones.find((tz) => tz.tzid === tzid);
89
+ }
90
+ // ── Strict serialization ─────────────────────────────────────────────
91
+ toString() {
92
+ if (!this.prodid)
93
+ throw new Error('VCALENDAR: PRODID is required');
94
+ if (!this.version)
95
+ throw new Error('VCALENDAR: VERSION is required');
96
+ return super.toString();
97
+ }
98
+ // ── Factory ──────────────────────────────────────────────────────────
99
+ static fromRaw(props, subcomponents) {
100
+ const cal = new Calendar();
101
+ for (const { name, params, value } of props) {
102
+ cal.addProperty(parseProperty(name, value, params));
103
+ }
104
+ for (const sub of subcomponents) {
105
+ cal.addComponent(sub);
106
+ }
107
+ return cal;
108
+ }
109
+ /**
110
+ * Create a minimal valid VCALENDAR with sensible defaults.
111
+ */
112
+ static create(prodid, method) {
113
+ const cal = new Calendar();
114
+ cal.version = '2.0';
115
+ cal.prodid = prodid;
116
+ if (method)
117
+ cal.method = method;
118
+ return cal;
119
+ }
120
+ }
121
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Base Component class for all iCalendar components.
3
+ *
4
+ * Stores properties as an ordered list (preserving parse order) and also
5
+ * indexes them by name for O(1) lookup. Supports multiple occurrences of
6
+ * the same property name (e.g. ATTENDEE, RDATE, EXDATE).
7
+ *
8
+ * Serialization is strict: outputs CRLF line endings, folds at 75 octets.
9
+ */
10
+ import { Property } from './property.js';
11
+ import type { ICalValue } from './types.js';
12
+ export declare class Component {
13
+ readonly type: string;
14
+ /** Ordered list of properties (preserves parse order). */
15
+ protected readonly _props: Property[];
16
+ /** Index: name → Property[] */
17
+ private readonly _index;
18
+ /** Child components (e.g. VALARM inside VEVENT). */
19
+ readonly components: Component[];
20
+ constructor(type: string);
21
+ /** Return the first Property with the given name, or undefined. */
22
+ getProperty(name: string): Property | undefined;
23
+ /** Return all Property instances with the given name. */
24
+ getProperties(name: string): Property[];
25
+ /** Return the scalar value of the first property with the given name. */
26
+ getValue(name: string): ICalValue | null | undefined;
27
+ /** Return the typed list value of the first property with the given name. */
28
+ getValues(name: string): ICalValue[];
29
+ /** Add a Property instance (preserving insertion order). */
30
+ addProperty(prop: Property): void;
31
+ /**
32
+ * Replace all existing properties with the given name with a single new one.
33
+ * If value is undefined/null the property is removed.
34
+ */
35
+ setProperty(name: string, value: ICalValue | readonly ICalValue[] | null | undefined, params?: Readonly<Record<string, string | readonly string[]>>): void;
36
+ /** Append an additional property (for multi-value properties). */
37
+ appendProperty(name: string, value: ICalValue | readonly ICalValue[], params?: Readonly<Record<string, string | readonly string[]>>): void;
38
+ /** Remove all properties with the given name. */
39
+ removeProperty(name: string): void;
40
+ addComponent(comp: Component): void;
41
+ getComponents(type: string): Component[];
42
+ /**
43
+ * Serialize to an RFC 5545-compliant iCalendar string segment.
44
+ * Uses CRLF line endings and folds at 75 octets.
45
+ */
46
+ toString(): string;
47
+ }
48
+ //# sourceMappingURL=component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA0D5C,qBAAa,SAAS;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,0DAA0D;IAC1D,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAM;IAC3C,+BAA+B;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,CAAM;gBAE1B,IAAI,EAAE,MAAM;IAMxB,mEAAmE;IACnE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI/C,yDAAyD;IACzD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE;IAIvC,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS;IAKpD,6EAA6E;IAC7E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;IAMpC,4DAA4D;IAC5D,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAWjC;;;OAGG;IACH,WAAW,CACT,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,GAAG,SAAS,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,EAC1D,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,CAAM,GAChE,IAAI;IAiBP,kEAAkE;IAClE,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,GAAG,SAAS,SAAS,EAAE,EACvC,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,CAAM,GAChE,IAAI;IAKP,iDAAiD;IACjD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAUlC,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAInC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;IAMxC;;;OAGG;IACH,QAAQ,IAAI,MAAM;CAYnB"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Base Component class for all iCalendar components.
3
+ *
4
+ * Stores properties as an ordered list (preserving parse order) and also
5
+ * indexes them by name for O(1) lookup. Supports multiple occurrences of
6
+ * the same property name (e.g. ATTENDEE, RDATE, EXDATE).
7
+ *
8
+ * Serialization is strict: outputs CRLF line endings, folds at 75 octets.
9
+ */
10
+ import { Property } from './property.js';
11
+ // ── Line folding (RFC 5545 §3.1) ─────────────────────────────────────────
12
+ /** Count UTF-8 octets in a string without allocating a Buffer. */
13
+ function octetLen(s) {
14
+ let n = 0;
15
+ for (let i = 0; i < s.length; i++) {
16
+ const c = s.charCodeAt(i);
17
+ if (c < 0x80)
18
+ n += 1;
19
+ else if (c < 0x800)
20
+ n += 2;
21
+ else if (c < 0xd800 || c >= 0xe000)
22
+ n += 3;
23
+ else {
24
+ i++;
25
+ n += 4;
26
+ } // surrogate pair → U+10000..U+10FFFF
27
+ }
28
+ return n;
29
+ }
30
+ /**
31
+ * Fold a single content-line string into RFC 5545-compliant chunks.
32
+ * Returns the string with CRLF + SPACE inserted at 75-octet boundaries.
33
+ */
34
+ function foldLine(line) {
35
+ if (octetLen(line) <= 75)
36
+ return line;
37
+ const chunks = [];
38
+ let pos = 0;
39
+ let firstLine = true;
40
+ while (pos < line.length) {
41
+ const maxOctets = firstLine ? 75 : 74; // continuation prefix ' ' takes 1 octet
42
+ let end = pos;
43
+ let octets = 0;
44
+ while (end < line.length) {
45
+ const c = line.charCodeAt(end);
46
+ let charOctets;
47
+ if (c < 0x80)
48
+ charOctets = 1;
49
+ else if (c < 0x800)
50
+ charOctets = 2;
51
+ else if (c < 0xd800 || c >= 0xe000)
52
+ charOctets = 3;
53
+ else {
54
+ charOctets = 4;
55
+ } // surrogate pair
56
+ if (octets + charOctets > maxOctets)
57
+ break;
58
+ octets += charOctets;
59
+ end += c >= 0xd800 && c < 0xdc00 ? 2 : 1; // advance past surrogate pairs
60
+ }
61
+ if (end === pos)
62
+ break; // safety: single char wider than budget
63
+ chunks.push((firstLine ? '' : ' ') + line.slice(pos, end));
64
+ pos = end;
65
+ firstLine = false;
66
+ }
67
+ return chunks.join('\r\n');
68
+ }
69
+ // ── Component ─────────────────────────────────────────────────────────────
70
+ export class Component {
71
+ type;
72
+ /** Ordered list of properties (preserves parse order). */
73
+ _props = [];
74
+ /** Index: name → Property[] */
75
+ _index = new Map();
76
+ /** Child components (e.g. VALARM inside VEVENT). */
77
+ components = [];
78
+ constructor(type) {
79
+ this.type = type.toUpperCase();
80
+ }
81
+ // ── Property access ──────────────────────────────────────────────────
82
+ /** Return the first Property with the given name, or undefined. */
83
+ getProperty(name) {
84
+ return this._index.get(name.toUpperCase())?.[0];
85
+ }
86
+ /** Return all Property instances with the given name. */
87
+ getProperties(name) {
88
+ return this._index.get(name.toUpperCase()) ?? [];
89
+ }
90
+ /** Return the scalar value of the first property with the given name. */
91
+ getValue(name) {
92
+ const p = this.getProperty(name);
93
+ return p?.scalar;
94
+ }
95
+ /** Return the typed list value of the first property with the given name. */
96
+ getValues(name) {
97
+ return this.getProperty(name)?.list ?? [];
98
+ }
99
+ // ── Property mutation ────────────────────────────────────────────────
100
+ /** Add a Property instance (preserving insertion order). */
101
+ addProperty(prop) {
102
+ this._props.push(prop);
103
+ const key = prop.name;
104
+ const existing = this._index.get(key);
105
+ if (existing) {
106
+ existing.push(prop);
107
+ }
108
+ else {
109
+ this._index.set(key, [prop]);
110
+ }
111
+ }
112
+ /**
113
+ * Replace all existing properties with the given name with a single new one.
114
+ * If value is undefined/null the property is removed.
115
+ */
116
+ setProperty(name, value, params = {}) {
117
+ const key = name.toUpperCase();
118
+ // Remove existing
119
+ const startLen = this._props.length;
120
+ const idx = this._props.findIndex((p) => p.name === key);
121
+ if (idx !== -1)
122
+ this._props.splice(idx, 1);
123
+ this._index.delete(key);
124
+ if (value === null || value === undefined)
125
+ return;
126
+ const prop = new Property(key, value, params);
127
+ // Insert at the position where old one was (or append)
128
+ const insertAt = idx !== -1 && idx < this._props.length ? idx : this._props.length;
129
+ this._props.splice(insertAt, 0, prop);
130
+ this._index.set(key, [prop]);
131
+ }
132
+ /** Append an additional property (for multi-value properties). */
133
+ appendProperty(name, value, params = {}) {
134
+ const prop = new Property(name.toUpperCase(), value, params);
135
+ this.addProperty(prop);
136
+ }
137
+ /** Remove all properties with the given name. */
138
+ removeProperty(name) {
139
+ const key = name.toUpperCase();
140
+ const filtered = this._props.filter((p) => p.name !== key);
141
+ this._props.length = 0;
142
+ this._props.push(...filtered);
143
+ this._index.delete(key);
144
+ }
145
+ // ── Component children ───────────────────────────────────────────────
146
+ addComponent(comp) {
147
+ this.components.push(comp);
148
+ }
149
+ getComponents(type) {
150
+ return this.components.filter((c) => c.type === type.toUpperCase());
151
+ }
152
+ // ── Serialization ────────────────────────────────────────────────────
153
+ /**
154
+ * Serialize to an RFC 5545-compliant iCalendar string segment.
155
+ * Uses CRLF line endings and folds at 75 octets.
156
+ */
157
+ toString() {
158
+ const lines = [];
159
+ lines.push(`BEGIN:${this.type}`);
160
+ for (const prop of this._props) {
161
+ lines.push(foldLine(prop.toContentLine()));
162
+ }
163
+ for (const child of this.components) {
164
+ lines.push(child.toString());
165
+ }
166
+ lines.push(`END:${this.type}`);
167
+ return lines.join('\r\n');
168
+ }
169
+ }
170
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * VEVENT component (RFC 5545 §3.6.1)
3
+ *
4
+ * UID and DTSTAMP are required.
5
+ * DTSTART is required when METHOD is not present in the calendar.
6
+ */
7
+ import { Component } from './component.js';
8
+ import { Property } from './property.js';
9
+ import { Alarm } from './alarm.js';
10
+ import type { ICalDate, ICalDateTime, ICalDuration, ICalRecur, ICalGeo, ICalValue } from './types.js';
11
+ export declare class Event extends Component {
12
+ constructor();
13
+ get uid(): string | null;
14
+ set uid(v: string);
15
+ get dtstamp(): ICalDateTime | null;
16
+ set dtstamp(v: ICalDateTime | Date);
17
+ get dtstart(): ICalDateTime | ICalDate | null;
18
+ set dtstart(v: ICalDateTime | ICalDate | Date);
19
+ get dtend(): ICalDateTime | ICalDate | null;
20
+ set dtend(v: ICalDateTime | ICalDate | Date);
21
+ get duration(): ICalDuration | null;
22
+ set duration(v: ICalDuration);
23
+ get summary(): string | null;
24
+ set summary(v: string);
25
+ get description(): string | null;
26
+ set description(v: string);
27
+ get location(): string | null;
28
+ set location(v: string);
29
+ get url(): string | null;
30
+ set url(v: string);
31
+ get status(): string | null;
32
+ set status(v: 'TENTATIVE' | 'CONFIRMED' | 'CANCELLED' | string);
33
+ get transp(): 'OPAQUE' | 'TRANSPARENT' | string | null;
34
+ set transp(v: 'OPAQUE' | 'TRANSPARENT' | string);
35
+ get klass(): string | null;
36
+ set klass(v: 'PUBLIC' | 'PRIVATE' | 'CONFIDENTIAL' | string);
37
+ get priority(): number | null;
38
+ set priority(v: number);
39
+ get sequence(): number | null;
40
+ set sequence(v: number);
41
+ get created(): ICalDateTime | null;
42
+ set created(v: ICalDateTime | Date);
43
+ get lastModified(): ICalDateTime | null;
44
+ set lastModified(v: ICalDateTime | Date);
45
+ get recurrenceId(): ICalDateTime | ICalDate | null;
46
+ set recurrenceId(v: ICalDateTime | ICalDate);
47
+ get geo(): ICalGeo | null;
48
+ set geo(v: ICalGeo);
49
+ get organizer(): string | null;
50
+ set organizer(v: string);
51
+ get attendees(): Property[];
52
+ addAttendee(calAddress: string, params?: Record<string, string>): this;
53
+ get categories(): ICalValue[];
54
+ set categories(v: string[]);
55
+ get comments(): Property[];
56
+ addComment(v: string): this;
57
+ get contacts(): Property[];
58
+ addContact(v: string): this;
59
+ get exdates(): ICalValue[];
60
+ addExdate(v: ICalDateTime | ICalDate): this;
61
+ get rdates(): ICalValue[];
62
+ addRdate(v: ICalDateTime | ICalDate): this;
63
+ get rrules(): ICalRecur[];
64
+ addRrule(v: ICalRecur): this;
65
+ get alarms(): Alarm[];
66
+ addAlarm(alarm: Alarm): this;
67
+ toString(): string;
68
+ static fromRaw(props: ReadonlyArray<{
69
+ name: string;
70
+ params: Record<string, string>;
71
+ value: string;
72
+ }>, subcomponents?: Component[]): Event;
73
+ }
74
+ //# sourceMappingURL=event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"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"}