generate-ical 1.0.7 → 2.0.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 +78 -4
- package/dist/index.d.ts +23 -5
- package/dist/index.js +6 -91
- package/package.json +30 -28
- package/dist/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
# generate-ical
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A lightweight, typed utility for generating iCal files and calendar URLs. With minimal dependencies and minimal code complexity, this can be used almost everywhere.
|
|
4
4
|
|
|
5
|
-
It doesn't depend on
|
|
5
|
+
It doesn't depend on any specific implementation (e.g., Express, Koa, file system, etc.). It simply generates the file content as a string for you to use however you want.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
9
|
`npm install generate-ical`
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Functions
|
|
12
|
+
|
|
13
|
+
### `generateIcal`
|
|
14
|
+
|
|
15
|
+
Generates an iCal file content as a string.
|
|
12
16
|
|
|
13
17
|
```typescript
|
|
18
|
+
import { generateIcal } from "generate-ical"
|
|
19
|
+
|
|
14
20
|
const fileContent = generateIcal({
|
|
15
21
|
title: "My First Event",
|
|
16
22
|
description: {
|
|
@@ -26,18 +32,86 @@ const fileContent = generateIcal({
|
|
|
26
32
|
})
|
|
27
33
|
```
|
|
28
34
|
|
|
35
|
+
### `generateGoogleUrl`
|
|
36
|
+
|
|
37
|
+
Generates a Google Calendar URL for adding an event.
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { generateGoogleUrl } from "generate-ical"
|
|
41
|
+
|
|
42
|
+
const googleUrl = generateGoogleUrl({
|
|
43
|
+
title: "My First Event",
|
|
44
|
+
description: {
|
|
45
|
+
plain: "My event description",
|
|
46
|
+
},
|
|
47
|
+
isAllDay: false,
|
|
48
|
+
startDate: new Date("2023-01-01T18:00:00.000Z"),
|
|
49
|
+
endDate: new Date("2023-01-01T22:00:00.000Z"),
|
|
50
|
+
location: { title: "My place" },
|
|
51
|
+
url: "https://optional-video-call.com",
|
|
52
|
+
})
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### `generateOffice365Url`
|
|
56
|
+
|
|
57
|
+
Generates an Office 365 Calendar URL for adding an event.
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { generateOffice365Url } from "generate-ical"
|
|
61
|
+
|
|
62
|
+
const office365Url = generateOffice365Url({
|
|
63
|
+
title: "My First Event",
|
|
64
|
+
description: {
|
|
65
|
+
plain: "My event description",
|
|
66
|
+
},
|
|
67
|
+
isAllDay: false,
|
|
68
|
+
startDate: new Date("2023-01-01T18:00:00.000Z"),
|
|
69
|
+
endDate: new Date("2023-01-01T22:00:00.000Z"),
|
|
70
|
+
location: { title: "My place" },
|
|
71
|
+
url: "https://optional-video-call.com",
|
|
72
|
+
})
|
|
73
|
+
```
|
|
74
|
+
|
|
29
75
|
## Examples
|
|
30
76
|
|
|
31
77
|
### File System
|
|
32
78
|
|
|
33
79
|
```typescript
|
|
80
|
+
import { generateIcal } from "generate-ical"
|
|
81
|
+
import fs from "fs"
|
|
82
|
+
|
|
83
|
+
const fileContent = generateIcal({
|
|
84
|
+
/* ... */
|
|
85
|
+
})
|
|
34
86
|
fs.writeFileSync("./Event.ics", fileContent)
|
|
35
87
|
```
|
|
36
88
|
|
|
37
89
|
### Koa
|
|
38
90
|
|
|
39
91
|
```typescript
|
|
92
|
+
import { generateIcal } from "generate-ical"
|
|
93
|
+
|
|
40
94
|
context.response.set("Content-Type", "text/calendar")
|
|
41
95
|
context.response.set("Content-Disposition", `attachment; filename="Event.ics"`)
|
|
42
|
-
context.body =
|
|
96
|
+
context.body = generateIcal({
|
|
97
|
+
/* ... */
|
|
98
|
+
})
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Redirect to Calendar
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
import { generateGoogleUrl, generateOffice365Url } from "generate-ical"
|
|
105
|
+
|
|
106
|
+
const event = {
|
|
107
|
+
/* ... */
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
router.get("/add-to-google", (req, res) => {
|
|
111
|
+
res.redirect(generateGoogleUrl(event))
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
router.get("/add-to-office365", (req, res) => {
|
|
115
|
+
res.redirect(generateOffice365Url(event))
|
|
116
|
+
})
|
|
43
117
|
```
|
package/dist/index.d.ts
CHANGED
|
@@ -15,7 +15,6 @@ type Event = {
|
|
|
15
15
|
};
|
|
16
16
|
organizer?: {
|
|
17
17
|
name: string;
|
|
18
|
-
email?: string;
|
|
19
18
|
mailTo?: string;
|
|
20
19
|
sentBy?: string;
|
|
21
20
|
};
|
|
@@ -27,7 +26,26 @@ type Event = {
|
|
|
27
26
|
isAllDay: false;
|
|
28
27
|
endDate: Date;
|
|
29
28
|
});
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
* @param data - The event data to generate the iCal file for.
|
|
33
|
+
* @returns The iCal file content as a string.
|
|
34
|
+
*/
|
|
35
|
+
declare function generateIcal(data: Event): string;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* @param data - The event data to generate the Google URL for.
|
|
40
|
+
* @returns The Google URL as a string.
|
|
41
|
+
*/
|
|
42
|
+
declare function generateGoogleUrl(data: Event): string;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
* @param data - The event data to generate the Office 365 URL for.
|
|
47
|
+
* @returns The Office 365 URL as a string.
|
|
48
|
+
*/
|
|
49
|
+
declare function generateOffice365Url(data: Event): string;
|
|
50
|
+
|
|
51
|
+
export { generateGoogleUrl, generateIcal, generateOffice365Url };
|
package/dist/index.js
CHANGED
|
@@ -1,91 +1,6 @@
|
|
|
1
|
-
"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.escape = escape;
|
|
8
|
-
exports.escapeInQuotes = escapeInQuotes;
|
|
9
|
-
const uuid_random_1 = __importDefault(require("uuid-random"));
|
|
10
|
-
function generateIcal(data) {
|
|
11
|
-
const id = (0, uuid_random_1.default)();
|
|
12
|
-
let result = "";
|
|
13
|
-
function addRow(row) {
|
|
14
|
-
result += `${row}\r\n`;
|
|
15
|
-
}
|
|
16
|
-
addRow("BEGIN:VCALENDAR");
|
|
17
|
-
addRow("VERSION:2.0");
|
|
18
|
-
addRow("PRODID://Hadermite//ical-generator//EN");
|
|
19
|
-
addRow("CALSCALE:GREGORIAN");
|
|
20
|
-
addRow("BEGIN:VEVENT");
|
|
21
|
-
addRow(`UID:${id}`);
|
|
22
|
-
addRow(`SEQUENCE:0`);
|
|
23
|
-
addRow(`DTSTAMP:${formatDateTime(new Date())}`);
|
|
24
|
-
addRow(`SUMMARY:${escape(data.title)}`);
|
|
25
|
-
if (data.description !== undefined) {
|
|
26
|
-
const { plain, html } = data.description;
|
|
27
|
-
addRow(`DESCRIPTION:${plain}`);
|
|
28
|
-
if (html !== undefined) {
|
|
29
|
-
addRow(`X-ALT-DESC;FMTTYPE=text/html:${escape(html)}`);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
if (data.isAllDay) {
|
|
33
|
-
addRow(`DTSTART;VALUE=DATE:${formatDate(data.startDate)}`);
|
|
34
|
-
if (data.endDate !== undefined) {
|
|
35
|
-
addRow(`DTEND;VALUE=DATE:${formatDate(data.endDate)}`);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
addRow(`DTSTART:${formatDateTime(data.startDate)}`);
|
|
40
|
-
addRow(`DTEND:${formatDateTime(data.endDate)}`);
|
|
41
|
-
}
|
|
42
|
-
if (data.location !== undefined) {
|
|
43
|
-
addRow(`LOCATION:${escape(data.location.title)}`);
|
|
44
|
-
if (data.location.address !== undefined) {
|
|
45
|
-
addRow(escape(data.location.address));
|
|
46
|
-
}
|
|
47
|
-
if (data.location.geo !== undefined) {
|
|
48
|
-
const { lat, lon } = data.location.geo;
|
|
49
|
-
addRow(`GEO:${escape(lat.toString())};${escape(lon.toString())}`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
if (data.organizer !== undefined) {
|
|
53
|
-
const { name, sentBy, email, mailTo } = data.organizer;
|
|
54
|
-
let string = `ORGANIZER;CN=${escapeInQuotes(name)}`;
|
|
55
|
-
if (sentBy !== undefined) {
|
|
56
|
-
string += `;SENT-BY="mailto:${escapeInQuotes(sentBy)}"`;
|
|
57
|
-
}
|
|
58
|
-
if (email !== undefined && mailTo !== undefined) {
|
|
59
|
-
string += `;EMAIL=${escape(email)}`;
|
|
60
|
-
}
|
|
61
|
-
if (email !== undefined) {
|
|
62
|
-
string += `:mailto:${escape(mailTo !== null && mailTo !== void 0 ? mailTo : email)}`;
|
|
63
|
-
}
|
|
64
|
-
addRow(string);
|
|
65
|
-
}
|
|
66
|
-
if (data.url !== undefined) {
|
|
67
|
-
addRow(`URL;VALUE=URI:${escape(data.url)}`);
|
|
68
|
-
}
|
|
69
|
-
addRow("END:VEVENT");
|
|
70
|
-
addRow("END:VCALENDAR");
|
|
71
|
-
return result;
|
|
72
|
-
}
|
|
73
|
-
function escape(string) {
|
|
74
|
-
return string.replace(/[\\;,]/g, match => "\\" + match).replace(/(?:\r\n|\r|\n)/g, "\\n");
|
|
75
|
-
}
|
|
76
|
-
function escapeInQuotes(string) {
|
|
77
|
-
return string.replace(/[\\;,"]/g, match => "\\" + match).replace(/(?:\r\n|\r|\n)/g, "\\n");
|
|
78
|
-
}
|
|
79
|
-
function formatDate(date) {
|
|
80
|
-
const year = date.getUTCFullYear().toString();
|
|
81
|
-
const month = `${date.getUTCMonth() + 1}`.padStart(2, "0");
|
|
82
|
-
const day = `${date.getUTCDate()}`.padStart(2, "0");
|
|
83
|
-
return `${year}${month}${day}`;
|
|
84
|
-
}
|
|
85
|
-
function formatDateTime(date) {
|
|
86
|
-
const hours = `${date.getUTCHours()}`.padStart(2, "0");
|
|
87
|
-
const minutes = `${date.getUTCMinutes()}`.padStart(2, "0");
|
|
88
|
-
const seconds = `${date.getUTCSeconds()}`.padStart(2, "0");
|
|
89
|
-
return `${formatDate(date)}T${hours}${minutes}${seconds}Z`;
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
import U from"uuid-random";function D(t){let o=U(),n="";function e(r){n+=`${r}\r
|
|
2
|
+
`}if(e("BEGIN:VCALENDAR"),e("VERSION:2.0"),e("PRODID://Hadermite//ical-generator//EN"),e("CALSCALE:GREGORIAN"),e("BEGIN:VEVENT"),e(`UID:${o}`),e("SEQUENCE:0"),e(`DTSTAMP:${g(new Date)}`),e(`SUMMARY:${s(t.title)}`),t.description!==void 0){let{plain:r,html:i}=t.description;e(`DESCRIPTION:${r}`),i!==void 0&&e(`X-ALT-DESC;FMTTYPE=text/html:${s(i)}`)}if(t.isAllDay?(e(`DTSTART;VALUE=DATE:${c(u(t.startDate))}`),t.endDate?e(`DTEND;VALUE=DATE:${c(u(t.endDate))}`):e(`DTEND;VALUE=DATE:${c(u(t.startDate))}`)):(e(`DTSTART:${g(t.startDate)}`),e(`DTEND:${g(t.endDate)}`)),t.location!==void 0){let r=[t.location.title];if(t.location.address!==void 0&&r.push(s(t.location.address)),e(`LOCATION:${s(r.join("\\, "))}`),t.location.geo!==void 0){let{lat:i,lon:l}=t.location.geo;e(`GEO:${s(i.toString())};${s(l.toString())}`)}}if(t.organizer!==void 0){let{name:r,sentBy:i,mailTo:l}=t.organizer,a=`ORGANIZER;CN=${f(r)}`;i!==void 0&&(a+=`;SENT-BY="mailto:${f(i)}"`),l!==void 0&&(a+=`:mailto:${s(l)}`),e(a)}return t.url!==void 0&&e(`URL;VALUE=URI:${s(t.url)}`),e("END:VEVENT"),e("END:VCALENDAR"),n}function s(t){return t.replace(/[\\;,]/g,o=>"\\"+o).replace(/(?:\r\n|\r|\n)/g,"\\n")}function f(t){return t.replace(/[\\;,"]/g,o=>"\\"+o).replace(/(?:\r\n|\r|\n)/g,"\\n")}function c(t){let o=t.getUTCFullYear().toString(),n=`${t.getUTCMonth()+1}`.padStart(2,"0"),e=`${t.getUTCDate()}`.padStart(2,"0");return`${o}${n}${e}`}function g(t){let o=`${t.getUTCHours()}`.padStart(2,"0"),n=`${t.getUTCMinutes()}`.padStart(2,"0"),e=`${t.getUTCSeconds()}`.padStart(2,"0");return`${c(t)}T${o}${n}${e}Z`}function u(t){return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate(),0,0,0,0))}function $(t){let o=[t.description?.plain,t.url].filter(r=>r!==void 0),n=[];return t.location&&(n.push(t.location.title),t.location.address&&n.push(t.location.address),t.location.geo&&n.push(`(${t.location.geo.lat}, ${t.location.geo.lon})`)),`https://www.google.com/calendar/render?${new URLSearchParams({action:"TEMPLATE",text:t.title.replace(/[^\w\s]/g,""),details:o.join(`
|
|
3
|
+
|
|
4
|
+
`),dates:t.isAllDay?`${T(t.startDate)}/${T(t.endDate??t.startDate)}`:`${p(t.startDate)}/${p(t.endDate)}`,...n.length>0&&{location:n.join(", ")}})}`}function p(t){let o=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),e=t.getUTCDate().toString().padStart(2,"0"),r=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),l=t.getUTCSeconds().toString().padStart(2,"0");return`${o}${n}${e}T${r}${i}${l}Z`}function T(t){let o=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),e=t.getUTCDate().toString().padStart(2,"0");return`${o}${n}${e}`}function E(t){let o=[t.description?.plain,t.url].filter(r=>r!==void 0),n=[];return t.location&&(n.push(t.location.title),t.location.address&&n.push(t.location.address),t.location.geo&&n.push(`(${t.location.geo.lat}, ${t.location.geo.lon})`)),`https://outlook.office.com/calendar/0/deeplink/compose?${new URLSearchParams({rru:"addevent",subject:t.title.replace(/[^\w\s]/g,""),body:o.join(`
|
|
5
|
+
|
|
6
|
+
`),startdt:t.isAllDay?m(t.startDate):S(t.startDate),enddt:t.isAllDay?m(t.endDate??t.startDate):S(t.endDate),...n.length>0&&{location:n.join(", ")}})}`}function S(t){return t.toISOString()}function m(t){return t.toISOString().split("T")[0]}export{$ as generateGoogleUrl,D as generateIcal,E as generateOffice365Url};
|
package/package.json
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
2
|
+
"name": "generate-ical",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "2.0.0",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Lukas Wiklund",
|
|
7
|
+
"email": "lukas@wiklund.se",
|
|
8
|
+
"url": "https://github.com/lukaswiklund"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/lukaswiklund/generate-ical.git"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"./dist/**/*"
|
|
16
|
+
],
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"uuid-random": "^1.3.2"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"prettier": "^3.7.4",
|
|
23
|
+
"tsup": "^8.5.1",
|
|
24
|
+
"typescript": "^5.9.3"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsup",
|
|
28
|
+
"format": "prettier --write .",
|
|
29
|
+
"deploy": "corepack pnpm i && corepack pnpm run format && corepack pnpm run build && corepack pnpm publish"
|
|
30
|
+
}
|
|
31
|
+
}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|