diff --git a/.vscodeignore b/.vscodeignore index 8839ade..0d23969 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -21,6 +21,8 @@ demo/** .prettierignore .prettierrc .yarnrc +.github/** +.vscode-test/** CODE_OF_CONDUCT.md CONTRIBUTING.md generateEmojiShortcodeMap.js @@ -30,3 +32,9 @@ tsconfig.webviews.json tsconfig.tsbuildinfo webpack.config.js yarn.lock +node_modules/pdfjs-dist/legacy/** +node_modules/pdfjs-dist/types/** +node_modules/pdfjs-dist/web/** +src/test/** +demo/** +docs/** \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f2d5c8..a548f4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## [0.6.0] - 2025-12-24 + +### Major Changes + +- **Internal Rendering**: Removed dependency on external tools (`Ghostscript`, `Poppler`, `pdfcairo`). The extension now renders PostScript files internally using WebAssembly (`postscript-wasm`) and `pdf.js`. +- **Zero Config**: Removed all path configuration settings. The extension works out of the box without any setup. + ## [0.5.4] - 2025-12-23 - Fixed an issue where previewing files with special characters in the filename (e.g., spaces, parentheses) would fail with a syntax error. diff --git a/README.md b/README.md index a4e6b91..61eccff 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,6 @@

PostScript Preview Logo

-

-
- Read Requirements After Install -

PostScript Preview for VS Code

@@ -41,69 +37,14 @@ This extension requires: - **[PostScript Language](https://marketplace.visualstudio.com/items?itemName=mxschmitt.postscript)** extension for syntax highlighting -- **GhostScript** (provides `ps2pdf`) -- **Poppler** (provides `pdftocairo` and `pdfinfo`) - -### macOS - -```bash -brew install ghostscript poppler -``` - -### Ubuntu / Debian - -```bash -sudo apt-get install ghostscript poppler-utils -y -``` - -### Windows - -Install via [Chocolatey](https://chocolatey.org/install) (run as Administrator): - -```powershell -choco install ghostscript --version 9.55.0 --force -y -choco install poppler --version 0.89.0 -y --force -``` - -Add to PATH: - -```powershell -[Environment]::SetEnvironmentVariable("Path",[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\Program Files\gs\gs9.55.0\lib;C:\Program Files\gs\gs9.55.0\bin;C:\ProgramData\chocolatey\lib\poppler\tools",[EnvironmentVariableTarget]::Machine) -``` -**Restart VS Code** after installation. - -
-Manual PATH setup - -If you have issues setting PATH, add these manually via System Properties → Environment Variables: - -``` -C:\Program Files\gs\gs9.55.0\lib -C:\Program Files\gs\gs9.55.0\bin -C:\ProgramData\chocolatey\lib\poppler\tools -``` - -
+**Note:** Pre-0.6.0 versions required external installations of Ghostscript and Poppler. As of v0.6.0, these are **no longer required**! The extension now handles rendering internally using WebAssembly. ## Configuration -Configure custom executable paths in VS Code settings (useful for conda environments or non-standard installations): +The extension is zero-config! -| Setting | Description | Default | -| ------------------------------------ | ----------------------------- | ------------ | -| `postscript-preview.path.ps2pdf` | Path to ps2pdf executable | `ps2pdf` | -| `postscript-preview.path.pdftocairo` | Path to pdftocairo executable | `pdftocairo` | -| `postscript-preview.path.pdfinfo` | Path to pdfinfo executable | `pdfinfo` | - -Example `settings.json`: - -```json -{ - "postscript-preview.path.ps2pdf": "/opt/ghostscript/bin/ps2pdf", - "postscript-preview.path.pdftocairo": "/opt/poppler/bin/pdftocairo" -} -``` +Previous configuration settings (`postscript-preview.path.*`) have been deprecated and removed as they are no longer needed. ## Multi-Page Documents diff --git a/package.json b/package.json index 89eac22..c797323 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "postscript-preview", "displayName": "PostScript Preview", "description": "PostScript Preview is an extension that helps to preview EPS and PS files in Visual Studio Code.", - "version": "0.5.4", + "version": "0.6.0", "icon": "images/logo.png", "publisher": "ahnafnafee", "engines": { @@ -45,26 +45,6 @@ "group": "navigation" } ] - }, - "configuration": { - "title": "PostScript Preview", - "properties": { - "postscript-preview.path.ps2pdf": { - "type": "string", - "default": "ps2pdf", - "description": "Path to ps2pdf executable (from GhostScript). Use this if ps2pdf is not in your system PATH." - }, - "postscript-preview.path.pdftocairo": { - "type": "string", - "default": "pdftocairo", - "description": "Path to pdftocairo executable (from Poppler). Use this if pdftocairo is not in your system PATH." - }, - "postscript-preview.path.pdfinfo": { - "type": "string", - "default": "pdfinfo", - "description": "Path to pdfinfo executable (from Poppler). Used for detecting page count in multi-page documents." - } - } } }, "scripts": { @@ -88,8 +68,10 @@ "typescript": "^5.9.3" }, "dependencies": { + "@jspawn/ghostscript-wasm": "^0.0.2", "@types/temp": "^0.9.4", "glob": "^7.2.3", + "pdfjs-dist": "^5.4.449", "temp": "^0.9.1" }, "repository": { diff --git a/src/config.ts b/src/config.ts index e06dd17..661c8c1 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,17 +1,13 @@ /** - * Configuration management for PostScript Preview extension + * Configurations for PostScript Preview */ import * as vscode from "vscode"; -import { ExtensionConfig } from "./types"; -/** - * Get configuration values for executable paths - */ -export function getConfig(): ExtensionConfig { - const config = vscode.workspace.getConfiguration("postscript-preview"); - return { - ps2pdf: config.get("path.ps2pdf", "ps2pdf"), - pdftocairo: config.get("path.pdftocairo", "pdftocairo"), - pdfinfo: config.get("path.pdfinfo", "pdfinfo"), - }; +export interface Config { + // No path configurations needed for internal rendering +} + +export function getConfig(): Config { + // Return empty config or any future settings + return {}; } diff --git a/src/extension.ts b/src/extension.ts index b98b986..221205e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -7,7 +7,6 @@ import * as vscode from "vscode"; import path = require("path"); import { PreviewState } from "./types"; import { generatePreview } from "./preview"; -import { showWhatsNew } from "./whats-new"; /** * Called when the extension is activated @@ -18,7 +17,6 @@ export function activate(context: vscode.ExtensionContext): void { if (isWindows) { console.log("PostScript Preview: Checking for updates (Windows)..."); - showWhatsNew(context); } const channel = vscode.window.createOutputChannel("PostScript-Preview"); @@ -49,64 +47,10 @@ export function activate(context: vscode.ExtensionContext): void { const mainFilePath = document.fileName; + // Generate preview without awaiting (fire and forget) generatePreview(mainFilePath, panel, channel); channel.appendLine(`Watching ${filePath}`); - // Handle messages from webview for page navigation - panel.webview.onDidReceiveMessage( - (message) => { - const state = (panel as any).__previewState as - | PreviewState - | undefined; - if (!state) { - return; - } - - switch (message.command) { - case "prevPage": - if (state.currentPage > 1) { - state.currentPage--; - generatePreview( - state.filepath, - panel, - channel, - state.currentPage, - state.pdfPath - ); - } - break; - case "nextPage": - if (state.currentPage < state.totalPages) { - state.currentPage++; - generatePreview( - state.filepath, - panel, - channel, - state.currentPage, - state.pdfPath - ); - } - break; - case "goToPage": { - const page = parseInt(message.page, 10); - if (page >= 1 && page <= state.totalPages) { - state.currentPage = page; - generatePreview( - state.filepath, - panel, - channel, - state.currentPage, - state.pdfPath - ); - } - break; - } - } - }, - undefined, - context.subscriptions - ); - // Watch for file changes const watcher = vscode.workspace.createFileSystemWatcher(filePath); watcher.onDidChange((_: vscode.Uri) => { diff --git a/src/preview.ts b/src/preview.ts index cd663db..7ea268b 100644 --- a/src/preview.ts +++ b/src/preview.ts @@ -1,165 +1,84 @@ /** * Preview generation for PostScript files */ -// biome-ignore lint/style/useNodejsImportProtocol: -import { execSync, spawnSync } from "child_process"; import * as vscode from "vscode"; -import temp = require("temp"); -// biome-ignore lint/style/useNodejsImportProtocol: -import fs = require("fs"); -// biome-ignore lint/style/useNodejsImportProtocol: -import path = require("path"); -import { getConfig } from "./config"; -import { PreviewState } from "./types"; +import * as path from "path"; +// @ts-ignore +import ghostscript = require("@jspawn/ghostscript-wasm"); import { getWebviewContent } from "./webview"; +export interface PreviewResult { + data: Uint8Array; + mimeType: string; +} + /** - * Get page count from PDF using pdfinfo + * Generate PDF buffer from PostScript file using Ghostscript WASM */ -export function getPageCount( - pdfPath: string, +export async function generatePdfFromPs( + filepath: string, channel: vscode.OutputChannel -): number { - const config = getConfig(); +): Promise { try { - const result = execSync(`"${config.pdfinfo}" "${pdfPath}"`, { - encoding: "utf-8", - }); - const match = result.match(/Pages:\s+(\d+)/); - if (match) { - return parseInt(match[1], 10); + const fs = require("fs"); + const psContent = fs.readFileSync(filepath); + + // Initialize Ghostscript WASM + const gs = await ghostscript(); + + // Write PS file to virtual filesystem + gs.FS.writeFile("/input.ps", psContent); + + // Execute gs command to convert to PDF + // eq to: gs -sDEVICE=pdfwrite -o output.pdf input.ps + const exitCode = gs.callMain([ + "-sDEVICE=pdfwrite", + "-o", + "/output.pdf", + "/input.ps", + ]); + + if (exitCode !== 0) { + throw new Error(`Ghostscript exited with code ${exitCode}`); } - } catch (err) { - channel.appendLine( - `Warning: Could not get page count using pdfinfo: ${err}` - ); + + // Read the result PDF + const pdfData = gs.FS.readFile("/output.pdf"); + + // Cleanup virtual file system if needed (optional for short lived instances) + // gs.FS.unlink("/input.ps"); + // gs.FS.unlink("/output.pdf"); + + return pdfData; + } catch (err: any) { + channel.appendLine(`Error generating PDF: ${err.message}`); + channel.show(true); + throw err; } - return 1; // Default to 1 page } /** * Generate preview for a PostScript file */ -export function generatePreview( +export async function generatePreview( filepath: string, panel: vscode.WebviewPanel, channel: vscode.OutputChannel, - pageNumber: number = 1, - existingPdfPath?: string -): string | undefined { - const config = getConfig(); - temp.track(); + pageNumber: number = 1 +): Promise { + try { + const pdfData = await generatePdfFromPs(filepath, channel); - // Helper function to generate SVG from existing PDF - const generateSvgFromPdf = (pdfPath: string, totalPages: number) => { - temp.open( - { prefix: "postscript-preview-svg_", suffix: ".svg" }, - (svgErr, svgInfo) => { - if (svgErr) { - console.log( - "Creating temporary file eps-preview-svg failed." - ); - return; - } - try { - execSync( - `"${config.pdftocairo}" -svg -f ${pageNumber} -l ${pageNumber} "${pdfPath}" "${svgInfo.path}"` - ); - } catch (err) { - vscode.window.showInformationMessage( - "Failed to execute pdftocairo. Report bug with postscript file to dev." - ); - console.log("Error executing pdftocairo."); - console.log(err); - temp.cleanupSync(); - return; - } - try { - const stat = fs.fstatSync(svgInfo.fd); - const svgContent = Buffer.alloc(stat.size); - fs.readSync(svgInfo.fd, svgContent, 0, stat.size, null); - // Show SVG in the webview panel - panel.webview.html = getWebviewContent( - path.basename(filepath), - svgContent, - pageNumber, - totalPages - ); - } catch (err) { - console.log("Error reading the final file."); - console.log(err); - } - } - ); - }; + // Convert to base64 to pass to webview + const base64Pdf = Buffer.from(pdfData).toString("base64"); - // If we have an existing PDF (page navigation), use it directly - if (existingPdfPath) { - const totalPages = getPageCount(existingPdfPath, channel); - generateSvgFromPdf(existingPdfPath, totalPages); - return existingPdfPath; + // Update webview + panel.webview.html = getWebviewContent( + path.basename(filepath), + base64Pdf, + pageNumber + ); + } catch (err) { + vscode.window.showErrorMessage("Failed to generate preview."); } - - // Otherwise, generate new PDF from PS/EPS file - let pdfPathResult: string | undefined; - temp.open( - { prefix: "postscript-preview-svg_", suffix: ".pdf" }, - (pdfErr, pdfInfo) => { - if (pdfErr) { - console.log("Creating temporary file eps-preview-pdf failed."); - return; - } - // Transform EPS to PDF using ps2pdf - // Capture stdout/stderr for console output display (Issue #7) - try { - const ps2pdfResult = spawnSync( - config.ps2pdf, - ["-dEPSCrop", filepath, pdfInfo.path], - { encoding: "utf-8", shell: false } - ); - - // Display any console output from GhostScript - if (ps2pdfResult.stdout && ps2pdfResult.stdout.trim()) { - channel.appendLine("--- GhostScript Output ---"); - channel.appendLine(ps2pdfResult.stdout); - channel.show(true); // Show output channel without taking focus - } - if (ps2pdfResult.stderr && ps2pdfResult.stderr.trim()) { - channel.appendLine("--- GhostScript Errors/Warnings ---"); - channel.appendLine(ps2pdfResult.stderr); - channel.show(true); - } - - if (ps2pdfResult.status !== 0) { - throw new Error( - `ps2pdf exited with code ${ps2pdfResult.status}` - ); - } - } catch (err) { - vscode.window.showInformationMessage( - "Failed to execute ps2pdf. Report bug with postscript file to dev." - ); - console.log("Error executing ps2pdf."); - console.log(err); - temp.cleanupSync(); - return; - } - - // Get page count for multi-page navigation - const totalPages = getPageCount(pdfInfo.path, channel); - pdfPathResult = pdfInfo.path; - - // Store state in webview for page navigation - (panel as any).__previewState = { - currentPage: pageNumber, - totalPages: totalPages, - pdfPath: pdfInfo.path, - filepath: filepath, - } as PreviewState; - - generateSvgFromPdf(pdfInfo.path, totalPages); - } - ); - - return pdfPathResult; } diff --git a/src/test/suite/config.test.ts b/src/test/suite/config.test.ts deleted file mode 100644 index 61a398e..0000000 --- a/src/test/suite/config.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as assert from "assert"; -import * as vscode from "vscode"; -import { getConfig } from "../../config"; - -suite("Configuration Test Suite", () => { - vscode.window.showInformationMessage("Start config tests."); - - test("Default configuration values", () => { - const config = getConfig(); - assert.strictEqual(config.ps2pdf, "ps2pdf"); - assert.strictEqual(config.pdftocairo, "pdftocairo"); - assert.strictEqual(config.pdfinfo, "pdfinfo"); - }); - test("Configuration should be readable", () => { - const config = vscode.workspace.getConfiguration("postscript-preview"); - assert.ok(config.has("path.ps2pdf")); - assert.ok(config.has("path.pdftocairo")); - }); -}); diff --git a/src/webview.ts b/src/webview.ts index 934a9aa..ae2dbf4 100644 --- a/src/webview.ts +++ b/src/webview.ts @@ -1,222 +1,319 @@ /** - * Webview content generation for PostScript Preview - * Uses VS Code theme variables for automatic light/dark mode support + * Generates HTML content for the webview */ +import * as vscode from "vscode"; -/** - * Generate complete webview HTML content - * Uses CSS variables from VS Code for theme support - */ -// biome-ignore lint/suspicious/noExplicitAny: SVG content can be string or Buffer export function getWebviewContent( - fileName: string, - svgContent: any, - currentPage: number = 1, - totalPages: number = 1 + filename: string, + pdfData: string, // Base64 encoded PDF + pageNumber: number = 1 ): string { - const showNav = totalPages > 1; - return ` - - - PostScript Preview - - - - + + + + PostScript Preview + + + + + + -
- ${fileName} -
- -
+
+ ${filename} +
+ + + + + + +
+
-
- -
-
-
- - - -
-
${svgContent}
+ +
+
-
- - + + `; } diff --git a/src/whats-new.ts b/src/whats-new.ts deleted file mode 100644 index a9e52db..0000000 --- a/src/whats-new.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Version update notifications for PostScript Preview - */ -import { ExtensionContext, Uri, env, extensions, window } from "vscode"; - -const extensionId = "ahnafnafee.postscript-preview"; - -/** - * Check if this is a major or minor update - * https://stackoverflow.com/a/66303259/3073272 - */ -function isMajorUpdate( - previousVersion: string, - currentVersion: string -): boolean { - // rain-check for malformed string - if (previousVersion.indexOf(".") === -1) { - return true; - } - //returns int array [1,1,1] i.e. [major,minor,patch] - const previousVerArr = previousVersion.split(".").map(Number); - const currentVerArr = currentVersion.split(".").map(Number); - - // For pdftocairo bug fix - if ( - currentVerArr[1] > previousVerArr[1] || - currentVerArr[2] > previousVerArr[2] - ) { - return true; - } - return false; -} - -/** - * Show "What's New" notification on version update - */ -export function showWhatsNew(context: ExtensionContext): void { - const previousVersion = context.globalState.get(extensionId); - const extension = extensions.getExtension(extensionId); - const currentVersion = extension?.packageJSON?.version; - - if (!currentVersion) { - return; - } - - // store latest version - context.globalState.update(extensionId, currentVersion); - - if ( - previousVersion === undefined || - isMajorUpdate(previousVersion, currentVersion) - ) { - // show whats new notification: - const actions = [{ title: "See Requirements" }]; - - window - .showInformationMessage( - `PostScript Preview v${currentVersion} — READ NEW REQUIREMENTS!`, - ...actions - ) - .then((result) => { - if (result !== null && result === actions[0]) { - env.openExternal( - Uri.parse( - "https://github.com/ahnafnafee/PostScript-Preview#windows" - ) - ); - } - }); - } -} diff --git a/yarn.lock b/yarn.lock index b2cc463..0ff2efa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -105,6 +105,83 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@jspawn/ghostscript-wasm@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@jspawn/ghostscript-wasm/-/ghostscript-wasm-0.0.2.tgz#7088e66ab2b6507cbaf9b7e23b0ca0144e7f8447" + integrity sha512-IhGvfXNezc+V3jyJlmjz7oxrjWPqFPcz1gqRdo0Y7EkVyFuL1A+tCRnQXx/BHQZPRvBDA+Uf0EqkvXzfMzoDcw== + +"@napi-rs/canvas-android-arm64@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.86.tgz#bd9adcd94d100789e14ff9e51251cb4e82b070f3" + integrity sha512-IjkZFKUr6GzMzzrawJaN3v+yY3Fvpa71e0DcbePfxWelFKnESIir+XUcdAbim29JOd0JE0/hQJdfUCb5t/Fjrw== + +"@napi-rs/canvas-darwin-arm64@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.86.tgz#a9ff670bb9ef34e5b02127141cee264339e8cb35" + integrity sha512-PUCxDq0wSSJbtaOqoKj3+t5tyDbtxWumziOTykdn3T839hu6koMaBFpGk9lXpsGaPNgyFpPqjxhtsPljBGnDHg== + +"@napi-rs/canvas-darwin-x64@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.86.tgz#9a2f4b9a3ea1fe7b65305769b2903496d1f04e85" + integrity sha512-rlCFLv4Rrg45qFZq7mysrKnsUbMhwdNg3YPuVfo9u4RkOqm7ooAJvdyDFxiqfSsJJTqupYqa9VQCUt8WKxKhNQ== + +"@napi-rs/canvas-linux-arm-gnueabihf@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.86.tgz#585eb21291be1fa0bb8bcf201e9369a4188ab465" + integrity sha512-6xWwyMc9BlDBt+9XHN/GzUo3MozHta/2fxQHMb80x0K2zpZuAdDKUYHmYzx9dFWDY3SbPYnx6iRlQl6wxnwS1w== + +"@napi-rs/canvas-linux-arm64-gnu@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.86.tgz#458d1c9f832f06fc6805cc0e2196db847a1e12cb" + integrity sha512-r2OX3w50xHxrToTovOSQWwkVfSq752CUzH9dzlVXyr8UDKFV8dMjfa9hePXvAJhN3NBp4TkHcGx15QCdaCIwnA== + +"@napi-rs/canvas-linux-arm64-musl@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.86.tgz#63ea88df27f2774ee983820879dd0280b02c5cb4" + integrity sha512-jbXuh8zVFUPw6a9SGpgc6EC+fRbGGyP1NFfeQiVqGLs6bN93ROtPLPL6MH9Bp6yt0CXUFallk2vgKdWDbmW+bw== + +"@napi-rs/canvas-linux-riscv64-gnu@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.86.tgz#00b8c9a789186f1bc9d8c1bc22de3c20fc4c39ba" + integrity sha512-9IwHR2qbq2HceM9fgwyL7x37Jy3ptt1uxvikQEuWR0FisIx9QEdt7F3huljCky76aoouF2vSd0R2fHo3ESRoPw== + +"@napi-rs/canvas-linux-x64-gnu@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.86.tgz#0180fa891ec7db24667c3decec879737742b99b0" + integrity sha512-Jor+rhRN6ubix+D2QkNn9XlPPVAYl+2qFrkZ4oZN9UgtqIUZ+n+HljxhlkkDFRaX1mlxXOXPQjxaZg17zDSFcQ== + +"@napi-rs/canvas-linux-x64-musl@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.86.tgz#34bc2e21ee0cb1d8a149519068acef281707286f" + integrity sha512-A28VTy91DbclopSGZ2tIon3p8hcVI1JhnNpDpJ5N9rYlUnVz1WQo4waEMh+FICTZF07O3coxBNZc4Vu4doFw7A== + +"@napi-rs/canvas-win32-arm64-msvc@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.86.tgz#77b5361b0f7ddb7c65792f2b87a5f952ef44245e" + integrity sha512-q6G1YXUt3gBCAS2bcDMCaBL4y20di8eVVBi1XhjUqZSVyZZxxwIuRQHy31NlPJUCMiyNiMuc6zeI0uqgkWwAmA== + +"@napi-rs/canvas-win32-x64-msvc@0.1.86": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.86.tgz#d0b633605700e438e8448d1b476efa8356156f6d" + integrity sha512-X0g46uRVgnvCM1cOjRXAOSFSG63ktUFIf/TIfbKCUc7QpmYUcHmSP9iR6DGOYfk+SggLsXoJCIhPTotYeZEAmg== + +"@napi-rs/canvas@^0.1.81": + version "0.1.86" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.86.tgz#7a184036c5d2f27bb692fae01b7c1b95ff8c80e0" + integrity sha512-hOkywnrkdFdVpsuaNsZWfEY7kc96eROV2DuMTTvGF15AZfwobzdG2w0eDlU5UBx3Lg/XlWUnqVT5zLUWyo5h6A== + optionalDependencies: + "@napi-rs/canvas-android-arm64" "0.1.86" + "@napi-rs/canvas-darwin-arm64" "0.1.86" + "@napi-rs/canvas-darwin-x64" "0.1.86" + "@napi-rs/canvas-linux-arm-gnueabihf" "0.1.86" + "@napi-rs/canvas-linux-arm64-gnu" "0.1.86" + "@napi-rs/canvas-linux-arm64-musl" "0.1.86" + "@napi-rs/canvas-linux-riscv64-gnu" "0.1.86" + "@napi-rs/canvas-linux-x64-gnu" "0.1.86" + "@napi-rs/canvas-linux-x64-musl" "0.1.86" + "@napi-rs/canvas-win32-arm64-msvc" "0.1.86" + "@napi-rs/canvas-win32-x64-msvc" "0.1.86" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -1058,6 +1135,13 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +pdfjs-dist@^5.4.449: + version "5.4.449" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-5.4.449.tgz#acc2b4fafd595981280d0314e151445eb9f9c00b" + integrity sha512-CegnUaT0QwAyQMS+7o2POr4wWUNNe8VaKKlcuoRHeYo98cVnqPpwOXNSx6Trl6szH02JrRcsPgletV6GmF3LtQ== + optionalDependencies: + "@napi-rs/canvas" "^0.1.81" + picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"