{"_id":"@agicash/qr-scanner","_rev":"4-baf6fef52c7329c00291892386f74d95","name":"@agicash/qr-scanner","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@agicash/qr-scanner","version":"0.1.0","keywords":["qr","qr-code","scanner","barcode","wasm","webassembly","zxing","camera"],"author":"","license":"MIT","_id":"@agicash/qr-scanner@0.1.0","maintainers":[{"name":"bobsy","email":"dev@agi.cash"},{"name":"josip_agicash","email":"josip@agi.cash"}],"dist":{"shasum":"0652833c6ee94c1aedcbb20f86e8c0df95379ad4","tarball":"https://registry.npmjs.org/@agicash/qr-scanner/-/qr-scanner-0.1.0.tgz","fileCount":11,"integrity":"sha512-+jK5MyKYtAAkW7W19AjdRIEzGd2alHpjlk/OVw0PVwezJTMkNVm07MxMaqCOqzzbVxfek8LfU1n8ubHAzxIgTA==","signatures":[{"sig":"MEYCIQCgHOj3WowOXRpChzLPUvyzIZmfedoJ90XWticM+G0e3AIhAJS3jfC0tNULh8trK5O7m99HRZ7H6L1m6mSNkk2nXN/n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371596},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./dist/worker.js":"./dist/worker.js"},"gitHead":"2ae760b40c1e3914c627a6dc7d60be1ca9211502","scripts":{"dev":"cd demo && vite","lint":"tsc --noEmit","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"josip_agicash","email":"josip@agi.cash"},"_npmVersion":"10.8.2","description":"High-performance QR code scanner for the web, powered by ZXing-C++ WebAssembly","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zxing-wasm":"2.2.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","jsdom":"25.0.1","sharp":"0.33.5","qrcode":"1.5.4","vitest":"3.2.4","typescript":"5.9.3","@types/node":"22.19.11","@types/qrcode":"1.5.6"},"_npmOperationalInternal":{"tmp":"tmp/qr-scanner_0.1.0_1771636940019_0.2562757405329965","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@agicash/qr-scanner","version":"0.1.1","keywords":["qr","qr-code","scanner","barcode","wasm","webassembly","zxing","camera"],"author":"","license":"MIT","_id":"@agicash/qr-scanner@0.1.1","maintainers":[{"name":"bobsy","email":"dev@agi.cash"},{"name":"josip_agicash","email":"josip@agi.cash"}],"homepage":"https://github.com/MakePrisms/qr-scanner#readme","bugs":{"url":"https://github.com/MakePrisms/qr-scanner/issues"},"dist":{"shasum":"5833972c2a4f21af478a5a71ddf3040fdcd711bf","tarball":"https://registry.npmjs.org/@agicash/qr-scanner/-/qr-scanner-0.1.1.tgz","fileCount":11,"integrity":"sha512-aEwgrw87eFixlYNFl2GFK0Fyvx82EBgQDxQ+K0ikqGLWd9+Yf6MnEWnsCQpkobnvlSu88DiVHcKddTo5k9sE6Q==","signatures":[{"sig":"MEUCICF6/ByA0imVNI4Jshek83XDCLO9CasIW8RVcVzzpNJpAiEA/u30o8xCHErUdqXA8d/2j94weAJ+v2ZCyFqht015/3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":373938},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./dist/worker.js":"./dist/worker.js"},"gitHead":"b9b560abb247a4eb3ca73dfcd06f808ea9637650","scripts":{"dev":"cd demo && vite","lint":"tsc --noEmit","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"josip_agicash","email":"josip@agi.cash"},"repository":{"url":"git+https://github.com/MakePrisms/qr-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"High-performance QR code scanner for the web, powered by ZXing-C++ WebAssembly","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zxing-wasm":"2.2.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","jsdom":"25.0.1","sharp":"0.33.5","qrcode":"1.5.4","vitest":"3.2.4","typescript":"5.9.3","@types/node":"22.19.11","@types/qrcode":"1.5.6"},"_npmOperationalInternal":{"tmp":"tmp/qr-scanner_0.1.1_1771673441522_0.9566356743807503","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@agicash/qr-scanner","version":"0.1.2","keywords":["qr","qr-code","scanner","barcode","wasm","webassembly","zxing","camera"],"author":"","license":"MIT","_id":"@agicash/qr-scanner@0.1.2","maintainers":[{"name":"bobsy","email":"dev@agi.cash"},{"name":"josip_agicash","email":"josip@agi.cash"}],"homepage":"https://github.com/MakePrisms/qr-scanner#readme","bugs":{"url":"https://github.com/MakePrisms/qr-scanner/issues"},"dist":{"shasum":"2274533044d8dc367af1dda859fd5781ac653613","tarball":"https://registry.npmjs.org/@agicash/qr-scanner/-/qr-scanner-0.1.2.tgz","fileCount":11,"integrity":"sha512-7qNJoDRqBbHSm12qZ1l0O2JDof0sXNiooebsCXGZOsJpCLBYF9bAJXuy/4Q/jFwbiH0knFZq8myRI5v6IFqpEQ==","signatures":[{"sig":"MEYCIQDmtaQN87sfOQl3yLxRxY9mu2SF+GvVrVbXsxuyTmPzuQIhAJo1ptNH9P+FTZJm+HZWflk0gRtFuOaWm5X5Aukgqpxa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":382979},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./dist/worker.js":"./dist/worker.js"},"gitHead":"f20e1787c687951fe491b510b8efca39130c77bf","scripts":{"dev":"cd demo && vite","lint":"tsc --noEmit","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"josip_agicash","email":"josip@agi.cash"},"repository":{"url":"git+https://github.com/MakePrisms/qr-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"High-performance QR code scanner for the web, powered by ZXing-C++ WebAssembly","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zxing-wasm":"2.2.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","jsdom":"25.0.1","sharp":"0.33.5","qrcode":"1.5.4","vitest":"3.2.4","typescript":"5.9.3","@types/node":"22.19.11","@types/qrcode":"1.5.6"},"_npmOperationalInternal":{"tmp":"tmp/qr-scanner_0.1.2_1772579164177_0.7739811592861152","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-02-21T01:22:19.923Z","modified":"2026-04-02T00:57:26.424Z","0.1.0":"2026-02-21T01:22:20.196Z","0.1.1":"2026-02-21T11:30:41.685Z","0.1.2":"2026-03-03T23:06:04.351Z"},"bugs":{"url":"https://github.com/MakePrisms/qr-scanner/issues"},"license":"MIT","homepage":"https://github.com/MakePrisms/qr-scanner#readme","keywords":["qr","qr-code","scanner","barcode","wasm","webassembly","zxing","camera"],"repository":{"url":"git+https://github.com/MakePrisms/qr-scanner.git","type":"git"},"description":"High-performance QR code scanner for the web, powered by ZXing-C++ WebAssembly","maintainers":[{"email":"dev@agi.cash","name":"bobsy"},{"email":"josip@agi.cash","name":"josip_agicash"},{"email":"damian@agi.cash","name":"damian-agicash"}],"readme":"# @agicash/qr-scanner\n\nHigh-performance QR code scanner for the web, powered by ZXing-C++ WebAssembly. Drop-in replacement for [nimiq/qr-scanner](https://github.com/nimiq/qr-scanner) with significantly better decoding of dense QR codes.\n\n## Features\n\n- **No forced downscale** - feeds high-resolution frames to the decoder (720-1080px+)\n- **WASM decoder** - ZXing-C++ compiled to WebAssembly, ~2x faster than pure-JS decoders\n- **Web Worker** - decoding runs off the main thread, keeping UI at 60fps\n- **`tryHarder` mode** - additional processing passes for hard-to-read codes\n\n## Installation\n\n```bash\nbun add @agicash/qr-scanner\n# or\nnpm install @agicash/qr-scanner\n```\n\n## Quick Start\n\n### Live Camera Scanner\n\n```ts\nimport QrScanner from '@agicash/qr-scanner';\n\nconst scanner = new QrScanner(videoElement, (result) => {\n  console.log(result.data);          // decoded string\n  console.log(result.cornerPoints);  // QR code corner positions\n}, {\n  highlightScanRegion: true,\n  highlightCodeOutline: true,\n});\n\nawait scanner.start();\n\n// Later...\nscanner.destroy();\n```\n\n### Scan a Single Image\n\n```ts\nimport QrScanner from '@agicash/qr-scanner';\n\nconst result = await QrScanner.scanImage(fileOrBlobOrUrl);\nconsole.log(result.data);\n```\n\n## API\n\n### Constructor\n\n```ts\nnew QrScanner(videoElement, onDecode, options?)\n```\n\n### Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `onDecodeError` | `(error) => void` | no-op | Called when no QR code found |\n| `calculateScanRegion` | `(video) => ScanRegion` | centered 2/3 square | Define the scan crop area |\n| `preferredCamera` | `'environment' \\| 'user' \\| string` | `'environment'` | Camera to use |\n| `maxScansPerSecond` | `number` | `15` | Max decode attempts per second |\n| `highlightScanRegion` | `boolean` | `false` | Show scan region overlay |\n| `highlightCodeOutline` | `boolean` | `false` | Highlight detected QR code |\n| `overlay` | `HTMLDivElement` | - | Custom overlay element |\n| `cameraResolution` | `object` | `{ width: { ideal: 1920 }, height: { ideal: 1080 } }` | Camera resolution |\n| `decoderOptions` | `Partial<ReaderOptions>` | - | zxing-wasm reader options |\n\n### Instance Methods\n\n```ts\nscanner.start(): Promise<void>\nscanner.stop(): void\nscanner.destroy(): void\nscanner.pause(stopStreamImmediately?): Promise<boolean>\nscanner.setCamera(facingModeOrDeviceId): Promise<void>\nscanner.hasFlash(): Promise<boolean>\nscanner.isFlashOn(): boolean\nscanner.toggleFlash(): Promise<void>\nscanner.turnFlashOn(): Promise<void>\nscanner.turnFlashOff(): Promise<void>\nscanner.setInversionMode(mode): void\n```\n\n### Static Methods\n\n```ts\nQrScanner.hasCamera(): Promise<boolean>\nQrScanner.listCameras(requestLabels?): Promise<Camera[]>\nQrScanner.scanImage(source, options?): Promise<ScanResult>\nQrScanner.preload(): Promise<void>\nQrScanner.configureWasm(overrides): void\nQrScanner.setWorkerUrl(url): void\nQrScanner.setDebug(enabled): void\n```\n\n## Debug Logging\n\nThe library includes performance profiling logs (camera acquisition timing, best-camera selection, etc.) that are **off by default**. Enable them at runtime for debugging:\n\n```ts\nQrScanner.setDebug(true);  // logs appear in console\nQrScanner.setDebug(false); // back to silent (default)\n```\n\n## Worker Loading\n\nThe library uses a Web Worker for off-thread QR decoding. The worker script (`dist/worker.js`) is resolved automatically by modern bundlers (Vite, webpack 5, Parcel) via `new URL('./worker.js', import.meta.url)`.\n\nFor CJS consumers or non-standard setups, set the worker URL manually:\n\n```ts\nQrScanner.setWorkerUrl('/assets/@agicash/qr-scanner/dist/worker.js');\n```\n\n## WASM Loading\n\nBy default, the WASM binary (~919 KB) loads from jsDelivr CDN. To self-host:\n\n```ts\nQrScanner.configureWasm({\n  locateFile: (filename) => `/wasm/${filename}`,\n});\n```\n\n## Migration from qr-scanner\n\n| qr-scanner | @agicash/qr-scanner |\n|------------|-----------------|\n| `returnDetailedScanResult: true` | Always returns `ScanResult` |\n| `ScanRegion.downScaledWidth/Height` | Removed - no downscaling |\n| `createQrEngine()` | Removed - engine is internal |\n| `setGrayscaleWeights()` | Removed - handled by WASM |\n| `DEFAULT_CANVAS_SIZE` | Removed - no canvas downscale |\n| Multiple constructor overloads | Single constructor |\n\n## Browser Support\n\nChrome 80+, Safari 16+, Firefox 80+, Edge 80+\n\n## License\n\nMIT\n","readmeFilename":"README.md"}