{"_id":"@acajoo/giovanni-core","_rev":"6-bc86c06ee40c86683584c0b388e5d1cb","name":"@acajoo/giovanni-core","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@acajoo/giovanni-core","version":"0.1.0","keywords":["compression","pdf","pdf-processing","qpdf","wasm","webassembly"],"author":{"name":"qpdf contributors"},"license":"(Apache-2.0 AND AGPL-3.0-or-later)","_id":"@acajoo/giovanni-core@0.1.0","maintainers":[{"name":"edou","email":"contact@edwbr.dev"},{"name":"matteogauthier","email":"matteo.gauthier@gmail.com"}],"homepage":"https://github.com/acajoohq/giovanni#readme","bugs":{"url":"https://github.com/acajoohq/giovanni/issues"},"dist":{"shasum":"fe054607eb46089c0326d2e92ee9e180cfd6db28","tarball":"https://registry.npmjs.org/@acajoo/giovanni-core/-/giovanni-core-0.1.0.tgz","fileCount":84,"integrity":"sha512-OVGx5tWnikeKtnqGz5fRHM5lUsMPqlB8RAYE5MHsffGDzz+K4ZkTKjXh4ws430o1ePa7Kn4BUqUsVT9T51Nb7w==","signatures":[{"sig":"MEUCIQCszgve+6JiYw94s368IkQGqqmqDQUV3cGH3jJt8pWNgwIgcCDkRnmZ650NEDVoLUmSd83Zg7c9SEKqBTNRyfmrF2U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18581676},"main":"./dist/index.cjs","type":"module","_from":"file:acajoo-giovanni-core-0.1.0.tgz","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./qpdf":{"import":{"types":"./dist/qpdf.d.mts","default":"./dist/qpdf.mjs"},"require":{"types":"./dist/qpdf.d.cts","default":"./dist/qpdf.cjs"}},"./bindings":{"import":{"types":"./dist/bindings/index.d.mts","default":"./dist/bindings/index.mjs"},"require":{"types":"./dist/bindings/index.d.cts","default":"./dist/bindings/index.cjs"}},"./ghostscript":{"import":{"types":"./dist/ghostscript.d.mts","default":"./dist/ghostscript.mjs"},"require":{"types":"./dist/ghostscript.d.cts","default":"./dist/ghostscript.cjs"}},"./bindings/jsi":{"import":{"types":"./dist/bindings/jsi/index.d.mts","default":"./dist/bindings/jsi/index.mjs"},"require":{"types":"./dist/bindings/jsi/index.d.cts","default":"./dist/bindings/jsi/index.cjs"}}},"scripts":{"lint":"oxlint src tools tsdown.config.ts vitest.config.ts","test":"vitest run","build":"pnpm run build:wasm && pnpm run build:lib","clean":"tsx tools/dev/clean.ts","format":"oxfmt --write src tools tsdown.config.ts vitest.config.ts","test:jsi":"tsx tools/dev/check-jsi-build.ts","test:lib":"vitest run src/test/lib-build.test.ts","validate":"publint","build:jsi":"tsx tools/vendor/build-native.ts jsi","build:lib":"tsdown","typecheck":"tsgo --noEmit","build:wasm":"pnpm run build:vendor -- all prd","test:watch":"vitest","test:native":"tsx tools/vendor/build-native.ts native","build:native":"tsx tools/vendor/build-native.ts native","build:vendor":"tsx tools/vendor/build.ts","format:check":"oxfmt --check src tools tsdown.config.ts vitest.config.ts","package:check":"pnpm run validate && pnpm run verify:release && pnpm pack --dry-run","test:coverage":"vitest run --coverage","build:qpdf:dev":"pnpm run build:vendor -- qpdf dev","build:qpdf:prd":"pnpm run build:vendor -- qpdf prd","build:wasm:dev":"pnpm run build:vendor -- all dev","verify:release":"tsx tools/dev/verify-release.ts","build:native:all":"tsx tools/vendor/build-native.ts all","build:native:win":"tsx tools/vendor/build-native-windows.ts","smoke:ghostscript":"tsx tools/dev/ghostscript-smoke.ts","build:ghostscript:dev":"pnpm run build:vendor -- ghostscript dev","build:ghostscript:prd":"pnpm run build:vendor -- ghostscript prd"},"_npmUser":{"name":"edou","email":"contact@edwbr.dev"},"_resolved":"C:\\Users\\edwar\\AppData\\Local\\Temp\\53a0aa45675f8f6a5cebc890fd8e97f9\\acajoo-giovanni-core-0.1.0.tgz","_integrity":"sha512-OVGx5tWnikeKtnqGz5fRHM5lUsMPqlB8RAYE5MHsffGDzz+K4ZkTKjXh4ws430o1ePa7Kn4BUqUsVT9T51Nb7w==","repository":{"url":"git+https://github.com/acajoohq/giovanni.git","type":"git","directory":"packages/core"},"_npmVersion":"11.12.1","description":"Modern WebAssembly build of qpdf for PDF compression and manipulation","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","oxfmt":"^0.48.0","oxlint":"^1.63.0","tsdown":"^0.21.10","vitest":"^4.1.5","publint":"^0.3.19","typescript":"^6.0.3","@types/node":"^25.6.0","@vitest/coverage-v8":"^4.1.5","@arethetypeswrong/cli":"^0.18.2","@arethetypeswrong/core":"^0.18.2","@typescript/native-preview":"7.0.0-dev.20260505.1"},"_npmOperationalInternal":{"tmp":"tmp/giovanni-core_0.1.0_1783270115655_0.9849470538807257","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@acajoo/giovanni-core","version":"0.1.1","keywords":["compression","pdf","pdf-processing","qpdf","wasm","webassembly"],"author":{"name":"qpdf contributors"},"license":"(Apache-2.0 AND AGPL-3.0-or-later)","_id":"@acajoo/giovanni-core@0.1.1","maintainers":[{"name":"edou","email":"contact@edwbr.dev"},{"name":"matteogauthier","email":"matteo.gauthier@gmail.com"}],"homepage":"https://github.com/acajoohq/giovanni#readme","bugs":{"url":"https://github.com/acajoohq/giovanni/issues"},"dist":{"shasum":"c16fd08a70bdc42a4a893c6ca510850704b1d0d5","tarball":"https://registry.npmjs.org/@acajoo/giovanni-core/-/giovanni-core-0.1.1.tgz","fileCount":84,"integrity":"sha512-7EQ+BWRBYbq9ZZtPoiL69YsAh50S/hRBE+uSuIf/EJerTtz+t2iIINs2JXTACP26iO7Zjq0moHL5K72hPPdWxQ==","signatures":[{"sig":"MEQCIA0RBzlAtnzisuhxwFLCQVe7z6+hYDZSg9CpV4thFTWSAiBVP2zDaReutiVQdxLFEycUBoQPzWdgmr4iSpSPN+YOtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@acajoo%2fgiovanni-core@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":18576499},"main":"./dist/index.cjs","type":"module","_from":"file:acajoo-giovanni-core-0.1.1.tgz","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./qpdf":{"import":{"types":"./dist/qpdf.d.mts","default":"./dist/qpdf.mjs"},"require":{"types":"./dist/qpdf.d.cts","default":"./dist/qpdf.cjs"}},"./bindings":{"import":{"types":"./dist/bindings/index.d.mts","default":"./dist/bindings/index.mjs"},"require":{"types":"./dist/bindings/index.d.cts","default":"./dist/bindings/index.cjs"}},"./ghostscript":{"import":{"types":"./dist/ghostscript.d.mts","default":"./dist/ghostscript.mjs"},"require":{"types":"./dist/ghostscript.d.cts","default":"./dist/ghostscript.cjs"}},"./bindings/jsi":{"import":{"types":"./dist/bindings/jsi/index.d.mts","default":"./dist/bindings/jsi/index.mjs"},"require":{"types":"./dist/bindings/jsi/index.d.cts","default":"./dist/bindings/jsi/index.cjs"}}},"scripts":{"lint":"oxlint src tools tsdown.config.ts vitest.config.ts","test":"vitest run","build":"pnpm run build:wasm && pnpm run build:lib","clean":"tsx tools/dev/clean.ts","format":"oxfmt --write src tools tsdown.config.ts vitest.config.ts","test:jsi":"tsx tools/dev/check-jsi-build.ts","test:lib":"vitest run src/test/lib-build.test.ts","validate":"publint","build:jsi":"tsx tools/vendor/build-native.ts jsi","build:lib":"tsdown","typecheck":"tsgo --noEmit","build:wasm":"pnpm run build:vendor -- all prd","test:watch":"vitest","test:native":"tsx tools/vendor/build-native.ts native","build:native":"tsx tools/vendor/build-native.ts native","build:vendor":"tsx tools/vendor/build.ts","format:check":"oxfmt --check src tools tsdown.config.ts vitest.config.ts","package:check":"pnpm run validate && pnpm run verify:release && pnpm pack --dry-run","test:coverage":"vitest run --coverage","build:qpdf:dev":"pnpm run build:vendor -- qpdf dev","build:qpdf:prd":"pnpm run build:vendor -- qpdf prd","build:wasm:dev":"pnpm run build:vendor -- all dev","verify:release":"tsx tools/dev/verify-release.ts","build:native:all":"tsx tools/vendor/build-native.ts all","build:native:win":"tsx tools/vendor/build-native-windows.ts","smoke:ghostscript":"tsx tools/dev/ghostscript-smoke.ts","build:ghostscript:dev":"pnpm run build:vendor -- ghostscript dev","build:ghostscript:prd":"pnpm run build:vendor -- ghostscript prd"},"_npmUser":{"name":"edou","email":"contact@edwbr.dev"},"_resolved":"/tmp/1ac1f52bd4370774b145edb006e2209b/acajoo-giovanni-core-0.1.1.tgz","_integrity":"sha512-7EQ+BWRBYbq9ZZtPoiL69YsAh50S/hRBE+uSuIf/EJerTtz+t2iIINs2JXTACP26iO7Zjq0moHL5K72hPPdWxQ==","repository":{"url":"git+https://github.com/acajoohq/giovanni.git","type":"git","directory":"packages/core"},"_npmVersion":"11.16.0","description":"Modern WebAssembly build of qpdf for PDF compression and manipulation","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","oxfmt":"^0.48.0","oxlint":"^1.63.0","tsdown":"^0.21.10","vitest":"^4.1.5","publint":"^0.3.19","typescript":"^6.0.3","@types/node":"^25.6.0","@vitest/coverage-v8":"^4.1.5","@arethetypeswrong/cli":"^0.18.2","@arethetypeswrong/core":"^0.18.2","@typescript/native-preview":"7.0.0-dev.20260505.1"},"_npmOperationalInternal":{"tmp":"tmp/giovanni-core_0.1.1_1785062205698_0.8854777717230038","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@acajoo/giovanni-core","version":"0.2.0","keywords":["compression","pdf","pdf-processing","qpdf","wasm","webassembly"],"author":{"name":"qpdf contributors"},"license":"(Apache-2.0 AND AGPL-3.0-or-later)","_id":"@acajoo/giovanni-core@0.2.0","maintainers":[{"name":"edou","email":"contact@edwbr.dev"},{"name":"matteogauthier","email":"matteo.gauthier@gmail.com"}],"homepage":"https://github.com/acajoohq/giovanni#readme","bugs":{"url":"https://github.com/acajoohq/giovanni/issues"},"dist":{"shasum":"e46a045267f0a4764784740b6e46e3e613427311","tarball":"https://registry.npmjs.org/@acajoo/giovanni-core/-/giovanni-core-0.2.0.tgz","fileCount":84,"integrity":"sha512-T02ykjevIN9m3DaM//8uiSoyXEzT+Dfi2DsxH8b4uOMGBFuif9tBW3Wy/7rm5PV6foDay7Jf9RGeNPVQBDiqSQ==","signatures":[{"sig":"MEQCICFEgzZL50bFTlXhZz2LNEAzY2Tq1oqbBdOO8/ZqfnmnAiAQ6coq6+jizRGb8tymiIfxLbj/MjYBWhpEgKM/Tzvm0Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@acajoo%2fgiovanni-core@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":18651954},"main":"./dist/index.cjs","type":"module","_from":"file:acajoo-giovanni-core-0.2.0.tgz","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./qpdf":{"import":{"types":"./dist/qpdf.d.mts","default":"./dist/qpdf.mjs"},"require":{"types":"./dist/qpdf.d.cts","default":"./dist/qpdf.cjs"}},"./bindings":{"import":{"types":"./dist/bindings/index.d.mts","default":"./dist/bindings/index.mjs"},"require":{"types":"./dist/bindings/index.d.cts","default":"./dist/bindings/index.cjs"}},"./ghostscript":{"import":{"types":"./dist/ghostscript.d.mts","default":"./dist/ghostscript.mjs"},"require":{"types":"./dist/ghostscript.d.cts","default":"./dist/ghostscript.cjs"}},"./bindings/jsi":{"import":{"types":"./dist/bindings/jsi/index.d.mts","default":"./dist/bindings/jsi/index.mjs"},"require":{"types":"./dist/bindings/jsi/index.d.cts","default":"./dist/bindings/jsi/index.cjs"}}},"scripts":{"lint":"oxlint src tools tsdown.config.ts vitest.config.ts","test":"vitest run","build":"pnpm run build:wasm && pnpm run build:lib","clean":"tsx tools/dev/clean.ts","format":"oxfmt --write src tools tsdown.config.ts vitest.config.ts","test:jsi":"tsx tools/dev/check-jsi-build.ts","test:lib":"vitest run src/test/lib-build.test.ts","validate":"publint","build:jsi":"tsx tools/vendor/build-native.ts jsi","build:lib":"tsdown","typecheck":"tsgo --noEmit","build:wasm":"pnpm run build:vendor -- all prd","test:watch":"vitest","test:native":"tsx tools/vendor/build-native.ts native","build:native":"tsx tools/vendor/build-native.ts native","build:vendor":"tsx tools/vendor/build.ts","format:check":"oxfmt --check src tools tsdown.config.ts vitest.config.ts","package:check":"pnpm run validate && pnpm run verify:release && pnpm pack --dry-run","test:coverage":"vitest run --coverage","build:qpdf:dev":"pnpm run build:vendor -- qpdf dev","build:qpdf:prd":"pnpm run build:vendor -- qpdf prd","build:wasm:dev":"pnpm run build:vendor -- all dev","verify:release":"tsx tools/dev/verify-release.ts","build:native:all":"tsx tools/vendor/build-native.ts all","build:native:win":"tsx tools/vendor/build-native-windows.ts","smoke:ghostscript":"tsx tools/dev/ghostscript-smoke.ts","build:ghostscript:dev":"pnpm run build:vendor -- ghostscript dev","build:ghostscript:prd":"pnpm run build:vendor -- ghostscript prd"},"_npmUser":{"name":"edou","email":"contact@edwbr.dev"},"_resolved":"/tmp/ea970e80755beffffc464d8cb052ad91/acajoo-giovanni-core-0.2.0.tgz","_integrity":"sha512-T02ykjevIN9m3DaM//8uiSoyXEzT+Dfi2DsxH8b4uOMGBFuif9tBW3Wy/7rm5PV6foDay7Jf9RGeNPVQBDiqSQ==","repository":{"url":"git+https://github.com/acajoohq/giovanni.git","type":"git","directory":"packages/core"},"_npmVersion":"11.16.0","description":"Modern WebAssembly build of qpdf for PDF compression and manipulation","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","oxfmt":"^0.48.0","oxlint":"^1.63.0","tsdown":"^0.21.10","vitest":"^4.1.5","publint":"^0.3.19","typescript":"^6.0.3","@types/node":"^25.6.0","@vitest/coverage-v8":"^4.1.5","@arethetypeswrong/cli":"^0.18.2","@arethetypeswrong/core":"^0.18.2","@typescript/native-preview":"7.0.0-dev.20260505.1"},"_npmOperationalInternal":{"tmp":"tmp/giovanni-core_0.2.0_1785623282250_0.004513437309600077","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@acajoo/giovanni-core","version":"0.2.1","keywords":["compression","pdf","pdf-processing","qpdf","wasm","webassembly"],"author":{"name":"qpdf contributors"},"license":"(Apache-2.0 AND AGPL-3.0-or-later)","_id":"@acajoo/giovanni-core@0.2.1","maintainers":[{"name":"edou","email":"contact@edwbr.dev"},{"name":"matteogauthier","email":"matteo.gauthier@gmail.com"}],"homepage":"https://github.com/acajoohq/giovanni#readme","bugs":{"url":"https://github.com/acajoohq/giovanni/issues"},"dist":{"shasum":"600e854637a8f190769a1545dbd7a84eab6ef45f","tarball":"https://registry.npmjs.org/@acajoo/giovanni-core/-/giovanni-core-0.2.1.tgz","fileCount":84,"integrity":"sha512-ScMHWkom9UMCWV+FR+D7s/StT46Sv9qQkJBbuprSB/B05m+11X6ieaiMnmPV0oj08UEVDhGwItQG+25eu4Xcog==","signatures":[{"sig":"MEUCIGjiuzTNX3GIqpoEyZ0AHZzkOE52+e1BENaCYUyn+4noAiEAlVArNlL2VCFYmJTGkLyvQ4kKZGiRqu5W6GN2fpRjN2U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@acajoo%2fgiovanni-core@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":18652038},"main":"./dist/index.cjs","type":"module","_from":"file:acajoo-giovanni-core-0.2.1.tgz","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./qpdf":{"import":{"types":"./dist/qpdf.d.mts","default":"./dist/qpdf.mjs"},"require":{"types":"./dist/qpdf.d.cts","default":"./dist/qpdf.cjs"}},"./bindings":{"import":{"types":"./dist/bindings/index.d.mts","default":"./dist/bindings/index.mjs"},"require":{"types":"./dist/bindings/index.d.cts","default":"./dist/bindings/index.cjs"}},"./ghostscript":{"import":{"types":"./dist/ghostscript.d.mts","default":"./dist/ghostscript.mjs"},"require":{"types":"./dist/ghostscript.d.cts","default":"./dist/ghostscript.cjs"}},"./bindings/jsi":{"import":{"types":"./dist/bindings/jsi/index.d.mts","default":"./dist/bindings/jsi/index.mjs"},"require":{"types":"./dist/bindings/jsi/index.d.cts","default":"./dist/bindings/jsi/index.cjs"}}},"scripts":{"lint":"oxlint src tools tsdown.config.ts vitest.config.ts","test":"vitest run","build":"pnpm run build:wasm && pnpm run build:lib","clean":"tsx tools/dev/clean.ts","format":"oxfmt --write src tools tsdown.config.ts vitest.config.ts","test:jsi":"tsx tools/dev/check-jsi-build.ts","test:lib":"vitest run src/test/lib-build.test.ts","validate":"publint","build:jsi":"tsx tools/vendor/build-native.ts jsi","build:lib":"tsdown","typecheck":"tsgo --noEmit","build:wasm":"pnpm run build:vendor -- all prd","test:watch":"vitest","test:native":"tsx tools/vendor/build-native.ts native","build:native":"tsx tools/vendor/build-native.ts native","build:vendor":"tsx tools/vendor/build.ts","format:check":"oxfmt --check src tools tsdown.config.ts vitest.config.ts","package:check":"pnpm run validate && pnpm run verify:release && pnpm pack --dry-run","test:coverage":"vitest run --coverage","build:qpdf:dev":"pnpm run build:vendor -- qpdf dev","build:qpdf:prd":"pnpm run build:vendor -- qpdf prd","build:wasm:dev":"pnpm run build:vendor -- all dev","verify:release":"tsx tools/dev/verify-release.ts","build:native:all":"tsx tools/vendor/build-native.ts all","build:native:win":"tsx tools/vendor/build-native-windows.ts","smoke:ghostscript":"tsx tools/dev/ghostscript-smoke.ts","build:ghostscript:dev":"pnpm run build:vendor -- ghostscript dev","build:ghostscript:prd":"pnpm run build:vendor -- ghostscript prd"},"_npmUser":{"name":"edou","email":"contact@edwbr.dev"},"_resolved":"/tmp/e4c9bc4265f493f7c2fc8a708ab54e8a/acajoo-giovanni-core-0.2.1.tgz","_integrity":"sha512-ScMHWkom9UMCWV+FR+D7s/StT46Sv9qQkJBbuprSB/B05m+11X6ieaiMnmPV0oj08UEVDhGwItQG+25eu4Xcog==","repository":{"url":"git+https://github.com/acajoohq/giovanni.git","type":"git","directory":"packages/core"},"_npmVersion":"11.17.0","description":"Modern WebAssembly build of qpdf for PDF compression and manipulation","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","oxfmt":"^0.48.0","oxlint":"^1.63.0","tsdown":"^0.21.10","vitest":"^4.1.5","publint":"^0.3.19","typescript":"^6.0.3","@types/node":"^25.6.0","@vitest/coverage-v8":"^4.1.5","@arethetypeswrong/cli":"^0.18.2","@arethetypeswrong/core":"^0.18.2","@typescript/native-preview":"7.0.0-dev.20260505.1"},"_npmOperationalInternal":{"tmp":"tmp/giovanni-core_0.2.1_1786809593597_0.6128807370182998","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@acajoo/giovanni-core","version":"0.3.0","keywords":["compression","pdf","pdf-processing","qpdf","wasm","webassembly"],"author":{"name":"qpdf contributors"},"license":"(Apache-2.0 AND AGPL-3.0-or-later)","_id":"@acajoo/giovanni-core@0.3.0","maintainers":[{"name":"edou","email":"contact@edwbr.dev"},{"name":"matteogauthier","email":"matteo.gauthier@gmail.com"}],"homepage":"https://github.com/acajoohq/giovanni#readme","bugs":{"url":"https://github.com/acajoohq/giovanni/issues"},"dist":{"shasum":"af53d90dc625c0fb82cc287587808131f093f3ac","tarball":"https://registry.npmjs.org/@acajoo/giovanni-core/-/giovanni-core-0.3.0.tgz","fileCount":84,"integrity":"sha512-F0zoAyav+ZKcu/nG/KPIP7l9ubfNRR65XszWOqVxc+ZcoDpC0gywko5xazY9m2Cr4B/ljZ/k/Kj3BGlchGpVOQ==","signatures":[{"sig":"MEYCIQCpsq97qpZPTMSadsMEVZhC5Jgo2e8Qi90l+LG9MMNl9AIhAIUyoEeP+PhhUH5QAz8qaKfCUlO26B2FwEh15GbuAf0T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@acajoo%2fgiovanni-core@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":18694304},"main":"./dist/index.cjs","type":"module","_from":"file:acajoo-giovanni-core-0.3.0.tgz","types":"./dist/index.d.mts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./qpdf":{"import":{"types":"./dist/qpdf.d.mts","default":"./dist/qpdf.mjs"},"require":{"types":"./dist/qpdf.d.cts","default":"./dist/qpdf.cjs"}},"./bindings":{"import":{"types":"./dist/bindings/index.d.mts","default":"./dist/bindings/index.mjs"},"require":{"types":"./dist/bindings/index.d.cts","default":"./dist/bindings/index.cjs"}},"./ghostscript":{"import":{"types":"./dist/ghostscript.d.mts","default":"./dist/ghostscript.mjs"},"require":{"types":"./dist/ghostscript.d.cts","default":"./dist/ghostscript.cjs"}},"./bindings/jsi":{"import":{"types":"./dist/bindings/jsi/index.d.mts","default":"./dist/bindings/jsi/index.mjs"},"require":{"types":"./dist/bindings/jsi/index.d.cts","default":"./dist/bindings/jsi/index.cjs"}}},"scripts":{"lint":"oxlint src tools tsdown.config.ts vitest.config.ts","test":"vitest run","build":"pnpm run build:wasm && pnpm run build:lib","clean":"tsx tools/dev/clean.ts","format":"oxfmt --write src tools tsdown.config.ts vitest.config.ts","test:jsi":"tsx tools/dev/check-jsi-build.ts","test:lib":"vitest run src/test/lib-build.test.ts","validate":"publint","build:jsi":"tsx tools/vendor/build-native.ts jsi","build:lib":"tsdown","typecheck":"tsgo --noEmit","build:wasm":"pnpm run build:vendor -- all prd","test:watch":"vitest","test:native":"tsx tools/vendor/build-native.ts native","build:native":"tsx tools/vendor/build-native.ts native","build:vendor":"tsx tools/vendor/build.ts","format:check":"oxfmt --check src tools tsdown.config.ts vitest.config.ts","package:check":"pnpm run validate && pnpm run verify:release && pnpm pack --dry-run","test:coverage":"vitest run --coverage","build:qpdf:dev":"pnpm run build:vendor -- qpdf dev","build:qpdf:prd":"pnpm run build:vendor -- qpdf prd","build:wasm:dev":"pnpm run build:vendor -- all dev","verify:release":"tsx tools/dev/verify-release.ts","build:native:all":"tsx tools/vendor/build-native.ts all","build:native:win":"tsx tools/vendor/build-native-windows.ts","smoke:ghostscript":"tsx tools/dev/ghostscript-smoke.ts","build:ghostscript:dev":"pnpm run build:vendor -- ghostscript dev","build:ghostscript:prd":"pnpm run build:vendor -- ghostscript prd"},"_npmUser":{"name":"edou","email":"contact@edwbr.dev"},"_resolved":"/tmp/e03ab49ea49d3b054caf2d1ee02dc2b2/acajoo-giovanni-core-0.3.0.tgz","_integrity":"sha512-F0zoAyav+ZKcu/nG/KPIP7l9ubfNRR65XszWOqVxc+ZcoDpC0gywko5xazY9m2Cr4B/ljZ/k/Kj3BGlchGpVOQ==","repository":{"url":"git+https://github.com/acajoohq/giovanni.git","type":"git","directory":"packages/core"},"_npmVersion":"11.17.0","description":"Modern WebAssembly build of qpdf for PDF compression and manipulation","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","oxfmt":"^0.48.0","oxlint":"^1.63.0","tsdown":"^0.21.10","vitest":"^4.1.5","publint":"^0.3.19","typescript":"^6.0.3","@types/node":"^25.6.0","@vitest/coverage-v8":"^4.1.5","@arethetypeswrong/cli":"^0.18.2","@arethetypeswrong/core":"^0.18.2","@typescript/native-preview":"7.0.0-dev.20260505.1"},"_npmOperationalInternal":{"tmp":"tmp/giovanni-core_0.3.0_1787076953927_0.910124711663542","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@acajoo/giovanni-core","version":"0.4.0","description":"Modern WebAssembly build of qpdf for PDF compression and manipulation","keywords":["compression","pdf","pdf-processing","qpdf","wasm","webassembly"],"homepage":"https://github.com/acajoohq/giovanni#readme","bugs":{"url":"https://github.com/acajoohq/giovanni/issues"},"license":"(Apache-2.0 AND AGPL-3.0-or-later)","author":{"name":"qpdf contributors"},"repository":{"type":"git","url":"git+https://github.com/acajoohq/giovanni.git","directory":"packages/core"},"type":"module","sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.mts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./qpdf":{"import":{"types":"./dist/qpdf.d.mts","default":"./dist/qpdf.mjs"},"require":{"types":"./dist/qpdf.d.cts","default":"./dist/qpdf.cjs"}},"./ghostscript":{"import":{"types":"./dist/ghostscript.d.mts","default":"./dist/ghostscript.mjs"},"require":{"types":"./dist/ghostscript.d.cts","default":"./dist/ghostscript.cjs"}},"./bindings":{"import":{"types":"./dist/bindings/index.d.mts","default":"./dist/bindings/index.mjs"},"require":{"types":"./dist/bindings/index.d.cts","default":"./dist/bindings/index.cjs"}},"./bindings/jsi":{"import":{"types":"./dist/bindings/jsi/index.d.mts","default":"./dist/bindings/jsi/index.mjs"},"require":{"types":"./dist/bindings/jsi/index.d.cts","default":"./dist/bindings/jsi/index.cjs"}}},"publishConfig":{"access":"public"},"devDependencies":{"@arethetypeswrong/cli":"^0.18.2","@arethetypeswrong/core":"^0.18.2","@types/node":"^25.6.0","@typescript/native-preview":"7.0.0-dev.20260505.1","@vitest/coverage-v8":"^4.1.5","oxfmt":"^0.48.0","oxlint":"^1.63.0","publint":"^0.3.19","tsdown":"^0.21.10","tsx":"^4.20.6","typescript":"^6.0.3","vitest":"^4.1.5"},"engines":{"node":">=24.0.0"},"scripts":{"build":"pnpm run build:wasm && pnpm run build:lib","build:vendor":"tsx tools/vendor/build.ts","build:lib":"tsdown","build:qpdf:dev":"pnpm run build:vendor -- qpdf dev","build:qpdf:prd":"pnpm run build:vendor -- qpdf prd","build:ghostscript:dev":"pnpm run build:vendor -- ghostscript dev","build:ghostscript:prd":"pnpm run build:vendor -- ghostscript prd","smoke:ghostscript":"tsx tools/dev/ghostscript-smoke.ts","build:wasm":"pnpm run build:vendor -- all prd","build:wasm:dev":"pnpm run build:vendor -- all dev","build:native":"tsx tools/vendor/build-native.ts native","build:native:win":"tsx tools/vendor/build-native-windows.ts","build:jsi":"tsx tools/vendor/build-native.ts jsi","build:native:all":"tsx tools/vendor/build-native.ts all","test:native":"tsx tools/vendor/build-native.ts native","test:jsi":"tsx tools/dev/check-jsi-build.ts","test:lib":"vitest run src/test/lib-build.test.ts","clean":"tsx tools/dev/clean.ts","format":"oxfmt --write src tools tsdown.config.ts vitest.config.ts","format:check":"oxfmt --check src tools tsdown.config.ts vitest.config.ts","lint":"oxlint src tools tsdown.config.ts vitest.config.ts","test":"vitest run","test:coverage":"vitest run --coverage","test:watch":"vitest","typecheck":"tsgo --noEmit","validate":"publint","verify:release":"tsx tools/dev/verify-release.ts","package:check":"pnpm run validate && pnpm run verify:release && pnpm pack --dry-run"},"_id":"@acajoo/giovanni-core@0.4.0","_integrity":"sha512-7tJzmwxgMMsYcW7XAk9ynxKKfBcNqK+J79NdDrqBDbggnUw7rHF2mQy1UTeRAEKoN7LEWCOcIum/esgyoDiZNw==","_resolved":"/tmp/1e1bfa2c42fc26845c50108be7012441/acajoo-giovanni-core-0.4.0.tgz","_from":"file:acajoo-giovanni-core-0.4.0.tgz","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-7tJzmwxgMMsYcW7XAk9ynxKKfBcNqK+J79NdDrqBDbggnUw7rHF2mQy1UTeRAEKoN7LEWCOcIum/esgyoDiZNw==","shasum":"07d8e3f45634652e0eee5a286ac5a8472023e88b","tarball":"https://registry.npmjs.org/@acajoo/giovanni-core/-/giovanni-core-0.4.0.tgz","fileCount":84,"unpackedSize":18706555,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@acajoo%2fgiovanni-core@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD0u69LgBvl3fgKJau9No0ZYi+FnFJTe6dJk+gVs8yAKQIgeQh8j/Nh1No2LETKWzunNg3DvR/v8d3XJW5B9eo1Las="}]},"_npmUser":{"name":"edou","email":"contact@edwbr.dev"},"directories":{},"maintainers":[{"name":"edou","email":"contact@edwbr.dev"},{"name":"matteogauthier","email":"matteo.gauthier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/giovanni-core_0.4.0_1787479851691_0.38927754816160065"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-05T16:48:35.484Z","modified":"2026-08-23T10:10:52.381Z","0.1.0":"2026-07-05T16:48:35.935Z","0.1.1":"2026-07-26T10:36:46.002Z","0.2.0":"2026-08-01T22:28:02.548Z","0.2.1":"2026-08-15T15:59:53.894Z","0.3.0":"2026-08-18T18:15:54.294Z","0.4.0":"2026-08-23T10:10:52.022Z"},"bugs":{"url":"https://github.com/acajoohq/giovanni/issues"},"author":{"name":"qpdf contributors"},"license":"(Apache-2.0 AND AGPL-3.0-or-later)","homepage":"https://github.com/acajoohq/giovanni#readme","keywords":["compression","pdf","pdf-processing","qpdf","wasm","webassembly"],"repository":{"type":"git","url":"git+https://github.com/acajoohq/giovanni.git","directory":"packages/core"},"description":"Modern WebAssembly build of qpdf for PDF compression and manipulation","maintainers":[{"name":"edou","email":"contact@edwbr.dev"},{"name":"matteogauthier","email":"matteo.gauthier@gmail.com"}],"readme":"﻿# @acajoo/giovanni-core\n\n[qpdf](https://github.com/qpdf/qpdf) built for multiple runtimes compress, split, merge, extract images, inspect, and organize PDFs across WebAssembly (browser and Node.js), native C FFI, and React Native JSI targets. Experimental **Ghostscript** support adds lossy image recompression. The root package is task-oriented; engine-specific APIs live under `@acajoo/giovanni-core/qpdf` and `@acajoo/giovanni-core/ghostscript`.\n\n**PDF.js rasterisation** (full page → JPEG) lives in the sibling package **`@acajoo/giovanni-pdf-render`**, not in this module.\n\nFull public API documentation: [docs.giovanni.pizza](https://docs.giovanni.pizza).\n\n## Install\n\n```bash\npnpm add @acajoo/giovanni-core\n# npm install @acajoo/giovanni-core\n```\n\nNeeds **Node 24+** for local dev ([`engines`](package.json)). Docker is the build toolchain for the vendored WASM engines. On Windows, use Docker Desktop with Linux containers enabled.\n\n## Usage\n\n```ts\nimport { compressPdf, inspectPdf, splitPdf } from \"@acajoo/giovanni-core\";\n\nconst input = await fetch(\"document.pdf\").then((r) => r.arrayBuffer());\n\nconst info = await inspectPdf(input);\n\nconst compressed = await compressPdf(input, {\n    preset: \"web\", // default | web | archive\n    linearize: true,\n});\n\nconst pages = await splitPdf(compressed.data);\n```\n\nEngine-specific entrypoints are available via subpath imports:\n\n```ts\nimport { compressPdf } from \"@acajoo/giovanni-core\";\nimport { optimizePdf, QpdfDocument } from \"@acajoo/giovanni-core/qpdf\";\nimport { compressPdfWithGhostscript } from \"@acajoo/giovanni-core/ghostscript\";\n\nconst qpdfResult = await compressPdf(input, { engine: \"qpdf\", preset: \"web\" });\n\nconst ghostscriptResult = await compressPdf(input, {\n    engine: \"ghostscript\",\n    preset: \"screen\",\n    colorImageResolution: 96,\n    jpegQuality: 75,\n});\n\nconst optimized = await optimizePdf(input, { preset: \"archive\" });\nconst document = await QpdfDocument.open(optimized.data);\ndocument.dispose();\n\nconst screenResult = await compressPdfWithGhostscript(input, { preset: \"screen\" });\n```\n\n## Engines\n\n### QPDF\n\nQPDF is a lossless PDF structural tool. It handles: object stream rewriting, flate recompression, linearization, inspection, validation, splitting, merging, and page organization. It does not resample or re-encode images, so it is not a lossy image compressor.\n\nOmitted optimization options fall back to `OptimizeOptions` defaults. Notably **`objectStreams` defaults to `generate`**, which usually improves size by rewriting object streams; set **`preserve`** if you need output structure closer to the input (e.g. for compatibility or structural diffs).\n\nTo render PDF pages to JPEG via PDF.js, use the sibling package:\n\n```ts\nimport { renderPdfPagesToJpg } from \"@acajoo/giovanni-pdf-render\";\n```\n\n### Ghostscript\n\nGhostscript is the lossy rewrite path. It re-encodes images and rewrites the entire PDF through the `pdfwrite` device, which can recover much more space than qpdf on scan-heavy documents.\n\n> **Experimental.** Ghostscript is not yet considered stable in this package.\n\nObserved behavior in this repo:\n\n- `qpdf.wasm` ≈ 1 MB - fast, lossless structural rewrites\n- `ghostscript.wasm` ≈ 17 MB - slower; can save significantly more on image-heavy PDFs\n- Processing time for larger scanned PDFs can reach several seconds\n\n**Licensing:** Ghostscript is dual-licensed under AGPLv3 or a commercial license by Artifex. This package's metadata reflects `(Apache-2.0 AND AGPL-3.0-or-later)`. SaaS and closed-source distribution likely require careful AGPL compliance review or a commercial license. Read the official pages before distributing a Ghostscript-enabled build:\n\n- [Artifex licensing](https://artifex.com/licensing)\n- [Ghostscript FAQ](https://ghostscript.com/faq/)\n\n## Building\n\n### WASM (web / Node.js)\n\nRequires **Docker Desktop** (Linux containers). Pinned source archives are fetched inside the container - no manual vendor clone needed.\n\n```bash\n# Full build (WASM + bundle)\npnpm --filter @acajoo/giovanni-core build\n\n# WASM engines only (parallel)\npnpm --filter @acajoo/giovanni-core build:wasm\n\n# Individual engine builds\npnpm --filter @acajoo/giovanni-core build:qpdf:dev\npnpm --filter @acajoo/giovanni-core build:qpdf:prd\npnpm --filter @acajoo/giovanni-core build:ghostscript:dev\npnpm --filter @acajoo/giovanni-core build:ghostscript:prd\n```\n\nIf your Docker buildx driver supports local cache export, the build reuses a per-engine cache directory. Override the cache location with:\n\n```bash\nGIOVANNI_DOCKER_CACHE_ROOT=.tmp/docker-buildx-cache pnpm --filter @acajoo/giovanni-core build:wasm\n```\n\nVendor sync contract:\n\n- Pinned source archives are declared in `tools/vendor/upstreams.ts`\n- Docker fetches those archives during the build\n- No manual host-side vendor cache is required\n\n### C FFI (native)\n\nProduces `libgiovanni_native` (static by default) and a C header `giovanni_c.h`. This build **optionally links Ghostscript in too**, in addition to qpdf.\n\n#### Linux / macOS\n\nRequires **Docker** (fetches qpdf and, optionally, GhostPDL source inside the container, same pipeline as WASM). GhostPDL's own `./configure && make libgs` produces a real static archive that gets linked into `libgiovanni_native.a` like any other static dependency.\n\n```bash\npnpm --filter @acajoo/giovanni-core build:native\n```\n\n#### Windows\n\nRequires **Git**, **MSVC** (Visual Studio 2022 with the C++ Desktop workload, including `nmake`), and **CMake** (bundled with VS). No manual dependency setup for qpdf on first run the script clones and bootstraps a project-local vcpkg under `.tmp/vcpkg` and uses it to fetch qpdf automatically. Ghostscript is different: GhostPDL's MSVC makefile has no static-lib target, only a DLL (`gsdll64.dll`) + its import lib (`gsdll64.lib`), so the script fetches GhostPDL source and builds that separately with `nmake`.\n\n```powershell\npnpm --filter @acajoo/giovanni-core build:native:win\n```\n\nSubsequent runs skip the qpdf clone/bootstrap step and the GhostPDL source fetch; vcpkg caches installed packages, and GhostPDL only rebuilds objects nmake considers stale. Set `GIOVANNI_SKIP_GHOSTSCRIPT=1` to skip building Ghostscript entirely `GhostscriptEngine` then compiles as a stub that throws instead of failing the whole build.\n\n**Because Ghostscript is a DLL on Windows (not a static lib), `gsdll64.dll` is a runtime dependency** of anything that links `giovanni_native.lib` - it must sit next to the final executable, not just be available at link time. The script copies it into `build/native/`; consumers need their own copy step for their own output directory (e.g. `apps/desktop/src-tauri/build.rs` copies it next to the compiled Tauri binary).\n\n---\n\nOutput lands in `build/native/` for both platforms:\n\n- Linux / macOS: `libgiovanni_native.a` + `giovanni_c.h` (+ `libgs.a` if Ghostscript was built)\n- Windows: `giovanni_native.lib` + `giovanni_c.h` (+ `gsdll64.lib` and `gsdll64.dll` if Ghostscript was built)\n\n```c\n#include \"giovanni_c.h\"\n\nGiovanniQpdfHandle h = giovanni_qpdf_create();\n// ... giovanni_write_pdf, giovanni_split_pages, giovanni_merge_pdfs ...\ngiovanni_qpdf_destroy(h);\n```\n\nIf the build linked Ghostscript in, `giovanni_rewrite_pdf` runs a `pdfwrite` pass through the real `gsapi_*` embedding API, same lossy rewrite path as the WASM Ghostscript engine, just with plain `gs` command-line args instead of the TypeScript option objects:\n\n```c\nGiovanniGhostscriptHandle gs = giovanni_ghostscript_create();\n\nconst char* args[] = {\n    \"-sDEVICE=pdfwrite\", \"-dBATCH\", \"-dNOPAUSE\", \"-dSAFER\", \"-dQUIET\",\n    \"-dPDFSETTINGS=/screen\",\n};\nuint8_t* out_data;\nsize_t out_size;\ngiovanni_rewrite_pdf(gs, input, input_size, args, 6, &out_data, &out_size);\n// ... use out_data / out_size, then giovanni_buffer_free(out_data) ...\n\ngiovanni_ghostscript_destroy(gs);\n```\n\nIf Ghostscript wasn't linked in (`GIOVANNI_SKIP_GHOSTSCRIPT` on Windows, or no GhostPDL source available on Linux), `giovanni_ghostscript_create` still succeeds but `giovanni_rewrite_pdf`/`giovanni_get_ghostscript_version` return an error, check `giovanni_last_error()`.\n\nUsable from Python, Rust, Go, Swift, or any language with a C FFI. Build as a shared library instead of static:\n\n```bash\nGIOVANNI_NATIVE_SHARED=1 pnpm --filter @acajoo/giovanni-core build:native\n```\n\n### React Native (JSI)\n\nProduces `libgiovanni_jsi` (shared library) that registers a synchronous `giovanni` object on the JSI runtime, exposing `getVersion`, `writePdf`, `splitPages`, `mergePdfs`, and `getDocumentInfo`.\n\n```bash\n# Point to your ReactCommon directory (contains jsi/jsi.h)\nGIOVANNI_JSI_INCLUDE_DIR=/path/to/node_modules/react-native/ReactCommon \\\n  pnpm --filter @acajoo/giovanni-core build:jsi\n```\n\nOutput lands in `build/jsi/`. If `GIOVANNI_JSI_INCLUDE_DIR` is not set, the build compiles a stub-only fallback without the JSI runtime dependency.\n\n### Build all native targets\n\n```bash\npnpm --filter @acajoo/giovanni-core build:native:all\n```\n\n### Build environment variables\n\n| Variable                     | Applies to         | Description                                                       |\n| ---------------------------- | ------------------ | ----------------------------------------------------------------- |\n| `GIOVANNI_DOCKER_CACHE_ROOT` | WASM builds        | Override Docker buildx cache directory                            |\n| `GIOVANNI_NATIVE_SHARED=1`   | `build:native`     | Build shared library instead of static                            |\n| `GIOVANNI_JSI_INCLUDE_DIR`   | `build:jsi`        | Path to `ReactCommon/` (JSI headers)                              |\n| `GIOVANNI_NATIVE_JOBS`       | native / JSI       | Parallel CMake build jobs                                         |\n| `VCPKG_ROOT`                 | `build:native:win` | Use an existing standalone vcpkg instead of the auto-bootstrap    |\n| `GIOVANNI_VCPKG_TRIPLET`     | `build:native:win` | Override vcpkg triplet (default: `x64-windows-static`)            |\n| `GIOVANNI_CMAKE_GENERATOR`   | `build:native:win` | Override CMake generator (default: auto-detected by VS install)   |\n| `GIOVANNI_SKIP_GHOSTSCRIPT`  | `build:native:win` | Skip building Ghostscript; `GhostscriptEngine` compiles as a stub |\n\n## Development\n\n```bash\npnpm --filter @acajoo/giovanni-core test\npnpm --filter @acajoo/giovanni-core validate\npnpm --filter @acajoo/giovanni-core package:check\n```\n\nSmoke test the Ghostscript WASM artifact end to end:\n\n```bash\npnpm --filter @acajoo/giovanni-core smoke:ghostscript \\\n  src/test/fixtures/pdfs/upstream/pdfium/rectangles.pdf \\\n  .tmp/ghostscript-smoke-rectangles.pdf \\\n  screen\n```\n\nDirectory layout:\n\n```\nsrc/        TypeScript API\ntools/      Build orchestration and smoke helpers\nnative/     CMake sources, Emscripten bindings, Dockerfiles\ndist/       Packaged output (generated)\nbuild/      WASM and native artifacts (generated)\n```\n\nArchitecture references:\n\n- [`native/README.md`](./native/README.md) C++ native layer (interface → impl → targets)\n\nNative source layout:\n\n```\nnative/\n  interface/   Abstract C++ interfaces (IQpdfEngine, IGhostscriptEngine)\n  impl/        Platform-agnostic implementations (QpdfEngine via libqpdf)\n  targets/\n    native/    C FFI wrapper (giovanni_c.h + libgiovanni_native)\n    jsi/       React Native JSI adapter (libgiovanni_jsi)\n```\n\nMore context: [root README](https://github.com/acajoohq/giovanni/blob/master/README.md).\n\n## Licensing\n\nThe package-authored TypeScript code is **Apache-2.0**. The bundled Ghostscript artifacts are **AGPL-3.0-or-later** (Artifex dual-license). The combined package metadata is therefore:\n\n```\n(Apache-2.0 AND AGPL-3.0-or-later)\n```\n\nThe qpdf C++ library is separately licensed, see [`vendor/qpdf/LICENSE.txt`](../../vendor/qpdf/LICENSE.txt).\n","readmeFilename":"README.md"}