@vielzeug/sigil 3.1.0 → 26.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +5 -5
  2. package/dist/_format.cjs +1 -1
  3. package/dist/_format.cjs.map +1 -1
  4. package/dist/_format.js +1 -36
  5. package/dist/_format.js.map +1 -1
  6. package/dist/_galois.cjs +1 -1
  7. package/dist/_galois.cjs.map +1 -1
  8. package/dist/_galois.d.ts +1 -1
  9. package/dist/_galois.d.ts.map +1 -1
  10. package/dist/_galois.js +1 -21
  11. package/dist/_galois.js.map +1 -1
  12. package/dist/_mask.cjs +1 -1
  13. package/dist/_mask.cjs.map +1 -1
  14. package/dist/_mask.js +1 -80
  15. package/dist/_mask.js.map +1 -1
  16. package/dist/_matrix.cjs +1 -1
  17. package/dist/_matrix.cjs.map +1 -1
  18. package/dist/_matrix.d.ts +1 -1
  19. package/dist/_matrix.d.ts.map +1 -1
  20. package/dist/_matrix.js +1 -64
  21. package/dist/_matrix.js.map +1 -1
  22. package/dist/_reed-solomon.cjs +1 -1
  23. package/dist/_reed-solomon.cjs.map +1 -1
  24. package/dist/_reed-solomon.js +1 -21
  25. package/dist/_reed-solomon.js.map +1 -1
  26. package/dist/_segments.cjs +1 -1
  27. package/dist/_segments.cjs.map +1 -1
  28. package/dist/_segments.d.ts +22 -11
  29. package/dist/_segments.d.ts.map +1 -1
  30. package/dist/_segments.js +1 -69
  31. package/dist/_segments.js.map +1 -1
  32. package/dist/_tables.cjs +1 -1
  33. package/dist/_tables.cjs.map +1 -1
  34. package/dist/_tables.d.ts +4 -4
  35. package/dist/_tables.js +1 -408
  36. package/dist/_tables.js.map +1 -1
  37. package/dist/canvas.cjs +1 -1
  38. package/dist/canvas.cjs.map +1 -1
  39. package/dist/canvas.d.ts +1 -1
  40. package/dist/canvas.d.ts.map +1 -1
  41. package/dist/canvas.js +1 -13
  42. package/dist/canvas.js.map +1 -1
  43. package/dist/encode.cjs +1 -1
  44. package/dist/encode.cjs.map +1 -1
  45. package/dist/encode.d.ts +3 -1
  46. package/dist/encode.d.ts.map +1 -1
  47. package/dist/encode.js +1 -111
  48. package/dist/encode.js.map +1 -1
  49. package/dist/errors.cjs +1 -1
  50. package/dist/errors.cjs.map +1 -1
  51. package/dist/errors.js +1 -16
  52. package/dist/errors.js.map +1 -1
  53. package/dist/index.cjs +1 -1
  54. package/dist/index.js +1 -6
  55. package/dist/scan.cjs +1 -1
  56. package/dist/scan.cjs.map +1 -1
  57. package/dist/scan.d.ts.map +1 -1
  58. package/dist/scan.js +1 -140
  59. package/dist/scan.js.map +1 -1
  60. package/dist/sigil.cjs +1 -1
  61. package/dist/sigil.cjs.map +1 -1
  62. package/dist/sigil.iife.js +1 -1
  63. package/dist/sigil.iife.js.map +1 -1
  64. package/dist/sigil.js +1 -1
  65. package/dist/sigil.js.map +1 -1
  66. package/dist/svg.cjs +1 -1
  67. package/dist/svg.cjs.map +1 -1
  68. package/dist/svg.js +1 -25
  69. package/dist/svg.js.map +1 -1
  70. package/dist/types.d.ts +5 -7
  71. package/dist/types.d.ts.map +1 -1
  72. package/package.json +5 -5
  73. package/dist/_dev.cjs +0 -2
  74. package/dist/_dev.cjs.map +0 -1
  75. package/dist/_dev.d.ts +0 -2
  76. package/dist/_dev.d.ts.map +0 -1
  77. package/dist/_dev.js +0 -6
  78. package/dist/_dev.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"_reed-solomon.cjs","names":[],"sources":["../src/_reed-solomon.ts"],"sourcesContent":["import { gfExp, gfMultiply, gfPolyMultiply } from './_galois';\n\n/**\n * Reed–Solomon error-correction codewords over GF(256).\n * The generator polynomial for `degree` EC codewords is ∏ᵢ₌₀..degree₋₁ (x − αⁱ);\n * results are cached per degree (max 30 per ISO Table 9).\n */\n\nconst generatorCache = new Map<number, readonly number[]>();\n\n/** Generator polynomial coefficients (highest-degree first, leading 1 kept). */\nfunction generatorPoly(degree: number): readonly number[] {\n const poly = generatorCache.get(degree);\n if (poly) return poly;\n let g = [1];\n for (let i = 0; i < degree; i++) g = gfPolyMultiply(g, [1, gfExp(i)]);\n generatorCache.set(degree, g);\n return g;\n}\n\n/** EC codewords for one data block: remainder of data·x^degree ÷ generator. */\nexport function ecCodewords(data: readonly number[], degree: number): number[] {\n const gen = generatorPoly(degree); // gen[0] === 1\n const rem = new Array<number>(degree).fill(0);\n for (const b of data) {\n const factor = b ^ rem[0];\n rem.copyWithin(0, 1);\n rem[degree - 1] = 0;\n if (factor !== 0) for (let j = 0; j < degree; j++) rem[j] ^= gfMultiply(gen[j + 1], factor);\n }\n return rem;\n}\n"],"mappings":"iCAQA,IAAM,EAAiB,IAAI,IAG3B,SAAS,EAAc,EAAmC,CACxD,IAAM,EAAO,EAAe,IAAI,CAAM,EACtC,GAAI,EAAM,OAAO,EACjB,IAAI,EAAI,CAAC,CAAC,EACV,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,EAAI,EAAA,eAAe,EAAG,CAAC,EAAG,EAAA,MAAM,CAAC,CAAC,CAAC,EAEpE,OADA,EAAe,IAAI,EAAQ,CAAC,EACrB,CACT,CAGA,SAAgB,EAAY,EAAyB,EAA0B,CAC7E,IAAM,EAAM,EAAc,CAAM,EAC1B,EAAU,MAAc,CAAM,CAAC,CAAC,KAAK,CAAC,EAC5C,IAAK,IAAM,KAAK,EAAM,CACpB,IAAM,EAAS,EAAI,EAAI,GAGvB,GAFA,EAAI,WAAW,EAAG,CAAC,EACnB,EAAI,EAAS,GAAK,EACd,IAAW,EAAG,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,EAAI,IAAM,EAAA,WAAW,EAAI,EAAI,GAAI,CAAM,CAC5F,CACA,OAAO,CACT"}
