aboutsummaryrefslogtreecommitdiffstats
path: root/vanilla/node_modules/@exodus/bytes/encoding-browser.browser.js
diff options
context:
space:
mode:
authorAdam Mathes <adam@adammathes.com>2026-02-13 21:34:48 -0800
committerAdam Mathes <adam@adammathes.com>2026-02-13 21:34:48 -0800
commit76cb9c2a39d477a64824a985ade40507e3bbade1 (patch)
tree41e997aa9c6f538d3a136af61dae9424db2005a9 /vanilla/node_modules/@exodus/bytes/encoding-browser.browser.js
parent819a39a21ac992b1393244a4c283bbb125208c69 (diff)
downloadneko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.gz
neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.bz2
neko-76cb9c2a39d477a64824a985ade40507e3bbade1.zip
feat(vanilla): add testing infrastructure and tests (NK-wjnczv)
Diffstat (limited to 'vanilla/node_modules/@exodus/bytes/encoding-browser.browser.js')
-rw-r--r--vanilla/node_modules/@exodus/bytes/encoding-browser.browser.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/vanilla/node_modules/@exodus/bytes/encoding-browser.browser.js b/vanilla/node_modules/@exodus/bytes/encoding-browser.browser.js
new file mode 100644
index 0000000..e8333b4
--- /dev/null
+++ b/vanilla/node_modules/@exodus/bytes/encoding-browser.browser.js
@@ -0,0 +1,55 @@
+import { getBOMEncoding } from './fallback/encoding.api.js'
+
+// Lite-weight version which re-exports existing implementations on browsers,
+// while still being aliased to the full impl in RN and Node.js
+
+// WARNING: Note that browsers have bugs (which hopefully will get fixed soon)
+
+const { TextDecoder, TextEncoder, TextDecoderStream, TextEncoderStream } = globalThis
+
+export { getBOMEncoding } from './fallback/encoding.api.js'
+export { TextDecoder, TextEncoder, TextDecoderStream, TextEncoderStream }
+
+export function normalizeEncoding(label) {
+ if (label === 'utf-8' || label === 'utf8' || label === 'UTF-8' || label === 'UTF8') return 'utf-8'
+ if (label === 'windows-1252' || label === 'ascii' || label === 'latin1') return 'windows-1252'
+ if (/[^\w\t\n\f\r .:-]/i.test(label)) return null
+ const l = `${label}`.trim().toLowerCase()
+ try {
+ return new TextDecoder(l).encoding
+ } catch {}
+
+ if (l === 'x-user-defined') return l
+ if (
+ l === 'replacement' ||
+ l === 'csiso2022kr' ||
+ l === 'hz-gb-2312' ||
+ l === 'iso-2022-cn' ||
+ l === 'iso-2022-cn-ext' ||
+ l === 'iso-2022-kr'
+ ) {
+ return 'replacement'
+ }
+
+ return null
+}
+
+export function legacyHookDecode(input, fallbackEncoding = 'utf-8') {
+ const enc = getBOMEncoding(input) ?? normalizeEncoding(fallbackEncoding)
+ if (enc === 'replacement') return input.byteLength > 0 ? '\uFFFD' : ''
+ return new TextDecoder(enc).decode(input)
+}
+
+export function labelToName(label) {
+ const enc = normalizeEncoding(label)
+ if (enc === 'utf-8') return 'UTF-8'
+ if (!enc) return enc
+ const p = enc.slice(0, 3)
+ if (p === 'utf' || p === 'iso' || p === 'koi' || p === 'euc' || p === 'ibm' || p === 'gbk') {
+ return enc.toUpperCase()
+ }
+
+ if (enc === 'big5') return 'Big5'
+ if (enc === 'shift_jis') return 'Shift_JIS'
+ return enc
+}