diff --git a/package-lock.json b/package-lock.json index b6f8b0d8..3feee175 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,6 @@ "dependencies": { "commander": "~9.4.1", "file-type": "^19.6.0", - "node-poppler": "^7.2.4", "tmp": "^0.2.3", "tslib": "^2.8.1", "undici": "^6.23.0" @@ -38,6 +37,7 @@ }, "optionalDependencies": { "@cantoo/pdf-lib": "^2.3.2", + "node-poppler": "^7.2.4", "pdf.js-extract": "^0.2.1", "sharp": "~0.34.5" } @@ -1881,6 +1881,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -3364,6 +3365,7 @@ "resolved": "https://registry.npmjs.org/node-poppler/-/node-poppler-7.2.4.tgz", "integrity": "sha512-+YvPbEQ2uxsUVBXDIZiUEu0C3wMOo37D+cIqzWu5gZra3p6MHhBFJtZ/2slzj+5QPmWcHd9SAEjXk2ogBSHg9Q==", "license": "MIT", + "optional": true, "dependencies": { "camelcase": "^6.3.0", "semver": "^7.6.3" @@ -3761,6 +3763,7 @@ "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" diff --git a/package.json b/package.json index 7a6e42e0..8710b9bd 100644 --- a/package.json +++ b/package.json @@ -62,13 +62,13 @@ "file-type": "^19.6.0", "tmp": "^0.2.3", "tslib": "^2.8.1", - "undici": "^6.23.0", - "node-poppler": "^7.2.4" + "undici": "^6.23.0" }, "optionalDependencies": { "sharp": "~0.34.5", "@cantoo/pdf-lib": "^2.3.2", - "pdf.js-extract": "^0.2.1" + "pdf.js-extract": "^0.2.1", + "node-poppler": "^7.2.4" }, "keywords": [ "typescript", diff --git a/src/image/extractedImage.ts b/src/image/extractedImage.ts index f2a267c3..583c0640 100644 --- a/src/image/extractedImage.ts +++ b/src/image/extractedImage.ts @@ -1,11 +1,13 @@ import { Buffer } from "node:buffer"; import { MindeeError } from "@/errors/index.js"; import { writeFileSync } from "node:fs"; +import { writeFile } from "fs/promises"; import path from "node:path"; -import { logger } from "@/logger.js"; -import { BufferInput, MIMETYPES } from "@/input/index.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import type * as popplerTypes from "node-poppler"; -import { writeFile } from "fs/promises"; +import { BufferInput, MIMETYPES } from "@/input/index.js"; +import { logger } from "@/logger.js"; import { loadOptionalDependency } from "@/dependency/index.js"; /** @@ -34,7 +36,9 @@ export class ExtractedImage { try { let outputBuffer: Buffer = this.buffer; if (fileExt !== ".pdf") { - const popplerImport = await loadOptionalDependency("node-poppler", "Image Processing"); + const popplerImport = await loadOptionalDependency( + "node-poppler", "Image Processing" + ); const poppler = (popplerImport as any).default || popplerImport; const popplerInstance = new poppler.Poppler(); const options: Record = { diff --git a/src/pdf/pdfCompressor.ts b/src/pdf/pdfCompressor.ts index ba13791f..aa4f3183 100644 --- a/src/pdf/pdfCompressor.ts +++ b/src/pdf/pdfCompressor.ts @@ -1,19 +1,23 @@ import { logger } from "@/logger.js"; import tmp from "tmp"; -import { ExtractedPdfInfo, extractTextFromPdf, hasSourceText } from "./pdfUtils.js"; import * as fs from "node:fs"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import type * as popplerTypes from "node-poppler"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import type * as pdfLibTypes from "@cantoo/pdf-lib"; import { compressImage } from "@/image/index.js"; import { loadOptionalDependency } from "@/dependency/index.js"; +import { ExtractedPdfInfo, extractTextFromPdf, hasSourceText } from "./pdfUtils.js"; let pdfLib: typeof pdfLibTypes | null = null; async function getPdfLib(): Promise { if (!pdfLib) { - const pdfLibImport = await loadOptionalDependency("@cantoo/pdf-lib", "Text Embedding"); + const pdfLibImport = await loadOptionalDependency( + "@cantoo/pdf-lib", "Text Embedding" + ); pdfLib = (pdfLibImport as any).default || pdfLibImport; } return pdfLib!; @@ -43,8 +47,9 @@ export async function compressPdf( "is set to false. Resulting file will not contain any embedded text."); } } else { - logger.warn("Found text inside of the provided PDF file. Compression operation aborted since disableSourceText " - + "is set to 'true'." + logger.warn( + "Found text inside of the provided PDF file. " + + "Compression operation aborted since disableSourceText is set to 'true'." ); return pdfData; } @@ -74,7 +79,9 @@ export async function compressPdf( * @param forceSourceTextCompression If true, attempts to re-write detected text. * @param disableSourceText If true, doesn't re-apply source text to the output PDF. */ -function handleCompressionWarnings(forceSourceTextCompression: boolean, disableSourceText: boolean): void { +function handleCompressionWarnings( + forceSourceTextCompression: boolean, disableSourceText: boolean +): void { if (forceSourceTextCompression) { if (!disableSourceText) { logger.warn("Re-writing PDF source-text is an EXPERIMENTAL feature."); @@ -170,7 +177,9 @@ async function compressPagesWithQuality( * @returns The total size of compressed pages. */ function calculateTotalCompressedSize(compressedPages: Buffer[]): number { - return compressedPages.reduce((sum, page) => sum + page.length, 0); + return compressedPages.reduce( + (sum, page) => sum + page.length, 0 + ); } /** diff --git a/tests/dependency/missingDependencies.spec.ts b/tests/dependency/missingDependencies.spec.ts index 570bca61..9073daee 100644 --- a/tests/dependency/missingDependencies.spec.ts +++ b/tests/dependency/missingDependencies.spec.ts @@ -3,38 +3,26 @@ import { describe, it } from "node:test"; describe("MindeeV1 - Optional Dependencies #OptionalDepsRemoved", function () { - it("should NOT have sharp installed", async function () { - try { - const moduleName = "sharp"; - await import(moduleName); - assert.fail("sharp should not be installed in this environment, but it was found!"); - } catch (error: any) { - const isModuleNotFound = error.code === "ERR_MODULE_NOT_FOUND"; - const isSharpBinaryMissing = error.message && error.message.includes("Could not load the \"sharp\" module"); + const modules = [ + "sharp", + "pdf.js-extract", + "@cantoo/pdf-lib", + "node-poppler", + ]; - if (!isModuleNotFound && !isSharpBinaryMissing) { - throw error; + for (const moduleName of modules) { + it(`should NOT have ${moduleName} installed`, async function () { + try { + await import(moduleName); + assert.fail("sharp should not be installed in this environment, but it was found!"); + } catch (error: any) { + const binaryMissing = error.message + && error.code === "ERR_MODULE_NOT_FOUND" + && error.message.includes(`Could not load the "${moduleName}" module`); + if (!binaryMissing) { + throw error; + } } - } - }); - - it("should NOT have pdf.js-extract installed", async function () { - try { - const moduleName = "pdf.js-extract"; - await import(moduleName); - assert.fail("pdf.js-extract should not be installed, but it was found!"); - } catch (error: any) { - assert.strictEqual(error.code, "ERR_MODULE_NOT_FOUND"); - } - }); - - it("should NOT have @cantoo/pdf-lib installed", async function () { - try { - const moduleName = "@cantoo/pdf-lib"; - await import(moduleName); - assert.fail("@cantoo/pdf-lib should not be installed, but it was found!"); - } catch (error: any) { - assert.strictEqual(error.code, "ERR_MODULE_NOT_FOUND"); - } - }); + }); + } });