From e47510d2283cc72b8de1e2b995c80d26bdc7b4f6 Mon Sep 17 00:00:00 2001 From: Eetu Huisman Date: Fri, 29 Nov 2019 12:21:04 +0200 Subject: [PATCH 1/5] Fix deprecation warning --- nodejs/cli/yarn.lock | 20 ++++++++++++++++++++ nodejs/lib/vaultClient.js | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 nodejs/cli/yarn.lock diff --git a/nodejs/cli/yarn.lock b/nodejs/cli/yarn.lock new file mode 100644 index 00000000..e611a28d --- /dev/null +++ b/nodejs/cli/yarn.lock @@ -0,0 +1,20 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +awscred@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/awscred/-/awscred-1.4.2.tgz#5a3e0810f0862da1cb288946e09af2ed7233aa85" + integrity sha512-j3Vehf6PCFzzPZKkzEcj0Y2QO8w8UBbgobnl3DwHMiAE9A2mfJxTkq3cX4UNWHmrTAR0rj5BC/ts90Ok4Pg6rw== + +mri@^1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" + integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== + +sade@^1.4.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.6.1.tgz#aba16655e998b2b68beb9f13938af010f42eddd2" + integrity sha512-USHm9quYNmJwFwhOnEuJohdnBhUOKV1mhL0koHSJMLJaesRX0nuDuzbWmtUBbUmXkwTalLtUBzDlEnU940BiQA== + dependencies: + mri "^1.1.0" diff --git a/nodejs/lib/vaultClient.js b/nodejs/lib/vaultClient.js index 75e6b8f3..369ccacf 100644 --- a/nodejs/lib/vaultClient.js +++ b/nodejs/lib/vaultClient.js @@ -6,7 +6,7 @@ const ALGORITHMS = Object.freeze({ authCrypto: 'id-aes256-GCM', kms: 'AES_256' }); -const STATIC_IV = new Buffer([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1337 / 256, 1337 % 256]); +const STATIC_IV = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1337 / 256, 1337 % 256]); const ENCODING = 'UTF-8'; const createRequestObject = (bucketName, key) => Object.freeze({ From bbf75cf66ba2af42b200f733b329cfa8df2d6652 Mon Sep 17 00:00:00 2001 From: Eetu Huisman Date: Fri, 29 Nov 2019 14:20:52 +0200 Subject: [PATCH 2/5] Fix decipher creation --- nodejs/lib/vaultClient.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nodejs/lib/vaultClient.js b/nodejs/lib/vaultClient.js index 369ccacf..363ed1f4 100644 --- a/nodejs/lib/vaultClient.js +++ b/nodejs/lib/vaultClient.js @@ -22,10 +22,10 @@ const createAuthEncryptedValueRequestObject = (bucketName, name) => createReques const createMetaRequestObject = (bucketName, name) => createRequestObject(bucketName, `${name}.meta`); -const createDecipher = (meta, decryptedKey) => { +const createDecipher = (meta, decryptedKey, authTag) => { return meta === 'nometa' ? crypto.createDecipheriv(ALGORITHMS.crypto, decryptedKey, STATIC_IV) : - crypto.createDecipheriv(ALGORITHMS.authCrypto, decryptedKey, Buffer.from(JSON.parse(meta.Body).nonce, "base64")).setAAD(meta.Body); + crypto.createDecipheriv(ALGORITHMS.authCrypto, decryptedKey, Buffer.from(JSON.parse(meta.Body).nonce, "base64")).setAAD(meta.Body).setAuthTag(authTag); }; const createVaultClient = (options) => { @@ -76,7 +76,7 @@ const createVaultClient = (options) => { const encryptedValue = keyValueAndMeta[1].Body.slice(0, -16); const authTag = keyValueAndMeta[1].Body.slice(-16); const meta = keyValueAndMeta[2]; - const decipher = createDecipher(meta, decryptedKey).setAuthTag(authTag); + const decipher = createDecipher(meta, decryptedKey, authTag); const value = decipher.update(encryptedValue, null, ENCODING); try { From 302d61813820c57a59f6aa2afbd6f00a95de13d9 Mon Sep 17 00:00:00 2001 From: Eetu Huisman Date: Fri, 29 Nov 2019 14:23:29 +0200 Subject: [PATCH 3/5] Simplify interface Also removed all the oudated unit tests. Will write new ones. Sorry. --- nodejs/lib/loadOptions.js | 17 + nodejs/lib/vaultClient.js | 186 ++++----- nodejs/package.json | 10 +- nodejs/test/vaultClient.js | 248 ------------ nodejs/yarn.lock | 765 +------------------------------------ 5 files changed, 125 insertions(+), 1101 deletions(-) create mode 100644 nodejs/lib/loadOptions.js delete mode 100644 nodejs/test/vaultClient.js diff --git a/nodejs/lib/loadOptions.js b/nodejs/lib/loadOptions.js new file mode 100644 index 00000000..083081cf --- /dev/null +++ b/nodejs/lib/loadOptions.js @@ -0,0 +1,17 @@ +const awscred = require('awscred'); +const { promisify } = require('util'); +const { CloudFormation } = require('aws-sdk'); + +const loadCredentialsAndRegion = promisify(awscred.loadCredentialsAndRegion); + +module.exports = (options) => loadCredentialsAndRegion() + .then(({ region }) => new CloudFormation({ region }).describeStacks({ StackName: options.vaultstack }).promise() + .then((describeStackOutput) => Promise.resolve({ describeStackOutput, region }))) + .then(({ describeStackOutput, region }) => { + const stack = describeStackOutput.Stacks[0]; + return Promise.resolve({ + vaultKey: options.k || stack.Outputs.find(output => output.OutputKey === 'kmsKeyArn').OutputValue, + bucketName: options.b || stack.Outputs.find(output => output.OutputKey === 'vaultBucketName').OutputValue, + region, + }); + }); diff --git a/nodejs/lib/vaultClient.js b/nodejs/lib/vaultClient.js index 363ed1f4..09afba62 100644 --- a/nodejs/lib/vaultClient.js +++ b/nodejs/lib/vaultClient.js @@ -16,61 +16,46 @@ const createRequestObject = (bucketName, key) => Object.freeze({ const createKeyRequestObject = (bucketName, name) => createRequestObject(bucketName, `${name}.key`); -const createEncryptedValueRequestObject = (bucketName, name) => createRequestObject(bucketName, `${name}.encrypted`); +const staticSuffix = `.encrypted`; +const createEncryptedValueRequestObject = (bucketName, name) => createRequestObject(bucketName, `${name}${staticSuffix}`); -const createAuthEncryptedValueRequestObject = (bucketName, name) => createRequestObject(bucketName, `${name}.aesgcm.encrypted`); +const aesgcmSuffix = `.aesgcm.encrypted`; +const createAuthEncryptedValueRequestObject = (bucketName, name) => createRequestObject(bucketName, `${name}${aesgcmSuffix}`); const createMetaRequestObject = (bucketName, name) => createRequestObject(bucketName, `${name}.meta`); +const nometa = 'nometa'; + const createDecipher = (meta, decryptedKey, authTag) => { - return meta === 'nometa' ? + return meta === nometa ? crypto.createDecipheriv(ALGORITHMS.crypto, decryptedKey, STATIC_IV) : crypto.createDecipheriv(ALGORITHMS.authCrypto, decryptedKey, Buffer.from(JSON.parse(meta.Body).nonce, "base64")).setAAD(meta.Body).setAuthTag(authTag); }; -const createVaultClient = (options) => { - const bucketName = options.bucketName; - const vaultKey = options.vaultKey; - const region = options.region || process.env.AWS_DEFAULT_REGION; - - const s3 = new AWS.S3({ - region: region - }); - const kms = new AWS.KMS({ - region: region - }); - - const writeObject = (base, value) => s3.putObject(Object.assign({ - Body: value, - ACL: 'private' - }, base)).promise(); - - const ensureCredentials = () => { - if (AWS.config.credentials) { - return Promise.resolve(); - } - return new AWS.CredentialProviderChain([ - new AWS.SharedIniFileCredentials(), - new AWS.EnvironmentCredentials('AWS'), - new AWS.EC2MetadataCredentials({ - httpOptions: { timeout: 5000 }, - maxRetries: 10, - retryDelayOptions: { base: 200 } - }) - ]).resolvePromise(); - }; - - return { - lookup: (name) => ensureCredentials() - .then(() => - Promise.all([ - s3.getObject(createKeyRequestObject(bucketName, name)).promise() - .then(encryptedKey => kms.decrypt({ CiphertextBlob: encryptedKey.Body }).promise()), - s3.getObject(createAuthEncryptedValueRequestObject(bucketName, name)).promise() - .catch(e => s3.getObject(createEncryptedValueRequestObject(bucketName, name)).promise()), - s3.getObject(createMetaRequestObject(bucketName, name)).promise().catch(e => "nometa") - ]) - ) +const writeObject = (s3, base, value) => s3.putObject(Object.assign({ + Body: value, + ACL: 'private' +}, base)).promise(); + +module.exports = { + lookup: (name, options) => { + const { region, bucketName } = options; + + const s3 = new AWS.S3({ + region, + }); + + const kms = new AWS.KMS({ + region, + }); + + return Promise.all([ + s3.getObject(createKeyRequestObject(bucketName, name)).promise() + .then(encryptedKey => kms.decrypt({ CiphertextBlob: encryptedKey.Body }).promise()), + s3.getObject(createAuthEncryptedValueRequestObject(bucketName, name)).promise() + .catch(() => s3.getObject(createEncryptedValueRequestObject(bucketName, name)).promise()), + s3.getObject(createMetaRequestObject(bucketName, name)).promise().catch(() => nometa) + ]) .then(keyValueAndMeta => { const decryptedKey = keyValueAndMeta[0].Plaintext; const encryptedValue = keyValueAndMeta[1].Body.slice(0, -16); @@ -85,14 +70,21 @@ const createVaultClient = (options) => { return Promise.reject(e); } return Promise.resolve(value); - }), - - store: (name, data) => ensureCredentials() - .then(() => - kms.generateDataKey({ - KeyId: vaultKey, - KeySpec: ALGORITHMS.kms - }).promise()) + }) + }, + + store: (name, data, options) => { + const { region, vaultKey, bucketName } = options; + const kms = new AWS.KMS({ + region, + }); + const s3 = new AWS.S3({ + region, + }); + kms.generateDataKey({ + KeyId: vaultKey, + KeySpec: ALGORITHMS.kms + }).promise() .then((dataKey) => { const nonce = crypto.randomBytes(12); const aad = Buffer.from(JSON.stringify({ @@ -103,44 +95,54 @@ const createVaultClient = (options) => { const authValue = cipher.update(data, ENCODING); cipher.final(ENCODING); return Promise.resolve({ - key: dataKey.CiphertextBlob, - value: crypto.createCipheriv(ALGORITHMS.crypto, dataKey.Plaintext, STATIC_IV).update(data, ENCODING), - authValue: Buffer.concat([authValue, cipher.getAuthTag()]), - meta: aad - } - )}) + key: dataKey.CiphertextBlob, + value: crypto.createCipheriv(ALGORITHMS.crypto, dataKey.Plaintext, STATIC_IV).update(data, ENCODING), + authValue: Buffer.concat([authValue, cipher.getAuthTag()]), + meta: aad + } + ) + }) .then((keyAndValue) => Promise.all([ - writeObject(createKeyRequestObject(bucketName, name), keyAndValue.key), - writeObject(createEncryptedValueRequestObject(bucketName, name), keyAndValue.value), - writeObject(createAuthEncryptedValueRequestObject(bucketName, name), keyAndValue.authValue), - writeObject(createMetaRequestObject(bucketName, name), keyAndValue.meta) - ])), - - delete: (name) => ensureCredentials() - .then(() => - Promise.all([ - s3.deleteObject(createEncryptedValueRequestObject(bucketName, name)).promise(), - s3.deleteObject(createKeyRequestObject(bucketName, name)).promise(), - s3.deleteObject(createAuthEncryptedValueRequestObject(bucketName, name)).promise().catch(e => e), - s3.deleteObject(createMetaRequestObject(bucketName, name)).promise().catch(e => e) - ])), - - exists: (name) => ensureCredentials() - .then(() => - s3.headObject(createEncryptedValueRequestObject(bucketName, name)).promise()) - .then(() => Promise.resolve(true), () => Promise.resolve(false) - ), - - all: () => ensureCredentials() - .then(() => - s3.listObjectsV2({ - Bucket: bucketName - }).promise()) - .then((data) => Promise.resolve(data.Contents - .filter((object) => object.Key.endsWith('.encrypted')) - .map(object => object.Key.slice(0, -('.encrypted'.length))))) - }; + writeObject(s3, createKeyRequestObject(bucketName, name), keyAndValue.key), + writeObject(s3, createEncryptedValueRequestObject(bucketName, name), keyAndValue.value), + writeObject(s3, createAuthEncryptedValueRequestObject(bucketName, name), keyAndValue.authValue), + writeObject(s3, createMetaRequestObject(bucketName, name), keyAndValue.meta) + ])); + }, + + delete: (name, options) => { + const { region, bucketName } = options; + const s3 = new AWS.S3({ + region, + }); + return Promise.all([ + s3.deleteObject(createEncryptedValueRequestObject(bucketName, name)).promise(), + s3.deleteObject(createKeyRequestObject(bucketName, name)).promise(), + s3.deleteObject(createAuthEncryptedValueRequestObject(bucketName, name)).promise().catch(e => e), + s3.deleteObject(createMetaRequestObject(bucketName, name)).promise().catch(e => e) + ]); + }, + + exists: (name, options) => { + const { region, bucketName } = options; + const s3 = new AWS.S3({ + region, + }); + return s3.headObject(createEncryptedValueRequestObject(bucketName, name)).promise() + .then(() => Promise.resolve(true), () => Promise.resolve(false)); + }, + + all: (options) => { + const { region, bucketName } = options; + const s3 = new AWS.S3({ + region, + }); + return s3.listObjectsV2({ + Bucket: bucketName + }).promise() + .then(data => Promise.resolve([...new Set(data.Contents + .filter(object => object.Key.endsWith(aesgcmSuffix) || object.Key.endsWith(staticSuffix)) + .map(object => object.Key.slice(0, -(object.Key.endsWith(aesgcmSuffix) ? aesgcmSuffix.length : staticSuffix.length))))])) + } }; - -module.exports = createVaultClient; diff --git a/nodejs/package.json b/nodejs/package.json index 402f3f11..8a7d4474 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -14,14 +14,8 @@ "test": "mocha" }, "dependencies": { - "aws-sdk": "2.539.0" - }, - "devDependencies": { - "aws-sdk-mock": "4.5.0", - "mocha": "6.2.1", - "should": "13.2.3", - "should-sinon": "0.0.6", - "sinon": "7.5.0" + "aws-sdk": "2.539.0", + "awscred": "1.5.0" }, "engines": { "node": ">= 0.8.0" diff --git a/nodejs/test/vaultClient.js b/nodejs/test/vaultClient.js deleted file mode 100644 index 00229bd9..00000000 --- a/nodejs/test/vaultClient.js +++ /dev/null @@ -1,248 +0,0 @@ -const AWS = require('aws-sdk-mock'); -const sinon = require('sinon'); -require('should'); -require('should-sinon'); -const VaultClient = require('../lib/vaultClient'); -const crypto = require('crypto'); - -const VAULT_KEY_FIXTURE = 'vaultKey'; -const BUCKET_NAME_FIXTURE = 'bucket'; -const SECRET_NAME_FIXTURE = 'name'; -const ENCRYPTED_KEY_FIXTURE = 'key'; -const DATA_FIXTURE = 'value'; - -describe('VaultClient', () => { - let vaultClient; - const getObjectSpy = sinon.stub(); - const decryptSpy = sinon.stub(); - const putObjectSpy = sinon.stub(); - const generateDataKeySpy = sinon.stub(); - const headObjectSpy = sinon.stub(); - const listObjectsSpy = sinon.stub(); - const deleteObjectSpy = sinon.stub(); - const resolveStub = sinon.stub().yields(); - - before(() => { - AWS.mock('S3', 'getObject', getObjectSpy); - AWS.mock('S3', 'putObject', putObjectSpy); - AWS.mock('S3', 'headObject', headObjectSpy); - AWS.mock('S3', 'listObjectsV2', listObjectsSpy); - AWS.mock('S3', 'deleteObject', deleteObjectSpy); - AWS.mock('KMS', 'decrypt', decryptSpy); - AWS.mock('KMS', 'generateDataKey', generateDataKeySpy); - AWS.mock('CredentialProviderChain', 'resolve', resolveStub); - }); - - beforeEach(() => { - vaultClient = VaultClient({ - bucketName: BUCKET_NAME_FIXTURE, - vaultKey: VAULT_KEY_FIXTURE - }); - }); - - after(() => { - AWS.restore(); - }); - - describe('factory', () => { - it('returns an object', () => { - vaultClient.should.be.an.Object(); - }); - }); - - describe('lookup', () => { - beforeEach(() => { - getObjectSpy - .onCall(0) - .yields(null, { Body: ENCRYPTED_KEY_FIXTURE }) - .onCall(1) - .yields(null, { Body: Buffer.concat([new Buffer('foo'), crypto.randomBytes(16)]) }) - .onCall(2) - .yields(null, { - Body: Buffer.from( - JSON.stringify({ - alg: 'AESGCM', - nonce: crypto.randomBytes(12).toString('base64') - }) - ) - }); - - decryptSpy.yields(null, { - Plaintext: crypto.randomBytes(32) - }); - }); - - afterEach(() => { - getObjectSpy.reset(); - decryptSpy.reset(); - }); - - it('reads GCM encrypted value from S3', () => - vaultClient.lookup(SECRET_NAME_FIXTURE).then(() => - getObjectSpy.should.have.been.calledWithMatch({ - Key: SECRET_NAME_FIXTURE + '.aesgcm.encrypted' - }) - )); - - it('reads encrypted key from S3', () => - vaultClient.lookup(SECRET_NAME_FIXTURE).then(() => - getObjectSpy.should.have.been.calledWithMatch({ - Key: SECRET_NAME_FIXTURE + '.key' - }) - )); - - it('reads meta value from S3', () => - vaultClient.lookup(SECRET_NAME_FIXTURE).then(() => - getObjectSpy.should.have.been.calledWithMatch({ - Key: SECRET_NAME_FIXTURE + '.meta' - }) - )); - - it('reads encrypted key and value from the correct bucket', () => - vaultClient.lookup(SECRET_NAME_FIXTURE).then(() => - getObjectSpy.should.have.been.alwaysCalledWithMatch({ - Bucket: BUCKET_NAME_FIXTURE - }) - )); - - it('decrypts the encrypted key using KMS', () => - vaultClient.lookup(SECRET_NAME_FIXTURE).then(() => - decryptSpy.should.have.been.calledWithMatch({ - CiphertextBlob: ENCRYPTED_KEY_FIXTURE - }) - )); - - it('resolves to a string promise', () => - vaultClient - .lookup(SECRET_NAME_FIXTURE) - .then(result => result.should.be.a.String())); - }); - - describe('store', () => { - beforeEach(() => { - putObjectSpy.yields(); - - generateDataKeySpy.yields(null, { - Plaintext: crypto.randomBytes(32), - CiphertextBlob: crypto.randomBytes(32) - }); - }); - - it('Writes encrypted value to S3', () => - vaultClient.store(SECRET_NAME_FIXTURE, DATA_FIXTURE).then(() => - putObjectSpy.should.have.been.calledWithMatch({ - Key: SECRET_NAME_FIXTURE + '.encrypted' - }) - )); - - it('Writes GCM encrypted value to S3', () => - vaultClient.store(SECRET_NAME_FIXTURE, DATA_FIXTURE).then(() => - putObjectSpy.should.have.been.calledWithMatch({ - Key: SECRET_NAME_FIXTURE + '.aesgcm.encrypted' - }) - )); - - it('Writes encryption key to S3', () => - vaultClient.store(SECRET_NAME_FIXTURE, DATA_FIXTURE).then(() => - putObjectSpy.should.have.been.calledWithMatch({ - Key: SECRET_NAME_FIXTURE + '.key' - }) - )); - - it('Writes key and value to correct bucket', () => - vaultClient.store(SECRET_NAME_FIXTURE, DATA_FIXTURE).then(() => - putObjectSpy.should.have.been.alwaysCalledWithMatch({ - Bucket: BUCKET_NAME_FIXTURE - }) - )); - - it('Encrypts value using the correct vault key', () => - vaultClient.store(SECRET_NAME_FIXTURE, DATA_FIXTURE).then(() => - generateDataKeySpy.should.have.been.calledWithMatch({ - KeyId: VAULT_KEY_FIXTURE - }) - )); - }); - - describe('exists', () => { - describe('when object exists', () => { - beforeEach(() => headObjectSpy.yields(null, {})); - - it('resolves to true', () => { - return vaultClient.exists(SECRET_NAME_FIXTURE).then(exists => { - exists.should.be.true(); - }); - }); - }); - - describe('when object does not exist', () => { - beforeEach(() => headObjectSpy.yields({})); - - it('resolves to false', () => { - return vaultClient.exists(SECRET_NAME_FIXTURE).then(exists => { - exists.should.be.false(); - }); - }); - }); - }); - - describe('all', () => { - beforeEach(() => { - listObjectsSpy.yields(null, { - Contents: [ - { - Key: 'first.encrypted' - }, - { - Key: 'second.key' - }, - { - Key: 'second.encrypted' - }, - { - Key: 'first.key' - } - ] - }); - }); - - it('resolves to an Array of names', () => - vaultClient.all().then(all => all.should.be.an.Array())); - - it('resolves to an Array of correct size', () => - vaultClient.all().then(all => all.should.have.property('length', 2))); - - it('resolves to an Array with correct names', () => - vaultClient.all().then(all => { - all.should.containEql('first'); - all.should.containEql('second'); - })); - }); - - describe('delete', () => { - beforeEach(() => { - deleteObjectSpy.yields(null, {}); - }); - - it('deletes the encrypted value from S3', () => - vaultClient.delete(ENCRYPTED_KEY_FIXTURE).then(() => - deleteObjectSpy.should.have.been.calledWithMatch({ - Key: ENCRYPTED_KEY_FIXTURE + '.encrypted' - }) - )); - - it('deletes the key from S3', () => - vaultClient.delete(ENCRYPTED_KEY_FIXTURE).then(() => - deleteObjectSpy.should.have.been.calledWithMatch({ - Key: ENCRYPTED_KEY_FIXTURE + '.key' - }) - )); - - it('deletes the value and the key from the correct bucket', () => - vaultClient.delete(ENCRYPTED_KEY_FIXTURE).then(() => - deleteObjectSpy.should.have.been.alwaysCalledWithMatch({ - Bucket: BUCKET_NAME_FIXTURE - }) - )); - }); -}); diff --git a/nodejs/yarn.lock b/nodejs/yarn.lock index 3af48ff5..e2117a86 100644 --- a/nodejs/yarn.lock +++ b/nodejs/yarn.lock @@ -2,79 +2,7 @@ # yarn lockfile v1 -"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" - integrity sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/formatio@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" - integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ== - dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^3.1.0" - -"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.3": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" - integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== - dependencies: - "@sinonjs/commons" "^1.3.0" - array-from "^2.1.1" - lodash "^4.17.15" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-from@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" - integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= - -aws-sdk-mock@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/aws-sdk-mock/-/aws-sdk-mock-4.5.0.tgz#9de5feefaf9c755f22fcf029db3f202599a9219e" - integrity sha512-PAZKbQsdaVVoMr1JZbi04FUrkxCK16qnwBWLm4keeBrEfqYab/cFNsn5IVp/ThdMQpJGYHnmqUPyFq1plKaHZg== - dependencies: - aws-sdk "^2.483.0" - sinon "^7.3.2" - traverse "^0.6.6" - -aws-sdk@2.539.0, aws-sdk@^2.483.0: +aws-sdk@2.539.0: version "2.539.0" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.539.0.tgz#4bae923b20723d78fbe4e208847f07de2965f87a" integrity sha512-jPnggqa676kqFHFPCJvfckN2SKI/+IQJREL+XxOocS1lyI+5iGxbJvlU0BLEsY2Is4LvMjsnxdqSAVIL5NRbyw== @@ -89,28 +17,14 @@ aws-sdk@2.539.0, aws-sdk@^2.483.0: uuid "3.3.2" xml2js "0.4.19" -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +awscred@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/awscred/-/awscred-1.5.0.tgz#4b8dce2465f480e4708ba20686495c03f1826d99" + integrity sha512-EkdH0O/gp5LOAU/CxCkeo6BF8qdGRmhFkVYMaNNZiNTgBHg0EpLswdtwhXZoC4t/NX5Ctx43WHHQd1Z3KrFQgg== base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" buffer@4.9.1: version "4.9.1" @@ -121,628 +35,44 @@ buffer@4.9.1: ieee754 "^1.1.4" isarray "^1.0.0" -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chalk@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -diff@3.5.0, diff@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -es-abstract@^1.5.1: - version "1.14.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.14.2.tgz#7ce108fad83068c8783c3cdf62e504e084d8c497" - integrity sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.0" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-inspect "^1.6.0" - object-keys "^1.1.1" - string.prototype.trimleft "^2.0.0" - string.prototype.trimright "^2.0.0" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - events@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - dependencies: - is-buffer "~2.0.3" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - 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" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= - -has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -ieee754@1.1.13, ieee754@^1.1.4: +ieee754@1.1.13: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= - dependencies: - has "^1.0.1" - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== - dependencies: - has-symbols "^1.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" isarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - jmespath@0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" - integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= - -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -just-extend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" - integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -log-symbols@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -lolex@^4.1.0, lolex@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" - integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mocha@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.1.tgz#da941c99437da9bac412097859ff99543969f94c" - integrity sha512-VCcWkLHwk79NYQc8cxhkmI8IigTIhsCwZ6RTxQsqK6go4UvEhzJkYuHm8B2YtlSxcYq2fY+ucr4JBwoD6ci80A== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "2.2.0" - minimatch "3.0.4" - mkdirp "0.5.1" - ms "2.1.1" - node-environment-flags "1.0.5" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.0" - yargs-parser "13.1.1" - yargs-unparser "1.6.0" - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nise@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.2.tgz#b6d29af10e48b321b307e10e065199338eeb2652" - integrity sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== - dependencies: - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - lolex "^4.1.0" - path-to-regexp "^1.7.0" - -node-environment-flags@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" - integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -object-inspect@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -p-limit@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= - dependencies: - isarray "0.0.1" punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -sax@1.2.1: +sax@1.2.1, sax@>=0.6.0: version "1.2.1" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" - integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= - -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -should-equal@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" - integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== - dependencies: - should-type "^1.4.0" - -should-format@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" - integrity sha1-m/yPdPo5IFxT04w01xcwPidxJPE= - dependencies: - should-type "^1.3.0" - should-type-adaptors "^1.0.1" - -should-sinon@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/should-sinon/-/should-sinon-0.0.6.tgz#be041a7c928f44ac9ccf5dc042d032618ce29f84" - integrity sha512-ScBOH5uW5QVFaONmUnIXANSR6z5B8IKzEmBP3HE5sPOCDuZ88oTMdUdnKoCVQdLcCIrRrhRLPS5YT+7H40a04g== - -should-type-adaptors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" - integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== - dependencies: - should-type "^1.3.0" - should-util "^1.0.0" - -should-type@^1.3.0, should-type@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" - integrity sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM= - -should-util@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" - integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== - -should@13.2.3: - version "13.2.3" - resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" - integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== - dependencies: - should-equal "^2.0.0" - should-format "^3.0.3" - should-type "^1.4.0" - should-type-adaptors "^1.0.1" - should-util "^1.0.0" - -sinon@7.5.0, sinon@^7.3.2: - version "7.5.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" - integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== - dependencies: - "@sinonjs/commons" "^1.4.0" - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/samsam" "^3.3.3" - diff "^3.5.0" - lolex "^4.2.0" - nise "^1.5.2" - supports-color "^5.5.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimleft@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" - integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimright@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" - integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -traverse@^0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" - integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== url@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" - integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= dependencies: punycode "1.3.2" querystring "0.2.0" @@ -752,39 +82,6 @@ uuid@3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - xml2js@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" @@ -797,41 +94,3 @@ xmlbuilder@~9.0.1: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yargs-parser@13.1.1, yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs@13.3.0, yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - dependencies: - cliui "^5.0.0" - find-up "^3.0.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 "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.1" From cab00feaa5f8f096877c0152bd86de9d6c8900cc Mon Sep 17 00:00:00 2001 From: Eetu Huisman Date: Fri, 29 Nov 2019 14:25:20 +0200 Subject: [PATCH 4/5] Add command-line interface --- nodejs/cli/package.json | 28 ++++++++++++++++++ nodejs/cli/vault.js | 64 +++++++++++++++++++++++++++++++++++++++++ nodejs/cli/yarn.lock | 5 ---- 3 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 nodejs/cli/package.json create mode 100755 nodejs/cli/vault.js diff --git a/nodejs/cli/package.json b/nodejs/cli/package.json new file mode 100644 index 00000000..9bf83cfc --- /dev/null +++ b/nodejs/cli/package.json @@ -0,0 +1,28 @@ +{ + "name": "@nitor/aws-vault-cli", + "version": "0.0.1", + "description": "Command-line interface for AWS vault", + "author": { + "name": "Nitor", + "email": "", + "url": "http://nitor.com" + }, + "contributors": [ + "Eetu Huisman " + ], + "main": "index.js", + "repository": { + "type": "git", + "url": "git://github.com/NitorCreations/vault" + }, + "bugs": { + "url": "http://github.com/NitorCreations/vault/issues" + }, + "license": "Apache-2.0", + "peerDependencies": { + "@nitor/aws-vault": "0.1.1" + }, + "dependencies": { + "sade": "^1.4.2" + } +} diff --git a/nodejs/cli/vault.js b/nodejs/cli/vault.js new file mode 100755 index 00000000..2a4dd6da --- /dev/null +++ b/nodejs/cli/vault.js @@ -0,0 +1,64 @@ +#!/usr/bin/env node +const sade = require('sade'); +const loadOptions = require('../lib/loadOptions'); +const client = require('../lib/vaultClient'); + +const DEFAULT_STACK_NAME = 'vault'; + +const handleRejection = err => { + console.error(err); + process.exit(1); +}; + +const prog = sade('vault'); + +prog.option('--vaultstack', 'Optional CloudFormation stack to lookup key and bucket.', DEFAULT_STACK_NAME); +prog.option('-p, --prefix', 'Optional prefix to store values under. Empty by default'); +prog.option('-b, --bucket', 'Override the bucket name either for initialization or storing and looking up values'); +prog.option('-k, --key-arn', 'Override the KMS key arn for storing or looking up values'); +prog.option('--id', 'Give an IAM access key id to override those defined by the environment'); +prog.option('--secret', 'Give an IAM secret access key to override those defined by the environment'); +prog.option('-r, --region', 'Give a region for the stack and the bucket'); + +prog + .command('store ') + .describe('Store data in the vault') + .option('-w, --overwrite', 'Overwrite the current value if it already exists', false) + .action((name, value, options) => { + loadOptions(options) + .then(options => client.store(name, value, options)) + .catch(handleRejection); + }) + .command('lookup ') + .describe('Look up data from the vault') + .action((name, options) => { + loadOptions(options) + .then(options => client.lookup(name, options)) + .then(console.log) + .catch(handleRejection); + }) + .command('delete ') + .describe('Delete data from the vault') + .action((name, options) => { + loadOptions(options) + .then(options => client.delete(name, options)) + .catch(handleRejection) + }) + .command('exists ') + .describe('Check if the vault contains data') + .action((name, options) => { + loadOptions(options) + .then(options => client.exists(name, options)) + .then(console.log) + .catch(handleRejection) + }) + .command('all') + .describe('List all keys the vault contains') + .action(options => { + loadOptions(options) + .then(options => client.all(options)) + .then(console.log) + .catch(handleRejection) + }); + +prog.parse(process.argv); diff --git a/nodejs/cli/yarn.lock b/nodejs/cli/yarn.lock index e611a28d..445e7018 100644 --- a/nodejs/cli/yarn.lock +++ b/nodejs/cli/yarn.lock @@ -2,11 +2,6 @@ # yarn lockfile v1 -awscred@1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/awscred/-/awscred-1.4.2.tgz#5a3e0810f0862da1cb288946e09af2ed7233aa85" - integrity sha512-j3Vehf6PCFzzPZKkzEcj0Y2QO8w8UBbgobnl3DwHMiAE9A2mfJxTkq3cX4UNWHmrTAR0rj5BC/ts90Ok4Pg6rw== - mri@^1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" From e7eba50bfa5afe20397aa098ca6f56ab442e645c Mon Sep 17 00:00:00 2001 From: Eetu Huisman Date: Fri, 29 Nov 2019 14:37:24 +0200 Subject: [PATCH 5/5] Bump version number This branch introduces a major API breaking change. --- nodejs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodejs/package.json b/nodejs/package.json index 8a7d4474..276ad6f5 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -1,6 +1,6 @@ { "name": "@nitor/aws-vault", - "version": "0.1.1", + "version": "1.0.0", "author": { "name": "Nitor Creations", "email": "",