1
+ {"version":3,"file":"_reed-solomon.cjs","names":[],"sources":["../src/_reed-solomon.ts"],"sourcesContent":["import { gfExp, gfMultiply, gfPolyMultiply } from './_galois';\n\n/**\n * Reed–Solomon error-correction codewords over GF(256).\n * The generator polynomial for `degree` EC codewords is ∏ᵢ₌₀..degree₋₁ (x − αⁱ);\n * results are cached per degree (max 30 per ISO Table 9).\n */\n\nconst generatorCache = new Map<number, readonly number[]>();\n\n/** Generator polynomial coefficients (highest-degree first, leading 1 kept). */\nfunction generatorPoly(degree: number): readonly number[] {\n const poly = generatorCache.get(degree);\n if (poly) return poly;\n let g = [1];\n for (let i = 0; i < degree; i++) g = gfPolyMultiply(g, [1, gfExp(i)]);\n generatorCache.set(degree, g);\n return g;\n}\n\n/** EC codewords for one data block: remainder of data·x^degree ÷ generator. */\nexport function ecCodewords(data: readonly number[], degree: number): number[] {\n const gen = generatorPoly(degree); // gen[0] === 1\n const rem = new Array<number>(degree).fill(0);\n for (const b of data) {\n const factor = b ^ rem[0];\n rem.copyWithin(0, 1);\n rem[degree - 1] = 0;\n if (factor !== 0) for (let j = 0; j < degree; j++) rem[j] ^= gfMultiply(gen[j + 1], factor);\n }\n return rem;\n}\n"],"mappings":"iCAQA,IAAM,EAAiB,IAAI,IAG3B,SAAS,cAAc,EAAmC,CACxD,IAAM,EAAO,EAAe,IAAI,CAAM,EACtC,GAAI,EAAM,OAAO,EACjB,IAAI,EAAI,CAAC,CAAC,EACV,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,EAAI,EAAA,eAAe,EAAG,CAAC,EAAG,EAAA,MAAM,CAAC,CAAC,CAAC,EAEpE,OADA,EAAe,IAAI,EAAQ,CAAC,EACrB,CACT,CAGA,SAAgB,YAAY,EAAyB,EAA0B,CAC7E,IAAM,EAAM,cAAc,CAAM,EAC1B,EAAU,MAAc,CAAM,CAAC,CAAC,KAAK,CAAC,EAC5C,IAAK,IAAM,KAAK,EAAM,CACpB,IAAM,EAAS,EAAI,EAAI,GAGvB,GAFA,EAAI,WAAW,EAAG,CAAC,EACnB,EAAI,EAAS,GAAK,EACd,IAAW,EAAG,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,EAAI,IAAM,EAAA,WAAW,EAAI,EAAI,GAAI,CAAM,CAC5F,CACA,OAAO,CACT"}
@@ -1,22 +1,2 @@
1
- import { gfExp as e, gfMultiply as t, gfPolyMultiply as n } from "./_galois.js";
2
- //#region src/_reed-solomon.ts
3
- var r = /* @__PURE__ */ new Map();
4
- function i(t) {
5
- let i = r.get(t);
6
- if (i) return i;
7
- let a = [1];
8
- for (let r = 0; r < t; r++) a = n(a, [1, e(r)]);
9
- return r.set(t, a), a;
10
- }
11
- function a(e, n) {
12
- let r = i(n), a = Array(n).fill(0);
13
- for (let i of e) {
14
- let e = i ^ a[0];
15
- if (a.copyWithin(0, 1), a[n - 1] = 0, e !== 0) for (let i = 0; i < n; i++) a[i] ^= t(r[i + 1], e);
16
- }
17
- return a;
18
- }
19
- //#endregion
20
- export { a as ecCodewords };
21
-
1
+ import{gfExp as e,gfMultiply as t,gfPolyMultiply as n}from"./_galois.js";var r=new Map;function generatorPoly(t){let i=r.get(t);if(i)return i;let a=[1];for(let r=0;r<t;r++)a=n(a,[1,e(r)]);return r.set(t,a),a}function ecCodewords(e,n){let r=generatorPoly(n),i=Array(n).fill(0);for(let a of e){let e=a^i[0];if(i.copyWithin(0,1),i[n-1]=0,e!==0)for(let a=0;a<n;a++)i[a]^=t(r[a+1],e)}return i}export{ecCodewords};
22
2
  //# sourceMappingURL=_reed-solomon.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_reed-solomon.js","names":[],"sources":["../src/_reed-solomon.ts"],"sourcesContent":["import { gfExp, gfMultiply, gfPolyMultiply } from './_galois';\n\n/**\n * Reed–Solomon error-correction codewords over GF(256).\n * The generator polynomial for `degree` EC codewords is ∏ᵢ₌₀..degree₋₁ (x − αⁱ);\n * results are cached per degree (max 30 per ISO Table 9).\n */\n\nconst generatorCache = new Map<number, readonly number[]>();\n\n/** Generator polynomial coefficients (highest-degree first, leading 1 kept). */\nfunction generatorPoly(degree: number): readonly number[] {\n const poly = generatorCache.get(degree);\n if (poly) return poly;\n let g = [1];\n for (let i = 0; i < degree; i++) g = gfPolyMultiply(g, [1, gfExp(i)]);\n generatorCache.set(degree, g);\n return g;\n}\n\n/** EC codewords for one data block: remainder of data·x^degree ÷ generator. */\nexport function ecCodewords(data: readonly number[], degree: number): number[] {\n const gen = generatorPoly(degree); // gen[0] === 1\n const rem = new Array<number>(degree).fill(0);\n for (const b of data) {\n const factor = b ^ rem[0];\n rem.copyWithin(0, 1);\n rem[degree - 1] = 0;\n if (factor !== 0) for (let j = 0; j < degree; j++) rem[j] ^= gfMultiply(gen[j + 1], factor);\n }\n return rem;\n}\n"],"mappings":";;AAQA,IAAM,oBAAiB,IAAI,IAA+B;AAG1D,SAAS,EAAc,GAAmC;CACxD,IAAM,IAAO,EAAe,IAAI,CAAM;CACtC,IAAI,GAAM,OAAO;CACjB,IAAI,IAAI,CAAC,CAAC;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAQ,KAAK,IAAI,EAAe,GAAG,CAAC,GAAG,EAAM,CAAC,CAAC,CAAC;CAEpE,OADA,EAAe,IAAI,GAAQ,CAAC,GACrB;AACT;AAGA,SAAgB,EAAY,GAAyB,GAA0B;CAC7E,IAAM,IAAM,EAAc,CAAM,GAC1B,IAAU,MAAc,CAAM,CAAC,CAAC,KAAK,CAAC;CAC5C,KAAK,IAAM,KAAK,GAAM;EACpB,IAAM,IAAS,IAAI,EAAI;EAGvB,IAFA,EAAI,WAAW,GAAG,CAAC,GACnB,EAAI,IAAS,KAAK,GACd,MAAW,GAAG,KAAK,IAAI,IAAI,GAAG,IAAI,GAAQ,KAAK,EAAI,MAAM,EAAW,EAAI,IAAI,IAAI,CAAM;CAC5F;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"_reed-solomon.js","names":[],"sources":["../src/_reed-solomon.ts"],"sourcesContent":["import { gfExp, gfMultiply, gfPolyMultiply } from './_galois';\n\n/**\n * Reed–Solomon error-correction codewords over GF(256).\n * The generator polynomial for `degree` EC codewords is ∏ᵢ₌₀..degree₋₁ (x − αⁱ);\n * results are cached per degree (max 30 per ISO Table 9).\n */\n\nconst generatorCache = new Map<number, readonly number[]>();\n\n/** Generator polynomial coefficients (highest-degree first, leading 1 kept). */\nfunction generatorPoly(degree: number): readonly number[] {\n const poly = generatorCache.get(degree);\n if (poly) return poly;\n let g = [1];\n for (let i = 0; i < degree; i++) g = gfPolyMultiply(g, [1, gfExp(i)]);\n generatorCache.set(degree, g);\n return g;\n}\n\n/** EC codewords for one data block: remainder of data·x^degree ÷ generator. */\nexport function ecCodewords(data: readonly number[], degree: number): number[] {\n const gen = generatorPoly(degree); // gen[0] === 1\n const rem = new Array<number>(degree).fill(0);\n for (const b of data) {\n const factor = b ^ rem[0];\n rem.copyWithin(0, 1);\n rem[degree - 1] = 0;\n if (factor !== 0) for (let j = 0; j < degree; j++) rem[j] ^= gfMultiply(gen[j + 1], factor);\n }\n return rem;\n}\n"],"mappings":"yEAQA,IAAM,EAAiB,IAAI,IAG3B,SAAS,cAAc,EAAmC,CACxD,IAAM,EAAO,EAAe,IAAI,CAAM,EACtC,GAAI,EAAM,OAAO,EACjB,IAAI,EAAI,CAAC,CAAC,EACV,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,EAAI,EAAe,EAAG,CAAC,EAAG,EAAM,CAAC,CAAC,CAAC,EAEpE,OADA,EAAe,IAAI,EAAQ,CAAC,EACrB,CACT,CAGA,SAAgB,YAAY,EAAyB,EAA0B,CAC7E,IAAM,EAAM,cAAc,CAAM,EAC1B,EAAU,MAAc,CAAM,CAAC,CAAC,KAAK,CAAC,EAC5C,IAAK,IAAM,KAAK,EAAM,CACpB,IAAM,EAAS,EAAI,EAAI,GAGvB,GAFA,EAAI,WAAW,EAAG,CAAC,EACnB,EAAI,EAAS,GAAK,EACd,IAAW,EAAG,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,EAAI,IAAM,EAAW,EAAI,EAAI,GAAI,CAAM,CAC5F,CACA,OAAO,CACT"}
