aboutsummaryrefslogtreecommitdiff
path: root/node_modules/archive-type
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/archive-type')
-rw-r--r--node_modules/archive-type/index.js18
-rw-r--r--node_modules/archive-type/license21
-rw-r--r--node_modules/archive-type/node_modules/file-type/index.js545
-rw-r--r--node_modules/archive-type/node_modules/file-type/license21
-rw-r--r--node_modules/archive-type/node_modules/file-type/package.json107
-rw-r--r--node_modules/archive-type/node_modules/file-type/readme.md154
-rw-r--r--node_modules/archive-type/package.json45
-rw-r--r--node_modules/archive-type/readme.md62
8 files changed, 973 insertions, 0 deletions
diff --git a/node_modules/archive-type/index.js b/node_modules/archive-type/index.js
new file mode 100644
index 0000000..c8dcd5b
--- /dev/null
+++ b/node_modules/archive-type/index.js
@@ -0,0 +1,18 @@
+'use strict';
+const fileType = require('file-type');
+
+const exts = new Set([
+ '7z',
+ 'bz2',
+ 'gz',
+ 'rar',
+ 'tar',
+ 'zip',
+ 'xz',
+ 'gz'
+]);
+
+module.exports = input => {
+ const ret = fileType(input);
+ return exts.has(ret && ret.ext) ? ret : null;
+};
diff --git a/node_modules/archive-type/license b/node_modules/archive-type/license
new file mode 100644
index 0000000..a8ecbbe
--- /dev/null
+++ b/node_modules/archive-type/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Kevin Mårtensson <kevinmartensson@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/archive-type/node_modules/file-type/index.js b/node_modules/archive-type/node_modules/file-type/index.js
new file mode 100644
index 0000000..66f2c44
--- /dev/null
+++ b/node_modules/archive-type/node_modules/file-type/index.js
@@ -0,0 +1,545 @@
+'use strict';
+
+module.exports = input => {
+ const buf = new Uint8Array(input);
+
+ if (!(buf && buf.length > 1)) {
+ return null;
+ }
+
+ const check = (header, opts) => {
+ opts = Object.assign({
+ offset: 0
+ }, opts);
+
+ for (let i = 0; i < header.length; i++) {
+ if (header[i] !== buf[i + opts.offset]) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+
+ if (check([0xFF, 0xD8, 0xFF])) {
+ return {
+ ext: 'jpg',
+ mime: 'image/jpeg'
+ };
+ }
+
+ if (check([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) {
+ return {
+ ext: 'png',
+ mime: 'image/png'
+ };
+ }
+
+ if (check([0x47, 0x49, 0x46])) {
+ return {
+ ext: 'gif',
+ mime: 'image/gif'
+ };
+ }
+
+ if (check([0x57, 0x45, 0x42, 0x50], {offset: 8})) {
+ return {
+ ext: 'webp',
+ mime: 'image/webp'
+ };
+ }
+
+ if (check([0x46, 0x4C, 0x49, 0x46])) {
+ return {
+ ext: 'flif',
+ mime: 'image/flif'
+ };
+ }
+
+ // Needs to be before `tif` check
+ if (
+ (check([0x49, 0x49, 0x2A, 0x0]) || check([0x4D, 0x4D, 0x0, 0x2A])) &&
+ check([0x43, 0x52], {offset: 8})
+ ) {
+ return {
+ ext: 'cr2',
+ mime: 'image/x-canon-cr2'
+ };
+ }
+
+ if (
+ check([0x49, 0x49, 0x2A, 0x0]) ||
+ check([0x4D, 0x4D, 0x0, 0x2A])
+ ) {
+ return {
+ ext: 'tif',
+ mime: 'image/tiff'
+ };
+ }
+
+ if (check([0x42, 0x4D])) {
+ return {
+ ext: 'bmp',
+ mime: 'image/bmp'
+ };
+ }
+
+ if (check([0x49, 0x49, 0xBC])) {
+ return {
+ ext: 'jxr',
+ mime: 'image/vnd.ms-photo'
+ };
+ }
+
+ if (check([0x38, 0x42, 0x50, 0x53])) {
+ return {
+ ext: 'psd',
+ mime: 'image/vnd.adobe.photoshop'
+ };
+ }
+
+ // Needs to be before the `zip` check
+ if (
+ check([0x50, 0x4B, 0x3, 0x4]) &&
+ check([0x6D, 0x69, 0x6D, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2F, 0x65, 0x70, 0x75, 0x62, 0x2B, 0x7A, 0x69, 0x70], {offset: 30})
+ ) {
+ return {
+ ext: 'epub',
+ mime: 'application/epub+zip'
+ };
+ }
+
+ // Needs to be before `zip` check
+ // Assumes signed `.xpi` from addons.mozilla.org
+ if (
+ check([0x50, 0x4B, 0x3, 0x4]) &&
+ check([0x4D, 0x45, 0x54, 0x41, 0x2D, 0x49, 0x4E, 0x46, 0x2F, 0x6D, 0x6F, 0x7A, 0x69, 0x6C, 0x6C, 0x61, 0x2E, 0x72, 0x73, 0x61], {offset: 30})
+ ) {
+ return {
+ ext: 'xpi',
+ mime: 'application/x-xpinstall'
+ };
+ }
+
+ if (
+ check([0x50, 0x4B]) &&
+ (buf[2] === 0x3 || buf[2] === 0x5 || buf[2] === 0x7) &&
+ (buf[3] === 0x4 || buf[3] === 0x6 || buf[3] === 0x8)
+ ) {
+ return {
+ ext: 'zip',
+ mime: 'application/zip'
+ };
+ }
+
+ if (check([0x75, 0x73, 0x74, 0x61, 0x72], {offset: 257})) {
+ return {
+ ext: 'tar',
+ mime: 'application/x-tar'
+ };
+ }
+
+ if (
+ check([0x52, 0x61, 0x72, 0x21, 0x1A, 0x7]) &&
+ (buf[6] === 0x0 || buf[6] === 0x1)
+ ) {
+ return {
+ ext: 'rar',
+ mime: 'application/x-rar-compressed'
+ };
+ }
+
+ if (check([0x1F, 0x8B, 0x8])) {
+ return {
+ ext: 'gz',
+ mime: 'application/gzip'
+ };
+ }
+
+ if (check([0x42, 0x5A, 0x68])) {
+ return {
+ ext: 'bz2',
+ mime: 'application/x-bzip2'
+ };
+ }
+
+ if (check([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) {
+ return {
+ ext: '7z',
+ mime: 'application/x-7z-compressed'
+ };
+ }
+
+ if (check([0x78, 0x01])) {
+ return {
+ ext: 'dmg',
+ mime: 'application/x-apple-diskimage'
+ };
+ }
+
+ if (
+ (
+ check([0x0, 0x0, 0x0]) &&
+ (buf[3] === 0x18 || buf[3] === 0x20) &&
+ check([0x66, 0x74, 0x79, 0x70], {offset: 4})
+ ) ||
+ check([0x33, 0x67, 0x70, 0x35]) ||
+ (
+ check([0x0, 0x0, 0x0, 0x1C, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32]) &&
+ check([0x6D, 0x70, 0x34, 0x31, 0x6D, 0x70, 0x34, 0x32, 0x69, 0x73, 0x6F, 0x6D], {offset: 16})
+ ) ||
+ check([0x0, 0x0, 0x0, 0x1C, 0x66, 0x74, 0x79, 0x70, 0x69, 0x73, 0x6F, 0x6D]) ||
+ check([0x0, 0x0, 0x0, 0x1C, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32, 0x0, 0x0, 0x0, 0x0])
+ ) {
+ return {
+ ext: 'mp4',
+ mime: 'video/mp4'
+ };
+ }
+
+ if (check([0x0, 0x0, 0x0, 0x1C, 0x66, 0x74, 0x79, 0x70, 0x4D, 0x34, 0x56])) {
+ return {
+ ext: 'm4v',
+ mime: 'video/x-m4v'
+ };
+ }
+
+ if (check([0x4D, 0x54, 0x68, 0x64])) {
+ return {
+ ext: 'mid',
+ mime: 'audio/midi'
+ };
+ }
+
+ // https://github.com/threatstack/libmagic/blob/master/magic/Magdir/matroska
+ if (check([0x1A, 0x45, 0xDF, 0xA3])) {
+ const sliced = buf.subarray(4, 4 + 4096);
+ const idPos = sliced.findIndex((el, i, arr) => arr[i] === 0x42 && arr[i + 1] === 0x82);
+
+ if (idPos >= 0) {
+ const docTypePos = idPos + 3;
+ const findDocType = type => Array.from(type).every((c, i) => sliced[docTypePos + i] === c.charCodeAt(0));
+
+ if (findDocType('matroska')) {
+ return {
+ ext: 'mkv',
+ mime: 'video/x-matroska'
+ };
+ }
+
+ if (findDocType('webm')) {
+ return {
+ ext: 'webm',
+ mime: 'video/webm'
+ };
+ }
+ }
+ }
+
+ if (check([0x0, 0x0, 0x0, 0x14, 0x66, 0x74, 0x79, 0x70, 0x71, 0x74, 0x20, 0x20]) ||
+ check([0x66, 0x72, 0x65, 0x65], {offset: 4}) ||
+ check([0x66, 0x74, 0x79, 0x70, 0x71, 0x74, 0x20, 0x20], {offset: 4}) ||
+ check([0x6D, 0x64, 0x61, 0x74], {offset: 4}) || // MJPEG
+ check([0x77, 0x69, 0x64, 0x65], {offset: 4})) {
+ return {
+ ext: 'mov',
+ mime: 'video/quicktime'
+ };
+ }
+
+ if (
+ check([0x52, 0x49, 0x46, 0x46]) &&
+ check([0x41, 0x56, 0x49], {offset: 8})
+ ) {
+ return {
+ ext: 'avi',
+ mime: 'video/x-msvideo'
+ };
+ }
+
+ if (check([0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9])) {
+ return {
+ ext: 'wmv',
+ mime: 'video/x-ms-wmv'
+ };
+ }
+
+ if (check([0x0, 0x0, 0x1, 0xBA])) {
+ return {
+ ext: 'mpg',
+ mime: 'video/mpeg'
+ };
+ }
+
+ if (
+ check([0x49, 0x44, 0x33]) ||
+ check([0xFF, 0xFB])
+ ) {
+ return {
+ ext: 'mp3',
+ mime: 'audio/mpeg'
+ };
+ }
+
+ if (
+ check([0x66, 0x74, 0x79, 0x70, 0x4D, 0x34, 0x41], {offset: 4}) ||
+ check([0x4D, 0x34, 0x41, 0x20])
+ ) {
+ return {
+ ext: 'm4a',
+ mime: 'audio/m4a'
+ };
+ }
+
+ // Needs to be before `ogg` check
+ if (check([0x4F, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64], {offset: 28})) {
+ return {
+ ext: 'opus',
+ mime: 'audio/opus'
+ };
+ }
+
+ if (check([0x4F, 0x67, 0x67, 0x53])) {
+ return {
+ ext: 'ogg',
+ mime: 'audio/ogg'
+ };
+ }
+
+ if (check([0x66, 0x4C, 0x61, 0x43])) {
+ return {
+ ext: 'flac',
+ mime: 'audio/x-flac'
+ };
+ }
+
+ if (
+ check([0x52, 0x49, 0x46, 0x46]) &&
+ check([0x57, 0x41, 0x56, 0x45], {offset: 8})
+ ) {
+ return {
+ ext: 'wav',
+ mime: 'audio/x-wav'
+ };
+ }
+
+ if (check([0x23, 0x21, 0x41, 0x4D, 0x52, 0x0A])) {
+ return {
+ ext: 'amr',
+ mime: 'audio/amr'
+ };
+ }
+
+ if (check([0x25, 0x50, 0x44, 0x46])) {
+ return {
+ ext: 'pdf',
+ mime: 'application/pdf'
+ };
+ }
+
+ if (check([0x4D, 0x5A])) {
+ return {
+ ext: 'exe',
+ mime: 'application/x-msdownload'
+ };
+ }
+
+ if (
+ (buf[0] === 0x43 || buf[0] === 0x46) &&
+ check([0x57, 0x53], {offset: 1})
+ ) {
+ return {
+ ext: 'swf',
+ mime: 'application/x-shockwave-flash'
+ };
+ }
+
+ if (check([0x7B, 0x5C, 0x72, 0x74, 0x66])) {
+ return {
+ ext: 'rtf',
+ mime: 'application/rtf'
+ };
+ }
+
+ if (check([0x00, 0x61, 0x73, 0x6D])) {
+ return {
+ ext: 'wasm',
+ mime: 'application/wasm'
+ };
+ }
+
+ if (
+ check([0x77, 0x4F, 0x46, 0x46]) &&
+ (
+ check([0x00, 0x01, 0x00, 0x00], {offset: 4}) ||
+ check([0x4F, 0x54, 0x54, 0x4F], {offset: 4})
+ )
+ ) {
+ return {
+ ext: 'woff',
+ mime: 'application/font-woff'
+ };
+ }
+
+ if (
+ check([0x77, 0x4F, 0x46, 0x32]) &&
+ (
+ check([0x00, 0x01, 0x00, 0x00], {offset: 4}) ||
+ check([0x4F, 0x54, 0x54, 0x4F], {offset: 4})
+ )
+ ) {
+ return {
+ ext: 'woff2',
+ mime: 'application/font-woff'
+ };
+ }
+
+ if (
+ check([0x4C, 0x50], {offset: 34}) &&
+ (
+ check([0x00, 0x00, 0x01], {offset: 8}) ||
+ check([0x01, 0x00, 0x02], {offset: 8}) ||
+ check([0x02, 0x00, 0x02], {offset: 8})
+ )
+ ) {
+ return {
+ ext: 'eot',
+ mime: 'application/octet-stream'
+ };
+ }
+
+ if (check([0x00, 0x01, 0x00, 0x00, 0x00])) {
+ return {
+ ext: 'ttf',
+ mime: 'application/font-sfnt'
+ };
+ }
+
+ if (check([0x4F, 0x54, 0x54, 0x4F, 0x00])) {
+ return {
+ ext: 'otf',
+ mime: 'application/font-sfnt'
+ };
+ }
+
+ if (check([0x00, 0x00, 0x01, 0x00])) {
+ return {
+ ext: 'ico',
+ mime: 'image/x-icon'
+ };
+ }
+
+ if (check([0x46, 0x4C, 0x56, 0x01])) {
+ return {
+ ext: 'flv',
+ mime: 'video/x-flv'
+ };
+ }
+
+ if (check([0x25, 0x21])) {
+ return {
+ ext: 'ps',
+ mime: 'application/postscript'
+ };
+ }
+
+ if (check([0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00])) {
+ return {
+ ext: 'xz',
+ mime: 'application/x-xz'
+ };
+ }
+
+ if (check([0x53, 0x51, 0x4C, 0x69])) {
+ return {
+ ext: 'sqlite',
+ mime: 'application/x-sqlite3'
+ };
+ }
+
+ if (check([0x4E, 0x45, 0x53, 0x1A])) {
+ return {
+ ext: 'nes',
+ mime: 'application/x-nintendo-nes-rom'
+ };
+ }
+
+ if (check([0x43, 0x72, 0x32, 0x34])) {
+ return {
+ ext: 'crx',
+ mime: 'application/x-google-chrome-extension'
+ };
+ }
+
+ if (
+ check([0x4D, 0x53, 0x43, 0x46]) ||
+ check([0x49, 0x53, 0x63, 0x28])
+ ) {
+ return {
+ ext: 'cab',
+ mime: 'application/vnd.ms-cab-compressed'
+ };
+ }
+
+ // Needs to be before `ar` check
+ if (check([0x21, 0x3C, 0x61, 0x72, 0x63, 0x68, 0x3E, 0x0A, 0x64, 0x65, 0x62, 0x69, 0x61, 0x6E, 0x2D, 0x62, 0x69, 0x6E, 0x61, 0x72, 0x79])) {
+ return {
+ ext: 'deb',
+ mime: 'application/x-deb'
+ };
+ }
+
+ if (check([0x21, 0x3C, 0x61, 0x72, 0x63, 0x68, 0x3E])) {
+ return {
+ ext: 'ar',
+ mime: 'application/x-unix-archive'
+ };
+ }
+
+ if (check([0xED, 0xAB, 0xEE, 0xDB])) {
+ return {
+ ext: 'rpm',
+ mime: 'application/x-rpm'
+ };
+ }
+
+ if (
+ check([0x1F, 0xA0]) ||
+ check([0x1F, 0x9D])
+ ) {
+ return {
+ ext: 'Z',
+ mime: 'application/x-compress'
+ };
+ }
+
+ if (check([0x4C, 0x5A, 0x49, 0x50])) {
+ return {
+ ext: 'lz',
+ mime: 'application/x-lzip'
+ };
+ }
+
+ if (check([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) {
+ return {
+ ext: 'msi',
+ mime: 'application/x-msi'
+ };
+ }
+
+ if (check([0x06, 0x0E, 0x2B, 0x34, 0x02, 0x05, 0x01, 0x01, 0x0D, 0x01, 0x02, 0x01, 0x01, 0x02])) {
+ return {
+ ext: 'mxf',
+ mime: 'application/mxf'
+ };
+ }
+
+ if (check([0x42, 0x4C, 0x45, 0x4E, 0x44, 0x45, 0x52])) {
+ return {
+ ext: 'blend',
+ mime: 'application/x-blender'
+ };
+ }
+
+ return null;
+};
diff --git a/node_modules/archive-type/node_modules/file-type/license b/node_modules/archive-type/node_modules/file-type/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/archive-type/node_modules/file-type/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/archive-type/node_modules/file-type/package.json b/node_modules/archive-type/node_modules/file-type/package.json
new file mode 100644
index 0000000..9175dbc
--- /dev/null
+++ b/node_modules/archive-type/node_modules/file-type/package.json
@@ -0,0 +1,107 @@
+{
+ "name": "file-type",
+ "version": "4.4.0",
+ "description": "Detect the file type of a Buffer/Uint8Array",
+ "license": "MIT",
+ "repository": "sindresorhus/file-type",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "mime",
+ "file",
+ "type",
+ "archive",
+ "image",
+ "img",
+ "pic",
+ "picture",
+ "flash",
+ "photo",
+ "video",
+ "type",
+ "detect",
+ "check",
+ "is",
+ "exif",
+ "exe",
+ "binary",
+ "buffer",
+ "uint8array",
+ "jpg",
+ "png",
+ "gif",
+ "webp",
+ "flif",
+ "cr2",
+ "tif",
+ "bmp",
+ "jxr",
+ "psd",
+ "zip",
+ "tar",
+ "rar",
+ "gz",
+ "bz2",
+ "7z",
+ "dmg",
+ "mp4",
+ "m4v",
+ "mid",
+ "mkv",
+ "webm",
+ "mov",
+ "avi",
+ "mpg",
+ "mp3",
+ "m4a",
+ "ogg",
+ "opus",
+ "flac",
+ "wav",
+ "amr",
+ "pdf",
+ "epub",
+ "exe",
+ "swf",
+ "rtf",
+ "woff",
+ "woff2",
+ "eot",
+ "ttf",
+ "otf",
+ "ico",
+ "flv",
+ "ps",
+ "xz",
+ "sqlite",
+ "xpi",
+ "cab",
+ "deb",
+ "ar",
+ "rpm",
+ "Z",
+ "lz",
+ "msi",
+ "mxf",
+ "wasm",
+ "webassembly",
+ "blend"
+ ],
+ "devDependencies": {
+ "ava": "*",
+ "read-chunk": "^2.0.0",
+ "xo": "*"
+ }
+}
diff --git a/node_modules/archive-type/node_modules/file-type/readme.md b/node_modules/archive-type/node_modules/file-type/readme.md
new file mode 100644
index 0000000..d09f1de
--- /dev/null
+++ b/node_modules/archive-type/node_modules/file-type/readme.md
@@ -0,0 +1,154 @@
+# file-type [![Build Status](https://travis-ci.org/sindresorhus/file-type.svg?branch=master)](https://travis-ci.org/sindresorhus/file-type)
+
+> Detect the file type of a Buffer/Uint8Array
+
+The file type is detected by checking the [magic number](http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files) of the buffer.
+
+
+## Install
+
+```
+$ npm install --save file-type
+```
+
+
+## Usage
+
+##### Node.js
+
+```js
+const readChunk = require('read-chunk');
+const fileType = require('file-type');
+const buffer = readChunk.sync('unicorn.png', 0, 4100);
+
+fileType(buffer);
+//=> {ext: 'png', mime: 'image/png'}
+```
+
+Or from a remote location:
+
+```js
+const http = require('http');
+const fileType = require('file-type');
+const url = 'http://assets-cdn.github.com/images/spinners/octocat-spinner-32.gif';
+
+http.get(url, res => {
+ res.once('data', chunk => {
+ res.destroy();
+ console.log(fileType(chunk));
+ //=> {ext: 'gif', mime: 'image/gif'}
+ });
+});
+```
+
+##### Browser
+
+```js
+const xhr = new XMLHttpRequest();
+xhr.open('GET', 'unicorn.png');
+xhr.responseType = 'arraybuffer';
+
+xhr.onload = () => {
+ fileType(new Uint8Array(this.response));
+ //=> {ext: 'png', mime: 'image/png'}
+};
+
+xhr.send();
+```
+
+
+## API
+
+### fileType(input)
+
+Returns an `Object` with:
+
+- `ext` - One of the [supported file types](#supported-file-types)
+- `mime` - The [MIME type](http://en.wikipedia.org/wiki/Internet_media_type)
+
+Or `null` when no match.
+
+#### input
+
+Type: `Buffer` `Uint8Array`
+
+It only needs the first 4100 bytes.
+
+
+## Supported file types
+
+- [`jpg`](https://en.wikipedia.org/wiki/JPEG)
+- [`png`](https://en.wikipedia.org/wiki/Portable_Network_Graphics)
+- [`gif`](https://en.wikipedia.org/wiki/GIF)
+- [`webp`](https://en.wikipedia.org/wiki/WebP)
+- [`flif`](https://en.wikipedia.org/wiki/Free_Lossless_Image_Format)
+- [`cr2`](http://fileinfo.com/extension/cr2)
+- [`tif`](https://en.wikipedia.org/wiki/Tagged_Image_File_Format)
+- [`bmp`](https://en.wikipedia.org/wiki/BMP_file_format)
+- [`jxr`](https://en.wikipedia.org/wiki/JPEG_XR)
+- [`psd`](https://en.wikipedia.org/wiki/Adobe_Photoshop#File_format)
+- [`zip`](https://en.wikipedia.org/wiki/Zip_(file_format))
+- [`tar`](https://en.wikipedia.org/wiki/Tar_(computing)#File_format)
+- [`rar`](https://en.wikipedia.org/wiki/RAR_(file_format))
+- [`gz`](https://en.wikipedia.org/wiki/Gzip)
+- [`bz2`](https://en.wikipedia.org/wiki/Bzip2)
+- [`7z`](https://en.wikipedia.org/wiki/7z)
+- [`dmg`](https://en.wikipedia.org/wiki/Apple_Disk_Image)
+- [`mp4`](https://en.wikipedia.org/wiki/MPEG-4_Part_14#Filename_extensions)
+- [`m4v`](https://en.wikipedia.org/wiki/M4V)
+- [`mid`](https://en.wikipedia.org/wiki/MIDI)
+- [`mkv`](https://en.wikipedia.org/wiki/Matroska)
+- [`webm`](https://en.wikipedia.org/wiki/WebM)
+- [`mov`](https://en.wikipedia.org/wiki/QuickTime_File_Format)
+- [`avi`](https://en.wikipedia.org/wiki/Audio_Video_Interleave)
+- [`wmv`](https://en.wikipedia.org/wiki/Windows_Media_Video)
+- [`mpg`](https://en.wikipedia.org/wiki/MPEG-1)
+- [`mp3`](https://en.wikipedia.org/wiki/MP3)
+- [`m4a`](https://en.wikipedia.org/wiki/MPEG-4_Part_14#.MP4_versus_.M4A)
+- [`ogg`](https://en.wikipedia.org/wiki/Ogg)
+- [`opus`](https://en.wikipedia.org/wiki/Opus_(audio_format))
+- [`flac`](https://en.wikipedia.org/wiki/FLAC)
+- [`wav`](https://en.wikipedia.org/wiki/WAV)
+- [`amr`](https://en.wikipedia.org/wiki/Adaptive_Multi-Rate_audio_codec)
+- [`pdf`](https://en.wikipedia.org/wiki/Portable_Document_Format)
+- [`epub`](https://en.wikipedia.org/wiki/EPUB)
+- [`exe`](https://en.wikipedia.org/wiki/.exe)
+- [`swf`](https://en.wikipedia.org/wiki/SWF)
+- [`rtf`](https://en.wikipedia.org/wiki/Rich_Text_Format)
+- [`woff`](https://en.wikipedia.org/wiki/Web_Open_Font_Format)
+- [`woff2`](https://en.wikipedia.org/wiki/Web_Open_Font_Format)
+- [`eot`](https://en.wikipedia.org/wiki/Embedded_OpenType)
+- [`ttf`](https://en.wikipedia.org/wiki/TrueType)
+- [`otf`](https://en.wikipedia.org/wiki/OpenType)
+- [`ico`](https://en.wikipedia.org/wiki/ICO_(file_format))
+- [`flv`](https://en.wikipedia.org/wiki/Flash_Video)
+- [`ps`](https://en.wikipedia.org/wiki/Postscript)
+- [`xz`](https://en.wikipedia.org/wiki/Xz)
+- [`sqlite`](https://www.sqlite.org/fileformat2.html)
+- [`nes`](http://fileinfo.com/extension/nes)
+- [`crx`](https://developer.chrome.com/extensions/crx)
+- [`xpi`](https://en.wikipedia.org/wiki/XPInstall)
+- [`cab`](https://en.wikipedia.org/wiki/Cabinet_(file_format))
+- [`deb`](https://en.wikipedia.org/wiki/Deb_(file_format))
+- [`ar`](https://en.wikipedia.org/wiki/Ar_(Unix))
+- [`rpm`](http://fileinfo.com/extension/rpm)
+- [`Z`](http://fileinfo.com/extension/z)
+- [`lz`](https://en.wikipedia.org/wiki/Lzip)
+- [`msi`](https://en.wikipedia.org/wiki/Windows_Installer)
+- [`mxf`](https://en.wikipedia.org/wiki/Material_Exchange_Format)
+- [`wasm`](https://en.wikipedia.org/wiki/WebAssembly)
+- [`blend`](https://wiki.blender.org/index.php/Dev:Source/Architecture/File_Format)
+
+*SVG isn't included as it requires the whole file to be read, but you can get it [here](https://github.com/sindresorhus/is-svg).*
+
+*Pull request welcome for additional commonly used file types.*
+
+
+## Related
+
+- [file-type-cli](https://github.com/sindresorhus/file-type-cli) - CLI for this module
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/archive-type/package.json b/node_modules/archive-type/package.json
new file mode 100644
index 0000000..b57b03a
--- /dev/null
+++ b/node_modules/archive-type/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "archive-type",
+ "version": "4.0.0",
+ "description": "Detect the archive type of a Buffer/Uint8Array",
+ "license": "MIT",
+ "repository": "kevva/archive-type",
+ "author": {
+ "name": "Kevin Mårtensson",
+ "email": "kevinmartensson@gmail.com",
+ "url": "https://github.com/kevva"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "7zip",
+ "archive",
+ "buffer",
+ "bz2",
+ "bzip2",
+ "check",
+ "detect",
+ "gz",
+ "gzip",
+ "mime",
+ "rar",
+ "zip",
+ "file",
+ "type"
+ ],
+ "dependencies": {
+ "file-type": "^4.2.0"
+ },
+ "devDependencies": {
+ "ava": "*",
+ "pify": "^2.3.0",
+ "xo": "*"
+ }
+}
diff --git a/node_modules/archive-type/readme.md b/node_modules/archive-type/readme.md
new file mode 100644
index 0000000..7549511
--- /dev/null
+++ b/node_modules/archive-type/readme.md
@@ -0,0 +1,62 @@
+# archive-type [![Build Status](https://travis-ci.org/kevva/archive-type.svg?branch=master)](https://travis-ci.org/kevva/archive-type)
+
+> Detect the archive type of a Buffer/Uint8Array
+
+
+## Install
+
+```
+$ npm install --save archive-type
+```
+
+
+## Usage
+
+```js
+const archiveType = require('archive-type');
+const readChunk = require('read-chunk');
+const buffer = readChunk.sync('unicorn.zip', 0, 262);
+
+archiveType(buffer);
+//=> {ext: 'zip', mime: 'application/zip'}
+```
+
+
+## API
+
+### archiveType(input)
+
+Returns an `Object` with:
+
+- `ext` - One of the [supported file types](#supported-file-types)
+- `mime` - The [MIME type](http://en.wikipedia.org/wiki/Internet_media_type)
+
+Or `null` when no match.
+
+#### input
+
+Type: `Buffer` `Uint8Array`
+
+It only needs the first 262 bytes.
+
+
+## Supported file types
+
+- `7z`
+- `bz2`
+- `gz`
+- `rar`
+- `tar`
+- `zip`
+- `xz`
+- `gz`
+
+
+## Related
+
+- [archive-type-cli](https://github.com/kevva/archive-type-cli) - CLI for this module
+
+
+## License
+
+MIT © [Kevin Mårtensson](https://github.com/kevva)