diff --git a/package-lock.json b/package-lock.json index ace3109..c10be65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,9 @@ "": { "name": "tools-app", "version": "0.6.3", + "hasInstallScript": true, "dependencies": { + "barcode-detector": "^3.1.0", "lucide-vue-next": "^0.575.0", "qrcode": "^1.5.4", "vue": "^3.5.25", @@ -2946,13 +2948,12 @@ } }, "node_modules/barcode-detector": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-2.2.2.tgz", - "integrity": "sha512-JcSekql+EV93evfzF9zBr+Y6aRfkR+QFvgyzbwQ0dbymZXoAI9+WgT7H1E429f+3RKNncHz2CW98VQtaaKpmfQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-3.1.0.tgz", + "integrity": "sha512-aQjGxrgsb/WTlw6pHZwFRO6NhFMhwHGEkd0pzV25fBn8dnRA1PA1G7bLeAzvSea646S/96nW5W3jD8wezQZ1vQ==", "license": "MIT", "dependencies": { - "@types/dom-webcodecs": "^0.1.11", - "zxing-wasm": "1.1.3" + "zxing-wasm": "3.0.0" } }, "node_modules/baseline-browser-mapping": { @@ -5912,6 +5913,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -6381,6 +6394,25 @@ "node": ">=18.0.0" } }, + "node_modules/vue-qrcode-reader/node_modules/barcode-detector": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-2.2.2.tgz", + "integrity": "sha512-JcSekql+EV93evfzF9zBr+Y6aRfkR+QFvgyzbwQ0dbymZXoAI9+WgT7H1E429f+3RKNncHz2CW98VQtaaKpmfQ==", + "license": "MIT", + "dependencies": { + "@types/dom-webcodecs": "^0.1.11", + "zxing-wasm": "1.1.3" + } + }, + "node_modules/vue-qrcode-reader/node_modules/zxing-wasm": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/zxing-wasm/-/zxing-wasm-1.1.3.tgz", + "integrity": "sha512-MYm9k/5YVs4ZOTIFwlRjfFKD0crhefgbnt1+6TEpmKUDFp3E2uwqGSKwQOd2hOIsta/7Usq4hnpNRYTLoljnfA==", + "license": "MIT", + "dependencies": { + "@types/emscripten": "^1.39.10" + } + }, "node_modules/vue-router": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.3.tgz", @@ -6982,12 +7014,31 @@ } }, "node_modules/zxing-wasm": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/zxing-wasm/-/zxing-wasm-1.1.3.tgz", - "integrity": "sha512-MYm9k/5YVs4ZOTIFwlRjfFKD0crhefgbnt1+6TEpmKUDFp3E2uwqGSKwQOd2hOIsta/7Usq4hnpNRYTLoljnfA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/zxing-wasm/-/zxing-wasm-3.0.0.tgz", + "integrity": "sha512-s7ASCPKX+QnH7Y83f4Byxmq/vDzYW7B9m6jMP5S30JGfN2A6WAUn6P3vcBmNguDhPLE6ny2fjTooQVyKBXI1qA==", "license": "MIT", "dependencies": { - "@types/emscripten": "^1.39.10" + "@types/emscripten": "^1.41.5", + "type-fest": "^5.4.4" + }, + "peerDependencies": { + "@types/emscripten": ">=1.39.6" + } + }, + "node_modules/zxing-wasm/node_modules/type-fest": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", + "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } } diff --git a/package.json b/package.json index 316d410..c2e85f7 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,11 @@ "scripts": { "dev": "vite", "build": "vite build", - "preview": "vite preview" + "preview": "vite preview", + "postinstall": "mkdir -p public/wasm && cp node_modules/zxing-wasm/dist/reader/zxing_reader.wasm public/wasm/" }, "dependencies": { + "barcode-detector": "^3.1.0", "lucide-vue-next": "^0.575.0", "qrcode": "^1.5.4", "vue": "^3.5.25", diff --git a/public/wasm/zxing_reader.wasm b/public/wasm/zxing_reader.wasm new file mode 100644 index 0000000..94eeefa Binary files /dev/null and b/public/wasm/zxing_reader.wasm differ diff --git a/src/main.js b/src/main.js index d0ac7a9..f828c97 100644 --- a/src/main.js +++ b/src/main.js @@ -3,6 +3,27 @@ import './style.css' import App from './App.vue' import router from './router' import Ripple from './directives/ripple' +import { BarcodeDetector, prepareZXingModule } from 'barcode-detector/ponyfill' + +// Configure BarcodeDetector polyfill to use local WASM file +try { + prepareZXingModule({ + overrides: { + locateFile: (path, prefix) => { + if (path.endsWith('.wasm')) { + return '/wasm/zxing_reader.wasm' + } + return prefix + path + } + } + }) + + // Force usage of polyfill to avoid CSP issues and ensure consistent behavior + // Native implementation might fail or be missing in some browsers + window.BarcodeDetector = BarcodeDetector +} catch (e) { + console.error('Failed to initialize BarcodeDetector polyfill', e) +} const app = createApp(App)