@@ -1,2 +1,2 @@
1
- const e=require("./_tables.cjs");var t=class{bits=[];get length(){return this.bits.length}append(e,t){for(let n=t-1;n>=0;n--)this.bits.push(e>>>n&1)}padToByte(){for(;this.bits.length%8!=0;)this.bits.push(0)}toBytes(){let e=[];for(let t=0;t<this.bits.length;t+=8){let n=0;for(let e=0;e<8;e++)n=n<<1|this.bits[t+e];e.push(n)}return e}};function n(e){if(/^\d+$/.test(e))return`numeric`;for(let t of e)if(!`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`.includes(t))return`byte`;return`alphanumeric`}var r=new TextEncoder;function i(e,t){switch(t){case`numeric`:return Math.floor(e.length/3)*10+(e.length%3==1?4:e.length%3==2?7:0);case`alphanumeric`:return Math.floor(e.length/2)*11+e.length%2*6;case`byte`:return r.encode(e).length*8}}function a(t,n,i,a){switch(t.append(e.MODE_BITS[i],4),t.append(o(n,i),e.CHAR_COUNT_BITS[i][e.versionGroup(a)]),i){case`numeric`:for(let e=0;e<n.length;){let r=Math.min(3,n.length-e);t.append(Number.parseInt(n.slice(e,e+r),10),r===3?10:r===2?7:4),e+=r}break;case`alphanumeric`:for(let r=0;r<n.length;)r+1<n.length?(t.append(e.ALPHANUMERIC_CHARSET.indexOf(n[r])*45+e.ALPHANUMERIC_CHARSET.indexOf(n[r+1]),11),r+=2):(t.append(e.ALPHANUMERIC_CHARSET.indexOf(n[r]),6),r+=1);break;case`byte`:for(let e of r.encode(n))t.append(e,8)}}function o(e,t){return t===`byte`?r.encode(e).length:e.length}var s=(t,n)=>e.dataCodewords(t,n)*8;function c(t,n,r){return 4+e.CHAR_COUNT_BITS[n][e.versionGroup(r)]+i(t,n)}function l(n,r,i,o){let c=new t;a(c,n,r,i);let l=s(i,o);c.append(0,Math.min(4,l-c.length)),c.padToByte();let u=c.toBytes(),d=[236,17];for(let t=0;u.length<e.dataCodewords(i,o);t++)u.push(d[t%2]);return u}exports.BitStream=t,exports.appendSegment=a,exports.buildDataCodewords=l,exports.charCount=o,exports.dataBitLength=i,exports.dataCapacityBits=s,exports.detectMode=n,exports.segmentBits=c;
1
+ const e=require("./_tables.cjs");var t=new TextEncoder,payloadFromText=(e,n)=>n===`byte`?{bytes:t.encode(e),mode:`byte`}:{mode:n,text:e},payloadFromBytes=e=>({bytes:e,mode:`byte`});function payloadLength(e){return e.mode===`byte`?e.bytes.length:e.text.length}var BitStream=class{bits=[];get length(){return this.bits.length}append(e,t){for(let n=t-1;n>=0;n--)this.bits.push(e>>>n&1)}padToByte(){for(;this.bits.length%8!=0;)this.bits.push(0)}toBytes(){let e=[];for(let t=0;t<this.bits.length;t+=8){let n=0;for(let e=0;e<8;e++)n=n<<1|this.bits[t+e];e.push(n)}return e}};function detectMode(e){if(/^\d+$/.test(e))return`numeric`;for(let t of e)if(!`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`.includes(t))return`byte`;return`alphanumeric`}function dataBitLength(e){switch(e.mode){case`numeric`:return Math.floor(e.text.length/3)*10+(e.text.length%3==1?4:e.text.length%3==2?7:0);case`alphanumeric`:return Math.floor(e.text.length/2)*11+e.text.length%2*6;case`byte`:return e.bytes.length*8}}function appendSegment(t,n,r){switch(t.append(e.MODE_BITS[n.mode],4),t.append(payloadLength(n),e.CHAR_COUNT_BITS[n.mode][e.versionGroup(r)]),n.mode){case`numeric`:for(let e=0;e<n.text.length;){let r=Math.min(3,n.text.length-e);t.append(Number.parseInt(n.text.slice(e,e+r),10),r===3?10:r===2?7:4),e+=r}break;case`alphanumeric`:for(let r=0;r<n.text.length;)r+1<n.text.length?(t.append(e.ALPHANUMERIC_CHARSET.indexOf(n.text[r])*45+e.ALPHANUMERIC_CHARSET.indexOf(n.text[r+1]),11),r+=2):(t.append(e.ALPHANUMERIC_CHARSET.indexOf(n.text[r]),6),r+=1);break;case`byte`:for(let e of n.bytes)t.append(e,8)}}var dataCapacityBits=(t,n)=>e.dataCodewords(t,n)*8;function segmentBits(t,n){return 4+e.CHAR_COUNT_BITS[t.mode][e.versionGroup(n)]+dataBitLength(t)}function buildDataCodewords(t,n,r){let i=new BitStream;appendSegment(i,t,n);let a=dataCapacityBits(n,r);i.append(0,Math.min(4,a-i.length)),i.padToByte();let o=i.toBytes(),s=[236,17];for(let t=0;o.length<e.dataCodewords(n,r);t++)o.push(s[t%2]);return o}exports.BitStream=BitStream,exports.appendSegment=appendSegment,exports.buildDataCodewords=buildDataCodewords,exports.dataBitLength=dataBitLength,exports.dataCapacityBits=dataCapacityBits,exports.detectMode=detectMode,exports.payloadFromBytes=payloadFromBytes,exports.payloadFromText=payloadFromText,exports.payloadLength=payloadLength,exports.segmentBits=segmentBits;
2
2
  //# sourceMappingURL=_segments.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_segments.cjs","names":[],"sources":["../src/_segments.ts"],"sourcesContent":["import { ALPHANUMERIC_CHARSET, CHAR_COUNT_BITS, dataCodewords, MODE_BITS, versionGroup } from './_tables';\nimport type { QrErrorCorrection, QrMode } from './types';\n\n/**\n * Data-segment assembly: one segment (single mode) covering the whole input,\n * followed by terminator, byte alignment, and 0xEC/0x11 padding (§7.4–7.5).\n * Kanji and multi-segment optimization are out of scope.\n */\n\n/** Growable bit stream; `bytes` is valid only after `padToByte()`. */\nexport class BitStream {\n private bits: number[] = [];\n\n get length(): number {\n return this.bits.length;\n }\n\n append(value: number, width: number): void {\n for (let i = width - 1; i >= 0; i--) this.bits.push((value >>> i) & 1);\n }\n\n padToByte(): void {\n while (this.bits.length % 8 !== 0) this.bits.push(0);\n }\n\n toBytes(): number[] {\n const out: number[] = [];\n for (let i = 0; i < this.bits.length; i += 8) {\n let b = 0;\n for (let j = 0; j < 8; j++) b = (b << 1) | this.bits[i + j];\n out.push(b);\n }\n return out;\n }\n}\n\n/** Most compact mode able to encode the whole input. */\nexport function detectMode(data: string): QrMode {\n if (/^\\d+$/.test(data)) return 'numeric';\n for (const ch of data) if (!ALPHANUMERIC_CHARSET.includes(ch)) return 'byte';\n return 'alphanumeric';\n}\n\nconst textEncoder = new TextEncoder();\n\n/** Payload bits for the segment body (without mode/count headers). */\nexport function dataBitLength(data: string, mode: QrMode): number {\n switch (mode) {\n case 'numeric':\n return Math.floor(data.length / 3) * 10 + (data.length % 3 === 1 ? 4 : data.length % 3 === 2 ? 7 : 0);\n case 'alphanumeric':\n return Math.floor(data.length / 2) * 11 + (data.length % 2) * 6;\n case 'byte':\n return textEncoder.encode(data).length * 8;\n }\n}\n\n/** Append mode indicator, char count, and payload bits. */\nexport function appendSegment(stream: BitStream, data: string, mode: QrMode, version: number): void {\n stream.append(MODE_BITS[mode], 4);\n stream.append(charCount(data, mode), CHAR_COUNT_BITS[mode][versionGroup(version)]);\n switch (mode) {\n case 'numeric':\n for (let i = 0; i < data.length; ) {\n const n = Math.min(3, data.length - i);\n stream.append(Number.parseInt(data.slice(i, i + n), 10), n === 3 ? 10 : n === 2 ? 7 : 4);\n i += n;\n }\n break;\n case 'alphanumeric':\n for (let i = 0; i < data.length; ) {\n if (i + 1 < data.length) {\n stream.append(ALPHANUMERIC_CHARSET.indexOf(data[i]) * 45 + ALPHANUMERIC_CHARSET.indexOf(data[i + 1]), 11);\n i += 2;\n } else {\n stream.append(ALPHANUMERIC_CHARSET.indexOf(data[i]), 6);\n i += 1;\n }\n }\n break;\n case 'byte':\n for (const b of textEncoder.encode(data)) stream.append(b, 8);\n break;\n }\n}\n\n/** Chars/bytes reported in the count field. Byte mode counts encoded bytes. */\nexport function charCount(data: string, mode: QrMode): number {\n return mode === 'byte' ? textEncoder.encode(data).length : data.length;\n}\n\n/** Capacity in bits for the data area of (version, level). */\nexport const dataCapacityBits = (version: number, level: QrErrorCorrection): number =>\n dataCodewords(version, level) * 8;\n\n/** Bits a segment occupies at `version`: header + payload, before terminator. */\nexport function segmentBits(data: string, mode: QrMode, version: number): number {\n return 4 + CHAR_COUNT_BITS[mode][versionGroup(version)] + dataBitLength(data, mode);\n}\n\n/**\n * Full data-codeword sequence for (version, level): segment + terminator +\n * alignment + pad bytes. Caller guarantees the segment fits.\n */\nexport function buildDataCodewords(data: string, mode: QrMode, version: number, level: QrErrorCorrection): number[] {\n const stream = new BitStream();\n appendSegment(stream, data, mode, version);\n const capacity = dataCapacityBits(version, level);\n stream.append(0, Math.min(4, capacity - stream.length)); // terminator\n stream.padToByte();\n const bytes = stream.toBytes();\n const pad = [0xec, 0x11];\n for (let i = 0; bytes.length < dataCodewords(version, level); i++) bytes.push(pad[i % 2]);\n return bytes;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_segments.cjs","names":[],"sources":["../src/_segments.ts"],"sourcesContent":["import { ALPHANUMERIC_CHARSET, CHAR_COUNT_BITS, dataCodewords, MODE_BITS, versionGroup } from './_tables';\nimport type { QrErrorCorrection, QrMode } from './types';\n\n/**\n * Data-segment assembly: one segment (single mode) covering the whole input,\n * followed by terminator, byte alignment, and 0xEC/0x11 padding (§7.4–7.5).\n * Kanji and multi-segment optimization are out of scope.\n */\n\nconst textEncoder = new TextEncoder();\n\n/**\n * Payload prepared for its mode: text for numeric/alphanumeric, raw bytes for\n * byte mode. Byte mode never round-trips through a string, so invalid UTF-8\n * input survives encoding untouched.\n */\nexport type QrPayload =\n | { readonly mode: 'numeric' | 'alphanumeric'; readonly text: string }\n | { readonly mode: 'byte'; readonly bytes: Uint8Array };\n\n/** Interpret `text` as `mode`: UTF-8-encoding only for byte mode. */\nexport const payloadFromText = (text: string, mode: QrMode): QrPayload =>\n mode === 'byte' ? { bytes: textEncoder.encode(text), mode: 'byte' } : { mode, text };\n\n/** Raw binary payload; always byte mode. */\nexport const payloadFromBytes = (bytes: Uint8Array): QrPayload => ({ bytes, mode: 'byte' });\n\n/** Value carried in the character-count field. */\nexport function payloadLength(payload: QrPayload): number {\n return payload.mode === 'byte' ? payload.bytes.length : payload.text.length;\n}\n\n/** Growable bit stream; `bytes` is valid only after `padToByte()`. */\nexport class BitStream {\n private bits: number[] = [];\n\n get length(): number {\n return this.bits.length;\n }\n\n append(value: number, width: number): void {\n for (let i = width - 1; i >= 0; i--) this.bits.push((value >>> i) & 1);\n }\n\n padToByte(): void {\n while (this.bits.length % 8 !== 0) this.bits.push(0);\n }\n\n toBytes(): number[] {\n const out: number[] = [];\n for (let i = 0; i < this.bits.length; i += 8) {\n let b = 0;\n for (let j = 0; j < 8; j++) b = (b << 1) | this.bits[i + j];\n out.push(b);\n }\n return out;\n }\n}\n\n/** Most compact mode able to encode the whole text. */\nexport function detectMode(text: string): QrMode {\n if (/^\\d+$/.test(text)) return 'numeric';\n for (const ch of text) if (!ALPHANUMERIC_CHARSET.includes(ch)) return 'byte';\n return 'alphanumeric';\n}\n\n/** Payload bits for the segment body (without mode/count headers). */\nexport function dataBitLength(payload: QrPayload): number {\n switch (payload.mode) {\n case 'numeric':\n return (\n Math.floor(payload.text.length / 3) * 10 +\n (payload.text.length % 3 === 1 ? 4 : payload.text.length % 3 === 2 ? 7 : 0)\n );\n case 'alphanumeric':\n return Math.floor(payload.text.length / 2) * 11 + (payload.text.length % 2) * 6;\n case 'byte':\n return payload.bytes.length * 8;\n }\n}\n\n/** Append mode indicator, char count, and payload bits. */\nexport function appendSegment(stream: BitStream, payload: QrPayload, version: number): void {\n stream.append(MODE_BITS[payload.mode], 4);\n stream.append(payloadLength(payload), CHAR_COUNT_BITS[payload.mode][versionGroup(version)]);\n switch (payload.mode) {\n case 'numeric':\n for (let i = 0; i < payload.text.length; ) {\n const n = Math.min(3, payload.text.length - i);\n stream.append(Number.parseInt(payload.text.slice(i, i + n), 10), n === 3 ? 10 : n === 2 ? 7 : 4);\n i += n;\n }\n break;\n case 'alphanumeric':\n for (let i = 0; i < payload.text.length; ) {\n if (i + 1 < payload.text.length) {\n stream.append(\n ALPHANUMERIC_CHARSET.indexOf(payload.text[i]) * 45 + ALPHANUMERIC_CHARSET.indexOf(payload.text[i + 1]),\n 11,\n );\n i += 2;\n } else {\n stream.append(ALPHANUMERIC_CHARSET.indexOf(payload.text[i]), 6);\n i += 1;\n }\n }\n break;\n case 'byte':\n for (const b of payload.bytes) stream.append(b, 8);\n break;\n }\n}\n\n/** Capacity in bits for the data area of (version, level). */\nexport const dataCapacityBits = (version: number, level: QrErrorCorrection): number =>\n dataCodewords(version, level) * 8;\n\n/** Bits a segment occupies at `version`: header + payload, before terminator. */\nexport function segmentBits(payload: QrPayload, version: number): number {\n return 4 + CHAR_COUNT_BITS[payload.mode][versionGroup(version)] + dataBitLength(payload);\n}\n\n/**\n * Full data-codeword sequence for (version, level): segment + terminator +\n * alignment + pad bytes. Caller guarantees the segment fits.\n */\nexport function buildDataCodewords(payload: QrPayload, version: number, level: QrErrorCorrection): number[] {\n const stream = new BitStream();\n appendSegment(stream, payload, version);\n const capacity = dataCapacityBits(version, level);\n stream.append(0, Math.min(4, capacity - stream.length)); // terminator\n stream.padToByte();\n const bytes = stream.toBytes();\n const pad = [0xec, 0x11];\n for (let i = 0; bytes.length < dataCodewords(version, level); i++) bytes.push(pad[i % 2]);\n return bytes;\n}\n"],"mappings":"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"}
