{"version":3,"file":"qr-encode.cjs","names":[],"sources":["../../../src/components/QRCode/qr-encode.ts"],"sourcesContent":["/**\n * @tempest-limits file-lines — ISO/IEC 18004 end to end with no dependency: mode\n * selection, the version and error-correction tables, Reed-Solomon over GF(256),\n * interleaving, the module placement with its function patterns, all eight masks and\n * the penalty scoring that picks between them. These are stages of one pipeline\n * defined by the standard; a file boundary between them would only move where the\n * reader has to look up a table.\n */\nimport {\n    ALPHANUMERIC_CHARS,\n    alignmentPatternPositions,\n    dataCodewords,\n    ECC_BLOCK_COUNT,\n    ECC_CODEWORDS_PER_BLOCK,\n    ECC_FORMAT_BITS,\n    MAX_VERSION,\n    MIN_VERSION,\n    rawDataModules,\n    type QRErrorCorrection,\n} from \"./qr-tables\";\n\nexport type { QRErrorCorrection };\n\n/** How the payload is packed into bits. */\nexport type QRMode = \"numeric\" | \"alphanumeric\" | \"byte\";\n\nexport interface QRMatrix {\n    /** Side length in modules, including no quiet zone. */\n    size: number;\n    /** Row-major modules; `true` is dark. */\n    modules: boolean[][];\n    /** Symbol version, 1 to 40. */\n    version: number;\n    /** Level the symbol was encoded at. */\n    level: QRErrorCorrection;\n    /** The mode chosen for the payload. */\n    mode: QRMode;\n    /** Which of the eight masks scored best. */\n    mask: number;\n}\n\nexport interface QREncodeOptions {\n    /** Error correction level. Default `\"M\"`. */\n    level?: QRErrorCorrection;\n    /**\n     * Force a minimum version. The encoder still grows past it when the payload\n     * does not fit — a version is a floor, never a cap that silently truncates.\n     */\n    minVersion?: number;\n}\n\n/** Raised when a payload cannot be encoded at the requested level. */\nexport class QRCapacityError extends Error {\n    constructor(\n        readonly length: number,\n        readonly level: QRErrorCorrection,\n    ) {\n        super(\n            `Payload of ${length} bytes does not fit in a version-${MAX_VERSION} QR symbol at level ${level}. ` +\n                \"Shorten the data, or drop to a lower correction level.\",\n        );\n        this.name = \"QRCapacityError\";\n    }\n}\n\nconst MODE_INDICATOR: Record<QRMode, number> = { numeric: 1, alphanumeric: 2, byte: 4 };\n\nconst NUMERIC_RE = /^[0-9]*$/;\nconst ALPHANUMERIC_RE = /^[0-9A-Z $%*+\\-./:]*$/;\n\n/**\n * Pick the densest mode the payload qualifies for.\n *\n * Numeric packs 3 digits into 10 bits and alphanumeric 2 characters into 11, so\n * a phone number or an upper-case code encodes far smaller than the same string\n * as bytes — often a whole version smaller, which is a visibly coarser symbol\n * and therefore easier to scan.\n *\n * @param text - The payload.\n * @returns The narrowest mode that can represent it.\n */\nexport function selectMode(text: string): QRMode {\n    if (NUMERIC_RE.test(text)) return \"numeric\";\n    if (ALPHANUMERIC_RE.test(text)) return \"alphanumeric\";\n    return \"byte\";\n}\n\n/** Bits the character-count field takes, which widens with the version. */\nfunction charCountBits(mode: QRMode, version: number): number {\n    const tier = version <= 9 ? 0 : version <= 26 ? 1 : 2;\n    if (mode === \"numeric\") return [10, 12, 14][tier];\n    if (mode === \"alphanumeric\") return [9, 11, 13][tier];\n    return [8, 16, 16][tier];\n}\n\n/** A bit sink that appends most-significant-bit first. */\nclass BitBuffer {\n    readonly bits: number[] = [];\n\n    append(value: number, length: number) {\n        for (let i = length - 1; i >= 0; i--) this.bits.push((value >>> i) & 1);\n    }\n\n    get length(): number {\n        return this.bits.length;\n    }\n}\n\n/** UTF-8 bytes for the byte mode, so accents and emoji survive the round trip. */\nfunction utf8Bytes(text: string): number[] {\n    return Array.from(new TextEncoder().encode(text));\n}\n\n/** Bits the payload itself occupies in a given mode, excluding the headers. */\nfunction payloadBits(text: string, mode: QRMode): number {\n    if (mode === \"numeric\") {\n        const groups = Math.floor(text.length / 3);\n        const rest = text.length % 3;\n        return groups * 10 + (rest === 0 ? 0 : rest === 1 ? 4 : 7);\n    }\n    if (mode === \"alphanumeric\") {\n        return Math.floor(text.length / 2) * 11 + (text.length % 2) * 6;\n    }\n    return utf8Bytes(text).length * 8;\n}\n\n/** Write the payload into the buffer in the chosen mode. */\nfunction writePayload(buffer: BitBuffer, text: string, mode: QRMode) {\n    if (mode === \"numeric\") {\n        for (let i = 0; i < text.length; i += 3) {\n            const chunk = text.slice(i, i + 3);\n            buffer.append(Number(chunk), chunk.length * 3 + 1);\n        }\n        return;\n    }\n    if (mode === \"alphanumeric\") {\n        for (let i = 0; i < text.length; i += 2) {\n            const first = ALPHANUMERIC_CHARS.indexOf(text[i]);\n            if (i + 1 === text.length) {\n                buffer.append(first, 6);\n            } else {\n                buffer.append(first * 45 + ALPHANUMERIC_CHARS.indexOf(text[i + 1]), 11);\n            }\n        }\n        return;\n    }\n    for (const byte of utf8Bytes(text)) buffer.append(byte, 8);\n}\n\n/** Character count for the header, which is bytes — not characters — in byte mode. */\nfunction headerCount(text: string, mode: QRMode): number {\n    return mode === \"byte\" ? utf8Bytes(text).length : text.length;\n}\n\n/**\n * The smallest version that fits the payload at this level.\n *\n * @throws {QRCapacityError} When even version 40 is too small.\n */\nfunction selectVersion(\n    text: string,\n    mode: QRMode,\n    level: QRErrorCorrection,\n    minVersion: number,\n): number {\n    const bits = payloadBits(text, mode);\n    for (let version = Math.max(MIN_VERSION, minVersion); version <= MAX_VERSION; version++) {\n        const capacity = dataCodewords(version, level) * 8;\n        if (4 + charCountBits(mode, version) + bits <= capacity) return version;\n    }\n    throw new QRCapacityError(headerCount(text, mode), level);\n}\n\n// ── Reed-Solomon over GF(256), primitive polynomial 0x11D ───────────────────\n\nconst GF_EXP = new Uint8Array(512);\nconst GF_LOG = new Uint8Array(256);\n\n{\n    let x = 1;\n    for (let i = 0; i < 255; i++) {\n        GF_EXP[i] = x;\n        GF_LOG[x] = i;\n        x = (x << 1) ^ (x & 0x80 ? 0x11d : 0);\n    }\n    for (let i = 255; i < 512; i++) GF_EXP[i] = GF_EXP[i - 255];\n}\n\nfunction gfMul(a: number, b: number): number {\n    if (a === 0 || b === 0) return 0;\n    return GF_EXP[GF_LOG[a] + GF_LOG[b]];\n}\n\n/** The generator polynomial for `degree` error-correction codewords. */\nfunction rsGenerator(degree: number): number[] {\n    let poly = [1];\n    for (let i = 0; i < degree; i++) {\n        const next = new Array<number>(poly.length + 1).fill(0);\n        for (let j = 0; j < poly.length; j++) {\n            next[j] ^= poly[j];\n            next[j + 1] ^= gfMul(poly[j], GF_EXP[i]);\n        }\n        poly = next;\n    }\n    return poly;\n}\n\n/**\n * The error-correction codewords for one block.\n *\n * @param data - The block's data codewords.\n * @param degree - How many correction codewords to produce.\n * @returns The remainder of the polynomial division, which is the ECC block.\n */\nexport function reedSolomon(data: readonly number[], degree: number): number[] {\n    const generator = rsGenerator(degree);\n    const remainder = new Array<number>(degree).fill(0);\n    for (const byte of data) {\n        const factor = byte ^ remainder[0];\n        remainder.shift();\n        remainder.push(0);\n        for (let i = 0; i < degree; i++) {\n            remainder[i] ^= gfMul(generator[i + 1], factor);\n        }\n    }\n    return remainder;\n}\n\n/**\n * Split into blocks, add correction, and interleave into the final codeword\n * stream.\n *\n * Interleaving is what makes the correction useful against a real-world smudge:\n * a contiguous scratch on the printed symbol then damages a few codewords of\n * every block instead of destroying one block completely.\n */\nfunction buildCodewords(\n    data: readonly number[],\n    version: number,\n    level: QRErrorCorrection,\n): number[] {\n    const blockCount = ECC_BLOCK_COUNT[level][version - 1];\n    const eccPerBlock = ECC_CODEWORDS_PER_BLOCK[level][version - 1];\n    const totalCodewords = Math.floor(rawDataModules(version) / 8);\n    const shortBlockLength = Math.floor(totalCodewords / blockCount) - eccPerBlock;\n    const longBlockCount = totalCodewords % blockCount;\n\n    const dataBlocks: number[][] = [];\n    const eccBlocks: number[][] = [];\n    let offset = 0;\n    for (let i = 0; i < blockCount; i++) {\n        const length = shortBlockLength + (i >= blockCount - longBlockCount ? 1 : 0);\n        const block = data.slice(offset, offset + length);\n        offset += length;\n        dataBlocks.push(block);\n        eccBlocks.push(reedSolomon(block, eccPerBlock));\n    }\n\n    const result: number[] = [];\n    for (let i = 0; i < shortBlockLength + 1; i++) {\n        for (const block of dataBlocks) {\n            if (i < block.length) result.push(block[i]);\n        }\n    }\n    for (let i = 0; i < eccPerBlock; i++) {\n        for (const block of eccBlocks) result.push(block[i]);\n    }\n    return result;\n}\n\n// ── Matrix construction ─────────────────────────────────────────────────────\n\n/** A grid under construction: modules plus which cells are function patterns. */\ninterface Canvas {\n    size: number;\n    modules: boolean[][];\n    reserved: boolean[][];\n}\n\nfunction createCanvas(version: number): Canvas {\n    const size = version * 4 + 17;\n    return {\n        size,\n        modules: Array.from({ length: size }, () => new Array<boolean>(size).fill(false)),\n        reserved: Array.from({ length: size }, () => new Array<boolean>(size).fill(false)),\n    };\n}\n\nfunction setModule(canvas: Canvas, x: number, y: number, dark: boolean, reserve = true) {\n    if (x < 0 || y < 0 || x >= canvas.size || y >= canvas.size) return;\n    canvas.modules[y][x] = dark;\n    if (reserve) canvas.reserved[y][x] = true;\n}\n\n/** A finder pattern with its separator, anchored at a corner. */\nfunction drawFinder(canvas: Canvas, left: number, top: number) {\n    for (let dy = -1; dy <= 7; dy++) {\n        for (let dx = -1; dx <= 7; dx++) {\n            const distance = Math.max(Math.abs(dx - 3), Math.abs(dy - 3));\n            setModule(canvas, left + dx, top + dy, distance !== 2 && distance <= 3);\n        }\n    }\n}\n\nfunction drawAlignment(canvas: Canvas, cx: number, cy: number) {\n    for (let dy = -2; dy <= 2; dy++) {\n        for (let dx = -2; dx <= 2; dx++) {\n            setModule(canvas, cx + dx, cy + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);\n        }\n    }\n}\n\nfunction drawFunctionPatterns(canvas: Canvas, version: number) {\n    drawFinder(canvas, 0, 0);\n    drawFinder(canvas, canvas.size - 7, 0);\n    drawFinder(canvas, 0, canvas.size - 7);\n\n    for (let i = 8; i < canvas.size - 8; i++) {\n        const dark = i % 2 === 0;\n        setModule(canvas, i, 6, dark);\n        setModule(canvas, 6, i, dark);\n    }\n\n    const positions = alignmentPatternPositions(version);\n    for (const cy of positions) {\n        for (const cx of positions) {\n            // The three corners already hold finder patterns.\n            const atFinder =\n                (cx === 6 && cy === 6) ||\n                (cx === 6 && cy === canvas.size - 7) ||\n                (cx === canvas.size - 7 && cy === 6);\n            if (!atFinder) drawAlignment(canvas, cx, cy);\n        }\n    }\n\n    // Reserve the format information, and light the always-dark module.\n    for (let i = 0; i < 9; i++) {\n        setModule(canvas, i, 8, false);\n        setModule(canvas, 8, i, false);\n    }\n    for (let i = 0; i < 8; i++) {\n        setModule(canvas, canvas.size - 1 - i, 8, false);\n        setModule(canvas, 8, canvas.size - 1 - i, false);\n    }\n    setModule(canvas, 8, canvas.size - 8, true);\n\n    if (version >= 7) {\n        const value = versionInformation(version);\n        for (let i = 0; i < 18; i++) {\n            const bit = ((value >>> i) & 1) === 1;\n            const a = canvas.size - 11 + (i % 3);\n            const b = Math.floor(i / 3);\n            setModule(canvas, a, b, bit);\n            setModule(canvas, b, a, bit);\n        }\n    }\n}\n\n/** The 18-bit version information block, BCH(18,6) with generator 0x1F25. */\nfunction versionInformation(version: number): number {\n    let remainder = version;\n    for (let i = 0; i < 12; i++) {\n        remainder = (remainder << 1) ^ ((remainder >>> 11) * 0x1f25);\n    }\n    return (version << 12) | remainder;\n}\n\n/** The 15-bit format information, BCH(15,5) masked with 0x5412. */\nfunction formatInformation(level: QRErrorCorrection, mask: number): number {\n    const data = (ECC_FORMAT_BITS[level] << 3) | mask;\n    let remainder = data;\n    for (let i = 0; i < 10; i++) {\n        remainder = (remainder << 1) ^ ((remainder >>> 9) * 0x537);\n    }\n    return ((data << 10) | remainder) ^ 0x5412;\n}\n\nfunction drawFormatInformation(canvas: Canvas, level: QRErrorCorrection, mask: number) {\n    const bits = formatInformation(level, mask);\n\n    for (let i = 0; i <= 5; i++) setModule(canvas, 8, i, ((bits >>> i) & 1) === 1);\n    setModule(canvas, 8, 7, ((bits >>> 6) & 1) === 1);\n    setModule(canvas, 8, 8, ((bits >>> 7) & 1) === 1);\n    setModule(canvas, 7, 8, ((bits >>> 8) & 1) === 1);\n    for (let i = 9; i < 15; i++) setModule(canvas, 14 - i, 8, ((bits >>> i) & 1) === 1);\n\n    for (let i = 0; i < 8; i++) {\n        setModule(canvas, canvas.size - 1 - i, 8, ((bits >>> i) & 1) === 1);\n    }\n    for (let i = 8; i < 15; i++) {\n        setModule(canvas, 8, canvas.size - 15 + i, ((bits >>> i) & 1) === 1);\n    }\n    setModule(canvas, 8, canvas.size - 8, true);\n}\n\n/**\n * Lay the codeword stream into the free modules.\n *\n * The path is a boustrophedon over two-module columns from the bottom-right\n * corner, skipping the vertical timing pattern in column 6 entirely — that\n * column would otherwise shift every subsequent column by one.\n */\nfunction drawCodewords(canvas: Canvas, codewords: readonly number[]) {\n    let bitIndex = 0;\n    let upward = true;\n\n    for (let right = canvas.size - 1; right >= 1; right -= 2) {\n        if (right === 6) right = 5;\n        for (let step = 0; step < canvas.size; step++) {\n            const y = upward ? canvas.size - 1 - step : step;\n            for (let column = 0; column < 2; column++) {\n                const x = right - column;\n                if (canvas.reserved[y][x]) continue;\n                const byte = codewords[bitIndex >>> 3];\n                // Remainder bits past the stream are light, per the standard.\n                canvas.modules[y][x] =\n                    byte !== undefined && ((byte >>> (7 - (bitIndex & 7))) & 1) === 1;\n                bitIndex++;\n            }\n        }\n        upward = !upward;\n    }\n}\n\nconst MASK_FUNCTIONS: readonly ((x: number, y: number) => boolean)[] = [\n    (x, y) => (x + y) % 2 === 0,\n    (_x, y) => y % 2 === 0,\n    (x) => x % 3 === 0,\n    (x, y) => (x + y) % 3 === 0,\n    (x, y) => (Math.floor(y / 2) + Math.floor(x / 3)) % 2 === 0,\n    (x, y) => ((x * y) % 2) + ((x * y) % 3) === 0,\n    (x, y) => (((x * y) % 2) + ((x * y) % 3)) % 2 === 0,\n    (x, y) => (((x + y) % 2) + ((x * y) % 3)) % 2 === 0,\n];\n\nfunction applyMask(canvas: Canvas, mask: number) {\n    const fn = MASK_FUNCTIONS[mask];\n    for (let y = 0; y < canvas.size; y++) {\n        for (let x = 0; x < canvas.size; x++) {\n            if (!canvas.reserved[y][x] && fn(x, y)) canvas.modules[y][x] = !canvas.modules[y][x];\n        }\n    }\n}\n\n/**\n * Score a masked symbol; lower is better.\n *\n * The four penalties push away from patterns a scanner confuses with the finder\n * marks, and from large flat areas where it cannot lock on.\n */\nfunction penalty(canvas: Canvas): number {\n    const { size, modules } = canvas;\n    let score = 0;\n\n    const runPenalty = (run: number) => (run >= 5 ? 3 + (run - 5) : 0);\n\n    for (let y = 0; y < size; y++) {\n        let run = 1;\n        for (let x = 1; x < size; x++) {\n            if (modules[y][x] === modules[y][x - 1]) run++;\n            else {\n                score += runPenalty(run);\n                run = 1;\n            }\n        }\n        score += runPenalty(run);\n    }\n    for (let x = 0; x < size; x++) {\n        let run = 1;\n        for (let y = 1; y < size; y++) {\n            if (modules[y][x] === modules[y - 1][x]) run++;\n            else {\n                score += runPenalty(run);\n                run = 1;\n            }\n        }\n        score += runPenalty(run);\n    }\n\n    for (let y = 0; y < size - 1; y++) {\n        for (let x = 0; x < size - 1; x++) {\n            const cell = modules[y][x];\n            if (\n                cell === modules[y][x + 1] &&\n                cell === modules[y + 1][x] &&\n                cell === modules[y + 1][x + 1]\n            ) {\n                score += 3;\n            }\n        }\n    }\n\n    // 1:1:3:1:1 with four light modules on either side — the finder's signature.\n    const FINDER = [true, false, true, true, true, false, true];\n    const matchesAt = (line: readonly boolean[], at: number): boolean => {\n        for (let i = 0; i < FINDER.length; i++) {\n            if (line[at + i] !== FINDER[i]) return false;\n        }\n        const before = line.slice(Math.max(0, at - 4), at);\n        const after = line.slice(at + 7, at + 11);\n        const clear = (part: readonly boolean[]) => part.length === 4 && part.every((m) => !m);\n        return clear(before) || clear(after);\n    };\n\n    for (let i = 0; i < size; i++) {\n        const row = modules[i];\n        const column = modules.map((line) => line[i]);\n        for (let at = 0; at + 7 <= size; at++) {\n            if (matchesAt(row, at)) score += 40;\n            if (matchesAt(column, at)) score += 40;\n        }\n    }\n\n    let dark = 0;\n    for (const row of modules) for (const cell of row) if (cell) dark++;\n    const percent = (dark * 100) / (size * size);\n    score += Math.floor(Math.abs(percent - 50) / 5) * 10;\n\n    return score;\n}\n\nfunction cloneCanvas(canvas: Canvas): Canvas {\n    return {\n        size: canvas.size,\n        modules: canvas.modules.map((row) => [...row]),\n        reserved: canvas.reserved.map((row) => [...row]),\n    };\n}\n\n/**\n * Encode text into a QR matrix.\n *\n * The whole pipeline of ISO/IEC 18004: pick the densest mode the payload\n * qualifies for, pick the smallest version that fits, build the bit stream, add\n * Reed-Solomon correction, interleave the blocks, lay the modules out, then try\n * all eight masks and keep the one the standard's penalty function likes best.\n *\n * @param text - The payload. Byte mode encodes it as UTF-8.\n * @param options - Level and an optional version floor.\n * @returns The finished matrix, without a quiet zone.\n * @throws {QRCapacityError} When the payload does not fit at that level.\n *\n * @example\n * const qr = encodeQR(\"https://tempest.dev\", { level: \"Q\" });\n * qr.modules[0][0]; // true — top-left of the finder pattern\n */\nexport function encodeQR(text: string, options: QREncodeOptions = {}): QRMatrix {\n    const { level = \"M\", minVersion = MIN_VERSION } = options;\n    const mode = selectMode(text);\n    const version = selectVersion(text, mode, level, minVersion);\n\n    const buffer = new BitBuffer();\n    buffer.append(MODE_INDICATOR[mode], 4);\n    buffer.append(headerCount(text, mode), charCountBits(mode, version));\n    writePayload(buffer, text, mode);\n\n    const capacity = dataCodewords(version, level) * 8;\n    buffer.append(0, Math.min(4, capacity - buffer.length));\n    buffer.append(0, (8 - (buffer.length % 8)) % 8);\n\n    const data: number[] = [];\n    for (let i = 0; i < buffer.length; i += 8) {\n        let byte = 0;\n        for (let j = 0; j < 8; j++) byte = (byte << 1) | buffer.bits[i + j];\n        data.push(byte);\n    }\n    // The two alternating pad bytes are prescribed, not arbitrary filler.\n    for (let pad = 0xec; data.length < capacity / 8; pad ^= 0xec ^ 0x11) data.push(pad);\n\n    const codewords = buildCodewords(data, version, level);\n\n    const base = createCanvas(version);\n    drawFunctionPatterns(base, version);\n    drawCodewords(base, codewords);\n\n    let best: Canvas | null = null;\n    let bestMask = 0;\n    let bestScore = Number.POSITIVE_INFINITY;\n    for (let mask = 0; mask < 8; mask++) {\n        const candidate = cloneCanvas(base);\n        applyMask(candidate, mask);\n        drawFormatInformation(candidate, level, mask);\n        const score = penalty(candidate);\n        if (score < bestScore) {\n            bestScore = score;\n            bestMask = mask;\n            best = candidate;\n        }\n    }\n\n    const chosen = best as Canvas;\n    return {\n        size: chosen.size,\n        modules: chosen.modules,\n        version,\n        level,\n        mode,\n        mask: bestMask,\n    };\n}\n\n/**\n * The matrix as an SVG path, one `M…h…v…h…z` rectangle per dark module.\n *\n * A path beats one `<rect>` per module: a version-10 symbol is 3 481 modules,\n * and that many elements is a real cost to parse and to paint. Coordinates are\n * whole numbers in module space, so the shape stays crisp at any size.\n *\n * @param matrix - An encoded matrix.\n * @param margin - Quiet zone in modules. The standard asks for 4.\n * @returns The `d` attribute, empty when there is nothing dark.\n */\nexport function matrixToPath(matrix: QRMatrix, margin = 4): string {\n    const parts: string[] = [];\n    for (let y = 0; y < matrix.size; y++) {\n        let runStart = -1;\n        for (let x = 0; x <= matrix.size; x++) {\n            const dark = x < matrix.size && matrix.modules[y][x];\n            if (dark && runStart === -1) runStart = x;\n            if (!dark && runStart !== -1) {\n                // Merge each horizontal run into one rectangle.\n                parts.push(\n                    `M${runStart + margin} ${y + margin}h${x - runStart}v1h-${x - runStart}z`,\n                );\n                runStart = -1;\n            }\n        }\n    }\n    return parts.join(\"\");\n}\n"],"mappings":"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"}