{"version":3,"file":"codec.mjs","names":[],"sources":["../src/macros/env.ts","../src/std/codec/mina_utf8.ts","../src/std/codec/mod.ts"],"sourcesContent":["/**\n * @internal\n * 小游戏环境宏模块。\n */\n\n/**\n * 小游戏环境宏。\n *\n * 可通过打包工具在 build 时修改，如 esbuild webpack vite 等。\n */\ndeclare const __MINIGAME_STD_MINA__: boolean;\n\n/**\n * 如果在小游戏环境中返回 true，否则返回 false。\n */\nexport const IS_MINA = __MINIGAME_STD_MINA__;\n","/**\n * 小游戏环境的 UTF-8 编解码\n *\n * @internal\n */\n\nimport { decodeUtf8 as webDecodeUtf8, encodeUtf8 as webEncodeUtf8 } from 'happy-codec';\nimport { bufferSourceToAb } from '../internal/mod.ts';\nimport { isMiniGameHarmonyOS, isMiniGameHarmonyPC } from '../platform/mod.ts';\n\n// #region Internal Variables\n\nconst FORMAT = 'utf8' as const;\n\n// #endregion\n\n/**\n * 将字符串数据编码为 Uint8Array。\n * @param data - 需要编码的字符串数据。\n * @returns 编码后的 Uint8Array。\n */\nexport function encodeUtf8(data: string): Uint8Array<ArrayBuffer> {\n    // 兼容某些平台没有 `encode` 方法\n    // TODO(platform-wx): 鸿蒙微信小游戏的 `wx.encode` 实现存在 bug, 返回错误的编码结果。\n    // 其中 HarmonyOS(`ohos`) 已确认存在 bug; HarmonyOS PC(`ohos_pc`) 未经验证, 但一并跳过是最保险的做法\n    // (即便 `wx.encode` 在 HarmonyPC 上正确, 走 `webEncodeUtf8` 兜底也只是性能略降, 不影响正确性)。\n    // 待平台修复后可移除 `isMiniGameHarmonyOS() && isMiniGameHarmonyPC()` 判断恢复使用 `wx.encode`。\n    return typeof wx.encode === 'function' && !isMiniGameHarmonyOS() && !isMiniGameHarmonyPC()\n        ? new Uint8Array(\n            wx.encode({\n                data,\n                format: FORMAT,\n            }),\n        )\n        : webEncodeUtf8(data);\n}\n\n/**\n * 将 BufferSource 数据解码为字符串。\n *\n * 当 `options` 为默认值（`fatal = false` 且 `ignoreBOM = false`）时，优先使用 `wx.decode` 以获得更好的性能；\n * 否则回退到 `happy-codec` 实现以支持完整的 `TextDecoderOptions` 功能。\n *\n * @param data - 需要解码的 BufferSource。\n * @param options - 解码选项（可选）。\n * @param options.fatal - 如果为 `true`，遇到无效 UTF-8 序列会抛出异常；默认为 `false`，使用 U+FFFD 替换。\n * @param options.ignoreBOM - 如果为 `true`，保留 BOM；默认为 `false`，自动删除 BOM。\n * @returns 解码后的字符串。\n */\nexport function decodeUtf8(data: BufferSource, options?: TextDecoderOptions): string {\n    const {\n        fatal = false,\n        ignoreBOM = false,\n    } = options ?? {};\n\n    // `wx.decode` 的行为和 `fatal = false(不会报错) && ignoreBOM = false(丢弃BOM)` 的行为一致\n    // 兼容某些平台没有 `decode` 方法\n    if (!fatal && !ignoreBOM && typeof wx.decode === 'function') {\n        const ab = bufferSourceToAb(data);\n        return wx.decode({\n            data: ab,\n            format: FORMAT,\n        });\n    }\n\n    return webDecodeUtf8(data, options);\n}\n","/**\n * Codec 模块：提供各种编码/解码功能。\n * 除了 UTF-8 编码/解码功能外，其余编码/解码功能直接从 `happy-codec` 包中导出。\n *\n * @module codec\n */\n\nimport { decodeUtf8 as webDecodeUtf8, encodeUtf8 as webEncodeUtf8 } from 'happy-codec';\nimport { IS_MINA } from '../../macros/env.ts';\nimport { decodeUtf8 as minaDecodeUtf8, encodeUtf8 as minaEncodeUtf8 } from './mina_utf8.ts';\n\nexport { decodeBase64, decodeByteString, decodeHex, encodeBase64, encodeByteString, encodeHex, type DecodeBase64Options, type EncodeBase64Options } from 'happy-codec';\n\n/**\n * 将字符串数据编码为 `Uint8Array`（UTF-8 编码）。\n * @param data - 需要编码的字符串数据。\n * @returns 编码后的 `Uint8Array`。\n * @since 1.0.0\n * @example\n * ```ts\n * const encoded = encodeUtf8('你好');\n * console.log(encoded); // Uint8Array [228, 189, 160, 229, 165, 189]\n * ```\n */\nexport function encodeUtf8(data: string): Uint8Array<ArrayBuffer> {\n    return (IS_MINA ? minaEncodeUtf8 : webEncodeUtf8)(data);\n}\n\n/**\n * 将二进制数据解码为字符串（UTF-8 解码）。\n * @param data - 需要解码的二进制数据。\n * @param options - 解码选项（可选）。\n * @param options.fatal - 如果为 `true`，遇到无效的 UTF-8 序列会抛出异常；如果为 `false`（默认），使用替换字符 U+FFFD 代替。\n * @param options.ignoreBOM - 如果为 `true`，保留字节顺序标记（BOM）；如果为 `false`（默认），自动删除 BOM。\n * @returns 解码后的字符串。\n * @throws {TypeError} 当 `options.fatal` 为 `true` 且输入包含无效的 UTF-8 序列时。\n * @since 1.0.0\n * @example\n * ```ts\n * // 基本用法\n * const decoded = decodeUtf8(new Uint8Array([228, 189, 160, 229, 165, 189]));\n * console.log(decoded); // '你好'\n *\n * // 使用 fatal 选项处理无效字节\n * const withReplacement = decodeUtf8(new Uint8Array([0xff, 0xfe]));\n * console.log(withReplacement); // '��'（使用替换字符）\n *\n * // 使用 ignoreBOM 选项保留 BOM\n * const withBOM = new Uint8Array([0xef, 0xbb, 0xbf, 0x48, 0x69]); // BOM + 'Hi'\n * decodeUtf8(withBOM); // 'Hi'（删除 BOM）\n * decodeUtf8(withBOM, { ignoreBOM: true }); // '\\uFEFFHi'（保留 BOM）\n * ```\n */\nexport function decodeUtf8(data: BufferSource, options?: TextDecoderOptions): string {\n    return (IS_MINA ? minaDecodeUtf8 : webDecodeUtf8)(data, options);\n}\n"],"mappings":";;;;;;;AAeA,MAAa,UAAU;;;;;;;;ACHvB,MAAM,SAAS;;;;;;AASf,SAAgB,aAAW,MAAuC;CAM9D,OAAO,OAAO,GAAG,WAAW,cAAc,CAAC,oBAAoB,KAAK,CAAC,oBAAoB,IACnF,IAAI,WACF,GAAG,OAAO;EACN;EACA,QAAQ;CACZ,CAAC,CACL,IACE,aAAc,IAAI;AAC5B;;;;;;;;;;;;;AAcA,SAAgB,aAAW,MAAoB,SAAsC;CACjF,MAAM,EACF,QAAQ,OACR,YAAY,UACZ,WAAW,CAAC;CAIhB,IAAI,CAAC,SAAS,CAAC,aAAa,OAAO,GAAG,WAAW,YAAY;EACzD,MAAM,KAAK,iBAAiB,IAAI;EAChC,OAAO,GAAG,OAAO;GACb,MAAM;GACN,QAAQ;EACZ,CAAC;CACL;CAEA,OAAO,aAAc,MAAM,OAAO;AACtC;;;;;;;;;;;;;;;;;;;;AC1CA,SAAgB,WAAW,MAAuC;CAC9D,QAAQ,UAAU,eAAiB,aAAA,CAAe,IAAI;AAC1D;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,WAAW,MAAoB,SAAsC;CACjF,QAAQ,UAAU,eAAiB,aAAA,CAAe,MAAM,OAAO;AACnE"}