@@ -1,9 +1,22 @@
1
1
  import type { QrErrorCorrection, QrMode } from './types';
2
2
  /**
3
- * Data-segment assembly: one segment (single mode) covering the whole input,
4
- * followed by terminator, byte alignment, and 0xEC/0x11 padding (§7.4–7.5).
5
- * Kanji and multi-segment optimization are out of scope.
3
+ * Payload prepared for its mode: text for numeric/alphanumeric, raw bytes for
4
+ * byte mode. Byte mode never round-trips through a string, so invalid UTF-8
5
+ * input survives encoding untouched.
6
6
  */
7
+ export type QrPayload = {
8
+ readonly mode: 'numeric' | 'alphanumeric';
9
+ readonly text: string;
10
+ } | {
11
+ readonly mode: 'byte';
12
+ readonly bytes: Uint8Array;
13
+ };
14
+ /** Interpret `text` as `mode`: UTF-8-encoding only for byte mode. */
15
+ export declare const payloadFromText: (text: string, mode: QrMode) => QrPayload;
16
+ /** Raw binary payload; always byte mode. */
17
+ export declare const payloadFromBytes: (bytes: Uint8Array) => QrPayload;
18
+ /** Value carried in the character-count field. */
19
+ export declare function payloadLength(payload: QrPayload): number;
7
20
  /** Growable bit stream; `bytes` is valid only after `padToByte()`. */
