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';
+ }
}
}
}