From 396be3771f33d0cf4f0286e8fbe9449f7de7a7d0 Mon Sep 17 00:00:00 2001 From: Samuel Marks Date: Fri, 9 Jun 2017 08:17:32 -0400 Subject: [PATCH] Use the built-in getProvider() and region. (#12) --- package.json | 6 +- src/plugin.js | 38 ++---- test/plugin.spec.js | 274 +++++++++++++++++++------------------------- yarn.lock | 53 ++++++++- 4 files changed, 181 insertions(+), 190 deletions(-) diff --git a/package.json b/package.json index f0e8a89..129fbd8 100644 --- a/package.json +++ b/package.json @@ -26,9 +26,7 @@ "url": "https://github.com/Jimdo/serverless-dynamodb-ttl/issues" }, "homepage": "https://github.com/Jimdo/serverless-dynamodb-ttl#readme", - "dependencies": { - "aws-sdk": "^2.45.0" - }, + "dependencies": {}, "standard": { "envs": [ "node", @@ -40,10 +38,10 @@ ] }, "devDependencies": { - "aws-sdk-mock": "^1.7.0", "coveralls": "^2.13.0", "dot-json": "^1.0.3", "jest": "^19.0.2", + "sinon": "^2.3.2", "snazzy": "^7.0.0", "standard": "^10.0.2" } diff --git a/src/plugin.js b/src/plugin.js index b3b3d6b..91f3c43 100644 --- a/src/plugin.js +++ b/src/plugin.js @@ -2,12 +2,12 @@ const assert = require('assert') const util = require('util') -const AWS = require('aws-sdk') class Plugin { constructor (serverless, options) { this.serverless = serverless this.options = options || {} + this.provider = serverless.getProvider('aws') this.hooks = { 'after:deploy:deploy': this.afterDeploy.bind(this) @@ -26,23 +26,11 @@ class Plugin { assert(this.list().length > 0, 'No configuration found') } - configure () { - this.region = this.serverless.service.provider.region - - if (this.options && this.options.region) { - this.region = this.options.region - } - - this.dynamodb = new AWS.DynamoDB({ region: this.region }) - } - afterDeploy () { return Promise.resolve().then( this.validate.bind(this) ).then( - this.configure.bind(this) - ).then( - () => this.serverless.cli.log(util.format('Enabling TTL setting(s) for DynamoDB (%s)', this.region)) + () => this.serverless.cli.log(util.format('Enabling TTL setting(s) for DynamoDB (%s)', this.options.region)) ).then( () => this.list().map( data => this.check(data.table).then( @@ -55,25 +43,21 @@ class Plugin { } check (table) { - return this.dynamodb.describeTimeToLive( - { - TableName: table - } - ).promise().then( + return this.provider.request('DynamoDB', 'describeTimeToLive', { + TableName: table + }).then( res => res.TimeToLiveDescription.TimeToLiveStatus === 'ENABLED' ) } enable (data) { - return this.dynamodb.updateTimeToLive( - { - TableName: data.table, - TimeToLiveSpecification: { - AttributeName: data.field, - Enabled: true - } + return this.provider.request('DynamoDB', 'updateTimeToLive', { + TableName: data.table, + TimeToLiveSpecification: { + AttributeName: data.field, + Enabled: true } - ).promise() + }) } list () { diff --git a/test/plugin.spec.js b/test/plugin.spec.js index 2188762..20ff493 100644 --- a/test/plugin.spec.js +++ b/test/plugin.spec.js @@ -1,21 +1,32 @@ 'use strict' -var AWS = require('aws-sdk-mock') +const sinon = require('sinon') const Plugin = require('../') describe('Plugin', () => { + let getProvider = null + let provider = { + request: () => true + } + let providerMock = null + + beforeEach(() => { + providerMock = sinon.mock(provider) + getProvider = sinon.stub().returns(provider) + }) + afterEach(() => { - AWS.restore('DynamoDB') + providerMock.restore() }) describe('Configuration', () => { it('Reads configuration', () => { const config = { cli: { log: () => {} }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' }, custom: { dynamodb: { @@ -25,7 +36,8 @@ describe('Plugin', () => { ] } } - } + }, + getProvider } const test = new Plugin(config) @@ -39,12 +51,13 @@ describe('Plugin', () => { const config = { cli: { log }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' } - } + }, + getProvider } return new Plugin(config, { noDeploy: true }).afterDeploy().then( @@ -57,12 +70,13 @@ describe('Plugin', () => { const config = { cli: { log }, + region: 'us-east-1', service: { provider: { - name: 'google', - region: 'us-east-1' + name: 'google' } - } + }, + getProvider } return new Plugin(config, { }).afterDeploy().then( @@ -70,252 +84,207 @@ describe('Plugin', () => { ) }) - it('Use default service region', () => { + it('Use the region provided in options by default', () => { let log = jest.fn() - let dynamoDBdescribeTimeToLiveSpy = jest.fn((_, cb) => cb(null, { TimeToLiveDescription: { TimeToLiveStatus: false } })) - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) + providerMock.expects('request') + .withArgs('DynamoDB', 'describeTimeToLive') + .returns(Promise.resolve({ TimeToLiveDescription: { TimeToLiveStatus: false } })) + providerMock.expects('request') + .withArgs('DynamoDB', 'updateTimeToLive') + .returns(Promise.resolve()) const config = { cli: { log }, service: { provider: { - name: 'aws', - region: 'us-example-1' + name: 'aws' }, custom: { dynamodb: { ttl: [ { table: 'my-table-1', field: 'my-field-1' } ] } } - } + }, + getProvider } - return new Plugin(config, { }).afterDeploy().then( + return new Plugin(config, { region: 'us-example-1' }).afterDeploy().then( () => { expect(log).toBeCalledWith('Enabling TTL setting(s) for DynamoDB (us-example-1)') - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(1) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(1) - } - ) - }) - - it('Use custom region with --region', () => { - let log = jest.fn() - let dynamoDBdescribeTimeToLiveSpy = jest.fn((_, cb) => cb(null, { TimeToLiveDescription: { TimeToLiveStatus: false } })) - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) - - const config = { - cli: { log }, - service: { - provider: { - name: 'aws', - region: 'us-example-1' - }, - custom: { - dynamodb: { ttl: [ { table: 'my-table-1', field: 'my-field-1' } ] } - } - } - } - - return new Plugin(config, { region: 'us-awesome-1' }).afterDeploy().then( - () => { - expect(log).toBeCalledWith('Enabling TTL setting(s) for DynamoDB (us-awesome-1)') - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(1) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(1) } ) }) it('Skips when no custom.dynamodb.ttl is found', () => { let log = jest.fn() - let dynamoDBdescribeTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) + providerMock.expects('request').never() const config = { cli: { log }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' }, custom: { dynamodb: { } } - } + }, + getProvider } return new Plugin(config, { region: 'eu-west-1' }).afterDeploy().then( () => { expect(log).toBeCalledWith('Skipping TTL setting(s) for DynamoDB: No configuration found!') - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(0) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(0) } ) }) it('Skips when no custom.dynamodb is found', () => { let log = jest.fn() - let dynamoDBdescribeTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) + providerMock.expects('request').never() const config = { cli: { log }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' }, custom: { } - } + }, + getProvider } return new Plugin(config, { region: 'eu-west-1' }).afterDeploy().then( () => { expect(log).toBeCalledWith('Skipping TTL setting(s) for DynamoDB: No configuration found!') - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(0) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(0) } ) }) it('Skips when no custom is found', () => { let log = jest.fn() - let dynamoDBdescribeTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) + providerMock.expects('request').never() const config = { cli: { log }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' } - } + }, + getProvider } return new Plugin(config, { region: 'eu-west-1' }).afterDeploy().then( () => { expect(log).toBeCalledWith('Skipping TTL setting(s) for DynamoDB: No configuration found!') - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(0) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(0) } ) }) it('Skips when custom.dynamodb.ttl is not an array', () => { let log = jest.fn() - let dynamoDBdescribeTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) + providerMock.expects('request').never() const config = { cli: { log }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' }, - custom: { dynamodb: { ttl: { invalid: true } } } } + custom: { dynamodb: { ttl: { invalid: true } } } + }, + getProvider } return new Plugin(config, { region: 'eu-west-1' }).afterDeploy().then( () => { expect(log).toBeCalledWith('Skipping TTL setting(s) for DynamoDB: Invalid configuration found!') - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(0) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(0) } ) }) }) - it('Updates TTL setting if not alreadt set', () => { + it('Updates TTL setting if not already set', () => { let log = jest.fn() - let dynamoDBdescribeTimeToLiveSpy = jest.fn((_, cb) => cb(null, { TimeToLiveDescription: { TimeToLiveStatus: false } })) - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) + providerMock.expects('request') + .withArgs('DynamoDB', 'describeTimeToLive') + .returns(Promise.resolve({ TimeToLiveDescription: { TimeToLiveStatus: false } })) + providerMock.expects('request') + .withArgs('DynamoDB', 'updateTimeToLive') + .returns(Promise.resolve()) const config = { cli: { log }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' }, custom: { dynamodb: { ttl: [ { table: 'my-table-1', field: 'my-field-1' } ] } } - } + }, + getProvider } return new Plugin(config, { region: 'eu-west-1' }).afterDeploy().then( () => { expect(log).toBeCalledWith('Enabling TTL setting(s) for DynamoDB (eu-west-1)') - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(1) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(1) } ) }) it('Does not update TTL configuration if already set', () => { - let dynamoDBdescribeTimeToLiveSpy = jest.fn((_, cb) => cb(null, { TimeToLiveDescription: { TimeToLiveStatus: 'ENABLED' } })) - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) + providerMock.expects('request') + .withArgs('DynamoDB', 'describeTimeToLive') + .returns(Promise.resolve({ TimeToLiveDescription: { TimeToLiveStatus: 'ENABLED' } })) + providerMock.expects('request') + .withArgs('DynamoDB', 'updateTimeToLive') + .never() const config = { cli: { log: () => {} }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' }, custom: { dynamodb: { ttl: [ { table: 'my-table-1', field: 'my-field-1' } ] } } - } + }, + getProvider } - return new Plugin(config, { region: 'eu-west-1' }).afterDeploy().then( - () => { - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(1) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(0) - } - ) + return new Plugin(config, { region: 'eu-west-1' }).afterDeploy() }) it('Does work for multiple table configuration #1', () => { - let dynamoDBdescribeTimeToLiveSpy = jest.fn((_, cb) => cb(null, { TimeToLiveDescription: { TimeToLiveStatus: 'ENABLED' } })) - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) + providerMock.expects('request') + .withArgs('DynamoDB', 'describeTimeToLive') + .twice() + .returns(Promise.resolve({ TimeToLiveDescription: { TimeToLiveStatus: 'ENABLED' } })) + providerMock.expects('request') + .withArgs('DynamoDB', 'updateTimeToLive') + .never() const config = { cli: { log: () => {} }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' }, custom: { dynamodb: { @@ -325,30 +294,29 @@ describe('Plugin', () => { ] } } - } + }, + getProvider } - return new Plugin(config, { region: 'eu-west-1' }).afterDeploy().then( - () => { - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(2) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(0) - } - ) + return new Plugin(config, { region: 'eu-west-1' }).afterDeploy() }) it('Does work for multiple table configuration #2', () => { - let dynamoDBdescribeTimeToLiveSpy = jest.fn((_, cb) => cb(null, { TimeToLiveDescription: { TimeToLiveStatus: false } })) - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) + providerMock.expects('request') + .withArgs('DynamoDB', 'describeTimeToLive') + .twice() + .returns(Promise.resolve({ TimeToLiveDescription: { TimeToLiveStatus: false } })) + providerMock.expects('request') + .withArgs('DynamoDB', 'updateTimeToLive') + .twice() + .returns(Promise.resolve()) const config = { cli: { log: () => {} }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' }, custom: { dynamodb: { @@ -358,33 +326,29 @@ describe('Plugin', () => { ] } } - } + }, + getProvider } - return new Plugin(config, { region: 'eu-west-1' }).afterDeploy().then( - () => { - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(2) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(2) - } - ) + return new Plugin(config, { region: 'eu-west-1' }).afterDeploy() }) it('Does work for multiple table configuration #3', () => { - let dynamoDBdescribeTimeToLiveSpy = jest.fn() - .mockImplementationOnce((_, cb) => cb(null, { TimeToLiveDescription: { TimeToLiveStatus: false } })) - .mockImplementationOnce((_, cb) => cb(null, { TimeToLiveDescription: { TimeToLiveStatus: 'ENABLED' } })) - - let dynamoDBupdateTimeToLiveSpy = jest.fn((_, cb) => cb(null, '')) - - AWS.mock('DynamoDB', 'describeTimeToLive', dynamoDBdescribeTimeToLiveSpy) - AWS.mock('DynamoDB', 'updateTimeToLive', dynamoDBupdateTimeToLiveSpy) + providerMock.expects('request') + .withArgs('DynamoDB', 'describeTimeToLive') + .returns(Promise.resolve({ TimeToLiveDescription: { TimeToLiveStatus: false } })) + .returns(Promise.resolve({ TimeToLiveDescription: { TimeToLiveStatus: 'ENABLED' } })) + providerMock.expects('request') + .withArgs('DynamoDB', 'updateTimeToLive') + .once() + .returns(Promise.resolve()) const config = { cli: { log: () => {} }, + region: 'us-east-1', service: { provider: { - name: 'aws', - region: 'us-east-1' + name: 'aws' }, custom: { dynamodb: { @@ -394,14 +358,10 @@ describe('Plugin', () => { ] } } - } + }, + getProvider } - return new Plugin(config, { region: 'eu-west-1' }).afterDeploy().then( - () => { - expect(dynamoDBdescribeTimeToLiveSpy).toHaveBeenCalledTimes(2) - expect(dynamoDBupdateTimeToLiveSpy).toHaveBeenCalledTimes(1) - } - ) + return new Plugin(config, { region: 'eu-west-1' }).afterDeploy() }) }) diff --git a/yarn.lock b/yarn.lock index a7efe74..71eb942 100644 --- a/yarn.lock +++ b/yarn.lock @@ -163,7 +163,7 @@ aws-sdk-mock@^1.7.0: sinon "^1.17.3" traverse "^0.6.6" -aws-sdk@^2.3.0, aws-sdk@^2.45.0: +aws-sdk@^2.3.0: version "2.45.0" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.45.0.tgz#045dbd323630170968306dc849d793dbb1e4444d" dependencies: @@ -645,7 +645,7 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -diff@^3.0.0: +diff@^3.0.0, diff@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" @@ -1087,6 +1087,12 @@ formatio@1.1.1: dependencies: samsam "~1.1" +formatio@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" + dependencies: + samsam "1.x" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1441,6 +1447,10 @@ is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -1895,6 +1905,10 @@ lolex@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" +lolex@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -1975,6 +1989,10 @@ mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +native-promise-only@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -2135,6 +2153,12 @@ path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +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" + dependencies: + isarray "0.0.1" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -2402,6 +2426,10 @@ samsam@1.1.2, samsam@~1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" +samsam@1.x, samsam@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" + sane@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.5.0.tgz#a4adeae764d048621ecb27d5f9ecf513101939f3" @@ -2447,6 +2475,19 @@ sinon@^1.17.3: samsam "1.1.2" util ">=0.10.3 <1" +sinon@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.3.2.tgz#c43a9c570f32baac1159505cfeed19108855df89" + dependencies: + diff "^3.1.0" + formatio "1.2.0" + lolex "^1.6.0" + native-promise-only "^0.8.1" + path-to-regexp "^1.7.0" + samsam "^1.1.3" + text-encoding "0.6.4" + type-detect "^4.0.0" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -2642,6 +2683,10 @@ test-exclude@^4.0.3: read-pkg-up "^1.0.1" require-main-filename "^1.0.1" +text-encoding@0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" + text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -2698,6 +2743,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-detect@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"