chromiumly 2.6.0 → 2.8.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.
Files changed (111) hide show
  1. package/README.md +147 -42
  2. package/dist/chromium/converters/converter.d.ts +1 -1
  3. package/dist/chromium/converters/converter.js +1 -1
  4. package/dist/chromium/converters/converter.js.map +1 -1
  5. package/dist/chromium/converters/html.converter.d.ts +9 -4
  6. package/dist/chromium/converters/html.converter.js +7 -3
  7. package/dist/chromium/converters/html.converter.js.map +1 -1
  8. package/dist/chromium/converters/markdown.converter.d.ts +9 -4
  9. package/dist/chromium/converters/markdown.converter.js +7 -3
  10. package/dist/chromium/converters/markdown.converter.js.map +1 -1
  11. package/dist/chromium/converters/url.converter.d.ts +9 -4
  12. package/dist/chromium/converters/url.converter.js +6 -2
  13. package/dist/chromium/converters/url.converter.js.map +1 -1
  14. package/dist/chromium/index.d.ts +6 -3
  15. package/dist/chromium/index.js +7 -1
  16. package/dist/chromium/index.js.map +1 -1
  17. package/dist/chromium/interfaces/common.types.d.ts +13 -0
  18. package/dist/chromium/interfaces/common.types.js +3 -0
  19. package/dist/chromium/interfaces/common.types.js.map +1 -0
  20. package/dist/chromium/interfaces/converter.types.d.ts +4 -10
  21. package/dist/chromium/interfaces/screenshot.types.d.ts +10 -0
  22. package/dist/chromium/interfaces/screenshot.types.js +3 -0
  23. package/dist/chromium/interfaces/screenshot.types.js.map +1 -0
  24. package/dist/chromium/screenshots/html.screenshot.d.ts +54 -0
  25. package/dist/chromium/screenshots/html.screenshot.js +67 -0
  26. package/dist/chromium/screenshots/html.screenshot.js.map +1 -0
  27. package/dist/chromium/screenshots/markdown.screenshot.d.ts +52 -0
  28. package/dist/chromium/screenshots/markdown.screenshot.js +66 -0
  29. package/dist/chromium/screenshots/markdown.screenshot.js.map +1 -0
  30. package/dist/chromium/screenshots/screenshot.d.ts +18 -0
  31. package/dist/chromium/screenshots/screenshot.js +21 -0
  32. package/dist/chromium/screenshots/screenshot.js.map +1 -0
  33. package/dist/chromium/screenshots/url.screenshot.d.ts +50 -0
  34. package/dist/chromium/screenshots/url.screenshot.js +66 -0
  35. package/dist/chromium/screenshots/url.screenshot.js.map +1 -0
  36. package/dist/chromium/utils/converter.utils.d.ts +2 -12
  37. package/dist/chromium/utils/converter.utils.js +36 -50
  38. package/dist/chromium/utils/converter.utils.js.map +1 -1
  39. package/dist/chromium/utils/screenshot.utils.d.ts +22 -0
  40. package/dist/chromium/utils/screenshot.utils.js +75 -0
  41. package/dist/chromium/utils/screenshot.utils.js.map +1 -0
  42. package/dist/common/gotenberg.utils.d.ts +11 -1
  43. package/dist/common/gotenberg.utils.js +25 -2
  44. package/dist/common/gotenberg.utils.js.map +1 -1
  45. package/dist/common/index.d.ts +3 -3
  46. package/dist/common/index.js.map +1 -1
  47. package/dist/common/types.d.ts +1 -1
  48. package/dist/gotenberg.js +4 -3
  49. package/dist/gotenberg.js.map +1 -1
  50. package/dist/libre-office/index.d.ts +2 -2
  51. package/dist/libre-office/index.js.map +1 -1
  52. package/dist/libre-office/utils/constants.js +80 -76
  53. package/dist/libre-office/utils/constants.js.map +1 -1
  54. package/dist/libre-office/utils/libre-office.utils.d.ts +3 -3
  55. package/dist/libre-office/utils/libre-office.utils.js +5 -5
  56. package/dist/libre-office/utils/libre-office.utils.js.map +1 -1
  57. package/dist/main.config.d.ts +6 -1
  58. package/dist/main.config.js +11 -6
  59. package/dist/main.config.js.map +1 -1
  60. package/dist/main.d.ts +3 -3
  61. package/dist/main.js +4 -1
  62. package/dist/main.js.map +1 -1
  63. package/dist/pdf-engines/index.d.ts +1 -1
  64. package/dist/pdf-engines/index.js.map +1 -1
  65. package/dist/pdf-engines/pdf.engine.d.ts +3 -3
  66. package/dist/pdf-engines/pdf.engine.js +5 -5
  67. package/dist/pdf-engines/pdf.engine.js.map +1 -1
  68. package/dist/pdf-engines/utils/engine.utils.d.ts +2 -2
  69. package/dist/pdf-engines/utils/engine.utils.js +3 -3
  70. package/dist/pdf-engines/utils/engine.utils.js.map +1 -1
  71. package/package.json +20 -12
  72. package/src/.prettierrc.yml +4 -0
  73. package/src/chromium/converters/converter.ts +2 -2
  74. package/src/chromium/converters/html.converter.ts +37 -27
  75. package/src/chromium/converters/markdown.converter.ts +32 -26
  76. package/src/chromium/converters/tests/html.converter.test.ts +97 -73
  77. package/src/chromium/converters/tests/markdown.converter.test.ts +102 -77
  78. package/src/chromium/converters/tests/url.converter.test.ts +90 -66
  79. package/src/chromium/converters/url.converter.ts +31 -25
  80. package/src/chromium/index.ts +6 -3
  81. package/src/chromium/interfaces/common.types.ts +15 -0
  82. package/src/chromium/interfaces/converter.types.ts +4 -12
  83. package/src/chromium/interfaces/screenshot.types.ts +12 -0
  84. package/src/chromium/screenshots/html.screenshot.ts +100 -0
  85. package/src/chromium/screenshots/markdown.screenshot.ts +95 -0
  86. package/src/chromium/screenshots/screenshot.ts +22 -0
  87. package/src/chromium/screenshots/tests/html.screenshot.test.ts +192 -0
  88. package/src/chromium/screenshots/tests/markdown.screenshot.test.ts +176 -0
  89. package/src/chromium/screenshots/tests/url.screenshot.test.ts +166 -0
  90. package/src/chromium/screenshots/url.screenshot.ts +91 -0
  91. package/src/chromium/utils/converter.utils.ts +67 -60
  92. package/src/chromium/utils/screenshot.utils.ts +115 -0
  93. package/src/chromium/utils/tests/converter.utils.test.ts +250 -168
  94. package/src/chromium/utils/tests/screenshot.utils.test.ts +284 -0
  95. package/src/common/constants.ts +3 -3
  96. package/src/common/gotenberg.utils.ts +39 -8
  97. package/src/common/index.ts +3 -3
  98. package/src/common/tests/gotenberg.utils.test.ts +84 -31
  99. package/src/common/types.ts +2 -2
  100. package/src/gotenberg.ts +9 -9
  101. package/src/libre-office/index.ts +2 -2
  102. package/src/libre-office/utils/constants.ts +80 -76
  103. package/src/libre-office/utils/libre-office.utils.ts +21 -18
  104. package/src/libre-office/utils/tests/libre-office.utils.test.ts +58 -49
  105. package/src/main.config.ts +19 -13
  106. package/src/main.ts +10 -3
  107. package/src/pdf-engines/index.ts +1 -1
  108. package/src/pdf-engines/pdf.engine.ts +23 -19
  109. package/src/pdf-engines/tests/pdf.engine.test.ts +52 -49
  110. package/src/pdf-engines/utils/engine.utils.ts +12 -9
  111. package/src/pdf-engines/utils/tests/engine.utils.test.ts +23 -23
