@nxtedition/mime 1.1.2 → 1.1.4

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/README.md CHANGED
@@ -21,6 +21,10 @@ lookup('video.nut') // 'video/x-nut'
21
21
  lookup('audio.ac3') // 'audio/ac3'
22
22
  lookup('subs.stl') // 'application/x-ebu-stl'
23
23
  lookup('subs.scc') // 'text/x-scc'
24
+
25
+ // Bare extensions work too (like the standard mime package):
26
+ lookup('nut') // 'video/x-nut'
27
+ lookup('dnxhd') // 'video/x-dnxhd'
24
28
  ```
25
29
 
26
30
  ### Get extension from MIME type
@@ -32,49 +36,91 @@ extension('video/mp4') // 'mp4'
32
36
  extension('video/x-dnxhd') // 'dnxhd'
33
37
  extension('audio/ac3') // 'ac3'
34
38
  extension('application/x-ebu-stl') // 'stl'
35
- extension('video/quicktime', 'clip.mov') // 'mov'
39
+ extension('video/quicktime') // 'mov'
40
+
41
+ // MIME types are case-insensitive and parameters are ignored:
42
+ extension('Video/X-DnxHD; profile=hd') // 'dnxhd'
36
43
  ```
37
44
 
38
45
  ## Broadcast & media types
39
46
 
