chromiumly 2.7.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 (44) hide show
  1. package/README.md +93 -8
  2. package/dist/chromium/index.d.ts +3 -0
  3. package/dist/chromium/index.js +7 -1
  4. package/dist/chromium/index.js.map +1 -1
  5. package/dist/chromium/interfaces/screenshot.types.d.ts +10 -0
  6. package/dist/chromium/interfaces/screenshot.types.js +3 -0
  7. package/dist/chromium/interfaces/screenshot.types.js.map +1 -0
  8. package/dist/chromium/screenshots/html.screenshot.d.ts +54 -0
  9. package/dist/chromium/screenshots/html.screenshot.js +67 -0
  10. package/dist/chromium/screenshots/html.screenshot.js.map +1 -0
  11. package/dist/chromium/screenshots/markdown.screenshot.d.ts +52 -0
  12. package/dist/chromium/screenshots/markdown.screenshot.js +66 -0
  13. package/dist/chromium/screenshots/markdown.screenshot.js.map +1 -0
  14. package/dist/chromium/screenshots/screenshot.d.ts +18 -0
  15. package/dist/chromium/screenshots/screenshot.js +21 -0
  16. package/dist/chromium/screenshots/screenshot.js.map +1 -0
  17. package/dist/chromium/screenshots/url.screenshot.d.ts +50 -0
  18. package/dist/chromium/screenshots/url.screenshot.js +66 -0
  19. package/dist/chromium/screenshots/url.screenshot.js.map +1 -0
  20. package/dist/chromium/utils/screenshot.utils.d.ts +22 -0
  21. package/dist/chromium/utils/screenshot.utils.js +75 -0
  22. package/dist/chromium/utils/screenshot.utils.js.map +1 -0
  23. package/dist/main.config.d.ts +5 -0
  24. package/dist/main.config.js +5 -0
  25. package/dist/main.config.js.map +1 -1
  26. package/dist/main.d.ts +1 -1
  27. package/dist/main.js +4 -1
  28. package/dist/main.js.map +1 -1
  29. package/package.json +4 -4
  30. package/src/chromium/index.ts +3 -0
  31. package/src/chromium/interfaces/screenshot.types.ts +12 -0
  32. package/src/chromium/screenshots/html.screenshot.ts +100 -0
  33. package/src/chromium/screenshots/markdown.screenshot.ts +95 -0
  34. package/src/chromium/screenshots/screenshot.ts +22 -0
  35. package/src/chromium/screenshots/tests/html.screenshot.test.ts +192 -0
  36. package/src/chromium/screenshots/tests/markdown.screenshot.test.ts +176 -0
  37. package/src/chromium/screenshots/tests/url.screenshot.test.ts +166 -0
  38. package/src/chromium/screenshots/url.screenshot.ts +91 -0
  39. package/src/chromium/utils/screenshot.utils.ts +115 -0
  40. package/src/chromium/utils/tests/converter.utils.test.ts +13 -1
  41. package/src/chromium/utils/tests/screenshot.utils.test.ts +284 -0
  42. package/src/common/tests/gotenberg.utils.test.ts +46 -0
  43. package/src/main.config.ts +6 -0
  44. package/src/main.ts +8 -1
@@ -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,3 +1,5 @@
1
+ import { createReadStream, promises } from 'fs';
2
+ import path from 'path';
1
3
  import fetch from 'node-fetch';
2
4
  import FormData from 'form-data';
3
5
 
@@ -8,6 +10,9 @@ const { Response, FetchError } = jest.requireActual('node-fetch');
8
10
  jest.mock('node-fetch', () => jest.fn());
9
11
 
10
12
  describe('GotenbergUtils', () => {
13
+ const mockFormDataAppend = jest.spyOn(FormData.prototype, 'append');
14
+ const data = new FormData();
15
+
11
16
  afterEach(() => {
12
17
  jest.resetAllMocks();
13
18
  });
@@ -75,4 +80,45 @@ describe('GotenbergUtils', () => {
75
80
  });
76
81
  });
77
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
+ });
78
124
  });
@@ -42,6 +42,12 @@ export class Chromiumly {
42
42
  */
43
43
  public static readonly CHROMIUM_CONVERT_PATH = 'forms/chromium/convert';
44
44
 
45
+ /**
46
+ * The path for Chromium-related screenshots.
47
+ * @type {string}
48
+ */
49
+ public static readonly CHROMIUM_SCREENSHOT_PATH =
50
+ 'forms/chromium/screenshot';
45
51
  /**
46
52
  * The path for PDF engine-related operations.
47
53
  * @type {string}
package/src/main.ts CHANGED
@@ -1,3 +1,10 @@
1
1
  export { PdfFormat } from './common/constants';
2
- export { HtmlConverter, MarkdownConverter, UrlConverter } from './chromium';
2
+ export {
3
+ HtmlConverter,
4
+ HtmlScreenshot,
5
+ MarkdownConverter,
6
+ MarkdownScreenshot,
7
+ UrlConverter,
8
+ UrlScreenshot
9
+ } from './chromium';
3
10
  export { PDFEngine } from './pdf-engines';