@iqx-limited/quick-pdf 1.2.0 → 1.3.1
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 +12 -3
- package/dist/.puppeteerrc.cjs +11 -0
- package/dist/index.cjs +456 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +451 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types/browsers.d.ts +5 -0
- package/dist/{index.d.ts → types/index.d.ts} +1 -0
- package/package.json +32 -16
- package/dist/browsers.d.ts +0 -5
- package/dist/browsers.js +0 -56
- package/dist/browsers.js.map +0 -1
- package/dist/index.js +0 -12
- package/dist/index.js.map +0 -1
- package/dist/modules/html2pdf.js +0 -103
- package/dist/modules/html2pdf.js.map +0 -1
- package/dist/modules/img2pdf.js +0 -64
- package/dist/modules/img2pdf.js.map +0 -1
- package/dist/modules/pdf2img.js +0 -169
- package/dist/modules/pdf2img.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/utilies.js +0 -37
- package/dist/utilies.js.map +0 -1
- /package/dist/{modules → types/modules}/html2pdf.d.ts +0 -0
- /package/dist/{modules → types/modules}/img2pdf.d.ts +0 -0
- /package/dist/{modules → types/modules}/pdf2img.d.ts +0 -0
- /package/dist/{utilies.d.ts → types/utilies.d.ts} +0 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import { satisfies } from 'semver';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { writeFile, unlink } from 'node:fs/promises';
|
|
5
|
+
import puppeteer from 'puppeteer';
|
|
6
|
+
import { imageSize } from 'image-size';
|
|
7
|
+
import PDFDocument from 'pdfkit';
|
|
8
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
9
|
+
import { HtmlValidate } from 'html-validate/node';
|
|
10
|
+
|
|
11
|
+
let chrome = null;
|
|
12
|
+
let firefox = null;
|
|
13
|
+
async function getChromium() {
|
|
14
|
+
if (chrome)
|
|
15
|
+
return chrome;
|
|
16
|
+
try {
|
|
17
|
+
chrome = await puppeteer.launch({
|
|
18
|
+
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
console.error("Error launching Chromium browser in @iqx-limited/quick-form:", err);
|
|
23
|
+
}
|
|
24
|
+
return chrome;
|
|
25
|
+
}
|
|
26
|
+
async function getFirefox() {
|
|
27
|
+
if (firefox)
|
|
28
|
+
return firefox;
|
|
29
|
+
try {
|
|
30
|
+
firefox = await puppeteer.launch({
|
|
31
|
+
browser: "firefox",
|
|
32
|
+
headless: true,
|
|
33
|
+
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.error("Error launching Firefox browser in @iqx-limited/quick-form:", err);
|
|
38
|
+
}
|
|
39
|
+
return firefox;
|
|
40
|
+
}
|
|
41
|
+
async function closeBrowsers() {
|
|
42
|
+
try {
|
|
43
|
+
if (chrome) {
|
|
44
|
+
await chrome.close();
|
|
45
|
+
chrome = null;
|
|
46
|
+
console.log("Chromium Browser Closed");
|
|
47
|
+
}
|
|
48
|
+
if (firefox) {
|
|
49
|
+
await firefox.close();
|
|
50
|
+
firefox = null;
|
|
51
|
+
console.log("Firefox Browser Closed");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
console.error("Error closing browsers in @iqx-limited/quick-form:", err);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
process.on("exit", async () => {
|
|
59
|
+
await closeBrowsers();
|
|
60
|
+
});
|
|
61
|
+
process.on("SIGINT", async () => {
|
|
62
|
+
console.log("SIGINT received. Closing browsers...");
|
|
63
|
+
await closeBrowsers();
|
|
64
|
+
});
|
|
65
|
+
process.on("SIGTERM", async () => {
|
|
66
|
+
console.log("SIGTERM received. Closing browsers...");
|
|
67
|
+
await closeBrowsers();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const pagePoolSize$1 = 5;
|
|
71
|
+
const RESOURCE_LIMIT$1 = 100;
|
|
72
|
+
let resourceCount$1 = 0;
|
|
73
|
+
let pagePool$1 = [];
|
|
74
|
+
let browser$1 = null;
|
|
75
|
+
async function launchPages$1() {
|
|
76
|
+
if (pagePool$1.length > 0) {
|
|
77
|
+
return pagePool$1;
|
|
78
|
+
}
|
|
79
|
+
pagePool$1 = await Promise.all(Array.from({ length: pagePoolSize$1 }, async () => {
|
|
80
|
+
if (browser$1) {
|
|
81
|
+
const page = await browser$1.newPage();
|
|
82
|
+
await page.setRequestInterception(true);
|
|
83
|
+
await page.setDefaultNavigationTimeout(10000);
|
|
84
|
+
await page.goto("about:blank");
|
|
85
|
+
page.on("request", request => {
|
|
86
|
+
resourceCount$1++;
|
|
87
|
+
if (resourceCount$1 > RESOURCE_LIMIT$1) {
|
|
88
|
+
page.reload();
|
|
89
|
+
resourceCount$1 = 0;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
request.continue();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
return page;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
throw new Error("Browser not available");
|
|
99
|
+
}
|
|
100
|
+
}));
|
|
101
|
+
return pagePool$1;
|
|
102
|
+
}
|
|
103
|
+
const pdf2img = async (input, options = {}) => {
|
|
104
|
+
browser$1 = await getFirefox();
|
|
105
|
+
if (!browser$1) {
|
|
106
|
+
throw new Error("Browser not available");
|
|
107
|
+
}
|
|
108
|
+
const pagePool = await launchPages$1();
|
|
109
|
+
let page = pagePool.pop();
|
|
110
|
+
let tempPage = false;
|
|
111
|
+
if (!page) {
|
|
112
|
+
tempPage = true;
|
|
113
|
+
page = await browser$1.newPage();
|
|
114
|
+
}
|
|
115
|
+
let path = "";
|
|
116
|
+
let address = "";
|
|
117
|
+
let tempFile = false;
|
|
118
|
+
if (Buffer.isBuffer(input)) {
|
|
119
|
+
path = resolve(process.cwd(), "temp.pdf");
|
|
120
|
+
address = pathToFileURL(path).toString();
|
|
121
|
+
tempFile = true;
|
|
122
|
+
await writeFile(path, input);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
if (typeof input === "string" && input.startsWith("http")) {
|
|
126
|
+
path = input;
|
|
127
|
+
address = path;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
path = resolve(input.toString());
|
|
131
|
+
address = pathToFileURL(path).toString();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
await page.goto(address);
|
|
136
|
+
if (options.password) {
|
|
137
|
+
try {
|
|
138
|
+
await page.waitForSelector('input[type="password"]', {
|
|
139
|
+
visible: true,
|
|
140
|
+
timeout: 5000
|
|
141
|
+
});
|
|
142
|
+
console.log("Password prompt detected, entering password...");
|
|
143
|
+
await page.type('input[type="password"]', options.password || "");
|
|
144
|
+
await page.keyboard.press("Enter");
|
|
145
|
+
}
|
|
146
|
+
catch { }
|
|
147
|
+
}
|
|
148
|
+
await page.waitForSelector("canvas", { timeout: 5000 });
|
|
149
|
+
await page.waitForSelector(".loadingIcon", {
|
|
150
|
+
timeout: 5000,
|
|
151
|
+
hidden: true
|
|
152
|
+
});
|
|
153
|
+
const imageBuffers = [];
|
|
154
|
+
const pageCount = await page.evaluate(() => {
|
|
155
|
+
if (window.PDFViewerApplication) {
|
|
156
|
+
return window.PDFViewerApplication.pagesCount;
|
|
157
|
+
}
|
|
158
|
+
return 0;
|
|
159
|
+
});
|
|
160
|
+
const metadata = await page.evaluate(() => {
|
|
161
|
+
const app = window.PDFViewerApplication;
|
|
162
|
+
if (app && app.pdfDocument) {
|
|
163
|
+
return app.documentInfo ?? {};
|
|
164
|
+
}
|
|
165
|
+
return {};
|
|
166
|
+
});
|
|
167
|
+
const pdfDimensions = await page.evaluate(() => {
|
|
168
|
+
const canvas = document.querySelector("canvas");
|
|
169
|
+
const { width, height } = canvas.getBoundingClientRect();
|
|
170
|
+
return { width, height };
|
|
171
|
+
});
|
|
172
|
+
await page.setViewport({
|
|
173
|
+
width: pdfDimensions.width,
|
|
174
|
+
height: pdfDimensions.height,
|
|
175
|
+
deviceScaleFactor: 1
|
|
176
|
+
});
|
|
177
|
+
for (let i = 1; i <= pageCount; i++) {
|
|
178
|
+
await page.evaluate((pageNum) => {
|
|
179
|
+
if (window.PDFViewerApplication) {
|
|
180
|
+
window.PDFViewerApplication.page = pageNum;
|
|
181
|
+
}
|
|
182
|
+
}, i);
|
|
183
|
+
const pageBoundingBox = await page.evaluate(() => {
|
|
184
|
+
const pageElement = document.querySelector("canvas");
|
|
185
|
+
const { x, y, width, height } = pageElement.getBoundingClientRect();
|
|
186
|
+
return { x, y, width, height };
|
|
187
|
+
});
|
|
188
|
+
const screenshotOptions = {
|
|
189
|
+
fullPage: false,
|
|
190
|
+
type: options.type ?? "png",
|
|
191
|
+
clip: {
|
|
192
|
+
x: pageBoundingBox.x,
|
|
193
|
+
y: pageBoundingBox.y,
|
|
194
|
+
width: pageBoundingBox.width,
|
|
195
|
+
height: pageBoundingBox.height
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
if (options.type && options.type !== "png") {
|
|
199
|
+
screenshotOptions.quality = options.quality ?? 100;
|
|
200
|
+
}
|
|
201
|
+
const uint8array = await page.screenshot(screenshotOptions);
|
|
202
|
+
imageBuffers.push(Buffer.from(uint8array));
|
|
203
|
+
}
|
|
204
|
+
if (tempFile) {
|
|
205
|
+
await unlink(path);
|
|
206
|
+
}
|
|
207
|
+
if (tempPage) {
|
|
208
|
+
page.close();
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
await page.setViewport({
|
|
212
|
+
width: 800,
|
|
213
|
+
height: 600,
|
|
214
|
+
deviceScaleFactor: 1
|
|
215
|
+
});
|
|
216
|
+
pagePool.push(page);
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
length: pageCount,
|
|
220
|
+
metadata: metadata.info,
|
|
221
|
+
pages: imageBuffers
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (tempFile) {
|
|
226
|
+
await unlink(path);
|
|
227
|
+
}
|
|
228
|
+
if (tempPage) {
|
|
229
|
+
page.close();
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
await page.setViewport({
|
|
233
|
+
width: 800,
|
|
234
|
+
height: 600,
|
|
235
|
+
deviceScaleFactor: 1
|
|
236
|
+
});
|
|
237
|
+
pagePool.push(page);
|
|
238
|
+
}
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
async function getBuffer(input) {
|
|
244
|
+
if (input instanceof Buffer) {
|
|
245
|
+
return input;
|
|
246
|
+
}
|
|
247
|
+
return fetch(input.toString())
|
|
248
|
+
.then(res => {
|
|
249
|
+
if (res.ok) {
|
|
250
|
+
return res.arrayBuffer();
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
throw new Error("Failed to Fetch the File");
|
|
254
|
+
}
|
|
255
|
+
})
|
|
256
|
+
.then(array => Buffer.from(array))
|
|
257
|
+
.catch(() => {
|
|
258
|
+
if (existsSync(input.toString())) {
|
|
259
|
+
return readFileSync(input.toString());
|
|
260
|
+
}
|
|
261
|
+
throw new Error("Failed to Fetch the File");
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
const fetchHtmlFromUrl = async (url) => {
|
|
265
|
+
const response = await fetch(url);
|
|
266
|
+
if (!response.ok) {
|
|
267
|
+
throw new Error(`Failed to fetch content from URL: ${url}`);
|
|
268
|
+
}
|
|
269
|
+
return await response.text();
|
|
270
|
+
};
|
|
271
|
+
const readHtmlFromFilePath = async (filePath) => {
|
|
272
|
+
return readFileSync(filePath, "utf-8");
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
const img2pdf = async (input, options = {}) => {
|
|
276
|
+
const { fileTypeFromBuffer } = await import('file-type');
|
|
277
|
+
return new Promise((resolve, reject) => {
|
|
278
|
+
getBuffer(input).then(async (buf) => {
|
|
279
|
+
const type = await fileTypeFromBuffer(buf);
|
|
280
|
+
if (type?.mime !== "image/jpeg" && type?.mime !== "image/png") {
|
|
281
|
+
throw new Error("Provided File is not a JPEG or a PNG.");
|
|
282
|
+
}
|
|
283
|
+
const pdfBuffers = [];
|
|
284
|
+
const imgSize = imageSize(buf);
|
|
285
|
+
const landscape = imgSize.width && imgSize.height ? imgSize.width > imgSize.height : false;
|
|
286
|
+
const doc = new PDFDocument({
|
|
287
|
+
size: "a4",
|
|
288
|
+
layout: landscape ? "landscape" : "portrait",
|
|
289
|
+
margins: {
|
|
290
|
+
top: 0,
|
|
291
|
+
bottom: 0,
|
|
292
|
+
left: 0,
|
|
293
|
+
right: 0
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
doc.on("data", (data) => {
|
|
297
|
+
pdfBuffers.push(data);
|
|
298
|
+
});
|
|
299
|
+
doc.on("end", () => {
|
|
300
|
+
resolve(Buffer.concat(pdfBuffers));
|
|
301
|
+
});
|
|
302
|
+
doc.fontSize(options.fontSize ?? 10);
|
|
303
|
+
const topMargin = options.header ? 20 : 0;
|
|
304
|
+
const bottomMargin = options.footer ? 20 : 0;
|
|
305
|
+
const sidePadding = 20;
|
|
306
|
+
const imageHeight = doc.page.height - topMargin - bottomMargin;
|
|
307
|
+
if (options.header) {
|
|
308
|
+
doc.text(options.header, sidePadding, topMargin / 2 - 6, {
|
|
309
|
+
align: "center",
|
|
310
|
+
baseline: "top",
|
|
311
|
+
width: doc.page.width - 2 * sidePadding,
|
|
312
|
+
height: topMargin - 5,
|
|
313
|
+
ellipsis: true
|
|
314
|
+
}).moveDown(0.5);
|
|
315
|
+
}
|
|
316
|
+
doc.image(buf, 0, topMargin, {
|
|
317
|
+
width: doc.page.width,
|
|
318
|
+
height: imageHeight
|
|
319
|
+
});
|
|
320
|
+
if (options.footer) {
|
|
321
|
+
doc.text(options.footer, sidePadding, doc.page.height - bottomMargin / 2 - 6, {
|
|
322
|
+
align: "center",
|
|
323
|
+
width: doc.page.width - 2 * sidePadding,
|
|
324
|
+
height: bottomMargin - 5,
|
|
325
|
+
ellipsis: true
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
doc.end();
|
|
329
|
+
}).catch((e) => {
|
|
330
|
+
reject(e);
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
const pagePoolSize = 5;
|
|
336
|
+
const RESOURCE_LIMIT = 100;
|
|
337
|
+
let resourceCount = 0;
|
|
338
|
+
let pagePool = [];
|
|
339
|
+
let browser = null;
|
|
340
|
+
async function launchPages() {
|
|
341
|
+
if (pagePool.length > 0) {
|
|
342
|
+
return pagePool;
|
|
343
|
+
}
|
|
344
|
+
pagePool = await Promise.all(Array.from({ length: pagePoolSize }, async () => {
|
|
345
|
+
if (browser) {
|
|
346
|
+
const page = await browser.newPage();
|
|
347
|
+
await page.setRequestInterception(true);
|
|
348
|
+
await page.setDefaultNavigationTimeout(10000);
|
|
349
|
+
await page.goto("about:blank");
|
|
350
|
+
page.on("request", request => {
|
|
351
|
+
resourceCount++;
|
|
352
|
+
if (resourceCount > RESOURCE_LIMIT) {
|
|
353
|
+
page.reload();
|
|
354
|
+
resourceCount = 0;
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
request.continue();
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
return page;
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
throw new Error("Browser not available");
|
|
364
|
+
}
|
|
365
|
+
}));
|
|
366
|
+
return pagePool;
|
|
367
|
+
}
|
|
368
|
+
const html2pdf = async (input, options = {}) => {
|
|
369
|
+
const validator = new HtmlValidate(options.rules ?? {
|
|
370
|
+
extends: ["html-validate:standard"],
|
|
371
|
+
rules: {
|
|
372
|
+
"no-trailing-whitespace": "off"
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
let htmlContent = input.toString();
|
|
376
|
+
if (htmlContent.startsWith("http://") || htmlContent.startsWith("https://")) {
|
|
377
|
+
htmlContent = await fetchHtmlFromUrl(htmlContent);
|
|
378
|
+
}
|
|
379
|
+
else if (existsSync(input)) {
|
|
380
|
+
htmlContent = await readHtmlFromFilePath(htmlContent);
|
|
381
|
+
}
|
|
382
|
+
browser = await getChromium();
|
|
383
|
+
if (!browser) {
|
|
384
|
+
throw new Error("Browser not available");
|
|
385
|
+
}
|
|
386
|
+
const pagePool = await launchPages();
|
|
387
|
+
let page = pagePool.pop();
|
|
388
|
+
let tempPage = false;
|
|
389
|
+
if (!page) {
|
|
390
|
+
tempPage = true;
|
|
391
|
+
page = await browser.newPage();
|
|
392
|
+
}
|
|
393
|
+
return validator.validateString(htmlContent).then(async (res) => {
|
|
394
|
+
if (res.valid) {
|
|
395
|
+
await page.setContent(htmlContent, { waitUntil: "load" });
|
|
396
|
+
const pdf = await page.pdf({ format: "A4", printBackground: true, scale: options.scale ?? 1 });
|
|
397
|
+
const pdfBuffer = Buffer.from(pdf);
|
|
398
|
+
if (options.base64 ?? false) {
|
|
399
|
+
return pdfBuffer.toString("base64");
|
|
400
|
+
}
|
|
401
|
+
return pdfBuffer;
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
return Promise.reject({
|
|
405
|
+
valid: false,
|
|
406
|
+
count: {
|
|
407
|
+
errors: res.errorCount,
|
|
408
|
+
warnings: res.warningCount
|
|
409
|
+
},
|
|
410
|
+
validation: res.results.map(res => {
|
|
411
|
+
return {
|
|
412
|
+
file: res.filePath,
|
|
413
|
+
count: {
|
|
414
|
+
errors: res.errorCount,
|
|
415
|
+
warnings: res.warningCount
|
|
416
|
+
},
|
|
417
|
+
messages: res.messages.map(msg => {
|
|
418
|
+
return {
|
|
419
|
+
message: msg.message,
|
|
420
|
+
line: msg.line,
|
|
421
|
+
column: msg.column,
|
|
422
|
+
ruleId: msg.ruleId
|
|
423
|
+
};
|
|
424
|
+
})
|
|
425
|
+
};
|
|
426
|
+
})
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
}).finally(async () => {
|
|
430
|
+
if (tempPage) {
|
|
431
|
+
page.close();
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
await page.setViewport({
|
|
435
|
+
width: 800,
|
|
436
|
+
height: 600,
|
|
437
|
+
deviceScaleFactor: 1
|
|
438
|
+
});
|
|
439
|
+
pagePool.push(page);
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
const requiredVersion = ">=20.0.0";
|
|
445
|
+
if (!satisfies(process.version, requiredVersion)) {
|
|
446
|
+
console.error(`\nError: Node.js version ${requiredVersion} is required. You are using ${process.version}.\n`);
|
|
447
|
+
process.exit(1);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
export { closeBrowsers, html2pdf, img2pdf, pdf2img };
|
|
451
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/browsers.ts","../src/modules/pdf2img.ts","../src/utilies.ts","../src/modules/img2pdf.ts","../src/modules/html2pdf.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null],"names":["pagePoolSize","RESOURCE_LIMIT","resourceCount","pagePool","browser","launchPages"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iqx-limited/quick-pdf",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"author": "IQX",
|
|
5
5
|
"description": "Converting PDFs to images (📃 to 📸)",
|
|
6
6
|
"type": "module",
|
|
@@ -10,8 +10,15 @@
|
|
|
10
10
|
"README.md",
|
|
11
11
|
"LICENSE"
|
|
12
12
|
],
|
|
13
|
-
"main": "dist/index.
|
|
14
|
-
"
|
|
13
|
+
"main": "dist/index.cjs",
|
|
14
|
+
"module": "dist/index.mjs",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"import": "./dist/index.mjs",
|
|
18
|
+
"require": "./dist/index.cjs"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"types": "dist/types/index.d.ts",
|
|
15
22
|
"keywords": [
|
|
16
23
|
"pdf",
|
|
17
24
|
"jpeg",
|
|
@@ -26,30 +33,39 @@
|
|
|
26
33
|
],
|
|
27
34
|
"repository": "https://github.com/IQXLimited/quickpdf",
|
|
28
35
|
"scripts": {
|
|
29
|
-
"build": "npm i &&
|
|
36
|
+
"build": "npm i && rollup -c",
|
|
30
37
|
"lint": "npx --yes eslint",
|
|
31
|
-
"test": "
|
|
38
|
+
"test": "npm run build && node test/test-cjs.cjs && node test/test-esm.mjs",
|
|
39
|
+
"test:esm": "npm run build && node test/test-esm.mjs",
|
|
40
|
+
"test:cjs": "npm run build && node test/test-cjs.cjs"
|
|
32
41
|
},
|
|
33
42
|
"engines": {
|
|
34
|
-
"node": ">=
|
|
43
|
+
"node": ">=20.0.0"
|
|
35
44
|
},
|
|
36
45
|
"engineStrict": true,
|
|
37
46
|
"dependencies": {
|
|
38
|
-
"file-type": "^
|
|
39
|
-
"html-validate": "^9.
|
|
47
|
+
"file-type": "^20.1.0",
|
|
48
|
+
"html-validate": "^9.2.1",
|
|
40
49
|
"image-size": "^1.2.0",
|
|
41
50
|
"path2d-polyfill": "^3.1.3",
|
|
42
51
|
"pdfkit": "^0.16.0",
|
|
43
|
-
"puppeteer": "^
|
|
44
|
-
"
|
|
52
|
+
"puppeteer": "^24.2.0",
|
|
53
|
+
"rollup-plugin-node-externals": "^8.0.0",
|
|
54
|
+
"semver": "^7.7.1"
|
|
45
55
|
},
|
|
46
56
|
"devDependencies": {
|
|
47
|
-
"@
|
|
48
|
-
"@
|
|
49
|
-
"@
|
|
57
|
+
"@rollup/plugin-commonjs": "^28.0.2",
|
|
58
|
+
"@rollup/plugin-json": "^6.1.0",
|
|
59
|
+
"@rollup/plugin-node-resolve": "^16.0.0",
|
|
60
|
+
"@rollup/plugin-typescript": "^12.1.2",
|
|
61
|
+
"@stylistic/eslint-plugin": "^3.1.0",
|
|
62
|
+
"@types/node": "^22.13.1",
|
|
63
|
+
"@types/pdfkit": "^0.13.9",
|
|
50
64
|
"@types/semver": "^7.5.8",
|
|
51
|
-
"eslint": "^9.
|
|
52
|
-
"
|
|
53
|
-
"
|
|
65
|
+
"eslint": "^9.20.0",
|
|
66
|
+
"rollup": "^4.34.6",
|
|
67
|
+
"rollup-plugin-copy": "^3.5.0",
|
|
68
|
+
"typescript": "^5.7.3",
|
|
69
|
+
"typescript-eslint": "^8.23.0"
|
|
54
70
|
}
|
|
55
71
|
}
|
package/dist/browsers.d.ts
DELETED
package/dist/browsers.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import puppeteer from "puppeteer";
|
|
2
|
-
let chromiumBrowser = null;
|
|
3
|
-
let firefoxBrowser = null;
|
|
4
|
-
let launchPromise = null;
|
|
5
|
-
async function launchBrowsers() {
|
|
6
|
-
if (launchPromise) {
|
|
7
|
-
return launchPromise;
|
|
8
|
-
}
|
|
9
|
-
launchPromise = (async () => {
|
|
10
|
-
try {
|
|
11
|
-
chromiumBrowser = await puppeteer.launch({
|
|
12
|
-
headless: true,
|
|
13
|
-
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
|
14
|
-
});
|
|
15
|
-
firefoxBrowser = await puppeteer.launch({
|
|
16
|
-
browser: "firefox",
|
|
17
|
-
headless: true,
|
|
18
|
-
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
catch (err) {
|
|
22
|
-
console.error("Error launching browsers in @iqx-limited/quick-form:", err);
|
|
23
|
-
}
|
|
24
|
-
})();
|
|
25
|
-
return launchPromise;
|
|
26
|
-
}
|
|
27
|
-
async function closeBrowsers() {
|
|
28
|
-
try {
|
|
29
|
-
if (chromiumBrowser) {
|
|
30
|
-
await chromiumBrowser.close();
|
|
31
|
-
console.log("Chromium Browser Closed");
|
|
32
|
-
}
|
|
33
|
-
if (firefoxBrowser) {
|
|
34
|
-
await firefoxBrowser.close();
|
|
35
|
-
console.log("Firefox Browser Closed");
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
console.error("Error closing browsers in @iqx-limited/quick-form:", err);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
process.on("exit", async () => {
|
|
43
|
-
await closeBrowsers();
|
|
44
|
-
});
|
|
45
|
-
process.on("SIGINT", async () => {
|
|
46
|
-
console.log("SIGINT received. Closing browsers...");
|
|
47
|
-
await closeBrowsers();
|
|
48
|
-
process.exit();
|
|
49
|
-
});
|
|
50
|
-
process.on("SIGTERM", async () => {
|
|
51
|
-
console.log("SIGTERM received. Closing browsers...");
|
|
52
|
-
await closeBrowsers();
|
|
53
|
-
process.exit();
|
|
54
|
-
});
|
|
55
|
-
export { launchBrowsers, chromiumBrowser, firefoxBrowser };
|
|
56
|
-
//# sourceMappingURL=browsers.js.map
|
package/dist/browsers.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browsers.js","sourceRoot":"","sources":["../src/browsers.ts"],"names":[],"mappings":"AAAA,OAAO,SAAsB,MAAM,WAAW,CAAA;AAE9C,IAAI,eAAe,GAAmB,IAAI,CAAA;AAC1C,IAAI,cAAc,GAAmB,IAAI,CAAA;AAEzC,IAAI,aAAa,GAAyB,IAAI,CAAA;AAG9C,KAAK,UAAU,cAAc;IAC3B,IAAK,aAAa,EAAG,CAAC;QACpB,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,aAAa,GAAG,CAAE,KAAK,IAAK,EAAE;QAC5B,IAAI,CAAC;YAEH,eAAe,GAAG,MAAM,SAAS,CAAC,MAAM,CAAG;gBACzC,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,CAAE,cAAc,EAAE,0BAA0B,CAAE;aACrD,CAAE,CAAA;YAGH,cAAc,GAAG,MAAM,SAAS,CAAC,MAAM,CAAG;gBACxC,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,CAAE,cAAc,EAAE,0BAA0B,CAAE;aACrD,CAAE,CAAA;QACL,CAAC;QAAC,OAAQ,GAAG,EAAG,CAAC;YACf,OAAO,CAAC,KAAK,CAAG,sDAAsD,EAAE,GAAG,CAAE,CAAA;QAC/E,CAAC;IACH,CAAC,CAAE,EAAI,CAAA;IAEP,OAAO,aAAa,CAAA;AACtB,CAAC;AAGD,KAAK,UAAU,aAAa;IAC1B,IAAI,CAAC;QACH,IAAK,eAAe,EAAG,CAAC;YACtB,MAAM,eAAe,CAAC,KAAK,EAAI,CAAA;YAC/B,OAAO,CAAC,GAAG,CAAG,yBAAyB,CAAE,CAAA;QAC3C,CAAC;QACD,IAAK,cAAc,EAAG,CAAC;YACrB,MAAM,cAAc,CAAC,KAAK,EAAI,CAAA;YAC9B,OAAO,CAAC,GAAG,CAAG,wBAAwB,CAAE,CAAA;QAC1C,CAAC;IACH,CAAC;IAAC,OAAQ,GAAG,EAAG,CAAC;QACf,OAAO,CAAC,KAAK,CAAG,oDAAoD,EAAE,GAAG,CAAE,CAAA;IAC7E,CAAC;AACH,CAAC;AAGD,OAAO,CAAC,EAAE,CAAG,MAAM,EAAE,KAAK,IAAK,EAAE;IAC/B,MAAM,aAAa,EAAI,CAAA;AACzB,CAAC,CAAE,CAAA;AAGH,OAAO,CAAC,EAAE,CAAG,QAAQ,EAAE,KAAK,IAAK,EAAE;IACjC,OAAO,CAAC,GAAG,CAAG,sCAAsC,CAAE,CAAA;IACtD,MAAM,aAAa,EAAI,CAAA;IACvB,OAAO,CAAC,IAAI,EAAI,CAAA;AAClB,CAAC,CAAE,CAAA;AAEH,OAAO,CAAC,EAAE,CAAG,SAAS,EAAE,KAAK,IAAK,EAAE;IAClC,OAAO,CAAC,GAAG,CAAG,uCAAuC,CAAE,CAAA;IACvD,MAAM,aAAa,EAAI,CAAA;IACvB,OAAO,CAAC,IAAI,EAAI,CAAA;AAClB,CAAC,CAAE,CAAA;AAGH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC"}
|
package/dist/index.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { satisfies } from "semver";
|
|
2
|
-
import { launchBrowsers } from "./browsers.js";
|
|
3
|
-
const requiredVersion = ">=22.0.0";
|
|
4
|
-
if (!satisfies(process.version, requiredVersion)) {
|
|
5
|
-
console.error(`\nError: Node.js version ${requiredVersion} is required. You are using ${process.version}.\n`);
|
|
6
|
-
process.exit(1);
|
|
7
|
-
}
|
|
8
|
-
await launchBrowsers();
|
|
9
|
-
export * from "./modules/pdf2img.js";
|
|
10
|
-
export * from "./modules/img2pdf.js";
|
|
11
|
-
export * from "./modules/html2pdf.js";
|
|
12
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,eAAe,GAAG,UAAU,CAAA;AAElC,IAAK,CAAC,SAAS,CAAG,OAAO,CAAC,OAAO,EAAE,eAAe,CAAE,EAAG,CAAC;IACtD,OAAO,CAAC,KAAK,CACX,4BAA4B,eAAe,+BAA+B,OAAO,CAAC,OAAO,KAAK,CAC/F,CAAA;IACD,OAAO,CAAC,IAAI,CAAG,CAAC,CAAE,CAAA;AACpB,CAAC;AAED,MAAM,cAAc,EAAI,CAAA;AAExB,cAAc,sBAAsB,CAAA;AAEpC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,uBAAuB,CAAA"}
|