From 5598a71016ec4b1c8eaf52b58e26a7a1d05334d7 Mon Sep 17 00:00:00 2001 From: valadaptive Date: Sun, 20 Jul 2025 00:17:02 -0400 Subject: [PATCH 1/2] Sort by mimetype Decreases the compressed size slightly. --- bin/index.ts | 4 +- deno/mod.ts | 650 ++++++++++++++++++++++++++------------------------- 2 files changed, 334 insertions(+), 320 deletions(-) diff --git a/bin/index.ts b/bin/index.ts index 05373e1..461013b 100644 --- a/bin/index.ts +++ b/bin/index.ts @@ -80,8 +80,8 @@ for (mtype in DB) { } let mimes: Record = {}; -Object.keys(raw).sort().forEach(x => { - mimes[x] = raw[x]; +Object.entries(raw).sort((a, b) => a[1].localeCompare(b[1])).forEach(x => { + mimes[x[0]] = raw[x[0]]; }); let content = fs.readFileSync(input, 'utf8').replace( diff --git a/deno/mod.ts b/deno/mod.ts index 3bb9e1b..fe8cf77 100644 --- a/deno/mod.ts +++ b/deno/mod.ts @@ -1,38 +1,21 @@ const mimes: Record = { - "3g2": "video/3gpp2", - "3gp": "video/3gpp", - "3gpp": "video/3gpp", - "3mf": "model/3mf", - "aac": "audio/aac", - "ac": "application/pkix-attr-cert", - "adp": "audio/adpcm", - "adts": "audio/aac", - "ai": "application/postscript", - "aml": "application/automationml-aml+xml", - "amlx": "application/automationml-amlx+zip", - "amr": "audio/amr", - "apng": "image/apng", - "appcache": "text/cache-manifest", + "210": "model/step", + "ez": "application/andrew-inset", "appinstaller": "application/appinstaller", + "aw": "application/applixware", "appx": "application/appx", "appxbundle": "application/appxbundle", - "asc": "application/pgp-keys", "atom": "application/atom+xml", "atomcat": "application/atomcat+xml", "atomdeleted": "application/atomdeleted+xml", "atomsvc": "application/atomsvc+xml", - "au": "audio/basic", - "avci": "image/avci", - "avcs": "image/avcs", - "avif": "image/avif", - "aw": "application/applixware", + "dwd": "application/atsc-dwd+xml", + "held": "application/atsc-held+xml", + "rsat": "application/atsc-rsat+xml", + "aml": "application/automationml-aml+xml", + "amlx": "application/automationml-amlx+zip", "bdoc": "application/bdoc", - "bin": "application/octet-stream", - "bmp": "image/bmp", - "bpk": "application/octet-stream", - "btf": "image/prs.btif", - "btif": "image/prs.btif", - "buffer": "application/octet-stream", + "xcs": "application/calendar+xml", "ccxml": "application/ccxml+xml", "cdfx": "application/cdfx+xml", "cdmia": "application/cdmi-capability", @@ -40,409 +23,440 @@ const mimes: Record = { "cdmid": "application/cdmi-domain", "cdmio": "application/cdmi-object", "cdmiq": "application/cdmi-queue", - "cer": "application/pkix-cert", - "cgm": "image/cgm", - "cjs": "application/node", - "class": "application/java-vm", - "coffee": "text/coffeescript", - "conf": "text/plain", "cpl": "application/cpl+xml", - "cpt": "application/mac-compactpro", - "crl": "application/pkix-crl", - "css": "text/css", - "csv": "text/csv", "cu": "application/cu-seeme", "cwl": "application/cwl", - "cww": "application/prs.cww", + "mpp": "application/dash-patch+xml", + "mpd": "application/dash+xml", "davmount": "application/davmount+xml", + "dcm": "application/dicom", "dbk": "application/docbook+xml", - "deb": "application/octet-stream", - "def": "text/plain", - "deploy": "application/octet-stream", - "dib": "image/bmp", - "disposition-notification": "message/disposition-notification", - "dist": "application/octet-stream", - "distz": "application/octet-stream", - "dll": "application/octet-stream", - "dmg": "application/octet-stream", - "dms": "application/octet-stream", - "doc": "application/msword", - "dot": "application/msword", - "dpx": "image/dpx", - "drle": "image/dicom-rle", - "dsc": "text/prs.lines.tag", "dssc": "application/dssc+der", - "dtd": "application/xml-dtd", - "dump": "application/octet-stream", - "dwd": "application/atsc-dwd+xml", - "ear": "application/java-archive", + "xdssc": "application/dssc+xml", "ecma": "application/ecmascript", - "elc": "application/octet-stream", - "emf": "image/emf", - "eml": "message/rfc822", "emma": "application/emma+xml", "emotionml": "application/emotionml+xml", - "eps": "application/postscript", "epub": "application/epub+zip", - "exe": "application/octet-stream", "exi": "application/exi", "exp": "application/express", - "exr": "image/aces", - "ez": "application/andrew-inset", "fdf": "application/fdf", "fdt": "application/fdt+xml", - "fits": "image/fits", - "g3": "image/g3fax", - "gbr": "application/rpki-ghostbusters", + "pfr": "application/font-tdpfr", "geojson": "application/geo+json", - "gif": "image/gif", - "glb": "model/gltf-binary", - "gltf": "model/gltf+json", "gml": "application/gml+xml", "gpx": "application/gpx+xml", - "gram": "application/srgs", - "grxml": "application/srgs+xml", "gxf": "application/gxf", "gz": "application/gzip", - "h261": "video/h261", - "h263": "video/h263", - "h264": "video/h264", - "heic": "image/heic", - "heics": "image/heic-sequence", - "heif": "image/heif", - "heifs": "image/heif-sequence", - "hej2": "image/hej2k", - "held": "application/atsc-held+xml", "hjson": "application/hjson", - "hlp": "application/winhlp", - "hqx": "application/mac-binhex40", - "hsj2": "image/hsj2", - "htm": "text/html", - "html": "text/html", - "ics": "text/calendar", - "ief": "image/ief", - "ifb": "text/calendar", - "iges": "model/iges", - "igs": "model/iges", - "img": "application/octet-stream", - "in": "text/plain", - "ini": "text/plain", + "stk": "application/hyperstudio", "ink": "application/inkml+xml", "inkml": "application/inkml+xml", "ipfix": "application/ipfix", - "iso": "application/octet-stream", "its": "application/its+xml", - "jade": "text/jade", "jar": "application/java-archive", - "jhc": "image/jphc", - "jls": "image/jls", - "jp2": "image/jp2", - "jpe": "image/jpeg", - "jpeg": "image/jpeg", - "jpf": "image/jpx", - "jpg": "image/jpeg", - "jpg2": "image/jp2", - "jpgm": "image/jpm", - "jpgv": "video/jpeg", - "jph": "image/jph", - "jpm": "image/jpm", - "jpx": "image/jpx", - "js": "text/javascript", + "war": "application/java-archive", + "ear": "application/java-archive", + "ser": "application/java-serialized-object", + "class": "application/java-vm", "json": "application/json", + "map": "application/json", "json5": "application/json5", - "jsonld": "application/ld+json", "jsonml": "application/jsonml+json", - "jsx": "text/jsx", - "jt": "model/jt", - "jxl": "image/jxl", - "jxr": "image/jxr", - "jxra": "image/jxra", - "jxrs": "image/jxrs", - "jxs": "image/jxs", - "jxsc": "image/jxsc", - "jxsi": "image/jxsi", - "jxss": "image/jxss", - "kar": "audio/midi", - "ktx": "image/ktx", - "ktx2": "image/ktx2", - "less": "text/less", + "jsonld": "application/ld+json", "lgr": "application/lgr+xml", - "list": "text/plain", - "litcoffee": "text/coffeescript", - "log": "text/plain", "lostxml": "application/lost+xml", - "lrf": "application/octet-stream", - "m1v": "video/mpeg", - "m21": "application/mp21", - "m2a": "audio/mpeg", - "m2t": "video/mp2t", - "m2ts": "video/mp2t", - "m2v": "video/mpeg", - "m3a": "audio/mpeg", - "m4a": "audio/mp4", - "m4p": "application/mp4", - "m4s": "video/iso.segment", - "ma": "application/mathematica", + "hqx": "application/mac-binhex40", + "cpt": "application/mac-compactpro", "mads": "application/mads+xml", - "maei": "application/mmt-aei+xml", - "man": "text/troff", - "manifest": "text/cache-manifest", - "map": "application/json", - "mar": "application/octet-stream", - "markdown": "text/markdown", - "mathml": "application/mathml+xml", + "webmanifest": "application/manifest+json", + "mrc": "application/marc", + "mrcx": "application/marcxml+xml", + "ma": "application/mathematica", + "nb": "application/mathematica", "mb": "application/mathematica", + "mathml": "application/mathml+xml", "mbox": "application/mbox", - "md": "text/markdown", - "mdx": "text/mdx", - "me": "text/troff", - "mesh": "model/mesh", - "meta4": "application/metalink4+xml", + "mpf": "application/media-policy-dataset+xml", + "mscml": "application/mediaservercontrol+xml", "metalink": "application/metalink+xml", + "meta4": "application/metalink4+xml", "mets": "application/mets+xml", - "mft": "application/rpki-manifest", - "mid": "audio/midi", - "midi": "audio/midi", - "mime": "message/rfc822", - "mj2": "video/mj2", - "mjp2": "video/mj2", - "mjs": "text/javascript", - "mml": "text/mathml", + "maei": "application/mmt-aei+xml", + "musd": "application/mmt-usd+xml", "mods": "application/mods+xml", - "mov": "video/quicktime", - "mp2": "audio/mpeg", + "m21": "application/mp21", "mp21": "application/mp21", - "mp2a": "audio/mpeg", - "mp3": "audio/mpeg", - "mp4": "video/mp4", - "mp4a": "audio/mp4", "mp4s": "application/mp4", - "mp4v": "video/mp4", - "mpd": "application/dash+xml", - "mpe": "video/mpeg", - "mpeg": "video/mpeg", - "mpf": "application/media-policy-dataset+xml", - "mpg": "video/mpeg", - "mpg4": "video/mp4", - "mpga": "audio/mpeg", - "mpp": "application/dash-patch+xml", - "mrc": "application/marc", - "mrcx": "application/marcxml+xml", - "ms": "text/troff", - "mscml": "application/mediaservercontrol+xml", - "msh": "model/mesh", - "msi": "application/octet-stream", + "m4p": "application/mp4", "msix": "application/msix", "msixbundle": "application/msixbundle", - "msm": "application/octet-stream", - "msp": "application/octet-stream", - "mtl": "model/mtl", - "mts": "video/mp2t", - "musd": "application/mmt-usd+xml", + "doc": "application/msword", + "dot": "application/msword", "mxf": "application/mxf", - "mxmf": "audio/mobile-xmf", - "mxml": "application/xv+xml", - "n3": "text/n3", - "nb": "application/mathematica", "nq": "application/n-quads", "nt": "application/n-triples", - "obj": "model/obj", + "cjs": "application/node", + "bin": "application/octet-stream", + "dms": "application/octet-stream", + "lrf": "application/octet-stream", + "mar": "application/octet-stream", + "so": "application/octet-stream", + "dist": "application/octet-stream", + "distz": "application/octet-stream", + "pkg": "application/octet-stream", + "bpk": "application/octet-stream", + "dump": "application/octet-stream", + "elc": "application/octet-stream", + "deploy": "application/octet-stream", + "exe": "application/octet-stream", + "dll": "application/octet-stream", + "deb": "application/octet-stream", + "dmg": "application/octet-stream", + "iso": "application/octet-stream", + "img": "application/octet-stream", + "msi": "application/octet-stream", + "msp": "application/octet-stream", + "msm": "application/octet-stream", + "buffer": "application/octet-stream", "oda": "application/oda", - "oga": "audio/ogg", - "ogg": "audio/ogg", - "ogv": "video/ogg", + "opf": "application/oebps-package+xml", "ogx": "application/ogg", "omdoc": "application/omdoc+xml", - "onepkg": "application/onenote", - "onetmp": "application/onenote", "onetoc": "application/onenote", "onetoc2": "application/onenote", - "opf": "application/oebps-package+xml", - "opus": "audio/ogg", - "otf": "font/otf", - "owl": "application/rdf+xml", + "onetmp": "application/onenote", + "onepkg": "application/onenote", + "one": "application/onenote", + "onea": "application/onenote", "oxps": "application/oxps", + "relo": "application/p2p-overlay+xml", + "xer": "application/patch-ops-error+xml", + "pdf": "application/pdf", + "pgp": "application/pgp-encrypted", + "asc": "application/pgp-keys", + "sig": "application/pgp-signature", + "prf": "application/pics-rules", "p10": "application/pkcs10", - "p7c": "application/pkcs7-mime", "p7m": "application/pkcs7-mime", + "p7c": "application/pkcs7-mime", "p7s": "application/pkcs7-signature", "p8": "application/pkcs8", - "pdf": "application/pdf", - "pfr": "application/font-tdpfr", - "pgp": "application/pgp-encrypted", - "pkg": "application/octet-stream", - "pki": "application/pkixcmp", + "ac": "application/pkix-attr-cert", + "cer": "application/pkix-cert", + "crl": "application/pkix-crl", "pkipath": "application/pkix-pkipath", + "pki": "application/pkixcmp", "pls": "application/pls+xml", - "png": "image/png", - "prc": "model/prc", - "prf": "application/pics-rules", - "provx": "application/provenance+xml", + "ai": "application/postscript", + "eps": "application/postscript", "ps": "application/postscript", + "provx": "application/provenance+xml", + "cww": "application/prs.cww", + "xsf": "application/prs.xsf+xml", "pskcxml": "application/pskc+xml", - "pti": "image/prs.pti", - "qt": "video/quicktime", "raml": "application/raml+yaml", - "rapd": "application/route-apd+xml", "rdf": "application/rdf+xml", - "relo": "application/p2p-overlay+xml", + "owl": "application/rdf+xml", "rif": "application/reginfo+xml", - "rl": "application/resource-lists+xml", - "rld": "application/resource-lists-diff+xml", - "rmi": "audio/midi", "rnc": "application/relax-ng-compact-syntax", - "rng": "application/xml", - "roa": "application/rpki-roa", - "roff": "text/troff", - "rq": "application/sparql-query", + "rld": "application/resource-lists-diff+xml", + "rl": "application/resource-lists+xml", "rs": "application/rls-services+xml", - "rsat": "application/atsc-rsat+xml", + "rapd": "application/route-apd+xml", + "sls": "application/route-s-tsid+xml", + "rusd": "application/route-usd+xml", + "gbr": "application/rpki-ghostbusters", + "mft": "application/rpki-manifest", + "roa": "application/rpki-roa", "rsd": "application/rsd+xml", - "rsheet": "application/urc-ressheet+xml", "rss": "application/rss+xml", - "rtf": "text/rtf", - "rtx": "text/richtext", - "rusd": "application/route-usd+xml", - "s3m": "audio/s3m", "sbml": "application/sbml+xml", "scq": "application/scvp-cv-request", "scs": "application/scvp-cv-response", + "spq": "application/scvp-vp-request", + "spp": "application/scvp-vp-response", "sdp": "application/sdp", "senmlx": "application/senml+xml", "sensmlx": "application/sensml+xml", - "ser": "application/java-serialized-object", "setpay": "application/set-payment-initiation", "setreg": "application/set-registration-initiation", - "sgi": "image/sgi", - "sgm": "text/sgml", - "sgml": "text/sgml", - "shex": "text/shex", "shf": "application/shf+xml", - "shtml": "text/html", - "sieve": "application/sieve", - "sig": "application/pgp-signature", - "sil": "audio/silk", - "silo": "model/mesh", "siv": "application/sieve", - "slim": "text/slim", - "slm": "text/slim", - "sls": "application/route-s-tsid+xml", + "sieve": "application/sieve", "smi": "application/smil+xml", "smil": "application/smil+xml", - "snd": "audio/basic", - "so": "application/octet-stream", - "spdx": "text/spdx", - "spp": "application/scvp-vp-response", - "spq": "application/scvp-vp-request", - "spx": "audio/ogg", + "rq": "application/sparql-query", + "srx": "application/sparql-results+xml", "sql": "application/sql", + "gram": "application/srgs", + "grxml": "application/srgs+xml", "sru": "application/sru+xml", - "srx": "application/sparql-results+xml", "ssdl": "application/ssdl+xml", "ssml": "application/ssml+xml", - "stk": "application/hyperstudio", - "stl": "model/stl", - "stpx": "model/step+xml", - "stpxz": "model/step-xml+zip", - "stpz": "model/step+zip", - "styl": "text/stylus", - "stylus": "text/stylus", - "svg": "image/svg+xml", - "svgz": "image/svg+xml", "swidtag": "application/swid+xml", - "t": "text/troff", - "t38": "image/t38", - "td": "application/urc-targetdesc+xml", "tei": "application/tei+xml", "teicorpus": "application/tei+xml", - "text": "text/plain", "tfi": "application/thraud+xml", - "tfx": "image/tiff-fx", - "tif": "image/tiff", - "tiff": "image/tiff", + "tsd": "application/timestamped-data", "toml": "application/toml", - "tr": "text/troff", "trig": "application/trig", - "ts": "video/mp2t", - "tsd": "application/timestamped-data", - "tsv": "text/tab-separated-values", - "ttc": "font/collection", - "ttf": "font/ttf", - "ttl": "text/turtle", "ttml": "application/ttml+xml", - "txt": "text/plain", - "u3d": "model/u3d", - "u8dsn": "message/global-delivery-status", - "u8hdr": "message/global-headers", - "u8mdn": "message/global-disposition-notification", - "u8msg": "message/global", "ubj": "application/ubjson", - "uri": "text/uri-list", - "uris": "text/uri-list", - "urls": "text/uri-list", - "vcard": "text/vcard", - "vrml": "model/vrml", - "vtt": "text/vtt", + "rsheet": "application/urc-ressheet+xml", + "td": "application/urc-targetdesc+xml", "vxml": "application/voicexml+xml", - "war": "application/java-archive", "wasm": "application/wasm", - "wav": "audio/wav", - "weba": "audio/webm", - "webm": "video/webm", - "webmanifest": "application/manifest+json", - "webp": "image/webp", - "wgsl": "text/wgsl", - "wgt": "application/widget", "wif": "application/watcherinfo+xml", - "wmf": "image/wmf", - "woff": "font/woff", - "woff2": "font/woff2", - "wrl": "model/vrml", + "wgt": "application/widget", + "hlp": "application/winhlp", "wsdl": "application/wsdl+xml", "wspolicy": "application/wspolicy+xml", - "x3d": "model/x3d+xml", - "x3db": "model/x3d+fastinfoset", - "x3dbz": "model/x3d+binary", - "x3dv": "model/x3d-vrml", - "x3dvz": "model/x3d+vrml", - "x3dz": "model/x3d+xml", "xaml": "application/xaml+xml", "xav": "application/xcap-att+xml", "xca": "application/xcap-caps+xml", - "xcs": "application/calendar+xml", "xdf": "application/xcap-diff+xml", - "xdssc": "application/dssc+xml", "xel": "application/xcap-el+xml", + "xns": "application/xcap-ns+xml", "xenc": "application/xenc+xml", - "xer": "application/patch-ops-error+xml", "xfdf": "application/xfdf", - "xht": "application/xhtml+xml", "xhtml": "application/xhtml+xml", - "xhvml": "application/xv+xml", + "xht": "application/xhtml+xml", "xlf": "application/xliff+xml", - "xm": "audio/xm", - "xml": "text/xml", - "xns": "application/xcap-ns+xml", - "xop": "application/xop+xml", - "xpl": "application/xproc+xml", - "xsd": "application/xml", - "xsf": "application/prs.xsf+xml", "xsl": "application/xml", + "xsd": "application/xml", + "rng": "application/xml", "xslt": "application/xml", + "dtd": "application/xml-dtd", + "xop": "application/xop+xml", + "xpl": "application/xproc+xml", "xspf": "application/xspf+xml", - "xvm": "application/xv+xml", + "mxml": "application/xv+xml", + "xhvml": "application/xv+xml", "xvml": "application/xv+xml", - "yaml": "text/yaml", + "xvm": "application/xv+xml", "yang": "application/yang", "yin": "application/yin+xml", - "yml": "text/yaml", "zip": "application/zip", + "lottie": "application/zip+dotlottie", + "adts": "audio/aac", + "aac": "audio/aac", + "adp": "audio/adpcm", + "amr": "audio/amr", + "au": "audio/basic", + "snd": "audio/basic", + "mid": "audio/midi", + "midi": "audio/midi", + "kar": "audio/midi", + "rmi": "audio/midi", + "mxmf": "audio/mobile-xmf", + "m4a": "audio/mp4", + "mp4a": "audio/mp4", + "m4b": "audio/mp4", + "mp3": "audio/mpeg", + "mpga": "audio/mpeg", + "mp2": "audio/mpeg", + "mp2a": "audio/mpeg", + "m2a": "audio/mpeg", + "m3a": "audio/mpeg", + "oga": "audio/ogg", + "ogg": "audio/ogg", + "spx": "audio/ogg", + "opus": "audio/ogg", + "s3m": "audio/s3m", + "sil": "audio/silk", + "wav": "audio/wav", + "weba": "audio/webm", + "xm": "audio/xm", + "ttc": "font/collection", + "otf": "font/otf", + "ttf": "font/ttf", + "woff": "font/woff", + "woff2": "font/woff2", + "exr": "image/aces", + "apng": "image/apng", + "avci": "image/avci", + "avcs": "image/avcs", + "avif": "image/avif", + "bmp": "image/bmp", + "dib": "image/bmp", + "cgm": "image/cgm", + "drle": "image/dicom-rle", + "dpx": "image/dpx", + "emf": "image/emf", + "fits": "image/fits", + "g3": "image/g3fax", + "gif": "image/gif", + "heic": "image/heic", + "heics": "image/heic-sequence", + "heif": "image/heif", + "heifs": "image/heif-sequence", + "hej2": "image/hej2k", + "ief": "image/ief", + "jaii": "image/jaii", + "jais": "image/jais", + "jls": "image/jls", + "jp2": "image/jp2", + "jpg2": "image/jp2", + "jpg": "image/jpeg", + "jpeg": "image/jpeg", + "jpe": "image/jpeg", + "jph": "image/jph", + "jhc": "image/jphc", + "jpm": "image/jpm", + "jpgm": "image/jpm", + "jpx": "image/jpx", + "jpf": "image/jpx", + "jxl": "image/jxl", + "jxr": "image/jxr", + "jxra": "image/jxra", + "jxrs": "image/jxrs", + "jxs": "image/jxs", + "jxsc": "image/jxsc", + "jxsi": "image/jxsi", + "jxss": "image/jxss", + "ktx": "image/ktx", + "ktx2": "image/ktx2", + "jfif": "image/pjpeg", + "png": "image/png", + "btif": "image/prs.btif", + "btf": "image/prs.btif", + "pti": "image/prs.pti", + "sgi": "image/sgi", + "svg": "image/svg+xml", + "svgz": "image/svg+xml", + "t38": "image/t38", + "tif": "image/tiff", + "tiff": "image/tiff", + "tfx": "image/tiff-fx", + "webp": "image/webp", + "wmf": "image/wmf", + "disposition-notification": "message/disposition-notification", + "u8msg": "message/global", + "u8dsn": "message/global-delivery-status", + "u8mdn": "message/global-disposition-notification", + "u8hdr": "message/global-headers", + "eml": "message/rfc822", + "mime": "message/rfc822", + "mht": "message/rfc822", + "mhtml": "message/rfc822", + "3mf": "model/3mf", + "glb": "model/gltf-binary", + "gltf": "model/gltf+json", + "igs": "model/iges", + "iges": "model/iges", + "jt": "model/jt", + "msh": "model/mesh", + "mesh": "model/mesh", + "silo": "model/mesh", + "mtl": "model/mtl", + "obj": "model/obj", + "prc": "model/prc", + "step": "model/step", + "stp": "model/step", + "stpnc": "model/step", + "p21": "model/step", + "stpxz": "model/step-xml+zip", + "stpx": "model/step+xml", + "stpz": "model/step+zip", + "stl": "model/stl", + "u3d": "model/u3d", + "wrl": "model/vrml", + "vrml": "model/vrml", + "x3dv": "model/x3d-vrml", + "x3dbz": "model/x3d+binary", + "x3db": "model/x3d+fastinfoset", + "x3dvz": "model/x3d+vrml", + "x3d": "model/x3d+xml", + "x3dz": "model/x3d+xml", + "appcache": "text/cache-manifest", + "manifest": "text/cache-manifest", + "ics": "text/calendar", + "ifb": "text/calendar", + "coffee": "text/coffeescript", + "litcoffee": "text/coffeescript", + "css": "text/css", + "csv": "text/csv", + "html": "text/html", + "htm": "text/html", + "shtml": "text/html", + "jade": "text/jade", + "js": "text/javascript", + "mjs": "text/javascript", + "jsx": "text/jsx", + "less": "text/less", + "md": "text/markdown", + "markdown": "text/markdown", + "mml": "text/mathml", + "mdx": "text/mdx", + "n3": "text/n3", + "txt": "text/plain", + "text": "text/plain", + "conf": "text/plain", + "def": "text/plain", + "list": "text/plain", + "log": "text/plain", + "in": "text/plain", + "ini": "text/plain", + "dsc": "text/prs.lines.tag", + "rtx": "text/richtext", + "rtf": "text/rtf", + "sgml": "text/sgml", + "sgm": "text/sgml", + "shex": "text/shex", + "slim": "text/slim", + "slm": "text/slim", + "spdx": "text/spdx", + "stylus": "text/stylus", + "styl": "text/stylus", + "tsv": "text/tab-separated-values", + "t": "text/troff", + "tr": "text/troff", + "roff": "text/troff", + "man": "text/troff", + "me": "text/troff", + "ms": "text/troff", + "ttl": "text/turtle", + "uri": "text/uri-list", + "uris": "text/uri-list", + "urls": "text/uri-list", + "vcard": "text/vcard", + "vtt": "text/vtt", + "wgsl": "text/wgsl", + "xml": "text/xml", + "yaml": "text/yaml", + "yml": "text/yaml", + "3gpp": "video/3gpp", + "3gp": "video/3gpp", + "3g2": "video/3gpp2", + "h261": "video/h261", + "h263": "video/h263", + "h264": "video/h264", + "m4s": "video/iso.segment", + "jpgv": "video/jpeg", + "mj2": "video/mj2", + "mjp2": "video/mj2", + "ts": "video/mp2t", + "m2t": "video/mp2t", + "m2ts": "video/mp2t", + "mts": "video/mp2t", + "mp4": "video/mp4", + "mpg4": "video/mp4", + "mp4v": "video/mp4", + "mpeg": "video/mpeg", + "mpg": "video/mpeg", + "mpe": "video/mpeg", + "m1v": "video/mpeg", + "m2v": "video/mpeg", + "ogv": "video/ogg", + "qt": "video/quicktime", + "mov": "video/quicktime", + "webm": "video/webm" }; function lookup(extn: string): string | undefined { - let tmp = ("" + extn).trim().toLowerCase(); - let idx = tmp.lastIndexOf("."); - return mimes[!~idx ? tmp : tmp.substring(++idx)]; + let tmp = ('' + extn).trim().toLowerCase(); + let idx = tmp.lastIndexOf('.'); + return mimes[!~idx ? tmp : tmp.substring(++idx)]; } -export { lookup, mimes }; +export { mimes, lookup }; From 2e9cc7eae94bdc58278e7b72339532861c59fa22 Mon Sep 17 00:00:00 2001 From: valadaptive Date: Sun, 20 Jul 2025 00:43:22 -0400 Subject: [PATCH 2/2] Add `charset` function --- bin/index.ts | 19 +++++++++++++------ deno/mod.ts | 11 ++++++++++- index.d.ts | 1 + src/$index.ts | 6 ++++++ 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/bin/index.ts b/bin/index.ts index 461013b..71a6a99 100644 --- a/bin/index.ts +++ b/bin/index.ts @@ -80,16 +80,20 @@ for (mtype in DB) { } let mimes: Record = {}; +let charsets: Record = {}; Object.entries(raw).sort((a, b) => a[1].localeCompare(b[1])).forEach(x => { - mimes[x[0]] = raw[x[0]]; + mimes[x[0]] = x[1]; + if (!x[1].startsWith('text/') && DB[x[1]].charset) { + charsets[x[1]] = DB[x[1]].charset; + } }); -let content = fs.readFileSync(input, 'utf8').replace( - '{}', JSON.stringify(mimes, null, 2) -) + '\n'; +let content = fs.readFileSync(input, 'utf8') + .replace('const mimes = {}', `const mimes = ${JSON.stringify(mimes, null, 2)}`) + .replace('const charsets = {}', `const charsets = ${JSON.stringify(charsets, null, 2)}`) + '\n'; -let esm = content + 'export { mimes, lookup };\n'; -let cjs = content + 'exports.mimes = mimes;\nexports.lookup = lookup;\n'; +let esm = content + 'export { mimes, lookup, charset };\n'; +let cjs = content + 'exports.mimes = mimes;\nexports.lookup = lookup;\nexports.charset = charset;\n'; // build exports write('index.mjs', esm); @@ -107,6 +111,9 @@ write('deno/mod.ts', esm.replace( ).replace( 'const mimes = {', 'const mimes: Record = {', +).replace( + 'function charset(mimetype) {', + 'function charset(mimetype: string): string | undefined {', )); if (!process.env.CI) { diff --git a/deno/mod.ts b/deno/mod.ts index fe8cf77..e3da30e 100644 --- a/deno/mod.ts +++ b/deno/mod.ts @@ -452,6 +452,10 @@ const mimes: Record = { "mov": "video/quicktime", "webm": "video/webm" }; +const charsets = { + "application/json": "UTF-8", + "application/manifest+json": "UTF-8" +}; function lookup(extn: string): string | undefined { let tmp = ('' + extn).trim().toLowerCase(); @@ -459,4 +463,9 @@ function lookup(extn: string): string | undefined { return mimes[!~idx ? tmp : tmp.substring(++idx)]; } -export { mimes, lookup }; +function charset(mimetype: string): string | undefined { + if (mimetype.startsWith('text/')) return 'UTF-8'; + return charsets[mimetype]; +} + +export { mimes, lookup, charset }; diff --git a/index.d.ts b/index.d.ts index 1d9268f..f220fd3 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,2 +1,3 @@ export const mimes: Record; export function lookup(extension: string): string | undefined; +export function charset(mimetype: string): string | undefined; diff --git a/src/$index.ts b/src/$index.ts index 9a76cae..d2240b2 100644 --- a/src/$index.ts +++ b/src/$index.ts @@ -1,7 +1,13 @@ const mimes = {}; +const charsets = {}; function lookup(extn) { let tmp = ('' + extn).trim().toLowerCase(); let idx = tmp.lastIndexOf('.'); return mimes[!~idx ? tmp : tmp.substring(++idx)]; } + +function charset(mimetype) { + if (mimetype.startsWith('text/')) return 'UTF-8'; + return charsets[mimetype]; +}