8
21
  export declare class BitStream {
9
22
  private bits;
@@ -12,21 +25,19 @@ export declare class BitStream {
12
25
  padToByte(): void;
13
26
  toBytes(): number[];
14
27
  }
15
- /** Most compact mode able to encode the whole input. */
16
- export declare function detectMode(data: string): QrMode;
28
+ /** Most compact mode able to encode the whole text. */
29
+ export declare function detectMode(text: string): QrMode;
17
30
  /** Payload bits for the segment body (without mode/count headers). */
18
- export declare function dataBitLength(data: string, mode: QrMode): number;
31
+ export declare function dataBitLength(payload: QrPayload): number;
19
32
  /** Append mode indicator, char count, and payload bits. */
20
- export declare function appendSegment(stream: BitStream, data: string, mode: QrMode, version: number): void;
21
- /** Chars/bytes reported in the count field. Byte mode counts encoded bytes. */
22
- export declare function charCount(data: string, mode: QrMode): number;
33
+ export declare function appendSegment(stream: BitStream, payload: QrPayload, version: number): void;
23
34
  /** Capacity in bits for the data area of (version, level). */
24
35
  export declare const dataCapacityBits: (version: number, level: QrErrorCorrection) => number;
25
36
  /** Bits a segment occupies at `version`: header + payload, before terminator. */
26
- export declare function segmentBits(data: string, mode: QrMode, version: number): number;
37
+ export declare function segmentBits(payload: QrPayload, version: number): number;
27
38
  /**
28
39
  * Full data-codeword sequence for (version, level): segment + terminator +
29
40
  * alignment + pad bytes. Caller guarantees the segment fits.
30
41
  */
31
- export declare function buildDataCodewords(data: string, mode: QrMode, version: number, level: QrErrorCorrection): number[];
42
+ export declare function buildDataCodewords(payload: QrPayload, version: number, level: QrErrorCorrection): number[];
32
43
  //# sourceMappingURL=_segments.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_segments.d.ts","sourceRoot":"","sources":["../src/_segments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEzD;;;;GAIG;AAEH,sEAAsE;AACtE,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAgB;IAE5B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI1C,SAAS,IAAI,IAAI;IAIjB,OAAO,IAAI,MAAM,EAAE;CASpB;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C;AAID,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAShE;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA0BlG;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,EAAE,OAAO,iBAAiB,KAAG,MAC1C,CAAC;AAEpC,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAUlH"}
1
+ {"version":3,"file":"_segments.d.ts","sourceRoot":"","sources":["../src/_segments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAUzD;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAE1D,qEAAqE;AACrE,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,SACyB,CAAC;AAEvF,4CAA4C;AAC5C,eAAO,MAAM,gBAAgB,GAAI,OAAO,UAAU,KAAG,SAAsC,CAAC;AAE5F,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAExD;AAED,sEAAsE;AACtE,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAgB;IAE5B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI1C,SAAS,IAAI,IAAI;IAIjB,OAAO,IAAI,MAAM,EAAE;CASpB;AAED,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAYxD;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA6B1F;AAED,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,EAAE,OAAO,iBAAiB,KAAG,MAC1C,CAAC;AAEpC,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAU1G"}
package/dist/_segments.js CHANGED
@@ -1,70 +1,2 @@
1
- import { ALPHANUMERIC_CHARSET as e, CHAR_COUNT_BITS as t, MODE_BITS as n, dataCodewords as r, versionGroup as i } from "./_tables.js";
2
- //#region src/_segments.ts
3
- var a = class {
4
- bits = [];
5
- get length() {
6
- return this.bits.length;
7
- }
8
- append(e, t) {
9
- for (let n = t - 1; n >= 0; n--) this.bits.push(e >>> n & 1);
10
- }
11
- padToByte() {
12
- for (; this.bits.length % 8 != 0;) this.bits.push(0);
13
- }
14
- toBytes() {
15
- let e = [];
16
- for (let t = 0; t < this.bits.length; t += 8) {
17
- let n = 0;
18
- for (let e = 0; e < 8; e++) n = n << 1 | this.bits[t + e];
19
- e.push(n);
20
- }
21
- return e;
22
- }
23
- };
24
- function o(e) {
25
- if (/^\d+$/.test(e)) return "numeric";
26
- for (let t of e) if (!"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:".includes(t)) return "byte";
27
- return "alphanumeric";
28
- }
29
- var s = new TextEncoder();
30
- function c(e, t) {
31
- switch (t) {
32
- case "numeric": return Math.floor(e.length / 3) * 10 + (e.length % 3 == 1 ? 4 : e.length % 3 == 2 ? 7 : 0);
33
- case "alphanumeric": return Math.floor(e.length / 2) * 11 + e.length % 2 * 6;
34
- case "byte": return s.encode(e).length * 8;
35
- }
36
- }
37
- function l(r, a, o, c) {
38
- switch (r.append(n[o], 4), r.append(u(a, o), t[o][i(c)]), o) {
39
- case "numeric":
40
- for (let e = 0; e < a.length;) {
41
- let t = Math.min(3, a.length - e);
42
- r.append(Number.parseInt(a.slice(e, e + t), 10), t === 3 ? 10 : t === 2 ? 7 : 4), e += t;
43
- }
44
- break;
45
- case "alphanumeric":
46
- for (let t = 0; t < a.length;) t + 1 < a.length ? (r.append(e.indexOf(a[t]) * 45 + e.indexOf(a[t + 1]), 11), t += 2) : (r.append(e.indexOf(a[t]), 6), t += 1);
47
- break;
48
- case "byte": for (let e of s.encode(a)) r.append(e, 8);
49
- }
50
- }
51
- function u(e, t) {
52
- return t === "byte" ? s.encode(e).length : e.length;
53
- }
54
- var d = (e, t) => r(e, t) * 8;
55
- function f(e, n, r) {
56
- return 4 + t[n][i(r)] + c(e, n);
57
- }
58
- function p(e, t, n, i) {
59
- let o = new a();
60
- l(o, e, t, n);
61
- let s = d(n, i);
62
- o.append(0, Math.min(4, s - o.length)), o.padToByte();
63
- let c = o.toBytes(), u = [236, 17];
64
- for (let e = 0; c.length < r(n, i); e++) c.push(u[e % 2]);
65
- return c;
66
- }
67
- //#endregion
68
- export { a as BitStream, l as appendSegment, p as buildDataCodewords, u as charCount, c as dataBitLength, d as dataCapacityBits, o as detectMode, f as segmentBits };
69
-
1
+ import{ALPHANUMERIC_CHARSET as e,CHAR_COUNT_BITS as t,MODE_BITS as n,dataCodewords as r,versionGroup as i}from"./_tables.js";var a=new TextEncoder,payloadFromText=(e,t)=>t===`byte`?{bytes:a.encode(e),mode:`byte`}:{mode:t,text:e},payloadFromBytes=e=>({bytes:e,mode:`byte`});function payloadLength(e){return e.mode===`byte`?e.bytes.length:e.text.length}var BitStream=class{bits=[];get length(){return this.bits.length}append(e,t){for(let n=t-1;n>=0;n--)this.bits.push(e>>>n&1)}padToByte(){for(;this.bits.length%8!=0;)this.bits.push(0)}toBytes(){let e=[];for(let t=0;t<this.bits.length;t+=8){let n=0;for(let e=0;e<8;e++)n=n<<1|this.bits[t+e];e.push(n)}return e}};function detectMode(e){if(/^\d+$/.test(e))return`numeric`;for(let t of e)if(!`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`.includes(t))return`byte`;return`alphanumeric`}function dataBitLength(e){switch(e.mode){case`numeric`:return Math.floor(e.text.length/3)*10+(e.text.length%3==1?4:e.text.length%3==2?7:0);case`alphanumeric`:return Math.floor(e.text.length/2)*11+e.text.length%2*6;case`byte`:return e.bytes.length*8}}function appendSegment(r,a,o){switch(r.append(n[a.mode],4),r.append(payloadLength(a),t[a.mode][i(o)]),a.mode){case`numeric`:for(let e=0;e<a.text.length;){let t=Math.min(3,a.text.length-e);r.append(Number.parseInt(a.text.slice(e,e+t),10),t===3?10:t===2?7:4),e+=t}break;case`alphanumeric`:for(let t=0;t<a.text.length;)t+1<a.text.length?(r.append(e.indexOf(a.text[t])*45+e.indexOf(a.text[t+1]),11),t+=2):(r.append(e.indexOf(a.text[t]),6),t+=1);break;case`byte`:for(let e of a.bytes)r.append(e,8)}}var dataCapacityBits=(e,t)=>r(e,t)*8;function segmentBits(e,n){return 4+t[e.mode][i(n)]+dataBitLength(e)}function buildDataCodewords(e,t,n){let i=new BitStream;appendSegment(i,e,t);let a=dataCapacityBits(t,n);i.append(0,Math.min(4,a-i.length)),i.padToByte();let o=i.toBytes(),s=[236,17];for(let e=0;o.length<r(t,n);e++)o.push(s[e%2]);return o}export{BitStream,appendSegment,buildDataCodewords,dataBitLength,dataCapacityBits,detectMode,payloadFromBytes,payloadFromText,payloadLength,segmentBits};
70
2
  //# sourceMappingURL=_segments.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_segments.js","names":[],"sources":["../src/_segments.ts"],"sourcesContent":["import { ALPHANUMERIC_CHARSET, CHAR_COUNT_BITS, dataCodewords, MODE_BITS, versionGroup } from './_tables';\nimport type { QrErrorCorrection, QrMode } from './types';\n\n/**\n * Data-segment assembly: one segment (single mode) covering the whole input,\n * followed by terminator, byte alignment, and 0xEC/0x11 padding (§7.4–7.5).\n * Kanji and multi-segment optimization are out of scope.\n */\n\n/** Growable bit stream; `bytes` is valid only after `padToByte()`. */\nexport class BitStream {\n private bits: number[] = [];\n\n get length(): number {\n return this.bits.length;\n }\n\n append(value: number, width: number): void {\n for (let i = width - 1; i >= 0; i--) this.bits.push((value >>> i) & 1);\n }\n\n padToByte(): void {\n while (this.bits.length % 8 !== 0) this.bits.push(0);\n }\n\n toBytes(): number[] {\n const out: number[] = [];\n for (let i = 0; i < this.bits.length; i += 8) {\n let b = 0;\n for (let j = 0; j < 8; j++) b = (b << 1) | this.bits[i + j];\n out.push(b);\n }\n return out;\n }\n}\n\n/** Most compact mode able to encode the whole input. */\nexport function detectMode(data: string): QrMode {\n if (/^\\d+$/.test(data)) return 'numeric';\n for (const ch of data) if (!ALPHANUMERIC_CHARSET.includes(ch)) return 'byte';\n return 'alphanumeric';\n}\n\nconst textEncoder = new TextEncoder();\n\n/** Payload bits for the segment body (without mode/count headers). */\nexport function dataBitLength(data: string, mode: QrMode): number {\n switch (mode) {\n case 'numeric':\n return Math.floor(data.length / 3) * 10 + (data.length % 3 === 1 ? 4 : data.length % 3 === 2 ? 7 : 0);\n case 'alphanumeric':\n return Math.floor(data.length / 2) * 11 + (data.length % 2) * 6;\n case 'byte':\n return textEncoder.encode(data).length * 8;\n }\n}\n\n/** Append mode indicator, char count, and payload bits. */\nexport function appendSegment(stream: BitStream, data: string, mode: QrMode, version: number): void {\n stream.append(MODE_BITS[mode], 4);\n stream.append(charCount(data, mode), CHAR_COUNT_BITS[mode][versionGroup(version)]);\n switch (mode) {\n case 'numeric':\n for (let i = 0; i < data.length; ) {\n const n = Math.min(3, data.length - i);\n stream.append(Number.parseInt(data.slice(i, i + n), 10), n === 3 ? 10 : n === 2 ? 7 : 4);\n i += n;\n }\n break;\n case 'alphanumeric':\n for (let i = 0; i < data.length; ) {\n if (i + 1 < data.length) {\n stream.append(ALPHANUMERIC_CHARSET.indexOf(data[i]) * 45 + ALPHANUMERIC_CHARSET.indexOf(data[i + 1]), 11);\n i += 2;\n } else {\n stream.append(ALPHANUMERIC_CHARSET.indexOf(data[i]), 6);\n i += 1;\n }\n }\n break;\n case 'byte':\n for (const b of textEncoder.encode(data)) stream.append(b, 8);\n break;\n }\n}\n\n/** Chars/bytes reported in the count field. Byte mode counts encoded bytes. */\nexport function charCount(data: string, mode: QrMode): number {\n return mode === 'byte' ? textEncoder.encode(data).length : data.length;\n}\n\n/** Capacity in bits for the data area of (version, level). */\nexport const dataCapacityBits = (version: number, level: QrErrorCorrection): number =>\n dataCodewords(version, level) * 8;\n\n/** Bits a segment occupies at `version`: header + payload, before terminator. */\nexport function segmentBits(data: string, mode: QrMode, version: number): number {\n return 4 + CHAR_COUNT_BITS[mode][versionGroup(version)] + dataBitLength(data, mode);\n}\n\n/**\n * Full data-codeword sequence for (version, level): segment + terminator +\n * alignment + pad bytes. Caller guarantees the segment fits.\n */\nexport function buildDataCodewords(data: string, mode: QrMode, version: number, level: QrErrorCorrection): number[] {\n const stream = new BitStream();\n appendSegment(stream, data, mode, version);\n const capacity = dataCapacityBits(version, level);\n stream.append(0, Math.min(4, capacity - stream.length)); // terminator\n stream.padToByte();\n const bytes = stream.toBytes();\n const pad = [0xec, 0x11];\n for (let i = 0; bytes.length < dataCodewords(version, level); i++) bytes.push(pad[i % 2]);\n return bytes;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_segments.js","names":[],"sources":["../src/_segments.ts"],"sourcesContent":["import { ALPHANUMERIC_CHARSET, CHAR_COUNT_BITS, dataCodewords, MODE_BITS, versionGroup } from './_tables';\nimport type { QrErrorCorrection, QrMode } from './types';\n\n/**\n * Data-segment assembly: one segment (single mode) covering the whole input,\n * followed by terminator, byte alignment, and 0xEC/0x11 padding (§7.4–7.5).\n * Kanji and multi-segment optimization are out of scope.\n */\n\nconst textEncoder = new TextEncoder();\n\n/**\n * Payload prepared for its mode: text for numeric/alphanumeric, raw bytes for\n * byte mode. Byte mode never round-trips through a string, so invalid UTF-8\n * input survives encoding untouched.\n */\nexport type QrPayload =\n | { readonly mode: 'numeric' | 'alphanumeric'; readonly text: string }\n | { readonly mode: 'byte'; readonly bytes: Uint8Array };\n\n/** Interpret `text` as `mode`: UTF-8-encoding only for byte mode. */\nexport const payloadFromText = (text: string, mode: QrMode): QrPayload =>\n mode === 'byte' ? { bytes: textEncoder.encode(text), mode: 'byte' } : { mode, text };\n\n/** Raw binary payload; always byte mode. */\nexport const payloadFromBytes = (bytes: Uint8Array): QrPayload => ({ bytes, mode: 'byte' });\n\n/** Value carried in the character-count field. */\nexport function payloadLength(payload: QrPayload): number {\n return payload.mode === 'byte' ? payload.bytes.length : payload.text.length;\n}\n\n/** Growable bit stream; `bytes` is valid only after `padToByte()`. */\nexport class BitStream {\n private bits: number[] = [];\n\n get length(): number {\n return this.bits.length;\n }\n\n append(value: number, width: number): void {\n for (let i = width - 1; i >= 0; i--) this.bits.push((value >>> i) & 1);\n }\n\n padToByte(): void {\n while (this.bits.length % 8 !== 0) this.bits.push(0);\n }\n\n toBytes(): number[] {\n const out: number[] = [];\n for (let i = 0; i < this.bits.length; i += 8) {\n let b = 0;\n for (let j = 0; j < 8; j++) b = (b << 1) | this.bits[i + j];\n out.push(b);\n }\n return out;\n }\n}\n\n/** Most compact mode able to encode the whole text. */\nexport function detectMode(text: string): QrMode {\n if (/^\\d+$/.test(text)) return 'numeric';\n for (const ch of text) if (!ALPHANUMERIC_CHARSET.includes(ch)) return 'byte';\n return 'alphanumeric';\n}\n\n/** Payload bits for the segment body (without mode/count headers). */\nexport function dataBitLength(payload: QrPayload): number {\n switch (payload.mode) {\n case 'numeric':\n return (\n Math.floor(payload.text.length / 3) * 10 +\n (payload.text.length % 3 === 1 ? 4 : payload.text.length % 3 === 2 ? 7 : 0)\n );\n case 'alphanumeric':\n return Math.floor(payload.text.length / 2) * 11 + (payload.text.length % 2) * 6;\n case 'byte':\n return payload.bytes.length * 8;\n }\n}\n\n/** Append mode indicator, char count, and payload bits. */\nexport function appendSegment(stream: BitStream, payload: QrPayload, version: number): void {\n stream.append(MODE_BITS[payload.mode], 4);\n stream.append(payloadLength(payload), CHAR_COUNT_BITS[payload.mode][versionGroup(version)]);\n switch (payload.mode) {\n case 'numeric':\n for (let i = 0; i < payload.text.length; ) {\n const n = Math.min(3, payload.text.length - i);\n stream.append(Number.parseInt(payload.text.slice(i, i + n), 10), n === 3 ? 10 : n === 2 ? 7 : 4);\n i += n;\n }\n break;\n case 'alphanumeric':\n for (let i = 0; i < payload.text.length; ) {\n if (i + 1 < payload.text.length) {\n stream.append(\n ALPHANUMERIC_CHARSET.indexOf(payload.text[i]) * 45 + ALPHANUMERIC_CHARSET.indexOf(payload.text[i + 1]),\n 11,\n );\n i += 2;\n } else {\n stream.append(ALPHANUMERIC_CHARSET.indexOf(payload.text[i]), 6);\n i += 1;\n }\n }\n break;\n case 'byte':\n for (const b of payload.bytes) stream.append(b, 8);\n break;\n }\n}\n\n/** Capacity in bits for the data area of (version, level). */\nexport const dataCapacityBits = (version: number, level: QrErrorCorrection): number =>\n dataCodewords(version, level) * 8;\n\n/** Bits a segment occupies at `version`: header + payload, before terminator. */\nexport function segmentBits(payload: QrPayload, version: number): number {\n return 4 + CHAR_COUNT_BITS[payload.mode][versionGroup(version)] + dataBitLength(payload);\n}\n\n/**\n * Full data-codeword sequence for (version, level): segment + terminator +\n * alignment + pad bytes. Caller guarantees the segment fits.\n */\nexport function buildDataCodewords(payload: QrPayload, version: number, level: QrErrorCorrection): number[] {\n const stream = new BitStream();\n appendSegment(stream, payload, version);\n const capacity = dataCapacityBits(version, level);\n stream.append(0, Math.min(4, capacity - stream.length)); // terminator\n stream.padToByte();\n const bytes = stream.toBytes();\n const pad = [0xec, 0x11];\n for (let i = 0; bytes.length < dataCodewords(version, level); i++) bytes.push(pad[i % 2]);\n return bytes;\n}\n"],"mappings":"6HASA,IAAM,EAAc,IAAI,YAYX,iBAAmB,EAAc,IAC5C,IAAS,OAAS,CAAE,MAAO,EAAY,OAAO,CAAI,EAAG,KAAM,MAAO,EAAI,CAAE,OAAM,MAAK,EAGxE,iBAAoB,IAAkC,CAAE,QAAO,KAAM,MAAO,GAGzF,SAAgB,cAAc,EAA4B,CACxD,OAAO,EAAQ,OAAS,OAAS,EAAQ,MAAM,OAAS,EAAQ,KAAK,MACvE,CAGA,IAAa,UAAb,KAAuB,CACrB,KAAyB,CAAC,EAE1B,IAAI,QAAiB,CACnB,OAAO,KAAK,KAAK,MACnB,CAEA,OAAO,EAAe,EAAqB,CACzC,IAAK,IAAI,EAAI,EAAQ,EAAG,GAAK,EAAG,IAAK,KAAK,KAAK,KAAM,IAAU,EAAK,CAAC,CACvE,CAEA,WAAkB,CAChB,KAAO,KAAK,KAAK,OAAS,GAAM,GAAG,KAAK,KAAK,KAAK,CAAC,CACrD,CAEA,SAAoB,CAClB,IAAM,EAAgB,CAAC,EACvB,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,KAAK,OAAQ,GAAK,EAAG,CAC5C,IAAI,EAAI,EACR,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,EAAK,GAAK,EAAK,KAAK,KAAK,EAAI,GACzD,EAAI,KAAK,CAAC,CACZ,CACA,OAAO,CACT,CACF,EAGA,SAAgB,WAAW,EAAsB,CAC/C,GAAI,QAAQ,KAAK,CAAI,EAAG,MAAO,UAC/B,IAAK,IAAM,KAAM,EAAM,GAAI,CAAA,gDAAsB,SAAS,CAAE,EAAG,MAAO,OACtE,MAAO,cACT,CAGA,SAAgB,cAAc,EAA4B,CACxD,OAAQ,EAAQ,KAAhB,CACE,IAAK,UACH,OACE,KAAK,MAAM,EAAQ,KAAK,OAAS,CAAC,EAAI,IACrC,EAAQ,KAAK,OAAS,GAAM,EAAI,EAAI,EAAQ,KAAK,OAAS,GAAM,EAAI,EAAI,GAE7E,IAAK,eACH,OAAO,KAAK,MAAM,EAAQ,KAAK,OAAS,CAAC,EAAI,GAAM,EAAQ,KAAK,OAAS,EAAK,EAChF,IAAK,OACH,OAAO,EAAQ,MAAM,OAAS,CAClC,CACF,CAGA,SAAgB,cAAc,EAAmB,EAAoB,EAAuB,CAG1F,OAFA,EAAO,OAAO,EAAU,EAAQ,MAAO,CAAC,EACxC,EAAO,OAAO,cAAc,CAAO,EAAG,EAAgB,EAAQ,KAAK,CAAC,EAAa,CAAO,EAAE,EAClF,EAAQ,KAAhB,CACE,IAAK,UACH,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,KAAK,QAAU,CACzC,IAAM,EAAI,KAAK,IAAI,EAAG,EAAQ,KAAK,OAAS,CAAC,EAC7C,EAAO,OAAO,OAAO,SAAS,EAAQ,KAAK,MAAM,EAAG,EAAI,CAAC,EAAG,EAAE,EAAG,IAAM,EAAI,GAAK,IAAM,EAAI,EAAI,CAAC,EAC/F,GAAK,CACP,CACA,MACF,IAAK,eACH,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,KAAK,QAC3B,EAAI,EAAI,EAAQ,KAAK,QACvB,EAAO,OACL,EAAqB,QAAQ,EAAQ,KAAK,EAAE,EAAI,GAAK,EAAqB,QAAQ,EAAQ,KAAK,EAAI,EAAE,EACrG,EACF,EACA,GAAK,IAEL,EAAO,OAAO,EAAqB,QAAQ,EAAQ,KAAK,EAAE,EAAG,CAAC,EAC9D,GAAK,GAGT,MACF,IAAK,OACH,IAAK,IAAM,KAAK,EAAQ,MAAO,EAAO,OAAO,EAAG,CAAC,CAErD,CACF,CAGA,IAAa,kBAAoB,EAAiB,IAChD,EAAc,EAAS,CAAK,EAAI,EAGlC,SAAgB,YAAY,EAAoB,EAAyB,CACvE,MAAO,GAAI,EAAgB,EAAQ,KAAK,CAAC,EAAa,CAAO,GAAK,cAAc,CAAO,CACzF,CAMA,SAAgB,mBAAmB,EAAoB,EAAiB,EAAoC,CAC1G,IAAM,EAAS,IAAI,UACnB,cAAc,EAAQ,EAAS,CAAO,EACtC,IAAM,EAAW,iBAAiB,EAAS,CAAK,EAChD,EAAO,OAAO,EAAG,KAAK,IAAI,EAAG,EAAW,EAAO,MAAM,CAAC,EACtD,EAAO,UAAU,EACjB,IAAM,EAAQ,EAAO,QAAQ,EACvB,EAAM,CAAC,IAAM,EAAI,EACvB,IAAK,IAAI,EAAI,EAAG,EAAM,OAAS,EAAc,EAAS,CAAK,EAAG,IAAK,EAAM,KAAK,EAAI,EAAI,EAAE,EACxF,OAAO,CACT"}
package/dist/_tables.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=[`L`,`M`,`Q`,`H`],t=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`,n={alphanumeric:2,byte:4,numeric:1},r={alphanumeric:[9,11,13],byte:[8,16,16],numeric:[10,12,14]},i={H:2,L:1,M:0,Q:3},a=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],o=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,56,59,62,65,68,71,74,77,81]],s=t=>e.indexOf(t),c=e=>e*4+17;function l(e){if(e===1)return[];let t=Math.floor(e/7)+2,n=e===32?26:Math.ceil((e*4+4)/(t*2-2))*2,r=[6];for(let i=e*4+10;r.length<t;i-=n)r.splice(1,0,i);return r}function u(e){let t=(16*e+128)*e+64;if(e>=2){let n=Math.floor(e/7)+2;t-=(25*n-10)*n-55,e>=7&&(t-=36)}return t}var d=e=>Math.floor(u(e)/8);function f(e,t){return a[s(t)][e]}function p(e,t){return o[s(t)][e]}function m(e,t){return d(e)-f(e,t)*p(e,t)}function h(e){return e<=9?0:e<=26?1:2}exports.ALPHANUMERIC_CHARSET=t,exports.CHAR_COUNT_BITS=r,exports.EC_CODEWORDS_PER_BLOCK=a,exports.EC_LEVELS=e,exports.FORMAT_EC_BITS=i,exports.MODE_BITS=n,exports.NUM_EC_BLOCKS=o,exports.alignmentPatternPositions=l,exports.dataCodewords=m,exports.ecCodewordsPerBlock=f,exports.matrixSize=c,exports.numEcBlocks=p,exports.rawDataModules=u,exports.totalCodewords=d,exports.versionGroup=h;
1
+ var e=[`L`,`M`,`Q`,`H`],t=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`,n={alphanumeric:2,byte:4,numeric:1},r={alphanumeric:[9,11,13],byte:[8,16,16],numeric:[10,12,14]},i={H:2,L:1,M:0,Q:3},a=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],o=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,56,59,62,65,68,71,74,77,81]],ecIndex=t=>e.indexOf(t),matrixSize=e=>e*4+17;function alignmentPatternPositions(e){if(e===1)return[];let t=Math.floor(e/7)+2,n=e===32?26:Math.ceil((e*4+4)/(t*2-2))*2,r=[6];for(let i=e*4+10;r.length<t;i-=n)r.splice(1,0,i);return r}function rawDataModules(e){let t=(16*e+128)*e+64;if(e>=2){let n=Math.floor(e/7)+2;t-=(25*n-10)*n-55,e>=7&&(t-=36)}return t}var totalCodewords=e=>Math.floor(rawDataModules(e)/8);function ecCodewordsPerBlock(e,t){return a[ecIndex(t)][e]}function numEcBlocks(e,t){return o[ecIndex(t)][e]}function dataCodewords(e,t){return totalCodewords(e)-ecCodewordsPerBlock(e,t)*numEcBlocks(e,t)}function versionGroup(e){return e<=9?0:e<=26?1:2}exports.ALPHANUMERIC_CHARSET=t,exports.CHAR_COUNT_BITS=r,exports.EC_CODEWORDS_PER_BLOCK=a,exports.EC_LEVELS=e,exports.FORMAT_EC_BITS=i,exports.MODE_BITS=n,exports.NUM_EC_BLOCKS=o,exports.alignmentPatternPositions=alignmentPatternPositions,exports.dataCodewords=dataCodewords,exports.ecCodewordsPerBlock=ecCodewordsPerBlock,exports.matrixSize=matrixSize,exports.numEcBlocks=numEcBlocks,exports.rawDataModules=rawDataModules,exports.totalCodewords=totalCodewords,exports.versionGroup=versionGroup;
2
2
  //# sourceMappingURL=_tables.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_tables.cjs","names":[],"sources":["../src/_tables.ts"],"sourcesContent":["import type { QrErrorCorrection, QrMode } from './types';\n\n/**\n * QR Model 2 lookup tables, transcribed from ISO/IEC 18004:2015:\n * - `EC_CODEWORDS_PER_BLOCK` / `NUM_EC_BLOCKS` — Table 9 (error-correction\n * characteristics). Stored as per-block EC codewords and block count; the\n * group-1/group-2 split is derived, since all blocks share one EC length.\n * - `alignmentPatternPositions` — Table E.1, computed by the spec formula.\n * - `CHAR_COUNT_BITS` — Table 3 (character-count indicator bit widths).\n * - `FORMAT_EC_BITS` — Table 10 (2-bit level field inside format information).\n *\n * `tables.test.ts` cross-checks every entry against the raw-module formula, so\n * a transcription slip fails the consistency test before the decode oracle runs.\n */\n\n/** Index order used by the table rows below. */\nexport const EC_LEVELS = ['L', 'M', 'Q', 'H'] as const;\n\nexport const ALPHANUMERIC_CHARSET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:';\n\n/** Mode indicators (Table 2). */\nexport const MODE_BITS: Record<QrMode, number> = {\n alphanumeric: 0b0010,\n byte: 0b0100,\n numeric: 0b0001,\n};\n\n/** Character-count indicator widths for version groups 1–9 / 10–26 / 27–40. */\nexport const CHAR_COUNT_BITS: Record<QrMode, readonly [number, number, number]> = {\n alphanumeric: [9, 11, 13],\n byte: [8, 16, 16],\n numeric: [10, 12, 14],\n};\n\n/** EC level bits inside format information (L=01, M=00, Q=11, H=10). */\nexport const FORMAT_EC_BITS: Record<QrErrorCorrection, number> = { H: 0b10, L: 0b01, M: 0b00, Q: 0b11 };\n\n/** Row 0 = L, row 1 = M, row 2 = Q, row 3 = H; column 0 unused (versions start at 1). */\nexport const EC_CODEWORDS_PER_BLOCK: ReadonlyArray<ReadonlyArray<number>> = [\n // prettier-ignore\n [\n -1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n // prettier-ignore\n [\n -1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28,\n 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n ],\n // prettier-ignore\n [\n -1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n // prettier-ignore\n [\n -1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n];\n\nexport const NUM_EC_BLOCKS: ReadonlyArray<ReadonlyArray<number>> = [\n // prettier-ignore\n [\n -1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19,\n 19, 20, 21, 22, 24, 25,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31,\n 33, 35, 37, 38, 40, 43, 45, 47, 49,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43,\n 45, 48, 51, 53, 56, 59, 62, 65, 68,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48,\n 51, 56, 59, 62, 65, 68, 71, 74, 77, 81,\n ],\n];\n\nconst ecIndex = (level: QrErrorCorrection): number => EC_LEVELS.indexOf(level);\n\n/** Total modules per side. */\nexport const matrixSize = (version: number): number => version * 4 + 17;\n\n/** Alignment-pattern center coordinates (Table E.1 formula). */\nexport function alignmentPatternPositions(version: number): readonly number[] {\n if (version === 1) return [];\n const numAlign = Math.floor(version / 7) + 2;\n const step = version === 32 ? 26 : Math.ceil((version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n const result = [6];\n for (let pos = version * 4 + 10; result.length < numAlign; pos -= step) result.splice(1, 0, pos);\n return result;\n}\n\n/**\n * Total raw modules available for data + EC + remainder bits, derived from the\n * symbol geometry (Table 1 / Annex A): full grid minus finders, separators,\n * timing, alignment, dark module, format and version information.\n */\nexport function rawDataModules(version: number): number {\n let result = (16 * version + 128) * version + 64;\n if (version >= 2) {\n const numAlign = Math.floor(version / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (version >= 7) result -= 36;\n }\n return result;\n}\n\n/** Total codewords (data + EC) for a version. */\nexport const totalCodewords = (version: number): number => Math.floor(rawDataModules(version) / 8);\n\n/** Leftover bits after the codeword stream (0, 3, 4, or 7 by version). */\nexport const remainderBits = (version: number): number => rawDataModules(version) % 8;\n\nexport function ecCodewordsPerBlock(version: number, level: QrErrorCorrection): number {\n return EC_CODEWORDS_PER_BLOCK[ecIndex(level)][version];\n}\n\nexport function numEcBlocks(version: number, level: QrErrorCorrection): number {\n return NUM_EC_BLOCKS[ecIndex(level)][version];\n}\n\n/** Data codewords for a (version, level) pair. */\nexport function dataCodewords(version: number, level: QrErrorCorrection): number {\n return totalCodewords(version) - ecCodewordsPerBlock(version, level) * numEcBlocks(version, level);\n}\n\n/** Version group for the character-count indicator: 0 → 1–9, 1 → 10–26, 2 → 27–40. */\nexport function versionGroup(version: number): 0 | 1 | 2 {\n return version <= 9 ? 0 : version <= 26 ? 1 : 2;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_tables.cjs","names":[],"sources":["../src/_tables.ts"],"sourcesContent":["import type { QrErrorCorrection, QrMode } from './types';\n\n/**\n * QR Model 2 lookup tables, transcribed from ISO/IEC 18004:2015:\n * - `EC_CODEWORDS_PER_BLOCK` / `NUM_EC_BLOCKS`: Table 9 (error-correction\n * characteristics). Stored as per-block EC codewords and block count; the\n * group-1/group-2 split is derived, since all blocks share one EC length.\n * - `alignmentPatternPositions`: Table E.1, computed by the spec formula.\n * - `CHAR_COUNT_BITS`: Table 3 (character-count indicator bit widths).\n * - `FORMAT_EC_BITS`: Table 10 (2-bit level field inside format information).\n *\n * `tables.test.ts` cross-checks every entry against the raw-module formula, so\n * a transcription slip fails the consistency test before the decode oracle runs.\n */\n\n/** Index order used by the table rows below. */\nexport const EC_LEVELS = ['L', 'M', 'Q', 'H'] as const;\n\nexport const ALPHANUMERIC_CHARSET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:';\n\n/** Mode indicators (Table 2). */\nexport const MODE_BITS: Record<QrMode, number> = {\n alphanumeric: 0b0010,\n byte: 0b0100,\n numeric: 0b0001,\n};\n\n/** Character-count indicator widths for version groups 1–9 / 10–26 / 27–40. */\nexport const CHAR_COUNT_BITS: Record<QrMode, readonly [number, number, number]> = {\n alphanumeric: [9, 11, 13],\n byte: [8, 16, 16],\n numeric: [10, 12, 14],\n};\n\n/** EC level bits inside format information (L=01, M=00, Q=11, H=10). */\nexport const FORMAT_EC_BITS: Record<QrErrorCorrection, number> = { H: 0b10, L: 0b01, M: 0b00, Q: 0b11 };\n\n/** Row 0 = L, row 1 = M, row 2 = Q, row 3 = H; column 0 unused (versions start at 1). */\nexport const EC_CODEWORDS_PER_BLOCK: ReadonlyArray<ReadonlyArray<number>> = [\n // prettier-ignore\n [\n -1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n // prettier-ignore\n [\n -1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28,\n 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n ],\n // prettier-ignore\n [\n -1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n // prettier-ignore\n [\n -1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n];\n\nexport const NUM_EC_BLOCKS: ReadonlyArray<ReadonlyArray<number>> = [\n // prettier-ignore\n [\n -1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19,\n 19, 20, 21, 22, 24, 25,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31,\n 33, 35, 37, 38, 40, 43, 45, 47, 49,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43,\n 45, 48, 51, 53, 56, 59, 62, 65, 68,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48,\n 51, 56, 59, 62, 65, 68, 71, 74, 77, 81,\n ],\n];\n\nconst ecIndex = (level: QrErrorCorrection): number => EC_LEVELS.indexOf(level);\n\n/** Total modules per side. */\nexport const matrixSize = (version: number): number => version * 4 + 17;\n\n/** Alignment-pattern center coordinates (Table E.1 formula). */\nexport function alignmentPatternPositions(version: number): readonly number[] {\n if (version === 1) return [];\n const numAlign = Math.floor(version / 7) + 2;\n const step = version === 32 ? 26 : Math.ceil((version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n const result = [6];\n for (let pos = version * 4 + 10; result.length < numAlign; pos -= step) result.splice(1, 0, pos);\n return result;\n}\n\n/**\n * Total raw modules available for data + EC + remainder bits, derived from the\n * symbol geometry (Table 1 / Annex A): full grid minus finders, separators,\n * timing, alignment, dark module, format and version information.\n */\nexport function rawDataModules(version: number): number {\n let result = (16 * version + 128) * version + 64;\n if (version >= 2) {\n const numAlign = Math.floor(version / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (version >= 7) result -= 36;\n }\n return result;\n}\n\n/** Total codewords (data + EC) for a version. */\nexport const totalCodewords = (version: number): number => Math.floor(rawDataModules(version) / 8);\n\n/** Leftover bits after the codeword stream (0, 3, 4, or 7 by version). */\nexport const remainderBits = (version: number): number => rawDataModules(version) % 8;\n\nexport function ecCodewordsPerBlock(version: number, level: QrErrorCorrection): number {\n return EC_CODEWORDS_PER_BLOCK[ecIndex(level)][version];\n}\n\nexport function numEcBlocks(version: number, level: QrErrorCorrection): number {\n return NUM_EC_BLOCKS[ecIndex(level)][version];\n}\n\n/** Data codewords for a (version, level) pair. */\nexport function dataCodewords(version: number, level: QrErrorCorrection): number {\n return totalCodewords(version) - ecCodewordsPerBlock(version, level) * numEcBlocks(version, level);\n}\n\n/** Version group for the character-count indicator: 0 → 1–9, 1 → 10–26, 2 → 27–40. */\nexport function versionGroup(version: number): 0 | 1 | 2 {\n return version <= 9 ? 0 : version <= 26 ? 1 : 2;\n}\n"],"mappings":"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"}
