@pawover/kit 0.2.2 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "https://github.com/pawover"
7
7
  },
8
8
  "description": "一个基于 TypeScript 的开发工具包",
9
- "version": "0.2.2",
9
+ "version": "0.3.1",
10
10
  "type": "module",
11
11
  "engines": {
12
12
  "node": ">=22.20.0"
@@ -53,8 +53,8 @@
53
53
  "devDependencies": {
54
54
  "@commitlint/cli": "^21.2.1",
55
55
  "@commitlint/config-conventional": "^21.2.0",
56
- "@eslint-react/eslint-plugin": "^5.14.6",
57
- "@pawover/eslint-rules": "^0.2.2",
56
+ "@eslint-react/eslint-plugin": "^5.14.8",
57
+ "@pawover/eslint-rules": "^0.2.3",
58
58
  "@playwright/test": "^1.61.1",
59
59
  "@stylistic/eslint-plugin": "^6.0.0-beta.5",
60
60
  "@types/fs-extra": "^11.0.4",
@@ -75,9 +75,9 @@
75
75
  "rimraf": "^6.1.3",
76
76
  "taze": "^19.14.1",
77
77
  "tsdown": "^0.22.7",
78
- "turbo": "^2.10.4",
78
+ "turbo": "^2.10.5",
79
79
  "typescript": "^6.0.3",
80
- "typescript-eslint": "^8.63.0",
80
+ "typescript-eslint": "^8.64.0",
81
81
  "vitest": "^4.1.10"
82
82
  },
83
83
  "peerDependencies": {
@@ -1538,6 +1538,395 @@ var EnvUtil = class {
1538
1538
  }
1539
1539
  };
1540
1540
  /**
1541
+ * MIME 工具类
1542
+ */
1543
+ var MimeUtil = class {
1544
+ /**
1545
+ * 文件类型 MIME 常量
1546
+ * - 每个类型对应具体的文件扩展名
1547
+ */
1548
+ static FILE_MIME = {
1549
+ /** 普通文本文件(.txt) */
1550
+ TEXT: "text/plain",
1551
+ /** 超文本标记语言文档(.html/.htm) */
1552
+ HTML: "text/html",
1553
+ /** 层叠样式表文件(.css) */
1554
+ CSS: "text/css",
1555
+ /** 逗号分隔值文件/表格数据(.csv) */
1556
+ CSV: "text/csv",
1557
+ /** 制表符分隔值文件(.tsv) */
1558
+ TSV: "text/tab-separated-values",
1559
+ /** XML 文档(.xml) */
1560
+ XML: "application/xml",
1561
+ /** XML 文档/兼容值 */
1562
+ XML_LEGACY: "text/xml",
1563
+ /** XHTML 文档(.xhtml/.xht) */
1564
+ XHTML: "application/xhtml+xml",
1565
+ /** JavaScript 文件(.js) */
1566
+ JS: "text/javascript",
1567
+ /** TypeScript 文件(.ts) */
1568
+ TS: "text/typescript",
1569
+ /** Python 文件(.py) */
1570
+ PY: "text/x-python",
1571
+ /** Shell 脚本 (.sh) */
1572
+ SH: "text/x-sh",
1573
+ /** C 语言源文件(.c) */
1574
+ C: "text/x-c",
1575
+ /** C++ 源文件(.cpp/.cc/.cxx) */
1576
+ CPP: "text/x-c++",
1577
+ /** C# 源文件(.cs) */
1578
+ CSHARP: "text/x-csharp",
1579
+ /** Java 源文件(.java) */
1580
+ JAVA: "text/x-java",
1581
+ /** Go 源文件(.go) */
1582
+ GO: "text/x-go",
1583
+ /** Rust 源文件(.rs) */
1584
+ RUST: "text/x-rust",
1585
+ /** PHP 文件(.php) */
1586
+ PHP: "text/x-php",
1587
+ /** Ruby 文件(.rb) */
1588
+ RUBY: "text/x-ruby",
1589
+ /** Swift 源文件(.swift) */
1590
+ SWIFT: "text/x-swift",
1591
+ /** YAML 文档(.yaml/.yml) */
1592
+ YAML: "application/yaml",
1593
+ /** YAML 文档/兼容值 */
1594
+ YAML_LEGACY: "text/vnd.yaml",
1595
+ /** TOML 文档(.toml) */
1596
+ TOML: "application/toml",
1597
+ /** TOML 文档/兼容值 */
1598
+ TOML_LEGACY: "text/x-toml",
1599
+ /** SQL 脚本(.sql) */
1600
+ SQL: "application/sql",
1601
+ /** SQL 脚本/兼容值 */
1602
+ SQL_LEGACY: "text/x-sql",
1603
+ /** Markdown 格式文档(.md/.markdown) */
1604
+ MARKDOWN: "text/markdown",
1605
+ /** 富文本格式文档(.rtf) */
1606
+ RTF: "application/rtf",
1607
+ /** iCalendar 日历格式(.ics) */
1608
+ CALENDAR: "text/calendar",
1609
+ /** JPEG 图像(.jpg/.jpeg) */
1610
+ JPEG: "image/jpeg",
1611
+ /** JPG 图像(JPEG 别名,.jpg) */
1612
+ JPG: "image/jpeg",
1613
+ /** PNG 图像/无损压缩,支持透明(.png) */
1614
+ PNG: "image/png",
1615
+ /** GIF 图像/支持动画(.gif) */
1616
+ GIF: "image/gif",
1617
+ /** Windows 位图(.bmp) */
1618
+ BMP: "image/bmp",
1619
+ /** SVG 向量图形(.svg) */
1620
+ SVG: "image/svg+xml",
1621
+ /** APNG 动态图像(.apng) */
1622
+ APNG: "image/apng",
1623
+ /** AVIF 图像/高效压缩(.avif) */
1624
+ AVIF: "image/avif",
1625
+ /** 图标文件格式(.ico) */
1626
+ ICO: "image/vnd.microsoft.icon",
1627
+ /** 图标文件格式/兼容值(.ico) */
1628
+ ICO_LEGACY: "image/x-icon",
1629
+ /** WebP 图像/高效压缩(.webp) */
1630
+ WEBP: "image/webp",
1631
+ /** TIFF 图像(.tif/.tiff) */
1632
+ TIFF: "image/tiff",
1633
+ /** HEIC 图像/高效编码(.heic) */
1634
+ HEIC: "image/heic",
1635
+ /** HEIF 图像/高效编码(.heif) */
1636
+ HEIF: "image/heif",
1637
+ /** Adobe Photoshop 文件(.psd) */
1638
+ PSD: "image/vnd.adobe.photoshop",
1639
+ /** MP3 音频(.mp3) */
1640
+ MP3: "audio/mpeg",
1641
+ /** AAC 音频(.aac) */
1642
+ AAC: "audio/aac",
1643
+ /** MIDI 音乐文件(.mid/.midi) */
1644
+ MIDI: "audio/midi",
1645
+ /** OGG 音频(.oga) */
1646
+ OGG_AUDIO: "audio/ogg",
1647
+ /** Opus 音频(.opus) */
1648
+ OPUS: "audio/opus",
1649
+ /** FLAC 无损音频(.flac) */
1650
+ FLAC: "audio/flac",
1651
+ /** WAV 音频(.wav) */
1652
+ WAV: "audio/wav",
1653
+ /** WebM 音频(.weba) */
1654
+ WEBM_AUDIO: "audio/webm",
1655
+ /** RealAudio 音频(.ra/.ram) */
1656
+ REAL_AUDIO: "audio/x-pn-realaudio",
1657
+ /** MP4 视频(.mp4) */
1658
+ MP4: "video/mp4",
1659
+ /** MPEG 视频(.mpeg/.mpg) */
1660
+ MPEG: "video/mpeg",
1661
+ /** OGG 视频(.ogv) */
1662
+ OGG_VIDEO: "video/ogg",
1663
+ /** AVI 视频(.avi) */
1664
+ AVI: "video/x-msvideo",
1665
+ /** 3GPP 视频(.3gp) */
1666
+ THREE_GPP: "video/3gpp",
1667
+ /** 3GPP2 视频(.3g2) */
1668
+ THREE_GPP2: "video/3gpp2",
1669
+ /** WebM 视频(.webm) */
1670
+ WEBM: "video/webm",
1671
+ /** Matroska 视频(.mkv) */
1672
+ MKV: "video/x-matroska",
1673
+ /** Matroska 音频(.mka) */
1674
+ MKA: "audio/x-matroska",
1675
+ /** QuickTime 视频(.mov) */
1676
+ QUICKTIME: "video/quicktime",
1677
+ /** PDF 文档(.pdf) */
1678
+ PDF: "application/pdf",
1679
+ /** Word 97-2003 文档(.doc) */
1680
+ DOC: "application/msword",
1681
+ /** Word 2007+ 文档(.docx) */
1682
+ DOCX: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
1683
+ /** Excel 2007+ 工作簿(.xlsx) */
1684
+ XLSX: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
1685
+ /** 启用宏的Excel工作簿(.xlsm) */
1686
+ XLSM: "application/vnd.ms-excel.sheet.macroEnabled.12",
1687
+ /** Excel模板文件(.xltx) */
1688
+ XLTX: "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
1689
+ /** PowerPoint 2007+ 演示文稿(.pptx) */
1690
+ PPTX: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
1691
+ /** PowerPoint 97-2003 演示文稿(.ppt) */
1692
+ PPT: "application/vnd.ms-powerpoint",
1693
+ /** OpenDocument 文本文档(.odt) */
1694
+ ODT: "application/vnd.oasis.opendocument.text",
1695
+ /** OpenDocument 表格文档(.ods) */
1696
+ ODS: "application/vnd.oasis.opendocument.spreadsheet",
1697
+ /** OpenDocument 演示文稿(.odp) */
1698
+ ODP: "application/vnd.oasis.opendocument.presentation",
1699
+ /** EPUB 电子书(.epub) */
1700
+ EPUB: "application/epub+zip",
1701
+ /** Kindle 电子书(.azw) */
1702
+ AZW: "application/vnd.amazon.ebook",
1703
+ /** ZIP 压缩文件(.zip) */
1704
+ ZIP: "application/zip",
1705
+ /** GZIP 压缩文件(.gz) */
1706
+ GZIP: "application/gzip",
1707
+ /** TAR 归档文件(.tar) */
1708
+ TAR: "application/x-tar",
1709
+ /** BZip 归档(.bz) */
1710
+ BZIP: "application/x-bzip",
1711
+ /** BZip2 归档(.bz2) */
1712
+ BZIP2: "application/x-bzip2",
1713
+ /** 7-Zip 压缩文件(.7z) */
1714
+ SEVEN_Z: "application/x-7z-compressed",
1715
+ /** RAR 压缩文件(.rar) */
1716
+ RAR: "application/vnd.rar",
1717
+ /** XZ 压缩文件(.xz) */
1718
+ XZ: "application/x-xz",
1719
+ /** Zstandard 压缩文件(.zst) */
1720
+ ZSTD: "application/zstd",
1721
+ /** ISO 光盘镜像(.iso) */
1722
+ ISO9660_IMAGE: "application/x-iso9660-image",
1723
+ /** JSON 数据格式(.json) */
1724
+ JSON: "application/json",
1725
+ /** JSON-LD 格式(.jsonld) */
1726
+ LD_JSON: "application/ld+json",
1727
+ /** Web App Manifest(.webmanifest) */
1728
+ MANIFEST: "application/manifest+json",
1729
+ /** Java 归档文件(.jar) */
1730
+ JAR: "application/java-archive",
1731
+ /** WebAssembly 二进制指令格式(.wasm) */
1732
+ WASM: "application/wasm",
1733
+ /** MS 嵌入式 OpenType 字体(.eot) */
1734
+ EOT: "application/vnd.ms-fontobject",
1735
+ /** OpenType 字体(.otf) */
1736
+ OTF: "font/otf",
1737
+ /** WOFF 字体(.woff) */
1738
+ WOFF: "font/woff",
1739
+ /** WOFF2 字体(.woff2) */
1740
+ WOFF2: "font/woff2",
1741
+ /** TrueType 字体(.ttf) */
1742
+ TTF: "font/ttf",
1743
+ /** Excel 97-2003 工作簿(.xls) */
1744
+ XLS: "application/vnd.ms-excel",
1745
+ /** Microsoft XPS 文档(.xps) */
1746
+ XPS: "application/vnd.ms-xpsdocument",
1747
+ /** Word 启用宏文档(.docm) */
1748
+ DOCM: "application/vnd.ms-word.document.macroEnabled.12"
1749
+ };
1750
+ /**
1751
+ * 协议/内容类型 MIME 常量
1752
+ * - 用于 HTTP 请求/响应内容协商,无对应文件扩展名
1753
+ */
1754
+ static PROTOCOL_MIME = {
1755
+ /** 通用二进制数据流 */
1756
+ OCTET_STREAM: "application/octet-stream",
1757
+ /** URL 编码表单 */
1758
+ FORM_URLENCODED: "application/x-www-form-urlencoded",
1759
+ /** multipart 表单 */
1760
+ FORM_DATA: "multipart/form-data",
1761
+ /** Server-Sent Events 数据流 */
1762
+ EVENT_STREAM: "text/event-stream",
1763
+ /** 问题详情 JSON(RFC 9457) */
1764
+ PROBLEM_JSON: "application/problem+json",
1765
+ /** JSON Patch(RFC 6902) */
1766
+ JSON_PATCH: "application/json-patch+json",
1767
+ /** JSON Merge Patch(RFC 7386) */
1768
+ MERGE_PATCH_JSON: "application/merge-patch+json"
1769
+ };
1770
+ /**
1771
+ * 根据文件后缀名获取对应的标准 MIME 类型(含历史兼容值)
1772
+ * - 支持带 `.` 或不带 `.` 的后缀名,不区分大小写
1773
+ * - 元组第一项始终为 IANA 官方标准 MIME,后续项为历史兼容值
1774
+ * - 仅查询文件类型 MIME,不包含无后缀对应的协议类型
1775
+ *
1776
+ * @param extension 文件后缀名(如 `".png"` / `"png"` / `".PNG"`)
1777
+ * @returns 标准 MIME + 兼容值的元组;如无匹配则返回 `undefined`
1778
+ * @example
1779
+ * ```ts
1780
+ * MimeUtil.fromExtension(".png"); // ["image/png"]
1781
+ * MimeUtil.fromExtension("ico"); // ["image/vnd.microsoft.icon", "image/x-icon"]
1782
+ * MimeUtil.fromExtension(".xml"); // ["application/xml", "text/xml"]
1783
+ * MimeUtil.fromExtension(".xyz"); // undefined
1784
+ * ```
1785
+ */
1786
+ static fromExtension(extension) {
1787
+ const ext = StringUtil.cast(extension).toLowerCase();
1788
+ const key = ext.startsWith(".") ? ext : `.${ext}`;
1789
+ return EXT_TO_MIME[key];
1790
+ }
1791
+ /**
1792
+ * 根据 MIME 类型获取对应的文件后缀名列表
1793
+ * - 一个 MIME 类型可能对应多个后缀名(如 `text/html` → `.html` / `.htm`)
1794
+ * - 兼容值和标准值映射到相同的后缀(如 `image/x-icon` 和 `image/vnd.microsoft.icon` 均返回 `[".ico"]`)
1795
+ * - 仅查询文件类型 MIME,协议类型无对应后缀
1796
+ *
1797
+ * @param mime MIME 类型字符串(如 `"image/png"` / `"IMAGE/PNG"`)
1798
+ * @returns 文件后缀名列表;如无匹配则返回 `undefined`
1799
+ * @example
1800
+ * ```ts
1801
+ * MimeUtil.toExtension("IMAGE/PNG"); // [".png"]
1802
+ * MimeUtil.toExtension("text/html"); // [".html", ".htm"]
1803
+ * MimeUtil.toExtension("image/jpeg"); // [".jpg", ".jpeg"]
1804
+ * MimeUtil.toExtension("application/octet-stream"); // undefined
1805
+ * ```
1806
+ */
1807
+ static toExtension(mime) {
1808
+ const m = StringUtil.cast(mime).toLowerCase();
1809
+ return MIME_TO_EXT.get(m);
1810
+ }
1811
+ };
1812
+ const EXT_TO_MIME = {
1813
+ ".txt": [MimeUtil.FILE_MIME.TEXT],
1814
+ ".html": [MimeUtil.FILE_MIME.HTML],
1815
+ ".htm": [MimeUtil.FILE_MIME.HTML],
1816
+ ".css": [MimeUtil.FILE_MIME.CSS],
1817
+ ".csv": [MimeUtil.FILE_MIME.CSV],
1818
+ ".tsv": [MimeUtil.FILE_MIME.TSV],
1819
+ ".xml": [MimeUtil.FILE_MIME.XML, MimeUtil.FILE_MIME.XML_LEGACY],
1820
+ ".xhtml": [MimeUtil.FILE_MIME.XHTML],
1821
+ ".xht": [MimeUtil.FILE_MIME.XHTML],
1822
+ ".js": [MimeUtil.FILE_MIME.JS],
1823
+ ".ts": [MimeUtil.FILE_MIME.TS],
1824
+ ".py": [MimeUtil.FILE_MIME.PY],
1825
+ ".sh": [MimeUtil.FILE_MIME.SH],
1826
+ ".c": [MimeUtil.FILE_MIME.C],
1827
+ ".cpp": [MimeUtil.FILE_MIME.CPP],
1828
+ ".cc": [MimeUtil.FILE_MIME.CPP],
1829
+ ".cxx": [MimeUtil.FILE_MIME.CPP],
1830
+ ".cs": [MimeUtil.FILE_MIME.CSHARP],
1831
+ ".java": [MimeUtil.FILE_MIME.JAVA],
1832
+ ".go": [MimeUtil.FILE_MIME.GO],
1833
+ ".rs": [MimeUtil.FILE_MIME.RUST],
1834
+ ".php": [MimeUtil.FILE_MIME.PHP],
1835
+ ".rb": [MimeUtil.FILE_MIME.RUBY],
1836
+ ".swift": [MimeUtil.FILE_MIME.SWIFT],
1837
+ ".yaml": [MimeUtil.FILE_MIME.YAML, MimeUtil.FILE_MIME.YAML_LEGACY],
1838
+ ".yml": [MimeUtil.FILE_MIME.YAML, MimeUtil.FILE_MIME.YAML_LEGACY],
1839
+ ".toml": [MimeUtil.FILE_MIME.TOML, MimeUtil.FILE_MIME.TOML_LEGACY],
1840
+ ".sql": [MimeUtil.FILE_MIME.SQL, MimeUtil.FILE_MIME.SQL_LEGACY],
1841
+ ".md": [MimeUtil.FILE_MIME.MARKDOWN],
1842
+ ".markdown": [MimeUtil.FILE_MIME.MARKDOWN],
1843
+ ".rtf": [MimeUtil.FILE_MIME.RTF],
1844
+ ".ics": [MimeUtil.FILE_MIME.CALENDAR],
1845
+ ".jpg": [MimeUtil.FILE_MIME.JPEG],
1846
+ ".jpeg": [MimeUtil.FILE_MIME.JPEG],
1847
+ ".png": [MimeUtil.FILE_MIME.PNG],
1848
+ ".gif": [MimeUtil.FILE_MIME.GIF],
1849
+ ".bmp": [MimeUtil.FILE_MIME.BMP],
1850
+ ".svg": [MimeUtil.FILE_MIME.SVG],
1851
+ ".apng": [MimeUtil.FILE_MIME.APNG],
1852
+ ".avif": [MimeUtil.FILE_MIME.AVIF],
1853
+ ".ico": [MimeUtil.FILE_MIME.ICO, MimeUtil.FILE_MIME.ICO_LEGACY],
1854
+ ".webp": [MimeUtil.FILE_MIME.WEBP],
1855
+ ".tif": [MimeUtil.FILE_MIME.TIFF],
1856
+ ".tiff": [MimeUtil.FILE_MIME.TIFF],
1857
+ ".heic": [MimeUtil.FILE_MIME.HEIC],
1858
+ ".heif": [MimeUtil.FILE_MIME.HEIF],
1859
+ ".psd": [MimeUtil.FILE_MIME.PSD],
1860
+ ".mp3": [MimeUtil.FILE_MIME.MP3],
1861
+ ".aac": [MimeUtil.FILE_MIME.AAC],
1862
+ ".mid": [MimeUtil.FILE_MIME.MIDI],
1863
+ ".midi": [MimeUtil.FILE_MIME.MIDI],
1864
+ ".oga": [MimeUtil.FILE_MIME.OGG_AUDIO],
1865
+ ".opus": [MimeUtil.FILE_MIME.OPUS],
1866
+ ".flac": [MimeUtil.FILE_MIME.FLAC],
1867
+ ".wav": [MimeUtil.FILE_MIME.WAV],
1868
+ ".weba": [MimeUtil.FILE_MIME.WEBM_AUDIO],
1869
+ ".ra": [MimeUtil.FILE_MIME.REAL_AUDIO],
1870
+ ".ram": [MimeUtil.FILE_MIME.REAL_AUDIO],
1871
+ ".mp4": [MimeUtil.FILE_MIME.MP4],
1872
+ ".mpeg": [MimeUtil.FILE_MIME.MPEG],
1873
+ ".mpg": [MimeUtil.FILE_MIME.MPEG],
1874
+ ".ogv": [MimeUtil.FILE_MIME.OGG_VIDEO],
1875
+ ".avi": [MimeUtil.FILE_MIME.AVI],
1876
+ ".3gp": [MimeUtil.FILE_MIME.THREE_GPP],
1877
+ ".3g2": [MimeUtil.FILE_MIME.THREE_GPP2],
1878
+ ".webm": [MimeUtil.FILE_MIME.WEBM],
1879
+ ".mkv": [MimeUtil.FILE_MIME.MKV],
1880
+ ".mka": [MimeUtil.FILE_MIME.MKA],
1881
+ ".mov": [MimeUtil.FILE_MIME.QUICKTIME],
1882
+ ".pdf": [MimeUtil.FILE_MIME.PDF],
1883
+ ".doc": [MimeUtil.FILE_MIME.DOC],
1884
+ ".docx": [MimeUtil.FILE_MIME.DOCX],
1885
+ ".xlsx": [MimeUtil.FILE_MIME.XLSX],
1886
+ ".xlsm": [MimeUtil.FILE_MIME.XLSM],
1887
+ ".xltx": [MimeUtil.FILE_MIME.XLTX],
1888
+ ".pptx": [MimeUtil.FILE_MIME.PPTX],
1889
+ ".ppt": [MimeUtil.FILE_MIME.PPT],
1890
+ ".odt": [MimeUtil.FILE_MIME.ODT],
1891
+ ".ods": [MimeUtil.FILE_MIME.ODS],
1892
+ ".odp": [MimeUtil.FILE_MIME.ODP],
1893
+ ".epub": [MimeUtil.FILE_MIME.EPUB],
1894
+ ".azw": [MimeUtil.FILE_MIME.AZW],
1895
+ ".zip": [MimeUtil.FILE_MIME.ZIP],
1896
+ ".gz": [MimeUtil.FILE_MIME.GZIP],
1897
+ ".tar": [MimeUtil.FILE_MIME.TAR],
1898
+ ".bz": [MimeUtil.FILE_MIME.BZIP],
1899
+ ".bz2": [MimeUtil.FILE_MIME.BZIP2],
1900
+ ".7z": [MimeUtil.FILE_MIME.SEVEN_Z],
1901
+ ".rar": [MimeUtil.FILE_MIME.RAR],
1902
+ ".xz": [MimeUtil.FILE_MIME.XZ],
1903
+ ".zst": [MimeUtil.FILE_MIME.ZSTD],
1904
+ ".iso": [MimeUtil.FILE_MIME.ISO9660_IMAGE],
1905
+ ".json": [MimeUtil.FILE_MIME.JSON],
1906
+ ".jsonld": [MimeUtil.FILE_MIME.LD_JSON],
1907
+ ".webmanifest": [MimeUtil.FILE_MIME.MANIFEST],
1908
+ ".jar": [MimeUtil.FILE_MIME.JAR],
1909
+ ".wasm": [MimeUtil.FILE_MIME.WASM],
1910
+ ".eot": [MimeUtil.FILE_MIME.EOT],
1911
+ ".otf": [MimeUtil.FILE_MIME.OTF],
1912
+ ".woff": [MimeUtil.FILE_MIME.WOFF],
1913
+ ".woff2": [MimeUtil.FILE_MIME.WOFF2],
1914
+ ".ttf": [MimeUtil.FILE_MIME.TTF],
1915
+ ".xls": [MimeUtil.FILE_MIME.XLS],
1916
+ ".xps": [MimeUtil.FILE_MIME.XPS],
1917
+ ".docm": [MimeUtil.FILE_MIME.DOCM]
1918
+ };
1919
+ const MIME_TO_EXT = (() => {
1920
+ const map = /* @__PURE__ */ new Map();
1921
+ for (const [ext, mimes] of Object.entries(EXT_TO_MIME)) for (const mime of mimes) {
1922
+ const exts = map.get(mime);
1923
+ if (exts) {
1924
+ if (!exts.includes(ext)) exts.push(ext);
1925
+ } else map.set(mime, [ext]);
1926
+ }
1927
+ return map;
1928
+ })();
1929
+ /**
1541
1930
  * 对象工具类
1542
1931
  */
1543
1932
  var ObjectUtil = class {
@@ -694,57 +694,65 @@ declare class FunctionUtil {
694
694
  */
695
695
  declare class MimeUtil {
696
696
  /**
697
- * 标准 MIME 类型常量,用于文件类型标识和 HTTP Content-Type 头部
698
- * 基于 IANA 注册标准和浏览器兼容性验证
697
+ * 文件类型 MIME 常量
698
+ * - 每个类型对应具体的文件扩展名
699
699
  */
700
- static readonly MIME: {
701
- /** 普通文本文件 */
700
+ static readonly FILE_MIME: {
701
+ /** 普通文本文件(.txt) */
702
702
  readonly TEXT: "text/plain";
703
- /** 超文本标记语言文档 */
703
+ /** 超文本标记语言文档(.html/.htm) */
704
704
  readonly HTML: "text/html";
705
- /** 层叠样式表文件 */
705
+ /** 层叠样式表文件(.css) */
706
706
  readonly CSS: "text/css";
707
- /** 逗号分隔值文件(表格数据) */
707
+ /** 逗号分隔值文件/表格数据(.csv) */
708
708
  readonly CSV: "text/csv";
709
- /** 制表符分隔值文件 */
709
+ /** 制表符分隔值文件(.tsv) */
710
710
  readonly TSV: "text/tab-separated-values";
711
- /** XML 文档 */
712
- readonly XML: "text/xml";
713
- /** XHTML 文档(XML 严格格式的 HTML) */
711
+ /** XML 文档(.xml) */
712
+ readonly XML: "application/xml";
713
+ /** XML 文档/兼容值 */
714
+ readonly XML_LEGACY: "text/xml";
715
+ /** XHTML 文档(.xhtml/.xht) */
714
716
  readonly XHTML: "application/xhtml+xml";
715
- /** JavaScript 文件 */
717
+ /** JavaScript 文件(.js) */
716
718
  readonly JS: "text/javascript";
717
- /** TypeScript 文件 */
719
+ /** TypeScript 文件(.ts) */
718
720
  readonly TS: "text/typescript";
719
- /** Python 文件 */
721
+ /** Python 文件(.py) */
720
722
  readonly PY: "text/x-python";
721
723
  /** Shell 脚本 (.sh) */
722
724
  readonly SH: "text/x-sh";
723
- /** C 语言源文件 */
725
+ /** C 语言源文件(.c) */
724
726
  readonly C: "text/x-c";
725
- /** C++ 源文件 */
727
+ /** C++ 源文件(.cpp/.cc/.cxx) */
726
728
  readonly CPP: "text/x-c++";
727
- /** C# 源文件 */
729
+ /** C# 源文件(.cs) */
728
730
  readonly CSHARP: "text/x-csharp";
729
- /** Java 源文件 */
731
+ /** Java 源文件(.java) */
730
732
  readonly JAVA: "text/x-java";
731
- /** Go 源文件 */
733
+ /** Go 源文件(.go) */
732
734
  readonly GO: "text/x-go";
733
- /** Rust 源文件 */
735
+ /** Rust 源文件(.rs) */
734
736
  readonly RUST: "text/x-rust";
735
- /** PHP 文件 */
737
+ /** PHP 文件(.php) */
736
738
  readonly PHP: "text/x-php";
737
- /** Ruby 文件 */
739
+ /** Ruby 文件(.rb) */
738
740
  readonly RUBY: "text/x-ruby";
739
- /** Swift 源文件 */
741
+ /** Swift 源文件(.swift) */
740
742
  readonly SWIFT: "text/x-swift";
741
- /** YAML 文档 */
742
- readonly YAML: "text/vnd.yaml";
743
- /** TOML 文档 */
744
- readonly TOML: "text/x-toml";
745
- /** SQL 脚本 */
746
- readonly SQL: "text/x-sql";
747
- /** Markdown 格式文档 */
743
+ /** YAML 文档(.yaml/.yml) */
744
+ readonly YAML: "application/yaml";
745
+ /** YAML 文档/兼容值 */
746
+ readonly YAML_LEGACY: "text/vnd.yaml";
747
+ /** TOML 文档(.toml) */
748
+ readonly TOML: "application/toml";
749
+ /** TOML 文档/兼容值 */
750
+ readonly TOML_LEGACY: "text/x-toml";
751
+ /** SQL 脚本(.sql) */
752
+ readonly SQL: "application/sql";
753
+ /** SQL 脚本/兼容值 */
754
+ readonly SQL_LEGACY: "text/x-sql";
755
+ /** Markdown 格式文档(.md/.markdown) */
748
756
  readonly MARKDOWN: "text/markdown";
749
757
  /** 富文本格式文档(.rtf) */
750
758
  readonly RTF: "application/rtf";
@@ -752,9 +760,11 @@ declare class MimeUtil {
752
760
  readonly CALENDAR: "text/calendar";
753
761
  /** JPEG 图像(.jpg/.jpeg) */
754
762
  readonly JPEG: "image/jpeg";
755
- /** PNG 图像(无损压缩,支持透明) */
763
+ /** JPG 图像(JPEG 别名,.jpg) */
764
+ readonly JPG: "image/jpeg";
765
+ /** PNG 图像/无损压缩,支持透明(.png) */
756
766
  readonly PNG: "image/png";
757
- /** GIF 图像(支持动画) */
767
+ /** GIF 图像/支持动画(.gif) */
758
768
  readonly GIF: "image/gif";
759
769
  /** Windows 位图(.bmp) */
760
770
  readonly BMP: "image/bmp";
@@ -762,16 +772,20 @@ declare class MimeUtil {
762
772
  readonly SVG: "image/svg+xml";
763
773
  /** APNG 动态图像(.apng) */
764
774
  readonly APNG: "image/apng";
765
- /** AVIF 图像(高效压缩) */
775
+ /** AVIF 图像/高效压缩(.avif) */
766
776
  readonly AVIF: "image/avif";
767
777
  /** 图标文件格式(.ico) */
768
778
  readonly ICO: "image/vnd.microsoft.icon";
769
- /** WebP 图像(高效压缩) */
779
+ /** 图标文件格式/兼容值(.ico) */
780
+ readonly ICO_LEGACY: "image/x-icon";
781
+ /** WebP 图像/高效压缩(.webp) */
770
782
  readonly WEBP: "image/webp";
771
783
  /** TIFF 图像(.tif/.tiff) */
772
784
  readonly TIFF: "image/tiff";
773
- /** HEIC 图像(高效编码) */
785
+ /** HEIC 图像/高效编码(.heic) */
774
786
  readonly HEIC: "image/heic";
787
+ /** HEIF 图像/高效编码(.heif) */
788
+ readonly HEIF: "image/heif";
775
789
  /** Adobe Photoshop 文件(.psd) */
776
790
  readonly PSD: "image/vnd.adobe.photoshop";
777
791
  /** MP3 音频(.mp3) */
@@ -784,8 +798,12 @@ declare class MimeUtil {
784
798
  readonly OGG_AUDIO: "audio/ogg";
785
799
  /** Opus 音频(.opus) */
786
800
  readonly OPUS: "audio/opus";
801
+ /** FLAC 无损音频(.flac) */
802
+ readonly FLAC: "audio/flac";
787
803
  /** WAV 音频(.wav) */
788
804
  readonly WAV: "audio/wav";
805
+ /** WebM 音频(.weba) */
806
+ readonly WEBM_AUDIO: "audio/webm";
789
807
  /** RealAudio 音频(.ra/.ram) */
790
808
  readonly REAL_AUDIO: "audio/x-pn-realaudio";
791
809
  /** MP4 视频(.mp4) */
@@ -802,7 +820,13 @@ declare class MimeUtil {
802
820
  readonly THREE_GPP2: "video/3gpp2";
803
821
  /** WebM 视频(.webm) */
804
822
  readonly WEBM: "video/webm";
805
- /** PDF 文档 */
823
+ /** Matroska 视频(.mkv) */
824
+ readonly MKV: "video/x-matroska";
825
+ /** Matroska 音频(.mka) */
826
+ readonly MKA: "audio/x-matroska";
827
+ /** QuickTime 视频(.mov) */
828
+ readonly QUICKTIME: "video/quicktime";
829
+ /** PDF 文档(.pdf) */
806
830
  readonly PDF: "application/pdf";
807
831
  /** Word 97-2003 文档(.doc) */
808
832
  readonly DOC: "application/msword";
@@ -832,8 +856,6 @@ declare class MimeUtil {
832
856
  readonly ZIP: "application/zip";
833
857
  /** GZIP 压缩文件(.gz) */
834
858
  readonly GZIP: "application/gzip";
835
- /** GZIP 压缩文件(旧格式) */
836
- readonly X_GZIP: "application/x-gzip";
837
859
  /** TAR 归档文件(.tar) */
838
860
  readonly TAR: "application/x-tar";
839
861
  /** BZip 归档(.bz) */
@@ -844,12 +866,18 @@ declare class MimeUtil {
844
866
  readonly SEVEN_Z: "application/x-7z-compressed";
845
867
  /** RAR 压缩文件(.rar) */
846
868
  readonly RAR: "application/vnd.rar";
847
- /** 通用二进制数据(默认类型) */
848
- readonly OCTET_STREAM: "application/octet-stream";
869
+ /** XZ 压缩文件(.xz) */
870
+ readonly XZ: "application/x-xz";
871
+ /** Zstandard 压缩文件(.zst) */
872
+ readonly ZSTD: "application/zstd";
873
+ /** ISO 光盘镜像(.iso) */
874
+ readonly ISO9660_IMAGE: "application/x-iso9660-image";
849
875
  /** JSON 数据格式(.json) */
850
876
  readonly JSON: "application/json";
851
877
  /** JSON-LD 格式(.jsonld) */
852
878
  readonly LD_JSON: "application/ld+json";
879
+ /** Web App Manifest(.webmanifest) */
880
+ readonly MANIFEST: "application/manifest+json";
853
881
  /** Java 归档文件(.jar) */
854
882
  readonly JAR: "application/java-archive";
855
883
  /** WebAssembly 二进制指令格式(.wasm) */
@@ -871,6 +899,60 @@ declare class MimeUtil {
871
899
  /** Word 启用宏文档(.docm) */
872
900
  readonly DOCM: "application/vnd.ms-word.document.macroEnabled.12";
873
901
  };
902
+ /**
903
+ * 协议/内容类型 MIME 常量
904
+ * - 用于 HTTP 请求/响应内容协商,无对应文件扩展名
905
+ */
906
+ static readonly PROTOCOL_MIME: {
907
+ /** 通用二进制数据流 */
908
+ readonly OCTET_STREAM: "application/octet-stream";
909
+ /** URL 编码表单 */
910
+ readonly FORM_URLENCODED: "application/x-www-form-urlencoded";
911
+ /** multipart 表单 */
912
+ readonly FORM_DATA: "multipart/form-data";
913
+ /** Server-Sent Events 数据流 */
914
+ readonly EVENT_STREAM: "text/event-stream";
915
+ /** 问题详情 JSON(RFC 9457) */
916
+ readonly PROBLEM_JSON: "application/problem+json";
917
+ /** JSON Patch(RFC 6902) */
918
+ readonly JSON_PATCH: "application/json-patch+json";
919
+ /** JSON Merge Patch(RFC 7386) */
920
+ readonly MERGE_PATCH_JSON: "application/merge-patch+json";
921
+ };
922
+ /**
923
+ * 根据文件后缀名获取对应的标准 MIME 类型(含历史兼容值)
924
+ * - 支持带 `.` 或不带 `.` 的后缀名,不区分大小写
925
+ * - 元组第一项始终为 IANA 官方标准 MIME,后续项为历史兼容值
926
+ * - 仅查询文件类型 MIME,不包含无后缀对应的协议类型
927
+ *
928
+ * @param extension 文件后缀名(如 `".png"` / `"png"` / `".PNG"`)
929
+ * @returns 标准 MIME + 兼容值的元组;如无匹配则返回 `undefined`
930
+ * @example
931
+ * ```ts
932
+ * MimeUtil.fromExtension(".png"); // ["image/png"]
933
+ * MimeUtil.fromExtension("ico"); // ["image/vnd.microsoft.icon", "image/x-icon"]
934
+ * MimeUtil.fromExtension(".xml"); // ["application/xml", "text/xml"]
935
+ * MimeUtil.fromExtension(".xyz"); // undefined
936
+ * ```
937
+ */
938
+ static fromExtension(extension: string): readonly [string, ...string[]] | undefined;
939
+ /**
940
+ * 根据 MIME 类型获取对应的文件后缀名列表
941
+ * - 一个 MIME 类型可能对应多个后缀名(如 `text/html` → `.html` / `.htm`)
942
+ * - 兼容值和标准值映射到相同的后缀(如 `image/x-icon` 和 `image/vnd.microsoft.icon` 均返回 `[".ico"]`)
943
+ * - 仅查询文件类型 MIME,协议类型无对应后缀
944
+ *
945
+ * @param mime MIME 类型字符串(如 `"image/png"` / `"IMAGE/PNG"`)
946
+ * @returns 文件后缀名列表;如无匹配则返回 `undefined`
947
+ * @example
948
+ * ```ts
949
+ * MimeUtil.toExtension("IMAGE/PNG"); // [".png"]
950
+ * MimeUtil.toExtension("text/html"); // [".html", ".htm"]
951
+ * MimeUtil.toExtension("image/jpeg"); // [".jpg", ".jpeg"]
952
+ * MimeUtil.toExtension("application/octet-stream"); // undefined
953
+ * ```
954
+ */
955
+ static toExtension(mime: string): readonly [string, ...string[]] | undefined;
874
956
  }
875
957
  //#endregion
876
958
  //#region src/number/numberUtil.d.ts
@@ -704,57 +704,65 @@ var FunctionUtil = class {
704
704
  */
705
705
  var MimeUtil = class {
706
706
  /**
707
- * 标准 MIME 类型常量,用于文件类型标识和 HTTP Content-Type 头部
708
- * 基于 IANA 注册标准和浏览器兼容性验证
707
+ * 文件类型 MIME 常量
708
+ * - 每个类型对应具体的文件扩展名
709
709
  */
710
- static MIME = {
711
- /** 普通文本文件 */
710
+ static FILE_MIME = {
711
+ /** 普通文本文件(.txt) */
712
712
  TEXT: "text/plain",
713
- /** 超文本标记语言文档 */
713
+ /** 超文本标记语言文档(.html/.htm) */
714
714
  HTML: "text/html",
715
- /** 层叠样式表文件 */
715
+ /** 层叠样式表文件(.css) */
716
716
  CSS: "text/css",
717
- /** 逗号分隔值文件(表格数据) */
717
+ /** 逗号分隔值文件/表格数据(.csv) */
718
718
  CSV: "text/csv",
719
- /** 制表符分隔值文件 */
719
+ /** 制表符分隔值文件(.tsv) */
720
720
  TSV: "text/tab-separated-values",
721
- /** XML 文档 */
722
- XML: "text/xml",
723
- /** XHTML 文档(XML 严格格式的 HTML) */
721
+ /** XML 文档(.xml) */
722
+ XML: "application/xml",
723
+ /** XML 文档/兼容值 */
724
+ XML_LEGACY: "text/xml",
725
+ /** XHTML 文档(.xhtml/.xht) */
724
726
  XHTML: "application/xhtml+xml",
725
- /** JavaScript 文件 */
727
+ /** JavaScript 文件(.js) */
726
728
  JS: "text/javascript",
727
- /** TypeScript 文件 */
729
+ /** TypeScript 文件(.ts) */
728
730
  TS: "text/typescript",
729
- /** Python 文件 */
731
+ /** Python 文件(.py) */
730
732
  PY: "text/x-python",
731
733
  /** Shell 脚本 (.sh) */
732
734
  SH: "text/x-sh",
733
- /** C 语言源文件 */
735
+ /** C 语言源文件(.c) */
734
736
  C: "text/x-c",
735
- /** C++ 源文件 */
737
+ /** C++ 源文件(.cpp/.cc/.cxx) */
736
738
  CPP: "text/x-c++",
737
- /** C# 源文件 */
739
+ /** C# 源文件(.cs) */
738
740
  CSHARP: "text/x-csharp",
739
- /** Java 源文件 */
741
+ /** Java 源文件(.java) */
740
742
  JAVA: "text/x-java",
741
- /** Go 源文件 */
743
+ /** Go 源文件(.go) */
742
744
  GO: "text/x-go",
743
- /** Rust 源文件 */
745
+ /** Rust 源文件(.rs) */
744
746
  RUST: "text/x-rust",
745
- /** PHP 文件 */
747
+ /** PHP 文件(.php) */
746
748
  PHP: "text/x-php",
747
- /** Ruby 文件 */
749
+ /** Ruby 文件(.rb) */
748
750
  RUBY: "text/x-ruby",
749
- /** Swift 源文件 */
751
+ /** Swift 源文件(.swift) */
750
752
  SWIFT: "text/x-swift",
751
- /** YAML 文档 */
752
- YAML: "text/vnd.yaml",
753
- /** TOML 文档 */
754
- TOML: "text/x-toml",
755
- /** SQL 脚本 */
756
- SQL: "text/x-sql",
757
- /** Markdown 格式文档 */
753
+ /** YAML 文档(.yaml/.yml) */
754
+ YAML: "application/yaml",
755
+ /** YAML 文档/兼容值 */
756
+ YAML_LEGACY: "text/vnd.yaml",
757
+ /** TOML 文档(.toml) */
758
+ TOML: "application/toml",
759
+ /** TOML 文档/兼容值 */
760
+ TOML_LEGACY: "text/x-toml",
761
+ /** SQL 脚本(.sql) */
762
+ SQL: "application/sql",
763
+ /** SQL 脚本/兼容值 */
764
+ SQL_LEGACY: "text/x-sql",
765
+ /** Markdown 格式文档(.md/.markdown) */
758
766
  MARKDOWN: "text/markdown",
759
767
  /** 富文本格式文档(.rtf) */
760
768
  RTF: "application/rtf",
@@ -762,9 +770,11 @@ var MimeUtil = class {
762
770
  CALENDAR: "text/calendar",
763
771
  /** JPEG 图像(.jpg/.jpeg) */
764
772
  JPEG: "image/jpeg",
765
- /** PNG 图像(无损压缩,支持透明) */
773
+ /** JPG 图像(JPEG 别名,.jpg) */
774
+ JPG: "image/jpeg",
775
+ /** PNG 图像/无损压缩,支持透明(.png) */
766
776
  PNG: "image/png",
767
- /** GIF 图像(支持动画) */
777
+ /** GIF 图像/支持动画(.gif) */
768
778
  GIF: "image/gif",
769
779
  /** Windows 位图(.bmp) */
770
780
  BMP: "image/bmp",
@@ -772,16 +782,20 @@ var MimeUtil = class {
772
782
  SVG: "image/svg+xml",
773
783
  /** APNG 动态图像(.apng) */
774
784
  APNG: "image/apng",
775
- /** AVIF 图像(高效压缩) */
785
+ /** AVIF 图像/高效压缩(.avif) */
776
786
  AVIF: "image/avif",
777
787
  /** 图标文件格式(.ico) */
778
788
  ICO: "image/vnd.microsoft.icon",
779
- /** WebP 图像(高效压缩) */
789
+ /** 图标文件格式/兼容值(.ico) */
790
+ ICO_LEGACY: "image/x-icon",
791
+ /** WebP 图像/高效压缩(.webp) */
780
792
  WEBP: "image/webp",
781
793
  /** TIFF 图像(.tif/.tiff) */
782
794
  TIFF: "image/tiff",
783
- /** HEIC 图像(高效编码) */
795
+ /** HEIC 图像/高效编码(.heic) */
784
796
  HEIC: "image/heic",
797
+ /** HEIF 图像/高效编码(.heif) */
798
+ HEIF: "image/heif",
785
799
  /** Adobe Photoshop 文件(.psd) */
786
800
  PSD: "image/vnd.adobe.photoshop",
787
801
  /** MP3 音频(.mp3) */
@@ -794,8 +808,12 @@ var MimeUtil = class {
794
808
  OGG_AUDIO: "audio/ogg",
795
809
  /** Opus 音频(.opus) */
796
810
  OPUS: "audio/opus",
811
+ /** FLAC 无损音频(.flac) */
812
+ FLAC: "audio/flac",
797
813
  /** WAV 音频(.wav) */
798
814
  WAV: "audio/wav",
815
+ /** WebM 音频(.weba) */
816
+ WEBM_AUDIO: "audio/webm",
799
817
  /** RealAudio 音频(.ra/.ram) */
800
818
  REAL_AUDIO: "audio/x-pn-realaudio",
801
819
  /** MP4 视频(.mp4) */
@@ -812,7 +830,13 @@ var MimeUtil = class {
812
830
  THREE_GPP2: "video/3gpp2",
813
831
  /** WebM 视频(.webm) */
814
832
  WEBM: "video/webm",
815
- /** PDF 文档 */
833
+ /** Matroska 视频(.mkv) */
834
+ MKV: "video/x-matroska",
835
+ /** Matroska 音频(.mka) */
836
+ MKA: "audio/x-matroska",
837
+ /** QuickTime 视频(.mov) */
838
+ QUICKTIME: "video/quicktime",
839
+ /** PDF 文档(.pdf) */
816
840
  PDF: "application/pdf",
817
841
  /** Word 97-2003 文档(.doc) */
818
842
  DOC: "application/msword",
@@ -842,8 +866,6 @@ var MimeUtil = class {
842
866
  ZIP: "application/zip",
843
867
  /** GZIP 压缩文件(.gz) */
844
868
  GZIP: "application/gzip",
845
- /** GZIP 压缩文件(旧格式) */
846
- X_GZIP: "application/x-gzip",
847
869
  /** TAR 归档文件(.tar) */
848
870
  TAR: "application/x-tar",
849
871
  /** BZip 归档(.bz) */
@@ -854,12 +876,18 @@ var MimeUtil = class {
854
876
  SEVEN_Z: "application/x-7z-compressed",
855
877
  /** RAR 压缩文件(.rar) */
856
878
  RAR: "application/vnd.rar",
857
- /** 通用二进制数据(默认类型) */
858
- OCTET_STREAM: "application/octet-stream",
879
+ /** XZ 压缩文件(.xz) */
880
+ XZ: "application/x-xz",
881
+ /** Zstandard 压缩文件(.zst) */
882
+ ZSTD: "application/zstd",
883
+ /** ISO 光盘镜像(.iso) */
884
+ ISO9660_IMAGE: "application/x-iso9660-image",
859
885
  /** JSON 数据格式(.json) */
860
886
  JSON: "application/json",
861
887
  /** JSON-LD 格式(.jsonld) */
862
888
  LD_JSON: "application/ld+json",
889
+ /** Web App Manifest(.webmanifest) */
890
+ MANIFEST: "application/manifest+json",
863
891
  /** Java 归档文件(.jar) */
864
892
  JAR: "application/java-archive",
865
893
  /** WebAssembly 二进制指令格式(.wasm) */
@@ -881,7 +909,185 @@ var MimeUtil = class {
881
909
  /** Word 启用宏文档(.docm) */
882
910
  DOCM: "application/vnd.ms-word.document.macroEnabled.12"
883
911
  };
912
+ /**
913
+ * 协议/内容类型 MIME 常量
914
+ * - 用于 HTTP 请求/响应内容协商,无对应文件扩展名
915
+ */
916
+ static PROTOCOL_MIME = {
917
+ /** 通用二进制数据流 */
918
+ OCTET_STREAM: "application/octet-stream",
919
+ /** URL 编码表单 */
920
+ FORM_URLENCODED: "application/x-www-form-urlencoded",
921
+ /** multipart 表单 */
922
+ FORM_DATA: "multipart/form-data",
923
+ /** Server-Sent Events 数据流 */
924
+ EVENT_STREAM: "text/event-stream",
925
+ /** 问题详情 JSON(RFC 9457) */
926
+ PROBLEM_JSON: "application/problem+json",
927
+ /** JSON Patch(RFC 6902) */
928
+ JSON_PATCH: "application/json-patch+json",
929
+ /** JSON Merge Patch(RFC 7386) */
930
+ MERGE_PATCH_JSON: "application/merge-patch+json"
931
+ };
932
+ /**
933
+ * 根据文件后缀名获取对应的标准 MIME 类型(含历史兼容值)
934
+ * - 支持带 `.` 或不带 `.` 的后缀名,不区分大小写
935
+ * - 元组第一项始终为 IANA 官方标准 MIME,后续项为历史兼容值
936
+ * - 仅查询文件类型 MIME,不包含无后缀对应的协议类型
937
+ *
938
+ * @param extension 文件后缀名(如 `".png"` / `"png"` / `".PNG"`)
939
+ * @returns 标准 MIME + 兼容值的元组;如无匹配则返回 `undefined`
940
+ * @example
941
+ * ```ts
942
+ * MimeUtil.fromExtension(".png"); // ["image/png"]
943
+ * MimeUtil.fromExtension("ico"); // ["image/vnd.microsoft.icon", "image/x-icon"]
944
+ * MimeUtil.fromExtension(".xml"); // ["application/xml", "text/xml"]
945
+ * MimeUtil.fromExtension(".xyz"); // undefined
946
+ * ```
947
+ */
948
+ static fromExtension(extension) {
949
+ const ext = StringUtil.cast(extension).toLowerCase();
950
+ const key = ext.startsWith(".") ? ext : `.${ext}`;
951
+ return EXT_TO_MIME[key];
952
+ }
953
+ /**
954
+ * 根据 MIME 类型获取对应的文件后缀名列表
955
+ * - 一个 MIME 类型可能对应多个后缀名(如 `text/html` → `.html` / `.htm`)
956
+ * - 兼容值和标准值映射到相同的后缀(如 `image/x-icon` 和 `image/vnd.microsoft.icon` 均返回 `[".ico"]`)
957
+ * - 仅查询文件类型 MIME,协议类型无对应后缀
958
+ *
959
+ * @param mime MIME 类型字符串(如 `"image/png"` / `"IMAGE/PNG"`)
960
+ * @returns 文件后缀名列表;如无匹配则返回 `undefined`
961
+ * @example
962
+ * ```ts
963
+ * MimeUtil.toExtension("IMAGE/PNG"); // [".png"]
964
+ * MimeUtil.toExtension("text/html"); // [".html", ".htm"]
965
+ * MimeUtil.toExtension("image/jpeg"); // [".jpg", ".jpeg"]
966
+ * MimeUtil.toExtension("application/octet-stream"); // undefined
967
+ * ```
968
+ */
969
+ static toExtension(mime) {
970
+ const m = StringUtil.cast(mime).toLowerCase();
971
+ return MIME_TO_EXT.get(m);
972
+ }
973
+ };
974
+ const EXT_TO_MIME = {
975
+ ".txt": [MimeUtil.FILE_MIME.TEXT],
976
+ ".html": [MimeUtil.FILE_MIME.HTML],
977
+ ".htm": [MimeUtil.FILE_MIME.HTML],
978
+ ".css": [MimeUtil.FILE_MIME.CSS],
979
+ ".csv": [MimeUtil.FILE_MIME.CSV],
980
+ ".tsv": [MimeUtil.FILE_MIME.TSV],
981
+ ".xml": [MimeUtil.FILE_MIME.XML, MimeUtil.FILE_MIME.XML_LEGACY],
982
+ ".xhtml": [MimeUtil.FILE_MIME.XHTML],
983
+ ".xht": [MimeUtil.FILE_MIME.XHTML],
984
+ ".js": [MimeUtil.FILE_MIME.JS],
985
+ ".ts": [MimeUtil.FILE_MIME.TS],
986
+ ".py": [MimeUtil.FILE_MIME.PY],
987
+ ".sh": [MimeUtil.FILE_MIME.SH],
988
+ ".c": [MimeUtil.FILE_MIME.C],
989
+ ".cpp": [MimeUtil.FILE_MIME.CPP],
990
+ ".cc": [MimeUtil.FILE_MIME.CPP],
991
+ ".cxx": [MimeUtil.FILE_MIME.CPP],
992
+ ".cs": [MimeUtil.FILE_MIME.CSHARP],
993
+ ".java": [MimeUtil.FILE_MIME.JAVA],
994
+ ".go": [MimeUtil.FILE_MIME.GO],
995
+ ".rs": [MimeUtil.FILE_MIME.RUST],
996
+ ".php": [MimeUtil.FILE_MIME.PHP],
997
+ ".rb": [MimeUtil.FILE_MIME.RUBY],
998
+ ".swift": [MimeUtil.FILE_MIME.SWIFT],
999
+ ".yaml": [MimeUtil.FILE_MIME.YAML, MimeUtil.FILE_MIME.YAML_LEGACY],
1000
+ ".yml": [MimeUtil.FILE_MIME.YAML, MimeUtil.FILE_MIME.YAML_LEGACY],
1001
+ ".toml": [MimeUtil.FILE_MIME.TOML, MimeUtil.FILE_MIME.TOML_LEGACY],
1002
+ ".sql": [MimeUtil.FILE_MIME.SQL, MimeUtil.FILE_MIME.SQL_LEGACY],
1003
+ ".md": [MimeUtil.FILE_MIME.MARKDOWN],
1004
+ ".markdown": [MimeUtil.FILE_MIME.MARKDOWN],
1005
+ ".rtf": [MimeUtil.FILE_MIME.RTF],
1006
+ ".ics": [MimeUtil.FILE_MIME.CALENDAR],
1007
+ ".jpg": [MimeUtil.FILE_MIME.JPEG],
1008
+ ".jpeg": [MimeUtil.FILE_MIME.JPEG],
1009
+ ".png": [MimeUtil.FILE_MIME.PNG],
1010
+ ".gif": [MimeUtil.FILE_MIME.GIF],
1011
+ ".bmp": [MimeUtil.FILE_MIME.BMP],
1012
+ ".svg": [MimeUtil.FILE_MIME.SVG],
1013
+ ".apng": [MimeUtil.FILE_MIME.APNG],
1014
+ ".avif": [MimeUtil.FILE_MIME.AVIF],
1015
+ ".ico": [MimeUtil.FILE_MIME.ICO, MimeUtil.FILE_MIME.ICO_LEGACY],
1016
+ ".webp": [MimeUtil.FILE_MIME.WEBP],
1017
+ ".tif": [MimeUtil.FILE_MIME.TIFF],
1018
+ ".tiff": [MimeUtil.FILE_MIME.TIFF],
1019
+ ".heic": [MimeUtil.FILE_MIME.HEIC],
1020
+ ".heif": [MimeUtil.FILE_MIME.HEIF],
1021
+ ".psd": [MimeUtil.FILE_MIME.PSD],
1022
+ ".mp3": [MimeUtil.FILE_MIME.MP3],
1023
+ ".aac": [MimeUtil.FILE_MIME.AAC],
1024
+ ".mid": [MimeUtil.FILE_MIME.MIDI],
1025
+ ".midi": [MimeUtil.FILE_MIME.MIDI],
1026
+ ".oga": [MimeUtil.FILE_MIME.OGG_AUDIO],
1027
+ ".opus": [MimeUtil.FILE_MIME.OPUS],
1028
+ ".flac": [MimeUtil.FILE_MIME.FLAC],
1029
+ ".wav": [MimeUtil.FILE_MIME.WAV],
1030
+ ".weba": [MimeUtil.FILE_MIME.WEBM_AUDIO],
1031
+ ".ra": [MimeUtil.FILE_MIME.REAL_AUDIO],
1032
+ ".ram": [MimeUtil.FILE_MIME.REAL_AUDIO],
1033
+ ".mp4": [MimeUtil.FILE_MIME.MP4],
1034
+ ".mpeg": [MimeUtil.FILE_MIME.MPEG],
1035
+ ".mpg": [MimeUtil.FILE_MIME.MPEG],
1036
+ ".ogv": [MimeUtil.FILE_MIME.OGG_VIDEO],
1037
+ ".avi": [MimeUtil.FILE_MIME.AVI],
1038
+ ".3gp": [MimeUtil.FILE_MIME.THREE_GPP],
1039
+ ".3g2": [MimeUtil.FILE_MIME.THREE_GPP2],
1040
+ ".webm": [MimeUtil.FILE_MIME.WEBM],
1041
+ ".mkv": [MimeUtil.FILE_MIME.MKV],
1042
+ ".mka": [MimeUtil.FILE_MIME.MKA],
1043
+ ".mov": [MimeUtil.FILE_MIME.QUICKTIME],
1044
+ ".pdf": [MimeUtil.FILE_MIME.PDF],
1045
+ ".doc": [MimeUtil.FILE_MIME.DOC],
1046
+ ".docx": [MimeUtil.FILE_MIME.DOCX],
1047
+ ".xlsx": [MimeUtil.FILE_MIME.XLSX],
1048
+ ".xlsm": [MimeUtil.FILE_MIME.XLSM],
1049
+ ".xltx": [MimeUtil.FILE_MIME.XLTX],
1050
+ ".pptx": [MimeUtil.FILE_MIME.PPTX],
1051
+ ".ppt": [MimeUtil.FILE_MIME.PPT],
1052
+ ".odt": [MimeUtil.FILE_MIME.ODT],
1053
+ ".ods": [MimeUtil.FILE_MIME.ODS],
1054
+ ".odp": [MimeUtil.FILE_MIME.ODP],
1055
+ ".epub": [MimeUtil.FILE_MIME.EPUB],
1056
+ ".azw": [MimeUtil.FILE_MIME.AZW],
1057
+ ".zip": [MimeUtil.FILE_MIME.ZIP],
1058
+ ".gz": [MimeUtil.FILE_MIME.GZIP],
1059
+ ".tar": [MimeUtil.FILE_MIME.TAR],
1060
+ ".bz": [MimeUtil.FILE_MIME.BZIP],
1061
+ ".bz2": [MimeUtil.FILE_MIME.BZIP2],
1062
+ ".7z": [MimeUtil.FILE_MIME.SEVEN_Z],
1063
+ ".rar": [MimeUtil.FILE_MIME.RAR],
1064
+ ".xz": [MimeUtil.FILE_MIME.XZ],
1065
+ ".zst": [MimeUtil.FILE_MIME.ZSTD],
1066
+ ".iso": [MimeUtil.FILE_MIME.ISO9660_IMAGE],
1067
+ ".json": [MimeUtil.FILE_MIME.JSON],
1068
+ ".jsonld": [MimeUtil.FILE_MIME.LD_JSON],
1069
+ ".webmanifest": [MimeUtil.FILE_MIME.MANIFEST],
1070
+ ".jar": [MimeUtil.FILE_MIME.JAR],
1071
+ ".wasm": [MimeUtil.FILE_MIME.WASM],
1072
+ ".eot": [MimeUtil.FILE_MIME.EOT],
1073
+ ".otf": [MimeUtil.FILE_MIME.OTF],
1074
+ ".woff": [MimeUtil.FILE_MIME.WOFF],
1075
+ ".woff2": [MimeUtil.FILE_MIME.WOFF2],
1076
+ ".ttf": [MimeUtil.FILE_MIME.TTF],
1077
+ ".xls": [MimeUtil.FILE_MIME.XLS],
1078
+ ".xps": [MimeUtil.FILE_MIME.XPS],
1079
+ ".docm": [MimeUtil.FILE_MIME.DOCM]
884
1080
  };
1081
+ const MIME_TO_EXT = (() => {
1082
+ const map = /* @__PURE__ */ new Map();
1083
+ for (const [ext, mimes] of Object.entries(EXT_TO_MIME)) for (const mime of mimes) {
1084
+ const exts = map.get(mime);
1085
+ if (exts) {
1086
+ if (!exts.includes(ext)) exts.push(ext);
1087
+ } else map.set(mime, [ext]);
1088
+ }
1089
+ return map;
1090
+ })();
885
1091
  //#endregion
886
1092
  //#region src/number/numberUtil.ts
887
1093
  /**