From e1189600d219000d4e4f2b4de9511e66a3d39adf Mon Sep 17 00:00:00 2001 From: Paul Merlin Date: Sun, 5 Jan 2020 12:55:59 +0100 Subject: [PATCH] First cut Signed-off-by: Paul Merlin --- .gitignore | 4 +- __tests__/checksums.test.ts | 6 + __tests__/data/invalid/gradle-wrapper.jar | 0 __tests__/data/valid/gradle-wrapper.jar | Bin 0 -> 58798 bytes __tests__/find.test.ts | 10 + __tests__/hash.test.ts | 7 + __tests__/main.test.ts | 27 - __tests__/validate.test.ts | 8 + action.yml | 13 +- jest.config.js | 4 +- package-lock.json | 736 +++++++++++++++++----- package.json | 7 +- src/checksums.ts | 21 + src/find.ts | 31 + src/hash.ts | 12 + src/main.ts | 24 +- src/validate.ts | 21 + src/wait.ts | 9 - 18 files changed, 736 insertions(+), 204 deletions(-) create mode 100644 __tests__/checksums.test.ts create mode 100644 __tests__/data/invalid/gradle-wrapper.jar create mode 100644 __tests__/data/valid/gradle-wrapper.jar create mode 100644 __tests__/find.test.ts create mode 100644 __tests__/hash.test.ts delete mode 100644 __tests__/main.test.ts create mode 100644 __tests__/validate.test.ts create mode 100644 src/checksums.ts create mode 100644 src/find.ts create mode 100644 src/hash.ts create mode 100644 src/validate.ts delete mode 100644 src/wait.ts diff --git a/.gitignore b/.gitignore index 18e337d..0a04613 100644 --- a/.gitignore +++ b/.gitignore @@ -96,4 +96,6 @@ Thumbs.db # Ignore built ts files __tests__/runner/* -lib/**/* \ No newline at end of file +lib/**/* + +.idea diff --git a/__tests__/checksums.test.ts b/__tests__/checksums.test.ts new file mode 100644 index 0000000..958be54 --- /dev/null +++ b/__tests__/checksums.test.ts @@ -0,0 +1,6 @@ +import * as checksums from '../src/checksums' + +test('fetches wrapper jars checksums', async () => { + let validChecksums = await checksums.fetchValidChecksums(false) + expect(validChecksums.length).toBeGreaterThan(10) +}) diff --git a/__tests__/data/invalid/gradle-wrapper.jar b/__tests__/data/invalid/gradle-wrapper.jar new file mode 100644 index 0000000..e69de29 diff --git a/__tests__/data/valid/gradle-wrapper.jar b/__tests__/data/valid/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..6d183c6b6f1b37f3fb960b68d8b1386b3e010383 GIT binary patch literal 58798 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 { + let repoRoot = path.resolve('.') + let wrapperJars = await find.findWrapperJars(repoRoot) + expect(wrapperJars.length).toBe(2) + expect(wrapperJars).toContain("__tests__/data/valid/gradle-wrapper.jar") + expect(wrapperJars).toContain("__tests__/data/invalid/gradle-wrapper.jar") +}) diff --git a/__tests__/hash.test.ts b/__tests__/hash.test.ts new file mode 100644 index 0000000..12981d6 --- /dev/null +++ b/__tests__/hash.test.ts @@ -0,0 +1,7 @@ +import * as path from "path"; +import * as hash from '../src/hash' + +test('can sha256 files', async () => { + let sha = await hash.sha256File(path.resolve('__tests__/data/invalid/gradle-wrapper.jar')) + expect(sha).toEqual("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") +}) diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts deleted file mode 100644 index efcf95e..0000000 --- a/__tests__/main.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {wait} from '../src/wait' -import * as process from 'process' -import * as cp from 'child_process' -import * as path from 'path' - -test('throws invalid number', async () => { - const input = parseInt('foo', 10) - await expect(wait(input)).rejects.toThrow('milliseconds not a number') -}) - -test('wait 500 ms', async () => { - const start = new Date() - await wait(500) - const end = new Date() - var delta = Math.abs(end.getTime() - start.getTime()) - expect(delta).toBeGreaterThan(450) -}) - -// shows how the runner will run a javascript action with env / stdout protocol -test('test runs', () => { - process.env['INPUT_MILLISECONDS'] = '500' - const ip = path.join(__dirname, '..', 'lib', 'main.js') - const options: cp.ExecSyncOptions = { - env: process.env - } - console.log(cp.execSync(`node ${ip}`, options).toString()) -}) diff --git a/__tests__/validate.test.ts b/__tests__/validate.test.ts new file mode 100644 index 0000000..158cb63 --- /dev/null +++ b/__tests__/validate.test.ts @@ -0,0 +1,8 @@ +import * as path from "path"; +import * as validate from '../src/validate' + +test('validates wrapper jars', async () => { + let invalidWrapperJars = await validate.findInvalidWrapperJars(path.resolve('.'), false) + expect(invalidWrapperJars.length).toBe(1) + expect(invalidWrapperJars[0]).toEqual("__tests__/data/invalid/gradle-wrapper.jar") +}) diff --git a/action.yml b/action.yml index c0575e9..c82dc5b 100644 --- a/action.yml +++ b/action.yml @@ -1,10 +1,11 @@ -name: 'Your name here' -description: 'Provide a description here' -author: 'Your name or organization here' +name: 'Gradle Wrapper Check' +description: 'Check Gradle Wrapper Files' +author: 'Gradle' inputs: - myInput: # change this - description: 'input description here' - default: 'default value if applicable' + allow-snapshots: + description: 'Allow snapshot Gradle versions' + required: false + default: 'false' runs: using: 'node12' main: 'dist/index.js' diff --git a/jest.config.js b/jest.config.js index 563d4cc..b80480a 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,6 @@ module.exports = { clearMocks: true, - moduleFileExtensions: ['js', 'ts'], + moduleFileExtensions: ['js', 'ts', 'json'], testEnvironment: 'node', testMatch: ['**/*.test.ts'], testRunner: 'jest-circus/runner', @@ -8,4 +8,4 @@ module.exports = { '^.+\\.ts$': 'ts-jest' }, verbose: true -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index d942ec4..6acfd81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -499,10 +499,17 @@ "dev": true }, "@types/node": { - "version": "12.12.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.14.tgz", - "integrity": "sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA==", - "dev": true + "version": "12.12.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.24.tgz", + "integrity": "sha512-1Ciqv9pqwVtW6FsIUKSZNB82E5Cu1I2bBTj1xuIHXLe/1zYLl3956Nbhg2MzSYHVfl9/rmanjbQIb7LibfCnug==" + }, + "@types/nodegit": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@types/nodegit/-/nodegit-0.26.0.tgz", + "integrity": "sha512-Wg0+KW6QwoZTpM+bzxuTuW4uxYur7aFa+OPksg8ggTgDHnjC3Q7tmuLW6Pz0e4pgNZiB/vxIBO3lQq/k0aaIHg==", + "requires": { + "@types/node": "*" + } }, "@types/stack-utils": { "version": "1.0.1", @@ -627,6 +634,11 @@ "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "acorn": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", @@ -659,7 +671,6 @@ "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -698,6 +709,20 @@ "normalize-path": "^2.1.1" } }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -757,11 +782,15 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, "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" } @@ -769,8 +798,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", @@ -799,8 +827,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", @@ -811,14 +838,12 @@ "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 + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", - "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", - "dev": true + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" }, "axobject-query": { "version": "2.1.1", @@ -938,8 +963,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1000,16 +1024,23 @@ "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" } }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "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" @@ -1085,6 +1116,25 @@ "node-int64": "^0.4.0" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1132,8 +1182,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { "version": "2.4.2", @@ -1152,6 +1201,11 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -1235,6 +1289,11 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -1264,7 +1323,6 @@ "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" } @@ -1284,8 +1342,12 @@ "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 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "contains-path": { "version": "0.1.0", @@ -1317,8 +1379,7 @@ "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 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cross-fetch": { "version": "2.2.2", @@ -1376,7 +1437,6 @@ "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" } @@ -1426,6 +1486,11 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -1485,8 +1550,17 @@ "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 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "detect-newline": { "version": "2.1.0", @@ -1522,7 +1596,6 @@ "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" @@ -1538,7 +1611,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -2200,8 +2272,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -2303,14 +2374,12 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-diff": { "version": "1.2.0", @@ -2321,8 +2390,7 @@ "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", @@ -2415,14 +2483,12 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "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", @@ -2438,11 +2504,33 @@ "map-cache": "^0.2.2" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.9", @@ -3004,6 +3092,54 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3035,7 +3171,6 @@ "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" } @@ -3044,7 +3179,6 @@ "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", @@ -3063,8 +3197,7 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "graphql": { "version": "14.5.8", @@ -3136,14 +3269,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "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" @@ -3170,6 +3301,11 @@ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -3221,7 +3357,6 @@ "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", @@ -3232,7 +3367,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -3243,6 +3377,14 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -3327,7 +3469,6 @@ "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" @@ -3336,8 +3477,12 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "6.5.2", @@ -3487,8 +3632,7 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-generator-fn": { "version": "2.1.0", @@ -3567,8 +3711,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-windows": { "version": "1.0.2", @@ -3585,14 +3728,12 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -3603,8 +3744,7 @@ "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 + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { "version": "2.0.5", @@ -4154,8 +4294,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { "version": "11.12.0", @@ -4214,14 +4353,12 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "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 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -4232,14 +4369,12 @@ "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 + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, "requires": { "minimist": "^1.2.0" }, @@ -4247,16 +4382,22 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "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", @@ -4333,8 +4474,7 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash.memoize": { "version": "4.1.2", @@ -4447,14 +4587,12 @@ "mime-db": { "version": "1.42.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", - "dev": true + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" }, "mime-types": { "version": "2.1.25", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", - "dev": true, "requires": { "mime-db": "1.42.0" } @@ -4469,7 +4607,6 @@ "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" } @@ -4477,8 +4614,24 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } }, "mixin-deep": { "version": "1.3.2", @@ -4505,7 +4658,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -4513,8 +4665,7 @@ "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 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mute-stream": { "version": "0.0.7", @@ -4525,9 +4676,7 @@ "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nanomatch": { "version": "1.2.13", @@ -4554,6 +4703,26 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", @@ -4572,6 +4741,31 @@ "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", "dev": true }, + "node-gyp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA==", + "requires": { + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^4.4.8", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4605,6 +4799,72 @@ } } }, + "node-pre-gyp": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz", + "integrity": "sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "nodegit": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/nodegit/-/nodegit-0.26.3.tgz", + "integrity": "sha512-7j96xFYY82weugxzhDztbCpapDiT+XSOSDValH4DchyLhjPnke/4Xkkz2T0PNs2USthuLCZcTmQfq7qxhvB5sA==", + "requires": { + "fs-extra": "^7.0.0", + "json5": "^2.1.0", + "lodash": "^4.17.14", + "nan": "^2.14.0", + "node-gyp": "^4.0.0", + "node-pre-gyp": "^0.13.0", + "promisify-node": "~0.3.0", + "ramda": "^0.25.0", + "request-promise-native": "^1.0.5", + "tar-fs": "^1.16.3" + } + }, + "nodegit-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz", + "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ=", + "requires": { + "asap": "~2.0.3" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -4634,6 +4894,28 @@ "remove-trailing-separator": "^1.0.1" } }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", + "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -4643,6 +4925,22 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -4652,14 +4950,12 @@ "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 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -4784,7 +5080,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -4822,11 +5117,24 @@ "word-wrap": "~1.2.3" } }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } }, "p-each-series": { "version": "1.0.0", @@ -4912,8 +5220,7 @@ "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 + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -4945,8 +5252,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "2.3.0", @@ -5017,12 +5323,25 @@ "react-is": "^16.8.4" } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "promisify-node": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.3.0.tgz", + "integrity": "sha1-tLVaz5D6p9K4uQyjlomQhsAwYM8=", + "requires": { + "nodegit-promise": "~4.0.0" + } + }, "prompts": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", @@ -5047,8 +5366,7 @@ "psl": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.5.0.tgz", - "integrity": "sha512-4vqUjKi2huMu1OJiLhi3jN6jeeKvMZdI1tYgi/njW5zV52jNLgSAZSdN16m9bJFe61/cT8ulmw4qFitV9QRsEA==", - "dev": true + "integrity": "sha512-4vqUjKi2huMu1OJiLhi3jN6jeeKvMZdI1tYgi/njW5zV52jNLgSAZSdN16m9bJFe61/cT8ulmw4qFitV9QRsEA==" }, "pump": { "version": "3.0.0", @@ -5063,14 +5381,35 @@ "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 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "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 + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } }, "react-is": { "version": "16.12.0", @@ -5192,6 +5531,20 @@ } } }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "realpath-native": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", @@ -5245,7 +5598,6 @@ "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -5272,14 +5624,12 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -5291,7 +5641,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "dev": true, "requires": { "lodash": "^4.17.15" } @@ -5300,7 +5649,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "dev": true, "requires": { "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", @@ -5377,7 +5725,6 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -5409,8 +5756,7 @@ "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 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -5424,8 +5770,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { "version": "4.1.0", @@ -5455,8 +5800,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { "version": "6.3.0", @@ -5467,8 +5811,7 @@ "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 + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.1", @@ -5517,8 +5860,7 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "sisteransi": { "version": "1.0.4", @@ -5759,7 +6101,6 @@ "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", @@ -5802,8 +6143,7 @@ "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, "string-length": { "version": "2.0.0", @@ -5819,7 +6159,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -5845,11 +6184,18 @@ "function-bind": "^1.1.1" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" }, @@ -5857,8 +6203,7 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" } } }, @@ -5877,8 +6222,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "5.5.0", @@ -5935,6 +6279,56 @@ } } }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "requires": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + }, + "dependencies": { + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, "test-exclude": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", @@ -5980,6 +6374,11 @@ "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -6032,7 +6431,6 @@ "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" @@ -6103,11 +6501,15 @@ "tslib": "^1.8.1" } }, + "tunnel": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=" + }, "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" } @@ -6115,8 +6517,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-check": { "version": "0.3.2", @@ -6127,6 +6528,23 @@ "prelude-ls": "~1.1.2" } }, + "typed-rest-client": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.7.1.tgz", + "integrity": "sha512-fZRDWFtUp3J2E0jOiCJYZ9LDrYZHpjY95su//ekqXERS7C1qojP6movh7M4JGURJnBuTVsO0g2N4vEoW5o3Djw==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.4", + "underscore": "1.8.3" + }, + "dependencies": { + "qs": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", + "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" + } + } + }, "typescript": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.2.tgz", @@ -6153,6 +6571,11 @@ } } }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -6165,6 +6588,11 @@ "set-value": "^2.0.1" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -6209,7 +6637,6 @@ "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" } @@ -6226,6 +6653,11 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "util.promisify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", @@ -6239,8 +6671,7 @@ "uuid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -6256,7 +6687,6 @@ "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", @@ -6323,7 +6753,6 @@ "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" } @@ -6334,6 +6763,14 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -6382,8 +6819,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "1.0.3", @@ -6420,12 +6856,22 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "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 }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "yargs": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", diff --git a/package.json b/package.json index 44a03cd..1db701e 100644 --- a/package.json +++ b/package.json @@ -25,11 +25,14 @@ "author": "YourNameOrOrganization", "license": "MIT", "dependencies": { - "@actions/core": "^1.2.0" + "@actions/core": "^1.2.0", + "@types/nodegit": "^0.26.0", + "nodegit": "^0.26.3", + "typed-rest-client": "^1.7.1" }, "devDependencies": { "@types/jest": "^24.0.23", - "@types/node": "^12.7.12", + "@types/node": "^12.12.24", "@typescript-eslint/parser": "^2.8.0", "@zeit/ncc": "^0.20.5", "eslint": "^5.16.0", diff --git a/src/checksums.ts b/src/checksums.ts new file mode 100644 index 0000000..c0c92a9 --- /dev/null +++ b/src/checksums.ts @@ -0,0 +1,21 @@ +import * as httpm from 'typed-rest-client/HttpClient' + +const httpc = new httpm.HttpClient("eskatos/gradle-wrapper-check"); + +export async function fetchValidChecksums(allowSnapshots: boolean): Promise { + let all: any[] = await httpGetJson('https://services.gradle.org/versions/all') + let withChecksum = all.filter(entry => entry.hasOwnProperty('wrapperChecksumUrl')) + let allowed = withChecksum.filter(entry => allowSnapshots || !entry.snapshot) + let checksumUrls: string[] = allowed.map(entry => entry.wrapperChecksumUrl) + let checksums = await Promise.all(checksumUrls.map((url: string) => httpGetText(url))) + return [...new Set(checksums)] +} + +async function httpGetJson(url: string): Promise { + return JSON.parse(await httpGetText(url)); +} + +async function httpGetText(url: string): Promise { + const response = await httpc.get(url); + return await response.readBody(); +} diff --git a/src/find.ts b/src/find.ts new file mode 100644 index 0000000..eae1f18 --- /dev/null +++ b/src/find.ts @@ -0,0 +1,31 @@ +import {Repository, Commit, Tree, TreeEntry} from 'nodegit' + + +export async function findWrapperJars(gitRepoPath: string): Promise { + + let repo: Repository = await Repository.open(gitRepoPath) + let commit: Commit = await repo.getMasterCommit() + let tree: Tree = await commit.getTree() + let walker = tree.walk() + + let prom: Promise = new Promise(((resolve, reject) => { + + let wrapperJars: string[] = [] + + walker.on("entry", (entry: TreeEntry) => { + let path = entry.path() + if (path.endsWith('gradle-wrapper.jar')) { + wrapperJars.push(path) + } + }) + walker.on("error", (error) => { + reject(error) + }) + walker.on("end", (trees) => { + resolve(wrapperJars) + }) + + })) + walker.start() + return prom +} diff --git a/src/hash.ts b/src/hash.ts new file mode 100644 index 0000000..68b9649 --- /dev/null +++ b/src/hash.ts @@ -0,0 +1,12 @@ +import * as crypto from "crypto" +import * as fs from "fs" + +export async function sha256File(path: string): Promise { + return new Promise((resolve, reject) => { + const hash = crypto.createHash("sha256") + fs.createReadStream(path) + .on("data", data => hash.update(data)) + .on("end", () => resolve(hash.digest("hex"))) + .on("error", error => reject(error)) + }) +} diff --git a/src/main.ts b/src/main.ts index b167fb5..01a7e51 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,19 +1,19 @@ +import * as path from "path"; import * as core from '@actions/core' -import {wait} from './wait' -async function run(): Promise { - try { - const ms: string = core.getInput('milliseconds') - core.debug(`Waiting ${ms} milliseconds ...`) +import * as validate from "./validate" - core.debug(new Date().toTimeString()) - await wait(parseInt(ms, 10)) - core.debug(new Date().toTimeString()) - core.setOutput('time', new Date().toTimeString()) - } catch (error) { - core.setFailed(error.message) - } +export async function run(): Promise { + try { + const allowSnapshots = core.getInput("allow-snapshots") == "true" + const invalidWrapperJars = await validate.findInvalidWrapperJars(path.resolve('.'), allowSnapshots) + if (invalidWrapperJars.length > 0) { + core.setFailed("Invalid wrapper jars " + invalidWrapperJars) + } + } catch (error) { + core.setFailed(error.message) + } } run() diff --git a/src/validate.ts b/src/validate.ts new file mode 100644 index 0000000..e882ea0 --- /dev/null +++ b/src/validate.ts @@ -0,0 +1,21 @@ +import * as find from "./find" +import * as checksums from "./checksums" +import * as hash from "./hash" + + +export async function findInvalidWrapperJars(gitRepoRoot: string, allowSnapshots: boolean): Promise { + + const wrapperJars = await find.findWrapperJars(gitRepoRoot) + if (wrapperJars.length > 0) { + const validChecksums = await checksums.fetchValidChecksums(allowSnapshots) + const invalidWrapperJars: string[] = [] + for (let wrapperJar of wrapperJars) { + const sha = await hash.sha256File(wrapperJar) + if (validChecksums.indexOf(sha) < 0) { + invalidWrapperJars.push(wrapperJar) + } + } + return invalidWrapperJars + } + return [] +} diff --git a/src/wait.ts b/src/wait.ts deleted file mode 100644 index b169d9a..0000000 --- a/src/wait.ts +++ /dev/null @@ -1,9 +0,0 @@ -export async function wait(milliseconds: number): Promise { - return new Promise(resolve => { - if (isNaN(milliseconds)) { - throw new Error('milliseconds not a number') - } - - setTimeout(() => resolve('done!'), milliseconds) - }) -}