diff options
Diffstat (limited to 'desktop/node_modules/isbinaryfile')
-rw-r--r-- | desktop/node_modules/isbinaryfile/LICENSE.txt | 22 | ||||
-rw-r--r-- | desktop/node_modules/isbinaryfile/README.md | 70 | ||||
-rw-r--r-- | desktop/node_modules/isbinaryfile/lib/index.d.ts | 3 | ||||
-rw-r--r-- | desktop/node_modules/isbinaryfile/lib/index.js | 235 | ||||
-rw-r--r-- | desktop/node_modules/isbinaryfile/package.json | 64 |
5 files changed, 394 insertions, 0 deletions
diff --git a/desktop/node_modules/isbinaryfile/LICENSE.txt b/desktop/node_modules/isbinaryfile/LICENSE.txt new file mode 100644 index 0000000..e5bf8e8 --- /dev/null +++ b/desktop/node_modules/isbinaryfile/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2019 Garen J. Torikian + +MIT License + +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/desktop/node_modules/isbinaryfile/README.md b/desktop/node_modules/isbinaryfile/README.md new file mode 100644 index 0000000..cd057ad --- /dev/null +++ b/desktop/node_modules/isbinaryfile/README.md @@ -0,0 +1,70 @@ +# isBinaryFile + +Detects if a file is binary in Node.js using ✨promises✨. Similar to [Perl's `-B` switch](http://stackoverflow.com/questions/899206/how-does-perl-know-a-file-is-binary), in that: +- it reads the first few thousand bytes of a file +- checks for a `null` byte; if it's found, it's binary +- flags non-ASCII characters. After a certain number of "weird" characters, the file is flagged as binary + +Much of the logic is pretty much ported from [ag](https://github.com/ggreer/the_silver_searcher). + +Note: if the file doesn't exist or is a directory, an error is thrown. + +## Installation + +``` +npm install isbinaryfile +``` + +## Usage + +Returns `Promise<boolean>` (or just `boolean` for `*Sync`). `true` if the file is binary, `false` otherwise. + +### isBinaryFile(filepath) + +* `filepath` - a `string` indicating the path to the file. + +### isBinaryFile(bytes[, size]) + +* `bytes` - a `Buffer` of the file's contents. +* `size` - an optional `number` indicating the file size. + +### isBinaryFileSync(filepath) + +* `filepath` - a `string` indicating the path to the file. + + +### isBinaryFileSync(bytes[, size]) + +* `bytes` - a `Buffer` of the file's contents. +* `size` - an optional `number` indicating the file size. + +### Examples + +Here's an arbitrary usage: + +```javascript +const isBinaryFile = require("isbinaryfile").isBinaryFile; +const fs = require("fs"); + +const filename = "fixtures/pdf.pdf"; +const data = fs.readFileSync(filename); +const stat = fs.lstatSync(filename); + +isBinaryFile(data, stat.size).then((result) => { + if (result) { + console.log("It is binary!") + } + else { + console.log("No it is not.") + } +}); + +const isBinaryFileSync = require("isbinaryfile").isBinaryFileSync; +const bytes = fs.readFileSync(filename); +const size = fs.lstatSync(filename).size; +console.log(isBinaryFileSync(bytes, size)); // true or false +``` + +## Testing + +Run `npm install`, then run `npm test`. diff --git a/desktop/node_modules/isbinaryfile/lib/index.d.ts b/desktop/node_modules/isbinaryfile/lib/index.d.ts new file mode 100644 index 0000000..1e8aacd --- /dev/null +++ b/desktop/node_modules/isbinaryfile/lib/index.d.ts @@ -0,0 +1,3 @@ +/// <reference types="node" /> +export declare function isBinaryFile(file: string | Buffer, size?: number): Promise<boolean>; +export declare function isBinaryFileSync(file: string | Buffer, size?: number): boolean; diff --git a/desktop/node_modules/isbinaryfile/lib/index.js b/desktop/node_modules/isbinaryfile/lib/index.js new file mode 100644 index 0000000..349fe7f --- /dev/null +++ b/desktop/node_modules/isbinaryfile/lib/index.js @@ -0,0 +1,235 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isBinaryFileSync = exports.isBinaryFile = void 0; +const fs = require("fs"); +const util_1 = require("util"); +const statAsync = util_1.promisify(fs.stat); +const openAsync = util_1.promisify(fs.open); +const closeAsync = util_1.promisify(fs.close); +const MAX_BYTES = 512; +// A very basic non-exception raising reader. Read bytes and +// at the end use hasError() to check whether this worked. +class Reader { + constructor(fileBuffer, size) { + this.fileBuffer = fileBuffer; + this.size = size; + this.offset = 0; + this.error = false; + } + hasError() { + return this.error; + } + nextByte() { + if (this.offset === this.size || this.hasError()) { + this.error = true; + return 0xff; + } + return this.fileBuffer[this.offset++]; + } + next(len) { + const n = new Array(); + for (let i = 0; i < len; i++) { + n[i] = this.nextByte(); + } + return n; + } +} +// Read a Google Protobuf var(iable)int from the buffer. +function readProtoVarInt(reader) { + let idx = 0; + let varInt = 0; + while (!reader.hasError()) { + const b = reader.nextByte(); + varInt = varInt | ((b & 0x7f) << (7 * idx)); + if ((b & 0x80) === 0) { + break; + } + idx++; + } + return varInt; +} +// Attempt to taste a full Google Protobuf message. +function readProtoMessage(reader) { + const varInt = readProtoVarInt(reader); + const wireType = varInt & 0x7; + switch (wireType) { + case 0: + readProtoVarInt(reader); + return true; + case 1: + reader.next(8); + return true; + case 2: + const len = readProtoVarInt(reader); + reader.next(len); + return true; + case 5: + reader.next(4); + return true; + } + return false; +} +// Check whether this seems to be a valid protobuf file. +function isBinaryProto(fileBuffer, totalBytes) { + const reader = new Reader(fileBuffer, totalBytes); + let numMessages = 0; + while (true) { + // Definitely not a valid protobuf + if (!readProtoMessage(reader) && !reader.hasError()) { + return false; + } + // Short read? + if (reader.hasError()) { + break; + } + numMessages++; + } + return numMessages > 0; +} +function isBinaryFile(file, size) { + return __awaiter(this, void 0, void 0, function* () { + if (isString(file)) { + const stat = yield statAsync(file); + isStatFile(stat); + const fileDescriptor = yield openAsync(file, 'r'); + const allocBuffer = Buffer.alloc(MAX_BYTES); + // Read the file with no encoding for raw buffer access. + // NB: something is severely wrong with promisify, had to construct my own Promise + return new Promise((fulfill, reject) => { + fs.read(fileDescriptor, allocBuffer, 0, MAX_BYTES, 0, (err, bytesRead, _) => { + closeAsync(fileDescriptor); + if (err) { + reject(err); + } + else { + fulfill(isBinaryCheck(allocBuffer, bytesRead)); + } + }); + }); + } + else { + if (size === undefined) { + size = file.length; + } + return isBinaryCheck(file, size); + } + }); +} +exports.isBinaryFile = isBinaryFile; +function isBinaryFileSync(file, size) { + if (isString(file)) { + const stat = fs.statSync(file); + isStatFile(stat); + const fileDescriptor = fs.openSync(file, 'r'); + const allocBuffer = Buffer.alloc(MAX_BYTES); + const bytesRead = fs.readSync(fileDescriptor, allocBuffer, 0, MAX_BYTES, 0); + fs.closeSync(fileDescriptor); + return isBinaryCheck(allocBuffer, bytesRead); + } + else { + if (size === undefined) { + size = file.length; + } + return isBinaryCheck(file, size); + } +} +exports.isBinaryFileSync = isBinaryFileSync; +function isBinaryCheck(fileBuffer, bytesRead) { + // empty file. no clue what it is. + if (bytesRead === 0) { + return false; + } + let suspiciousBytes = 0; + const totalBytes = Math.min(bytesRead, MAX_BYTES); + // UTF-8 BOM + if (bytesRead >= 3 && fileBuffer[0] === 0xef && fileBuffer[1] === 0xbb && fileBuffer[2] === 0xbf) { + return false; + } + // UTF-32 BOM + if (bytesRead >= 4 && + fileBuffer[0] === 0x00 && + fileBuffer[1] === 0x00 && + fileBuffer[2] === 0xfe && + fileBuffer[3] === 0xff) { + return false; + } + // UTF-32 LE BOM + if (bytesRead >= 4 && + fileBuffer[0] === 0xff && + fileBuffer[1] === 0xfe && + fileBuffer[2] === 0x00 && + fileBuffer[3] === 0x00) { + return false; + } + // GB BOM + if (bytesRead >= 4 && + fileBuffer[0] === 0x84 && + fileBuffer[1] === 0x31 && + fileBuffer[2] === 0x95 && + fileBuffer[3] === 0x33) { + return false; + } + if (totalBytes >= 5 && fileBuffer.slice(0, 5).toString() === '%PDF-') { + /* PDF. This is binary. */ + return true; + } + // UTF-16 BE BOM + if (bytesRead >= 2 && fileBuffer[0] === 0xfe && fileBuffer[1] === 0xff) { + return false; + } + // UTF-16 LE BOM + if (bytesRead >= 2 && fileBuffer[0] === 0xff && fileBuffer[1] === 0xfe) { + return false; + } + for (let i = 0; i < totalBytes; i++) { + if (fileBuffer[i] === 0) { + // NULL byte--it's binary! + return true; + } + else if ((fileBuffer[i] < 7 || fileBuffer[i] > 14) && (fileBuffer[i] < 32 || fileBuffer[i] > 127)) { + // UTF-8 detection + if (fileBuffer[i] > 193 && fileBuffer[i] < 224 && i + 1 < totalBytes) { + i++; + if (fileBuffer[i] > 127 && fileBuffer[i] < 192) { + continue; + } + } + else if (fileBuffer[i] > 223 && fileBuffer[i] < 240 && i + 2 < totalBytes) { + i++; + if (fileBuffer[i] > 127 && fileBuffer[i] < 192 && fileBuffer[i + 1] > 127 && fileBuffer[i + 1] < 192) { + i++; + continue; + } + } + suspiciousBytes++; + // Read at least 32 fileBuffer before making a decision + if (i >= 32 && (suspiciousBytes * 100) / totalBytes > 10) { + return true; + } + } + } + if ((suspiciousBytes * 100) / totalBytes > 10) { + return true; + } + if (suspiciousBytes > 1 && isBinaryProto(fileBuffer, totalBytes)) { + return true; + } + return false; +} +function isString(x) { + return typeof x === 'string'; +} +function isStatFile(stat) { + if (!stat.isFile()) { + throw new Error(`Path provided was not a file!`); + } +} diff --git a/desktop/node_modules/isbinaryfile/package.json b/desktop/node_modules/isbinaryfile/package.json new file mode 100644 index 0000000..9fbedbd --- /dev/null +++ b/desktop/node_modules/isbinaryfile/package.json @@ -0,0 +1,64 @@ +{ + "name": "isbinaryfile", + "description": "Detects if a file is binary in Node.js. Similar to Perl's -B.", + "version": "4.0.10", + "keywords": [ + "text", + "binary", + "encoding", + "istext", + "is text", + "isbinary", + "is binary", + "is text or binary", + "is text or binary file", + "isbinaryfile", + "is binary file", + "istextfile", + "is text file" + ], + "devDependencies": { + "@types/jest": "^23.3.14", + "@types/node": "^10.17.59", + "jest": "^26.5.5", + "prettier": "^1.19.1", + "release-it": "^14.13.1", + "ts-jest": "^26.5.5", + "tslint": "^5.20.1", + "tslint-config-prettier": "^1.18.0", + "typescript": "^3.9.9" + }, + "engines": { + "node": ">= 8.0.0" + }, + "files": [ + "lib/**/*" + ], + "license": "MIT", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "maintainers": [ + { + "name": "Garen J. Torikian", + "email": "gjtorikian@gmail.com" + } + ], + "funding": "https://github.com/sponsors/gjtorikian/", + "repository": { + "type": "git", + "url": "https://github.com/gjtorikian/isBinaryFile" + }, + "scripts": { + "build": "tsc", + "format": "prettier --write \"src/**/*.ts\" \"src/**/*.js\" && tslint --fix -c tslint.json 'src/**/*.ts'", + "lint": "tslint -p tsconfig.json", + "prepare": "npm run build", + "release": "release-it", + "prepublishOnly": "npm test && npm run lint", + "preversion": "npm run lint", + "version": "npm run format && git add -A src", + "postversion": "git push && git push --tags", + "test": "jest --config jestconfig.json", + "watch": "tsc -w" + } +} |