package/dist/_tables.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import type { QrErrorCorrection, QrMode } from './types';
2
2
  /**
3
3
  * QR Model 2 lookup tables, transcribed from ISO/IEC 18004:2015:
4
- * - `EC_CODEWORDS_PER_BLOCK` / `NUM_EC_BLOCKS` — Table 9 (error-correction
4
+ * - `EC_CODEWORDS_PER_BLOCK` / `NUM_EC_BLOCKS`: Table 9 (error-correction
5
5
  * characteristics). Stored as per-block EC codewords and block count; the
6
6
  * group-1/group-2 split is derived, since all blocks share one EC length.
7
- * - `alignmentPatternPositions` — Table E.1, computed by the spec formula.
8
- * - `CHAR_COUNT_BITS` — Table 3 (character-count indicator bit widths).
9
- * - `FORMAT_EC_BITS` — Table 10 (2-bit level field inside format information).
7
+ * - `alignmentPatternPositions`: Table E.1, computed by the spec formula.
8
+ * - `CHAR_COUNT_BITS`: Table 3 (character-count indicator bit widths).
9
+ * - `FORMAT_EC_BITS`: Table 10 (2-bit level field inside format information).
10
10
  *
11
11
  * `tables.test.ts` cross-checks every entry against the raw-module formula, so
12
12
  * a transcription slip fails the consistency test before the decode oracle runs.