build(frontend): serve pdf.js wasm decoders at /pdfjs-wasm/ via static-copy

pdf.js 5.x moved the JBIG2/CCITTFax/JPEG2000 image decoders into
WebAssembly. The wasm lives in node_modules and was never web-served, so
those decoders failed to initialise and CCITT (G4 fax) scans painted
blank in production while rendering fine in dev.

Add vite-plugin-static-copy (devDependency) to copy
node_modules/pdfjs-dist/wasm/* into build/client/pdfjs-wasm/, so the
assets are emitted into the SvelteKit client build and survive the
production Docker image — not just `npm run dev`. Verified that
`node build` serves /pdfjs-wasm/jbig2.wasm with 200 + application/wasm.

Refs #708

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-06-01 20:05:34 +02:00
parent 50f554680c
commit 8d2ef97fe2
3 changed files with 175 additions and 0 deletions

View File

@@ -5,6 +5,7 @@ import tailwindcss from '@tailwindcss/vite';
import { defineConfig } from 'vitest/config';
import { playwright } from '@vitest/browser-playwright';
import { sveltekit } from '@sveltejs/kit/vite';
import { viteStaticCopy } from 'vite-plugin-static-copy';
export default defineConfig({
optimizeDeps: {
@@ -42,6 +43,15 @@ export default defineConfig({
tailwindcss(),
sveltekit(),
devtoolsJson(),
// pdf.js 5.x decodes JBIG2 / CCITTFax / JPEG2000 images in WebAssembly.
// Serve the wasm from our own origin at /pdfjs-wasm/ (referenced by
// getDocument's wasmUrl) — emitted into build/client/ so it survives the
// production Docker image, not just `npm run dev`. See issue #708.
viteStaticCopy({
targets: [
{ src: 'node_modules/pdfjs-dist/wasm/*', dest: 'pdfjs-wasm', rename: { stripBase: true } }
]
}),
paraglideVitePlugin({
project: './project.inlang',
outdir: './src/lib/paraglide'