40
- Types handled beyond the standard `mime` package:
41
-
42
- | Extension | MIME Type | Format |
43
- | ------------ | ----------------------------- | ------------------------- |
44
- | `.nut` | `video/x-nut` | NUT container |
45
- | `.dnxhd` | `video/x-dnxhd` | Avid DNxHD/DNxHR |
46
- | `.dv` | `video/x-dv` | DV video |
47
- | `.h265` | `video/h265` | Raw HEVC stream |
48
- | `.av1` | `video/av1` | Raw AV1 stream |
49
- | `.ffv1` | `video/ffv1` | FFV1 archival codec |
50
- | `.vc1` | `video/vc1` | VC-1 video |
51
- | `.ac3` | `audio/ac3` | Dolby Digital |
52
- | `.eac3` | `audio/eac3` | Dolby Digital Plus |
53
- | `.opus` | `audio/opus` | Opus audio |
54
- | `.flac` | `audio/flac` | FLAC lossless |
55
- | `.pcm-s16le` | `audio/x-pcm-s16le` | Raw 16-bit PCM |
56
- | `.pcm-s24le` | `audio/x-pcm-s24le` | Raw 24-bit PCM |
57
- | `.pcm-s32le` | `audio/x-pcm-s32le` | Raw 32-bit PCM |
58
- | `.stl` | `application/x-ebu-stl` | EBU STL subtitles |
59
- | `.scc` | `text/x-scc` | Scenarist Closed Captions |
60
- | `.cap` | `application/x-cap` | Softel CAP captions |
61
- | `.890` | `application/x-890` | Cavena 890 subtitles |
62
- | `.pac` | `application/x-pac` | Screen Electronics PAC |
63
- | `.ass` | `text/x-ass` | Advanced SubStation Alpha |
64
- | `.ssa` | `text/x-ssa` | SubStation Alpha |
65
- | `.exr` | `image/x-exr` | OpenEXR |
66
- | `.cin` | `image/x-cin` | Cineon |
67
- | `.ism` | `application/vnd.ms-sstr+xml` | Smooth Streaming |
47
+ Types handled beyond (or instead of) the standard `mime` package:
48
+
49
+ | Extension | MIME Type | Format |
50
+ | ---------------------- | ----------------------------- | ------------------------- |
51
+ | `.nut` | `video/x-nut` | NUT container |
52
+ | `.aaf` | `application/x-aaf` | Avid AAF |
53
+ | `.lxf` | `application/x-lxf` | Leitch LXF |
54
+ | `.dnxhd` `.dnxhr` | `video/x-dnxhd` | Avid DNxHD/DNxHR |
55
+ | `.dv` | `video/x-dv` | DV video |
56
+ | `.h265` `.265` `.hevc` | `video/h265` | Raw HEVC stream |
57
+ | `.264` `.avc` | `video/h264` | Raw AVC stream |
58
+ | `.h266` `.266` `.vvc` | `video/h266` | Raw VVC stream |
59
+ | `.av1` | `video/av1` | Raw AV1 stream |
60
+ | `.ffv1` | `video/ffv1` | FFV1 archival codec |
61
+ | `.vc1` | `video/vc1` | VC-1 video |
62
+ | `.prores` | `video/x-prores` | Apple ProRes |
63
+ | `.r3d` | `video/x-red-r3d` | RED REDCODE RAW |
64
+ | `.braw` | `video/x-blackmagic-braw` | Blackmagic RAW |
65
+ | `.ari` | `image/x-arri-ari` | ARRIRAW frame |
66
+ | `.ac3` | `audio/ac3` | Dolby Digital |
67
+ | `.eac3` `.ec3` | `audio/eac3` | Dolby Digital Plus |
68
+ | `.opus` | `audio/opus` | Opus audio |
69
+ | `.flac` | `audio/flac` | FLAC lossless |
70
+ | `.pcm-s16le` | `audio/x-pcm-s16le` | Raw 16-bit PCM |
71
+ | `.pcm-s24le` | `audio/x-pcm-s24le` | Raw 24-bit PCM |
72
+ | `.pcm-s32le` | `audio/x-pcm-s32le` | Raw 32-bit PCM |
73
+ | `.bwf` | `audio/wav` | Broadcast Wave |
74
+ | `.w64` | `audio/x-w64` | Sony Wave64 |
75
+ | `.rf64` | `audio/x-rf64` | EBU RF64 |
76
+ | `.stl` | `application/x-ebu-stl` | EBU STL subtitles |
77
+ | `.scc` | `text/x-scc` | Scenarist Closed Captions |
78
+ | `.cap` | `application/x-cap` | Softel CAP captions |
79
+ | `.890` | `application/x-890` | Cavena 890 subtitles |
80
+ | `.pac` | `application/x-pac` | Screen Electronics PAC |
81
+ | `.ass` | `text/x-ass` | Advanced SubStation Alpha |
82
+ | `.ssa` | `text/x-ssa` | SubStation Alpha |
83
+ | `.dfxp` `.itt` | `application/ttml+xml` | TTML dialects |
84
+ | `.exr` | `image/x-exr` | OpenEXR |
85
+ | `.cin` | `image/x-cin` | Cineon |
86
+ | `.ism` | `application/vnd.ms-sstr+xml` | Smooth Streaming |
87
+ | `.mp3` | `audio/mp3` | MP3 (Chrome workaround) |
88
+
89
+ Camera RAW stills are also covered: `cr2`, `cr3`, `nef`, `nrw`, `arw`, `srf`, `sr2`, `raf`, `rw2`, `orf`, `pef`, `ptx`, `x3f`, `3fr`, `fff`, `iiq`, `mrw`, `mef`, `dng`, `raw`, `rwl`, `k25`, `kdc`, `bay`, `erf`, `srw`, `mos` — each mapped to its vendor `image/x-*` type.
90
+
91
+ ### Deliberate differences from `mime`
92
+
93
+ Some mappings intentionally shadow standard ones for broadcast use. If you serve 3D models, pcap captures, or proxy autoconfig files, this package is not for you:
94
+
95
+ - `.stl` → `application/x-ebu-stl` (not `model/stl`)
96
+ - `.cap` → `application/x-cap` (not `application/vnd.tcpdump.pcap`)
97
+ - `.pac` → `application/x-pac` (not `application/x-ns-proxy-autoconfig`)
98
+ - `.opus` → `audio/opus` (not `audio/ogg`)
99
+ - `.flac` → `audio/flac` (not `audio/x-flac`)
100
+ - `.exr` → `image/x-exr` (not `image/aces`)
101
+ - `.mp3` → `audio/mp3` (not `audio/mpeg`, see [Chromium #227004](https://bugs.chromium.org/p/chromium/issues/detail?id=227004))
102
+
103
+ In the reverse direction, common media extensions are preferred over mime-db's first entries:
104
+
105
+ - `video/quicktime` → `mov` (not `qt`)
106
+ - `audio/mpeg` → `mp3` (not `mpga`)
107
+ - `audio/aac` → `aac` (not `adts`)
108
+
109
+ `extension()` also accepts common alias spellings that have no forward mapping: `video/nut`, `video/dnxhd`, `video/dv`, `video/hevc` (→ `h265`), `video/x-m2ts`, `audio/pcm-s16le`/`-s24le`/`-s32le` (without the `x-` prefix), and `image/x-dpx`.
68
110
 
69
111
  ## API
70
112
 
71
113
  ### `lookup(name: string): string | null`
72
114
 
73
- Returns the MIME type for the given filename or path, or `null` if unknown.
115
+ Returns the MIME type for the given filename, path, or bare extension, or `null` if unknown. Matching is case-insensitive and follows the standard `mime` package's path semantics: the extension is what follows the last dot of the basename, provided that dot is not the basename's first character (a dotfile with a path, like `/path/.nut`, is extensionless). A name without such an extension is treated as a bare extension only when it has no path component (`nut` and `.nut` both resolve).
116
+
117
+ Also exported as `getType`.
118
+
119
+ ### `extension(mimeType: string): string | null`
74
120
 
75
- ### `extension(mimeType: string, fileName?: string): string | null`
121
+ Returns the file extension for the given MIME type, or `null` if unknown. Matching is case-insensitive and ignores parameters (e.g. `; charset=...`).
76
122
 
77
- Returns the file extension for the given MIME type, or `null` if unknown. The optional `fileName` parameter is used to disambiguate (e.g. `video/quicktime` → `mov` when the filename ends in `.mov`).
123
+ Also exported as `getExtension`.
78
124
 
79
125
  ## License
80
126
 
package/lib/index.d.ts CHANGED
@@ -2,3 +2,4 @@ export declare function lookup(name: string): string | null;
2
2
  export { lookup as getType };
3
3
  export declare function extension(mimeType: string): string | null;
4
4
  export { extension as getExtension };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwOA,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmClD;AAED,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,CAAA;AAE5B,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBzD;AAED,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,CAAA"}
package/lib/index.js CHANGED
@@ -1,188 +1,259 @@
1
- import mime from 'mime'
2
-
3
- const EXT_TO_MIME = {
4
- // Broadcast containers
5
- nut: 'video/x-nut',
6
- aaf: 'application/octet-stream',
7
- lxf: 'application/octet-stream',
8
-
9
- // Raw codecs
10
- dnxhd: 'video/x-dnxhd',
11
- dnxhr: 'video/x-dnxhd',
12
- dv: 'video/x-dv',
13
- h265: 'video/h265',
14
- 265: 'video/h265',
15
- av1: 'video/av1',
16
- ffv1: 'video/ffv1',
17
- vc1: 'video/vc1',
18
-
19
- // Raw PCM
20
- 'pcm-s32le': 'audio/x-pcm-s32le',
21
- 'pcm-s24le': 'audio/x-pcm-s24le',
22
- 'pcm-s16le': 'audio/x-pcm-s16le',
23
-
24
- // Audio codecs missing extensions in mime-db
25
- ac3: 'audio/ac3',
26
- eac3: 'audio/eac3',
27
- ec3: 'audio/eac3',
28
- opus: 'audio/opus',
29
- flac: 'audio/flac',
30
-
31
- // Broadcast subtitle/caption formats
32
- stl: 'application/x-ebu-stl',
33
- scc: 'text/x-scc',
34
- cap: 'application/x-cap',
35
- 890: 'application/x-890',
36
- pac: 'application/x-pac',
37
- ass: 'text/x-ass',
38
- ssa: 'text/x-ssa',
39
-
40
- // Camera RAW
41
- cr2: 'image/x-canon-cr2',
42
- nef: 'image/x-nikon-nef',
43
- cr3: 'image/x-canon-cr3',
44
- nrw: 'image/x-nikon-nrw',
45
- arw: 'image/x-sony-arw',
46
- srf: 'image/x-sony-srf',
47
- sr2: 'image/x-sony-sr2',
48
- raf: 'image/x-fujifilm-raf',
49
- rw2: 'image/x-panasonic-rw2',
50
- orf: 'image/x-olympus-orf',
51
- pef: 'image/x-pentax-pef',
52
- ptx: 'image/x-pentax-ptx',
53
- x3f: 'image/x-sigma-x3f',
54
- '3fr': 'image/x-hasselblad-3fr',
55
- fff: 'image/x-hasselblad-fff',
56
- iiq: 'image/x-phase-one-iiq',
57
- mrw: 'image/x-minolta-mrw',
58
- mef: 'image/x-mamiya-mef',
59
- dng: 'image/x-adobe-dng',
60
- raw: 'image/x-raw',
61
- rwl: 'image/x-leica-rwl',
62
- k25: 'image/x-kodak-k25',
63
- kdc: 'image/x-kodak-kdc',
64
- bay: 'image/x-casio-bay',
65
- erf: 'image/x-epson-erf',
66
- srw: 'image/x-samsung-srw',
67
- mos: 'image/x-leaf-mos',
68
-
69
- // Imaging
70
- exr: 'image/x-exr',
71
- cin: 'image/x-cin',
72
-
73
- // Streaming
74
- ism: 'application/vnd.ms-sstr+xml',
75
-
76
- // NOTE: Workaround for Chrome.
77
- // See, https://bugs.chromium.org/p/chromium/issues/detail?id=227004.
78
- mp3: 'audio/mp3',
1
+ import standardTypes from 'mime/types/standard.js';
2
+ import otherTypes from 'mime/types/other.js';
3
+ const EXT_TO_MIME = new Map();
4
+ const MIME_TO_EXT = new Map();
5
+ // Replicates Mime#define over mime's public data exports. The default mime
6
+ // instance is frozen (no runtime define), so merging at load time is exactly
7
+ // equivalent: the first extension of a type wins the reverse mapping, and
8
+ // '*'-prefixed extensions don't claim the forward mapping.
9
+ for (const typeMap of [standardTypes, otherTypes]) {
10
+ for (const [type, extensions] of Object.entries(typeMap)) {
11
+ let first = true;
12
+ for (let ext of extensions) {
13
+ const starred = ext.startsWith('*');
14
+ if (starred) {
15
+ ext = ext.slice(1);
16
+ }
17
+ if (first) {
18
+ MIME_TO_EXT.set(type, ext);
19
+ first = false;
20
+ }
21
+ if (!starred) {
22
+ EXT_TO_MIME.set(ext, type);
23
+ }
24
+ }
25
+ }
79
26
  }
80
-
81
- const MIME_TO_EXT = {
82
- // Broadcast containers
83
- 'video/x-nut': 'nut',
84
- 'video/nut': 'nut',
85
-
86
- // Raw codecs
87
- 'video/x-dnxhd': 'dnxhd',
88
- 'video/dnxhd': 'dnxhd',
89
- 'video/x-dv': 'dv',
90
- 'video/dv': 'dv',
91
- 'video/h265': 'h265',
92
- 'video/av1': 'av1',
93
- 'video/ffv1': 'ffv1',
94
- 'video/vc1': 'vc1',
95
-
96
- // Raw PCM
97
- 'audio/x-pcm-s32le': 'pcm-s32le',
98
- 'audio/pcm-s32le': 'pcm-s32le',
99
- 'audio/x-pcm-s24le': 'pcm-s24le',
100
- 'audio/pcm-s24le': 'pcm-s24le',
101
- 'audio/x-pcm-s16le': 'pcm-s16le',
102
- 'audio/pcm-s16le': 'pcm-s16le',
103
-
104
- // Audio codecs
105
- 'audio/ac3': 'ac3',
106
- 'audio/eac3': 'eac3',
107
- 'audio/opus': 'opus',
108
- 'audio/flac': 'flac',
109
-
110
- // Broadcast subtitle/caption formats
111
- 'application/x-ebu-stl': 'stl',
112
- 'text/x-scc': 'scc',
113
- 'application/x-cap': 'cap',
114
- 'application/x-890': '890',
115
- 'application/x-pac': 'pac',
116
- 'text/x-ass': 'ass',
117
- 'text/x-ssa': 'ssa',
118
-
119
- // Camera RAW
120
- 'image/x-nikon-nef': 'nef',
121
- 'image/x-canon-cr2': 'cr2',
122
- 'image/x-canon-cr3': 'cr3',
123
- 'image/x-nikon-nrw': 'nrw',
124
- 'image/x-sony-arw': 'arw',
125
- 'image/x-sony-srf': 'srf',
126
- 'image/x-sony-sr2': 'sr2',
127
- 'image/x-fujifilm-raf': 'raf',
128
- 'image/x-panasonic-rw2': 'rw2',
129
- 'image/x-olympus-orf': 'orf',
130
- 'image/x-pentax-pef': 'pef',
131
- 'image/x-pentax-ptx': 'ptx',
132
- 'image/x-sigma-x3f': 'x3f',
133
- 'image/x-hasselblad-3fr': '3fr',
134
- 'image/x-hasselblad-fff': 'fff',
135
- 'image/x-phase-one-iiq': 'iiq',
136
- 'image/x-minolta-mrw': 'mrw',
137
- 'image/x-mamiya-mef': 'mef',
138
- 'image/x-adobe-dng': 'dng',
139
- 'image/x-raw': 'raw',
140
- 'image/x-leica-rwl': 'rwl',
141
- 'image/x-kodak-k25': 'k25',
142
- 'image/x-kodak-kdc': 'kdc',
143
- 'image/x-casio-bay': 'bay',
144
- 'image/x-epson-erf': 'erf',
145
- 'image/x-samsung-srw': 'srw',
146
- 'image/x-leaf-mos': 'mos',
147
-
148
- // Imaging
149
- 'image/x-exr': 'exr',
150
- 'image/x-cin': 'cin',
151
-
152
- // Streaming
153
- 'application/vnd.ms-sstr+xml': 'ism',
154
-
155
- // QuickTime — prefer .mov over .qt
156
- 'video/quicktime': 'mov',
27
+ // Custom mappings applied on top of mime-db. Some deliberately shadow
28
+ // standard mappings (stl, cap, pac, opus, flac, exr, mp3) — see README.
29
+ for (const [ext, type] of Object.entries({
30
+ // Broadcast containers
31
+ nut: 'video/x-nut',
32
+ aaf: 'application/x-aaf',
33
+ lxf: 'application/x-lxf',
34
+ // Raw codecs
35
+ dnxhd: 'video/x-dnxhd',
36
+ dnxhr: 'video/x-dnxhd',
37
+ dv: 'video/x-dv',
38
+ h265: 'video/h265',
39
+ 265: 'video/h265',
40
+ hevc: 'video/h265',
41
+ 264: 'video/h264',
42
+ avc: 'video/h264',
43
+ h266: 'video/h266',
44
+ 266: 'video/h266',
45
+ vvc: 'video/h266',
46
+ av1: 'video/av1',
47
+ ffv1: 'video/ffv1',
48
+ vc1: 'video/vc1',
49
+ prores: 'video/x-prores',
50
+ // Cinema camera RAW
51
+ r3d: 'video/x-red-r3d',
52
+ braw: 'video/x-blackmagic-braw',
53
+ ari: 'image/x-arri-ari',
54
+ // Raw PCM
55
+ 'pcm-s32le': 'audio/x-pcm-s32le',
56
+ 'pcm-s24le': 'audio/x-pcm-s24le',
57
+ 'pcm-s16le': 'audio/x-pcm-s16le',
58
+ // Audio codecs missing extensions in mime-db
59
+ ac3: 'audio/ac3',
60
+ eac3: 'audio/eac3',
61
+ ec3: 'audio/eac3',
62
+ opus: 'audio/opus',
63
+ flac: 'audio/flac',
64
+ // Broadcast audio containers
65
+ bwf: 'audio/wav',
66
+ w64: 'audio/x-w64',
67
+ rf64: 'audio/x-rf64',
68
+ // Broadcast subtitle/caption formats
69
+ stl: 'application/x-ebu-stl',
70
+ scc: 'text/x-scc',
71
+ cap: 'application/x-cap',
72
+ 890: 'application/x-890',
73
+ pac: 'application/x-pac',
74
+ ass: 'text/x-ass',
75
+ ssa: 'text/x-ssa',
76
+ dfxp: 'application/ttml+xml',
77
+ itt: 'application/ttml+xml',
78
+ // Camera RAW
79
+ cr2: 'image/x-canon-cr2',
80
+ nef: 'image/x-nikon-nef',
81
+ cr3: 'image/x-canon-cr3',
82
+ nrw: 'image/x-nikon-nrw',
83
+ arw: 'image/x-sony-arw',
84
+ srf: 'image/x-sony-srf',
85
+ sr2: 'image/x-sony-sr2',
86
+ raf: 'image/x-fujifilm-raf',
87
+ rw2: 'image/x-panasonic-rw2',
88
+ orf: 'image/x-olympus-orf',
89
+ pef: 'image/x-pentax-pef',
90
+ ptx: 'image/x-pentax-ptx',
91
+ x3f: 'image/x-sigma-x3f',
92
+ '3fr': 'image/x-hasselblad-3fr',
93
+ fff: 'image/x-hasselblad-fff',
94
+ iiq: 'image/x-phase-one-iiq',
95
+ mrw: 'image/x-minolta-mrw',
96
+ mef: 'image/x-mamiya-mef',
97
+ dng: 'image/x-adobe-dng',
98
+ raw: 'image/x-raw',
99
+ rwl: 'image/x-leica-rwl',
100
+ k25: 'image/x-kodak-k25',
101
+ kdc: 'image/x-kodak-kdc',
102
+ bay: 'image/x-casio-bay',
103
+ erf: 'image/x-epson-erf',
104
+ srw: 'image/x-samsung-srw',
105
+ mos: 'image/x-leaf-mos',
106
+ // Imaging
107
+ exr: 'image/x-exr',
108
+ cin: 'image/x-cin',
109
+ // Streaming
110
+ ism: 'application/vnd.ms-sstr+xml',
111
+ // NOTE: Workaround for Chrome.
112
+ // See, https://bugs.chromium.org/p/chromium/issues/detail?id=227004.
113
+ mp3: 'audio/mp3',
114
+ })) {
115
+ EXT_TO_MIME.set(ext, type);
157
116
  }
158
-
159
- export function lookup(name ) {
160
- if (typeof name !== 'string' || name.length === 0) {
161
- return null
162
- }
163
-
164
- const match = name.match(/\.([^.]+)$/)
165
- const ext = match?.[1]?.toLowerCase()
166
-
167
- if (ext && EXT_TO_MIME[ext]) {
168
- return EXT_TO_MIME[ext]
169
- }
170
-
171
- return mime.getType(name)
117
+ for (const [type, ext] of Object.entries({
118
+ // Broadcast containers
119
+ 'video/x-nut': 'nut',
120
+ 'video/nut': 'nut',
121
+ 'video/x-m2ts': 'm2ts',
122
+ 'application/x-aaf': 'aaf',
123
+ 'application/x-lxf': 'lxf',
124
+ // Raw codecs
125
+ 'video/x-dnxhd': 'dnxhd',
126
+ 'video/dnxhd': 'dnxhd',
127
+ 'video/x-dv': 'dv',
128
+ 'video/dv': 'dv',
129
+ 'video/h265': 'h265',
130
+ 'video/hevc': 'h265',
131
+ 'video/h266': 'h266',
132
+ 'video/av1': 'av1',
133
+ 'video/ffv1': 'ffv1',
134
+ 'video/vc1': 'vc1',
135
+ 'video/x-prores': 'prores',
136
+ // Cinema camera RAW
137
+ 'video/x-red-r3d': 'r3d',
138
+ 'video/x-blackmagic-braw': 'braw',
139
+ 'image/x-arri-ari': 'ari',
140
+ // Raw PCM
141
+ 'audio/x-pcm-s32le': 'pcm-s32le',
142
+ 'audio/pcm-s32le': 'pcm-s32le',
143
+ 'audio/x-pcm-s24le': 'pcm-s24le',
144
+ 'audio/pcm-s24le': 'pcm-s24le',
145
+ 'audio/x-pcm-s16le': 'pcm-s16le',
146
+ 'audio/pcm-s16le': 'pcm-s16le',
147
+ // Audio codecs
148
+ 'audio/ac3': 'ac3',
149
+ 'audio/eac3': 'eac3',
150
+ 'audio/opus': 'opus',
151
+ 'audio/flac': 'flac',
152
+ // Broadcast audio containers
153
+ 'audio/x-w64': 'w64',
154
+ 'audio/x-rf64': 'rf64',
155
+ // Prefer the ubiquitous extensions over mime-db's first entries
156
+ // ('mpga' and 'adts').
157
+ 'audio/mpeg': 'mp3',
158
+ 'audio/mp3': 'mp3',
159
+ 'audio/aac': 'aac',
160
+ // Broadcast subtitle/caption formats
161
+ 'application/x-ebu-stl': 'stl',
162
+ 'text/x-scc': 'scc',
163
+ 'application/x-cap': 'cap',
164
+ 'application/x-890': '890',
165
+ 'application/x-pac': 'pac',
166
+ 'text/x-ass': 'ass',
167
+ 'text/x-ssa': 'ssa',
168
+ // Camera RAW
169
+ 'image/x-nikon-nef': 'nef',
170
+ 'image/x-canon-cr2': 'cr2',
171
+ 'image/x-canon-cr3': 'cr3',
172
+ 'image/x-nikon-nrw': 'nrw',
173
+ 'image/x-sony-arw': 'arw',
174
+ 'image/x-sony-srf': 'srf',
175
+ 'image/x-sony-sr2': 'sr2',
176
+ 'image/x-fujifilm-raf': 'raf',
177
+ 'image/x-panasonic-rw2': 'rw2',
178
+ 'image/x-olympus-orf': 'orf',
179
+ 'image/x-pentax-pef': 'pef',
180
+ 'image/x-pentax-ptx': 'ptx',
181
+ 'image/x-sigma-x3f': 'x3f',
182
+ 'image/x-hasselblad-3fr': '3fr',
183
+ 'image/x-hasselblad-fff': 'fff',
184
+ 'image/x-phase-one-iiq': 'iiq',
185
+ 'image/x-minolta-mrw': 'mrw',
186
+ 'image/x-mamiya-mef': 'mef',
187
+ 'image/x-adobe-dng': 'dng',
188
+ 'image/x-raw': 'raw',
189
+ 'image/x-leica-rwl': 'rwl',
190
+ 'image/x-kodak-k25': 'k25',
191
+ 'image/x-kodak-kdc': 'kdc',
192
+ 'image/x-casio-bay': 'bay',
193
+ 'image/x-epson-erf': 'erf',
194
+ 'image/x-samsung-srw': 'srw',
195
+ 'image/x-leaf-mos': 'mos',
196
+ // Imaging
197
+ 'image/x-exr': 'exr',
198
+ 'image/x-cin': 'cin',
199
+ 'image/x-dpx': 'dpx',
200
+ // Streaming
201
+ 'application/vnd.ms-sstr+xml': 'ism',
202
+ // QuickTime — prefer .mov over .qt
203
+ 'video/quicktime': 'mov',
204
+ })) {
205
+ MIME_TO_EXT.set(type, ext);
172
206
  }
173
-
174
- export { lookup as getType }
175
-
176
- export function extension(mimeType ) {
177
- if (typeof mimeType !== 'string' || mimeType.length === 0) {
178
- return null
179
- }
180
-
181
- if (MIME_TO_EXT[mimeType]) {
182
- return MIME_TO_EXT[mimeType]
183
- }
184
-
185
- return mime.getExtension(mimeType) || null
207
+ export function lookup(name) {
208
+ if (typeof name !== 'string' || name.length === 0) {
209
+ return null;
210
+ }
211
+ // Mirrors mime's path parsing: the extension is what follows the last dot
212
+ // of the basename, provided that dot is not the basename's first character
213
+ // (a dotfile with a path, like '/path/.nut', is extensionless). A name
214
+ // without such an extension is treated as a bare extension, but only when
215
+ // it has no path component ('nut' and '.nut' both resolve).
216
+ let start = 0;
217
+ for (let i = name.length - 1; i >= 0; i--) {
218
+ const code = name.charCodeAt(i);
219
+ if (code === 0x2f /* / */ || code === 0x5c /* \ */) {
220
+ start = i + 1;
221
+ break;
222
+ }
223
+ }
224
+ const dot = name.lastIndexOf('.');
225
+ let ext;
226
+ if (dot > start) {
227
+ ext = name.slice(dot + 1).toLowerCase();
228
+ }
229
+ else if (start === 0) {
230
+ ext = (dot === 0 ? name.slice(1) : name).toLowerCase();
231
+ }
232
+ else {
233
+ return null;
234
+ }
235
+ if (ext.length === 0) {
236
+ return null;
237
+ }
238
+ return EXT_TO_MIME.get(ext) ?? null;
186
239
  }
187
-
188
- export { extension as getExtension }
240
+ export { lookup as getType };
241
+ export function extension(mimeType) {
242
+ if (typeof mimeType !== 'string' || mimeType.length === 0) {
243
+ return null;
244
+ }
245
+ // Fast path for canonical (lowercase, parameterless) types.
246
+ const ext = MIME_TO_EXT.get(mimeType);
247
+ if (ext !== undefined) {
248
+ return ext;
249
+ }
250
+ // Mirrors mime's normalization: parameters stripped, trimmed, lowercased.
251
+ const semi = mimeType.indexOf(';');
252
+ const essence = (semi === -1 ? mimeType : mimeType.slice(0, semi)).trim().toLowerCase();
253
+ if (essence === mimeType) {
254
+ return null;
255
+ }
256
+ return MIME_TO_EXT.get(essence) ?? null;
257
+ }
258
+ export { extension as getExtension };
259
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/mime",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "type": "module",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -14,7 +14,7 @@
14
14
  "access": "public"
15
15
  },
16
16
  "scripts": {
17
- "build": "rimraf lib && tsc -p tsconfig.build.json && amaroc ./src/index.ts && mv src/index.js lib/",
17
+ "build": "rimraf lib && tsc -p tsconfig.build.json",
18
18
  "prepublishOnly": "yarn build",
19
19
  "typecheck": "tsc --noEmit",
20
20
  "test": "node --test",
@@ -25,10 +25,10 @@
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/node": "^25.5.0",
28
- "amaroc": "^1.0.1",
28
+ "mitata": "^1.0.34",
29
29
  "oxlint-tsgolint": "^0.17.0",
30
30
  "rimraf": "^6.1.3",
31
31
  "typescript": "^5.9.3"
32
32
  },
33
- "gitHead": "7c9c7457c885c644c7a1e70ef894d4727ce240d6"
33
+ "gitHead": "c9f2526dc870597de119b8ec5083f97901d4a2e2"
34
34
  }