diff --git a/package.json b/package.json index 8fbd136..097846b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "build:electron:mac": "pnpm build && electron-builder --mac dmg --arm64 --x64 && electron-builder --mac pkg --arm64 && electron-builder --mac pkg --x64", "build:linux": "pnpm run cleanBuild && pnpm run build:server && pnpm run build:linux-bundle && pnpm run build:linux-pkg && pnpm run build:linux-packages", "build:linux-bundle": "node scripts/build-linux-bundle.mjs", - "build:linux-pkg": "shx mkdir -p app_dist/linux && pnpm exec pkg build/pkg-entry.cjs --config package.json --targets node18-linux-x64 --public-packages \"pdf-to-img,pdfjs-dist,sharp,canvas,@img/*,@napi-rs/*\" --output app_dist/linux/farmcontrol-server", + "build:linux-pkg": "shx mkdir -p app_dist/linux && pnpm exec pkg build/pkg-entry.cjs --config package.json --targets node18-linux-x64 --no-bytecode --public-packages \"pdf-to-img,pdfjs-dist,sharp,canvas,@img/*,@napi-rs/*\" --output app_dist/linux/farmcontrol-server", "build:linux-packages": "bash scripts/build-linux-packages.sh", "cleanBuild": "rimraf build" }, diff --git a/src/pdfUtils.js b/src/pdfUtils.js index 56cbf6e..343feb3 100644 --- a/src/pdfUtils.js +++ b/src/pdfUtils.js @@ -7,17 +7,36 @@ import { pathToFileURL } from 'node:url' const require = createRequire(import.meta.url) -// Bare dynamic import() fails in pkg snapshots with "Invalid host defined options". +// Dynamic import() from pkg snapshot bytecode throws "Invalid host defined options" +// (nodejs/node#43663). Use require() for CJS packages in pkg; ESM packages need +// --no-bytecode on the pkg build so file-URL import() works. async function importPackage(name) { const packagePath = require.resolve(name) + + if (typeof process.pkg !== 'undefined') { + try { + return require(packagePath) + } catch (error) { + if (error?.code !== 'ERR_REQUIRE_ESM') { + throw error + } + } + } + return import(pathToFileURL(packagePath).href) } +function resolveDefault(module) { + return module?.default ?? module +} + export async function convertPDFToImage(pdfInput, options = {}) { - const [{ pdf }, sharp] = await Promise.all([ + const [pdfToImgModule, sharpModule] = await Promise.all([ importPackage('pdf-to-img'), importPackage('sharp') ]) + const { pdf } = pdfToImgModule + const sharp = resolveDefault(sharpModule) try { const { width, height, page_numbers, scale = 2, ...pdfOnlyOptions } = @@ -43,7 +62,7 @@ export async function convertPDFToImage(pdfInput, options = {}) { const resizeOptions = {} if (width) resizeOptions.width = width if (height) resizeOptions.height = height - image = await sharp.default(image).resize(resizeOptions).toBuffer() + image = await sharp(image).resize(resizeOptions).toBuffer() } outputImages.push(image) @@ -56,7 +75,7 @@ export async function convertPDFToImage(pdfInput, options = {}) { const resizeOptions = {} if (width) resizeOptions.width = width if (height) resizeOptions.height = height - processedImage = await sharp.default(image) + processedImage = await sharp(image) .resize(resizeOptions) .toBuffer() }