diff --git a/src-tauri/gen/android/app/src/main/AndroidManifest.xml b/src-tauri/gen/android/app/src/main/AndroidManifest.xml index 3739116..0f58e4d 100644 --- a/src-tauri/gen/android/app/src/main/AndroidManifest.xml +++ b/src-tauri/gen/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + diff --git a/src/lib/components/fitness/FoodSearch.svelte b/src/lib/components/fitness/FoodSearch.svelte index 4bfcad9..a8862a6 100644 --- a/src/lib/components/fitness/FoodSearch.svelte +++ b/src/lib/components/fitness/FoodSearch.svelte @@ -209,12 +209,24 @@ await videoEl.play(); scanDebug += ` | video: ${videoEl.videoWidth}x${videoEl.videoHeight}`; - // Import barcode-detector/pure — ZXing WASM-based ponyfill + // Import barcode-detector ponyfill with self-hosted WASM scanDebug += ' | importing detector…'; let BarcodeDetector; try { - const mod = await import('barcode-detector/pure'); + const mod = await import('barcode-detector/ponyfill'); BarcodeDetector = mod.BarcodeDetector; + + // Point ZXing WASM to our self-hosted copy via Vite ?url import + const { prepareZXingModule } = await import('barcode-detector/ponyfill'); + const wasmModule = await import('zxing-wasm/reader/zxing_reader.wasm?url'); + prepareZXingModule({ + overrides: { + locateFile: (path, prefix) => { + if (path.endsWith('.wasm')) return wasmModule.default; + return prefix + path; + }, + }, + }); scanDebug += ' OK'; } catch (importErr) { scanDebug = `IMPORT ERROR: ${importErr?.message ?? importErr}`; diff --git a/vite.config.ts b/vite.config.ts index 034c5bc..70202f7 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -6,6 +6,9 @@ export default defineConfig({ allowedHosts: ["bocken.org"] }, plugins: [sveltekit()], + optimizeDeps: { + exclude: ['barcode-detector'] + }, build: { minify: 'terser', terserOptions: { @@ -25,6 +28,9 @@ export default defineConfig({ if (id.includes('@auth/sveltekit')) { return 'auth'; } + if (id.includes('barcode-detector') || id.includes('zxing-wasm')) { + return 'barcode'; + } } } }