{"_id":"qr","_rev":"41-84605bf7258d2c5d27ecc65446d62bba","name":"qr","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"qr","version":"0.1.0","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"_id":"qr@0.1.0","dist":{"shasum":"e665b8e58d6d6887ed5ace0f506f5acefb90a622","tarball":"https://registry.npmjs.org/qr/-/qr-0.1.0.tgz","integrity":"sha512-kvBEXlVpYszkjz2pilYis//hU8BuHqFCRpWuz/FeJZ3KE11k2iTWIMcVAfH+pUsn8CwelrVBMxLCSlzdwGhz1Q==","signatures":[{"sig":"MEYCIQClkyNkmEH/bTYXDs/PZOzv81CTPAatzvy97P8ohr57JQIhANn75n6PV9RW9xORL0aHelN9H+1StWb5zsvFRzV5I+Ol","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","files":[""],"engines":{"node":">= 0.4.0"},"descrption":"A small library to generate QR codes with libqrencode.","repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"_npmVersion":"0.3.7","directories":{"lib":"./lib"},"_nodeVersion":"v0.4.1","dependencies":{"vows":">= 0.5.8"},"_defaultsLoaded":true,"_engineSupported":true},"0.1.1":{"name":"qr","version":"0.1.1","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"_id":"qr@0.1.1","dist":{"shasum":"5b96a62e8566cd5c4cd29dbe8ecbdd33c216ee48","tarball":"https://registry.npmjs.org/qr/-/qr-0.1.1.tgz","integrity":"sha512-y+m5yHYisvDyPR/LWhi1DfmI8uwDk9SjEK8z2uoGc+xXZN/IUim1b7qyIMQk8j0rRDIpBxn9R2XVz/wEcidNmQ==","signatures":[{"sig":"MEUCIEFOl4pCoFk5CBCSmd6MpM9Po4eLGjJpvWfHggHpUx27AiEAo+maH0YJwnTQjcy7Ub0IHWcXZVdBTSw3sIQk1Q1bviY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","files":[""],"engines":{"node":">= 0.4.0"},"repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"_npmVersion":"0.3.7","description":"A small library to generate QR codes with libqrencode.","directories":{"lib":"./lib"},"_nodeVersion":"v0.4.1","dependencies":{"vows":">= 0.5.8"},"_defaultsLoaded":true,"_engineSupported":true},"0.1.2":{"name":"qr","version":"0.1.2","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"license":{"url":"http://www.opensource.org/licenses/mit-license.php","type":"MIT"},"_id":"qr@0.1.2","homepage":"https://github.com/bcelenza/node-qr","dist":{"shasum":"836b2f1ac5c0fba70295bc0f5135922e1a6f3ecc","tarball":"https://registry.npmjs.org/qr/-/qr-0.1.2.tgz","integrity":"sha512-C2HXmBFhSW4sUUjyRYrZCoTmw15Ec1wzJCFi+wrSLX3VQwrgjXh1OJgX1Dhnoy0zX4Wf4jyynsotM4CPHYLR/g==","signatures":[{"sig":"MEQCIBRf1w3aYBAX0yoH9ves5gnTVdL3Y177LvATXHYGYDDDAiBFe+QF+gXKw7I63U4PqqnYTlTwVbD4GL8L13ouWoNwOw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","files":[""],"engines":{"node":">= 0.4.0"},"repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"_npmVersion":"0.3.7","description":"A small library to generate QR codes with libqrencode.","directories":{"lib":"./lib"},"_nodeVersion":"v0.4.1","dependencies":{"vows":">= 0.5.8"},"_defaultsLoaded":true,"_engineSupported":true},"0.1.3":{"name":"qr","version":"0.1.3","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"license":{"url":"http://www.opensource.org/licenses/mit-license.php","type":"MIT"},"_id":"qr@0.1.3","homepage":"https://github.com/bcelenza/node-qr","dist":{"shasum":"7e0ad3938c34aa622c86987b701d96e336791ad3","tarball":"https://registry.npmjs.org/qr/-/qr-0.1.3.tgz","integrity":"sha512-7/ruDPlcBtzYRHFqQ4afP+0bFtg99a3xTXc44EicwVt07mGP91y/dyHHT1Aml6bxSBVOxmlDOvR4Qt8yBIKwHA==","signatures":[{"sig":"MEUCIQD6rbVhpVUIqo0ck4m2asgYxgxLRgeGyyTOrcVONB8t1gIgT0HRQwllFFv6+km5jo0fMe7bEdAlPgbl0KSFMJzKE9E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","files":[""],"engines":{"node":">= 0.4.0"},"repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"_npmVersion":"0.3.7","description":"A small library to generate QR codes with libqrencode.","directories":{"lib":"./lib"},"_nodeVersion":"v0.4.1","dependencies":{"vows":">= 0.5.8"},"_defaultsLoaded":true,"_engineSupported":true},"0.1.4":{"name":"qr","version":"0.1.4","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"license":{"url":"http://www.opensource.org/licenses/mit-license.php","type":"MIT"},"_id":"qr@0.1.4","homepage":"https://github.com/bcelenza/node-qr","dist":{"shasum":"1253d358c8554da815565502ad4fafddce0b5616","tarball":"https://registry.npmjs.org/qr/-/qr-0.1.4.tgz","integrity":"sha512-JmqjiGdK9gdSYsjOqx1mF3VCmrmM+K1d+FdrccZN1hVXhu64hO7O17N2BVWUR5JcJa4hww1fAFDYpGVR+oJGJA==","signatures":[{"sig":"MEUCIANGDoeQHot9fq3xhwJ/baY3PBRu0/6byBuAJQrhIvddAiEA/hactf3mSJ7m7NyVUXfDCalhfv4lh0tnvEWTzIGKhdI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","files":[""],"engines":{"node":">= 0.4.0"},"repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"_npmVersion":"0.3.7","description":"A small library to generate QR codes with libqrencode.","directories":{"lib":"./lib"},"_nodeVersion":"v0.4.1","dependencies":{"vows":">= 0.5.8"},"_defaultsLoaded":true,"_engineSupported":true},"0.1.5":{"name":"qr","version":"0.1.5","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"license":{"url":"http://www.opensource.org/licenses/mit-license.php","type":"MIT"},"_id":"qr@0.1.5","maintainers":[{"name":"bcelenza","email":"bcelenza@gmail.com"}],"homepage":"https://github.com/bcelenza/node-qr","dist":{"shasum":"9276299c026190c0222da1d7788a3021248d26a0","tarball":"https://registry.npmjs.org/qr/-/qr-0.1.5.tgz","integrity":"sha512-LrZE0Q1xIIGXGH5phjgsiMCzeoS1Yi6R1hlVnrjyn6BXZuiVc5+BvTwieUa7eLhw+PPP5qpX09i99P53dBTTrw==","signatures":[{"sig":"MEYCIQCPIamgbK0xDSSnOZWQCbNh9xj9kBQAWnT62++HQvMn9wIhAMQ7lgY/QR1bAUTJoF+Lktq1V/FhD++yPM3dTbz8wYnJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","engines":{"node":">= 0.4.0"},"scripts":{"test":"vows --spec test/*.js"},"repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"description":"A small library to generate QR codes with libqrencode.","directories":{},"dependencies":{"vows":">= 0.5.8","benchmark":""}},"0.1.6":{"name":"qr","version":"0.1.6","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"license":{"url":"http://www.opensource.org/licenses/mit-license.php","type":"MIT"},"_id":"qr@0.1.6","maintainers":[{"name":"bcelenza","email":"bcelenza@gmail.com"}],"homepage":"https://github.com/bcelenza/node-qr","dist":{"shasum":"fa5512c8981fffe14481dc6836c2a4f050a5d29f","tarball":"https://registry.npmjs.org/qr/-/qr-0.1.6.tgz","integrity":"sha512-hC7+Igon5+DwaKJJjqHhun6ntixtAqmtx/e9QNhEmsOijtkCv5BKy1tQ1IYpZwREeuC5mDT7BkYxqv5/KPQqkQ==","signatures":[{"sig":"MEUCIQD6GqPYZFVSRAfyBcCja+z6hU49+gZs4xngyeb4raj9zAIgUatY20VpN2Hx34xi1U8CO0IDvydFStZ2FXQIgLDV19c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","engines":{"node":">= 0.4.0"},"scripts":{"test":"vows --spec test/*.js"},"repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"description":"A small library to generate QR codes with libqrencode.","directories":{},"dependencies":{"vows":">= 0.5.8","benchmark":""}},"0.2.0":{"name":"qr","version":"0.2.0","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"license":{"url":"http://www.opensource.org/licenses/mit-license.php","type":"MIT"},"_id":"qr@0.2.0","maintainers":[{"name":"bcelenza","email":"bcelenza@gmail.com"}],"homepage":"https://github.com/bcelenza/node-qr","dist":{"shasum":"87f182f426350e56f184e2d6353ec5691c6596a5","tarball":"https://registry.npmjs.org/qr/-/qr-0.2.0.tgz","integrity":"sha512-9pdHCgUs2zm3E2k4vs/nHbvvVJ3iqtIysz1meACVQmNid4UwBT+DUf9b8p3LX2TmxW9hgKvjCN7RjZGTcjbd0w==","signatures":[{"sig":"MEYCIQDLrHDtDOAkGAQlZ+MUqxnAG9tmD/nTmmx2oyxvvthkGQIhAJsg9DcU9VRY/gMLHKVWKPjPjkxqYItSuCa09m+nEeVy","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","engines":{"node":">= 0.4.0"},"scripts":{"test":"vows --spec test/*.js"},"repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"description":"A small library to generate QR codes with libqrencode.","directories":{},"dependencies":{"vows":">= 0.5.8","benchmark":""}},"0.2.1":{"name":"qr","version":"0.2.1","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"license":{"url":"http://www.opensource.org/licenses/mit-license.php","type":"MIT"},"_id":"qr@0.2.1","maintainers":[{"name":"bcelenza","email":"bcelenza@gmail.com"}],"homepage":"https://github.com/bcelenza/node-qr","dist":{"shasum":"a6c5bd789f624bc18fa9458bc8515d3bdb9983bd","tarball":"https://registry.npmjs.org/qr/-/qr-0.2.1.tgz","integrity":"sha512-6YmSNfkQVd8mciiuDGz0xRVnCjnqinSeTmAFn+o/o63iROWXM3lLrLwJTkvDWd2uDbH1s4xK+GntLERAyGF69w==","signatures":[{"sig":"MEQCIFHnJnV2aKJZETu7XODAz15oA/mxTTozvADrg7xhOuNUAiB9FC3s4dxk06PaRKVjqDNAVQXXdxhSsWeUmV7U8T6SJQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","_from":".","engines":{"node":">= 0.4.0"},"scripts":{"test":"vows --spec test/*.js"},"_npmUser":{"name":"bcelenza","email":"bcelenza@gmail.com"},"repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"_npmVersion":"1.2.14","description":"A small library to generate QR codes with libqrencode.","directories":{},"dependencies":{"vows":">= 0.5.8","benchmark":""}},"0.2.2":{"name":"qr","version":"0.2.2","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"license":{"url":"http://www.opensource.org/licenses/mit-license.php","type":"MIT"},"_id":"qr@0.2.2","maintainers":[{"name":"bcelenza","email":"bcelenza@gmail.com"}],"homepage":"https://github.com/bcelenza/node-qr","dist":{"shasum":"af6d62bf51a4cd15bfb90c458e2cbe6c83c31761","tarball":"https://registry.npmjs.org/qr/-/qr-0.2.2.tgz","integrity":"sha512-CacDgvARqsrw9eEm3+TjFtY1ikDisJUE9+mwHeQSWZfhvkQnkSJD6ivb24Ikxk8OBX56+rJNIhISPUH258z0AQ==","signatures":[{"sig":"MEYCIQC1DfN8M7xdtAtAtYr05UBarvsisifdwzVjdztlVehEOgIhAKgckUyJjRpVzwckRa9LDjZmuPgPB+pnkyvkikjMWMLH","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","_from":".","engines":{"node":">= 0.4.0"},"scripts":{"test":"vows --spec test/*.js"},"_npmUser":{"name":"bcelenza","email":"bcelenza@gmail.com"},"repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"_npmVersion":"1.2.14","description":"A small library to generate QR codes with libqrencode.","directories":{},"dependencies":{"vows":">= 0.5.8","benchmark":""}},"0.2.3":{"name":"qr","version":"0.2.3","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"license":{"url":"http://www.opensource.org/licenses/mit-license.php","type":"MIT"},"_id":"qr@0.2.3","maintainers":[{"name":"bcelenza","email":"bcelenza@gmail.com"}],"homepage":"https://github.com/bcelenza/node-qr","dist":{"shasum":"ba5d12f40a7a172b8b6c8d0f830fce0a0a821288","tarball":"https://registry.npmjs.org/qr/-/qr-0.2.3.tgz","integrity":"sha512-96/F0ZAD4yw6Zw6ZbzskFlcbrG7WcQFjUFb2/KcQBGik9PHRRbor5O/TDD44/aDtkp+YLOQshBCcYTQguQD86A==","signatures":[{"sig":"MEUCIHnBsLJ7DeoGQhERPCaPhyhCGiHyrHVWzMDXGiAVPDwkAiEA2p5qMF91RCIaTVwh/iC4SMVDGfcAoL7Fo4tyDUtk7J4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","_from":".","engines":{"node":">= 0.8.0"},"scripts":{"test":"vows --spec test/*.js"},"_npmUser":{"name":"bcelenza","email":"bcelenza@gmail.com"},"repository":{"url":"git://github.com/bcelenza/node-qr.git","type":"git"},"_npmVersion":"1.2.14","description":"A small library to generate QR codes with libqrencode.","directories":{},"dependencies":{"vows":">= 0.5.8","benchmark":""}},"0.2.4":{"name":"qr","version":"0.2.4","keywords":["qr","qrcode","qrencode","qrencoder"],"author":{"name":"Brian Celenza","email":"bcelenza@gmail.com"},"license":{"url":"http://www.opensource.org/licenses/mit-license.php","type":"MIT"},"_id":"qr@0.2.4","maintainers":[{"name":"bcelenza","email":"bcelenza@gmail.com"}],"homepage":"https://github.com/heavyco/node-qr","bugs":{"url":"https://github.com/heavyco/node-qr/issues"},"dist":{"shasum":"abb1397fe284b384e118f5fb7a6a2508ed6217b3","tarball":"https://registry.npmjs.org/qr/-/qr-0.2.4.tgz","integrity":"sha512-VYJPIc6ofakgKX6NC0ZOoLMfMf3sb60DbVYxz+7rV+dv603GY4AZulWPsM7ijNGUTJKVt/QMEwOfdaM7fFPSpg==","signatures":[{"sig":"MEQCIG3GFc9oaYZ28M7s59/uEmxTZ/+0m9nU9zoT/Cnhp7S8AiA9Hitv9/XqfU8ogGtn7ClnYsHFvmXM+ehjf/2Zs+Gebw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"./qr.js","_from":".","_shasum":"abb1397fe284b384e118f5fb7a6a2508ed6217b3","engines":{"node":">= 0.8.0"},"gitHead":"fd7f4665ffaf72e4fd71c6956a975eb2758b9e73","scripts":{"test":"vows --spec test/*.js"},"_npmUser":{"name":"bcelenza","email":"bcelenza@gmail.com"},"repository":{"url":"git://github.com/heavyco/node-qr.git","type":"git"},"_npmVersion":"1.5.0-alpha-1","description":"A small library to generate QR codes with libqrencode.","directories":{},"dependencies":{"vows":">= 0.5.8","benchmark":""}},"0.4.0":{"name":"qr","version":"0.4.0","keywords":["qr","code","qr code","qr pattern","qr generator","qr reader","ascii","gif","svg","camera","file"],"author":{"url":"https://paulmillr.com","name":"Paul Miller"},"license":"(MIT OR Apache-2.0)","_id":"qr@0.4.0","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"homepage":"https://github.com/paulmillr/qr","bugs":{"url":"https://github.com/paulmillr/qr/issues"},"dist":{"shasum":"505ef6d99eb51f64e13b61c55d14a92b73106099","tarball":"https://registry.npmjs.org/qr/-/qr-0.4.0.tgz","fileCount":26,"integrity":"sha512-Edzwf8GAVJzEIjqPuMHnjwTniwhS92daMuROspUn4ssyYDB1c+AqWSP8Sx+1MJNfBb0+ePykQYWY7PykXZAuuA==","signatures":[{"sig":"MEUCIEmOnzuF8XFHbE5SrjVyMHx26mmX2OhJeOySgFMzecTsAiEA3VFWvWezh5TF0oY1Z5oVEeDwRGZXKvLxr3Fao7Wm1k8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":357399},"main":"index.js","types":"index.d.ts","module":"index.js","exports":{".":{"import":"./esm/index.js","require":"./index.js"},"./dom.js":{"import":"./esm/dom.js","require":"./dom.js"},"./decode.js":{"import":"./esm/decode.js","require":"./decode.js"}},"funding":"https://paulmillr.com/funding/","gitHead":"017845e9990f7a752f769ccb6c70fac4f4caa560","scripts":{"lint":"prettier --check src","test":"node test/index.js","build":"tsc && tsc -p tsconfig.cjs.json","format":"prettier --write src","test:bun":"bun test/index.js","test:deno":"deno --allow-env --allow-read test/index.js","build:release":"npx jsbt esbuild test/build"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"repository":{"url":"git+https://github.com/paulmillr/qr.git","type":"git"},"_npmVersion":"10.9.2","description":"Minimal 0-dep QR code generator & reader. Supports ascii, term, gif and svg formats","directories":{},"sideEffects":false,"_nodeVersion":"23.6.1","_hasShrinkwrap":false,"devDependencies":{"omggif":"1.0.10","jpeg-js":"0.4.4","prettier":"3.5.2","typescript":"5.8.2","micro-bmark":"0.4.0","micro-should":"0.5.1","@paulmillr/jsbt":"0.3.3"},"_npmOperationalInternal":{"tmp":"tmp/qr_0.4.0_1742744065882_0.17909197720571135","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"qr","version":"0.4.2","keywords":["qr","code","qr code","qr pattern","qr generator","qr reader","ascii","gif","svg","camera","file"],"author":{"url":"https://paulmillr.com","name":"Paul Miller"},"license":"(MIT OR Apache-2.0)","_id":"qr@0.4.2","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"homepage":"https://github.com/paulmillr/qr","bugs":{"url":"https://github.com/paulmillr/qr/issues"},"dist":{"shasum":"6cc5da4bbe9d1dbc1cb3bf76e3e18abd95e59c98","tarball":"https://registry.npmjs.org/qr/-/qr-0.4.2.tgz","fileCount":26,"integrity":"sha512-wCv4rt7IcPNGT0J8JiTBHx7YrZzYuzpof38y/MFYd5Sp7OTyAFYL1e110In8PrAG/ffIOVl1ha3joJ2zpYxKMQ==","signatures":[{"sig":"MEUCIQCzHybwp+jgR+HnxtLLSvY3Oxdka+bbFu3uQo9zF5zx4gIgUegviSwSWo47My/nGS1SGDYatCTIunJJ57j85aHEgBs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/qr@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":363382},"main":"index.js","types":"index.d.ts","module":"index.js","exports":{".":{"import":"./esm/index.js","require":"./index.js"},"./dom.js":{"import":"./esm/dom.js","require":"./dom.js"},"./decode.js":{"import":"./esm/decode.js","require":"./decode.js"}},"funding":"https://paulmillr.com/funding/","gitHead":"dd9c27219f6743520b5fee8ef1e337d2da472ae6","scripts":{"lint":"prettier --check src","test":"cd test; npm ci; node index.js","build":"tsc && tsc -p tsconfig.cjs.json","format":"prettier --write src","test:bun":"cd test; bun install; bun index.js","test:deno":"cd test; npm install; deno --allow-env --allow-read index.js","build:release":"npx jsbt esbuild test/build"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"repository":{"url":"git+https://github.com/paulmillr/qr.git","type":"git"},"_npmVersion":"10.9.2","description":"Minimal 0-dep QR code generator & reader. Supports ascii, term, gif and svg formats","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"3.5.3","typescript":"5.8.3","micro-bmark":"0.4.1","micro-should":"0.5.2","@paulmillr/jsbt":"0.3.3"},"_npmOperationalInternal":{"tmp":"tmp/qr_0.4.2_1745590940772_0.7756554223352483","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"qr","version":"0.5.0","keywords":["qr","code","qr code","qr pattern","qr generator","qr reader","ascii","gif","svg","camera","file"],"author":{"url":"https://paulmillr.com","name":"Paul Miller"},"license":"(MIT OR Apache-2.0)","_id":"qr@0.5.0","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"homepage":"https://github.com/paulmillr/qr","bugs":{"url":"https://github.com/paulmillr/qr/issues"},"dist":{"shasum":"fa5712a355b21044073ef63311a18901f70ac6e1","tarball":"https://registry.npmjs.org/qr/-/qr-0.5.0.tgz","fileCount":16,"integrity":"sha512-LtnyJsepKCMzfmHBZKVNo1g29kS+8ZbuxE9294EsRhHgVVpy4x8eFw9o4J9SIolDHoDYuaEIY+z8UjiCv/eudA==","signatures":[{"sig":"MEUCID+7Hi7KYrLfAft6Hi4JBmU6xlhGsCKFMu6272Q/BNMeAiEA0Psa0nUq88ixr8R8vDxvWl3brNLO+7hd/t47+QYRZsw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/qr@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":232271},"main":"index.js","type":"module","types":"index.d.ts","module":"index.js","engines":{"node":">= 20.19.0"},"funding":"https://paulmillr.com/funding/","gitHead":"20bae9e7f5c1002619d1276f6c865c7450950be7","scripts":{"lint":"prettier --check src","test":"cd test; npm ci; node --experimental-strip-types --no-warnings index.ts","bench":"cd test/benchmark && npm ci && node index.ts","build":"tsc","format":"prettier --write src","test:bun":"cd test; bun install; bun index.ts","test:deno":"cd test; npm install; deno --allow-env --allow-read index.ts","test:node20":"cd test; npx tsc; cd compiled/test; npm install; node index.js","build:release":"npx jsbt esbuild test/build"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"repository":{"url":"git+https://github.com/paulmillr/qr.git","type":"git"},"_npmVersion":"10.9.2","description":"Minimal 0-dep QR code generator & reader. Supports ascii, term, gif and svg formats","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"3.5.3","typescript":"5.8.3","@types/node":"22.15.23","micro-bmark":"0.4.1","micro-should":"0.5.3","@paulmillr/jsbt":"0.4.1"},"_npmOperationalInternal":{"tmp":"tmp/qr_0.5.0_1749061779148_0.3227909867000882","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"qr","version":"0.5.1","keywords":["qr","code","qr code","qr pattern","qr generator","qr reader","ascii","gif","svg","camera","file"],"author":{"url":"https://paulmillr.com","name":"Paul Miller"},"license":"(MIT OR Apache-2.0)","_id":"qr@0.5.1","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"homepage":"https://github.com/paulmillr/qr","bugs":{"url":"https://github.com/paulmillr/qr/issues"},"dist":{"shasum":"49e091b8400ec5e5d347fe3c5133ac5cf0cdef32","tarball":"https://registry.npmjs.org/qr/-/qr-0.5.1.tgz","fileCount":19,"integrity":"sha512-bBqlLzOJFhyj0RoeLTl9wZLUaEmVMlsAp8huBAZnRHJfhfbcIg9n2XWf/Qga3vnyzvfTh9Tqz7OcoOulTAT8RA==","signatures":[{"sig":"MEUCIQDjoKXrpmOqkezqFepkQ2a9Q6QaIxnx5YN3gWmsPMclawIgHgIbJSXELxYkQewKvv8Q8gROqoOb3r2AwS9h0XdF0vQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/qr@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":339813},"main":"index.js","type":"module","types":"index.d.ts","module":"index.js","engines":{"node":">= 20.19.0"},"gitHead":"695bf33196f802ec07661fc07572c3c2d30c6b6a","scripts":{"test":"cd test; npm ci; node --experimental-strip-types --no-warnings index.ts","bench":"cd test/benchmark && npm ci && node index.ts","build":"tsc","format":"prettier --write src","test:bun":"cd test; bun install; bun index.ts","test:deno":"cd test; npm install; deno --allow-env --allow-read index.ts","test:node20":"cd test; npx tsc; cd compiled/test; npm install; node index.js","build:release":"npx --no @paulmillr/jsbt esbuild test/build"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"repository":{"url":"git+https://github.com/paulmillr/qr.git","type":"git"},"_npmVersion":"11.5.1","description":"Minimal 0-dep QR code generator & reader. Supports ascii, term, gif and svg formats","directories":{},"sideEffects":false,"_nodeVersion":"24.6.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"3.6.2","typescript":"5.9.2","@types/node":"24.2.1","@paulmillr/jsbt":"0.4.3"},"_npmOperationalInternal":{"tmp":"tmp/qr_0.5.1_1755711834142_0.8653297562593658","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"qr","version":"0.5.2","keywords":["qr","code","qr code","qr pattern","qr generator","qr reader","ascii","gif","svg","camera","file"],"author":{"url":"https://paulmillr.com","name":"Paul Miller"},"license":"(MIT OR Apache-2.0)","_id":"qr@0.5.2","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"homepage":"https://github.com/paulmillr/qr","bugs":{"url":"https://github.com/paulmillr/qr/issues"},"dist":{"shasum":"3568c2e8e159fce07b23c707b000e356f5e3b95b","tarball":"https://registry.npmjs.org/qr/-/qr-0.5.2.tgz","fileCount":19,"integrity":"sha512-91M3sVlA7xCFpkJtYX5xzVH8tDo4rNZ7jr8v+1CRgPVkZ4D+Vl9y8rtZWJ/YkEUM6U/h0FAu5W/JAK7iowOteA==","signatures":[{"sig":"MEUCIQDQl9azFLkboBJXxOb71+HJek7z9yvEgt9U2bDN+qBmeAIgdELol2BTCVw16fMZmVwW4DOm97kLbVuLm8SA54C4zBs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/qr@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":339917},"main":"index.js","type":"module","types":"index.d.ts","module":"index.js","engines":{"node":">= 20.19.0"},"exports":{".":"./index.js","./dom.js":"./dom.js","./decode.js":"./decode.js"},"gitHead":"7afbebab1187af5176a541a070e5db8f2f008edd","scripts":{"test":"cd test; npm ci; node --experimental-strip-types --no-warnings index.ts","bench":"cd test/benchmark && npm ci && node index.ts","build":"tsc","format":"prettier --write src","test:bun":"cd test; bun install; bun index.ts","test:deno":"cd test; npm install; deno --allow-env --allow-read index.ts","test:node20":"cd test; npx tsc; cd compiled/test; npm install; node index.js","build:release":"npx --no @paulmillr/jsbt esbuild test/build"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"repository":{"url":"git+https://github.com/paulmillr/qr.git","type":"git"},"_npmVersion":"11.5.1","description":"Minimal 0-dep QR code generator & reader. Supports ascii, term, gif and svg formats","directories":{},"sideEffects":false,"_nodeVersion":"24.6.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"3.6.2","typescript":"5.9.2","@types/node":"24.2.1","@paulmillr/jsbt":"0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/qr_0.5.2_1758187510147_0.7369158312501032","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"qr","version":"0.5.3","keywords":["qr","code","qr code","qr pattern","qr generator","qr reader","ascii","gif","svg","camera","file"],"author":{"url":"https://paulmillr.com","name":"Paul Miller"},"license":"(MIT OR Apache-2.0)","_id":"qr@0.5.3","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"homepage":"https://github.com/paulmillr/qr","bugs":{"url":"https://github.com/paulmillr/qr/issues"},"dist":{"shasum":"9a76e900b58b45106ec446614a05793e1a29480f","tarball":"https://registry.npmjs.org/qr/-/qr-0.5.3.tgz","fileCount":19,"integrity":"sha512-BSrGdNXa8z6PfEYWtvITV21mQ4asR4UCj38Fa3MUUoFAtYzFK/swEQXF+OeBuNbHPFfs3PzpZuK0BXizWXgFOQ==","signatures":[{"sig":"MEQCICpqNsXLJTR10kbmCOGx9/Lp4TCvvixHFrkhelqXCr5rAiB4qpNTOPZJDP5FdUVxQXDdiz0quNe/JWQ6hBq7bE0w/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/qr@0.5.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":350444},"main":"index.js","type":"module","types":"index.d.ts","module":"index.js","engines":{"node":">= 20.19.0"},"exports":{".":"./index.js","./dom.js":"./dom.js","./decode.js":"./decode.js"},"gitHead":"6c566c1dc50e6982e57236446a4fd2eb46b45015","scripts":{"test":"cd test; npm ci; node --experimental-strip-types --no-warnings index.ts","bench":"cd test/benchmark && npm ci && node index.ts","build":"tsc","format":"prettier --write src","test:bun":"cd test; bun install; bun index.ts","test:deno":"cd test; npm install; deno --allow-env --allow-read index.ts","test:node20":"cd test; npx tsc; cd compiled/test; npm install; node index.js","build:release":"npx --no @paulmillr/jsbt esbuild test/build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:605501dc-2a0f-4a0f-bec2-20e93399ff08"}},"repository":{"url":"git+https://github.com/paulmillr/qr.git","type":"git"},"_npmVersion":"11.6.1","description":"Minimal 0-dep QR code generator & reader. Supports ascii, term, gif and svg formats","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"3.6.2","typescript":"5.9.2","@types/node":"24.2.1","@paulmillr/jsbt":"0.4.5"},"_npmOperationalInternal":{"tmp":"tmp/qr_0.5.3_1764548940475_0.7324248527082518","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"qr","version":"0.5.4","keywords":["qr","code","qr code","qr pattern","qr generator","qr reader","ascii","gif","svg","camera","file"],"author":{"url":"https://paulmillr.com","name":"Paul Miller"},"license":"(MIT OR Apache-2.0)","_id":"qr@0.5.4","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"homepage":"https://github.com/paulmillr/qr","bugs":{"url":"https://github.com/paulmillr/qr/issues"},"dist":{"shasum":"ef1e53b760430cd803c2486d0e11121098b904bc","tarball":"https://registry.npmjs.org/qr/-/qr-0.5.4.tgz","fileCount":19,"integrity":"sha512-gjVMHOt7CX+BQd7JLQ9fnS4kJK4Lj4u+Conq52tcCbW7YH3mATTtBbTMA+7cQ1rKOkDo61olFHJReawe+XFxIA==","signatures":[{"sig":"MEUCID96ZEjICBH10ekr0+vhjg+1DUNF0xyoVHJC7DIkdTWxAiEAjHQv4SUmc2kiYB2WM2RqP4NFs6RePtmrWZM8dm2zRkI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/qr@0.5.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":384526},"main":"index.js","type":"module","types":"index.d.ts","module":"index.js","engines":{"node":">= 20.19.0"},"exports":{".":"./index.js","./dom.js":"./dom.js","./decode.js":"./decode.js"},"gitHead":"a3abe543cc26a82267960226f235c6b19093d4dc","scripts":{"test":"cd test; npm ci; node --experimental-strip-types --no-warnings index.ts","bench":"cd test/benchmark && npm ci && node index.ts","build":"tsc","format":"prettier --write src","test:bun":"cd test; bun install; bun index.ts","test:deno":"cd test; npm install; deno --allow-env --allow-read index.ts","test:node20":"cd test; npx tsc; cd compiled/test; npm install; node index.js","build:release":"npx --no @paulmillr/jsbt esbuild test/build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:605501dc-2a0f-4a0f-bec2-20e93399ff08"}},"repository":{"url":"git+https://github.com/paulmillr/qr.git","type":"git"},"_npmVersion":"11.6.1","description":"Minimal 0-dep QR code generator & reader. Supports ascii, term, gif and svg formats","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"3.6.2","typescript":"5.9.2","@types/node":"24.2.1","@paulmillr/jsbt":"0.4.5"},"_npmOperationalInternal":{"tmp":"tmp/qr_0.5.4_1768104334523_0.752553719848432","host":"s3://npm-registry-packages-npm-production"}},"0.5.5":{"name":"qr","version":"0.5.5","keywords":["qr","code","qr code","qr pattern","qr generator","qr reader","ascii","gif","svg","camera","file"],"author":{"url":"https://paulmillr.com","name":"Paul Miller"},"license":"(MIT OR Apache-2.0)","_id":"qr@0.5.5","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"homepage":"https://github.com/paulmillr/qr","bugs":{"url":"https://github.com/paulmillr/qr/issues"},"dist":{"shasum":"0fbe55a97a8641b04ace23d3a07052f8db7d8827","tarball":"https://registry.npmjs.org/qr/-/qr-0.5.5.tgz","fileCount":19,"integrity":"sha512-iQBvKj7MRKO+co+MY0IZpyLO+ezvttxsmV86WywrgPuAmgBkv0pytyi03wourniSoPgzffeBW6cBgIkpqcvjTg==","signatures":[{"sig":"MEUCIAso9+7or++ZlzkwmQBHqLWBw8YSOkc8FCTbboopznTYAiEA+OzX2FowfT6G670TL0SIrpbEluWOOvWQqDH2pmTzjHg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/qr@0.5.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":429711},"main":"index.js","type":"module","types":"index.d.ts","module":"index.js","engines":{"node":">= 20.19.0"},"exports":{".":"./index.js","./dom.js":"./dom.js","./decode.js":"./decode.js"},"gitHead":"d1375960745a090d5e59c8d5b86b4d00cf88e883","scripts":{"test":"cd test; npm ci; node --experimental-strip-types --no-warnings index.ts","bench":"cd test/benchmark && npm ci && node index.ts","build":"tsc","format":"prettier --write src","test:bun":"cd test; bun install; bun index.ts","test:deno":"cd test; npm install; deno --allow-env --allow-read index.ts","test:node20":"cd test; npx tsc; cd compiled/test; npm install; node index.js","build:release":"npx --no @paulmillr/jsbt esbuild test/build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:605501dc-2a0f-4a0f-bec2-20e93399ff08"}},"repository":{"url":"git+https://github.com/paulmillr/qr.git","type":"git"},"_npmVersion":"11.6.1","description":"Minimal 0-dep QR code generator & reader. Supports ascii, term, gif and svg formats","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"3.6.2","typescript":"5.9.2","@types/node":"24.2.1","@paulmillr/jsbt":"0.4.5"},"_npmOperationalInternal":{"tmp":"tmp/qr_0.5.5_1772884043896_0.19849426895556754","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"qr","version":"0.6.0","description":"Minimal 0-dep QR code generator & reader. Supports ascii, term, gif and svg formats","devDependencies":{"@paulmillr/jsbt":"0.5.0","@types/node":"25.3.0","prettier":"3.6.2","typescript":"6.0.2"},"scripts":{"build":"tsc","build:release":"npx --no @paulmillr/jsbt esbuild test/build","check":"npx --no @paulmillr/jsbt check package.json","check:readme":"npx --no @paulmillr/jsbt readme package.json","check:treeshake":"npx --no @paulmillr/jsbt treeshake package.json test/build/out-treeshake","check:jsdoc":"npx --no @paulmillr/jsbt tsdoc package.json","bench":"cd test/benchmark && npm ci && node index.ts","format":"prettier --write src","test":"cd test; npm ci; node --experimental-strip-types --no-warnings index.ts","test:bun":"cd test; bun install; bun index.ts","test:deno":"cd test; npm install; deno --allow-env --allow-read index.ts","test:node20":"cd test; npx tsc; cd compiled/test; npm install; node index.js"},"exports":{".":"./index.js","./decode.js":"./decode.js","./dom.js":"./dom.js"},"engines":{"node":">= 20.19.0"},"keywords":["qr","code","qr code","qr pattern","qr generator","qr reader","ascii","gif","svg","camera","file"],"homepage":"https://github.com/paulmillr/qr","repository":{"type":"git","url":"git+https://github.com/paulmillr/qr.git"},"type":"module","main":"index.js","module":"index.js","types":"index.d.ts","sideEffects":false,"author":{"name":"Paul Miller","url":"https://paulmillr.com"},"license":"(MIT OR Apache-2.0)","gitHead":"260ea4689bf8921a8585fe3926ec70f11de70fb6","_id":"qr@0.6.0","bugs":{"url":"https://github.com/paulmillr/qr/issues"},"_nodeVersion":"24.11.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-P23VoX7SipHALdiIYG+D+LT/6n22dNKwV92FAb3d+Nlki/5WisSsfLt0UDFz2XEBtuwrECTznvu+chKKFCSYhA==","shasum":"00c3d080dc76adf5d3754d9ad7ff0f9263dee2e0","tarball":"https://registry.npmjs.org/qr/-/qr-0.6.0.tgz","fileCount":19,"unpackedSize":520808,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/qr@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCxuc6SyDm3P7NjVevSHZoSRk4VLccZsspnfkQ1iY/e6wIhAKCjIw3UJAnNJMh65q2UkqCQyZzzSRo5PiTsIFsIO71t"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:605501dc-2a0f-4a0f-bec2-20e93399ff08"}},"directories":{},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/qr_0.6.0_1777369001657_0.18187952970581867"},"_hasShrinkwrap":false}},"time":{"created":"2011-03-31T02:04:09.672Z","modified":"2026-04-28T09:36:42.129Z","0.1.0":"2011-03-31T02:04:09.839Z","0.1.1":"2011-03-31T02:05:30.417Z","0.1.2":"2011-03-31T02:48:15.391Z","0.1.3":"2011-03-31T20:38:34.901Z","0.1.4":"2011-04-01T03:23:33.242Z","0.1.5":"2012-10-04T17:32:05.742Z","0.1.6":"2013-03-17T22:30:48.263Z","0.2.0":"2013-03-17T22:40:44.387Z","0.2.1":"2013-12-05T23:58:15.143Z","0.2.2":"2013-12-06T00:06:13.684Z","0.2.3":"2013-12-14T00:02:34.346Z","0.2.4":"2015-02-10T19:46:14.183Z","0.4.0":"2025-03-23T15:34:26.079Z","0.4.2":"2025-04-25T14:22:20.975Z","0.5.0":"2025-06-04T18:29:39.355Z","0.5.1":"2025-08-20T17:43:54.332Z","0.5.2":"2025-09-18T09:25:10.351Z","0.5.3":"2025-12-01T00:29:00.675Z","0.5.4":"2026-01-11T04:05:34.667Z","0.5.5":"2026-03-07T11:47:24.091Z","0.6.0":"2026-04-28T09:36:41.792Z"},"bugs":{"url":"https://github.com/paulmillr/qr/issues"},"author":{"name":"Paul Miller","url":"https://paulmillr.com"},"license":"(MIT OR Apache-2.0)","homepage":"https://github.com/paulmillr/qr","keywords":["qr","code","qr code","qr pattern","qr generator","qr reader","ascii","gif","svg","camera","file"],"repository":{"type":"git","url":"git+https://github.com/paulmillr/qr.git"},"description":"Minimal 0-dep QR code generator & reader. Supports ascii, term, gif and svg formats","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"readme":"# paulmillr-qr\n\nMinimal 0-dependency QR code generator & reader.\n\n- 🔒 Auditable, 0-dependency\n- 🏎 [Fast](#speed): aims to be faster than all JS implementations\n- 🔍 Reliable: 100MB+ of extensive test vectors ensure correctness\n- 🏞️ Encoding (generating) supports ASCII, term, gif, svg and png codes\n- 📷 Decoding (reading) supports camera feed input, files and non-browser environments\n- 🪶 18KB (gzipped) for encoding + decoding, 9KB for encoding\n\nCheck out:\n\n- [paulmillr.com/apps/qr/](https://paulmillr.com/apps/qr/) - interactive demo\n- [qrBTF.com](https://qrbtf.com/en) - uses the library to generate custom, styled codes\n- [cuer](https://github.com/wevm/cuer) - React component based on the library\n- [metamask-sdk](https://github.com/MetaMask/metamask-sdk/blob/3d0ba19610853ec9259bb1aad459b1eaea799375/packages/sdk/package.json#L56) - is using the library\n\nWhy other libraries are less optimal:\n\n- [jsQR](https://github.com/cozmo/jsQR) is dead, [zxing-js](https://github.com/zxing-js/) is [dead](https://github.com/zxing-js/library/commit/b797504c25454db32aa2db410e6502b6db12a401), [qr-scanner](https://github.com/nimiq/qr-scanner/) uses jsQR and doesn't work outside of browser, [qcode-decoder](https://github.com/cirocosta/qcode-decoder) is broken version of jsQR and doesn't work outside of browser, [qrcode](https://github.com/nuintun/qrcode) is fork of jsQR without adoption\n- [instascan](https://github.com/schmich/instascan) is too big: over 1MB+ (it's zxing compiled to js via emscripten)\n\n## Usage\n\nA standalone file [qr.js](https://github.com/paulmillr/qr/releases) is also available.\n\n> `npm install qr`\n\n> `jsr add jsr:@paulmillr/qr`\n\n- [Encoding](#encoding)\n- [Decoding](#decoding)\n  - [Decoding options](#decoding-options)\n  - [Decoding algorithm](#decoding-algorithm)\n  - [Decoding test vectors](#decoding-test-vectors)\n  - [DOM helpers for web apps](#dom-helpers-for-web-apps)\n- [Using with Kotlin](#using-with-kotlin)\n- [Security](#security)\n- [Speed](#speed)\n\n## Encoding\n\n```ts\nimport encodeQR from 'qr';\n\n// import decodeQR from 'qr/decode.js';\n// See separate README section for decoding.\n\nconst txt = 'Hello world';\nconst ascii = encodeQR(txt, 'ascii'); // Not all fonts are supported\nconst terminalFriendly = encodeQR(txt, 'term'); // 2x larger, all fonts are OK\nconst gifBytes = encodeQR(txt, 'gif'); // Uncompressed GIF\nconst svgElement = encodeQR(txt, 'svg'); // SVG vector image element\nconst array = encodeQR(txt, 'raw'); // 2d array for canvas or other libs\n// import { svgToPng } from 'qr/dom.js';\n// const png = svgToPng(svgElement, 512, 512); // .png, using DOM\n\n// Options\n// Custom error correction level\n// low: 7%, medium: 15% (default), quartile: 25%, high: 30%\nconst highErrorCorrection = encodeQR(txt, 'gif', { ecc: 'high' });\n// Custom encoding: 'numeric', 'alphanumeric' or 'byte'\nconst customEncoding = encodeQR(txt, 'gif', { encoding: 'byte' });\n// Default scale is 2: each block is 2x2 pixels.\nconst larger = encodeQR(txt, 'gif', { scale: 4 });\n// All options\n// type QrOpts = {\n//   ecc?: 'low' | 'medium' | 'quartile' | 'high';\n//   encoding?: 'numeric' | 'alphanumeric' | 'byte' | 'kanji' | 'eci';\n//   textEncoder?: (text: string) => Uint8Array;\n//   version?: number; // 1..40, QR code version\n//   mask?: number; // 0..7, mask number\n//   border?: number; // Border size, default 2.\n//   scale?: number; // Scale to this number. Scale=2 -> each block will be 2x2 pixels\n// };\n\nconsole.log(ascii);\n```\n\nExample output:\n\n```text\n█████████████████████████████████████\n██ ▄▄▄▄▄ █  ▀▄▄█ ██▀▄▄▄▄█ ▀█ ▄▄▄▄▄ ██\n██ █   █ █▀▄▀▄ ▄▄█▄█ ██▀█▀▀█ █   █ ██\n██ █▄▄▄█ ██ ▄▄█▄▀▀ ▀ ██ ▄ ▄█ █▄▄▄█ ██\n██▄▄▄▄▄▄▄█ ▀ ▀ █▄▀ ▀ ▀▄█ █ █▄▄▄▄▄▄▄██\n██ █  ▀ ▄▄▀▀▀ █▀ ▄   ▀▀▄▀ ▄█ ▀█ ▀▄▄██\n██▀▀▀  ▀▄▄██▄▀▀▄█▀ ▀▄█    ▀▀▀ ▄ █▄▄██\n█████▄▀▀▄▄██ ▀ ▀ ▄▄██▄ ▄▄ ▄ █▀█ █ ███\n███   ▄▀▄█▄▄▄█   ▀██▄▄▄▀▀█▄▀ ▄█▀ ████\n██▀▀ ▄ ▀▄ ▄▄██▀▄▀▀████▄▄▄ █▄ █  █▀▀██\n██▀▀▄ ▄▀▄ ▀▀█▄▀▀▄▄▀▀ █▄▄▀█▀ ▀▄ █▄ ▀██\n██▀▄▀██ ▄▄ ▀█▄█▀ ▀ ▀█▄▀▀ █▄▀▀ █  █ ██\n███▀█▄▀▄▄ █  █ ██ ██ ▄ █ ▄▄▄ ▄▀▀▄▄ ██\n██▄█▄▄▄█▄█ ▄ ▄▀█▀▀ ▄▀ █▀ ▄ ▄▄▄ ▀▄▀▄██\n██ ▄▄▄▄▄ █ ▄█▄▀▀ ▀█   █▄█  █▄█ ▀▀▄▀██\n██ █   █ █▀ ▄▀█ ██ ▄▄▀██   ▄▄ ▄█   ██\n██ █▄▄▄█ █▄  ██▀ ▄▄ ▀█ ▄      ▀▄▄█▀██\n██▄▄▄▄▄▄▄█▄███▄█▄█▄▄▄▄█▄█▄████▄▄█████\n▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n```\n\n## Decoding\n\nGIF reader is not included in the package (it would take a lot of space).\nDecoding raw bitmap is still possible.\n\n```js\nimport encodeQR from 'qr';\nimport decodeQR from 'qr/decode.js';\nimport { Bitmap } from 'qr';\n\n// Scale so it would be 100x100 instead of 25x25\nconst opts = { scale: 4 };\n\n// a) Decode using raw bitmap, dependency-free\nfunction decodeRawBitmap() {\n  const bmBits = encodeQR('Hello world', 'raw', opts);\n  const bm = new Bitmap({ width: bmBits[0].length, height: bmBits.length });\n  bm.data = bmBits;\n  const decoded = decodeQR(bm.toImage());\n  console.log('decoded(pixels)', decoded);\n}\n/*\nOutput:\ndecoded(pixels) Hello world\ndecoded(gif) Hello world\n*/\n\n// b) Decode using external GIF decoder\nimport gif from 'omggif'; // npm install omggif@1.0.10\nfunction parseGIF(image) {\n  const r = new gif.GifReader(image);\n  const data = [];\n  r.decodeAndBlitFrameRGBA(0, data);\n  const { width, height } = r.frameInfo(0);\n  return { width, height, data };\n}\nfunction decodeWithExternal() {\n  const gifBytes = encodeQR('Hello world', 'gif', opts);\n  const decoded = decodeQR(parseGIF(gifBytes));\n  console.log('decoded(gif)', decoded);\n}\n```\n\n### Decoding options\n\n```ts\ntype Point = { x: number; y: number };\ntype Pattern = Point & { moduleSize: number; count: number };\ntype FinderPoints = [Pattern, Pattern, Point, Pattern];\ntype Image = {\n  height: number;\n  width: number;\n  data: Uint8Array | Uint8ClampedArray | number[];\n};\ntype DecodeOpts = {\n  cropToSquare?: boolean;\n  textDecoder?: (bytes: Uint8Array) => string;\n  pointsOnDetect?: (points: FinderPoints) => void;\n  imageOnBitmap?: (img: Image) => void;\n  imageOnDetect?: (img: Image) => void;\n  imageOnResult?: (img: Image) => void;\n};\ndeclare function decodeQR(img: Image, opts?: DecodeOpts): string;\n```\n\n### Decoding algorithm\n\nQR code decoding is challenging; it is essentially a computer vision problem. There are two main scenarios:\n\n- Decoding from files: This can be slow because it needs to handle complicated cases such as blur or rotation.\n- Decoding from a camera feed: This must be fast; even if one frame fails, the next frame can succeed.\n\nThe state-of-the-art approach for this, as with other computer vision problems, is using neural networks. However, using them would make the library hard to audit. Additionally, since JavaScript can't access hardware accelerators, it would likely be very slow. We also avoid using WebGL because it is complex and exposes users to fingerprinting.\n\nThe implemented reader algorithm is inspired by [ZXing](https://github.com/zxing/zxing):\n\n1. `toBitmap`: Convert the image to a bitmap of black and white segments. This is the slowest part and the most important.\n2. `detect`: Find three finder patterns and one alignment pattern (for versions > 1). This is tricky—they can be rotated and distorted by perspective. A square might appear as a quadrilateral with unknown size. The best we can do is count runs of the same color and select patterns with almost the same ratio of runs.\n3. `transform`: Once patterns have been found, correct the perspective and transform the quadrilateral into a square.\n4. `decodeBitmap`: Execute the encoding in reverse: read information via a zig-zag pattern, de-interleave bytes, correct errors, convert to bits, and finally, read segments from bits to create the string.\n5. **Finished!**\n\n### Decoding test vectors\n\nTo test our QR code decoding, we use an excellent dataset\nfrom [BoofCV](http://boofcv.org/index.php?title=Performance:QrCode). BoofCV decodes 73% of the test cases,\nwhile ZXing decodes 49%. Our implementation is nearly at parity with ZXing, primarily because ECI (Extended\nChannel Interpretation) support is not yet included. The test vectors are preserved in a Git repository at\n[github.com/paulmillr/qr-code-vectors](https://github.com/paulmillr/qr-code-vectors).\n\n**Note for Testing on iOS Safari:** Accessing the camera on iOS Safari requires HTTPS. This means that the file: protocol or non-encrypted http cannot be used. Ensure your testing environment uses https:.\n\nThe QR code specification is available for purchase at [iso.org](https://www.iso.org/standard/62021.html) for 200 CHF.\n\n### DOM helpers for web apps\n\nCheck out `dom.ts` for browser-related camera code that would make your apps simpler.\n\n## Using with Kotlin\n\n```kotlin\n@JsModule(\"qr\")\n@JsNonModule\nexternal object Qr {\n    @JsName(\"default\")\n    fun encodeQR(text: String, output: String = definedExternally, opts: dynamic = definedExternally): Uint8Array\n}\n\n// then\nval bytes = Qr.encodeQR(\"text\", \"gif\", js(\"{ scale: 10 }\"))\nval blob = Blob(arrayOf(bytes), BlobPropertyBag(\"image/gif\"))\nval imgSrc = URL.createObjectURL(blob)\n```\n\n## Security\n\nThere are multiple ways a single text can be encoded in a QR code, which can lead to potential security implications:\n\n- **Segmentation Differences:** For example, `abc123` can be encoded as:\n  `[{type: 'alphanum', data: 'abc'}, {type: 'num', data: '123'}]` or `[{type: 'alphanum', data: 'abc123'}]`\n- **Mask Selection Algorithms:** Different libraries may use different algorithms for mask selection.\n- **Default Settings:** Variations in error correction levels and how many bits are stored before upgrading versions.\n\nIf an adversary can access multiple QR codes generated from a specific library, they may be able to fingerprint the user. This fingerprinting could be used to exfiltrate data from air-gapped systems. In such cases, the adversary would need to create a library-specific exploit.\n\nWe mitigate these risks by:\n\n- **Cross-Testing:** We currently cross-test against python-qrcode, which is closer to the specification\n  than some JavaScript implementations.\n- **Single Segment Encoding:** We always use single-segment encoding.\n  While this may not be the most optimal for performance, it reduces the amount of fingerprinting data.\n\nFuture plans:\n\n- **Testing Against Multiple Libraries:** To further improve security and reduce fingerprinting, we can\n  cross-test against three to four popular libraries.\n\n## Speed\n\nBenchmarks measured with Apple M4 with node.js 25.\n\n```\n# encode format=ascii\n@paulmillr/qr x 9,050 ops/sec @ 110μs/op\nqrcode-generator x 4,543 ops/sec @ 220μs/op\nnuintun x 3,413 ops/sec @ 292μs/op\n\n# encode format=gif\n@paulmillr/qr x 8,439 ops/sec @ 118μs/op\nqrcode-generator x 2,909 ops/sec @ 343μs/op\nnuintun x 3,470 ops/sec @ 288μs/op\n\n# encode of large qr\n@paulmillr/qr x 334 ops/sec @ 2ms/op\nqrcode-generator x 174 ops/sec @ 5ms/op\nnuintun x 221 ops/sec @ 4ms/op\n\n# decode\n@paulmillr/qr x 662 ops/sec @ 1ms/op\njsqr x 50 ops/sec @ 19ms/op\nnuintun x 49 ops/sec @ 20ms/op\ninstascan x 128 ops/sec @ 7ms/op ± 31.44% (4ms..166ms)\n```\n\n## License\n\nCopyright (c) 2023 Paul Miller (paulmillr.com)\n\nCopyright (c) 2019 ZXing authors\n\nThe library paulmillr-qr is dual-licensed under the Apache 2.0 OR MIT license.\nYou can select a license of your choice.\n\nThe library contains code inspired by [ZXing](https://github.com/zxing/zxing), which is licensed under Apache 2.0.\n\nThe license to the use of the QR Code stipulated by JIS (Japanese Industrial Standards) and the ISO are not necessary.\nThe specification for QR Code has been made available for use by any person or organization. (Obtaining QR Code Specification)\nThe word “QR Code” is registered trademark of DENSO WAVE INCORPORATED in Japan and other countries.\nTo use the word “QR Code” in your publications or web site, etc, please indicate a sentence QR Code is registered trademark of DENSO WAVE INCORPORATED.\nThis registered trademark applies only for the word “QR Code”, and not for the QR Code pattern (image).\n(https://www.qrcode.com/en/faq.html)\n","readmeFilename":"README.md","users":{"cliff":true}}