diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 000000000..c49ad197b --- /dev/null +++ b/.yarnrc @@ -0,0 +1,5 @@ +# pdfjs-dist 4.x and fast-xml-parser 5.x declare newer Node engines than the +# Node 14 toolchain CI still runs on. Neither runs under Node here (pdf.js is +# served to the discovery browser), so the engine field is a toolchain gate +# only. Remove this once CI moves to Node 20. +--ignore-engines true diff --git a/packages/cli-pdf/package.json b/packages/cli-pdf/package.json index cfe69b8e9..2c2ab003a 100644 --- a/packages/cli-pdf/package.json +++ b/packages/cli-pdf/package.json @@ -29,6 +29,6 @@ }, "dependencies": { "@percy/logger": "1.32.12-beta.2", - "pdfjs-dist": "^2.16.105" + "pdfjs-dist": "^4.10.38" } } diff --git a/packages/cli-pdf/src/assets.js b/packages/cli-pdf/src/assets.js index 32e8f37e2..4b0ca99e3 100644 --- a/packages/cli-pdf/src/assets.js +++ b/packages/cli-pdf/src/assets.js @@ -6,12 +6,15 @@ const cjsRequire = createRequire(import.meta.url); export function pdfjsAssets() { let root = path.dirname(cjsRequire.resolve('pdfjs-dist/package.json')); + // pdf.js 4+ is published only as ES modules. The page imports `libFile` from + // the loopback asset server that serves `buildDir` (see loadLibrary), and + // pdf.js then spawns `workerFile` as a module worker from the same directory. return { root, buildDir: path.join(root, 'legacy/build'), standardFontsDir: path.join(root, 'standard_fonts'), cmapsDir: path.join(root, 'cmaps'), - libPath: path.join(root, 'legacy/build/pdf.js'), - workerFile: 'pdf.worker.js' + libFile: 'pdf.mjs', + workerFile: 'pdf.worker.mjs' }; } diff --git a/packages/cli-pdf/src/browser-scripts.js b/packages/cli-pdf/src/browser-scripts.js index 813c33a33..f1f25b257 100644 --- a/packages/cli-pdf/src/browser-scripts.js +++ b/packages/cli-pdf/src/browser-scripts.js @@ -24,14 +24,26 @@ export function assertRasterDimensions(pageNumber, width, height) { } } -export async function openDocument(_, { origin }) { - let lib = window['pdfjs-dist/build/pdf'] || window.pdfjsLib; +// pdf.js 4+ ships only as ES modules, so it can no longer be injected as a +// classic script body the way the 2.x UMD build was. The page imports it from +// the loopback asset server instead. The legacy build assigns +// `globalThis.pdfjsLib` itself, so a repeat call finds it and does nothing. +export async function loadLibrary(_, { origin, libFile }) { + if (!window.pdfjsLib) { + window.pdfjsLib = await import(`${origin}/pdfjs/${libFile}`); + } + + return true; +} + +export async function openDocument(_, { origin, workerFile }) { + let lib = window.pdfjsLib; if (!lib) { throw new Error('pdf.js did not initialise in the page'); } - lib.GlobalWorkerOptions.workerSrc = `${origin}/pdfjs/pdf.worker.js`; + lib.GlobalWorkerOptions.workerSrc = `${origin}/pdfjs/${workerFile}`; let doc = await lib.getDocument({ url: `${origin}/doc.pdf`, diff --git a/packages/cli-pdf/src/index.js b/packages/cli-pdf/src/index.js index 9a9927d15..47bcedaaf 100644 --- a/packages/cli-pdf/src/index.js +++ b/packages/cli-pdf/src/index.js @@ -1,6 +1,7 @@ export { pdfjsAssets } from './assets.js'; export { resolvePages, MAX_PAGES } from './pages.js'; export { + loadLibrary, openDocument, measurePages, renderPage, diff --git a/packages/cli-pdf/test/assets.test.js b/packages/cli-pdf/test/assets.test.js index 3ccd410e2..d14484f74 100644 --- a/packages/cli-pdf/test/assets.test.js +++ b/packages/cli-pdf/test/assets.test.js @@ -11,7 +11,7 @@ describe('@percy/cli-pdf assets', () => { it('points at the legacy build directory', () => { expect(fs.existsSync(assets.buildDir)).toBe(true); - expect(fs.existsSync(path.join(assets.buildDir, 'pdf.js'))).toBe(true); + expect(fs.existsSync(path.join(assets.buildDir, assets.libFile))).toBe(true); expect(fs.existsSync(path.join(assets.buildDir, assets.workerFile))).toBe(true); }); @@ -22,8 +22,14 @@ describe('@percy/cli-pdf assets', () => { expect(fs.readdirSync(assets.cmapsDir).length).toBeGreaterThan(0); }); - it('exposes the injectable pdf.js library file', () => { - expect(fs.existsSync(assets.libPath)).toBe(true); - expect(fs.readFileSync(assets.libPath, 'utf-8')).toContain('getDocument'); + it('names the ES module entry and worker the page loads', () => { + // pdf.js 4+ only ships ES modules; the page imports the library and pdf.js + // spawns the worker as a module worker, so both must be .mjs files + expect(assets.libFile).toMatch(/\.mjs$/); + expect(assets.workerFile).toMatch(/\.mjs$/); + + let lib = fs.readFileSync(path.join(assets.buildDir, assets.libFile), 'utf-8'); + expect(lib).toContain('getDocument'); + expect(lib).toContain('globalThis.pdfjsLib'); }); }); diff --git a/packages/cli-pdf/test/browser-scripts.test.js b/packages/cli-pdf/test/browser-scripts.test.js index 515724d95..62f64c162 100644 --- a/packages/cli-pdf/test/browser-scripts.test.js +++ b/packages/cli-pdf/test/browser-scripts.test.js @@ -1,7 +1,9 @@ +import url from 'url'; +import path from 'path'; import { fitScale, assertRasterDimensions, MIN_DIMENSION, MAX_DIMENSION, DEFAULT_SCALE, MAX_SCALE, - openDocument, measurePages, renderPage, destroyDocument + loadLibrary, openDocument, measurePages, renderPage, destroyDocument } from '../src/browser-scripts.js'; describe('@percy/cli-pdf browser scripts', () => { @@ -73,7 +75,7 @@ describe('@percy/cli-pdf browser scripts', () => { destroy: async () => { doc.destroyed = true; } }; - global.window = lib === null ? {} : { 'pdfjs-dist/build/pdf': lib || stubLib() }; + global.window = lib === null ? {} : { pdfjsLib: lib || stubLib() }; global.document = { createElement: (tag) => { let canvas = { @@ -110,16 +112,40 @@ describe('@percy/cli-pdf browser scripts', () => { delete global.document; }); + describe('loadLibrary', () => { + it('imports the served module and exposes it as window.pdfjsLib', async () => { + global.window = {}; + // a file: URL stands in for the asset server origin; the script appends + // `/pdfjs/`, which lands on the fixture module + let origin = url.pathToFileURL(path.resolve('test/fixtures')).href; + + await expectAsync(loadLibrary(null, { origin, libFile: 'pdf.mjs' })).toBeResolvedTo(true); + + expect(global.window.pdfjsLib.getDocument()).toBe('served'); + }); + + it('leaves an already initialised pdf.js alone', async () => { + // an unguarded import of this origin would reject in Node + let lib = stubLib(); + global.window = { pdfjsLib: lib }; + + await expectAsync(loadLibrary(null, { origin: 'http://localhost:9999', libFile: 'pdf.mjs' })) + .toBeResolvedTo(true); + + expect(global.window.pdfjsLib).toBe(lib); + }); + }); + describe('openDocument', () => { it('points pdf.js at the served worker, document, fonts and cmaps', async () => { stubPageGlobals({ numPages: 4 }); - let lib = global.window['pdfjs-dist/build/pdf']; + let lib = global.window.pdfjsLib; - await expectAsync(openDocument(null, { origin: 'http://localhost:9999' })) + await expectAsync(openDocument(null, { origin: 'http://localhost:9999', workerFile: 'pdf.worker.mjs' })) .toBeResolvedTo({ pageCount: 4 }); expect(lib.GlobalWorkerOptions.workerSrc) - .toBe('http://localhost:9999/pdfjs/pdf.worker.js'); + .toBe('http://localhost:9999/pdfjs/pdf.worker.mjs'); let [options] = lib.getDocumentCalls; expect(options.url).toBe('http://localhost:9999/doc.pdf'); @@ -137,16 +163,6 @@ describe('@percy/cli-pdf browser scripts', () => { expect(global.window.__percyPdf.doc).toBe(doc); }); - it('falls back to the window.pdfjsLib global', async () => { - stubPageGlobals({ lib: null }); - let lib = stubLib(); - global.window.pdfjsLib = lib; - - await expectAsync(openDocument(null, { origin: 'http://localhost:2' })) - .toBeResolvedTo({ pageCount: 3 }); - expect(lib.getDocumentCalls.length).toBe(1); - }); - it('throws when pdf.js did not initialise', async () => { stubPageGlobals({ lib: null }); diff --git a/packages/cli-pdf/test/fixtures/pdfjs/pdf.mjs b/packages/cli-pdf/test/fixtures/pdfjs/pdf.mjs new file mode 100644 index 000000000..33ccd9784 --- /dev/null +++ b/packages/cli-pdf/test/fixtures/pdfjs/pdf.mjs @@ -0,0 +1,4 @@ +// Stands in for pdf.js's legacy/build/pdf.mjs when the loadLibrary browser +// script is exercised in Node: the asset server origin is a file: URL pointing +// at this directory's parent, so `${origin}/pdfjs/pdf.mjs` resolves here. +export const getDocument = () => 'served'; diff --git a/packages/core/package.json b/packages/core/package.json index e4aeb2618..18cf5bd2e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -57,7 +57,7 @@ "content-disposition": "^0.5.4", "cross-spawn": "^7.0.3", "fast-glob": "^3.2.11", - "fast-xml-parser": "^4.4.1", + "fast-xml-parser": "^5.11.2", "micromatch": "^4.0.8", "mime-types": "^2.1.34", "pako": "^2.1.0", diff --git a/packages/core/src/pdf-rasterize.js b/packages/core/src/pdf-rasterize.js index 8c3f8b932..080f55e62 100644 --- a/packages/core/src/pdf-rasterize.js +++ b/packages/core/src/pdf-rasterize.js @@ -1,4 +1,3 @@ -import fs from 'fs'; import logger from '@percy/logger'; import { Server } from './server.js'; @@ -58,7 +57,7 @@ export async function rasterizePdf(percy, pdfBuffer, options) { let { pdfjsAssets, resolvePages, fitScale, assertRasterDimensions, - openDocument, measurePages, renderPage, destroyDocument, + loadLibrary, openDocument, measurePages, renderPage, destroyDocument, DEFAULT_SCALE, MAX_SCALE, PAGE_RENDER_TIMEOUT } = await import('@percy/cli-pdf'); @@ -80,15 +79,12 @@ export async function rasterizePdf(percy, pdfBuffer, options) { page = await percy.browser.page({ meta: { snapshot: { name: 'pdf' } } }); await page.goto(`${origin}/`); - let pdfjsSource = await fs.promises.readFile(assets.libPath, 'utf-8'); - await withTimeout( - /* eslint-disable-next-line no-new-func */ - page.eval(new Function(pdfjsSource)), - PAGE_RENDER_TIMEOUT, 'injecting pdf.js'); + page.eval(loadLibrary, { origin, libFile: assets.libFile }), + PAGE_RENDER_TIMEOUT, 'loading pdf.js'); let { pageCount } = await withTimeout( - page.eval(openDocument, { origin }), + page.eval(openDocument, { origin, workerFile: assets.workerFile }), PAGE_RENDER_TIMEOUT, 'opening the PDF'); let selected; diff --git a/test/regression/assets/pdfs/expected/darwin-arm64/jack-sparrow-resume-page-1.png b/test/regression/assets/pdfs/expected/darwin-arm64/jack-sparrow-resume-page-1.png index 2b3418262..2acde40f0 100644 Binary files a/test/regression/assets/pdfs/expected/darwin-arm64/jack-sparrow-resume-page-1.png and b/test/regression/assets/pdfs/expected/darwin-arm64/jack-sparrow-resume-page-1.png differ diff --git a/test/regression/assets/pdfs/expected/darwin-arm64/manifest.json b/test/regression/assets/pdfs/expected/darwin-arm64/manifest.json index fe59a1b46..2040af683 100644 --- a/test/regression/assets/pdfs/expected/darwin-arm64/manifest.json +++ b/test/regression/assets/pdfs/expected/darwin-arm64/manifest.json @@ -1,5 +1,5 @@ { - "generated": "2026-09-11T05:57:29.845Z", + "generated": "2026-10-15T11:47:16.205Z", "platform": "darwin-arm64", "browser": "Chrome/143.0.7499.0", "pdfs": { @@ -12,8 +12,8 @@ "page": 1, "width": 1191, "height": 1684, - "bytes": 470788, - "sha256": "4d7a640bc93744620eb8f6bb61b211a0656ffda73ef7693ef2a59e191b1e78d7" + "bytes": 470336, + "sha256": "552e90c8b1581fccaa12ca5137cc478ea73671c1f3254e4256e1292c895bb0ee" } ] }, @@ -26,22 +26,22 @@ "page": 1, "width": 1224, "height": 1584, - "bytes": 482333, - "sha256": "13375a4c2a74fc707e1b3747e964f433b98f25cebacb52bea995942cbbf262fe" + "bytes": 482141, + "sha256": "8be8f1aec14f7c194ba3bc823e256430b5ccb80e43d3b1dea792315562809160" }, { "page": 2, "width": 1224, "height": 1584, - "bytes": 528854, - "sha256": "a21a60255b97e79dc3e408a2d90717e6eb51cc0c4ca9d196ae0b11de0696d751" + "bytes": 528837, + "sha256": "d3385075c955a164b917eae98fc4ccfefb8253f8efc118f48b58dd4ed5f504e5" }, { "page": 3, "width": 1224, "height": 1584, - "bytes": 402184, - "sha256": "b42084cd9dfca9ff61c4c3518808ec0fdb55cf767a998d532d26647c05dba0fc" + "bytes": 402244, + "sha256": "440991358f7f88114e9abdecc351e3d46431ca7318242345c91b25815da528ec" } ] }, @@ -54,8 +54,8 @@ "page": 1, "width": 1224, "height": 1584, - "bytes": 411537, - "sha256": "08783e272c4880f8e63e42500fd65b80c596813024cb315bebc3cb81d5746a38" + "bytes": 411452, + "sha256": "1fb7654c3dbd9dba8c05c80681deb7c716dba846da418118f7b726cee601b7e9" } ] } diff --git a/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-1.png b/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-1.png index 7678eee22..d0a5d74c9 100644 Binary files a/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-1.png and b/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-1.png differ diff --git a/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-2.png b/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-2.png index 3379ce1eb..0b1f77d38 100644 Binary files a/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-2.png and b/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-2.png differ diff --git a/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-3.png b/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-3.png index dc9ac769f..ccc34f53a 100644 Binary files a/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-3.png and b/test/regression/assets/pdfs/expected/darwin-arm64/multipage-sample-pdf-page-3.png differ diff --git a/test/regression/assets/pdfs/expected/darwin-arm64/single-page-sample-page-1.png b/test/regression/assets/pdfs/expected/darwin-arm64/single-page-sample-page-1.png index 0139ee083..00eb2fa03 100644 Binary files a/test/regression/assets/pdfs/expected/darwin-arm64/single-page-sample-page-1.png and b/test/regression/assets/pdfs/expected/darwin-arm64/single-page-sample-page-1.png differ diff --git a/test/regression/assets/pdfs/expected/linux-x64/jack-sparrow-resume-page-1.png b/test/regression/assets/pdfs/expected/linux-x64/jack-sparrow-resume-page-1.png index d0a8d7ac1..7b2383b29 100644 Binary files a/test/regression/assets/pdfs/expected/linux-x64/jack-sparrow-resume-page-1.png and b/test/regression/assets/pdfs/expected/linux-x64/jack-sparrow-resume-page-1.png differ diff --git a/test/regression/assets/pdfs/expected/linux-x64/manifest.json b/test/regression/assets/pdfs/expected/linux-x64/manifest.json index 0cd6d7e70..69f9b61b6 100644 --- a/test/regression/assets/pdfs/expected/linux-x64/manifest.json +++ b/test/regression/assets/pdfs/expected/linux-x64/manifest.json @@ -1,5 +1,5 @@ { - "generated": "2026-09-11T06:18:42.036Z", + "generated": "2026-10-15T11:45:18.818Z", "platform": "linux-x64", "browser": "Chrome/143.0.7499.0", "pdfs": { @@ -12,8 +12,8 @@ "page": 1, "width": 1191, "height": 1684, - "bytes": 461354, - "sha256": "0fb1414f82961173acbcb4acffd5b64da856ebb86ba3c4393aa7c7a63995841a" + "bytes": 461279, + "sha256": "d6307ee3b6aa26c7b0d51bbcc34ac4ec3172d83eed7e0064fe8e7bd375735762" } ] }, @@ -54,8 +54,8 @@ "page": 1, "width": 1224, "height": 1584, - "bytes": 379684, - "sha256": "73de82e2d54dddca2e9219c8fe282ac372d4bd96347be5bd214902ac0109a7fd" + "bytes": 379630, + "sha256": "af6209757505407b8413b02124bcfdcdaf336575d9f2f9f9631be4a1144f80d2" } ] } diff --git a/test/regression/assets/pdfs/expected/linux-x64/single-page-sample-page-1.png b/test/regression/assets/pdfs/expected/linux-x64/single-page-sample-page-1.png index 4c7aa29de..24a3b3669 100644 Binary files a/test/regression/assets/pdfs/expected/linux-x64/single-page-sample-page-1.png and b/test/regression/assets/pdfs/expected/linux-x64/single-page-sample-page-1.png differ diff --git a/yarn.lock b/yarn.lock index c3e645222..33604555a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1934,6 +1934,78 @@ npmlog "^6.0.2" write-file-atomic "^4.0.1" +"@napi-rs/canvas-android-arm64@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.100.tgz#b7c68b91d57702a5fc523fa82de72ea741e6766e" + integrity sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ== + +"@napi-rs/canvas-darwin-arm64@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.100.tgz#d1686fa6ca699b07640efa5f45425db0a4e725e2" + integrity sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A== + +"@napi-rs/canvas-darwin-x64@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.100.tgz#92978fd7eca21f7f1b59bd13ba3ce7c0e7c879a1" + integrity sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw== + +"@napi-rs/canvas-linux-arm-gnueabihf@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.100.tgz#95f9892e1d5a8274871d8ee406374e9ef692bd9f" + integrity sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA== + +"@napi-rs/canvas-linux-arm64-gnu@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.100.tgz#6b2b7c4bb016b8f5308115ac9ae909df4967a94b" + integrity sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw== + +"@napi-rs/canvas-linux-arm64-musl@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.100.tgz#48cf6342543e4f87cf1f8e9b1aaa19ad85bcc178" + integrity sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ== + +"@napi-rs/canvas-linux-riscv64-gnu@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.100.tgz#71b011007b03755c834a961735302c5837b041da" + integrity sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw== + +"@napi-rs/canvas-linux-x64-gnu@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.100.tgz#3f479d3b8b8c4658e5dec1b943ad7d2eefd2811f" + integrity sha512-1eCvkDCazm7FFhsT7DfGOdSaHgZVK3bt/dSBl5EWHOWmnz+I7j8tPseJqqD81NF+MH21jKUK4wQSDjN0mdhnTg== + +"@napi-rs/canvas-linux-x64-musl@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.100.tgz#1beaca22c1fe97709a9c287115cb3c90194ddec6" + integrity sha512-20arT6lnI19S68qNlii73TSEDbECNgzMz2EpldC1V3mZFuRkeujXkcebRk0LRJe9SEUAooYiLokfMViY8IX7yA== + +"@napi-rs/canvas-win32-arm64-msvc@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.100.tgz#8a1728b455dd17965f95c0bfdf6753be8c5851c0" + integrity sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw== + +"@napi-rs/canvas-win32-x64-msvc@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.100.tgz#1e52883f8784ffdbe52dc2d47b05a0886aa6e9cf" + integrity sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA== + +"@napi-rs/canvas@^0.1.65": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.100.tgz#2c89a15c28a62e1372be23fd474762ae1a8b16b7" + integrity sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA== + optionalDependencies: + "@napi-rs/canvas-android-arm64" "0.1.100" + "@napi-rs/canvas-darwin-arm64" "0.1.100" + "@napi-rs/canvas-darwin-x64" "0.1.100" + "@napi-rs/canvas-linux-arm-gnueabihf" "0.1.100" + "@napi-rs/canvas-linux-arm64-gnu" "0.1.100" + "@napi-rs/canvas-linux-arm64-musl" "0.1.100" + "@napi-rs/canvas-linux-riscv64-gnu" "0.1.100" + "@napi-rs/canvas-linux-x64-gnu" "0.1.100" + "@napi-rs/canvas-linux-x64-musl" "0.1.100" + "@napi-rs/canvas-win32-arm64-msvc" "0.1.100" + "@napi-rs/canvas-win32-x64-msvc" "0.1.100" + "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" resolved "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz" @@ -1946,6 +2018,11 @@ dependencies: eslint-scope "5.1.1" +"@nodable/entities@^3.0.1": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@nodable/entities/-/entities-3.1.0.tgz#2ab366e0e607fdef8d65c5d84c58d191812bbd4b" + integrity sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -2713,6 +2790,11 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +anynum@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/anynum/-/anynum-1.0.1.tgz#2aac00e08dfad3726c1d462e60dbc2f831659a44" + integrity sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A== + append-transform@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz" @@ -3854,11 +3936,6 @@ dom-serialize@^2.2.1: extend "^3.0.0" void-elements "^2.0.0" -dommatrix@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dommatrix/-/dommatrix-1.0.3.tgz#e7c18e8d6f3abdd1fef3dd4aa74c4d2e620a0525" - integrity sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww== - dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" @@ -4469,12 +4546,25 @@ fast-uri@^3.0.1: resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz" integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== -fast-xml-parser@^4.4.1: - version "4.5.6" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.6.tgz#4ff57d4aca13a2d11aa42ad460495cf00f32b655" - integrity sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A== +fast-xml-builder@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.3.1.tgz#ef05b353b45597483dfb09d450a062a2baec3a82" + integrity sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug== + dependencies: + path-expression-matcher "^1.6.2" + xml-naming "^0.3.0" + +fast-xml-parser@^5.11.2: + version "5.11.2" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.11.2.tgz#0d4987adf4e7934af11d82a73b2841eca9928a42" + integrity sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog== dependencies: - strnum "^1.0.5" + "@nodable/entities" "^3.0.1" + fast-xml-builder "^1.2.0" + is-unsafe "^2.0.0" + path-expression-matcher "^1.6.2" + strnum "^2.4.2" + xml-naming "^0.3.0" fastq@^1.6.0: version "1.13.0" @@ -5565,6 +5655,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-unsafe@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-unsafe/-/is-unsafe-2.0.2.tgz#bb1ead17f1aa688f6433258b561e98b1a45a1afc" + integrity sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" @@ -7255,6 +7350,11 @@ path-exists@^4.0.0: resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-expression-matcher@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz#567c73c07197e9dcef24e90edcdc571056599168" + integrity sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" @@ -7295,13 +7395,12 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pdfjs-dist@^2.16.105: - version "2.16.105" - resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz#937b9c4a918f03f3979c88209d84c1ce90122c2a" - integrity sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A== - dependencies: - dommatrix "^1.0.3" - web-streams-polyfill "^3.2.1" +pdfjs-dist@^4.10.38: + version "4.10.38" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz#3ee698003790dc266cc8b55c0e662ccb9ae18f53" + integrity sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ== + optionalDependencies: + "@napi-rs/canvas" "^0.1.65" picocolors@^1.0.0: version "1.0.0" @@ -8333,10 +8432,12 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strnum@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.1.2.tgz#57bca4fbaa6f271081715dbc9ed7cee5493e28e4" - integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA== +strnum@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.4.2.tgz#af43ab51a06d04227023fc2e42ca229214ec10f0" + integrity sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw== + dependencies: + anynum "^1.0.1" strong-log-transformer@^2.1.0: version "2.1.0" @@ -8824,11 +8925,6 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-streams-polyfill@^3.2.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" - integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -9000,6 +9096,11 @@ ws@~8.17.1: resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +xml-naming@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/xml-naming/-/xml-naming-0.3.0.tgz#46c1e18bfe2858479982dd2accf34d16e749eda2" + integrity sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ== + xtend@~4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"