file-type 18.2.0 → 18.3.0
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/browser.d.ts +1 -20
- package/browser.js +1 -37
- package/core.d.ts +32 -2
- package/core.js +67 -10
- package/package.json +11 -6
- package/readme.md +5 -2
- package/supported.js +10 -0
package/browser.d.ts
CHANGED
|
@@ -18,28 +18,9 @@ console.log(fileType);
|
|
|
18
18
|
*/
|
|
19
19
|
export declare function fileTypeFromStream(stream: ReadableStream): Promise<FileTypeResult | undefined>;
|
|
20
20
|
|
|
21
|
-
/**
|
|
22
|
-
Detect the file type of a [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob).
|
|
23
|
-
|
|
24
|
-
__Note:__ This method is only available in the browser.
|
|
25
|
-
|
|
26
|
-
@example
|
|
27
|
-
```
|
|
28
|
-
import {fileTypeFromBlob} from 'file-type';
|
|
29
|
-
|
|
30
|
-
const blob = new Blob(['<?xml version="1.0" encoding="ISO-8859-1" ?>'], {
|
|
31
|
-
type: 'plain/text',
|
|
32
|
-
endings: 'native'
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
console.log(await fileTypeFromBlob(blob));
|
|
36
|
-
//=> {ext: 'txt', mime: 'plain/text'}
|
|
37
|
-
```
|
|
38
|
-
*/
|
|
39
|
-
export declare function fileTypeFromBlob(blob: Blob): Promise<FileTypeResult | undefined>;
|
|
40
|
-
|
|
41
21
|
export {
|
|
42
22
|
fileTypeFromBuffer,
|
|
23
|
+
fileTypeFromBlob,
|
|
43
24
|
supportedExtensions,
|
|
44
25
|
supportedMimeTypes,
|
|
45
26
|
type FileTypeResult,
|
package/browser.js
CHANGED
|
@@ -1,36 +1,5 @@
|
|
|
1
|
-
import {Buffer} from 'node:buffer';
|
|
2
1
|
import {ReadableWebToNodeStream} from 'readable-web-to-node-stream';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
Convert Blobs to ArrayBuffer.
|
|
7
|
-
|
|
8
|
-
@param {Blob} blob - Web API Blob.
|
|
9
|
-
@returns {Promise<ArrayBuffer>}
|
|
10
|
-
*/
|
|
11
|
-
function blobToArrayBuffer(blob) {
|
|
12
|
-
if (blob.arrayBuffer) {
|
|
13
|
-
return blob.arrayBuffer();
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// TODO: Remove when stop supporting older environments
|
|
17
|
-
return new Promise((resolve, reject) => {
|
|
18
|
-
const fileReader = new FileReader();
|
|
19
|
-
fileReader.addEventListener('loadend', event => {
|
|
20
|
-
resolve(event.target.result);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
fileReader.addEventListener('error', event => {
|
|
24
|
-
reject(new Error(event.message));
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
fileReader.addEventListener('abort', event => {
|
|
28
|
-
reject(new Error(event.type));
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
fileReader.readAsArrayBuffer(blob);
|
|
32
|
-
});
|
|
33
|
-
}
|
|
2
|
+
import {fileTypeFromStream as coreFileTypeFromStream} from './core.js';
|
|
34
3
|
|
|
35
4
|
export async function fileTypeFromStream(stream) {
|
|
36
5
|
const readableWebToNodeStream = new ReadableWebToNodeStream(stream);
|
|
@@ -39,11 +8,6 @@ export async function fileTypeFromStream(stream) {
|
|
|
39
8
|
return fileType;
|
|
40
9
|
}
|
|
41
10
|
|
|
42
|
-
export async function fileTypeFromBlob(blob) {
|
|
43
|
-
const buffer = await blobToArrayBuffer(blob);
|
|
44
|
-
return fileTypeFromBuffer(Buffer.from(buffer));
|
|
45
|
-
}
|
|
46
|
-
|
|
47
11
|
export {
|
|
48
12
|
fileTypeFromTokenizer,
|
|
49
13
|
fileTypeFromBuffer,
|
package/core.d.ts
CHANGED
|
@@ -83,6 +83,7 @@ export type FileExtension =
|
|
|
83
83
|
| 'xlsx'
|
|
84
84
|
| '3gp'
|
|
85
85
|
| '3g2'
|
|
86
|
+
| 'j2c'
|
|
86
87
|
| 'jp2'
|
|
87
88
|
| 'jpm'
|
|
88
89
|
| 'jpx'
|
|
@@ -144,7 +145,12 @@ export type FileExtension =
|
|
|
144
145
|
| 'jls'
|
|
145
146
|
| 'pst'
|
|
146
147
|
| 'dwg'
|
|
147
|
-
| 'parquet'
|
|
148
|
+
| 'parquet'
|
|
149
|
+
| 'class'
|
|
150
|
+
| 'arj'
|
|
151
|
+
| 'cpio'
|
|
152
|
+
| 'ace'
|
|
153
|
+
; // eslint-disable-line semi-style
|
|
148
154
|
|
|
149
155
|
export type MimeType =
|
|
150
156
|
| 'image/jpeg'
|
|
@@ -231,6 +237,7 @@ export type MimeType =
|
|
|
231
237
|
| 'video/mp2t'
|
|
232
238
|
| 'application/x-blender'
|
|
233
239
|
| 'image/bpg'
|
|
240
|
+
| 'image/j2c'
|
|
234
241
|
| 'image/jp2'
|
|
235
242
|
| 'image/jpx'
|
|
236
243
|
| 'image/jpm'
|
|
@@ -284,7 +291,12 @@ export type MimeType =
|
|
|
284
291
|
| 'image/jls'
|
|
285
292
|
| 'application/vnd.ms-outlook'
|
|
286
293
|
| 'image/vnd.dwg'
|
|
287
|
-
| 'application/x-parquet'
|
|
294
|
+
| 'application/x-parquet'
|
|
295
|
+
| 'application/java-vm'
|
|
296
|
+
| 'application/x-arj'
|
|
297
|
+
| 'application/x-cpio'
|
|
298
|
+
| 'application/x-ace-compressed'
|
|
299
|
+
; // eslint-disable-line semi-style
|
|
288
300
|
|
|
289
301
|
export type FileTypeResult = {
|
|
290
302
|
/**
|
|
@@ -401,3 +413,21 @@ if (stream2.fileType?.mime === 'image/jpeg') {
|
|
|
401
413
|
```
|
|
402
414
|
*/
|
|
403
415
|
export function fileTypeStream(readableStream: ReadableStream, options?: StreamOptions): Promise<ReadableStreamWithFileType>;
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
Detect the file type of a [`Blob`](https://nodejs.org/api/buffer.html#class-blob).
|
|
419
|
+
|
|
420
|
+
@example
|
|
421
|
+
```
|
|
422
|
+
import {fileTypeFromBlob} from 'file-type';
|
|
423
|
+
|
|
424
|
+
const blob = new Blob(['<?xml version="1.0" encoding="ISO-8859-1" ?>'], {
|
|
425
|
+
type: 'plain/text',
|
|
426
|
+
endings: 'native'
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
console.log(await fileTypeFromBlob(blob));
|
|
430
|
+
//=> {ext: 'txt', mime: 'plain/text'}
|
|
431
|
+
```
|
|
432
|
+
*/
|
|
433
|
+
export declare function fileTypeFromBlob(blob: Blob): Promise<FileTypeResult | undefined>;
|
package/core.js
CHANGED
|
@@ -33,6 +33,11 @@ export async function fileTypeFromBuffer(input) {
|
|
|
33
33
|
return fileTypeFromTokenizer(strtok3.fromBuffer(buffer));
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
export async function fileTypeFromBlob(blob) {
|
|
37
|
+
const buffer = await blob.arrayBuffer();
|
|
38
|
+
return fileTypeFromBuffer(new Uint8Array(buffer));
|
|
39
|
+
}
|
|
40
|
+
|
|
36
41
|
function _check(buffer, headers, options) {
|
|
37
42
|
options = {
|
|
38
43
|
offset: 0,
|
|
@@ -144,6 +149,20 @@ class FileTypeParser {
|
|
|
144
149
|
};
|
|
145
150
|
}
|
|
146
151
|
|
|
152
|
+
if (this.check([0xC7, 0x71])) {
|
|
153
|
+
return {
|
|
154
|
+
ext: 'cpio',
|
|
155
|
+
mime: 'application/x-cpio',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (this.check([0x60, 0xEA])) {
|
|
160
|
+
return {
|
|
161
|
+
ext: 'arj',
|
|
162
|
+
mime: 'application/x-arj',
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
147
166
|
// -- 3-byte signatures --
|
|
148
167
|
|
|
149
168
|
if (this.check([0xEF, 0xBB, 0xBF])) { // UTF-8-BOM
|
|
@@ -611,17 +630,24 @@ class FileTypeParser {
|
|
|
611
630
|
}
|
|
612
631
|
|
|
613
632
|
if (this.checkString('%PDF')) {
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
633
|
+
try {
|
|
634
|
+
await tokenizer.ignore(1350);
|
|
635
|
+
const maxBufferSize = 10 * 1024 * 1024;
|
|
636
|
+
const buffer = Buffer.alloc(Math.min(maxBufferSize, tokenizer.fileInfo.size));
|
|
637
|
+
await tokenizer.readBuffer(buffer, {mayBeLess: true});
|
|
618
638
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
639
|
+
// Check if this is an Adobe Illustrator file
|
|
640
|
+
if (buffer.includes(Buffer.from('AIPrivateData'))) {
|
|
641
|
+
return {
|
|
642
|
+
ext: 'ai',
|
|
643
|
+
mime: 'application/postscript',
|
|
644
|
+
};
|
|
645
|
+
}
|
|
646
|
+
} catch (error) {
|
|
647
|
+
// Swallow end of stream error if file is too small for the Adobe AI check
|
|
648
|
+
if (!(error instanceof strtok3.EndOfStreamError)) {
|
|
649
|
+
throw error;
|
|
650
|
+
}
|
|
625
651
|
}
|
|
626
652
|
|
|
627
653
|
// Assume this is just a normal PDF
|
|
@@ -905,6 +931,13 @@ class FileTypeParser {
|
|
|
905
931
|
};
|
|
906
932
|
}
|
|
907
933
|
|
|
934
|
+
if (this.check([0xCA, 0xFE, 0xBA, 0xBE])) {
|
|
935
|
+
return {
|
|
936
|
+
ext: 'class',
|
|
937
|
+
mime: 'application/java-vm',
|
|
938
|
+
};
|
|
939
|
+
}
|
|
940
|
+
|
|
908
941
|
// -- 6-byte signatures --
|
|
909
942
|
|
|
910
943
|
if (this.check([0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00])) {
|
|
@@ -955,6 +988,13 @@ class FileTypeParser {
|
|
|
955
988
|
}
|
|
956
989
|
}
|
|
957
990
|
|
|
991
|
+
if (this.checkString('070707')) {
|
|
992
|
+
return {
|
|
993
|
+
ext: 'cpio',
|
|
994
|
+
mime: 'application/x-cpio',
|
|
995
|
+
};
|
|
996
|
+
}
|
|
997
|
+
|
|
958
998
|
// -- 7-byte signatures --
|
|
959
999
|
|
|
960
1000
|
if (this.checkString('BLENDER')) {
|
|
@@ -980,6 +1020,16 @@ class FileTypeParser {
|
|
|
980
1020
|
};
|
|
981
1021
|
}
|
|
982
1022
|
|
|
1023
|
+
if (this.checkString('**ACE', {offset: 7})) {
|
|
1024
|
+
await tokenizer.peekBuffer(this.buffer, {length: 14, mayBeLess: true});
|
|
1025
|
+
if (this.checkString('**', {offset: 12})) {
|
|
1026
|
+
return {
|
|
1027
|
+
ext: 'ace',
|
|
1028
|
+
mime: 'application/x-ace-compressed',
|
|
1029
|
+
};
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
|
|
983
1033
|
// -- 8-byte signatures --
|
|
984
1034
|
|
|
985
1035
|
if (this.check([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) {
|
|
@@ -1151,6 +1201,13 @@ class FileTypeParser {
|
|
|
1151
1201
|
};
|
|
1152
1202
|
}
|
|
1153
1203
|
|
|
1204
|
+
if (this.check([0xFF, 0x4F, 0xFF, 0x51])) {
|
|
1205
|
+
return {
|
|
1206
|
+
ext: 'j2c',
|
|
1207
|
+
mime: 'image/j2c',
|
|
1208
|
+
};
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1154
1211
|
if (this.check([0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A])) {
|
|
1155
1212
|
// JPEG-2000 family
|
|
1156
1213
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "file-type",
|
|
3
|
-
"version": "18.
|
|
3
|
+
"version": "18.3.0",
|
|
4
4
|
"description": "Detect the file type of a Buffer/Uint8Array/ArrayBuffer",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": "sindresorhus/file-type",
|
|
@@ -132,6 +132,7 @@
|
|
|
132
132
|
"pptx",
|
|
133
133
|
"xlsx",
|
|
134
134
|
"3gp",
|
|
135
|
+
"j2c",
|
|
135
136
|
"jp2",
|
|
136
137
|
"jpm",
|
|
137
138
|
"jpx",
|
|
@@ -197,7 +198,11 @@
|
|
|
197
198
|
"jls",
|
|
198
199
|
"pst",
|
|
199
200
|
"dwg",
|
|
200
|
-
"parquet"
|
|
201
|
+
"parquet",
|
|
202
|
+
"class",
|
|
203
|
+
"arj",
|
|
204
|
+
"cpio",
|
|
205
|
+
"ace"
|
|
201
206
|
],
|
|
202
207
|
"dependencies": {
|
|
203
208
|
"readable-web-to-node-stream": "^3.0.2",
|
|
@@ -206,12 +211,12 @@
|
|
|
206
211
|
},
|
|
207
212
|
"devDependencies": {
|
|
208
213
|
"@tokenizer/token": "^0.3.0",
|
|
209
|
-
"@types/node": "^18.
|
|
210
|
-
"ava": "^5.
|
|
214
|
+
"@types/node": "^18.16.0",
|
|
215
|
+
"ava": "^5.2.0",
|
|
211
216
|
"commonmark": "^0.30.0",
|
|
212
217
|
"noop-stream": "^1.0.0",
|
|
213
|
-
"tsd": "^0.
|
|
214
|
-
"xo": "^0.
|
|
218
|
+
"tsd": "^0.28.1",
|
|
219
|
+
"xo": "^0.54.1"
|
|
215
220
|
},
|
|
216
221
|
"xo": {
|
|
217
222
|
"envs": [
|
package/readme.md
CHANGED
|
@@ -198,8 +198,6 @@ A readable stream representing file data.
|
|
|
198
198
|
|
|
199
199
|
Detect the file type of a [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob).
|
|
200
200
|
|
|
201
|
-
**Note:** This method is only available in the browser.
|
|
202
|
-
|
|
203
201
|
The file type is detected by checking the [magic number](https://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files) of the buffer.
|
|
204
202
|
|
|
205
203
|
Returns a `Promise` for an object with the detected file type and MIME type:
|
|
@@ -346,6 +344,7 @@ Returns a `Set<string>` of supported MIME types.
|
|
|
346
344
|
- [`Z`](https://fileinfo.com/extension/z) - Unix Compressed File
|
|
347
345
|
- [`aac`](https://en.wikipedia.org/wiki/Advanced_Audio_Coding) - Advanced Audio Coding
|
|
348
346
|
- [`ac3`](https://www.atsc.org/standard/a522012-digital-audio-compression-ac-3-e-ac-3-standard-12172012/) - ATSC A/52 Audio File
|
|
347
|
+
- [`ace`](https://en.wikipedia.org/wiki/ACE_(compressed_file_format)) - ACE archive
|
|
349
348
|
- [`ai`](https://en.wikipedia.org/wiki/Adobe_Illustrator_Artwork) - Adobe Illustrator Artwork
|
|
350
349
|
- [`aif`](https://en.wikipedia.org/wiki/Audio_Interchange_File_Format) - Audio Interchange file
|
|
351
350
|
- [`alias`](https://en.wikipedia.org/wiki/Alias_%28Mac_OS%29) - macOS Alias file
|
|
@@ -353,6 +352,7 @@ Returns a `Set<string>` of supported MIME types.
|
|
|
353
352
|
- [`ape`](https://en.wikipedia.org/wiki/Monkey%27s_Audio) - Monkey's Audio
|
|
354
353
|
- [`apng`](https://en.wikipedia.org/wiki/APNG) - Animated Portable Network Graphics
|
|
355
354
|
- [`ar`](https://en.wikipedia.org/wiki/Ar_(Unix)) - Archive file
|
|
355
|
+
- [`arj`](https://en.wikipedia.org/wiki/ARJ) - Archive file
|
|
356
356
|
- [`arrow`](https://arrow.apache.org) - Columnar format for tables of data
|
|
357
357
|
- [`arw`](https://en.wikipedia.org/wiki/Raw_image_format#ARW) - Sony Alpha Raw image file
|
|
358
358
|
- [`asar`](https://github.com/electron/asar#format) - Archive format primarily used to enclose Electron applications
|
|
@@ -366,6 +366,8 @@ Returns a `Set<string>` of supported MIME types.
|
|
|
366
366
|
- [`cab`](https://en.wikipedia.org/wiki/Cabinet_(file_format)) - Cabinet file
|
|
367
367
|
- [`cfb`](https://en.wikipedia.org/wiki/Compound_File_Binary_Format) - Compount File Binary Format
|
|
368
368
|
- [`chm`](https://en.wikipedia.org/wiki/Microsoft_Compiled_HTML_Help) - Microsoft Compiled HTML Help
|
|
369
|
+
- [`class`](https://en.wikipedia.org/wiki/Java_class_file) - Java class file
|
|
370
|
+
- [`cpio`](https://en.wikipedia.org/wiki/Cpio) - Cpio archive
|
|
369
371
|
- [`cr2`](https://fileinfo.com/extension/cr2) - Canon Raw image file (v2)
|
|
370
372
|
- [`cr3`](https://fileinfo.com/extension/cr3) - Canon Raw image file (v3)
|
|
371
373
|
- [`crx`](https://developer.chrome.com/extensions/crx) - Google Chrome extension
|
|
@@ -398,6 +400,7 @@ Returns a `Set<string>` of supported MIME types.
|
|
|
398
400
|
- [`ics`](https://en.wikipedia.org/wiki/ICalendar#Data_format) - iCalendar
|
|
399
401
|
- [`indd`](https://en.wikipedia.org/wiki/Adobe_InDesign#File_format) - Adobe InDesign document
|
|
400
402
|
- [`it`](https://wiki.openmpt.org/Manual:_Module_formats#The_Impulse_Tracker_format_.28.it.29) - Audio module format: Impulse Tracker
|
|
403
|
+
- [`j2c`](https://en.wikipedia.org/wiki/JPEG_2000) - JPEG 2000
|
|
401
404
|
- [`jls`](https://en.wikipedia.org/wiki/Lossless_JPEG#JPEG-LS) - Lossless/near-lossless compression standard for continuous-tone images
|
|
402
405
|
- [`jp2`](https://en.wikipedia.org/wiki/JPEG_2000) - JPEG 2000
|
|
403
406
|
- [`jpg`](https://en.wikipedia.org/wiki/JPEG) - Joint Photographic Experts Group image
|
package/supported.js
CHANGED
|
@@ -81,6 +81,7 @@ export const extensions = [
|
|
|
81
81
|
'xlsx',
|
|
82
82
|
'3gp',
|
|
83
83
|
'3g2',
|
|
84
|
+
'j2c',
|
|
84
85
|
'jp2',
|
|
85
86
|
'jpm',
|
|
86
87
|
'jpx',
|
|
@@ -142,6 +143,10 @@ export const extensions = [
|
|
|
142
143
|
'pst',
|
|
143
144
|
'dwg',
|
|
144
145
|
'parquet',
|
|
146
|
+
'class',
|
|
147
|
+
'arj',
|
|
148
|
+
'cpio',
|
|
149
|
+
'ace',
|
|
145
150
|
];
|
|
146
151
|
|
|
147
152
|
export const mimeTypes = [
|
|
@@ -228,6 +233,7 @@ export const mimeTypes = [
|
|
|
228
233
|
'video/mp2t',
|
|
229
234
|
'application/x-blender',
|
|
230
235
|
'image/bpg',
|
|
236
|
+
'image/j2c',
|
|
231
237
|
'image/jp2',
|
|
232
238
|
'image/jpx',
|
|
233
239
|
'image/jpm',
|
|
@@ -283,4 +289,8 @@ export const mimeTypes = [
|
|
|
283
289
|
'application/vnd.ms-outlook',
|
|
284
290
|
'image/vnd.dwg',
|
|
285
291
|
'application/x-parquet',
|
|
292
|
+
'application/java-vm',
|
|
293
|
+
'application/x-arj',
|
|
294
|
+
'application/x-cpio',
|
|
295
|
+
'application/x-ace-compressed',
|
|
286
296
|
];
|