From 00c68bbfd481a55935d1982458ea4a7909b547b7 Mon Sep 17 00:00:00 2001 From: Jad Date: Sat, 20 Jun 2026 12:48:40 +0800 Subject: [PATCH 1/3] Avoid uninitialized let in nested for-loop headers for ES5 compat --- src/qr/errorCorrection.mjs | 2 +- src/qr/score.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qr/errorCorrection.mjs b/src/qr/errorCorrection.mjs index 6c6f50c..9eb076c 100644 --- a/src/qr/errorCorrection.mjs +++ b/src/qr/errorCorrection.mjs @@ -23,7 +23,7 @@ export const calculateEC = (versionBytes, correction) => { const result = makeUint8Array(size); size = 0; for (const bs of blocks) { - for (let i = 0, prev; size !== prev; ++i) { + for (let i = 0, prev = -1; size !== prev; ++i) { prev = size; for (const block of bs) { if (i < block.length) { diff --git a/src/qr/score.mjs b/src/qr/score.mjs index 940637f..543d43a 100644 --- a/src/qr/score.mjs +++ b/src/qr/score.mjs @@ -5,7 +5,7 @@ const matches = 0b00000000001_00000000001; export const scoreCode = ({ size, _data }, score = 0, totalOn = 0) => { for (let i = 0; i < size; ++i) { for (let n = 0; n < 2; ++n) { - for (let j = 0, state = 0, consec = 0, last; j < size; ++j) { + for (let j = 0, state = 0, consec = 0, last = 0; j < size; ++j) { const cur = _data[n ? i * size + j : j * size + i] & 1; totalOn += cur; state = ((state >> 1) | initial) & (pattern ^ (cur - 1)); From 1e5a15490eebee32fb06a7a172c8300a54c54e13 Mon Sep 17 00:00:00 2001 From: David Evans Date: Sat, 20 Jun 2026 12:57:16 +0100 Subject: [PATCH 2/3] Update statistics --- docs/integrity.txt | 8 ++++---- docs/stats.txt | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/integrity.txt b/docs/integrity.txt index ae8267a..fd96ae7 100644 --- a/docs/integrity.txt +++ b/docs/integrity.txt @@ -1,6 +1,6 @@ -index.mjs: sha384-m4b9mo8rku6/YQbV1e52UTglSzniaJVeyuq4NnpxRZtq9UrxWXKj+/Mx9MvtPRhK -index.js: sha384-jh47I3nzhofHfyfvgZFdmqUk4CYrsTIaq9LwhVmsWOFiX88x2h46P06/aDeaEtXp -nano.mjs: sha384-avNlMHLjqxeTtXysYm13MNj05YYIEl5Fg3itpc7p/JdjS3ULukmDYKaqUMtBj6tT +index.mjs: sha384-YwNvUCvTMGszeiLb2W3oi7jbPIzcMm4Jrj6+xIwX5Hjz+xRANVY3vYtX/3S5t68c +index.js: sha384-QujLbtB2X/QL/2piY+7iZRurL6CUH1yALlghndSNPyLI4GxwL9SEgCvC9UoYoDM9 +nano.mjs: sha384-JUdoQ/5p6v/KQF5qF0ENvrdDX5xtyDgK89nuB2bAZlwJthxfFGFUgPqgu3+O1CDu extras/svg.mjs: sha384-Gk8g8nmt6RvyscmK2SxGhYHjrlr8PGRa9CD96IKO9EfLBGE1Wpj/pT8TgbuUXYXM extras/svg.js: sha384-VYnYxwUAQvjDtTiso2ihlfJcfZY60ZgYYdd5YKEO1B4BtZ3P7fxQ5WNuPPG/i8Np extras/node_export.mjs: sha384-jY8CQmq1wxq5w4nuvoBv5cQ+YlO4CAy1qLQ1ZzisUY+YKNSk0IiiQBG6xzZ4t7il @@ -11,4 +11,4 @@ extras/vue.mjs: sha384-Q4U/qU20x7la3XGJDH1okfzFYN5r+AahC/KAu3xJi5vmOj0GP extras/vue.js: sha384-lkJRxa/w/MmxmQCuZWCv3qKGlSyuRD86eaGUWktxjO/n7pcUstsLUW2COHlYDYQ4 extras/errors.mjs: sha384-LaUpr3MpI+ZWjDG8L54lwBzgymdm+C1fijP3Z3HukZOFOn3nmRUtgK5aTmOSVm/q extras/errors.js: sha384-lpwl8zlB1GwhvS1ftgUv4mCvOhlixuRa8fRag2aZ2PEEPKQ++l+IjhZL8lhbZMVe -webcomponent.mjs: sha384-9dDat7/8CJ6E17L+k4st+cuCTZKpoAQ8TnkM+IqePpen71TrCZHaqfWzeD+qXg48 +webcomponent.mjs: sha384-xUwzRIXa8aklDQp1KCE0/tGw/fjw2ZR/q3h5ZKscACK4uwos2zzqka+EAxHtpyP9 diff --git a/docs/stats.txt b/docs/stats.txt index 5825de8..d56ffa5 100644 --- a/docs/stats.txt +++ b/docs/stats.txt @@ -1,6 +1,6 @@ -index.mjs: 6898 bytes / 3670 bytes (compressed) -index.js: 6914 bytes / 3661 bytes (compressed) -nano.mjs: 3763 bytes / 2159 bytes (compressed) +index.mjs: 6903 bytes / 3668 bytes (compressed) +index.js: 6919 bytes / 3663 bytes (compressed) +nano.mjs: 3768 bytes / 2163 bytes (compressed) extras/svg.mjs: 1333 bytes / 945 bytes (compressed) extras/svg.js: 1350 bytes / 942 bytes (compressed) extras/node_export.mjs: 1069 bytes / 785 bytes (compressed) @@ -11,4 +11,4 @@ extras/vue.mjs: 1059 bytes / 686 bytes (compressed) extras/vue.js: 1066 bytes / 684 bytes (compressed) extras/errors.mjs: 287 bytes / 342 bytes (compressed) extras/errors.js: 287 bytes / 340 bytes (compressed) -webcomponent.mjs: 8634 bytes / 4442 bytes (compressed) +webcomponent.mjs: 8639 bytes / 4444 bytes (compressed) From 6aaa9a33f35dd6850650b3de379bc3320b887e4c Mon Sep 17 00:00:00 2001 From: David Evans Date: Sat, 20 Jun 2026 12:59:50 +0100 Subject: [PATCH 3/3] Small byte savings enabled by newly initialised values --- docs/integrity.txt | 8 ++++---- docs/stats.txt | 8 ++++---- src/qr/errorCorrection.mjs | 2 +- src/qr/score.mjs | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/integrity.txt b/docs/integrity.txt index fd96ae7..731113b 100644 --- a/docs/integrity.txt +++ b/docs/integrity.txt @@ -1,6 +1,6 @@ -index.mjs: sha384-YwNvUCvTMGszeiLb2W3oi7jbPIzcMm4Jrj6+xIwX5Hjz+xRANVY3vYtX/3S5t68c -index.js: sha384-QujLbtB2X/QL/2piY+7iZRurL6CUH1yALlghndSNPyLI4GxwL9SEgCvC9UoYoDM9 -nano.mjs: sha384-JUdoQ/5p6v/KQF5qF0ENvrdDX5xtyDgK89nuB2bAZlwJthxfFGFUgPqgu3+O1CDu +index.mjs: sha384-ix/UIenTZ8IyJxa+sJjONUP54ZVdea4Lx1HLnQ6H19foghKqyGi2tWwKqEBZ/fMP +index.js: sha384-rMLAHwGIF45U925zCR19N4xrcJ0oWFePEJ1n97/WvrJF+ON9OcD7oky9FnZJjeaj +nano.mjs: sha384-XThBBrKCQC9Alnv0+HEu/eQjYCSDEkmYTNMzQyLrfFpf4HDpj/Mhti8J8kTD0liW extras/svg.mjs: sha384-Gk8g8nmt6RvyscmK2SxGhYHjrlr8PGRa9CD96IKO9EfLBGE1Wpj/pT8TgbuUXYXM extras/svg.js: sha384-VYnYxwUAQvjDtTiso2ihlfJcfZY60ZgYYdd5YKEO1B4BtZ3P7fxQ5WNuPPG/i8Np extras/node_export.mjs: sha384-jY8CQmq1wxq5w4nuvoBv5cQ+YlO4CAy1qLQ1ZzisUY+YKNSk0IiiQBG6xzZ4t7il @@ -11,4 +11,4 @@ extras/vue.mjs: sha384-Q4U/qU20x7la3XGJDH1okfzFYN5r+AahC/KAu3xJi5vmOj0GP extras/vue.js: sha384-lkJRxa/w/MmxmQCuZWCv3qKGlSyuRD86eaGUWktxjO/n7pcUstsLUW2COHlYDYQ4 extras/errors.mjs: sha384-LaUpr3MpI+ZWjDG8L54lwBzgymdm+C1fijP3Z3HukZOFOn3nmRUtgK5aTmOSVm/q extras/errors.js: sha384-lpwl8zlB1GwhvS1ftgUv4mCvOhlixuRa8fRag2aZ2PEEPKQ++l+IjhZL8lhbZMVe -webcomponent.mjs: sha384-xUwzRIXa8aklDQp1KCE0/tGw/fjw2ZR/q3h5ZKscACK4uwos2zzqka+EAxHtpyP9 +webcomponent.mjs: sha384-QTlW/1U8Fi4zgSsbEx+i8+CHNfzzIWxgw8hH0hc4qwVBJN5omqCsXJ6a7d8aDzKd diff --git a/docs/stats.txt b/docs/stats.txt index d56ffa5..b527f10 100644 --- a/docs/stats.txt +++ b/docs/stats.txt @@ -1,6 +1,6 @@ -index.mjs: 6903 bytes / 3668 bytes (compressed) -index.js: 6919 bytes / 3663 bytes (compressed) -nano.mjs: 3768 bytes / 2163 bytes (compressed) +index.mjs: 6897 bytes / 3667 bytes (compressed) +index.js: 6913 bytes / 3661 bytes (compressed) +nano.mjs: 3762 bytes / 2160 bytes (compressed) extras/svg.mjs: 1333 bytes / 945 bytes (compressed) extras/svg.js: 1350 bytes / 942 bytes (compressed) extras/node_export.mjs: 1069 bytes / 785 bytes (compressed) @@ -11,4 +11,4 @@ extras/vue.mjs: 1059 bytes / 686 bytes (compressed) extras/vue.js: 1066 bytes / 684 bytes (compressed) extras/errors.mjs: 287 bytes / 342 bytes (compressed) extras/errors.js: 287 bytes / 340 bytes (compressed) -webcomponent.mjs: 8639 bytes / 4444 bytes (compressed) +webcomponent.mjs: 8633 bytes / 4443 bytes (compressed) diff --git a/src/qr/errorCorrection.mjs b/src/qr/errorCorrection.mjs index 9eb076c..0f98bf3 100644 --- a/src/qr/errorCorrection.mjs +++ b/src/qr/errorCorrection.mjs @@ -23,7 +23,7 @@ export const calculateEC = (versionBytes, correction) => { const result = makeUint8Array(size); size = 0; for (const bs of blocks) { - for (let i = 0, prev = -1; size !== prev; ++i) { + for (let i = 0, prev = -1; prev < size; ++i) { prev = size; for (const block of bs) { if (i < block.length) { diff --git a/src/qr/score.mjs b/src/qr/score.mjs index 543d43a..a9e64bb 100644 --- a/src/qr/score.mjs +++ b/src/qr/score.mjs @@ -5,14 +5,14 @@ const matches = 0b00000000001_00000000001; export const scoreCode = ({ size, _data }, score = 0, totalOn = 0) => { for (let i = 0; i < size; ++i) { for (let n = 0; n < 2; ++n) { - for (let j = 0, state = 0, consec = 0, last = 0; j < size; ++j) { + for (let j = 0, state = 0, consec, last = 2; j < size; ++j) { const cur = _data[n ? i * size + j : j * size + i] & 1; totalOn += cur; state = ((state >> 1) | initial) & (pattern ^ (cur - 1)); if (state & matches) { score += 40; } - if (cur !== last) { + if (cur ^ last) { consec = 0; } last = cur;