diff --git a/packages/bun-types/bun.d.ts b/packages/bun-types/bun.d.ts index d8c9402e2871..44ca4f6af31f 100644 --- a/packages/bun-types/bun.d.ts +++ b/packages/bun-types/bun.d.ts @@ -28,7 +28,277 @@ declare module "bun" { type ReadableStreamReader = ReadableStreamDefaultReader; type Transferable = ArrayBuffer | MessagePort; type MessageEventSource = Bun.__internal.UseLibDomIfAvailable<"MessageEventSource", undefined>; - type Encoding = "utf-8" | "windows-1252" | "utf-16"; + /** + * An encoding label from the WHATWG Encoding Standard, as accepted by the + * `TextDecoder` constructor. + * + * The labels of the `replacement` encoding are excluded: the `TextDecoder` + * constructor rejects them with a `RangeError`. + * + * @see https://encoding.spec.whatwg.org/#names-and-labels + */ + type Encoding = + // utf-8 + | "unicode-1-1-utf-8" + | "unicode11utf8" + | "unicode20utf8" + | "utf-8" + | "utf8" + | "x-unicode20utf8" + // ibm866 + | "866" + | "cp866" + | "csibm866" + | "ibm866" + // iso-8859-2 + | "csisolatin2" + | "iso-8859-2" + | "iso-ir-101" + | "iso8859-2" + | "iso88592" + | "iso_8859-2" + | "iso_8859-2:1987" + | "l2" + | "latin2" + // iso-8859-3 + | "csisolatin3" + | "iso-8859-3" + | "iso-ir-109" + | "iso8859-3" + | "iso88593" + | "iso_8859-3" + | "iso_8859-3:1988" + | "l3" + | "latin3" + // iso-8859-4 + | "csisolatin4" + | "iso-8859-4" + | "iso-ir-110" + | "iso8859-4" + | "iso88594" + | "iso_8859-4" + | "iso_8859-4:1988" + | "l4" + | "latin4" + // iso-8859-5 + | "csisolatincyrillic" + | "cyrillic" + | "iso-8859-5" + | "iso-ir-144" + | "iso8859-5" + | "iso88595" + | "iso_8859-5" + | "iso_8859-5:1988" + // iso-8859-6 + | "arabic" + | "asmo-708" + | "csiso88596e" + | "csiso88596i" + | "csisolatinarabic" + | "ecma-114" + | "iso-8859-6" + | "iso-8859-6-e" + | "iso-8859-6-i" + | "iso-ir-127" + | "iso8859-6" + | "iso88596" + | "iso_8859-6" + | "iso_8859-6:1987" + // iso-8859-7 + | "csisolatingreek" + | "ecma-118" + | "elot_928" + | "greek" + | "greek8" + | "iso-8859-7" + | "iso-ir-126" + | "iso8859-7" + | "iso88597" + | "iso_8859-7" + | "iso_8859-7:1987" + | "sun_eu_greek" + // iso-8859-8 + | "csiso88598e" + | "csisolatinhebrew" + | "hebrew" + | "iso-8859-8" + | "iso-8859-8-e" + | "iso-ir-138" + | "iso8859-8" + | "iso88598" + | "iso_8859-8" + | "iso_8859-8:1988" + | "visual" + // iso-8859-8-i + | "csiso88598i" + | "iso-8859-8-i" + | "logical" + // iso-8859-10 + | "csisolatin6" + | "iso-8859-10" + | "iso-ir-157" + | "iso8859-10" + | "iso885910" + | "l6" + | "latin6" + // iso-8859-13 + | "iso-8859-13" + | "iso8859-13" + | "iso885913" + // iso-8859-14 + | "iso-8859-14" + | "iso8859-14" + | "iso885914" + // iso-8859-15 + | "csisolatin9" + | "iso-8859-15" + | "iso8859-15" + | "iso885915" + | "iso_8859-15" + | "l9" + // iso-8859-16 + | "iso-8859-16" + // koi8-r + | "cskoi8r" + | "koi" + | "koi8" + | "koi8-r" + | "koi8_r" + // koi8-u + | "koi8-ru" + | "koi8-u" + // macintosh + | "csmacintosh" + | "mac" + | "macintosh" + | "x-mac-roman" + // windows-874 + | "dos-874" + | "iso-8859-11" + | "iso8859-11" + | "iso885911" + | "tis-620" + | "windows-874" + // windows-1250 + | "cp1250" + | "windows-1250" + | "x-cp1250" + // windows-1251 + | "cp1251" + | "windows-1251" + | "x-cp1251" + // windows-1252 + | "ansi_x3.4-1968" + | "ascii" + | "cp1252" + | "cp819" + | "csisolatin1" + | "ibm819" + | "iso-8859-1" + | "iso-ir-100" + | "iso8859-1" + | "iso88591" + | "iso_8859-1" + | "iso_8859-1:1987" + | "l1" + | "latin1" + | "us-ascii" + | "windows-1252" + | "x-cp1252" + // windows-1253 + | "cp1253" + | "windows-1253" + | "x-cp1253" + // windows-1254 + | "cp1254" + | "csisolatin5" + | "iso-8859-9" + | "iso-ir-148" + | "iso8859-9" + | "iso88599" + | "iso_8859-9" + | "iso_8859-9:1989" + | "l5" + | "latin5" + | "windows-1254" + | "x-cp1254" + // windows-1255 + | "cp1255" + | "windows-1255" + | "x-cp1255" + // windows-1256 + | "cp1256" + | "windows-1256" + | "x-cp1256" + // windows-1257 + | "cp1257" + | "windows-1257" + | "x-cp1257" + // windows-1258 + | "cp1258" + | "windows-1258" + | "x-cp1258" + // x-mac-cyrillic + | "x-mac-cyrillic" + | "x-mac-ukrainian" + // gbk + | "chinese" + | "csgb2312" + | "csiso58gb231280" + | "gb2312" + | "gb_2312" + | "gb_2312-80" + | "gbk" + | "iso-ir-58" + | "x-gbk" + // gb18030 + | "gb18030" + // big5 + | "big5" + | "big5-hkscs" + | "cn-big5" + | "csbig5" + | "x-x-big5" + // euc-jp + | "cseucpkdfmtjapanese" + | "euc-jp" + | "x-euc-jp" + // iso-2022-jp + | "csiso2022jp" + | "iso-2022-jp" + // shift_jis + | "csshiftjis" + | "ms932" + | "ms_kanji" + | "shift-jis" + | "shift_jis" + | "sjis" + | "windows-31j" + | "x-sjis" + // euc-kr + | "cseuckr" + | "csksc56011987" + | "euc-kr" + | "iso-ir-149" + | "korean" + | "ks_c_5601-1987" + | "ks_c_5601-1989" + | "ksc5601" + | "ksc_5601" + | "windows-949" + // utf-16be + | "unicodefffe" + | "utf-16be" + // utf-16le + | "csunicode" + | "iso-10646-ucs-2" + | "ucs-2" + | "unicode" + | "unicodefeff" + | "utf-16" + | "utf-16le" + // x-user-defined + | "x-user-defined"; type UncaughtExceptionOrigin = "uncaughtException" | "unhandledRejection"; type MultipleResolveType = "resolve" | "reject"; type BeforeExitListener = (code: number) => void; diff --git a/packages/bun-types/globals.d.ts b/packages/bun-types/globals.d.ts index 939c7c2a2825..51ee5a7adf20 100644 --- a/packages/bun-types/globals.d.ts +++ b/packages/bun-types/globals.d.ts @@ -252,8 +252,9 @@ declare var TextEncoder: Bun.__internal.UseLibDomIfAvailable< >; /** - * An implementation of the [WHATWG Encoding Standard](https://encoding.spec.whatwg.org/) `TextDecoder` API. All - * instances of `TextDecoder` only support UTF-8 decoding. + * An implementation of the [WHATWG Encoding Standard](https://encoding.spec.whatwg.org/) `TextDecoder` API. + * Supports every encoding label the standard defines, except the labels of the + * `replacement` encoding. * * ```js * const decoder = new TextDecoder(); diff --git a/test/integration/bun-types/bun-types.test.ts b/test/integration/bun-types/bun-types.test.ts index 05fa801f45e5..2f77af470c4f 100644 --- a/test/integration/bun-types/bun-types.test.ts +++ b/test/integration/bun-types/bun-types.test.ts @@ -400,6 +400,80 @@ describe("@types/bun integration test", () => { }); }); + // Runs on debug builds too, same as the Bun.mmap block above. + describe("TextDecoder", () => { + test("accepts the encoding labels the runtime supports", async () => { + const checkDir = join(TEMP_DIR, "text-decoder-encoding-check"); + const tsconfig = structuredClone(sourceTsconfig); + tsconfig.include = ["text-decoder-encodings.ts"]; + tsconfig.compilerOptions.typeRoots = [join(BASE_FIXTURE_DIR, "node_modules", "@types")]; + await mkdir(checkDir, { recursive: true }); + await makeTree(checkDir, { + "tsconfig.json": JSON.stringify(tsconfig, null, 2), + "text-decoder-encodings.ts": `new TextDecoder("windows-1251"); + new TextDecoder("shift_jis"); + new TextDecoder("utf8"); + new TextDecoder("latin1"); + new TextDecoder("gb18030", { fatal: true, ignoreBOM: true }); + // @ts-expect-error - the TextDecoder constructor rejects the replacement encoding + "hz-gb-2312" satisfies Bun.Encoding; + // @ts-expect-error - not a label the Encoding Standard defines + "utf-99" satisfies Bun.Encoding;`, + }); + + await using proc = Bun.spawn({ + cmd: [bunExe(), join(BASE_FIXTURE_DIR, "node_modules", "typescript", "bin", "tsc"), "-p", "."], + env: bunEnv, + cwd: checkDir, + stdout: "pipe", + stderr: "pipe", + }); + + const [stdout, stderr, exitCode] = await Promise.all([proc.stdout.text(), proc.stderr.text(), proc.exited]); + + expect(stderr.trim()).toBe(""); + expect(stdout.trim()).toBe(""); + expect(exitCode).toBe(0); + }); + + // tsc cannot read the runtime's label table in + // src/runtime/webcore/EncodingLabel.rs, so the fixture carries a literal + // copy. This check ties that copy to the running binary: every fixture + // label must construct, and the replacement labels must throw. + test("the fixture label table matches the runtime", () => { + const fixture = readFileSync(join(FIXTURE_SOURCE_DIR, "text-encode-decoder.ts"), "utf8"); + const arrayStart = fixture.indexOf("const labels = ["); + const arrayEnd = fixture.indexOf("] as const;", arrayStart); + expect(arrayStart).toBeGreaterThan(-1); + expect(arrayEnd).toBeGreaterThan(arrayStart); + + const labels = [...fixture.slice(arrayStart, arrayEnd).matchAll(/"([^"]+)"/g)].map(m => m[1]); + expect(labels).toHaveLength(222); + expect(new Set(labels).size).toBe(labels.length); + + const rejected = labels.filter(label => { + try { + new TextDecoder(label as Bun.Encoding); + return false; + } catch { + return true; + } + }); + expect(rejected).toEqual([]); + + for (const label of [ + "csiso2022kr", + "hz-gb-2312", + "iso-2022-cn", + "iso-2022-cn-ext", + "iso-2022-kr", + "replacement", + ]) { + expect(() => new TextDecoder(label as Bun.Encoding)).toThrow(RangeError); + } + }); + }); + describe("Test Globals", () => { const code = ` const test_shouldBeAFunction: Function = test; diff --git a/test/integration/bun-types/fixture/text-encode-decoder.ts b/test/integration/bun-types/fixture/text-encode-decoder.ts index f2eff6760e20..47c42049d901 100644 --- a/test/integration/bun-types/fixture/text-encode-decoder.ts +++ b/test/integration/bun-types/fixture/text-encode-decoder.ts @@ -1,220 +1,295 @@ -// This test is currently failing, but it's not so important that it blocks a release +// The label table from https://encoding.spec.whatwg.org/#names-and-labels, +// minus the replacement encoding's labels (the TextDecoder constructor +// rejects those with a RangeError). Keep in sync with Bun.Encoding in +// packages/bun-types/bun.d.ts and src/runtime/webcore/EncodingLabel.rs. +const labels = [ + // utf-8 + "unicode-1-1-utf-8", + "unicode11utf8", + "unicode20utf8", + "utf-8", + "utf8", + "x-unicode20utf8", + // ibm866 + "866", + "cp866", + "csibm866", + "ibm866", + // iso-8859-2 + "csisolatin2", + "iso-8859-2", + "iso-ir-101", + "iso8859-2", + "iso88592", + "iso_8859-2", + "iso_8859-2:1987", + "l2", + "latin2", + // iso-8859-3 + "csisolatin3", + "iso-8859-3", + "iso-ir-109", + "iso8859-3", + "iso88593", + "iso_8859-3", + "iso_8859-3:1988", + "l3", + "latin3", + // iso-8859-4 + "csisolatin4", + "iso-8859-4", + "iso-ir-110", + "iso8859-4", + "iso88594", + "iso_8859-4", + "iso_8859-4:1988", + "l4", + "latin4", + // iso-8859-5 + "csisolatincyrillic", + "cyrillic", + "iso-8859-5", + "iso-ir-144", + "iso8859-5", + "iso88595", + "iso_8859-5", + "iso_8859-5:1988", + // iso-8859-6 + "arabic", + "asmo-708", + "csiso88596e", + "csiso88596i", + "csisolatinarabic", + "ecma-114", + "iso-8859-6", + "iso-8859-6-e", + "iso-8859-6-i", + "iso-ir-127", + "iso8859-6", + "iso88596", + "iso_8859-6", + "iso_8859-6:1987", + // iso-8859-7 + "csisolatingreek", + "ecma-118", + "elot_928", + "greek", + "greek8", + "iso-8859-7", + "iso-ir-126", + "iso8859-7", + "iso88597", + "iso_8859-7", + "iso_8859-7:1987", + "sun_eu_greek", + // iso-8859-8 + "csiso88598e", + "csisolatinhebrew", + "hebrew", + "iso-8859-8", + "iso-8859-8-e", + "iso-ir-138", + "iso8859-8", + "iso88598", + "iso_8859-8", + "iso_8859-8:1988", + "visual", + // iso-8859-8-i + "csiso88598i", + "iso-8859-8-i", + "logical", + // iso-8859-10 + "csisolatin6", + "iso-8859-10", + "iso-ir-157", + "iso8859-10", + "iso885910", + "l6", + "latin6", + // iso-8859-13 + "iso-8859-13", + "iso8859-13", + "iso885913", + // iso-8859-14 + "iso-8859-14", + "iso8859-14", + "iso885914", + // iso-8859-15 + "csisolatin9", + "iso-8859-15", + "iso8859-15", + "iso885915", + "iso_8859-15", + "l9", + // iso-8859-16 + "iso-8859-16", + // koi8-r + "cskoi8r", + "koi", + "koi8", + "koi8-r", + "koi8_r", + // koi8-u + "koi8-ru", + "koi8-u", + // macintosh + "csmacintosh", + "mac", + "macintosh", + "x-mac-roman", + // windows-874 + "dos-874", + "iso-8859-11", + "iso8859-11", + "iso885911", + "tis-620", + "windows-874", + // windows-1250 + "cp1250", + "windows-1250", + "x-cp1250", + // windows-1251 + "cp1251", + "windows-1251", + "x-cp1251", + // windows-1252 + "ansi_x3.4-1968", + "ascii", + "cp1252", + "cp819", + "csisolatin1", + "ibm819", + "iso-8859-1", + "iso-ir-100", + "iso8859-1", + "iso88591", + "iso_8859-1", + "iso_8859-1:1987", + "l1", + "latin1", + "us-ascii", + "windows-1252", + "x-cp1252", + // windows-1253 + "cp1253", + "windows-1253", + "x-cp1253", + // windows-1254 + "cp1254", + "csisolatin5", + "iso-8859-9", + "iso-ir-148", + "iso8859-9", + "iso88599", + "iso_8859-9", + "iso_8859-9:1989", + "l5", + "latin5", + "windows-1254", + "x-cp1254", + // windows-1255 + "cp1255", + "windows-1255", + "x-cp1255", + // windows-1256 + "cp1256", + "windows-1256", + "x-cp1256", + // windows-1257 + "cp1257", + "windows-1257", + "x-cp1257", + // windows-1258 + "cp1258", + "windows-1258", + "x-cp1258", + // x-mac-cyrillic + "x-mac-cyrillic", + "x-mac-ukrainian", + // gbk + "chinese", + "csgb2312", + "csiso58gb231280", + "gb2312", + "gb_2312", + "gb_2312-80", + "gbk", + "iso-ir-58", + "x-gbk", + // gb18030 + "gb18030", + // big5 + "big5", + "big5-hkscs", + "cn-big5", + "csbig5", + "x-x-big5", + // euc-jp + "cseucpkdfmtjapanese", + "euc-jp", + "x-euc-jp", + // iso-2022-jp + "csiso2022jp", + "iso-2022-jp", + // shift_jis + "csshiftjis", + "ms932", + "ms_kanji", + "shift-jis", + "shift_jis", + "sjis", + "windows-31j", + "x-sjis", + // euc-kr + "cseuckr", + "csksc56011987", + "euc-kr", + "iso-ir-149", + "korean", + "ks_c_5601-1987", + "ks_c_5601-1989", + "ksc5601", + "ksc_5601", + "windows-949", + // utf-16be + "unicodefffe", + "utf-16be", + // utf-16le + "csunicode", + "iso-10646-ucs-2", + "ucs-2", + "unicode", + "unicodefeff", + "utf-16", + "utf-16le", + // x-user-defined + "x-user-defined", +] as const; -// type utf_8 = "unicode-1-1-utf-8" | "utf-8" | "utf8"; -// type ibm866 = "866" | "cp866" | "csibm866" | "ibm866"; -// type iso_8859_2 = -// | "csisolatin2" -// | "iso-8859-2" -// | "iso-ir-101" -// | "iso8859-2" -// | "iso88592" -// | "iso_8859-2" -// | "iso_8859-2:1987" -// | "l2" -// | "latin2"; -// type iso_8859_3 = -// | "csisolatin3" -// | "iso-8859-3" -// | "iso-ir-109" -// | "iso8859-3" -// | "iso88593" -// | "iso_8859-3" -// | "iso_8859-3:1988" -// | "l3" -// | "latin3"; -// type iso_8859_4 = -// | "csisolatin4" -// | "iso-8859-4" -// | "iso-ir-110" -// | "iso8859-4" -// | "iso88594" -// | "iso_8859-4" -// | "iso_8859-4:1988" -// | "l4" -// | "latin4"; -// type iso_8859_5 = -// | "csisolatincyrillic" -// | "cyrillic" -// | "iso-8859-5" -// | "iso-ir-144" -// | "iso88595" -// | "iso_8859-5" -// | "iso_8859-5:1988"; -// type iso_8859_6 = -// | "arabic" -// | "asmo-708" -// | "csiso88596e" -// | "csiso88596i" -// | "csisolatinarabic" -// | "ecma-114" -// | "iso-8859-6" -// | "iso-8859-6-e" -// | "iso-8859-6-i" -// | "iso-ir-127" -// | "iso8859-6" -// | "iso88596" -// | "iso_8859-6" -// | "iso_8859-6:1987"; -// type iso_8859_7 = -// | "csisolatingreek" -// | "ecma-118" -// | "elot_928" -// | "greek" -// | "greek8" -// | "iso-8859-7" -// | "iso-ir-126" -// | "iso8859-7" -// | "iso88597" -// | "iso_8859-7" -// | "iso_8859-7:1987" -// | "sun_eu_greek"; -// type iso_8859_8 = -// | "csiso88598e" -// | "csisolatinhebrew" -// | "hebrew" -// | "iso-8859-8" -// | "iso-8859-8-e" -// | "iso-ir-138" -// | "iso8859-8" -// | "iso88598" -// | "iso_8859-8" -// | "iso_8859-8:1988" -// | "visual"; -// type iso_8859_8i = "csiso88598i" | "iso-8859-8-i" | "logical"; -// type iso_8859_10 = "csisolatin6" | "iso-8859-10" | "iso-ir-157" | "iso8859-10" | "iso885910" | "l6" | "latin6"; -// type iso_8859_13 = "iso-8859-13" | "iso8859-13" | "iso885913"; -// type iso_8859_14 = "iso-8859-14" | "iso8859-14" | "iso885914"; -// type iso_8859_15 = "csisolatin9" | "iso-8859-15" | "iso8859-15" | "iso885915" | "l9" | "latin9"; -// type iso_8859_16 = "iso-8859-16"; -// type koi8_r = "cskoi8r" | "koi" | "koi8" | "koi8-r" | "koi8_r"; -// type koi8_u = "koi8-u"; -// type macintosh = "csmacintosh" | "mac" | "macintosh" | "x-mac-roman"; -// type windows_874 = "dos-874" | "iso-8859-11" | "iso8859-11" | "iso885911" | "tis-620" | "windows-874"; -// type windows_1250 = "cp1250" | "windows-1250" | "x-cp1250"; -// type windows_1251 = "cp1251" | "windows-1251" | "x-cp1251"; -// type windows_1252 = -// | "ansi_x3.4-1968" -// | "ascii" -// | "cp1252" -// | "cp819" -// | "csisolatin1" -// | "ibm819" -// | "iso-8859-1" -// | "iso-ir-100" -// | "iso8859-1" -// | "iso88591" -// | "iso_8859-1" -// | "iso_8859-1:1987" -// | "l1" -// | "latin1" -// | "us-ascii" -// | "windows-1252" -// | "x-cp1252"; -// type windows_1253 = "cp1253" | "windows-1253" | "x-cp1253"; -// type windows_1254 = -// | "cp1254" -// | "csisolatin5" -// | "iso-8859-9" -// | "iso-ir-148" -// | "iso8859-9" -// | "iso88599" -// | "iso_8859-9" -// | "iso_8859-9:1989" -// | "l5" -// | "latin5" -// | "windows-1254" -// | "x-cp1254"; -// type windows_1255 = "cp1255" | "windows-1255" | "x-cp1255"; -// type windows_1256 = "cp1256" | "windows-1256" | "x-cp1256"; -// type windows_1257 = "cp1257" | "windows-1257" | "x-cp1257"; -// type windows_1258 = "cp1258" | "windows-1258" | "x-cp1258"; -// type x_mac_cyrillic = "x-mac-cyrillic" | "x-mac-ukrainian"; -// type gbk = -// | "chinese" -// | "csgb2312" -// | "csiso58gb231280" -// | "gb2312" -// | "gb_2312" -// | "gb_2312-80" -// | "gbk" -// | "iso-ir-58" -// | "x-gbk"; -// type gb18030 = "gb18030"; -// type hz_gb_2312 = "hz-gb-2312"; -// type big5 = "big5" | "big5-hkscs" | "cn-big5" | "csbig5" | "x-x-big5"; -// type euc_jp = "cseucpkdfmtjapanese" | "euc-jp" | "x-euc-jp"; -// type iso_2022_jp = "csiso2022jp" | "iso-2022-jp"; -// type shift_jis = "csshiftjis" | "ms_kanji" | "shift-jis" | "shift_jis" | "sjis" | "windows-31j" | "x-sjis"; -// type euc_kr = -// | "cseuckr" -// | "csksc56011987" -// | "euc-kr" -// | "iso-ir-149" -// | "korean" -// | "ks_c_5601-1987" -// | "ks_c_5601-1989" -// | "ksc5601" -// | "ksc_5601" -// | "windows-949"; -// type iso_2022_kr = "csiso2022kr" | "iso-2022-kr"; -// type utf_16be = "utf-16be"; -// type utf_16le = "utf-16" | "utf-16le"; -// type x_user_defined = "x-user-defined"; -// type replacement = "iso-2022-cn" | "iso-2022-cn-ext"; +// Every label the runtime accepts is a valid Bun.Encoding. +labels satisfies readonly Bun.Encoding[]; -// type TextEncoding = -// | utf_8 -// | ibm866 -// | iso_8859_2 -// | iso_8859_3 -// | iso_8859_4 -// | iso_8859_5 -// | iso_8859_6 -// | iso_8859_7 -// | iso_8859_8 -// | iso_8859_8i -// | iso_8859_10 -// | iso_8859_13 -// | iso_8859_14 -// | iso_8859_15 -// | iso_8859_16 -// | koi8_r -// | koi8_u -// | macintosh -// | windows_874 -// | windows_1250 -// | windows_1251 -// | windows_1252 -// | windows_1253 -// | windows_1254 -// | windows_1255 -// | windows_1256 -// | windows_1257 -// | windows_1258 -// | x_mac_cyrillic -// | gbk -// | gb18030 -// | hz_gb_2312 -// | big5 -// | euc_jp -// | iso_2022_jp -// | shift_jis -// | euc_kr -// | iso_2022_kr -// | utf_16be -// | utf_16le -// | x_user_defined -// | replacement; +// Bun.Encoding contains nothing beyond those labels. +declare const anyEncoding: Bun.Encoding; +anyEncoding satisfies (typeof labels)[number]; -// export type TextDecoderOptions = ConstructorParameters[1]; +for (const label of labels) { + new TextDecoder(label); +} -// function decode(encoding: TextEncoding, array: ArrayBufferView | ArrayBuffer, options?: TextDecoderOptions): string { -// const decoder = new TextDecoder(encoding, options); -// return decoder.decode(array); -// } +new TextDecoder("windows-1251", { fatal: true, ignoreBOM: true }).decode( + Uint8Array.from([0xcf, 0xf0, 0xe8, 0xe2, 0xe5, 0xf2]), +); -// decode("utf-8", new Uint8Array([0x41, 0x42, 0x43]), { -// fatal: true, -// }); +// @ts-expect-error - the TextDecoder constructor rejects the replacement encoding +"hz-gb-2312" satisfies Bun.Encoding; + +// @ts-expect-error - the TextDecoder constructor rejects the replacement encoding +"replacement" satisfies Bun.Encoding; + +// @ts-expect-error - not a label the Encoding Standard defines +"utf-32" satisfies Bun.Encoding; + +new TextEncoder().encode("hello"); export {};