From 95b5a89611cd525e08a492e9ec52c1ee0b96eef9 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Mon, 29 Jun 2020 21:50:15 -0400 Subject: [PATCH 01/42] add native AES file encryption --- README.md | 2 + index.js | 43 +- package-lock.json | 848 ++++++++++++++++++++++++++++++++++++++ spec/secureFiles.spec.js | 41 ++ spec/support/jasmine.json | 3 +- spec/test.spec.js | 2 +- 6 files changed, 935 insertions(+), 4 deletions(-) create mode 100644 package-lock.json create mode 100644 spec/secureFiles.spec.js diff --git a/README.md b/README.md index 900c568..5470306 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ parse-server file system storage adapter "module": "@parse/fs-files-adapter", "options": { "filesSubDirectory": "my/files/folder" // optional + "encrypt": true //optional, + "secretKey: 'someKey' //mandatory if encrypt is true } } } diff --git a/index.js b/index.js index 5563804..3a653b0 100644 --- a/index.js +++ b/index.js @@ -7,9 +7,21 @@ var fs = require('fs'); var path = require('path'); var pathSep = require('path').sep; +const crypto = require("crypto"); +const algorithm = 'aes-256-cbc'; function FileSystemAdapter(options) { options = options || {}; + this._encrypt = false; + this._secretKey = ""; + + if (options.encrypt && options.encrypt == true){ + if (!options.secretKey){ + throw "Encrypt key not defined"; + } + this._encrypt = true; + this._secretKey = crypto.scryptSync(options.secretKey, 'salt', 32); + } let filesSubDirectory = options.filesSubDirectory || ''; this._filesDir = filesSubDirectory; this._mkdir(this._getApplicationDir()); @@ -25,7 +37,28 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { if(err !== null) { return reject(err); } - resolve(data); + if(this._encrypt === true){ + const iv = crypto.scryptSync(this._secretKey, 'salt', 16); // Initialization vector. + const cipher = crypto.createCipheriv(algorithm, this._secretKey, iv); + const input = fs.createReadStream(filepath); + const output = fs.createWriteStream(filepath+'.enc'); + input.pipe(cipher).pipe(output); + output.on('finish', function() { + fs.unlink(filepath, function(err) { + if (err !== null) { + return reject(err); + } + fs.rename(filepath+'.enc', filepath, function(err) { + if (err !== null) { + return reject(err); + } + resolve(data); + }); + }); + }); + }else{ + resolve(data); + } }); }); } @@ -44,17 +77,23 @@ FileSystemAdapter.prototype.deleteFile = function(filename) { resolve(data); }); }); - }); } FileSystemAdapter.prototype.getFileData = function(filename) { return new Promise((resolve, reject) => { let filepath = this._getLocalFilePath(filename); + const encrypt = this._encrypt; + const secretKey = this._secretKey; fs.readFile( filepath , function (err, data) { if(err !== null) { return reject(err); } + if(encrypt){ + const iv = crypto.scryptSync(secretKey, 'salt', 16); + const decipher = crypto.createDecipheriv(algorithm, secretKey, iv); + resolve(Buffer.concat([decipher.update(data), decipher.final()])); + } resolve(data); }); }); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9d7f4e6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,848 @@ +{ + "name": "@parse/fs-files-adapter", + "version": "1.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "optional": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "codecov": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-1.0.1.tgz", + "integrity": "sha1-lyYM6sDpa47ajVYgBlWKU6E53/0=", + "dev": true, + "requires": { + "argv": ">=0.0.2", + "execSync": "1.0.2", + "request": ">=2.42.0", + "urlgrey": ">=0.4.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execSync": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/execSync/-/execSync-1.0.2.tgz", + "integrity": "sha1-H0LtpYIiUYAFMiTs3T/Rlg/bMTk=", + "dev": true, + "requires": { + "temp": "~0.5.1" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true, + "optional": true + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + } + }, + "jasmine": { + "version": "2.99.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", + "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.99.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "jasmine-core": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "parse-server-conformance-tests": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-server-conformance-tests/-/parse-server-conformance-tests-1.0.0.tgz", + "integrity": "sha1-19t3j4i5ZaJTcQaOXSddr4Cl+hk=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "rimraf": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.1.4.tgz", + "integrity": "sha1-Wm62Lu2gaPUe3lDymz5c0i89m7I=", + "dev": true, + "requires": { + "graceful-fs": "~1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "temp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.5.1.tgz", + "integrity": "sha1-d6sZx5qntZPL5PrCRBdoytmHuN8=", + "dev": true, + "requires": { + "rimraf": "~2.1.4" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "uglify-js": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz", + "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==", + "dev": true, + "optional": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urlgrey": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", + "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/spec/secureFiles.spec.js b/spec/secureFiles.spec.js new file mode 100644 index 0000000..55d37c9 --- /dev/null +++ b/spec/secureFiles.spec.js @@ -0,0 +1,41 @@ +'use strict'; +let FileSystemAdapter = require('../index.js'); +var fs = require('fs'); + +describe('File encryption tests', () => { + const directory = 'sub1/sub2'; + + it("should save/delete file in it's unencrypted format", async function(done) { + var adapter = new FileSystemAdapter({ + filesSubDirectory: directory + }); + var filename = 'file.txt'; + const filePath = 'files/'+directory+'/'+filename; + await adapter.createFile(filename, "hello world", 'text/utf8'); + const result = await adapter.getFileData(filename); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual("hello world"); + const data = fs.readFileSync(filePath); + expect(data.toString('utf-8')).toEqual("hello world"); + await adapter.deleteFile(filename); + done() + }, 5000); + + it("should save/delete file in it's encrypted format", async function(done) { + var adapter = new FileSystemAdapter({ + filesSubDirectory: directory, + encrypt: true, + secretKey: '89E4AFF1-DFE4-4603-9574-BFA16BB446FD' + }); + var filename = 'file2.txt'; + const filePath = 'files/'+directory+'/'+filename; + await adapter.createFile(filename, "hello world", 'text/utf8'); + const result = await adapter.getFileData(filename); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual("hello world"); + const data = fs.readFileSync(filePath); + expect(data.toString('utf-8')).not.toEqual("hello world"); + await adapter.deleteFile(filename); + done() + }, 5000); +}) diff --git a/spec/support/jasmine.json b/spec/support/jasmine.json index e8f0320..cf314b2 100644 --- a/spec/support/jasmine.json +++ b/spec/support/jasmine.json @@ -1,6 +1,7 @@ { "spec_dir": "spec", "spec_files": [ - "test.spec.js" + "test.spec.js", + "secureFiles.spec.js" ] } diff --git a/spec/test.spec.js b/spec/test.spec.js index 773a8e3..a7112cd 100644 --- a/spec/test.spec.js +++ b/spec/test.spec.js @@ -8,5 +8,5 @@ describe('FileSystemAdapter tests', () => { filesSubDirectory: 'sub1/sub2' }); - filesAdapterTests.testAdapter("FileSystemAdapter", fsAdapter); + filesAdapterTests.testAdapter("FileSystemAdapter", fsAdapter); }) From 7ae60e4e59e2e1a2063eb5b8fda007b06fc57fb7 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Mon, 29 Jun 2020 21:54:49 -0400 Subject: [PATCH 02/42] removed update of package.json --- package-lock.json | 848 ---------------------------------------------- 1 file changed, 848 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 9d7f4e6..0000000 --- a/package-lock.json +++ /dev/null @@ -1,848 +0,0 @@ -{ - "name": "@parse/fs-files-adapter", - "version": "1.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "optional": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "codecov": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-1.0.1.tgz", - "integrity": "sha1-lyYM6sDpa47ajVYgBlWKU6E53/0=", - "dev": true, - "requires": { - "argv": ">=0.0.2", - "execSync": "1.0.2", - "request": ">=2.42.0", - "urlgrey": ">=0.4.0" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execSync": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/execSync/-/execSync-1.0.2.tgz", - "integrity": "sha1-H0LtpYIiUYAFMiTs3T/Rlg/bMTk=", - "dev": true, - "requires": { - "temp": "~0.5.1" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true, - "optional": true - }, - "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - } - }, - "jasmine": { - "version": "2.99.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", - "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=", - "dev": true, - "requires": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.99.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "jasmine-core": { - "version": "2.99.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", - "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "parse-server-conformance-tests": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-server-conformance-tests/-/parse-server-conformance-tests-1.0.0.tgz", - "integrity": "sha1-19t3j4i5ZaJTcQaOXSddr4Cl+hk=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "rimraf": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.1.4.tgz", - "integrity": "sha1-Wm62Lu2gaPUe3lDymz5c0i89m7I=", - "dev": true, - "requires": { - "graceful-fs": "~1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - }, - "temp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.5.1.tgz", - "integrity": "sha1-d6sZx5qntZPL5PrCRBdoytmHuN8=", - "dev": true, - "requires": { - "rimraf": "~2.1.4" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "uglify-js": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz", - "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==", - "dev": true, - "optional": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urlgrey": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } -} From e507825f4f13e07d18d4059f6106feee943a48c9 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Mon, 29 Jun 2020 22:21:24 -0400 Subject: [PATCH 03/42] update package.json --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 7fd41cd..a4d636b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "File system adapter for parse-server", "main": "index.js", "scripts": { - "test": "istanbul cover -x **/spec/** jasmine --captureExceptions" + "test": "nyc jasmine" }, "keywords": [ "parse-server", @@ -16,8 +16,8 @@ "license": "MIT", "devDependencies": { "codecov": "^1.0.1", - "istanbul": "^0.4.2", - "jasmine": "^2.4.1", + "nyc": "^15.1.0", + "jasmine": "^3.5.0", "parse-server-conformance-tests": "^1.0.0" } } From dad1e7c543f13bd16996558ab32b8b6438831c84 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Mon, 29 Jun 2020 22:25:47 -0400 Subject: [PATCH 04/42] update node in travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6b7a345..6c5cf44 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,5 +3,5 @@ branches: - master language: node_js node_js: - - "4.3" + - 8 after_success: ./node_modules/.bin/codecov From d01aa1fadfeadbc30ed861ea07083cf6c7a776fa Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Mon, 29 Jun 2020 22:31:44 -0400 Subject: [PATCH 05/42] update node in travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6c5cf44..790024a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,5 +3,5 @@ branches: - master language: node_js node_js: - - 8 + - 10 after_success: ./node_modules/.bin/codecov From e6c8f9bf618bc294133dab2d0bc0b01cccde039e Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Mon, 29 Jun 2020 22:52:05 -0400 Subject: [PATCH 06/42] trying different verion of key and iv hash --- index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 3a653b0..2aa0ac0 100644 --- a/index.js +++ b/index.js @@ -20,7 +20,7 @@ function FileSystemAdapter(options) { throw "Encrypt key not defined"; } this._encrypt = true; - this._secretKey = crypto.scryptSync(options.secretKey, 'salt', 32); + this._secretKey = crypto.createHash('sha256').update(String(options.secretKey)).digest('base64').substr(0, 32);//crypto.scryptSync(options.secretKey, 'salt', 32); } let filesSubDirectory = options.filesSubDirectory || ''; this._filesDir = filesSubDirectory; @@ -38,7 +38,7 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { return reject(err); } if(this._encrypt === true){ - const iv = crypto.scryptSync(this._secretKey, 'salt', 16); // Initialization vector. + const iv = crypto.createHash('sha256').update(String(this._secretKey)).digest('base64').substr(0, 16);//crypto.scryptSync(this._secretKey, 'salt', 16); // Initialization vector. const cipher = crypto.createCipheriv(algorithm, this._secretKey, iv); const input = fs.createReadStream(filepath); const output = fs.createWriteStream(filepath+'.enc'); @@ -90,7 +90,7 @@ FileSystemAdapter.prototype.getFileData = function(filename) { return reject(err); } if(encrypt){ - const iv = crypto.scryptSync(secretKey, 'salt', 16); + const iv = crypto.createHash('sha256').update(String(secretKey)).digest('base64').substr(0, 16);//crypto.scryptSync(secretKey, 'salt', 16); const decipher = crypto.createDecipheriv(algorithm, secretKey, iv); resolve(Buffer.concat([decipher.update(data), decipher.final()])); } From f9893dec410dbf8641e75809e0658d298fd3339f Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Mon, 29 Jun 2020 22:53:42 -0400 Subject: [PATCH 07/42] downgrading node to match minimal parse-server --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 790024a..6c5cf44 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,5 +3,5 @@ branches: - master language: node_js node_js: - - 10 + - 8 after_success: ./node_modules/.bin/codecov From 74c7c9e1357651a6965696d0e8a524f30d50a3c8 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Mon, 29 Jun 2020 22:56:10 -0400 Subject: [PATCH 08/42] removed commented code --- index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 2aa0ac0..13b70a3 100644 --- a/index.js +++ b/index.js @@ -20,7 +20,7 @@ function FileSystemAdapter(options) { throw "Encrypt key not defined"; } this._encrypt = true; - this._secretKey = crypto.createHash('sha256').update(String(options.secretKey)).digest('base64').substr(0, 32);//crypto.scryptSync(options.secretKey, 'salt', 32); + this._secretKey = crypto.createHash('sha256').update(String(options.secretKey)).digest('base64').substr(0, 32); } let filesSubDirectory = options.filesSubDirectory || ''; this._filesDir = filesSubDirectory; @@ -38,7 +38,7 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { return reject(err); } if(this._encrypt === true){ - const iv = crypto.createHash('sha256').update(String(this._secretKey)).digest('base64').substr(0, 16);//crypto.scryptSync(this._secretKey, 'salt', 16); // Initialization vector. + const iv = crypto.createHash('sha256').update(String(this._secretKey)).digest('base64').substr(0, 16); const cipher = crypto.createCipheriv(algorithm, this._secretKey, iv); const input = fs.createReadStream(filepath); const output = fs.createWriteStream(filepath+'.enc'); @@ -90,7 +90,7 @@ FileSystemAdapter.prototype.getFileData = function(filename) { return reject(err); } if(encrypt){ - const iv = crypto.createHash('sha256').update(String(secretKey)).digest('base64').substr(0, 16);//crypto.scryptSync(secretKey, 'salt', 16); + const iv = crypto.createHash('sha256').update(String(secretKey)).digest('base64').substr(0, 16); const decipher = crypto.createDecipheriv(algorithm, secretKey, iv); resolve(Buffer.concat([decipher.update(data), decipher.final()])); } From 9af50d3b5c54d1e9ec1b5923a53603a581b31ac9 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Tue, 30 Jun 2020 09:44:02 -0400 Subject: [PATCH 09/42] add random iv for each file instead of using constant. Also removed encrypted option, will encrypt automatically if secretKey is provided --- .../f3fae726-02d4-454e-9b2e-e2450bdd2664.json | 1 + .../f3fae726-02d4-454e-9b2e-e2450bdd2664.json | 1 + .nyc_output/processinfo/index.json | 1 + README.md | 3 +- index.js | 25 +- package-lock.json | 1792 +++++++++++++++++ spec/secureFiles.spec.js | 1 - 7 files changed, 1807 insertions(+), 17 deletions(-) create mode 100644 .nyc_output/f3fae726-02d4-454e-9b2e-e2450bdd2664.json create mode 100644 .nyc_output/processinfo/f3fae726-02d4-454e-9b2e-e2450bdd2664.json create mode 100644 .nyc_output/processinfo/index.json create mode 100644 package-lock.json diff --git a/.nyc_output/f3fae726-02d4-454e-9b2e-e2450bdd2664.json b/.nyc_output/f3fae726-02d4-454e-9b2e-e2450bdd2664.json new file mode 100644 index 0000000..b714667 --- /dev/null +++ b/.nyc_output/f3fae726-02d4-454e-9b2e-e2450bdd2664.json @@ -0,0 +1 @@ +{"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/test.spec.js":{"path":"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/test.spec.js","statementMap":{"0":{"start":{"line":2,"column":24},"end":{"line":2,"column":71}},"1":{"start":{"line":4,"column":24},"end":{"line":4,"column":46}},"2":{"start":{"line":6,"column":0},"end":{"line":12,"column":2}},"3":{"start":{"line":7,"column":18},"end":{"line":9,"column":4}},"4":{"start":{"line":11,"column":2},"end":{"line":11,"column":64}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":36},"end":{"line":6,"column":37}},"loc":{"start":{"line":6,"column":42},"end":{"line":12,"column":1}},"line":6}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{"0":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c92fdbf6da86fafe6793964ecb399c4c7bb3b585","contentHash":"271000c758ff0035fcd6087086195afb843020d8d4b1fb41f1cebdd5e771b567"},"/Users/MacJr/Documents/github/parse-server-fs-adapter/index.js":{"path":"/Users/MacJr/Documents/github/parse-server-fs-adapter/index.js","statementMap":{"0":{"start":{"line":7,"column":9},"end":{"line":7,"column":22}},"1":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"2":{"start":{"line":9,"column":14},"end":{"line":9,"column":33}},"3":{"start":{"line":10,"column":15},"end":{"line":10,"column":32}},"4":{"start":{"line":11,"column":18},"end":{"line":11,"column":31}},"5":{"start":{"line":14,"column":2},"end":{"line":14,"column":26}},"6":{"start":{"line":15,"column":2},"end":{"line":15,"column":25}},"7":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"8":{"start":{"line":18,"column":4},"end":{"line":18,"column":115}},"9":{"start":{"line":20,"column":26},"end":{"line":20,"column":57}},"10":{"start":{"line":21,"column":2},"end":{"line":21,"column":37}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":41}},"12":{"start":{"line":23,"column":2},"end":{"line":25,"column":3}},"13":{"start":{"line":24,"column":4},"end":{"line":24,"column":43}},"14":{"start":{"line":28,"column":0},"end":{"line":60,"column":1}},"15":{"start":{"line":29,"column":2},"end":{"line":59,"column":5}},"16":{"start":{"line":30,"column":19},"end":{"line":30,"column":51}},"17":{"start":{"line":31,"column":4},"end":{"line":58,"column":7}},"18":{"start":{"line":32,"column":6},"end":{"line":34,"column":7}},"19":{"start":{"line":33,"column":8},"end":{"line":33,"column":27}},"20":{"start":{"line":35,"column":6},"end":{"line":57,"column":7}},"21":{"start":{"line":36,"column":19},"end":{"line":36,"column":41}},"22":{"start":{"line":37,"column":23},"end":{"line":37,"column":76}},"23":{"start":{"line":38,"column":22},"end":{"line":38,"column":51}},"24":{"start":{"line":39,"column":23},"end":{"line":39,"column":60}},"25":{"start":{"line":40,"column":8},"end":{"line":40,"column":40}},"26":{"start":{"line":41,"column":8},"end":{"line":54,"column":11}},"27":{"start":{"line":42,"column":10},"end":{"line":53,"column":13}},"28":{"start":{"line":43,"column":12},"end":{"line":45,"column":13}},"29":{"start":{"line":44,"column":14},"end":{"line":44,"column":33}},"30":{"start":{"line":46,"column":12},"end":{"line":52,"column":15}},"31":{"start":{"line":47,"column":14},"end":{"line":49,"column":15}},"32":{"start":{"line":48,"column":16},"end":{"line":48,"column":35}},"33":{"start":{"line":50,"column":14},"end":{"line":50,"column":46}},"34":{"start":{"line":51,"column":14},"end":{"line":51,"column":28}},"35":{"start":{"line":56,"column":8},"end":{"line":56,"column":22}},"36":{"start":{"line":62,"column":0},"end":{"line":77,"column":1}},"37":{"start":{"line":63,"column":2},"end":{"line":76,"column":5}},"38":{"start":{"line":64,"column":19},"end":{"line":64,"column":51}},"39":{"start":{"line":65,"column":4},"end":{"line":75,"column":7}},"40":{"start":{"line":66,"column":6},"end":{"line":68,"column":7}},"41":{"start":{"line":67,"column":8},"end":{"line":67,"column":27}},"42":{"start":{"line":69,"column":6},"end":{"line":74,"column":9}},"43":{"start":{"line":70,"column":6},"end":{"line":72,"column":9}},"44":{"start":{"line":71,"column":10},"end":{"line":71,"column":35}},"45":{"start":{"line":73,"column":8},"end":{"line":73,"column":22}},"46":{"start":{"line":79,"column":0},"end":{"line":97,"column":1}},"47":{"start":{"line":80,"column":2},"end":{"line":96,"column":5}},"48":{"start":{"line":81,"column":19},"end":{"line":81,"column":51}},"49":{"start":{"line":82,"column":22},"end":{"line":82,"column":37}},"50":{"start":{"line":83,"column":4},"end":{"line":95,"column":7}},"51":{"start":{"line":84,"column":6},"end":{"line":86,"column":7}},"52":{"start":{"line":85,"column":8},"end":{"line":85,"column":27}},"53":{"start":{"line":87,"column":6},"end":{"line":93,"column":7}},"54":{"start":{"line":88,"column":27},"end":{"line":88,"column":43}},"55":{"start":{"line":89,"column":19},"end":{"line":89,"column":41}},"56":{"start":{"line":90,"column":26},"end":{"line":90,"column":50}},"57":{"start":{"line":91,"column":25},"end":{"line":91,"column":74}},"58":{"start":{"line":92,"column":8},"end":{"line":92,"column":79}},"59":{"start":{"line":94,"column":6},"end":{"line":94,"column":20}},"60":{"start":{"line":99,"column":0},"end":{"line":101,"column":1}},"61":{"start":{"line":100,"column":2},"end":{"line":100,"column":94}},"62":{"start":{"line":106,"column":1},"end":{"line":112,"column":2}},"63":{"start":{"line":107,"column":2},"end":{"line":111,"column":3}},"64":{"start":{"line":108,"column":4},"end":{"line":108,"column":46}},"65":{"start":{"line":110,"column":4},"end":{"line":110,"column":19}},"66":{"start":{"line":114,"column":0},"end":{"line":116,"column":1}},"67":{"start":{"line":115,"column":2},"end":{"line":115,"column":50}},"68":{"start":{"line":118,"column":0},"end":{"line":124,"column":1}},"69":{"start":{"line":119,"column":23},"end":{"line":119,"column":48}},"70":{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},"71":{"start":{"line":121,"column":4},"end":{"line":121,"column":32}},"72":{"start":{"line":123,"column":2},"end":{"line":123,"column":65}},"73":{"start":{"line":126,"column":0},"end":{"line":148,"column":1}},"74":{"start":{"line":128,"column":13},"end":{"line":128,"column":35}},"75":{"start":{"line":129,"column":13},"end":{"line":129,"column":15}},"76":{"start":{"line":131,"column":2},"end":{"line":147,"column":3}},"77":{"start":{"line":132,"column":14},"end":{"line":132,"column":26}},"78":{"start":{"line":133,"column":4},"end":{"line":135,"column":5}},"79":{"start":{"line":134,"column":6},"end":{"line":134,"column":21}},"80":{"start":{"line":136,"column":4},"end":{"line":145,"column":5}},"81":{"start":{"line":137,"column":6},"end":{"line":144,"column":7}},"82":{"start":{"line":138,"column":8},"end":{"line":138,"column":43}},"83":{"start":{"line":141,"column":8},"end":{"line":143,"column":9}},"84":{"start":{"line":142,"column":10},"end":{"line":142,"column":140}},"85":{"start":{"line":146,"column":4},"end":{"line":146,"column":41}},"86":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"87":{"start":{"line":151,"column":0},"end":{"line":151,"column":43}}},"fnMap":{"0":{"name":"FileSystemAdapter","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":26}},"loc":{"start":{"line":13,"column":36},"end":{"line":26,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":41},"end":{"line":28,"column":42}},"loc":{"start":{"line":28,"column":66},"end":{"line":60,"column":1}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":21},"end":{"line":29,"column":22}},"loc":{"start":{"line":29,"column":42},"end":{"line":59,"column":3}},"line":29},"3":{"name":"(anonymous_3)","decl":{"start":{"line":31,"column":33},"end":{"line":31,"column":34}},"loc":{"start":{"line":31,"column":42},"end":{"line":58,"column":5}},"line":31},"4":{"name":"(anonymous_4)","decl":{"start":{"line":41,"column":28},"end":{"line":41,"column":29}},"loc":{"start":{"line":41,"column":39},"end":{"line":54,"column":9}},"line":41},"5":{"name":"(anonymous_5)","decl":{"start":{"line":42,"column":30},"end":{"line":42,"column":31}},"loc":{"start":{"line":42,"column":44},"end":{"line":53,"column":11}},"line":42},"6":{"name":"(anonymous_6)","decl":{"start":{"line":46,"column":49},"end":{"line":46,"column":50}},"loc":{"start":{"line":46,"column":63},"end":{"line":52,"column":13}},"line":46},"7":{"name":"(anonymous_7)","decl":{"start":{"line":62,"column":41},"end":{"line":62,"column":42}},"loc":{"start":{"line":62,"column":60},"end":{"line":77,"column":1}},"line":62},"8":{"name":"(anonymous_8)","decl":{"start":{"line":63,"column":21},"end":{"line":63,"column":22}},"loc":{"start":{"line":63,"column":42},"end":{"line":76,"column":3}},"line":63},"9":{"name":"(anonymous_9)","decl":{"start":{"line":65,"column":28},"end":{"line":65,"column":29}},"loc":{"start":{"line":65,"column":49},"end":{"line":75,"column":5}},"line":65},"10":{"name":"(anonymous_10)","decl":{"start":{"line":69,"column":26},"end":{"line":69,"column":27}},"loc":{"start":{"line":69,"column":41},"end":{"line":74,"column":7}},"line":69},"11":{"name":"(anonymous_11)","decl":{"start":{"line":79,"column":42},"end":{"line":79,"column":43}},"loc":{"start":{"line":79,"column":61},"end":{"line":97,"column":1}},"line":79},"12":{"name":"(anonymous_12)","decl":{"start":{"line":80,"column":21},"end":{"line":80,"column":22}},"loc":{"start":{"line":80,"column":42},"end":{"line":96,"column":3}},"line":80},"13":{"name":"(anonymous_13)","decl":{"start":{"line":83,"column":28},"end":{"line":83,"column":29}},"loc":{"start":{"line":83,"column":49},"end":{"line":95,"column":5}},"line":83},"14":{"name":"(anonymous_14)","decl":{"start":{"line":99,"column":46},"end":{"line":99,"column":47}},"loc":{"start":{"line":99,"column":73},"end":{"line":101,"column":1}},"line":99},"15":{"name":"(anonymous_15)","decl":{"start":{"line":106,"column":50},"end":{"line":106,"column":51}},"loc":{"start":{"line":106,"column":61},"end":{"line":112,"column":2}},"line":106},"16":{"name":"(anonymous_16)","decl":{"start":{"line":114,"column":51},"end":{"line":114,"column":52}},"loc":{"start":{"line":114,"column":62},"end":{"line":116,"column":1}},"line":114},"17":{"name":"(anonymous_17)","decl":{"start":{"line":118,"column":48},"end":{"line":118,"column":49}},"loc":{"start":{"line":118,"column":67},"end":{"line":124,"column":1}},"line":118},"18":{"name":"(anonymous_18)","decl":{"start":{"line":126,"column":37},"end":{"line":126,"column":38}},"loc":{"start":{"line":126,"column":55},"end":{"line":148,"column":1}},"line":126}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":12},"end":{"line":14,"column":25}},"type":"binary-expr","locations":[{"start":{"line":14,"column":12},"end":{"line":14,"column":19}},{"start":{"line":14,"column":23},"end":{"line":14,"column":25}}],"line":14},"1":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"2":{"loc":{"start":{"line":20,"column":26},"end":{"line":20,"column":57}},"type":"binary-expr","locations":[{"start":{"line":20,"column":26},"end":{"line":20,"column":51}},{"start":{"line":20,"column":55},"end":{"line":20,"column":57}}],"line":20},"3":{"loc":{"start":{"line":23,"column":2},"end":{"line":25,"column":3}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":25,"column":3}},{"start":{"line":23,"column":2},"end":{"line":25,"column":3}}],"line":23},"4":{"loc":{"start":{"line":32,"column":6},"end":{"line":34,"column":7}},"type":"if","locations":[{"start":{"line":32,"column":6},"end":{"line":34,"column":7}},{"start":{"line":32,"column":6},"end":{"line":34,"column":7}}],"line":32},"5":{"loc":{"start":{"line":35,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":35,"column":6},"end":{"line":57,"column":7}},{"start":{"line":35,"column":6},"end":{"line":57,"column":7}}],"line":35},"6":{"loc":{"start":{"line":43,"column":12},"end":{"line":45,"column":13}},"type":"if","locations":[{"start":{"line":43,"column":12},"end":{"line":45,"column":13}},{"start":{"line":43,"column":12},"end":{"line":45,"column":13}}],"line":43},"7":{"loc":{"start":{"line":47,"column":14},"end":{"line":49,"column":15}},"type":"if","locations":[{"start":{"line":47,"column":14},"end":{"line":49,"column":15}},{"start":{"line":47,"column":14},"end":{"line":49,"column":15}}],"line":47},"8":{"loc":{"start":{"line":66,"column":6},"end":{"line":68,"column":7}},"type":"if","locations":[{"start":{"line":66,"column":6},"end":{"line":68,"column":7}},{"start":{"line":66,"column":6},"end":{"line":68,"column":7}}],"line":66},"9":{"loc":{"start":{"line":70,"column":6},"end":{"line":72,"column":9}},"type":"if","locations":[{"start":{"line":70,"column":6},"end":{"line":72,"column":9}},{"start":{"line":70,"column":6},"end":{"line":72,"column":9}}],"line":70},"10":{"loc":{"start":{"line":84,"column":6},"end":{"line":86,"column":7}},"type":"if","locations":[{"start":{"line":84,"column":6},"end":{"line":86,"column":7}},{"start":{"line":84,"column":6},"end":{"line":86,"column":7}}],"line":84},"11":{"loc":{"start":{"line":87,"column":6},"end":{"line":93,"column":7}},"type":"if","locations":[{"start":{"line":87,"column":6},"end":{"line":93,"column":7}},{"start":{"line":87,"column":6},"end":{"line":93,"column":7}}],"line":87},"12":{"loc":{"start":{"line":107,"column":2},"end":{"line":111,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":111,"column":3}},{"start":{"line":107,"column":2},"end":{"line":111,"column":3}}],"line":107},"13":{"loc":{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},"type":"if","locations":[{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},{"start":{"line":120,"column":2},"end":{"line":122,"column":3}}],"line":120},"14":{"loc":{"start":{"line":133,"column":4},"end":{"line":135,"column":5}},"type":"if","locations":[{"start":{"line":133,"column":4},"end":{"line":135,"column":5}},{"start":{"line":133,"column":4},"end":{"line":135,"column":5}}],"line":133},"15":{"loc":{"start":{"line":136,"column":4},"end":{"line":145,"column":5}},"type":"if","locations":[{"start":{"line":136,"column":4},"end":{"line":145,"column":5}},{"start":{"line":136,"column":4},"end":{"line":145,"column":5}}],"line":136},"16":{"loc":{"start":{"line":141,"column":8},"end":{"line":143,"column":9}},"type":"if","locations":[{"start":{"line":141,"column":8},"end":{"line":143,"column":9}},{"start":{"line":141,"column":8},"end":{"line":143,"column":9}}],"line":141}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":3,"6":3,"7":3,"8":1,"9":3,"10":3,"11":3,"12":3,"13":0,"14":1,"15":3,"16":3,"17":3,"18":3,"19":0,"20":3,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":0,"30":1,"31":1,"32":0,"33":1,"34":1,"35":2,"36":1,"37":3,"38":3,"39":3,"40":3,"41":0,"42":3,"43":3,"44":0,"45":3,"46":1,"47":4,"48":4,"49":4,"50":4,"51":4,"52":1,"53":3,"54":1,"55":1,"56":1,"57":1,"58":1,"59":3,"60":1,"61":0,"62":1,"63":16,"64":16,"65":0,"66":1,"67":3,"68":1,"69":10,"70":10,"71":0,"72":10,"73":1,"74":3,"75":3,"76":3,"77":9,"78":9,"79":0,"80":9,"81":0,"82":0,"83":0,"84":0,"85":9,"86":1,"87":1},"f":{"0":3,"1":3,"2":3,"3":3,"4":1,"5":1,"6":1,"7":3,"8":3,"9":3,"10":3,"11":4,"12":4,"13":4,"14":0,"15":16,"16":3,"17":10,"18":3},"b":{"0":[3,0],"1":[1,2],"2":[3,0],"3":[0,3],"4":[0,3],"5":[1,2],"6":[0,1],"7":[0,1],"8":[0,3],"9":[0,3],"10":[1,3],"11":[1,2],"12":[16,0],"13":[0,10],"14":[0,9],"15":[0,9],"16":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"30bf8926b2035b6ee3aae42a21a022390e665ba4","contentHash":"6424bdb3b380a1dce6a9731bd3624ede67187951a58965e7d4cc266ad3102981"},"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/secureFiles.spec.js":{"path":"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/secureFiles.spec.js","statementMap":{"0":{"start":{"line":2,"column":24},"end":{"line":2,"column":46}},"1":{"start":{"line":3,"column":9},"end":{"line":3,"column":22}},"2":{"start":{"line":5,"column":0},"end":{"line":40,"column":2}},"3":{"start":{"line":6,"column":22},"end":{"line":6,"column":33}},"4":{"start":{"line":8,"column":4},"end":{"line":22,"column":13}},"5":{"start":{"line":9,"column":22},"end":{"line":11,"column":10}},"6":{"start":{"line":12,"column":23},"end":{"line":12,"column":33}},"7":{"start":{"line":13,"column":25},"end":{"line":13,"column":56}},"8":{"start":{"line":14,"column":8},"end":{"line":14,"column":71}},"9":{"start":{"line":15,"column":23},"end":{"line":15,"column":58}},"10":{"start":{"line":16,"column":8},"end":{"line":16,"column":52}},"11":{"start":{"line":17,"column":8},"end":{"line":17,"column":64}},"12":{"start":{"line":18,"column":21},"end":{"line":18,"column":46}},"13":{"start":{"line":19,"column":8},"end":{"line":19,"column":62}},"14":{"start":{"line":20,"column":8},"end":{"line":20,"column":43}},"15":{"start":{"line":21,"column":8},"end":{"line":21,"column":14}},"16":{"start":{"line":24,"column":4},"end":{"line":39,"column":13}},"17":{"start":{"line":25,"column":22},"end":{"line":28,"column":10}},"18":{"start":{"line":29,"column":23},"end":{"line":29,"column":34}},"19":{"start":{"line":30,"column":25},"end":{"line":30,"column":56}},"20":{"start":{"line":31,"column":8},"end":{"line":31,"column":71}},"21":{"start":{"line":32,"column":23},"end":{"line":32,"column":58}},"22":{"start":{"line":33,"column":8},"end":{"line":33,"column":52}},"23":{"start":{"line":34,"column":8},"end":{"line":34,"column":64}},"24":{"start":{"line":35,"column":21},"end":{"line":35,"column":46}},"25":{"start":{"line":36,"column":8},"end":{"line":36,"column":66}},"26":{"start":{"line":37,"column":8},"end":{"line":37,"column":43}},"27":{"start":{"line":38,"column":8},"end":{"line":38,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":34},"end":{"line":5,"column":35}},"loc":{"start":{"line":5,"column":40},"end":{"line":40,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":61},"end":{"line":8,"column":62}},"loc":{"start":{"line":8,"column":82},"end":{"line":22,"column":5}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":59},"end":{"line":24,"column":60}},"loc":{"start":{"line":24,"column":80},"end":{"line":39,"column":5}},"line":24}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1},"f":{"0":1,"1":1,"2":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d96acb2466b9e7bf3e24c4e9db5cbbfd5e9c9777","contentHash":"1759431e36478012a90e398b922dcc7bb6907a85add3d89b7252d87bed7a6d6f"}} \ No newline at end of file diff --git a/.nyc_output/processinfo/f3fae726-02d4-454e-9b2e-e2450bdd2664.json b/.nyc_output/processinfo/f3fae726-02d4-454e-9b2e-e2450bdd2664.json new file mode 100644 index 0000000..7b5e492 --- /dev/null +++ b/.nyc_output/processinfo/f3fae726-02d4-454e-9b2e-e2450bdd2664.json @@ -0,0 +1 @@ +{"parent":null,"pid":53265,"argv":["/usr/local/Cellar/node/13.11.0/bin/node","/Users/MacJr/Documents/github/parse-server-fs-adapter/node_modules/.bin/jasmine"],"execArgv":[],"cwd":"/Users/MacJr/Documents/github/parse-server-fs-adapter","time":1593524563088,"ppid":53264,"coverageFilename":"/Users/MacJr/Documents/github/parse-server-fs-adapter/.nyc_output/f3fae726-02d4-454e-9b2e-e2450bdd2664.json","externalId":"","uuid":"f3fae726-02d4-454e-9b2e-e2450bdd2664","files":["/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/test.spec.js","/Users/MacJr/Documents/github/parse-server-fs-adapter/index.js","/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/secureFiles.spec.js"]} \ No newline at end of file diff --git a/.nyc_output/processinfo/index.json b/.nyc_output/processinfo/index.json new file mode 100644 index 0000000..6d1a3e9 --- /dev/null +++ b/.nyc_output/processinfo/index.json @@ -0,0 +1 @@ +{"processes":{"f3fae726-02d4-454e-9b2e-e2450bdd2664":{"parent":null,"children":[]}},"files":{"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/test.spec.js":["f3fae726-02d4-454e-9b2e-e2450bdd2664"],"/Users/MacJr/Documents/github/parse-server-fs-adapter/index.js":["f3fae726-02d4-454e-9b2e-e2450bdd2664"],"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/secureFiles.spec.js":["f3fae726-02d4-454e-9b2e-e2450bdd2664"]},"externalIds":{}} \ No newline at end of file diff --git a/README.md b/README.md index 5470306..9004c2f 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,7 @@ parse-server file system storage adapter "module": "@parse/fs-files-adapter", "options": { "filesSubDirectory": "my/files/folder" // optional - "encrypt": true //optional, - "secretKey: 'someKey' //mandatory if encrypt is true + "secretKey: 'someKey' //optional, but mandatory if you want to encrypt files } } } diff --git a/index.js b/index.js index 13b70a3..dacbef1 100644 --- a/index.js +++ b/index.js @@ -12,14 +12,9 @@ const algorithm = 'aes-256-cbc'; function FileSystemAdapter(options) { options = options || {}; - this._encrypt = false; - this._secretKey = ""; + this._secretKey = null; - if (options.encrypt && options.encrypt == true){ - if (!options.secretKey){ - throw "Encrypt key not defined"; - } - this._encrypt = true; + if (options.secretKey !== undefined){ this._secretKey = crypto.createHash('sha256').update(String(options.secretKey)).digest('base64').substr(0, 32); } let filesSubDirectory = options.filesSubDirectory || ''; @@ -37,8 +32,8 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { if(err !== null) { return reject(err); } - if(this._encrypt === true){ - const iv = crypto.createHash('sha256').update(String(this._secretKey)).digest('base64').substr(0, 16); + if(this._secretKey !== null){ + const iv = crypto.randomBytes(16); const cipher = crypto.createCipheriv(algorithm, this._secretKey, iv); const input = fs.createReadStream(filepath); const output = fs.createWriteStream(filepath+'.enc'); @@ -52,6 +47,7 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { if (err !== null) { return reject(err); } + fs.appendFileSync(filepath, iv); resolve(data); }); }); @@ -83,16 +79,17 @@ FileSystemAdapter.prototype.deleteFile = function(filename) { FileSystemAdapter.prototype.getFileData = function(filename) { return new Promise((resolve, reject) => { let filepath = this._getLocalFilePath(filename); - const encrypt = this._encrypt; const secretKey = this._secretKey; fs.readFile( filepath , function (err, data) { if(err !== null) { return reject(err); } - if(encrypt){ - const iv = crypto.createHash('sha256').update(String(secretKey)).digest('base64').substr(0, 16); - const decipher = crypto.createDecipheriv(algorithm, secretKey, iv); - resolve(Buffer.concat([decipher.update(data), decipher.final()])); + if(secretKey !== null){ + const ivLocation = data.length - 16; + const iv = data.slice(ivLocation); + const encrypted = data.slice(0,ivLocation); + const decipher = crypto.createDecipheriv(algorithm, secretKey, iv); + resolve(Buffer.concat([decipher.update(encrypted), decipher.final()])); } resolve(data); }); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6fe8e84 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1792 @@ +{ + "name": "@parse/fs-files-adapter", + "version": "1.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.3" + } + }, + "@babel/core": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.3.tgz", + "integrity": "sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helpers": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/traverse": "^7.10.3", + "@babel/types": "^7.10.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz", + "integrity": "sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz", + "integrity": "sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w==", + "dev": true, + "requires": { + "@babel/types": "^7.10.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz", + "integrity": "sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", + "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.3", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==", + "dev": true + }, + "@babel/template": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" + } + }, + "@babel/traverse": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.3", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "codecov": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-1.0.1.tgz", + "integrity": "sha1-lyYM6sDpa47ajVYgBlWKU6E53/0=", + "dev": true, + "requires": { + "argv": ">=0.0.2", + "execSync": "1.0.2", + "request": ">=2.42.0", + "urlgrey": ">=0.4.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "execSync": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/execSync/-/execSync-1.0.2.tgz", + "integrity": "sha1-H0LtpYIiUYAFMiTs3T/Rlg/bMTk=", + "dev": true, + "requires": { + "temp": "~0.5.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fromentries": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true, + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "hasha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jasmine": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", + "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", + "dev": true, + "requires": { + "glob": "^7.1.4", + "jasmine-core": "~3.5.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "jasmine-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } + } + }, + "parse-server-conformance-tests": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-server-conformance-tests/-/parse-server-conformance-tests-1.0.0.tgz", + "integrity": "sha1-19t3j4i5ZaJTcQaOXSddr4Cl+hk=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.1.4.tgz", + "integrity": "sha1-Wm62Lu2gaPUe3lDymz5c0i89m7I=", + "dev": true, + "requires": { + "graceful-fs": "~1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "temp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.5.1.tgz", + "integrity": "sha1-d6sZx5qntZPL5PrCRBdoytmHuN8=", + "dev": true, + "requires": { + "rimraf": "~2.1.4" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urlgrey": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", + "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/spec/secureFiles.spec.js b/spec/secureFiles.spec.js index 55d37c9..6e309ee 100644 --- a/spec/secureFiles.spec.js +++ b/spec/secureFiles.spec.js @@ -24,7 +24,6 @@ describe('File encryption tests', () => { it("should save/delete file in it's encrypted format", async function(done) { var adapter = new FileSystemAdapter({ filesSubDirectory: directory, - encrypt: true, secretKey: '89E4AFF1-DFE4-4603-9574-BFA16BB446FD' }); var filename = 'file2.txt'; From db8a1a8db7f6f097a97bc720b0547c3d63313dea Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Tue, 30 Jun 2020 09:45:33 -0400 Subject: [PATCH 10/42] remove unneccesary files --- .../f3fae726-02d4-454e-9b2e-e2450bdd2664.json | 1 - .../f3fae726-02d4-454e-9b2e-e2450bdd2664.json | 1 - .nyc_output/processinfo/index.json | 1 - package-lock.json | 1792 ----------------- 4 files changed, 1795 deletions(-) delete mode 100644 .nyc_output/f3fae726-02d4-454e-9b2e-e2450bdd2664.json delete mode 100644 .nyc_output/processinfo/f3fae726-02d4-454e-9b2e-e2450bdd2664.json delete mode 100644 .nyc_output/processinfo/index.json delete mode 100644 package-lock.json diff --git a/.nyc_output/f3fae726-02d4-454e-9b2e-e2450bdd2664.json b/.nyc_output/f3fae726-02d4-454e-9b2e-e2450bdd2664.json deleted file mode 100644 index b714667..0000000 --- a/.nyc_output/f3fae726-02d4-454e-9b2e-e2450bdd2664.json +++ /dev/null @@ -1 +0,0 @@ -{"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/test.spec.js":{"path":"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/test.spec.js","statementMap":{"0":{"start":{"line":2,"column":24},"end":{"line":2,"column":71}},"1":{"start":{"line":4,"column":24},"end":{"line":4,"column":46}},"2":{"start":{"line":6,"column":0},"end":{"line":12,"column":2}},"3":{"start":{"line":7,"column":18},"end":{"line":9,"column":4}},"4":{"start":{"line":11,"column":2},"end":{"line":11,"column":64}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":36},"end":{"line":6,"column":37}},"loc":{"start":{"line":6,"column":42},"end":{"line":12,"column":1}},"line":6}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{"0":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c92fdbf6da86fafe6793964ecb399c4c7bb3b585","contentHash":"271000c758ff0035fcd6087086195afb843020d8d4b1fb41f1cebdd5e771b567"},"/Users/MacJr/Documents/github/parse-server-fs-adapter/index.js":{"path":"/Users/MacJr/Documents/github/parse-server-fs-adapter/index.js","statementMap":{"0":{"start":{"line":7,"column":9},"end":{"line":7,"column":22}},"1":{"start":{"line":8,"column":11},"end":{"line":8,"column":26}},"2":{"start":{"line":9,"column":14},"end":{"line":9,"column":33}},"3":{"start":{"line":10,"column":15},"end":{"line":10,"column":32}},"4":{"start":{"line":11,"column":18},"end":{"line":11,"column":31}},"5":{"start":{"line":14,"column":2},"end":{"line":14,"column":26}},"6":{"start":{"line":15,"column":2},"end":{"line":15,"column":25}},"7":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"8":{"start":{"line":18,"column":4},"end":{"line":18,"column":115}},"9":{"start":{"line":20,"column":26},"end":{"line":20,"column":57}},"10":{"start":{"line":21,"column":2},"end":{"line":21,"column":37}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":41}},"12":{"start":{"line":23,"column":2},"end":{"line":25,"column":3}},"13":{"start":{"line":24,"column":4},"end":{"line":24,"column":43}},"14":{"start":{"line":28,"column":0},"end":{"line":60,"column":1}},"15":{"start":{"line":29,"column":2},"end":{"line":59,"column":5}},"16":{"start":{"line":30,"column":19},"end":{"line":30,"column":51}},"17":{"start":{"line":31,"column":4},"end":{"line":58,"column":7}},"18":{"start":{"line":32,"column":6},"end":{"line":34,"column":7}},"19":{"start":{"line":33,"column":8},"end":{"line":33,"column":27}},"20":{"start":{"line":35,"column":6},"end":{"line":57,"column":7}},"21":{"start":{"line":36,"column":19},"end":{"line":36,"column":41}},"22":{"start":{"line":37,"column":23},"end":{"line":37,"column":76}},"23":{"start":{"line":38,"column":22},"end":{"line":38,"column":51}},"24":{"start":{"line":39,"column":23},"end":{"line":39,"column":60}},"25":{"start":{"line":40,"column":8},"end":{"line":40,"column":40}},"26":{"start":{"line":41,"column":8},"end":{"line":54,"column":11}},"27":{"start":{"line":42,"column":10},"end":{"line":53,"column":13}},"28":{"start":{"line":43,"column":12},"end":{"line":45,"column":13}},"29":{"start":{"line":44,"column":14},"end":{"line":44,"column":33}},"30":{"start":{"line":46,"column":12},"end":{"line":52,"column":15}},"31":{"start":{"line":47,"column":14},"end":{"line":49,"column":15}},"32":{"start":{"line":48,"column":16},"end":{"line":48,"column":35}},"33":{"start":{"line":50,"column":14},"end":{"line":50,"column":46}},"34":{"start":{"line":51,"column":14},"end":{"line":51,"column":28}},"35":{"start":{"line":56,"column":8},"end":{"line":56,"column":22}},"36":{"start":{"line":62,"column":0},"end":{"line":77,"column":1}},"37":{"start":{"line":63,"column":2},"end":{"line":76,"column":5}},"38":{"start":{"line":64,"column":19},"end":{"line":64,"column":51}},"39":{"start":{"line":65,"column":4},"end":{"line":75,"column":7}},"40":{"start":{"line":66,"column":6},"end":{"line":68,"column":7}},"41":{"start":{"line":67,"column":8},"end":{"line":67,"column":27}},"42":{"start":{"line":69,"column":6},"end":{"line":74,"column":9}},"43":{"start":{"line":70,"column":6},"end":{"line":72,"column":9}},"44":{"start":{"line":71,"column":10},"end":{"line":71,"column":35}},"45":{"start":{"line":73,"column":8},"end":{"line":73,"column":22}},"46":{"start":{"line":79,"column":0},"end":{"line":97,"column":1}},"47":{"start":{"line":80,"column":2},"end":{"line":96,"column":5}},"48":{"start":{"line":81,"column":19},"end":{"line":81,"column":51}},"49":{"start":{"line":82,"column":22},"end":{"line":82,"column":37}},"50":{"start":{"line":83,"column":4},"end":{"line":95,"column":7}},"51":{"start":{"line":84,"column":6},"end":{"line":86,"column":7}},"52":{"start":{"line":85,"column":8},"end":{"line":85,"column":27}},"53":{"start":{"line":87,"column":6},"end":{"line":93,"column":7}},"54":{"start":{"line":88,"column":27},"end":{"line":88,"column":43}},"55":{"start":{"line":89,"column":19},"end":{"line":89,"column":41}},"56":{"start":{"line":90,"column":26},"end":{"line":90,"column":50}},"57":{"start":{"line":91,"column":25},"end":{"line":91,"column":74}},"58":{"start":{"line":92,"column":8},"end":{"line":92,"column":79}},"59":{"start":{"line":94,"column":6},"end":{"line":94,"column":20}},"60":{"start":{"line":99,"column":0},"end":{"line":101,"column":1}},"61":{"start":{"line":100,"column":2},"end":{"line":100,"column":94}},"62":{"start":{"line":106,"column":1},"end":{"line":112,"column":2}},"63":{"start":{"line":107,"column":2},"end":{"line":111,"column":3}},"64":{"start":{"line":108,"column":4},"end":{"line":108,"column":46}},"65":{"start":{"line":110,"column":4},"end":{"line":110,"column":19}},"66":{"start":{"line":114,"column":0},"end":{"line":116,"column":1}},"67":{"start":{"line":115,"column":2},"end":{"line":115,"column":50}},"68":{"start":{"line":118,"column":0},"end":{"line":124,"column":1}},"69":{"start":{"line":119,"column":23},"end":{"line":119,"column":48}},"70":{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},"71":{"start":{"line":121,"column":4},"end":{"line":121,"column":32}},"72":{"start":{"line":123,"column":2},"end":{"line":123,"column":65}},"73":{"start":{"line":126,"column":0},"end":{"line":148,"column":1}},"74":{"start":{"line":128,"column":13},"end":{"line":128,"column":35}},"75":{"start":{"line":129,"column":13},"end":{"line":129,"column":15}},"76":{"start":{"line":131,"column":2},"end":{"line":147,"column":3}},"77":{"start":{"line":132,"column":14},"end":{"line":132,"column":26}},"78":{"start":{"line":133,"column":4},"end":{"line":135,"column":5}},"79":{"start":{"line":134,"column":6},"end":{"line":134,"column":21}},"80":{"start":{"line":136,"column":4},"end":{"line":145,"column":5}},"81":{"start":{"line":137,"column":6},"end":{"line":144,"column":7}},"82":{"start":{"line":138,"column":8},"end":{"line":138,"column":43}},"83":{"start":{"line":141,"column":8},"end":{"line":143,"column":9}},"84":{"start":{"line":142,"column":10},"end":{"line":142,"column":140}},"85":{"start":{"line":146,"column":4},"end":{"line":146,"column":41}},"86":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"87":{"start":{"line":151,"column":0},"end":{"line":151,"column":43}}},"fnMap":{"0":{"name":"FileSystemAdapter","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":26}},"loc":{"start":{"line":13,"column":36},"end":{"line":26,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":41},"end":{"line":28,"column":42}},"loc":{"start":{"line":28,"column":66},"end":{"line":60,"column":1}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":21},"end":{"line":29,"column":22}},"loc":{"start":{"line":29,"column":42},"end":{"line":59,"column":3}},"line":29},"3":{"name":"(anonymous_3)","decl":{"start":{"line":31,"column":33},"end":{"line":31,"column":34}},"loc":{"start":{"line":31,"column":42},"end":{"line":58,"column":5}},"line":31},"4":{"name":"(anonymous_4)","decl":{"start":{"line":41,"column":28},"end":{"line":41,"column":29}},"loc":{"start":{"line":41,"column":39},"end":{"line":54,"column":9}},"line":41},"5":{"name":"(anonymous_5)","decl":{"start":{"line":42,"column":30},"end":{"line":42,"column":31}},"loc":{"start":{"line":42,"column":44},"end":{"line":53,"column":11}},"line":42},"6":{"name":"(anonymous_6)","decl":{"start":{"line":46,"column":49},"end":{"line":46,"column":50}},"loc":{"start":{"line":46,"column":63},"end":{"line":52,"column":13}},"line":46},"7":{"name":"(anonymous_7)","decl":{"start":{"line":62,"column":41},"end":{"line":62,"column":42}},"loc":{"start":{"line":62,"column":60},"end":{"line":77,"column":1}},"line":62},"8":{"name":"(anonymous_8)","decl":{"start":{"line":63,"column":21},"end":{"line":63,"column":22}},"loc":{"start":{"line":63,"column":42},"end":{"line":76,"column":3}},"line":63},"9":{"name":"(anonymous_9)","decl":{"start":{"line":65,"column":28},"end":{"line":65,"column":29}},"loc":{"start":{"line":65,"column":49},"end":{"line":75,"column":5}},"line":65},"10":{"name":"(anonymous_10)","decl":{"start":{"line":69,"column":26},"end":{"line":69,"column":27}},"loc":{"start":{"line":69,"column":41},"end":{"line":74,"column":7}},"line":69},"11":{"name":"(anonymous_11)","decl":{"start":{"line":79,"column":42},"end":{"line":79,"column":43}},"loc":{"start":{"line":79,"column":61},"end":{"line":97,"column":1}},"line":79},"12":{"name":"(anonymous_12)","decl":{"start":{"line":80,"column":21},"end":{"line":80,"column":22}},"loc":{"start":{"line":80,"column":42},"end":{"line":96,"column":3}},"line":80},"13":{"name":"(anonymous_13)","decl":{"start":{"line":83,"column":28},"end":{"line":83,"column":29}},"loc":{"start":{"line":83,"column":49},"end":{"line":95,"column":5}},"line":83},"14":{"name":"(anonymous_14)","decl":{"start":{"line":99,"column":46},"end":{"line":99,"column":47}},"loc":{"start":{"line":99,"column":73},"end":{"line":101,"column":1}},"line":99},"15":{"name":"(anonymous_15)","decl":{"start":{"line":106,"column":50},"end":{"line":106,"column":51}},"loc":{"start":{"line":106,"column":61},"end":{"line":112,"column":2}},"line":106},"16":{"name":"(anonymous_16)","decl":{"start":{"line":114,"column":51},"end":{"line":114,"column":52}},"loc":{"start":{"line":114,"column":62},"end":{"line":116,"column":1}},"line":114},"17":{"name":"(anonymous_17)","decl":{"start":{"line":118,"column":48},"end":{"line":118,"column":49}},"loc":{"start":{"line":118,"column":67},"end":{"line":124,"column":1}},"line":118},"18":{"name":"(anonymous_18)","decl":{"start":{"line":126,"column":37},"end":{"line":126,"column":38}},"loc":{"start":{"line":126,"column":55},"end":{"line":148,"column":1}},"line":126}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":12},"end":{"line":14,"column":25}},"type":"binary-expr","locations":[{"start":{"line":14,"column":12},"end":{"line":14,"column":19}},{"start":{"line":14,"column":23},"end":{"line":14,"column":25}}],"line":14},"1":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"2":{"loc":{"start":{"line":20,"column":26},"end":{"line":20,"column":57}},"type":"binary-expr","locations":[{"start":{"line":20,"column":26},"end":{"line":20,"column":51}},{"start":{"line":20,"column":55},"end":{"line":20,"column":57}}],"line":20},"3":{"loc":{"start":{"line":23,"column":2},"end":{"line":25,"column":3}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":25,"column":3}},{"start":{"line":23,"column":2},"end":{"line":25,"column":3}}],"line":23},"4":{"loc":{"start":{"line":32,"column":6},"end":{"line":34,"column":7}},"type":"if","locations":[{"start":{"line":32,"column":6},"end":{"line":34,"column":7}},{"start":{"line":32,"column":6},"end":{"line":34,"column":7}}],"line":32},"5":{"loc":{"start":{"line":35,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":35,"column":6},"end":{"line":57,"column":7}},{"start":{"line":35,"column":6},"end":{"line":57,"column":7}}],"line":35},"6":{"loc":{"start":{"line":43,"column":12},"end":{"line":45,"column":13}},"type":"if","locations":[{"start":{"line":43,"column":12},"end":{"line":45,"column":13}},{"start":{"line":43,"column":12},"end":{"line":45,"column":13}}],"line":43},"7":{"loc":{"start":{"line":47,"column":14},"end":{"line":49,"column":15}},"type":"if","locations":[{"start":{"line":47,"column":14},"end":{"line":49,"column":15}},{"start":{"line":47,"column":14},"end":{"line":49,"column":15}}],"line":47},"8":{"loc":{"start":{"line":66,"column":6},"end":{"line":68,"column":7}},"type":"if","locations":[{"start":{"line":66,"column":6},"end":{"line":68,"column":7}},{"start":{"line":66,"column":6},"end":{"line":68,"column":7}}],"line":66},"9":{"loc":{"start":{"line":70,"column":6},"end":{"line":72,"column":9}},"type":"if","locations":[{"start":{"line":70,"column":6},"end":{"line":72,"column":9}},{"start":{"line":70,"column":6},"end":{"line":72,"column":9}}],"line":70},"10":{"loc":{"start":{"line":84,"column":6},"end":{"line":86,"column":7}},"type":"if","locations":[{"start":{"line":84,"column":6},"end":{"line":86,"column":7}},{"start":{"line":84,"column":6},"end":{"line":86,"column":7}}],"line":84},"11":{"loc":{"start":{"line":87,"column":6},"end":{"line":93,"column":7}},"type":"if","locations":[{"start":{"line":87,"column":6},"end":{"line":93,"column":7}},{"start":{"line":87,"column":6},"end":{"line":93,"column":7}}],"line":87},"12":{"loc":{"start":{"line":107,"column":2},"end":{"line":111,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":111,"column":3}},{"start":{"line":107,"column":2},"end":{"line":111,"column":3}}],"line":107},"13":{"loc":{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},"type":"if","locations":[{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},{"start":{"line":120,"column":2},"end":{"line":122,"column":3}}],"line":120},"14":{"loc":{"start":{"line":133,"column":4},"end":{"line":135,"column":5}},"type":"if","locations":[{"start":{"line":133,"column":4},"end":{"line":135,"column":5}},{"start":{"line":133,"column":4},"end":{"line":135,"column":5}}],"line":133},"15":{"loc":{"start":{"line":136,"column":4},"end":{"line":145,"column":5}},"type":"if","locations":[{"start":{"line":136,"column":4},"end":{"line":145,"column":5}},{"start":{"line":136,"column":4},"end":{"line":145,"column":5}}],"line":136},"16":{"loc":{"start":{"line":141,"column":8},"end":{"line":143,"column":9}},"type":"if","locations":[{"start":{"line":141,"column":8},"end":{"line":143,"column":9}},{"start":{"line":141,"column":8},"end":{"line":143,"column":9}}],"line":141}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":3,"6":3,"7":3,"8":1,"9":3,"10":3,"11":3,"12":3,"13":0,"14":1,"15":3,"16":3,"17":3,"18":3,"19":0,"20":3,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":0,"30":1,"31":1,"32":0,"33":1,"34":1,"35":2,"36":1,"37":3,"38":3,"39":3,"40":3,"41":0,"42":3,"43":3,"44":0,"45":3,"46":1,"47":4,"48":4,"49":4,"50":4,"51":4,"52":1,"53":3,"54":1,"55":1,"56":1,"57":1,"58":1,"59":3,"60":1,"61":0,"62":1,"63":16,"64":16,"65":0,"66":1,"67":3,"68":1,"69":10,"70":10,"71":0,"72":10,"73":1,"74":3,"75":3,"76":3,"77":9,"78":9,"79":0,"80":9,"81":0,"82":0,"83":0,"84":0,"85":9,"86":1,"87":1},"f":{"0":3,"1":3,"2":3,"3":3,"4":1,"5":1,"6":1,"7":3,"8":3,"9":3,"10":3,"11":4,"12":4,"13":4,"14":0,"15":16,"16":3,"17":10,"18":3},"b":{"0":[3,0],"1":[1,2],"2":[3,0],"3":[0,3],"4":[0,3],"5":[1,2],"6":[0,1],"7":[0,1],"8":[0,3],"9":[0,3],"10":[1,3],"11":[1,2],"12":[16,0],"13":[0,10],"14":[0,9],"15":[0,9],"16":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"30bf8926b2035b6ee3aae42a21a022390e665ba4","contentHash":"6424bdb3b380a1dce6a9731bd3624ede67187951a58965e7d4cc266ad3102981"},"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/secureFiles.spec.js":{"path":"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/secureFiles.spec.js","statementMap":{"0":{"start":{"line":2,"column":24},"end":{"line":2,"column":46}},"1":{"start":{"line":3,"column":9},"end":{"line":3,"column":22}},"2":{"start":{"line":5,"column":0},"end":{"line":40,"column":2}},"3":{"start":{"line":6,"column":22},"end":{"line":6,"column":33}},"4":{"start":{"line":8,"column":4},"end":{"line":22,"column":13}},"5":{"start":{"line":9,"column":22},"end":{"line":11,"column":10}},"6":{"start":{"line":12,"column":23},"end":{"line":12,"column":33}},"7":{"start":{"line":13,"column":25},"end":{"line":13,"column":56}},"8":{"start":{"line":14,"column":8},"end":{"line":14,"column":71}},"9":{"start":{"line":15,"column":23},"end":{"line":15,"column":58}},"10":{"start":{"line":16,"column":8},"end":{"line":16,"column":52}},"11":{"start":{"line":17,"column":8},"end":{"line":17,"column":64}},"12":{"start":{"line":18,"column":21},"end":{"line":18,"column":46}},"13":{"start":{"line":19,"column":8},"end":{"line":19,"column":62}},"14":{"start":{"line":20,"column":8},"end":{"line":20,"column":43}},"15":{"start":{"line":21,"column":8},"end":{"line":21,"column":14}},"16":{"start":{"line":24,"column":4},"end":{"line":39,"column":13}},"17":{"start":{"line":25,"column":22},"end":{"line":28,"column":10}},"18":{"start":{"line":29,"column":23},"end":{"line":29,"column":34}},"19":{"start":{"line":30,"column":25},"end":{"line":30,"column":56}},"20":{"start":{"line":31,"column":8},"end":{"line":31,"column":71}},"21":{"start":{"line":32,"column":23},"end":{"line":32,"column":58}},"22":{"start":{"line":33,"column":8},"end":{"line":33,"column":52}},"23":{"start":{"line":34,"column":8},"end":{"line":34,"column":64}},"24":{"start":{"line":35,"column":21},"end":{"line":35,"column":46}},"25":{"start":{"line":36,"column":8},"end":{"line":36,"column":66}},"26":{"start":{"line":37,"column":8},"end":{"line":37,"column":43}},"27":{"start":{"line":38,"column":8},"end":{"line":38,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":34},"end":{"line":5,"column":35}},"loc":{"start":{"line":5,"column":40},"end":{"line":40,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":61},"end":{"line":8,"column":62}},"loc":{"start":{"line":8,"column":82},"end":{"line":22,"column":5}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":59},"end":{"line":24,"column":60}},"loc":{"start":{"line":24,"column":80},"end":{"line":39,"column":5}},"line":24}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1},"f":{"0":1,"1":1,"2":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d96acb2466b9e7bf3e24c4e9db5cbbfd5e9c9777","contentHash":"1759431e36478012a90e398b922dcc7bb6907a85add3d89b7252d87bed7a6d6f"}} \ No newline at end of file diff --git a/.nyc_output/processinfo/f3fae726-02d4-454e-9b2e-e2450bdd2664.json b/.nyc_output/processinfo/f3fae726-02d4-454e-9b2e-e2450bdd2664.json deleted file mode 100644 index 7b5e492..0000000 --- a/.nyc_output/processinfo/f3fae726-02d4-454e-9b2e-e2450bdd2664.json +++ /dev/null @@ -1 +0,0 @@ -{"parent":null,"pid":53265,"argv":["/usr/local/Cellar/node/13.11.0/bin/node","/Users/MacJr/Documents/github/parse-server-fs-adapter/node_modules/.bin/jasmine"],"execArgv":[],"cwd":"/Users/MacJr/Documents/github/parse-server-fs-adapter","time":1593524563088,"ppid":53264,"coverageFilename":"/Users/MacJr/Documents/github/parse-server-fs-adapter/.nyc_output/f3fae726-02d4-454e-9b2e-e2450bdd2664.json","externalId":"","uuid":"f3fae726-02d4-454e-9b2e-e2450bdd2664","files":["/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/test.spec.js","/Users/MacJr/Documents/github/parse-server-fs-adapter/index.js","/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/secureFiles.spec.js"]} \ No newline at end of file diff --git a/.nyc_output/processinfo/index.json b/.nyc_output/processinfo/index.json deleted file mode 100644 index 6d1a3e9..0000000 --- a/.nyc_output/processinfo/index.json +++ /dev/null @@ -1 +0,0 @@ -{"processes":{"f3fae726-02d4-454e-9b2e-e2450bdd2664":{"parent":null,"children":[]}},"files":{"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/test.spec.js":["f3fae726-02d4-454e-9b2e-e2450bdd2664"],"/Users/MacJr/Documents/github/parse-server-fs-adapter/index.js":["f3fae726-02d4-454e-9b2e-e2450bdd2664"],"/Users/MacJr/Documents/github/parse-server-fs-adapter/spec/secureFiles.spec.js":["f3fae726-02d4-454e-9b2e-e2450bdd2664"]},"externalIds":{}} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 6fe8e84..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1792 +0,0 @@ -{ - "name": "@parse/fs-files-adapter", - "version": "1.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", - "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.3" - } - }, - "@babel/core": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.3.tgz", - "integrity": "sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/generator": "^7.10.3", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.3", - "@babel/template": "^7.10.3", - "@babel/traverse": "^7.10.3", - "@babel/types": "^7.10.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", - "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", - "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.3", - "@babel/template": "^7.10.3", - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", - "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz", - "integrity": "sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz", - "integrity": "sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz", - "integrity": "sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", - "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", - "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", - "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.3", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", - "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==", - "dev": true - }, - "@babel/template": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", - "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3" - } - }, - "@babel/traverse": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", - "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/generator": "^7.10.3", - "@babel/helper-function-name": "^7.10.3", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", - "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.3", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "codecov": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-1.0.1.tgz", - "integrity": "sha1-lyYM6sDpa47ajVYgBlWKU6E53/0=", - "dev": true, - "requires": { - "argv": ">=0.0.2", - "execSync": "1.0.2", - "request": ">=2.42.0", - "urlgrey": ">=0.4.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "execSync": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/execSync/-/execSync-1.0.2.tgz", - "integrity": "sha1-H0LtpYIiUYAFMiTs3T/Rlg/bMTk=", - "dev": true, - "requires": { - "temp": "~0.5.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fromentries": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", - "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true, - "optional": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "hasha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", - "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jasmine": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", - "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", - "dev": true, - "requires": { - "glob": "^7.1.4", - "jasmine-core": "~3.5.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "jasmine-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "parse-server-conformance-tests": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-server-conformance-tests/-/parse-server-conformance-tests-1.0.0.tgz", - "integrity": "sha1-19t3j4i5ZaJTcQaOXSddr4Cl+hk=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "rimraf": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.1.4.tgz", - "integrity": "sha1-Wm62Lu2gaPUe3lDymz5c0i89m7I=", - "dev": true, - "requires": { - "graceful-fs": "~1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "temp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.5.1.tgz", - "integrity": "sha1-d6sZx5qntZPL5PrCRBdoytmHuN8=", - "dev": true, - "requires": { - "rimraf": "~2.1.4" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urlgrey": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} From c9f9db85e341ca70773509812950208ee4f50dba Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Tue, 30 Jun 2020 10:06:17 -0400 Subject: [PATCH 11/42] Use AES 256 GCM to detect file tampering --- index.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index dacbef1..340ccac 100644 --- a/index.js +++ b/index.js @@ -8,7 +8,7 @@ var fs = require('fs'); var path = require('path'); var pathSep = require('path').sep; const crypto = require("crypto"); -const algorithm = 'aes-256-cbc'; +const algorithm = 'aes-256-gcm'; function FileSystemAdapter(options) { options = options || {}; @@ -47,7 +47,9 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { if (err !== null) { return reject(err); } + const authTag = cipher.getAuthTag(); fs.appendFileSync(filepath, iv); + fs.appendFileSync(filepath, authTag); resolve(data); }); }); @@ -85,10 +87,13 @@ FileSystemAdapter.prototype.getFileData = function(filename) { return reject(err); } if(secretKey !== null){ - const ivLocation = data.length - 16; - const iv = data.slice(ivLocation); + const authTagLocation = data.length - 16; + const ivLocation = data.length - 32; + const authTag = data.slice(authTagLocation); + const iv = data.slice(ivLocation,authTagLocation); const encrypted = data.slice(0,ivLocation); const decipher = crypto.createDecipheriv(algorithm, secretKey, iv); + decipher.setAuthTag(authTag) resolve(Buffer.concat([decipher.update(encrypted), decipher.final()])); } resolve(data); From 11c6f3c1804dd8d350b0646c29eb999819693703 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Tue, 30 Jun 2020 10:28:43 -0400 Subject: [PATCH 12/42] remove codecov from package.json --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index a4d636b..4d2fa1e 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,6 @@ "author": "Parse", "license": "MIT", "devDependencies": { - "codecov": "^1.0.1", "nyc": "^15.1.0", "jasmine": "^3.5.0", "parse-server-conformance-tests": "^1.0.0" From 9f4fd111091710f79109ec54d68cd15d895960c3 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Tue, 30 Jun 2020 10:31:41 -0400 Subject: [PATCH 13/42] add repo field to get rid of npm install warning --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index 4d2fa1e..d4749aa 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,10 @@ "version": "1.0.1", "description": "File system adapter for parse-server", "main": "index.js", + "repository": { + "type": "git", + "url": "https://github.com/parse-community/parse-server-fs-adapter" + }, "scripts": { "test": "nyc jasmine" }, From fb7517f06cd8ea8b5ade68c90cb446351f353729 Mon Sep 17 00:00:00 2001 From: Corey Date: Tue, 30 Jun 2020 11:43:54 -0400 Subject: [PATCH 14/42] Fix options --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9004c2f..7a7afe3 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ parse-server file system storage adapter "module": "@parse/fs-files-adapter", "options": { "filesSubDirectory": "my/files/folder" // optional - "secretKey: 'someKey' //optional, but mandatory if you want to encrypt files + "secretKey": "someKey" //optional, but mandatory if you want to encrypt files } } } From 92013a4059351c275b5eb8b2c41d3df01dfe11cb Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Wed, 1 Jul 2020 08:06:32 -0400 Subject: [PATCH 15/42] switch secretKey to fileKey --- README.md | 2 +- index.js | 16 ++++++++-------- spec/secureFiles.spec.js | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 9004c2f..86660a3 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ parse-server file system storage adapter "module": "@parse/fs-files-adapter", "options": { "filesSubDirectory": "my/files/folder" // optional - "secretKey: 'someKey' //optional, but mandatory if you want to encrypt files + "fileKey: 'someKey' //optional, but mandatory if you want to encrypt files } } } diff --git a/index.js b/index.js index 340ccac..6fbdc66 100644 --- a/index.js +++ b/index.js @@ -12,10 +12,10 @@ const algorithm = 'aes-256-gcm'; function FileSystemAdapter(options) { options = options || {}; - this._secretKey = null; + this._fileKey = null; - if (options.secretKey !== undefined){ - this._secretKey = crypto.createHash('sha256').update(String(options.secretKey)).digest('base64').substr(0, 32); + if (options.fileKey !== undefined){ + this._fileKey = crypto.createHash('sha256').update(String(options.fileKey)).digest('base64').substr(0, 32); } let filesSubDirectory = options.filesSubDirectory || ''; this._filesDir = filesSubDirectory; @@ -32,9 +32,9 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { if(err !== null) { return reject(err); } - if(this._secretKey !== null){ + if(this._fileKey !== null){ const iv = crypto.randomBytes(16); - const cipher = crypto.createCipheriv(algorithm, this._secretKey, iv); + const cipher = crypto.createCipheriv(algorithm, this._fileKey, iv); const input = fs.createReadStream(filepath); const output = fs.createWriteStream(filepath+'.enc'); input.pipe(cipher).pipe(output); @@ -81,18 +81,18 @@ FileSystemAdapter.prototype.deleteFile = function(filename) { FileSystemAdapter.prototype.getFileData = function(filename) { return new Promise((resolve, reject) => { let filepath = this._getLocalFilePath(filename); - const secretKey = this._secretKey; + const fileKey = this._fileKey; fs.readFile( filepath , function (err, data) { if(err !== null) { return reject(err); } - if(secretKey !== null){ + if(fileKey !== null){ const authTagLocation = data.length - 16; const ivLocation = data.length - 32; const authTag = data.slice(authTagLocation); const iv = data.slice(ivLocation,authTagLocation); const encrypted = data.slice(0,ivLocation); - const decipher = crypto.createDecipheriv(algorithm, secretKey, iv); + const decipher = crypto.createDecipheriv(algorithm, fileKey, iv); decipher.setAuthTag(authTag) resolve(Buffer.concat([decipher.update(encrypted), decipher.final()])); } diff --git a/spec/secureFiles.spec.js b/spec/secureFiles.spec.js index 6e309ee..050a095 100644 --- a/spec/secureFiles.spec.js +++ b/spec/secureFiles.spec.js @@ -24,7 +24,7 @@ describe('File encryption tests', () => { it("should save/delete file in it's encrypted format", async function(done) { var adapter = new FileSystemAdapter({ filesSubDirectory: directory, - secretKey: '89E4AFF1-DFE4-4603-9574-BFA16BB446FD' + fileKey: '89E4AFF1-DFE4-4603-9574-BFA16BB446FD' }); var filename = 'file2.txt'; const filePath = 'files/'+directory+'/'+filename; From d2fce741867892f9b6da64144e3cd1972691e864 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Wed, 1 Jul 2020 17:12:37 -0400 Subject: [PATCH 16/42] added the ability to rotate fileKeys --- README.md | 55 ++++++++-- index.js | 97 +++++++++++++---- spec/secureFiles.spec.js | 226 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 351 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 590b4e2..84c62ef 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ parse-server file system storage adapter -# installation +# Installation `npm install --save @parse/fs-files-adapter` -# usage with parse-server +# Usage with parse-server ### using a config file @@ -21,21 +21,22 @@ parse-server file system storage adapter "filesAdapter": { "module": "@parse/fs-files-adapter", "options": { - "filesSubDirectory": "my/files/folder" // optional + "filesSubDirectory": "my/files/folder", // optional "fileKey": "someKey" //optional, but mandatory if you want to encrypt files } } } ``` -### passing as an instance +### Passing as an instance ``` var FSFilesAdapter = require('@parse/fs-files-adapter'); var fsAdapter = new FSFilesAdapter({ - "filesSubDirectory": "my/files/folder" // optional - }); + "filesSubDirectory": "my/files/folder", // optional + "fileKey": "someKey" //optional, but mandatory if you want to encrypt files +}); var api = new ParseServer({ appId: 'my_app', @@ -44,3 +45,45 @@ var api = new ParseServer({ }) ``` +### Rotating to a new fileKey +Periodically you may want to rotate your fileKey for security reasons. When this is the case. Initialize the file adapter with the new key and do the following in your `index.js`: + +#### Files were previously unencrypted and you want to encrypt +``` +var FSFilesAdapter = require('@parse/fs-files-adapter'); + +var fsAdapter = new FSFilesAdapter({ + "filesSubDirectory": "my/files/folder", // optional + "fileKey": "newKey" //Use the newKey +}); + +var api = new ParseServer({ + appId: 'my_app', + masterKey: 'master_key', + filesAdapter: fsAdapter +}) + +//This can take awhile depending on how many files and how larger they are. It will attempt to rotate the key of all files in your filesSubDirectory +const {rotated, notRotated} = await api.filesAdapter.rotateFileKey(); +console.log('Files rotated to newKey: ' + rotated); +console.log('Files that couldn't be rotated to newKey: ' + notRotated); +``` + + +#### Files were previously encrypted with `oldKey` and you want to encrypt with `newKey` +The same process as above, but pass in your `oldKey` to `rotateFileKey()`. +``` +//This can take awhile depending on how many files and how larger they are. It will attempt to rotate the key of all files in your filesSubDirectory +const {rotated, notRotated} = await api.filesAdapter.rotateFileKey({oldKey: oldKey}); +console.log('Files rotated to newKey: ' + rotated); +console.log('Files that couldn't be rotated to newKey: ' + notRotated); +``` + +#### Only rotate a select list of files that were previously encrypted with `oldKey` and you want to encrypt with `newKey` +This is useful if for some reason there errors and some of the files werent rotated and returned in `notRotated`. The same process as above, but pass in your `oldKey` along with the array of `fileNames` to `rotateFileKey()`. +``` +//This can take awhile depending on how many files and how larger they are. It will attempt to rotate the key of all files in your filesSubDirectory +const {rotated, notRotated} = await api.filesAdapter.rotateFileKey({oldKey: oldKey, fileNames: [fileName1,fileName2]}); +console.log('Files rotated to newKey: ' + rotated); +console.log('Files that couldn't be rotated to newKey: ' + notRotated); +``` \ No newline at end of file diff --git a/index.js b/index.js index 6fbdc66..d69a4a0 100644 --- a/index.js +++ b/index.js @@ -33,27 +33,31 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { return reject(err); } if(this._fileKey !== null){ - const iv = crypto.randomBytes(16); - const cipher = crypto.createCipheriv(algorithm, this._fileKey, iv); - const input = fs.createReadStream(filepath); - const output = fs.createWriteStream(filepath+'.enc'); - input.pipe(cipher).pipe(output); - output.on('finish', function() { - fs.unlink(filepath, function(err) { - if (err !== null) { - return reject(err); - } - fs.rename(filepath+'.enc', filepath, function(err) { + try{ + const iv = crypto.randomBytes(16); + const cipher = crypto.createCipheriv(algorithm, this._fileKey, iv); + const input = fs.createReadStream(filepath); + const output = fs.createWriteStream(filepath+'.enc'); + input.pipe(cipher).pipe(output); + output.on('finish', function() { + fs.unlink(filepath, function(err) { if (err !== null) { return reject(err); } - const authTag = cipher.getAuthTag(); - fs.appendFileSync(filepath, iv); - fs.appendFileSync(filepath, authTag); - resolve(data); + fs.rename(filepath+'.enc', filepath, function(err) { + if (err !== null) { + return reject(err); + } + const authTag = cipher.getAuthTag(); + fs.appendFileSync(filepath, iv); + fs.appendFileSync(filepath, authTag); + return resolve(data); + }); }); }); - }); + }catch(err){ + return reject(err); + } }else{ resolve(data); } @@ -92,15 +96,70 @@ FileSystemAdapter.prototype.getFileData = function(filename) { const authTag = data.slice(authTagLocation); const iv = data.slice(ivLocation,authTagLocation); const encrypted = data.slice(0,ivLocation); - const decipher = crypto.createDecipheriv(algorithm, fileKey, iv); - decipher.setAuthTag(authTag) - resolve(Buffer.concat([decipher.update(encrypted), decipher.final()])); + try{ + const decipher = crypto.createDecipheriv(algorithm, fileKey, iv); + decipher.setAuthTag(authTag); + const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]); + return resolve(decrypted); + }catch(err){ + return reject(err); + } } resolve(data); }); }); } +FileSystemAdapter.prototype.rotateFileKey = function(options = {}) { + return new Promise((resolve, _reject) => { + const applicationDir = this._getApplicationDir(); + var fileNames = []; + var oldKeyFileAdapter = {}; + if (options.oldKey !== undefined) { + oldKeyFileAdapter = new FileSystemAdapter({filesSubDirectory: this._filesDir, fileKey: options.oldKey}); + }else{ + oldKeyFileAdapter = new FileSystemAdapter({filesSubDirectory: this._filesDir}); + } + if (options.fileNames !== undefined){ + fileNames = options.fileNames; + }else{ + fileNames = fs.readdirSync(applicationDir); + fileNames = fileNames.filter(fileName => fileName.indexOf('.') !== 0); + } + var fileNamesNotRotated = fileNames; + var fileNamesRotated = []; + var fileNameTotal = fileNames.length; + var fileNameIndex = 0; + fileNames.forEach(fileName => { + oldKeyFileAdapter.getFileData(fileName) + .then(plainTextData => { + //Overwrite file with data encrypted with new key + this.createFile(fileName, plainTextData) + .then(() => { + fileNamesRotated.push(fileName); + fileNamesNotRotated = fileNamesNotRotated.filter(function(value, _index, _arr){ return value !== fileName;}) + fileNameIndex += 1; + if (fileNameIndex == fileNameTotal){ + resolve({rotated: fileNamesRotated, notRotated: fileNamesNotRotated}); + } + }) + .catch(() => { + fileNameIndex += 1; + if (fileNameIndex == fileNameTotal){ + resolve({rotated: fileNamesRotated, notRotated: fileNamesNotRotated}); + } + }) + }) + .catch(() => { + fileNameIndex += 1; + if (fileNameIndex == fileNameTotal){ + resolve({rotated: fileNamesRotated, notRotated: fileNamesNotRotated}); + } + }); + }); + }); +} + FileSystemAdapter.prototype.getFileLocation = function(config, filename) { return config.mount + '/files/' + config.applicationId + '/' + encodeURIComponent(filename); } diff --git a/spec/secureFiles.spec.js b/spec/secureFiles.spec.js index 050a095..da04245 100644 --- a/spec/secureFiles.spec.js +++ b/spec/secureFiles.spec.js @@ -1,10 +1,24 @@ 'use strict'; let FileSystemAdapter = require('../index.js'); var fs = require('fs'); +var path = require('path'); describe('File encryption tests', () => { const directory = 'sub1/sub2'; + afterEach(function() { + //Use adapter to make directory if needed + var adapter = new FileSystemAdapter({ + filesSubDirectory: directory + }); + const filePath = path.join('files', directory); + var fileNames = fs.readdirSync(filePath); + fileNames.filter(fileName => fileName.indexOf('.') === 0); + fileNames.forEach(fileName => { + fs.unlinkSync(path.join(filePath, fileName)); + }) + }); + it("should save/delete file in it's unencrypted format", async function(done) { var adapter = new FileSystemAdapter({ filesSubDirectory: directory @@ -17,7 +31,6 @@ describe('File encryption tests', () => { expect(result.toString('utf-8')).toEqual("hello world"); const data = fs.readFileSync(filePath); expect(data.toString('utf-8')).toEqual("hello world"); - await adapter.deleteFile(filename); done() }, 5000); @@ -34,7 +47,216 @@ describe('File encryption tests', () => { expect(result.toString('utf-8')).toEqual("hello world"); const data = fs.readFileSync(filePath); expect(data.toString('utf-8')).not.toEqual("hello world"); - await adapter.deleteFile(filename); + done() + }, 5000); + + it("should rotate key of all unencrypted files to encrypted files", async function(done) { + const unEncryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory + }); + const encryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory, + fileKey: '89E4AFF1-DFE4-4603-9574-BFA16BB446FD' + }); + const fileName1 = 'file1.txt'; + const data1 = "hello world"; + const fileName2 = 'file2.txt'; + const data2 = "hello new world"; + const filePath1 = 'files/'+directory+'/'+fileName1; + const filePath2 = 'files/'+directory+'/'+fileName2; + //Store unecrypted files + await unEncryptedAdapter.createFile(fileName1, data1, 'text/utf8'); + var result = await unEncryptedAdapter.getFileData(fileName1); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data1); + const unEncryptedData1 = fs.readFileSync(filePath1); + await unEncryptedAdapter.createFile(fileName2, data2, 'text/utf8'); + result = await unEncryptedAdapter.getFileData(fileName2); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data2); + const unEncryptedData2 = fs.readFileSync(filePath2); + + //Check if encrypted adapter can read data and make sure it's not the same as unEncrypted adapter + const {rotated, notRotated} = await encryptedAdapter.rotateFileKey(); + expect(rotated.length).toEqual(2); + expect(rotated.filter(function(value, _index, _arr){ return value === fileName1;}).length).toEqual(1); + expect(rotated.filter(function(value, _index, _arr){ return value === fileName2;}).length).toEqual(1); + expect(notRotated.length).toEqual(0); + result = await encryptedAdapter.getFileData(fileName1); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data1); + const encryptedData1 = fs.readFileSync(filePath1); + expect(encryptedData1.toString('utf-8')).not.toEqual(unEncryptedData1); + result = await encryptedAdapter.getFileData(fileName2); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data2); + const encryptedData2 = fs.readFileSync(filePath2); + expect(encryptedData2.toString('utf-8')).not.toEqual(unEncryptedData2); + done() + }, 5000); + + it("should rotate key of all old encrypted files to new encrypted files", async function(done) { + const oldFileKey = 'oldKeyThatILoved'; + const oldEncryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory, + fileKey: oldFileKey + }); + const encryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory, + fileKey: 'newKeyThatILove' + }); + const fileName1 = 'file1.txt'; + const data1 = "hello world"; + const fileName2 = 'file2.txt'; + const data2 = "hello new world"; + const filePath1 = 'files/'+directory+'/'+fileName1; + const filePath2 = 'files/'+directory+'/'+fileName2; + //Store original encrypted files + await oldEncryptedAdapter.createFile(fileName1, data1, 'text/utf8'); + var result = await oldEncryptedAdapter.getFileData(fileName1); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data1); + const oldEncryptedData1 = fs.readFileSync(filePath1); + await oldEncryptedAdapter.createFile(fileName2, data2, 'text/utf8'); + result = await oldEncryptedAdapter.getFileData(fileName2); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data2); + const oldEncryptedData2 = fs.readFileSync(filePath2); + + //Check if encrypted adapter can read data and make sure it's not the same as unEncrypted adapter + const {rotated, notRotated} = await encryptedAdapter.rotateFileKey({oldKey: oldFileKey}); + expect(rotated.length).toEqual(2); + expect(rotated.filter(function(value, _index, _arr){ return value === fileName1;}).length).toEqual(1); + expect(rotated.filter(function(value, _index, _arr){ return value === fileName2;}).length).toEqual(1); + expect(notRotated.length).toEqual(0); + var result2 = await encryptedAdapter.getFileData(fileName1); + expect(result2 instanceof Buffer).toBe(true); + expect(result2.toString('utf-8')).toEqual(data1); + const encryptedData1 = fs.readFileSync(filePath1); + expect(encryptedData1.toString('utf-8')).not.toEqual(oldEncryptedData1); + result = await encryptedAdapter.getFileData(fileName2); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data2); + const encryptedData2 = fs.readFileSync(filePath2); + expect(encryptedData2.toString('utf-8')).not.toEqual(oldEncryptedData2); + done() + }, 5000); + + it("should only encrypt specified fileNames with the new key", async function(done) { + const oldFileKey = 'oldKeyThatILoved'; + const oldEncryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory, + fileKey: oldFileKey + }); + const encryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory, + fileKey: 'newKeyThatILove' + }); + const unEncryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory + }); + const fileName1 = 'file1.txt'; + const data1 = "hello world"; + const fileName2 = 'file2.txt'; + const data2 = "hello new world"; + const filePath1 = 'files/'+directory+'/'+fileName1; + const filePath2 = 'files/'+directory+'/'+fileName2; + //Store original encrypted files + await oldEncryptedAdapter.createFile(fileName1, data1, 'text/utf8'); + var result = await oldEncryptedAdapter.getFileData(fileName1); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data1); + const oldEncryptedData1 = fs.readFileSync(filePath1); + await oldEncryptedAdapter.createFile(fileName2, data2, 'text/utf8'); + result = await oldEncryptedAdapter.getFileData(fileName2); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data2); + const oldEncryptedData2 = fs.readFileSync(filePath2); + + //Inject unecrypted file to see if causes an issue + const fileName3 = 'file3.txt'; + const data3 = "hello past world"; + const filePath3 = 'files/'+directory+'/'+fileName3; + await unEncryptedAdapter.createFile(fileName3, data3, 'text/utf8'); + + //Check if encrypted adapter can read data and make sure it's not the same as unEncrypted adapter + const {rotated, notRotated} = await encryptedAdapter.rotateFileKey({oldKey: oldFileKey, fileNames: [fileName1,fileName2]}); + expect(rotated.length).toEqual(2); + expect(rotated.filter(function(value, _index, _arr){ return value === fileName1;}).length).toEqual(1); + expect(rotated.filter(function(value, _index, _arr){ return value === fileName2;}).length).toEqual(1); + expect(notRotated.length).toEqual(0); + expect(rotated.filter(function(value, _index, _arr){ return value === fileName3;}).length).toEqual(0); + var result2 = await encryptedAdapter.getFileData(fileName1); + expect(result2 instanceof Buffer).toBe(true); + expect(result2.toString('utf-8')).toEqual(data1); + const encryptedData1 = fs.readFileSync(filePath1); + expect(encryptedData1.toString('utf-8')).not.toEqual(oldEncryptedData1); + result = await encryptedAdapter.getFileData(fileName2); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data2); + const encryptedData2 = fs.readFileSync(filePath2); + expect(encryptedData2.toString('utf-8')).not.toEqual(oldEncryptedData2); + done() + }, 5000); + + it("should return fileNames of those it can't encrypt with the new key", async function(done) { + const oldFileKey = 'oldKeyThatILoved'; + const oldEncryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory, + fileKey: oldFileKey + }); + const encryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory, + fileKey: 'newKeyThatILove' + }); + const unEncryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory + }); + const fileName1 = 'file1.txt'; + const data1 = "hello world"; + const fileName2 = 'file2.txt'; + const data2 = "hello new world"; + const filePath1 = 'files/'+directory+'/'+fileName1; + const filePath2 = 'files/'+directory+'/'+fileName2; + //Store original encrypted files + await oldEncryptedAdapter.createFile(fileName1, data1, 'text/utf8'); + var result = await oldEncryptedAdapter.getFileData(fileName1); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data1); + const oldEncryptedData1 = fs.readFileSync(filePath1); + await oldEncryptedAdapter.createFile(fileName2, data2, 'text/utf8'); + result = await oldEncryptedAdapter.getFileData(fileName2); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data2); + const oldEncryptedData2 = fs.readFileSync(filePath2); + + //Inject unecrypted file to cause an issue + const fileName3 = 'file3.txt'; + const data3 = "hello past world"; + const filePath3 = 'files/'+directory+'/'+fileName3; + await unEncryptedAdapter.createFile(fileName3, data3, 'text/utf8'); + var result = await unEncryptedAdapter.getFileData(fileName3); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data3); + + //Check if encrypted adapter can read data and make sure it's not the same as unEncrypted adapter + var expectedError = ''; + const {rotated, notRotated} = await encryptedAdapter.rotateFileKey({oldKey: oldFileKey}); + expect(rotated.length).toEqual(2); + expect(rotated.filter(function(value, _index, _arr){ return value === fileName1;}).length).toEqual(1); + expect(rotated.filter(function(value, _index, _arr){ return value === fileName2;}).length).toEqual(1); + expect(notRotated.length).toEqual(1); + expect(notRotated.filter(function(value, _index, _arr){ return value === fileName3;}).length).toEqual(1); + var result2 = await encryptedAdapter.getFileData(fileName1); + expect(result2 instanceof Buffer).toBe(true); + expect(result2.toString('utf-8')).toEqual(data1); + const encryptedData1 = fs.readFileSync(filePath1); + expect(encryptedData1.toString('utf-8')).not.toEqual(oldEncryptedData1); + result = await encryptedAdapter.getFileData(fileName2); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data2); + const encryptedData2 = fs.readFileSync(filePath2); + expect(encryptedData2.toString('utf-8')).not.toEqual(oldEncryptedData2); done() }, 5000); }) From b42d683e961516f988e92aed20b22b75597c61ea Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Wed, 1 Jul 2020 17:16:53 -0400 Subject: [PATCH 17/42] add syntax highlighting to readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 84c62ef..9a467a4 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ parse-server file system storage adapter ### using a config file -``` +```javascript { "appId": 'my_app_id', "masterKey": 'my_master_key', @@ -30,7 +30,7 @@ parse-server file system storage adapter ### Passing as an instance -``` +```javascript var FSFilesAdapter = require('@parse/fs-files-adapter'); var fsAdapter = new FSFilesAdapter({ @@ -49,7 +49,7 @@ var api = new ParseServer({ Periodically you may want to rotate your fileKey for security reasons. When this is the case. Initialize the file adapter with the new key and do the following in your `index.js`: #### Files were previously unencrypted and you want to encrypt -``` +```javascript var FSFilesAdapter = require('@parse/fs-files-adapter'); var fsAdapter = new FSFilesAdapter({ @@ -72,7 +72,7 @@ console.log('Files that couldn't be rotated to newKey: ' + notRotated); #### Files were previously encrypted with `oldKey` and you want to encrypt with `newKey` The same process as above, but pass in your `oldKey` to `rotateFileKey()`. -``` +```javascript //This can take awhile depending on how many files and how larger they are. It will attempt to rotate the key of all files in your filesSubDirectory const {rotated, notRotated} = await api.filesAdapter.rotateFileKey({oldKey: oldKey}); console.log('Files rotated to newKey: ' + rotated); @@ -81,7 +81,7 @@ console.log('Files that couldn't be rotated to newKey: ' + notRotated); #### Only rotate a select list of files that were previously encrypted with `oldKey` and you want to encrypt with `newKey` This is useful if for some reason there errors and some of the files werent rotated and returned in `notRotated`. The same process as above, but pass in your `oldKey` along with the array of `fileNames` to `rotateFileKey()`. -``` +```javascript //This can take awhile depending on how many files and how larger they are. It will attempt to rotate the key of all files in your filesSubDirectory const {rotated, notRotated} = await api.filesAdapter.rotateFileKey({oldKey: oldKey, fileNames: [fileName1,fileName2]}); console.log('Files rotated to newKey: ' + rotated); From 0d25c2c07382c529c221b6e423c537d9eb00fbda Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Wed, 1 Jul 2020 18:47:13 -0400 Subject: [PATCH 18/42] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d4749aa..d39325b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@parse/fs-files-adapter", - "version": "1.0.1", + "version": "1.0.2", "description": "File system adapter for parse-server", "main": "index.js", "repository": { From f633f7026304f506770bd8e1e4084480b0b83c73 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Wed, 1 Jul 2020 19:18:42 -0400 Subject: [PATCH 19/42] attempt to fix coverage --- .nycrc | 9 +++++++++ .travis.yml | 6 +++++- package.json | 3 ++- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 .nycrc diff --git a/.nycrc b/.nycrc new file mode 100644 index 0000000..ab1a82c --- /dev/null +++ b/.nycrc @@ -0,0 +1,9 @@ +{ + "reporter": [ + "lcov", + "text-summary" + ], + "exclude": [ + "**/spec/**" + ] +} diff --git a/.travis.yml b/.travis.yml index 6c5cf44..23950c1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,4 +4,8 @@ branches: language: node_js node_js: - 8 -after_success: ./node_modules/.bin/codecov +env: + global: + - COVERAGE_OPTION='./node_modules/.bin/nyc' +script: npm run coverage +after_scrypt: bash <(curl -s https://codecov.io/bash) diff --git a/package.json b/package.json index d39325b..0e76684 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "url": "https://github.com/parse-community/parse-server-fs-adapter" }, "scripts": { - "test": "nyc jasmine" + "test": "jasmine", + "coverage": "nyc jasmine" }, "keywords": [ "parse-server", From e07ec5887966ab3b88364e5267668d737908e47d Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Wed, 1 Jul 2020 19:48:06 -0400 Subject: [PATCH 20/42] update testcase title --- spec/secureFiles.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/secureFiles.spec.js b/spec/secureFiles.spec.js index da04245..1c69dc9 100644 --- a/spec/secureFiles.spec.js +++ b/spec/secureFiles.spec.js @@ -19,7 +19,7 @@ describe('File encryption tests', () => { }) }); - it("should save/delete file in it's unencrypted format", async function(done) { + it("should save file in it's unencrypted format", async function(done) { var adapter = new FileSystemAdapter({ filesSubDirectory: directory }); @@ -34,7 +34,7 @@ describe('File encryption tests', () => { done() }, 5000); - it("should save/delete file in it's encrypted format", async function(done) { + it("should save file in it's encrypted format", async function(done) { var adapter = new FileSystemAdapter({ filesSubDirectory: directory, fileKey: '89E4AFF1-DFE4-4603-9574-BFA16BB446FD' From 7f1784c9ac0fdf5ff58ac1620fd242d9b6353eb8 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Thu, 2 Jul 2020 01:07:03 -0400 Subject: [PATCH 21/42] clean up unused vars --- index.js | 2 +- spec/secureFiles.spec.js | 28 ++++++++++------------------ 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/index.js b/index.js index d69a4a0..a5ae10f 100644 --- a/index.js +++ b/index.js @@ -137,7 +137,7 @@ FileSystemAdapter.prototype.rotateFileKey = function(options = {}) { this.createFile(fileName, plainTextData) .then(() => { fileNamesRotated.push(fileName); - fileNamesNotRotated = fileNamesNotRotated.filter(function(value, _index, _arr){ return value !== fileName;}) + fileNamesNotRotated = fileNamesNotRotated.filter(function(value){ return value !== fileName;}) fileNameIndex += 1; if (fileNameIndex == fileNameTotal){ resolve({rotated: fileNamesRotated, notRotated: fileNamesNotRotated}); diff --git a/spec/secureFiles.spec.js b/spec/secureFiles.spec.js index 1c69dc9..1500752 100644 --- a/spec/secureFiles.spec.js +++ b/spec/secureFiles.spec.js @@ -75,12 +75,11 @@ describe('File encryption tests', () => { expect(result instanceof Buffer).toBe(true); expect(result.toString('utf-8')).toEqual(data2); const unEncryptedData2 = fs.readFileSync(filePath2); - //Check if encrypted adapter can read data and make sure it's not the same as unEncrypted adapter const {rotated, notRotated} = await encryptedAdapter.rotateFileKey(); expect(rotated.length).toEqual(2); - expect(rotated.filter(function(value, _index, _arr){ return value === fileName1;}).length).toEqual(1); - expect(rotated.filter(function(value, _index, _arr){ return value === fileName2;}).length).toEqual(1); + expect(rotated.filter(function(value){ return value === fileName1;}).length).toEqual(1); + expect(rotated.filter(function(value){ return value === fileName2;}).length).toEqual(1); expect(notRotated.length).toEqual(0); result = await encryptedAdapter.getFileData(fileName1); expect(result instanceof Buffer).toBe(true); @@ -122,12 +121,11 @@ describe('File encryption tests', () => { expect(result instanceof Buffer).toBe(true); expect(result.toString('utf-8')).toEqual(data2); const oldEncryptedData2 = fs.readFileSync(filePath2); - //Check if encrypted adapter can read data and make sure it's not the same as unEncrypted adapter const {rotated, notRotated} = await encryptedAdapter.rotateFileKey({oldKey: oldFileKey}); expect(rotated.length).toEqual(2); - expect(rotated.filter(function(value, _index, _arr){ return value === fileName1;}).length).toEqual(1); - expect(rotated.filter(function(value, _index, _arr){ return value === fileName2;}).length).toEqual(1); + expect(rotated.filter(function(value){ return value === fileName1;}).length).toEqual(1); + expect(rotated.filter(function(value){ return value === fileName2;}).length).toEqual(1); expect(notRotated.length).toEqual(0); var result2 = await encryptedAdapter.getFileData(fileName1); expect(result2 instanceof Buffer).toBe(true); @@ -172,20 +170,17 @@ describe('File encryption tests', () => { expect(result instanceof Buffer).toBe(true); expect(result.toString('utf-8')).toEqual(data2); const oldEncryptedData2 = fs.readFileSync(filePath2); - //Inject unecrypted file to see if causes an issue const fileName3 = 'file3.txt'; const data3 = "hello past world"; - const filePath3 = 'files/'+directory+'/'+fileName3; await unEncryptedAdapter.createFile(fileName3, data3, 'text/utf8'); - //Check if encrypted adapter can read data and make sure it's not the same as unEncrypted adapter const {rotated, notRotated} = await encryptedAdapter.rotateFileKey({oldKey: oldFileKey, fileNames: [fileName1,fileName2]}); expect(rotated.length).toEqual(2); - expect(rotated.filter(function(value, _index, _arr){ return value === fileName1;}).length).toEqual(1); - expect(rotated.filter(function(value, _index, _arr){ return value === fileName2;}).length).toEqual(1); + expect(rotated.filter(function(value){ return value === fileName1;}).length).toEqual(1); + expect(rotated.filter(function(value){ return value === fileName2;}).length).toEqual(1); expect(notRotated.length).toEqual(0); - expect(rotated.filter(function(value, _index, _arr){ return value === fileName3;}).length).toEqual(0); + expect(rotated.filter(function(value){ return value === fileName3;}).length).toEqual(0); var result2 = await encryptedAdapter.getFileData(fileName1); expect(result2 instanceof Buffer).toBe(true); expect(result2.toString('utf-8')).toEqual(data1); @@ -229,7 +224,6 @@ describe('File encryption tests', () => { expect(result instanceof Buffer).toBe(true); expect(result.toString('utf-8')).toEqual(data2); const oldEncryptedData2 = fs.readFileSync(filePath2); - //Inject unecrypted file to cause an issue const fileName3 = 'file3.txt'; const data3 = "hello past world"; @@ -238,15 +232,13 @@ describe('File encryption tests', () => { var result = await unEncryptedAdapter.getFileData(fileName3); expect(result instanceof Buffer).toBe(true); expect(result.toString('utf-8')).toEqual(data3); - //Check if encrypted adapter can read data and make sure it's not the same as unEncrypted adapter - var expectedError = ''; const {rotated, notRotated} = await encryptedAdapter.rotateFileKey({oldKey: oldFileKey}); expect(rotated.length).toEqual(2); - expect(rotated.filter(function(value, _index, _arr){ return value === fileName1;}).length).toEqual(1); - expect(rotated.filter(function(value, _index, _arr){ return value === fileName2;}).length).toEqual(1); + expect(rotated.filter(function(value){ return value === fileName1;}).length).toEqual(1); + expect(rotated.filter(function(value){ return value === fileName2;}).length).toEqual(1); expect(notRotated.length).toEqual(1); - expect(notRotated.filter(function(value, _index, _arr){ return value === fileName3;}).length).toEqual(1); + expect(notRotated.filter(function(value){ return value === fileName3;}).length).toEqual(1); var result2 = await encryptedAdapter.getFileData(fileName1); expect(result2 instanceof Buffer).toBe(true); expect(result2.toString('utf-8')).toEqual(data1); From 8939921d576813e92492fadcf1708001ffe35359 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Thu, 2 Jul 2020 09:40:14 -0400 Subject: [PATCH 22/42] add directions for multiple instances of parse-server --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a467a4..3c69ae4 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,11 @@ [![Build Status](https://travis-ci.org/parse-community/parse-server-fs-adapter.svg?branch=master)](https://travis-ci.org/parse-community/parse-server-fs-adapter) [![codecov.io](https://codecov.io/github/parse-community/parse-server-fs-adapter/coverage.svg?branch=master)](https://codecov.io/github/parse-community/parse-server-fs-adapter?branch=master) -parse-server file system storage adapter +parse-server file system storage adapter. + + +# Multiple instances of parse-server +When using parse-server-fs-adapter across multiple parse-server instances it's important to establish "centralization" of your file storage (this is the same premise as the other file adapters, you are sending/recieving files through a dedicated link). You can accomplish this at the file storage level by Samba mounting (or any other type of mounting) your storage to each of your parse-server instances, e.g if you are using parse-server via docker (volume mount your SMB drive to `- /Volumes/SMB-Drive/MyParseApp1/files:/parse-server/files`). All parse-server instances need to be able to read and write to the same storage in order for parse-server-fs-adapter to work properly with parse-server. If the file storage isn't centralized, parse-server will have trouble locating files and you will get random behavior on client-side. # Installation From 75d6b8a5416876c22f24a86c3a1d2d55748d2efe Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Thu, 2 Jul 2020 09:43:06 -0400 Subject: [PATCH 23/42] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c69ae4..894e777 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ When using parse-server-fs-adapter across multiple parse-server instances it's i # Usage with parse-server -### using a config file +### Using a config file ```javascript { From 9ac405f51352a2fff61f2202aaaf473344f74314 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Thu, 2 Jul 2020 10:18:30 -0400 Subject: [PATCH 24/42] update file names in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 894e777..b260fd2 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ console.log('Files that couldn't be rotated to newKey: ' + notRotated); This is useful if for some reason there errors and some of the files werent rotated and returned in `notRotated`. The same process as above, but pass in your `oldKey` along with the array of `fileNames` to `rotateFileKey()`. ```javascript //This can take awhile depending on how many files and how larger they are. It will attempt to rotate the key of all files in your filesSubDirectory -const {rotated, notRotated} = await api.filesAdapter.rotateFileKey({oldKey: oldKey, fileNames: [fileName1,fileName2]}); +const {rotated, notRotated} = await api.filesAdapter.rotateFileKey({oldKey: oldKey, fileNames: ["fileName1.png","fileName2.png"]}); console.log('Files rotated to newKey: ' + rotated); console.log('Files that couldn't be rotated to newKey: ' + notRotated); ``` \ No newline at end of file From 0c4bf0d79f44228df89889dbe302992c47597ca7 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Thu, 2 Jul 2020 13:41:05 -0400 Subject: [PATCH 25/42] add testcase for rotating key from oldKey to noKey leaving all files decrypted --- spec/secureFiles.spec.js | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/spec/secureFiles.spec.js b/spec/secureFiles.spec.js index 1500752..0a5261f 100644 --- a/spec/secureFiles.spec.js +++ b/spec/secureFiles.spec.js @@ -140,6 +140,51 @@ describe('File encryption tests', () => { done() }, 5000); + it("should rotate key of all old encrypted files to unencrypted files", async function(done) { + const oldFileKey = 'oldKeyThatILoved'; + const oldEncryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory, + fileKey: oldFileKey + }); + const unEncryptedAdapter = new FileSystemAdapter({ + filesSubDirectory: directory + }); + const fileName1 = 'file1.txt'; + const data1 = "hello world"; + const fileName2 = 'file2.txt'; + const data2 = "hello new world"; + const filePath1 = 'files/'+directory+'/'+fileName1; + const filePath2 = 'files/'+directory+'/'+fileName2; + //Store original encrypted files + await oldEncryptedAdapter.createFile(fileName1, data1, 'text/utf8'); + var result = await oldEncryptedAdapter.getFileData(fileName1); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data1); + const oldEncryptedData1 = fs.readFileSync(filePath1); + await oldEncryptedAdapter.createFile(fileName2, data2, 'text/utf8'); + result = await oldEncryptedAdapter.getFileData(fileName2); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data2); + const oldEncryptedData2 = fs.readFileSync(filePath2); + //Check if unEncrypted adapter can read data and make sure it's not the same as oldEncrypted adapter + const {rotated, notRotated} = await unEncryptedAdapter.rotateFileKey({oldKey: oldFileKey}); + expect(rotated.length).toEqual(2); + expect(rotated.filter(function(value){ return value === fileName1;}).length).toEqual(1); + expect(rotated.filter(function(value){ return value === fileName2;}).length).toEqual(1); + expect(notRotated.length).toEqual(0); + var result2 = await unEncryptedAdapter.getFileData(fileName1); + expect(result2 instanceof Buffer).toBe(true); + expect(result2.toString('utf-8')).toEqual(data1); + const encryptedData1 = fs.readFileSync(filePath1); + expect(encryptedData1.toString('utf-8')).not.toEqual(oldEncryptedData1); + result = await unEncryptedAdapter.getFileData(fileName2); + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual(data2); + const encryptedData2 = fs.readFileSync(filePath2); + expect(encryptedData2.toString('utf-8')).not.toEqual(oldEncryptedData2); + done() + }, 5000); + it("should only encrypt specified fileNames with the new key", async function(done) { const oldFileKey = 'oldKeyThatILoved'; const oldEncryptedAdapter = new FileSystemAdapter({ From 47c87e73e25d352f05705e85386aaf59e118901e Mon Sep 17 00:00:00 2001 From: Corey Date: Thu, 2 Jul 2020 15:56:37 -0400 Subject: [PATCH 26/42] Add notice about previous versions of parse-server --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b260fd2..9798b87 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ parse-server file system storage adapter. # Multiple instances of parse-server When using parse-server-fs-adapter across multiple parse-server instances it's important to establish "centralization" of your file storage (this is the same premise as the other file adapters, you are sending/recieving files through a dedicated link). You can accomplish this at the file storage level by Samba mounting (or any other type of mounting) your storage to each of your parse-server instances, e.g if you are using parse-server via docker (volume mount your SMB drive to `- /Volumes/SMB-Drive/MyParseApp1/files:/parse-server/files`). All parse-server instances need to be able to read and write to the same storage in order for parse-server-fs-adapter to work properly with parse-server. If the file storage isn't centralized, parse-server will have trouble locating files and you will get random behavior on client-side. +*** Notice: If used with versions <= 4.2.0, don't pass in `PARSE_SERVER_FILE_KEY` or `fileKey`. Instead pass your key directly to `FSFilesAdapter`. parse-server versions > 4.2.0 can pass in `PARSE_SERVER_FILE_KEY` or `fileKey`.*** # Installation @@ -90,4 +91,4 @@ This is useful if for some reason there errors and some of the files werent rota const {rotated, notRotated} = await api.filesAdapter.rotateFileKey({oldKey: oldKey, fileNames: ["fileName1.png","fileName2.png"]}); console.log('Files rotated to newKey: ' + rotated); console.log('Files that couldn't be rotated to newKey: ' + notRotated); -``` \ No newline at end of file +``` From 07061b77ddc440285f360ec031c3ac9daca1a0a0 Mon Sep 17 00:00:00 2001 From: Corey Date: Thu, 2 Jul 2020 15:57:04 -0400 Subject: [PATCH 27/42] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9798b87..7ed51ad 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ parse-server file system storage adapter. # Multiple instances of parse-server When using parse-server-fs-adapter across multiple parse-server instances it's important to establish "centralization" of your file storage (this is the same premise as the other file adapters, you are sending/recieving files through a dedicated link). You can accomplish this at the file storage level by Samba mounting (or any other type of mounting) your storage to each of your parse-server instances, e.g if you are using parse-server via docker (volume mount your SMB drive to `- /Volumes/SMB-Drive/MyParseApp1/files:/parse-server/files`). All parse-server instances need to be able to read and write to the same storage in order for parse-server-fs-adapter to work properly with parse-server. If the file storage isn't centralized, parse-server will have trouble locating files and you will get random behavior on client-side. -*** Notice: If used with versions <= 4.2.0, don't pass in `PARSE_SERVER_FILE_KEY` or `fileKey`. Instead pass your key directly to `FSFilesAdapter`. parse-server versions > 4.2.0 can pass in `PARSE_SERVER_FILE_KEY` or `fileKey`.*** +***Notice: If used with versions <= 4.2.0, don't pass in `PARSE_SERVER_FILE_KEY` or `fileKey`. Instead pass your key directly to `FSFilesAdapter`. parse-server versions > 4.2.0 can pass in `PARSE_SERVER_FILE_KEY` or `fileKey`.*** # Installation From bd190456a91b8f7f80ab87d6c19f765292eb7939 Mon Sep 17 00:00:00 2001 From: Corey Date: Thu, 2 Jul 2020 15:59:08 -0400 Subject: [PATCH 28/42] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ed51ad..c8f73cd 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ parse-server file system storage adapter. # Multiple instances of parse-server When using parse-server-fs-adapter across multiple parse-server instances it's important to establish "centralization" of your file storage (this is the same premise as the other file adapters, you are sending/recieving files through a dedicated link). You can accomplish this at the file storage level by Samba mounting (or any other type of mounting) your storage to each of your parse-server instances, e.g if you are using parse-server via docker (volume mount your SMB drive to `- /Volumes/SMB-Drive/MyParseApp1/files:/parse-server/files`). All parse-server instances need to be able to read and write to the same storage in order for parse-server-fs-adapter to work properly with parse-server. If the file storage isn't centralized, parse-server will have trouble locating files and you will get random behavior on client-side. -***Notice: If used with versions <= 4.2.0, don't pass in `PARSE_SERVER_FILE_KEY` or `fileKey`. Instead pass your key directly to `FSFilesAdapter`. parse-server versions > 4.2.0 can pass in `PARSE_SERVER_FILE_KEY` or `fileKey`.*** +***Notice: If used with versions <= 4.2.0, DO NOT PASS in `PARSE_SERVER_FILE_KEY` or `fileKey` from parse-server. Instead pass your key directly to `FSFilesAdapter` using your own environment variable or hardcoding the string. parse-server versions > 4.2.0 can pass in `PARSE_SERVER_FILE_KEY` or `fileKey`.*** # Installation From 51c2b51696b3720159501603e456eba5e66b1daa Mon Sep 17 00:00:00 2001 From: Corey Date: Thu, 2 Jul 2020 16:00:32 -0400 Subject: [PATCH 29/42] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index c8f73cd..7891a32 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,6 @@ parse-server file system storage adapter. # Multiple instances of parse-server When using parse-server-fs-adapter across multiple parse-server instances it's important to establish "centralization" of your file storage (this is the same premise as the other file adapters, you are sending/recieving files through a dedicated link). You can accomplish this at the file storage level by Samba mounting (or any other type of mounting) your storage to each of your parse-server instances, e.g if you are using parse-server via docker (volume mount your SMB drive to `- /Volumes/SMB-Drive/MyParseApp1/files:/parse-server/files`). All parse-server instances need to be able to read and write to the same storage in order for parse-server-fs-adapter to work properly with parse-server. If the file storage isn't centralized, parse-server will have trouble locating files and you will get random behavior on client-side. -***Notice: If used with versions <= 4.2.0, DO NOT PASS in `PARSE_SERVER_FILE_KEY` or `fileKey` from parse-server. Instead pass your key directly to `FSFilesAdapter` using your own environment variable or hardcoding the string. parse-server versions > 4.2.0 can pass in `PARSE_SERVER_FILE_KEY` or `fileKey`.*** - # Installation `npm install --save @parse/fs-files-adapter` @@ -34,6 +32,7 @@ When using parse-server-fs-adapter across multiple parse-server instances it's i ``` ### Passing as an instance +***Notice: If used with versions <= 4.2.0, DO NOT PASS in `PARSE_SERVER_FILE_KEY` or `fileKey` from parse-server. Instead pass your key directly to `FSFilesAdapter` using your own environment variable or hardcoding the string. parse-server versions > 4.2.0 can pass in `PARSE_SERVER_FILE_KEY` or `fileKey`.*** ```javascript var FSFilesAdapter = require('@parse/fs-files-adapter'); From 01fdf2238b05853226cd9e752b2a7843d9a5f215 Mon Sep 17 00:00:00 2001 From: Corey Date: Thu, 2 Jul 2020 16:01:14 -0400 Subject: [PATCH 30/42] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7891a32..0e6c420 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ When using parse-server-fs-adapter across multiple parse-server instances it's i ``` ### Passing as an instance -***Notice: If used with versions <= 4.2.0, DO NOT PASS in `PARSE_SERVER_FILE_KEY` or `fileKey` from parse-server. Instead pass your key directly to `FSFilesAdapter` using your own environment variable or hardcoding the string. parse-server versions > 4.2.0 can pass in `PARSE_SERVER_FILE_KEY` or `fileKey`.*** +***Notice: If used with parse-server versions <= 4.2.0, DO NOT PASS in `PARSE_SERVER_FILE_KEY` or `fileKey` from parse-server. Instead pass your key directly to `FSFilesAdapter` using your own environment variable or hardcoding the string. parse-server versions > 4.2.0 can pass in `PARSE_SERVER_FILE_KEY` or `fileKey`.*** ```javascript var FSFilesAdapter = require('@parse/fs-files-adapter'); From 451708788101fd363e647e25a0f077647271327f Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Sat, 4 Jul 2020 08:16:20 -0400 Subject: [PATCH 31/42] make createFile and getFile use streams instead of putting whole file in memory --- index.js | 80 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/index.js b/index.js index a5ae10f..834838f 100644 --- a/index.js +++ b/index.js @@ -28,40 +28,37 @@ function FileSystemAdapter(options) { FileSystemAdapter.prototype.createFile = function(filename, data) { return new Promise((resolve, reject) => { let filepath = this._getLocalFilePath(filename); - fs.writeFile(filepath, data, (err) => { - if(err !== null) { - return reject(err); - } + try{ if(this._fileKey !== null){ - try{ - const iv = crypto.randomBytes(16); - const cipher = crypto.createCipheriv(algorithm, this._fileKey, iv); - const input = fs.createReadStream(filepath); - const output = fs.createWriteStream(filepath+'.enc'); - input.pipe(cipher).pipe(output); - output.on('finish', function() { - fs.unlink(filepath, function(err) { - if (err !== null) { - return reject(err); - } - fs.rename(filepath+'.enc', filepath, function(err) { - if (err !== null) { - return reject(err); - } - const authTag = cipher.getAuthTag(); - fs.appendFileSync(filepath, iv); - fs.appendFileSync(filepath, authTag); - return resolve(data); - }); - }); - }); - }catch(err){ - return reject(err); - } + const output = fs.createWriteStream(filepath); + const iv = crypto.randomBytes(16); + const cipher = crypto.createCipheriv( + algorithm, + this._fileKey, + iv + ); + const encryptedResult = Buffer.concat([ + cipher.update(data), + cipher.final(), + iv, + cipher.getAuthTag(), + ]); + output.write(encryptedResult); + output.end(); + output.on('finish', function() { + return resolve(data); + }); }else{ - resolve(data); - } - }); + const output = fs.createWriteStream(filepath); + output.write(data); + output.end(); + output.on('finish', function() { + return resolve(data); + }); + } + }catch(err){ + return reject(err); + } }); } @@ -86,10 +83,14 @@ FileSystemAdapter.prototype.getFileData = function(filename) { return new Promise((resolve, reject) => { let filepath = this._getLocalFilePath(filename); const fileKey = this._fileKey; - fs.readFile( filepath , function (err, data) { - if(err !== null) { - return reject(err); - } + const chunks = []; + const input = fs.createReadStream(filepath); + input.read(); + input.on('data', (data) => { + chunks.push(data); + }); + input.on('end', () => { + const data = Buffer.concat(chunks); if(fileKey !== null){ const authTagLocation = data.length - 16; const ivLocation = data.length - 32; @@ -100,13 +101,16 @@ FileSystemAdapter.prototype.getFileData = function(filename) { const decipher = crypto.createDecipheriv(algorithm, fileKey, iv); decipher.setAuthTag(authTag); const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]); - return resolve(decrypted); + resolve(decrypted); }catch(err){ - return reject(err); + reject(err); } } resolve(data); }); + input.on('error', (err) => { + reject(err); + }); }); } From 96462469baca5cea8b534d19cba931f1ff2cdf91 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Sat, 4 Jul 2020 08:27:46 -0400 Subject: [PATCH 32/42] don't read file into memory while deleting --- index.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index 834838f..7c0ff91 100644 --- a/index.js +++ b/index.js @@ -65,24 +65,30 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { FileSystemAdapter.prototype.deleteFile = function(filename) { return new Promise((resolve, reject) => { let filepath = this._getLocalFilePath(filename); - fs.readFile( filepath , function (err, data) { - if(err !== null) { - return reject(err); - } - fs.unlink(filepath, (unlinkErr) => { - if(err !== null) { - return reject(unlinkErr); + const chunks = []; + const input = fs.createReadStream(filepath); + input.read(); + input.on('data', (data) => { + chunks.push(data); + }); + input.on('end', () => { + const data = Buffer.concat(chunks); + fs.unlink(filepath, (err) => { + if(err !== null) { + return reject(err); } resolve(data); }); }); + input.on('error', (err) => { + reject(err); + }); }); } FileSystemAdapter.prototype.getFileData = function(filename) { return new Promise((resolve, reject) => { let filepath = this._getLocalFilePath(filename); - const fileKey = this._fileKey; const chunks = []; const input = fs.createReadStream(filepath); input.read(); @@ -91,14 +97,14 @@ FileSystemAdapter.prototype.getFileData = function(filename) { }); input.on('end', () => { const data = Buffer.concat(chunks); - if(fileKey !== null){ + if(this._fileKey !== null){ const authTagLocation = data.length - 16; const ivLocation = data.length - 32; const authTag = data.slice(authTagLocation); const iv = data.slice(ivLocation,authTagLocation); const encrypted = data.slice(0,ivLocation); try{ - const decipher = crypto.createDecipheriv(algorithm, fileKey, iv); + const decipher = crypto.createDecipheriv(algorithm, this._fileKey, iv); decipher.setAuthTag(authTag); const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]); resolve(decrypted); From 39f96d20e877d022caa7cdc7a27b30ffb37cb076 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Sat, 4 Jul 2020 09:15:48 -0400 Subject: [PATCH 33/42] clean up code --- index.js | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/index.js b/index.js index 7c0ff91..6a56c8f 100644 --- a/index.js +++ b/index.js @@ -26,8 +26,8 @@ function FileSystemAdapter(options) { } FileSystemAdapter.prototype.createFile = function(filename, data) { + let filepath = this._getLocalFilePath(filename); return new Promise((resolve, reject) => { - let filepath = this._getLocalFilePath(filename); try{ if(this._fileKey !== null){ const output = fs.createWriteStream(filepath); @@ -46,14 +46,14 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { output.write(encryptedResult); output.end(); output.on('finish', function() { - return resolve(data); + resolve(data); }); }else{ const output = fs.createWriteStream(filepath); output.write(data); output.end(); output.on('finish', function() { - return resolve(data); + resolve(data); }); } }catch(err){ @@ -63,10 +63,10 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { } FileSystemAdapter.prototype.deleteFile = function(filename) { + let filepath = this._getLocalFilePath(filename); + const chunks = []; + const input = fs.createReadStream(filepath); return new Promise((resolve, reject) => { - let filepath = this._getLocalFilePath(filename); - const chunks = []; - const input = fs.createReadStream(filepath); input.read(); input.on('data', (data) => { chunks.push(data); @@ -87,10 +87,10 @@ FileSystemAdapter.prototype.deleteFile = function(filename) { } FileSystemAdapter.prototype.getFileData = function(filename) { + let filepath = this._getLocalFilePath(filename); + const chunks = []; + const input = fs.createReadStream(filepath); return new Promise((resolve, reject) => { - let filepath = this._getLocalFilePath(filename); - const chunks = []; - const input = fs.createReadStream(filepath); input.read(); input.on('data', (data) => { chunks.push(data); @@ -121,25 +121,25 @@ FileSystemAdapter.prototype.getFileData = function(filename) { } FileSystemAdapter.prototype.rotateFileKey = function(options = {}) { + const applicationDir = this._getApplicationDir(); + var fileNames = []; + var oldKeyFileAdapter = {}; + if (options.oldKey !== undefined) { + oldKeyFileAdapter = new FileSystemAdapter({filesSubDirectory: this._filesDir, fileKey: options.oldKey}); + }else{ + oldKeyFileAdapter = new FileSystemAdapter({filesSubDirectory: this._filesDir}); + } + if (options.fileNames !== undefined){ + fileNames = options.fileNames; + }else{ + fileNames = fs.readdirSync(applicationDir); + fileNames = fileNames.filter(fileName => fileName.indexOf('.') !== 0); + } + var fileNamesNotRotated = fileNames; + var fileNamesRotated = []; + var fileNameTotal = fileNames.length; + var fileNameIndex = 0; return new Promise((resolve, _reject) => { - const applicationDir = this._getApplicationDir(); - var fileNames = []; - var oldKeyFileAdapter = {}; - if (options.oldKey !== undefined) { - oldKeyFileAdapter = new FileSystemAdapter({filesSubDirectory: this._filesDir, fileKey: options.oldKey}); - }else{ - oldKeyFileAdapter = new FileSystemAdapter({filesSubDirectory: this._filesDir}); - } - if (options.fileNames !== undefined){ - fileNames = options.fileNames; - }else{ - fileNames = fs.readdirSync(applicationDir); - fileNames = fileNames.filter(fileName => fileName.indexOf('.') !== 0); - } - var fileNamesNotRotated = fileNames; - var fileNamesRotated = []; - var fileNameTotal = fileNames.length; - var fileNameIndex = 0; fileNames.forEach(fileName => { oldKeyFileAdapter.getFileData(fileName) .then(plainTextData => { From fbcabf4a2fdcdb4f83626636c4a9bad6a899885d Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Sat, 4 Jul 2020 19:08:31 -0400 Subject: [PATCH 34/42] make more consistant with GridFS adapter --- index.js | 51 +++++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/index.js b/index.js index 6a56c8f..d74ef1f 100644 --- a/index.js +++ b/index.js @@ -27,10 +27,10 @@ function FileSystemAdapter(options) { FileSystemAdapter.prototype.createFile = function(filename, data) { let filepath = this._getLocalFilePath(filename); + const stream = fs.createWriteStream(filepath); return new Promise((resolve, reject) => { try{ - if(this._fileKey !== null){ - const output = fs.createWriteStream(filepath); + if(this._fileKey !== null){ const iv = crypto.randomBytes(16); const cipher = crypto.createCipheriv( algorithm, @@ -43,16 +43,15 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { iv, cipher.getAuthTag(), ]); - output.write(encryptedResult); - output.end(); - output.on('finish', function() { + stream.write(encryptedResult); + stream.end(); + stream.on('finish', function() { resolve(data); }); }else{ - const output = fs.createWriteStream(filepath); - output.write(data); - output.end(); - output.on('finish', function() { + stream.write(data); + stream.end(); + stream.on('finish', function() { resolve(data); }); } @@ -65,13 +64,13 @@ FileSystemAdapter.prototype.createFile = function(filename, data) { FileSystemAdapter.prototype.deleteFile = function(filename) { let filepath = this._getLocalFilePath(filename); const chunks = []; - const input = fs.createReadStream(filepath); + const stream = fs.createReadStream(filepath); return new Promise((resolve, reject) => { - input.read(); - input.on('data', (data) => { + stream.read(); + stream.on('data', (data) => { chunks.push(data); }); - input.on('end', () => { + stream.on('end', () => { const data = Buffer.concat(chunks); fs.unlink(filepath, (err) => { if(err !== null) { @@ -80,7 +79,7 @@ FileSystemAdapter.prototype.deleteFile = function(filename) { resolve(data); }); }); - input.on('error', (err) => { + stream.on('error', (err) => { reject(err); }); }); @@ -88,14 +87,14 @@ FileSystemAdapter.prototype.deleteFile = function(filename) { FileSystemAdapter.prototype.getFileData = function(filename) { let filepath = this._getLocalFilePath(filename); - const chunks = []; - const input = fs.createReadStream(filepath); + const stream = fs.createReadStream(filepath); + stream.read(); return new Promise((resolve, reject) => { - input.read(); - input.on('data', (data) => { + const chunks = []; + stream.on('data', (data) => { chunks.push(data); }); - input.on('end', () => { + stream.on('end', () => { const data = Buffer.concat(chunks); if(this._fileKey !== null){ const authTagLocation = data.length - 16; @@ -107,14 +106,14 @@ FileSystemAdapter.prototype.getFileData = function(filename) { const decipher = crypto.createDecipheriv(algorithm, this._fileKey, iv); decipher.setAuthTag(authTag); const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]); - resolve(decrypted); + return resolve(decrypted); }catch(err){ - reject(err); + return reject(err); } } resolve(data); }); - input.on('error', (err) => { + stream.on('error', (err) => { reject(err); }); }); @@ -135,11 +134,11 @@ FileSystemAdapter.prototype.rotateFileKey = function(options = {}) { fileNames = fs.readdirSync(applicationDir); fileNames = fileNames.filter(fileName => fileName.indexOf('.') !== 0); } - var fileNamesNotRotated = fileNames; - var fileNamesRotated = []; - var fileNameTotal = fileNames.length; - var fileNameIndex = 0; return new Promise((resolve, _reject) => { + var fileNamesNotRotated = fileNames; + var fileNamesRotated = []; + var fileNameTotal = fileNames.length; + var fileNameIndex = 0; fileNames.forEach(fileName => { oldKeyFileAdapter.getFileData(fileName) .then(plainTextData => { From 1d3ca24550ffd2080b1627bbf6ae932b0debdd16 Mon Sep 17 00:00:00 2001 From: Corey MacBook Pro Date: Sat, 4 Jul 2020 19:19:44 -0400 Subject: [PATCH 35/42] fixed formatting --- index.js | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/index.js b/index.js index d74ef1f..f17727f 100644 --- a/index.js +++ b/index.js @@ -140,24 +140,25 @@ FileSystemAdapter.prototype.rotateFileKey = function(options = {}) { var fileNameTotal = fileNames.length; var fileNameIndex = 0; fileNames.forEach(fileName => { - oldKeyFileAdapter.getFileData(fileName) - .then(plainTextData => { - //Overwrite file with data encrypted with new key - this.createFile(fileName, plainTextData) - .then(() => { - fileNamesRotated.push(fileName); - fileNamesNotRotated = fileNamesNotRotated.filter(function(value){ return value !== fileName;}) - fileNameIndex += 1; - if (fileNameIndex == fileNameTotal){ - resolve({rotated: fileNamesRotated, notRotated: fileNamesNotRotated}); - } - }) - .catch(() => { - fileNameIndex += 1; - if (fileNameIndex == fileNameTotal){ - resolve({rotated: fileNamesRotated, notRotated: fileNamesNotRotated}); - } - }) + oldKeyFileAdapter + .getFileData(fileName) + .then(plainTextData => { + //Overwrite file with data encrypted with new key + this.createFile(fileName, plainTextData) + .then(() => { + fileNamesRotated.push(fileName); + fileNamesNotRotated = fileNamesNotRotated.filter(function(value){ return value !== fileName;}) + fileNameIndex += 1; + if (fileNameIndex == fileNameTotal){ + resolve({rotated: fileNamesRotated, notRotated: fileNamesNotRotated}); + } + }) + .catch(() => { + fileNameIndex += 1; + if (fileNameIndex == fileNameTotal){ + resolve({rotated: fileNamesRotated, notRotated: fileNamesNotRotated}); + } + }) }) .catch(() => { fileNameIndex += 1; From 4c344eee9c7e866adc5c361caf107f7ca23159c3 Mon Sep 17 00:00:00 2001 From: Corey Date: Sat, 4 Jul 2020 21:47:06 -0400 Subject: [PATCH 36/42] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 23950c1..8e7a78c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,4 +8,4 @@ env: global: - COVERAGE_OPTION='./node_modules/.bin/nyc' script: npm run coverage -after_scrypt: bash <(curl -s https://codecov.io/bash) +after_success: bash <(curl -s https://codecov.io/bash) From a20a7a21eaef29c13f0ab82decbe2a8e3a77ca80 Mon Sep 17 00:00:00 2001 From: Corey Date: Sat, 4 Jul 2020 21:55:35 -0400 Subject: [PATCH 37/42] Remove unnecessary testcase The test is already covered in parse-server-conformance-tests --- spec/secureFiles.spec.js | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/spec/secureFiles.spec.js b/spec/secureFiles.spec.js index 0a5261f..d33766a 100644 --- a/spec/secureFiles.spec.js +++ b/spec/secureFiles.spec.js @@ -19,22 +19,7 @@ describe('File encryption tests', () => { }) }); - it("should save file in it's unencrypted format", async function(done) { - var adapter = new FileSystemAdapter({ - filesSubDirectory: directory - }); - var filename = 'file.txt'; - const filePath = 'files/'+directory+'/'+filename; - await adapter.createFile(filename, "hello world", 'text/utf8'); - const result = await adapter.getFileData(filename); - expect(result instanceof Buffer).toBe(true); - expect(result.toString('utf-8')).toEqual("hello world"); - const data = fs.readFileSync(filePath); - expect(data.toString('utf-8')).toEqual("hello world"); - done() - }, 5000); - - it("should save file in it's encrypted format", async function(done) { + it("should save file encrypted file", async function(done) { var adapter = new FileSystemAdapter({ filesSubDirectory: directory, fileKey: '89E4AFF1-DFE4-4603-9574-BFA16BB446FD' @@ -94,7 +79,7 @@ describe('File encryption tests', () => { done() }, 5000); - it("should rotate key of all old encrypted files to new encrypted files", async function(done) { + it("should rotate key of all old encrypted files to files encrypted with a new key", async function(done) { const oldFileKey = 'oldKeyThatILoved'; const oldEncryptedAdapter = new FileSystemAdapter({ filesSubDirectory: directory, From b649dde6d668b93f4be9e282b467ff1b3019ccc5 Mon Sep 17 00:00:00 2001 From: Corey Date: Sun, 5 Jul 2020 11:55:26 -0400 Subject: [PATCH 38/42] Update secureFiles.spec.js --- spec/secureFiles.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/secureFiles.spec.js b/spec/secureFiles.spec.js index d33766a..acf68e4 100644 --- a/spec/secureFiles.spec.js +++ b/spec/secureFiles.spec.js @@ -19,7 +19,7 @@ describe('File encryption tests', () => { }) }); - it("should save file encrypted file", async function(done) { + it("should save encrypted file", async function(done) { var adapter = new FileSystemAdapter({ filesSubDirectory: directory, fileKey: '89E4AFF1-DFE4-4603-9574-BFA16BB446FD' From 2390e59015ed36604492c4b95ff9104c8327b76c Mon Sep 17 00:00:00 2001 From: Corey Date: Wed, 21 Oct 2020 18:27:02 -0400 Subject: [PATCH 39/42] add directions for dev server to readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0e6c420..717ee7d 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ var api = new ParseServer({ ``` ### Rotating to a new fileKey -Periodically you may want to rotate your fileKey for security reasons. When this is the case. Initialize the file adapter with the new key and do the following in your `index.js`: +Periodically you may want to rotate your fileKey for security reasons. When this is the case, you can start up a development parse-server that has the same configuration as your production server. In the development server, initialize the file adapter with the new key and do the following in your `index.js`: #### Files were previously unencrypted and you want to encrypt ```javascript @@ -68,11 +68,14 @@ var api = new ParseServer({ }) //This can take awhile depending on how many files and how larger they are. It will attempt to rotate the key of all files in your filesSubDirectory +//It is not recommended to do this on the production server, deploy a development server to complete the process. const {rotated, notRotated} = await api.filesAdapter.rotateFileKey(); console.log('Files rotated to newKey: ' + rotated); console.log('Files that couldn't be rotated to newKey: ' + notRotated); ``` +After successfully rotating your key, you should change the `fileKey` to `newKey` on your production server and then restart the server. + #### Files were previously encrypted with `oldKey` and you want to encrypt with `newKey` The same process as above, but pass in your `oldKey` to `rotateFileKey()`. From 6b175fb360301eff81c4429534b9f8f5c51e546b Mon Sep 17 00:00:00 2001 From: Corey Date: Wed, 21 Oct 2020 18:32:12 -0400 Subject: [PATCH 40/42] Revert version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e76684..51b4ebb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@parse/fs-files-adapter", - "version": "1.0.2", + "version": "1.0.1", "description": "File system adapter for parse-server", "main": "index.js", "repository": { From 5beb618cd952068fd23766dcb577813f40915fc4 Mon Sep 17 00:00:00 2001 From: Corey Date: Wed, 21 Oct 2020 18:35:10 -0400 Subject: [PATCH 41/42] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 51b4ebb..0e76684 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@parse/fs-files-adapter", - "version": "1.0.1", + "version": "1.0.2", "description": "File system adapter for parse-server", "main": "index.js", "repository": { From 490dc75830a5941255cbd3549f6b843ac415622d Mon Sep 17 00:00:00 2001 From: Corey Date: Wed, 21 Oct 2020 18:50:50 -0400 Subject: [PATCH 42/42] Update .travis.yml --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8e7a78c..69746e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,7 @@ branches: only: - master language: node_js -node_js: - - 8 +node_js: '10' env: global: - COVERAGE_OPTION='./node_modules/.bin/nyc'