@@ -0,0 +1,284 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import FormData from 'form-data';
3
+ import { ScreenshotUtils } from './../screenshot.utils';
4
+
5
+ describe('GotenbergUtils', () => {
6
+ const mockFormDataAppend = jest.spyOn(FormData.prototype, 'append');
7
+ const data = new FormData();
8
+
9
+ afterEach(() => {
10
+ jest.resetAllMocks();
11
+ });
12
+
13
+ describe('addImageProperties', () => {
14
+ describe('Image format', () => {
15
+ describe('when format parameter is set', () => {
16
+ it('should append format to data', () => {
17
+ ScreenshotUtils.addImageProperties(data, {
18
+ format: 'png'
19
+ });
20
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
21
+ expect(data.append).toHaveBeenCalledWith('format', 'png');
22
+ });
23
+ });
24
+ });
25
+
26
+ describe('Image background', () => {
27
+ describe('when omitBackground parameter is set', () => {
28
+ it('should append omitBackground to data', () => {
29
+ ScreenshotUtils.addImageProperties(data, {
30
+ format: 'png',
31
+ omitBackground: true
32
+ });
33
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(2);
34
+ expect(data.append).toHaveBeenCalledWith('format', 'png');
35
+ expect(data.append).toHaveBeenNthCalledWith(
36
+ 2,
37
+ 'omitBackground',
38
+ 'true'
39
+ );
40
+ });
41
+ });
42
+ });
43
+
44
+ describe('Image quality', () => {
45
+ describe('when omitBackground parameter is set', () => {
46
+ it('should append omitBackground to data', () => {
47
+ ScreenshotUtils.addImageProperties(data, {
48
+ format: 'jpeg',
49
+ quality: 50
50
+ });
51
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(2);
52
+ expect(data.append).toHaveBeenCalledWith('format', 'jpeg');
53
+ expect(data.append).toHaveBeenNthCalledWith(
54
+ 2,
55
+ 'quality',
56
+ 50
57
+ );
58
+ });
59
+ });
60
+ });
61
+ });
62
+
63
+ describe('customize', () => {
64
+ describe('when no option is passed', () => {
65
+ it('should not append anything', async () => {
66
+ await ScreenshotUtils.customize(data, {});
67
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(0);
68
+ });
69
+ });
70
+
71
+ describe('when header parameter is passed', () => {
72
+ it('should append header', async () => {
73
+ await ScreenshotUtils.customize(data, {
74
+ header: Buffer.from('header')
75
+ });
76
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
77
+ expect(data.append).toHaveBeenCalledWith(
78
+ 'files',
79
+ Buffer.from('header'),
80
+ 'header.html'
81
+ );
82
+ });
83
+ });
84
+
85
+ describe('when footer parameter is passed', () => {
86
+ it('should append footer', async () => {
87
+ await ScreenshotUtils.customize(data, {
88
+ footer: Buffer.from('footer')
89
+ });
90
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
91
+ expect(data.append).toHaveBeenCalledWith(
92
+ 'files',
93
+ Buffer.from('footer'),
94
+ 'footer.html'
95
+ );
96
+ });
97
+ });
98
+
99
+ describe('when emulatedMediaType parameter is passed', () => {
100
+ it('should append emulatedMediaType', async () => {
101
+ await ScreenshotUtils.customize(data, {
102
+ emulatedMediaType: 'screen'
103
+ });
104
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
105
+ expect(data.append).toHaveBeenCalledWith(
106
+ 'emulatedMediaType',
107
+ 'screen'
108
+ );
109
+ });
110
+ });
111
+
112
+ describe('when waitDelay parameter is passed', () => {
113
+ it('should append waitDelay', async () => {
114
+ await ScreenshotUtils.customize(data, {
115
+ waitDelay: '5s'
116
+ });
117
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
118
+ expect(data.append).toHaveBeenCalledWith('waitDelay', '5s');
119
+ });
120
+ });
121
+
122
+ describe('when waitForExpression parameter is passed', () => {
123
+ it('should append waitForExpression', async () => {
124
+ await ScreenshotUtils.customize(data, {
125
+ waitForExpression: "document.readyState === 'complete'"
126
+ });
127
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
128
+ expect(data.append).toHaveBeenCalledWith(
129
+ 'waitForExpression',
130
+ "document.readyState === 'complete'"
131
+ );
132
+ });
133
+ });
134
+
135
+ describe('when extraHttpHeaders parameter is passed', () => {
136
+ it('should append extraHttpHeaders', async () => {
137
+ const extraHttpHeaders = {
138
+ 'X-Custom-Header': 'value'
139
+ };
140
+
141
+ await ScreenshotUtils.customize(data, {
142
+ extraHttpHeaders
143
+ });
144
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
145
+ expect(data.append).toHaveBeenCalledWith(
146
+ 'extraHttpHeaders',
147
+ JSON.stringify(extraHttpHeaders)
148
+ );
149
+ });
150
+ });
151
+
152
+ describe('when failOnConsoleExceptions parameter is passed', () => {
153
+ it('should append failOnConsoleExceptions', async () => {
154
+ await ScreenshotUtils.customize(data, {
155
+ failOnConsoleExceptions: true
156
+ });
157
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
158
+ expect(data.append).toHaveBeenCalledWith(
159
+ 'failOnConsoleExceptions',
160
+ 'true'
161
+ );
162
+ });
163
+ });
164
+
165
+ describe('when failOnHttpStatusCodes parameter is passed', () => {
166
+ it('should append failOnHttpStatusCodes', async () => {
167
+ await ScreenshotUtils.customize(data, {
168
+ failOnHttpStatusCodes: [499, 599]
169
+ });
170
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
171
+ expect(data.append).toHaveBeenCalledWith(
172
+ 'failOnHttpStatusCodes',
173
+ JSON.stringify([499, 599])
174
+ );
175
+ });
176
+ });
177
+
178
+ describe('when skipNetworkIdleEvent parameter is passed', () => {
179
+ it('should append skipNetworkIdleEvent', async () => {
180
+ await ScreenshotUtils.customize(data, {
181
+ skipNetworkIdleEvent: true
182
+ });
183
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
184
+ expect(data.append).toHaveBeenCalledWith(
185
+ 'skipNetworkIdleEvent',
186
+ 'true'
187
+ );
188
+ });
189
+ });
190
+
191
+ describe('when optimizeForSpeed parameter is passed', () => {
192
+ it('should append optimizeForSpeed', async () => {
193
+ await ScreenshotUtils.customize(data, {
194
+ optimizeForSpeed: true
195
+ });
196
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
197
+ expect(data.append).toHaveBeenCalledWith(
198
+ 'optimizeForSpeed',
199
+ 'true'
200
+ );
201
+ });
202
+ });
203
+
204
+ describe('when all options are passed', () => {
205
+ it('should append all options', async () => {
206
+ await ScreenshotUtils.customize(data, {
207
+ header: Buffer.from('header.html'),
208
+ footer: Buffer.from('footer.html'),
209
+ emulatedMediaType: 'screen',
210
+ failOnHttpStatusCodes: [499, 599],
211
+ skipNetworkIdleEvent: true,
212
+ failOnConsoleExceptions: true,
213
+ properties: {
214
+ format: 'jpeg',
215
+ quality: 50
216
+ },
217
+ waitDelay: '5s',
218
+ waitForExpression: "document.readyState === 'complete'",
219
+ extraHttpHeaders: { 'X-Custom-Header': 'value' },
220
+ optimizeForSpeed: true
221
+ });
222
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(12);
223
+ expect(data.append).toHaveBeenNthCalledWith(
224
+ 1,
225
+ 'files',
226
+ Buffer.from('header.html'),
227
+ 'header.html'
228
+ );
229
+ expect(data.append).toHaveBeenNthCalledWith(
230
+ 2,
231
+ 'files',
232
+ Buffer.from('footer.html'),
233
+ 'footer.html'
234
+ );
235
+ expect(data.append).toHaveBeenNthCalledWith(
236
+ 3,
237
+ 'emulatedMediaType',
238
+ 'screen'
239
+ );
240
+ expect(data.append).toHaveBeenNthCalledWith(
241
+ 4,
242
+ 'format',
243
+ 'jpeg'
244
+ );
245
+ expect(data.append).toHaveBeenNthCalledWith(5, 'quality', 50);
246
+ expect(data.append).toHaveBeenNthCalledWith(
247
+ 6,
248
+ 'waitDelay',
249
+ '5s'
250
+ );
251
+ expect(data.append).toHaveBeenNthCalledWith(
252
+ 7,
253
+ 'waitForExpression',
254
+ "document.readyState === 'complete'"
255
+ );
256
+ expect(data.append).toHaveBeenNthCalledWith(
257
+ 8,
258
+ 'extraHttpHeaders',
259
+ JSON.stringify({ 'X-Custom-Header': 'value' })
260
+ );
261
+ expect(data.append).toHaveBeenNthCalledWith(
262
+ 9,
263
+ 'failOnHttpStatusCodes',
264
+ JSON.stringify([499, 599])
265
+ );
266
+ expect(data.append).toHaveBeenNthCalledWith(
267
+ 10,
268
+ 'failOnConsoleExceptions',
269
+ 'true'
270
+ );
271
+ expect(data.append).toHaveBeenNthCalledWith(
272
+ 11,
273
+ 'skipNetworkIdleEvent',
274
+ 'true'
275
+ );
276
+ expect(data.append).toHaveBeenNthCalledWith(
277
+ 12,
278
+ 'optimizeForSpeed',
279
+ 'true'
280
+ );
281
+ });
282
+ });
283
+ });
284
+ });
@@ -1,5 +1,5 @@
1
1
  export enum PdfFormat {
2
- A_1a = "PDF/A-1a",
3
- A_2b = "PDF/A-2b",
4
- A_3b = "PDF/A-3b",
2
+ A_1a = 'PDF/A-1a',
3
+ A_2b = 'PDF/A-2b',
4
+ A_3b = 'PDF/A-3b'
5
5
  }
