diff --git a/packages/util/src/bom.test.ts b/packages/util/src/bom.test.ts new file mode 100644 index 000000000000..6f86fd0eb066 --- /dev/null +++ b/packages/util/src/bom.test.ts @@ -0,0 +1,21 @@ +import { expect, test } from "bun:test" +import { Bom } from "./bom.js" + +test.each([ + { prefix: "", bom: false, expected: undefined }, + { prefix: "", bom: true, expected: "\uFEFF" }, + { prefix: "\uFEFF", bom: false, expected: "" }, + { prefix: "\uFEFF", bom: true, expected: undefined }, + { prefix: "\uFEFF\uFEFF", bom: false, expected: "" }, + { prefix: "\uFEFF\uFEFF", bom: true, expected: "\uFEFF" }, +])("syncBytes(%j)", (row) => { + const encoder = new TextEncoder() + const text = "a\uFEFF\u00e9" + const input = encoder.encode(row.prefix + text) + + expect(Bom.syncBytes(input, row.bom)).toEqual({ + text, + bytes: row.expected === undefined ? undefined : encoder.encode(row.expected + text), + }) + expect(input).toEqual(encoder.encode(row.prefix + text)) +}) diff --git a/packages/util/src/bom.ts b/packages/util/src/bom.ts index 561e5d6fe73f..ba7e9d91ab70 100644 --- a/packages/util/src/bom.ts +++ b/packages/util/src/bom.ts @@ -27,7 +27,7 @@ export function decodeBytes(content: Uint8Array) { export function syncBytes(content: Uint8Array, bom: boolean) { const decoded = decode(content) const current = split(decoded) - const canonical = join(current.text, bom) + const canonical = bom ? value + current.text : current.text return { text: current.text, bytes: decoded === canonical ? undefined : new TextEncoder().encode(canonical) } }