iamcal 3.0.3 → 3.1.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/README.md CHANGED
@@ -19,7 +19,7 @@ Below is an example of editing a calendar file.
19
19
  ```typescript
20
20
  import { Calendar, dump, parseCalendar } from 'iamcal'
21
21
 
22
- const calendar: Calendar = await parseCalendar(`
22
+ const calendar: Calendar = parseCalendar(`
23
23
  BEGIN:VCALENDAR
24
24
  VERSION:2.0
25
25
  PRODID:example
@@ -40,7 +40,7 @@ calendar.getEvents().forEach(event => {
40
40
  }
41
41
  })
42
42
 
43
- await dump(calendar, './new_calendar.ics')
43
+ dumpCalendarSync(calendar, './new_calendar.ics')
44
44
  ```
45
45
 
46
46
  Running the code will produce the file `new_calendar.ics`:
package/lib/io.d.ts CHANGED
@@ -5,14 +5,34 @@ import { Calendar } from './components/Calendar';
5
5
  * @param path Path to the file.
6
6
  * @returns The calendar deserialized from the file.
7
7
  * @throws {DeserializationError} If the file content is not a valid calendar.
8
+ * @deprecated Use `loadCalendarSync` instead.
8
9
  */
9
10
  export declare function load(path: fs.PathLike): Promise<Calendar>;
11
+ /**
12
+ * Read a calendar from a iCalendar file.
13
+ * @param path Path to the file.
14
+ * @param encoding The file encoding, defaults to UTF-8.
15
+ * @returns The calendar deserialized from the file.
16
+ * @throws {DeserializationError} If the file content is not a valid component.
17
+ * @throws {ComponentValidationError} If the deserialized component is not a VCALENDAR.
18
+ */
19
+ export declare function loadCalendarSync(path: fs.PathLike, encoding?: BufferEncoding): Calendar;
10
20
  /**
11
21
  * Write a calendar to a file.
12
22
  * @param calendar The calendar to write to file.
13
23
  * @param path Path to the file to write.
14
24
  * @example
15
25
  * dump(myCalendar, 'calendar.ics')
26
+ * @deprecated Use `dumpCalendarSync` instead.
16
27
  */
17
28
  export declare function dump(calendar: Calendar, path: string): Promise<void>;
29
+ /**
30
+ * Write a calendar to a file.
31
+ * @param calendar The calendar to write to file.
32
+ * @param path Path to the file to write.
33
+ * @param encoding The file encoding, defaults to UTF-8.
34
+ * @example
35
+ * dump(myCalendar, 'calendar.ics')
36
+ */
37
+ export declare function dumpCalendarSync(calendar: Calendar, path: string, encoding?: BufferEncoding): void;
18
38
  //# sourceMappingURL=io.d.ts.map
package/lib/io.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAGhD;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAc/D;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpE"}
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAQhD;;;;;;GAMG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAc/D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,EAAE,CAAC,QAAQ,EACjB,QAAQ,GAAE,cAAuB,GAClC,QAAQ,CAIV;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC5B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,cAAuB,GAClC,IAAI,CAGN"}
package/lib/io.js CHANGED
@@ -4,7 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.load = load;
7
+ exports.loadCalendarSync = loadCalendarSync;
7
8
  exports.dump = dump;
9
+ exports.dumpCalendarSync = dumpCalendarSync;
8
10
  const fs_1 = __importDefault(require("fs"));
9
11
  const readline_1 = __importDefault(require("readline"));
10
12
  const Calendar_1 = require("./components/Calendar");
@@ -14,6 +16,7 @@ const parse_1 = require("./parse");
14
16
  * @param path Path to the file.
15
17
  * @returns The calendar deserialized from the file.
16
18
  * @throws {DeserializationError} If the file content is not a valid calendar.
19
+ * @deprecated Use `loadCalendarSync` instead.
17
20
  */
18
21
  async function load(path) {
19
22
  const stream = fs_1.default.createReadStream(path);
@@ -27,12 +30,26 @@ async function load(path) {
27
30
  }
28
31
  return new Calendar_1.Calendar(component);
29
32
  }
33
+ /**
34
+ * Read a calendar from a iCalendar file.
35
+ * @param path Path to the file.
36
+ * @param encoding The file encoding, defaults to UTF-8.
37
+ * @returns The calendar deserialized from the file.
38
+ * @throws {DeserializationError} If the file content is not a valid component.
39
+ * @throws {ComponentValidationError} If the deserialized component is not a VCALENDAR.
40
+ */
41
+ function loadCalendarSync(path, encoding = 'utf8') {
42
+ const text = fs_1.default.readFileSync(path, { encoding: encoding });
43
+ const component = (0, parse_1.deserializeComponentString)(text);
44
+ return new Calendar_1.Calendar(component);
45
+ }
30
46
  /**
31
47
  * Write a calendar to a file.
32
48
  * @param calendar The calendar to write to file.
33
49
  * @param path Path to the file to write.
34
50
  * @example
35
51
  * dump(myCalendar, 'calendar.ics')
52
+ * @deprecated Use `dumpCalendarSync` instead.
36
53
  */
37
54
  function dump(calendar, path) {
38
55
  return new Promise(resolve => {
@@ -41,4 +58,16 @@ function dump(calendar, path) {
41
58
  });
42
59
  });
43
60
  }
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFXQSxvQkFjQztBQVNELG9CQU1DO0FBeENELDRDQUFtQjtBQUNuQix3REFBK0I7QUFDL0Isb0RBQWdEO0FBQ2hELG1DQUFvRTtBQUVwRTs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSxJQUFJLENBQUMsSUFBaUI7SUFDeEMsTUFBTSxNQUFNLEdBQUcsWUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLGtCQUFRLENBQUMsZUFBZSxDQUFDO1FBQ25DLEtBQUssRUFBRSxNQUFNO1FBQ2IsU0FBUyxFQUFFLFFBQVE7S0FDdEIsQ0FBQyxDQUFBO0lBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFBLDRCQUFvQixFQUFDLEtBQUssQ0FBQyxDQUFBO0lBRW5ELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksNEJBQW9CLENBQUMsK0JBQStCLENBQUMsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsT0FBTyxJQUFJLG1CQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLElBQUksQ0FBQyxRQUFrQixFQUFFLElBQVk7SUFDakQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN6QixZQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFO1lBQzFDLE9BQU8sRUFBRSxDQUFBO1FBQ2IsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMifQ==
61
+ /**
62
+ * Write a calendar to a file.
63
+ * @param calendar The calendar to write to file.
64
+ * @param path Path to the file to write.
65
+ * @param encoding The file encoding, defaults to UTF-8.
66
+ * @example
67
+ * dump(myCalendar, 'calendar.ics')
68
+ */
69
+ function dumpCalendarSync(calendar, path, encoding = 'utf8') {
70
+ const text = calendar.serialize();
71
+ fs_1.default.writeFileSync(path, text, { encoding: encoding });
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFpQkEsb0JBY0M7QUFVRCw0Q0FPQztBQVVELG9CQU1DO0FBVUQsNENBT0M7QUFqRkQsNENBQW1CO0FBQ25CLHdEQUErQjtBQUMvQixvREFBZ0Q7QUFDaEQsbUNBSWdCO0FBR2hCOzs7Ozs7R0FNRztBQUNJLEtBQUssVUFBVSxJQUFJLENBQUMsSUFBaUI7SUFDeEMsTUFBTSxNQUFNLEdBQUcsWUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLGtCQUFRLENBQUMsZUFBZSxDQUFDO1FBQ25DLEtBQUssRUFBRSxNQUFNO1FBQ2IsU0FBUyxFQUFFLFFBQVE7S0FDdEIsQ0FBQyxDQUFBO0lBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFBLDRCQUFvQixFQUFDLEtBQUssQ0FBQyxDQUFBO0lBRW5ELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksNEJBQW9CLENBQUMsK0JBQStCLENBQUMsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsT0FBTyxJQUFJLG1CQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FDNUIsSUFBaUIsRUFDakIsV0FBMkIsTUFBTTtJQUVqQyxNQUFNLElBQUksR0FBRyxZQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzFELE1BQU0sU0FBUyxHQUFHLElBQUEsa0NBQTBCLEVBQUMsSUFBSSxDQUFDLENBQUE7SUFDbEQsT0FBTyxJQUFJLG1CQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixJQUFJLENBQUMsUUFBa0IsRUFBRSxJQUFZO0lBQ2pELE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDekIsWUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRTtZQUMxQyxPQUFPLEVBQUUsQ0FBQTtRQUNiLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGdCQUFnQixDQUM1QixRQUFrQixFQUNsQixJQUFZLEVBQ1osV0FBMkIsTUFBTTtJQUVqQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDakMsWUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7QUFDeEQsQ0FBQyJ9
package/lib/parse.d.ts CHANGED
@@ -11,27 +11,35 @@ export declare class DeserializationError extends Error {
11
11
  * @param lines The serialized component as a **readline** interface.
12
12
  * @returns The deserialized calendar component object.
13
13
  * @throws {DeserializationError} If the component is invalid.
14
+ * @deprecated Use the synchronous `deserializeComponentLines` instead.
14
15
  */
15
16
  export declare function deserializeComponent(lines: readline.Interface): Promise<Component>;
17
+ /**
18
+ * Deserialize a calendar component from a list of lines.
19
+ * @param lines The serialized component as a list of lines.
20
+ * @returns The deserialized calendar component object.
21
+ * @throws {DeserializationError} If the component is invalid.
22
+ */
23
+ export declare function deserializeComponentLines(lines: string[]): Component;
16
24
  /**
17
25
  * Deserialize a calendar component string.
18
26
  * @param text The serialized component.
19
27
  * @returns The deserialized component object.
20
28
  * @throws {DeserializationError} If the component is invalid.
21
29
  */
22
- export declare function deserializeComponentString(text: string): Promise<Component>;
30
+ export declare function deserializeComponentString(text: string): Component;
23
31
  /**
24
32
  * Parse a serialized calendar.
25
33
  * @param text A serialized calendar as you would see in an iCalendar file.
26
34
  * @returns The parsed calendar object.
27
35
  */
28
- export declare function parseCalendar(text: string): Promise<Calendar>;
36
+ export declare function parseCalendar(text: string): Calendar;
29
37
  /**
30
38
  * Parse a serialized calendar event.
31
39
  * @param text A serialized event as you would see in an iCalendar file.
32
40
  * @returns The parsed event object.
33
41
  */
34
- export declare function parseEvent(text: string): Promise<CalendarEvent>;
42
+ export declare function parseEvent(text: string): CalendarEvent;
35
43
  /**
36
44
  * Deserialize a component property.
37
45
  * @param line The serialized content line that defines this property.
@@ -1 +1 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAMtD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAM9C,+EAA+E;AAC/E,qBAAa,oBAAqB,SAAQ,KAAK;IAC3C,IAAI,SAAyB;CAChC;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACtC,KAAK,EAAE,QAAQ,CAAC,SAAS,GAC1B,OAAO,CAAC,SAAS,CAAC,CAkHpB;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC5C,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,CAAC,CAOpB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAGnE;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAGrE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,OAAe,GACxB,QAAQ,CA8LV"}
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAMtD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAM9C,+EAA+E;AAC/E,qBAAa,oBAAqB,SAAQ,KAAK;IAC3C,IAAI,SAAyB;CAChC;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACtC,KAAK,EAAE,QAAQ,CAAC,SAAS,GAC1B,OAAO,CAAC,SAAS,CAAC,CAGpB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAkHpE;AAqBD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAGlE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAGpD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAGtD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,OAAe,GACxB,QAAQ,CA8LV"}
package/lib/parse.js CHANGED
@@ -1,16 +1,12 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.DeserializationError = void 0;
7
4
  exports.deserializeComponent = deserializeComponent;
5
+ exports.deserializeComponentLines = deserializeComponentLines;
8
6
  exports.deserializeComponentString = deserializeComponentString;
9
7
  exports.parseCalendar = parseCalendar;
10
8
  exports.parseEvent = parseEvent;
11
9
  exports.deserializeProperty = deserializeProperty;
12
- const readline_1 = __importDefault(require("readline"));
13
- const stream_1 = require("stream");
14
10
  const component_1 = require("./component");
15
11
  const components_1 = require("./components");
16
12
  const patterns_1 = require("./patterns");
@@ -26,14 +22,25 @@ exports.DeserializationError = DeserializationError;
26
22
  * @param lines The serialized component as a **readline** interface.
27
23
  * @returns The deserialized calendar component object.
28
24
  * @throws {DeserializationError} If the component is invalid.
25
+ * @deprecated Use the synchronous `deserializeComponentLines` instead.
29
26
  */
30
27
  async function deserializeComponent(lines) {
28
+ const realLines = await readLines(lines);
29
+ return deserializeComponentLines(realLines);
30
+ }
31
+ /**
32
+ * Deserialize a calendar component from a list of lines.
33
+ * @param lines The serialized component as a list of lines.
34
+ * @returns The deserialized calendar component object.
35
+ * @throws {DeserializationError} If the component is invalid.
36
+ */
37
+ function deserializeComponentLines(lines) {
31
38
  const component = new component_1.Component('');
32
39
  let done = false;
33
40
  // We use a stack to keep track of nested components
34
41
  const stack = new Array();
35
42
  const subcomponentLines = new Array();
36
- const processLine = async (line) => {
43
+ const processLine = (line) => {
37
44
  if (line.trim() === '')
38
45
  return;
39
46
  if (done) {
@@ -63,7 +70,7 @@ async function deserializeComponent(lines) {
63
70
  // Check the length of the stack after being popped
64
71
  if (stack.length == 1) {
65
72
  subcomponentLines.push(line);
66
- const subcomponent = await deserializeComponentString(subcomponentLines.join('\r\n'));
73
+ const subcomponent = deserializeComponentString(subcomponentLines.join('\r\n'));
67
74
  subcomponentLines.length = 0;
68
75
  component.components.push(subcomponent);
69
76
  }
@@ -106,7 +113,7 @@ async function deserializeComponent(lines) {
106
113
  that exists on a long line.
107
114
  */
108
115
  let unfoldedLine = '';
109
- for await (const line of lines) {
116
+ for (const line of lines) {
110
117
  if (line.startsWith(' ') || line.startsWith('\t')) {
111
118
  // Unfold continuation line (remove leading whitespace and append)
112
119
  unfoldedLine += line.replace(/[\r\n]/, '').slice(1);
@@ -114,41 +121,54 @@ async function deserializeComponent(lines) {
114
121
  else {
115
122
  if (unfoldedLine) {
116
123
  // Process the previous unfolded line
117
- await processLine(unfoldedLine);
124
+ processLine(unfoldedLine);
118
125
  }
119
126
  // Start a new unfolded line
120
127
  unfoldedLine = line;
121
128
  }
122
129
  }
123
130
  // Process the last unfolded line
124
- await processLine(unfoldedLine);
131
+ processLine(unfoldedLine);
125
132
  // Check that component has been closed
126
133
  if (!done) {
127
134
  throw new DeserializationError('Component has no end');
128
135
  }
129
136
  return component;
130
137
  }
138
+ /**
139
+ * Convert a **readline** interface to a list of lines.
140
+ * @param rl The interface.
141
+ * @returns The list of lines read from the interface.
142
+ * @throws {DeserializationError} If the component is invalid.
143
+ */
144
+ async function readLines(rl) {
145
+ return new Promise(resolve => {
146
+ const lines = [];
147
+ rl.on('line', line => {
148
+ lines.push(line);
149
+ });
150
+ rl.on('close', () => {
151
+ resolve(lines);
152
+ });
153
+ });
154
+ }
131
155
  /**
132
156
  * Deserialize a calendar component string.
133
157
  * @param text The serialized component.
134
158
  * @returns The deserialized component object.
135
159
  * @throws {DeserializationError} If the component is invalid.
136
160
  */
137
- async function deserializeComponentString(text) {
138
- const stream = stream_1.Readable.from(text);
139
- const lines = readline_1.default.createInterface({
140
- input: stream,
141
- crlfDelay: Infinity,
142
- });
143
- return deserializeComponent(lines);
161
+ function deserializeComponentString(text) {
162
+ const lines = text.split(/\r?\n/g);
163
+ return deserializeComponentLines(lines);
144
164
  }
145
165
  /**
146
166
  * Parse a serialized calendar.
147
167
  * @param text A serialized calendar as you would see in an iCalendar file.
148
168
  * @returns The parsed calendar object.
149
169
  */
150
- async function parseCalendar(text) {
151
- const component = await deserializeComponentString(text);
170
+ function parseCalendar(text) {
171
+ const component = deserializeComponentString(text);
152
172
  return new components_1.Calendar(component);
153
173
  }
154
174
  /**
@@ -156,8 +176,8 @@ async function parseCalendar(text) {
156
176
  * @param text A serialized event as you would see in an iCalendar file.
157
177
  * @returns The parsed event object.
158
178
  */
159
- async function parseEvent(text) {
160
- const component = await deserializeComponentString(text);
179
+ function parseEvent(text) {
180
+ const component = deserializeComponentString(text);
161
181
  return new components_1.CalendarEvent(component);
162
182
  }
163
183
  /**
@@ -343,4 +363,4 @@ function deserializeProperty(line, strict = false) {
343
363
  const parsedValue = (0, escape_1.unescapeTextPropertyValue)(rawValue);
344
364
  return new Property_1.Property(propertyName, parsedValue, parsedParameters);
345
365
  }
346
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBMEJBLG9EQW9IQztBQVFELGdFQVNDO0FBT0Qsc0NBR0M7QUFPRCxnQ0FHQztBQVNELGtEQWlNQztBQTdYRCx3REFBK0I7QUFDL0IsbUNBQWlDO0FBQ2pDLDJDQUF1QztBQUN2Qyw2Q0FBc0Q7QUFDdEQseUNBSW1CO0FBQ25CLGtEQUE4QztBQUM5Qyw4Q0FHMEI7QUFFMUIsK0VBQStFO0FBQy9FLE1BQWEsb0JBQXFCLFNBQVEsS0FBSztJQUMzQyxJQUFJLEdBQUcsc0JBQXNCLENBQUE7Q0FDaEM7QUFGRCxvREFFQztBQUVEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLG9CQUFvQixDQUN0QyxLQUF5QjtJQUV6QixNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDbkMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFBO0lBRWhCLG9EQUFvRDtJQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFBO0lBRWpDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQTtJQUU3QyxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDdkMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUFFLE9BQU07UUFFOUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNQLE1BQU0sSUFBSSxvQkFBb0IsQ0FDMUIseUNBQXlDLENBQzVDLENBQUE7UUFDTCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDNUIsa0JBQWtCO1lBQ2xCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FB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
366
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEJBLG9EQUtDO0FBUUQsOERBa0hDO0FBMkJELGdFQUdDO0FBT0Qsc0NBR0M7QUFPRCxnQ0FHQztBQVNELGtEQWlNQztBQXBaRCwyQ0FBdUM7QUFDdkMsNkNBQXNEO0FBQ3RELHlDQUltQjtBQUNuQixrREFBOEM7QUFDOUMsOENBRzBCO0FBRTFCLCtFQUErRTtBQUMvRSxNQUFhLG9CQUFxQixTQUFRLEtBQUs7SUFDM0MsSUFBSSxHQUFHLHNCQUFzQixDQUFBO0NBQ2hDO0FBRkQsb0RBRUM7QUFFRDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsb0JBQW9CLENBQ3RDLEtBQXlCO0lBRXpCLE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3hDLE9BQU8seUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDL0MsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IseUJBQXlCLENBQUMsS0FBZTtJQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDbkMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFBO0lBRWhCLG9EQUFvRDtJQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFBO0lBRWpDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQTtJQUU3QyxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO1FBQ2pDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFNO1FBRTlCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxNQUFNLElBQUksb0JBQW9CLENBQzFCLHlDQUF5QyxDQUM1QyxDQUFBO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxR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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iamcal",
3
- "version": "3.0.3",
3
+ "version": "3.1.0",
4
4
  "description": "Read and write ICalendar files",
5
5
  "files": [
6
6
  "/lib",
package/src/io.ts CHANGED
@@ -1,13 +1,19 @@
1
1
  import fs from 'fs'
2
2
  import readline from 'readline'
3
3
  import { Calendar } from './components/Calendar'
4
- import { DeserializationError, deserializeComponent } from './parse'
4
+ import {
5
+ DeserializationError,
6
+ deserializeComponent,
7
+ deserializeComponentString,
8
+ } from './parse'
9
+ import { ComponentValidationError } from './component'
5
10
 
6
11
  /**
7
12
  * Read a calendar from a iCalendar file.
8
13
  * @param path Path to the file.
9
14
  * @returns The calendar deserialized from the file.
10
15
  * @throws {DeserializationError} If the file content is not a valid calendar.
16
+ * @deprecated Use `loadCalendarSync` instead.
11
17
  */
12
18
  export async function load(path: fs.PathLike): Promise<Calendar> {
13
19
  const stream = fs.createReadStream(path)
@@ -25,12 +31,30 @@ export async function load(path: fs.PathLike): Promise<Calendar> {
25
31
  return new Calendar(component)
26
32
  }
27
33
 
34
+ /**
35
+ * Read a calendar from a iCalendar file.
36
+ * @param path Path to the file.
37
+ * @param encoding The file encoding, defaults to UTF-8.
38
+ * @returns The calendar deserialized from the file.
39
+ * @throws {DeserializationError} If the file content is not a valid component.
40
+ * @throws {ComponentValidationError} If the deserialized component is not a VCALENDAR.
41
+ */
42
+ export function loadCalendarSync(
43
+ path: fs.PathLike,
44
+ encoding: BufferEncoding = 'utf8'
45
+ ): Calendar {
46
+ const text = fs.readFileSync(path, { encoding: encoding })
47
+ const component = deserializeComponentString(text)
48
+ return new Calendar(component)
49
+ }
50
+
28
51
  /**
29
52
  * Write a calendar to a file.
30
53
  * @param calendar The calendar to write to file.
31
54
  * @param path Path to the file to write.
32
55
  * @example
33
56
  * dump(myCalendar, 'calendar.ics')
57
+ * @deprecated Use `dumpCalendarSync` instead.
34
58
  */
35
59
  export function dump(calendar: Calendar, path: string): Promise<void> {
36
60
  return new Promise(resolve => {
@@ -39,3 +63,20 @@ export function dump(calendar: Calendar, path: string): Promise<void> {
39
63
  })
40
64
  })
41
65
  }
66
+
67
+ /**
68
+ * Write a calendar to a file.
69
+ * @param calendar The calendar to write to file.
70
+ * @param path Path to the file to write.
71
+ * @param encoding The file encoding, defaults to UTF-8.
72
+ * @example
73
+ * dump(myCalendar, 'calendar.ics')
74
+ */
75
+ export function dumpCalendarSync(
76
+ calendar: Calendar,
77
+ path: string,
78
+ encoding: BufferEncoding = 'utf8'
79
+ ): void {
80
+ const text = calendar.serialize()
81
+ fs.writeFileSync(path, text, { encoding: encoding })
82
+ }
package/src/parse.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import readline from 'readline'
2
- import { Readable } from 'stream'
3
2
  import { Component } from './component'
4
3
  import { Calendar, CalendarEvent } from './components'
5
4
  import {
@@ -23,10 +22,22 @@ export class DeserializationError extends Error {
23
22
  * @param lines The serialized component as a **readline** interface.
24
23
  * @returns The deserialized calendar component object.
25
24
  * @throws {DeserializationError} If the component is invalid.
25
+ * @deprecated Use the synchronous `deserializeComponentLines` instead.
26
26
  */
27
27
  export async function deserializeComponent(
28
28
  lines: readline.Interface
29
29
  ): Promise<Component> {
30
+ const realLines = await readLines(lines)
31
+ return deserializeComponentLines(realLines)
32
+ }
33
+
34
+ /**
35
+ * Deserialize a calendar component from a list of lines.
36
+ * @param lines The serialized component as a list of lines.
37
+ * @returns The deserialized calendar component object.
38
+ * @throws {DeserializationError} If the component is invalid.
39
+ */
40
+ export function deserializeComponentLines(lines: string[]): Component {
30
41
  const component = new Component('')
31
42
  let done = false
32
43
 
@@ -35,7 +46,7 @@ export async function deserializeComponent(
35
46
 
36
47
  const subcomponentLines = new Array<string>()
37
48
 
38
- const processLine = async (line: string) => {
49
+ const processLine = (line: string) => {
39
50
  if (line.trim() === '') return
40
51
 
41
52
  if (done) {
@@ -71,7 +82,7 @@ export async function deserializeComponent(
71
82
  // Check the length of the stack after being popped
72
83
  if (stack.length == 1) {
73
84
  subcomponentLines.push(line)
74
- const subcomponent = await deserializeComponentString(
85
+ const subcomponent = deserializeComponentString(
75
86
  subcomponentLines.join('\r\n')
76
87
  )
77
88
  subcomponentLines.length = 0
@@ -117,14 +128,14 @@ export async function deserializeComponent(
117
128
  that exists on a long line.
118
129
  */
119
130
  let unfoldedLine = ''
120
- for await (const line of lines) {
131
+ for (const line of lines) {
121
132
  if (line.startsWith(' ') || line.startsWith('\t')) {
122
133
  // Unfold continuation line (remove leading whitespace and append)
123
134
  unfoldedLine += line.replace(/[\r\n]/, '').slice(1)
124
135
  } else {
125
136
  if (unfoldedLine) {
126
137
  // Process the previous unfolded line
127
- await processLine(unfoldedLine)
138
+ processLine(unfoldedLine)
128
139
  }
129
140
  // Start a new unfolded line
130
141
  unfoldedLine = line
@@ -132,7 +143,7 @@ export async function deserializeComponent(
132
143
  }
133
144
 
134
145
  // Process the last unfolded line
135
- await processLine(unfoldedLine)
146
+ processLine(unfoldedLine)
136
147
 
137
148
  // Check that component has been closed
138
149
  if (!done) {
@@ -142,21 +153,34 @@ export async function deserializeComponent(
142
153
  return component
143
154
  }
144
155
 
156
+ /**
157
+ * Convert a **readline** interface to a list of lines.
158
+ * @param rl The interface.
159
+ * @returns The list of lines read from the interface.
160
+ * @throws {DeserializationError} If the component is invalid.
161
+ */
162
+ async function readLines(rl: readline.Interface): Promise<string[]> {
163
+ return new Promise(resolve => {
164
+ const lines: string[] = []
165
+
166
+ rl.on('line', line => {
167
+ lines.push(line)
168
+ })
169
+ rl.on('close', () => {
170
+ resolve(lines)
171
+ })
172
+ })
173
+ }
174
+
145
175
  /**
146
176
  * Deserialize a calendar component string.
147
177
  * @param text The serialized component.
148
178
  * @returns The deserialized component object.
149
179
  * @throws {DeserializationError} If the component is invalid.
150
180
  */
151
- export async function deserializeComponentString(
152
- text: string
153
- ): Promise<Component> {
154
- const stream = Readable.from(text)
155
- const lines = readline.createInterface({
156
- input: stream,
157
- crlfDelay: Infinity,
158
- })
159
- return deserializeComponent(lines)
181
+ export function deserializeComponentString(text: string): Component {
182
+ const lines = text.split(/\r?\n/g)
183
+ return deserializeComponentLines(lines)
160
184
  }
161
185
 
162
186
  /**
@@ -164,8 +188,8 @@ export async function deserializeComponentString(
164
188
  * @param text A serialized calendar as you would see in an iCalendar file.
165
189
  * @returns The parsed calendar object.
166
190
  */
167
- export async function parseCalendar(text: string): Promise<Calendar> {
168
- const component = await deserializeComponentString(text)
191
+ export function parseCalendar(text: string): Calendar {
192
+ const component = deserializeComponentString(text)
169
193
  return new Calendar(component)
170
194
  }
171
195
 
@@ -174,8 +198,8 @@ export async function parseCalendar(text: string): Promise<Calendar> {
174
198
  * @param text A serialized event as you would see in an iCalendar file.
175
199
  * @returns The parsed event object.
176
200
  */
177
- export async function parseEvent(text: string): Promise<CalendarEvent> {
178
- const component = await deserializeComponentString(text)
201
+ export function parseEvent(text: string): CalendarEvent {
202
+ const component = deserializeComponentString(text)
179
203
  return new CalendarEvent(component)
180
204
  }
181
205