@@ -1,5 +1,7 @@
1
- import FormData from "form-data";
2
- import fetch from "node-fetch";
1
+ import { constants, createReadStream, ReadStream, promises } from 'fs';
2
+ import FormData from 'form-data';
3
+ import fetch from 'node-fetch';
4
+ import { PathLikeOrReadStream } from './types';
3
5
 
4
6
  /**
5
7
  * Utility class for common tasks related to the Gotenberg service.
@@ -12,7 +14,10 @@ export class GotenbergUtils {
12
14
  * @param {string} message - The error message to throw if the condition is false.
13
15
  * @throws {Error} Throws an error with the specified message if the condition is false.
14
16
  */
15
- public static assert(condition: boolean, message: string): asserts condition {
17
+ public static assert(
18
+ condition: boolean,
19
+ message: string
20
+ ): asserts condition {
16
21
  if (!condition) {
17
22
  throw new Error(message);
18
23
  }
@@ -26,13 +31,16 @@ export class GotenbergUtils {
26
31
  * @returns {Promise<Buffer>} A Promise that resolves to the response body as a Buffer.
27
32
  * @throws {Error} Throws an error if the HTTP response status is not OK.
28
33
  */
29
- public static async fetch(endpoint: string, data: FormData): Promise<Buffer> {
34
+ public static async fetch(
35
+ endpoint: string,
36
+ data: FormData
37
+ ): Promise<Buffer> {
30
38
  const response = await fetch(endpoint, {
31
- method: "post",
39
+ method: 'post',
32
40
  body: data,
33
41
  headers: {
34
- ...data.getHeaders(),
35
- },
42
+ ...data.getHeaders()
43
+ }
36
44
  });
37
45
 
38
46
  if (!response.ok) {
@@ -41,4 +49,27 @@ export class GotenbergUtils {
41
49
 
42
50
  return response.buffer();
43
51
  }
44
- }
52
+
53
+ /**
54
+ * Adds a file to the FormData object.
55
+ *
56
+ * @param {FormData} data - The FormData object to which the file will be added.
57
+ * @param {PathLikeOrReadStream} file - The file to be added (either a PathLike or a ReadStream).
58
+ * @param {string} name - The name to be used for the file in the FormData.
59
+ * @returns {Promise<void>} A Promise that resolves once the file has been added.
60
+ */
61
+ public static async addFile(
62
+ data: FormData,
63
+ file: PathLikeOrReadStream,
64
+ name: string
65
+ ) {
66
+ if (Buffer.isBuffer(file)) {
67
+ data.append('files', file, name);
68
+ } else if (file instanceof ReadStream) {
69
+ data.append('files', file, name);
70
+ } else {
71
+ await promises.access(file, constants.R_OK);
72
+ data.append('files', createReadStream(file), name);
73
+ }
74
+ }
75
+ }
@@ -1,3 +1,3 @@
1
- export {PdfFormat} from "./constants";
2
- export {GotenbergUtils} from "./gotenberg.utils";
3
- export {PathLikeOrReadStream} from "./types"
1
+ export { PdfFormat } from './constants';
2
+ export { GotenbergUtils } from './gotenberg.utils';
3
+ export { PathLikeOrReadStream } from './types';
@@ -1,71 +1,124 @@
1
- import fetch from "node-fetch";
2
- import FormData from "form-data";
1
+ import { createReadStream, promises } from 'fs';
2
+ import path from 'path';
3
+ import fetch from 'node-fetch';
4
+ import FormData from 'form-data';
3
5
 
4
- import {GotenbergUtils} from "./../gotenberg.utils";
6
+ import { GotenbergUtils } from './../gotenberg.utils';
5
7
 
6
- const {Response, FetchError} = jest.requireActual("node-fetch");
8
+ const { Response, FetchError } = jest.requireActual('node-fetch');
7
9
 
8
- jest.mock("node-fetch", () => jest.fn());
10
+ jest.mock('node-fetch', () => jest.fn());
11
+
12
+ describe('GotenbergUtils', () => {
13
+ const mockFormDataAppend = jest.spyOn(FormData.prototype, 'append');
14
+ const data = new FormData();
9
15
 
10
- describe("GotenbergUtils", () => {
11
16
  afterEach(() => {
12
17
  jest.resetAllMocks();
13
18
  });
14
19
 
15
- describe("assert", () => {
16
- const errorMessage = "error message";
17
- describe("when condition is true", () => {
18
- it("should pass", () => {
19
- expect(() => GotenbergUtils.assert(true, errorMessage)).not.toThrow();
20
+ describe('assert', () => {
21
+ const errorMessage = 'error message';
22
+ describe('when condition is true', () => {
23
+ it('should pass', () => {
24
+ expect(() =>
25
+ GotenbergUtils.assert(true, errorMessage)
26
+ ).not.toThrow();
20
27
  });
21
28
  });
22
- describe("when condition is false", () => {
23
- it("should return error message", () => {
24
- expect(() => GotenbergUtils.assert(false, errorMessage)).toThrow(
25
- errorMessage
26
- );
29
+ describe('when condition is false', () => {
30
+ it('should return error message', () => {
31
+ expect(() =>
32
+ GotenbergUtils.assert(false, errorMessage)
33
+ ).toThrow(errorMessage);
27
34
  });
28
35
  });
29
36
  });
30
37
 
31
- describe("fetch", () => {
38
+ describe('fetch', () => {
32
39
  const mockFetch = fetch as jest.MockedFunction<typeof fetch>;
33
40
  const data = new FormData();
34
- const endpoint = "http://localhost:3000/forms/chromium/convert/html";
41
+ const endpoint = 'http://localhost:3000/forms/chromium/convert/html';
35
42
 
36
- describe("when fetch request succeeds", () => {
37
- it("should return a buffer", async () => {
38
- mockFetch.mockResolvedValueOnce(new Response("content"));
43
+ describe('when fetch request succeeds', () => {
44
+ it('should return a buffer', async () => {
45
+ mockFetch.mockResolvedValueOnce(new Response('content'));
39
46
  const response = await GotenbergUtils.fetch(endpoint, data);
40
- await expect(response).toEqual(Buffer.from("content"));
47
+ await expect(response).toEqual(Buffer.from('content'));
41
48
  });
42
49
  });
43
50
 
44
- describe("when fetch request fails", () => {
45
- describe("when there is a known error", () => {
46
- it("should throw an error", async () => {
51
+ describe('when fetch request fails', () => {
52
+ describe('when there is a known error', () => {
53
+ it('should throw an error', async () => {
47
54
  const errorMessage =
48
- "FetchError: request to http://localhost:3000/forms/chromium/convert/html failed";
49
- mockFetch.mockRejectedValueOnce(new FetchError(errorMessage));
55
+ 'FetchError: request to http://localhost:3000/forms/chromium/convert/html failed';
56
+ mockFetch.mockRejectedValueOnce(
57
+ new FetchError(errorMessage)
58
+ );
50
59
  await expect(() =>
51
60
  GotenbergUtils.fetch(endpoint, data)
52
61
  ).rejects.toThrow(errorMessage);
53
62
  });
54
63
  });
55
64
 
56
- describe("when there is an unknown error", () => {
57
- it("should throw an error", async () => {
65
+ describe('when there is an unknown error', () => {
66
+ it('should throw an error', async () => {
58
67
  mockFetch.mockResolvedValueOnce(
59
68
  new Response(
60
69
  {},
61
- {status: 500, statusText: "Internal server error"}
70
+ {
71
+ status: 500,
72
+ statusText: 'Internal server error'
73
+ }
62
74
  )
63
75
  );
64
76
  await expect(() =>
65
77
  GotenbergUtils.fetch(endpoint, data)
66
- ).rejects.toThrow("500 Internal server error");
78
+ ).rejects.toThrow('500 Internal server error');
67
79
  });
68
80
  });
69
81
  });
70
82
  });
83
+
84
+ describe('addFile', () => {
85
+ const mockPromisesAccess = jest.spyOn(promises, 'access');
86
+ const __tmp__ = path.resolve(process.cwd(), '__tmp__');
87
+ const filePath = path.resolve(__tmp__, 'file.html');
88
+
89
+ beforeAll(async () => {
90
+ mockPromisesAccess.mockResolvedValue();
91
+ await promises.mkdir(path.resolve(__tmp__), { recursive: true });
92
+ await promises.writeFile(filePath, 'data');
93
+ });
94
+
95
+ afterAll(async () => {
96
+ await promises.rm(path.resolve(__tmp__), { recursive: true });
97
+ });
98
+
99
+ describe('when file is passed as read stream', () => {
100
+ it('should append file to data', async () => {
101
+ const file = createReadStream(filePath);
102
+ await GotenbergUtils.addFile(data, file, 'file');
103
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
104
+ expect(data.append).toHaveBeenCalledWith('files', file, 'file');
105
+ });
106
+ });
107
+
108
+ describe('when file is passed as path', () => {
109
+ it('should append file to data', async () => {
110
+ await GotenbergUtils.addFile(data, filePath, 'file');
111
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
112
+ });
113
+ });
114
+
115
+ describe('when file is passed as buffer', () => {
116
+ it('should append file to data', async () => {
117
+ const file = Buffer.from('data');
118
+ await GotenbergUtils.addFile(data, file, 'file');
119
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
120
+ expect(data.append).toHaveBeenCalledWith('files', file, 'file');
121
+ });
122
+ });
123
+ });
71
124
  });
@@ -1,3 +1,3 @@
1
- import {PathLike, ReadStream} from "fs";
1
+ import { PathLike, ReadStream } from 'fs';
2
2
 
3
- export type PathLikeOrReadStream = PathLike | ReadStream
3
+ export type PathLikeOrReadStream = PathLike | ReadStream;
package/src/gotenberg.ts CHANGED
@@ -1,18 +1,18 @@
1
- process.env.SUPPRESS_NO_CONFIG_WARNING = "y";
1
+ process.env.SUPPRESS_NO_CONFIG_WARNING = 'y';
2
2
 
3
- import * as dotenv from "dotenv";
4
- import * as path from "path";
5
- import config from "config";
3
+ import * as dotenv from 'dotenv';
4
+ import * as path from 'path';
5
+ import config from 'config';
6
6
 
7
7
  // Load endpoint from environment-specific file (e.g., .env.development)
8
8
  const envFile = `.env.${process.env.NODE_ENV}`;
9
- const envFileFallback = ".env";
9
+ const envFileFallback = '.env';
10
10
 
11
- const dotenvConfig = dotenv.config({path: path.resolve(envFile)});
11
+ const dotenvConfig = dotenv.config({ path: path.resolve(envFile) });
12
12
 
13
13
  // Fallback to loading the default environment file.
14
14
  if (dotenvConfig.error) {
15
- dotenv.config({path: path.resolve(envFileFallback)});
15
+ dotenv.config({ path: path.resolve(envFileFallback) });
16
16
  }
17
17
 
18
18
  /**
@@ -25,6 +25,6 @@ export class Gotenberg {
25
25
  * @type {string}
26
26
  */
27
27
  public static endpoint: string =
28
- process.env.GOTENBERG_ENDPOINT || config.get<string>("gotenberg.endpoint");
28
+ process.env.GOTENBERG_ENDPOINT ||
29
+ config.get<string>('gotenberg.endpoint');
29
30
  }
30
-
@@ -1,2 +1,2 @@
1
- export {PageProperties} from "./interfaces/libre-office.types";
2
- export {LibreOfficeUtils} from "./utils/libre-office.utils";
1
+ export { PageProperties } from './interfaces/libre-office.types';
2
+ export { LibreOfficeUtils } from './utils/libre-office.utils';