@pipedream/microsoft_outlook 1.7.8 → 1.7.9

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.
@@ -1,12 +1,19 @@
1
1
  import fs from "fs";
2
2
  import mime from "mime-types";
3
+ import path from "path";
4
+ import PDFDocument from "pdfkit";
5
+ import { PassThrough } from "stream";
6
+ import puppeteer from "puppeteer-core";
7
+ import chromium from "@sparticuz/chromium";
8
+ import mammoth from "mammoth";
9
+ import { ConfigurationError } from "@pipedream/platform";
3
10
  import microsoftOutlook from "../../microsoft_outlook.app.mjs";
4
11
 
5
12
  export default {
6
13
  key: "microsoft_outlook-download-attachment",
7
14
  name: "Download Attachment",
8
15
  description: "Downloads an attachment to the /tmp directory. [See the documentation](https://learn.microsoft.com/en-us/graph/api/attachment-get?view=graph-rest-1.0&tabs=http)",
9
- version: "0.0.9",
16
+ version: "0.0.10",
10
17
  annotations: {
11
18
  destructiveHint: false,
12
19
  openWorldHint: true,
@@ -36,12 +43,71 @@ export default {
36
43
  label: "Filename",
37
44
  description: "The filename to save the attachment as in the /tmp directory",
38
45
  },
46
+ convertToPdf: {
47
+ type: "boolean",
48
+ label: "Convert to PDF",
49
+ description: "Whether to convert the attachment to a PDF file. Supports converting image, text, HTML, and DOCX files.",
50
+ optional: true,
51
+ },
39
52
  syncDir: {
40
53
  type: "dir",
41
54
  accessMode: "write",
42
55
  sync: true,
43
56
  },
44
57
  },
58
+ methods: {
59
+ getAttachmentInfo({
60
+ messageId, attachmentId, ...args
61
+ }) {
62
+ return this.microsoftOutlook._makeRequest({
63
+ path: `/me/messages/${messageId}/attachments/${attachmentId}`,
64
+ ...args,
65
+ });
66
+ },
67
+ async imageToPdf(imageBuffer) {
68
+ return new Promise((resolve, reject) => {
69
+ const doc = new PDFDocument({
70
+ autoFirstPage: false,
71
+ });
72
+ const stream = new PassThrough();
73
+ const chunks = [];
74
+ stream.on("error", reject);
75
+ doc.on("error", reject);
76
+
77
+ stream.on("data", (c) => chunks.push(c));
78
+ stream.on("end", () => resolve(Buffer.concat(chunks)));
79
+
80
+ doc.pipe(stream);
81
+ doc.addPage();
82
+ doc.image(imageBuffer, {
83
+ fit: [
84
+ 500,
85
+ 700,
86
+ ],
87
+ align: "center",
88
+ });
89
+ doc.end();
90
+ });
91
+ },
92
+ async htmlToPdf(htmlBuffer) {
93
+ const browser = await puppeteer.launch({
94
+ executablePath: await chromium.executablePath(),
95
+ args: chromium.args,
96
+ headless: chromium.headless,
97
+ });
98
+ try {
99
+ const page = await browser.newPage();
100
+ await page.setContent(htmlBuffer.toString("utf8"), {
101
+ waitUntil: "domcontentloaded",
102
+ });
103
+ return await page.pdf({
104
+ format: "A4",
105
+ });
106
+ } finally {
107
+ await browser.close();
108
+ }
109
+ },
110
+ },
45
111
  async run({ $ }) {
46
112
  const response = await this.microsoftOutlook.getAttachment({
47
113
  $,
@@ -50,14 +116,46 @@ export default {
50
116
  responseType: "arraybuffer",
51
117
  });
52
118
 
119
+ let filename = this.filename;
120
+ if (this.convertToPdf) {
121
+ const name = path.parse(filename).name;
122
+ filename = `${name}.pdf`;
123
+ }
124
+
53
125
  const rawcontent = response.toString("base64");
54
- const buffer = Buffer.from(rawcontent, "base64");
55
- const downloadedFilepath = `/tmp/${this.filename}`;
126
+ let buffer = Buffer.from(rawcontent, "base64");
127
+
128
+ if (this.convertToPdf) {
129
+ const { contentType: mimeType } = await this.getAttachmentInfo({
130
+ $,
131
+ messageId: this.messageId,
132
+ attachmentId: this.attachmentId,
133
+ });
134
+ if (mimeType !== "application/pdf") {
135
+ if (mimeType?.startsWith("image/")) {
136
+ buffer = await this.imageToPdf(buffer);
137
+ } else if (mimeType === "text/html") {
138
+ buffer = await this.htmlToPdf(buffer);
139
+ } else if (mimeType === "text/plain") {
140
+ const textBuffer = Buffer.from(`<pre>${buffer.toString("utf8")}</pre>`, "utf8");
141
+ buffer = await this.htmlToPdf(textBuffer);
142
+ } else if (mimeType === "application/vnd.openxmlformats-officedocument.wordprocessingml.document") {
143
+ const { value: html } = await mammoth.convertToHtml({
144
+ buffer,
145
+ });
146
+ buffer = await this.htmlToPdf(html);
147
+ } else {
148
+ throw new ConfigurationError(`Cannot convert file type: ${mimeType} to PDF`);
149
+ }
150
+ }
151
+ }
152
+
153
+ const downloadedFilepath = `/tmp/${filename}`;
56
154
  fs.writeFileSync(downloadedFilepath, buffer);
57
155
  const contentType = mime.lookup(downloadedFilepath);
58
156
 
59
157
  return {
60
- fileName: this.filename,
158
+ fileName: filename,
61
159
  contentType,
62
160
  filePath: downloadedFilepath,
63
161
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pipedream/microsoft_outlook",
3
- "version": "1.7.8",
3
+ "version": "1.7.9",
4
4
  "description": "Pipedream Microsoft Outlook Components",
5
5
  "main": "microsoft_outlook.app.mjs",
6
6
  "keywords": [
@@ -13,10 +13,14 @@
13
13
  "author": "Pipedream <support@pipedream.com> (https://pipedream.com/)",
14
14
  "dependencies": {
15
15
  "@pipedream/platform": "^3.1.1",
16
+ "@sparticuz/chromium": "^143.0.4",
16
17
  "axios": "^0.30.2",
17
18
  "js-base64": "^3.7.2",
19
+ "mammoth": "^1.11.0",
18
20
  "md5": "^2.3.0",
19
- "mime-types": "^2.1.35"
21
+ "mime-types": "^2.1.35",
22
+ "pdfkit": "^0.17.2",
23
+ "puppeteer-core": "^24.36.1"
20
24
  },
21
25
  "publishConfig": {
22
26
  "access": "public"