From d95e192cdeb09c133ceba5285ee3b1acb947664e Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Tue, 29 Aug 2017 12:45:29 +0000 Subject: [PATCH 001/128] Add print command --- lib/plugins/Plugins.json | 1 + lib/plugins/print/print.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 lib/plugins/print/print.js diff --git a/lib/plugins/Plugins.json b/lib/plugins/Plugins.json index cc152b356..9034a33d2 100644 --- a/lib/plugins/Plugins.json +++ b/lib/plugins/Plugins.json @@ -12,6 +12,7 @@ "./login/login.js", "./logout/logout.js", "./metrics/metrics.js", + "./print/print.js", "./remove/remove.js", "./rollback/index.js", "./slstats/slstats.js", diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js new file mode 100644 index 000000000..115aec7e3 --- /dev/null +++ b/lib/plugins/print/print.js @@ -0,0 +1,31 @@ +const BbPromise = require('bluebird'); +const getServerlessConfigFile = require('../../utils/getServerlessConfigFile'); +const YAML = require('js-yaml'); + +class Print { + constructor(serverless) { + this.serverless = serverless; + + this.commands = { + print: { + usage: 'Print your compiled and resolved config file', + lifecycleEvents: [ + 'print', + ], + }, + }; + this.hooks = { + 'print:print': () => BbPromise.bind(this) + .then(this.print), + }; + } + + print() { + getServerlessConfigFile(process.cwd()) + .then((data) => this.serverless.variables.populateObject(data)) + .then((data) => console.log(YAML.dump(data))); + + } +} + +module.exports = Print; From 6f256404c561bc1c3850f67d995903947b0a5702 Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Tue, 29 Aug 2017 13:01:04 +0000 Subject: [PATCH 002/128] Fix lint issues --- lib/plugins/print/print.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js index 115aec7e3..0b9c3a1f9 100644 --- a/lib/plugins/print/print.js +++ b/lib/plugins/print/print.js @@ -23,8 +23,7 @@ class Print { print() { getServerlessConfigFile(process.cwd()) .then((data) => this.serverless.variables.populateObject(data)) - .then((data) => console.log(YAML.dump(data))); - + .then((data) => this.serverless.cli.consoleLog(YAML.dump(data))); } } From abe818f5c310476a71e966d4aede3dbfdb7e4357 Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Thu, 31 Aug 2017 13:15:15 +0000 Subject: [PATCH 003/128] Set options before populating config object --- lib/plugins/print/print.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js index 0b9c3a1f9..bfcbabe14 100644 --- a/lib/plugins/print/print.js +++ b/lib/plugins/print/print.js @@ -21,6 +21,7 @@ class Print { } print() { + this.serverless.variables.options = this.serverless.processedInput.options; getServerlessConfigFile(process.cwd()) .then((data) => this.serverless.variables.populateObject(data)) .then((data) => this.serverless.cli.consoleLog(YAML.dump(data))); From ba2728fbd1fb0fcd3a450da36db9b7dd31790ecf Mon Sep 17 00:00:00 2001 From: "Eslam A. Hefnawy" Date: Fri, 1 Sep 2017 21:45:45 +0700 Subject: [PATCH 004/128] added use strict to print plugin --- lib/plugins/print/print.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js index bfcbabe14..70e60af5f 100644 --- a/lib/plugins/print/print.js +++ b/lib/plugins/print/print.js @@ -1,3 +1,5 @@ +'use strict'; + const BbPromise = require('bluebird'); const getServerlessConfigFile = require('../../utils/getServerlessConfigFile'); const YAML = require('js-yaml'); From ee958d891caac71738ddd5c19a04c1549500b1e6 Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Fri, 1 Sep 2017 20:35:33 +0000 Subject: [PATCH 005/128] Add test for print --- lib/plugins/print/print.test.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 lib/plugins/print/print.test.js diff --git a/lib/plugins/print/print.test.js b/lib/plugins/print/print.test.js new file mode 100644 index 000000000..4012bc791 --- /dev/null +++ b/lib/plugins/print/print.test.js @@ -0,0 +1,19 @@ +'use strict'; + +const expect = require('chai').expect; +const Print = require('./print'); +const Serverless = require('../../Serverless'); + +describe('Print', () => { + let print; + let serverless; + + beforeEach(() => { + serverless = new Serverless(); + print = new Print(serverless); + }); + + describe('#constructor()', () => { + it('should have commands', () => expect(print.commands).to.be.not.empty); + }); +}); From 9139d63eb562c7dd44ff0486756e3013ccfd012c Mon Sep 17 00:00:00 2001 From: horike37 Date: Sat, 9 Sep 2017 18:03:58 +0900 Subject: [PATCH 006/128] add alexaSmartHome event --- lib/plugins/Plugins.json | 1 + lib/plugins/aws/lib/naming.js | 4 + lib/plugins/aws/lib/naming.test.js | 8 + .../compile/events/alexaSmartHome/index.js | 87 +++++++ .../events/alexaSmartHome/index.test.js | 221 ++++++++++++++++++ 5 files changed, 321 insertions(+) create mode 100644 lib/plugins/aws/package/compile/events/alexaSmartHome/index.js create mode 100644 lib/plugins/aws/package/compile/events/alexaSmartHome/index.test.js diff --git a/lib/plugins/Plugins.json b/lib/plugins/Plugins.json index e6cd67bdb..6da852b0c 100644 --- a/lib/plugins/Plugins.json +++ b/lib/plugins/Plugins.json @@ -40,6 +40,7 @@ "./aws/package/compile/events/sns/index.js", "./aws/package/compile/events/stream/index.js", "./aws/package/compile/events/alexaSkill/index.js", + "./aws/package/compile/events/alexaSmartHome/index.js", "./aws/package/compile/events/iot/index.js", "./aws/package/compile/events/cloudWatchEvent/index.js", "./aws/package/compile/events/cloudWatchLog/index.js", diff --git a/lib/plugins/aws/lib/naming.js b/lib/plugins/aws/lib/naming.js index 9fe809d77..f2c81c776 100644 --- a/lib/plugins/aws/lib/naming.js +++ b/lib/plugins/aws/lib/naming.js @@ -285,6 +285,10 @@ module.exports = { getLambdaAlexaSkillPermissionLogicalId(functionName) { return `${this.getNormalizedFunctionName(functionName)}LambdaPermissionAlexaSkill`; }, + getLambdaAlexaSmartHomePermissionLogicalId(functionName, alexaSmartHomeIndex) { + return `${this.getNormalizedFunctionName(functionName)}LambdaPermissionAlexaSmartHome${ + alexaSmartHomeIndex}`; + }, getLambdaCloudWatchLogPermissionLogicalId(functionName, logsIndex) { return `${this.getNormalizedFunctionName(functionName) }LambdaPermissionLogsSubscriptionFilterCloudWatchLog${logsIndex}`; diff --git a/lib/plugins/aws/lib/naming.test.js b/lib/plugins/aws/lib/naming.test.js index d028eb967..1b4ab23b0 100644 --- a/lib/plugins/aws/lib/naming.test.js +++ b/lib/plugins/aws/lib/naming.test.js @@ -469,6 +469,14 @@ describe('#naming()', () => { }); }); + describe('#getLambdaAlexaSmartHomePermissionLogicalId()', () => { + it('should normalize the function name and append the standard suffix', + () => { + expect(sdk.naming.getLambdaAlexaSmartHomePermissionLogicalId('functionName', 0)) + .to.equal('FunctionNameLambdaPermissionAlexaSmartHome0'); + }); + }); + describe('#getLambdaSnsSubscriptionLogicalId()', () => { it('should normalize the function name and append the standard suffix', () => { expect(sdk.naming.getLambdaSnsSubscriptionLogicalId('functionName', 'topicName')) diff --git a/lib/plugins/aws/package/compile/events/alexaSmartHome/index.js b/lib/plugins/aws/package/compile/events/alexaSmartHome/index.js new file mode 100644 index 000000000..d35cd0152 --- /dev/null +++ b/lib/plugins/aws/package/compile/events/alexaSmartHome/index.js @@ -0,0 +1,87 @@ +'use strict'; + +const _ = require('lodash'); + +class AwsCompileAlexaSmartHomeEvents { + constructor(serverless) { + this.serverless = serverless; + this.provider = this.serverless.getProvider('aws'); + + this.hooks = { + 'package:compileEvents': this.compileAlexaSmartHomeEvents.bind(this), + }; + } + + compileAlexaSmartHomeEvents() { + this.serverless.service.getAllFunctions().forEach((functionName) => { + const functionObj = this.serverless.service.getFunction(functionName); + let alexaSmartHomeNumberInFunction = 0; + + if (functionObj.events) { + functionObj.events.forEach(event => { + if (event.alexaSmartHome) { + alexaSmartHomeNumberInFunction++; + let EventSourceToken; + let Action; + + if (typeof event.alexaSmartHome === 'object') { + if (!event.alexaSmartHome.appId) { + const errorMessage = [ + `Missing "appId" property for alexaSmartHome event in function ${functionName}`, + ' The correct syntax is: appId: amzn1.ask.skill.xxxx-xxxx', + ' OR an object with "appId" property.', + ' Please check the docs for more info.', + ].join(''); + throw new this.serverless.classes + .Error(errorMessage); + } + EventSourceToken = event.alexaSmartHome.appId; + Action = event.alexaSmartHome.enabled !== false ? + 'lambda:InvokeFunction' : 'lambda:DisableInvokeFunction'; + } else if (typeof event.alexaSmartHome === 'string') { + EventSourceToken = event.alexaSmartHome; + Action = 'lambda:InvokeFunction'; + } else { + const errorMessage = [ + `Alexa Smart Home event of function "${functionName}" is not an object or string.`, + ' The correct syntax is: alexaSmartHome.', + ' Please check the docs for more info.', + ].join(''); + throw new this.serverless.classes.Error(errorMessage); + } + const lambdaLogicalId = this.provider.naming + .getLambdaLogicalId(functionName); + + const permissionTemplate = { + Type: 'AWS::Lambda::Permission', + Properties: { + FunctionName: { + 'Fn::GetAtt': [ + lambdaLogicalId, + 'Arn', + ], + }, + Action: Action.replace(/\\n|\\r/g, ''), + Principal: 'alexa-connectedhome.amazon.com', + EventSourceToken: EventSourceToken.replace(/\\n|\\r/g, ''), + }, + }; + + const lambdaPermissionLogicalId = this.provider.naming + .getLambdaAlexaSmartHomePermissionLogicalId(functionName, + alexaSmartHomeNumberInFunction); + + const permissionCloudForamtionResource = { + [lambdaPermissionLogicalId]: permissionTemplate, + }; + + _.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, + permissionCloudForamtionResource); + } + }); + } + }); + } +} + +module.exports = AwsCompileAlexaSmartHomeEvents; diff --git a/lib/plugins/aws/package/compile/events/alexaSmartHome/index.test.js b/lib/plugins/aws/package/compile/events/alexaSmartHome/index.test.js new file mode 100644 index 000000000..0bc1a2adb --- /dev/null +++ b/lib/plugins/aws/package/compile/events/alexaSmartHome/index.test.js @@ -0,0 +1,221 @@ +'use strict'; + +const expect = require('chai').expect; +const AwsProvider = require('../../../../provider/awsProvider'); +const AwsCompileAlexaSmartHomeEvents = require('./index'); +const Serverless = require('../../../../../../Serverless'); + +describe('awsCompileAlexaSmartHomeEvents', () => { + let serverless; + let awsCompileAlexaSmartHomeEvents; + + beforeEach(() => { + serverless = new Serverless(); + serverless.service.provider.compiledCloudFormationTemplate = { Resources: {} }; + serverless.setProvider('aws', new AwsProvider(serverless)); + awsCompileAlexaSmartHomeEvents = new AwsCompileAlexaSmartHomeEvents(serverless); + awsCompileAlexaSmartHomeEvents.serverless.service.service = 'new-service'; + }); + + describe('#constructor()', () => { + it('should set the provider variable to an instance of AwsProvider', () => + expect(awsCompileAlexaSmartHomeEvents.provider).to.be.instanceof(AwsProvider)); + }); + + describe('#compileAlexaSmartHomeEvents()', () => { + it('should throw an error if alexaSmartHome event type is not a string or an object', () => { + awsCompileAlexaSmartHomeEvents.serverless.service.functions = { + first: { + events: [ + { + alexaSmartHome: 42, + }, + ], + }, + }; + + expect(() => awsCompileAlexaSmartHomeEvents.compileAlexaSmartHomeEvents()).to.throw(Error); + }); + + it('should throw an error if the "appId" property is not given', () => { + awsCompileAlexaSmartHomeEvents.serverless.service.functions = { + first: { + events: [ + { + alexaSmartHome: { + appId: null, + }, + }, + ], + }, + }; + + expect(() => awsCompileAlexaSmartHomeEvents.compileAlexaSmartHomeEvents()).to.throw(Error); + }); + + it('should create corresponding resources when alexaSmartHome events are given', () => { + awsCompileAlexaSmartHomeEvents.serverless.service.functions = { + first: { + events: [ + { + alexaSmartHome: { + appId: 'amzn1.ask.skill.xx-xx-xx-xx', + enabled: false, + }, + }, + { + alexaSmartHome: { + appId: 'amzn1.ask.skill.yy-yy-yy-yy', + enabled: true, + }, + }, + { + alexaSmartHome: 'amzn1.ask.skill.zz-zz-zz-zz', + }, + ], + }, + }; + + awsCompileAlexaSmartHomeEvents.compileAlexaSmartHomeEvents(); + + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome1.Type + ).to.equal('AWS::Lambda::Permission'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome2.Type + ).to.equal('AWS::Lambda::Permission'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome3.Type + ).to.equal('AWS::Lambda::Permission'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome1.Properties.FunctionName + ).to.deep.equal({ 'Fn::GetAtt': ['FirstLambdaFunction', 'Arn'] }); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome2.Properties.FunctionName + ).to.deep.equal({ 'Fn::GetAtt': ['FirstLambdaFunction', 'Arn'] }); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome3.Properties.FunctionName + ).to.deep.equal({ 'Fn::GetAtt': ['FirstLambdaFunction', 'Arn'] }); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome1.Properties.Action + ).to.equal('lambda:DisableInvokeFunction'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome2.Properties.Action + ).to.equal('lambda:InvokeFunction'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome3.Properties.Action + ).to.equal('lambda:InvokeFunction'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome1.Properties.Principal + ).to.equal('alexa-connectedhome.amazon.com'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome2.Properties.Principal + ).to.equal('alexa-connectedhome.amazon.com'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome3.Properties.Principal + ).to.equal('alexa-connectedhome.amazon.com'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome1.Properties.EventSourceToken + ).to.equal('amzn1.ask.skill.xx-xx-xx-xx'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome2.Properties.EventSourceToken + ).to.equal('amzn1.ask.skill.yy-yy-yy-yy'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome3.Properties.EventSourceToken + ).to.equal('amzn1.ask.skill.zz-zz-zz-zz'); + }); + + it('should respect enabled variable, defaulting to true', () => { + awsCompileAlexaSmartHomeEvents.serverless.service.functions = { + first: { + events: [ + { + alexaSmartHome: { + appId: 'amzn1.ask.skill.xx-xx-xx-xx', + enabled: false, + }, + }, + { + alexaSmartHome: { + appId: 'amzn1.ask.skill.yy-yy-yy-yy', + enabled: true, + }, + }, + { + alexaSmartHome: { + appId: 'amzn1.ask.skill.jj-jj-jj-jj', + }, + }, + { + alexaSmartHome: 'amzn1.ask.skill.zz-zz-zz-zz', + }, + ], + }, + }; + + awsCompileAlexaSmartHomeEvents.compileAlexaSmartHomeEvents(); + + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome1.Properties.Action + ).to.equal('lambda:DisableInvokeFunction'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome2.Properties.Action + ).to.equal('lambda:InvokeFunction'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome3.Properties.Action + ).to.equal('lambda:InvokeFunction'); + expect(awsCompileAlexaSmartHomeEvents.serverless.service + .provider.compiledCloudFormationTemplate.Resources + .FirstLambdaPermissionAlexaSmartHome4.Properties.Action + ).to.equal('lambda:InvokeFunction'); + }); + + it('should not create corresponding resources when alexaSmartHome events are not given', () => { + awsCompileAlexaSmartHomeEvents.serverless.service.functions = { + first: { + events: [ + 'alexaSkill', + ], + }, + }; + + awsCompileAlexaSmartHomeEvents.compileAlexaSmartHomeEvents(); + + expect( + awsCompileAlexaSmartHomeEvents.serverless.service.provider.compiledCloudFormationTemplate + .Resources + ).to.deep.equal({}); + }); + + it('should not create corresponding resources when events are not given', () => { + awsCompileAlexaSmartHomeEvents.serverless.service.functions = { + first: {}, + }; + + awsCompileAlexaSmartHomeEvents.compileAlexaSmartHomeEvents(); + + expect( + awsCompileAlexaSmartHomeEvents.serverless.service.provider.compiledCloudFormationTemplate + .Resources + ).to.deep.equal({}); + }); + }); +}); From 6d14f36ea1c3fa2c140a23610d30b6f27b274b5d Mon Sep 17 00:00:00 2001 From: horike37 Date: Sat, 9 Sep 2017 18:48:01 +0900 Subject: [PATCH 007/128] add docs for alexaSmartHome event --- docs/providers/aws/README.md | 1 + docs/providers/aws/events/alexa-smart-home.md | 43 +++++++++++++++++++ docs/providers/aws/guide/resources.md | 2 +- docs/providers/aws/guide/serverless.yml.md | 3 ++ .../templates/aws-csharp/serverless.yml | 1 + .../templates/aws-fsharp/serverless.yml | 1 + .../aws-groovy-gradle/serverless.yml | 1 + .../templates/aws-java-gradle/serverless.yml | 1 + .../templates/aws-java-maven/serverless.yml | 1 + .../aws-kotlin-jvm-maven/serverless.yml | 1 + .../templates/aws-nodejs/serverless.yml | 1 + .../templates/aws-python/serverless.yml | 1 + .../templates/aws-python3/serverless.yml | 1 + .../templates/aws-scala-sbt/serverless.yml | 1 + 14 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 docs/providers/aws/events/alexa-smart-home.md diff --git a/docs/providers/aws/README.md b/docs/providers/aws/README.md index 3ae4e335b..39b147a14 100644 --- a/docs/providers/aws/README.md +++ b/docs/providers/aws/README.md @@ -91,6 +91,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
  • Schedule
  • SNS
  • Alexa Skill
  • +
  • Alexa Smart Home
  • IoT
  • CloudWatch Event
  • CloudWatch Log
  • diff --git a/docs/providers/aws/events/alexa-smart-home.md b/docs/providers/aws/events/alexa-smart-home.md new file mode 100644 index 000000000..640ca0bf7 --- /dev/null +++ b/docs/providers/aws/events/alexa-smart-home.md @@ -0,0 +1,43 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/aws/events/alexa-smart-home) + + +# Alexa Skill + +## Event definition + +This will enable your Lambda function to be called by an Alexa Smart Home Skill. +`amzn1.ask.skill.xx-xx-xx-xx` is an application ID for Alexa Smart Home. You need to sign up [Amazon Developer Console](https://developer.amazon.com/) and get your application ID. + +```yml +functions: + mySkill: + handler: mySkill.handler + events: + - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx +``` + +## Enabling / Disabling + +**Note:** `alexaSmartHome` events are enabled by default. + +This will create and attach a alexaSmartHome event for the `mySkill` function which is disabled. If enabled it will call +the `mySkill` function by an Alexa Smart Home Skill. + +```yaml +functions: + mySkill: + handler: mySkill.handler + events: + - alexaSmartHome: + appId: amzn1.ask.skill.xx-xx-xx-xx + enabled: false +``` diff --git a/docs/providers/aws/guide/resources.md b/docs/providers/aws/guide/resources.md index cbddc1290..7eef1329e 100644 --- a/docs/providers/aws/guide/resources.md +++ b/docs/providers/aws/guide/resources.md @@ -70,7 +70,7 @@ We're also using the term `normalizedName` or similar terms in this guide. This |Lambda::Function | {normalizedFunctionName}LambdaFunction | HelloLambdaFunction | |Lambda::Version | {normalizedFunctionName}LambdaVersion{sha256} | HelloLambdaVersionr3pgoTvv1xT4E4NiCL6JG02fl6vIyi7OS1aW0FwAI | |Logs::LogGroup | {normalizedFunctionName}LogGroup | HelloLogGroup | -|Lambda::Permission |
    • **Schedule**: {normalizedFunctionName}LambdaPermissionEventsRuleSchedule{index}
    • **CloudWatch Event**: {normalizedFunctionName}LambdaPermissionEventsRuleCloudWatchEvent{index}
    • **CloudWatch Log**: {normalizedFunctionName}LambdaPermissionLogsSubscriptionFilterCloudWatchLog{index}
    • **IoT**: {normalizedFunctionName}LambdaPermissionIotTopicRule{index}
    • **S3**: {normalizedFunctionName}LambdaPermission{normalizedBucketName}S3
    • **APIG**: {normalizedFunctionName}LambdaPermissionApiGateway
    • **SNS**: {normalizedFunctionName}LambdaPermission{normalizedTopicName}SNS
    • **Alexa Skill**: {normalizedFunctionName}LambdaPermissionAlexaSkill
    • **Cognito User Pool Trigger Source**: {normalizedFunctionName}LambdaPermissionCognitoUserPool{normalizedPoolId}TriggerSource{triggerSource}
    |
    • **Schedule**: HelloLambdaPermissionEventsRuleSchedule1
    • **CloudWatch Event**: HelloLambdaPermissionEventsRuleCloudWatchEvent1
    • **CloudWatch Log**: HelloLambdaPermissionLogsSubscriptionFilterCloudWatchLog1
    • **IoT**: HelloLambdaPermissionIotTopicRule1
    • **S3**: HelloLambdaPermissionBucketS3
    • **APIG**: HelloLambdaPermissionApiGateway
    • **SNS**: HelloLambdaPermissionTopicSNS
    • **Alexa Skill**: HelloLambdaPermissionAlexaSkill
    • **Cognito User Pool Trigger Source**: HelloLambdaPermissionCognitoUserPoolMyPoolTriggerSourceCustomMessage
    | +|Lambda::Permission |
    • **Schedule**: {normalizedFunctionName}LambdaPermissionEventsRuleSchedule{index}
    • **CloudWatch Event**: {normalizedFunctionName}LambdaPermissionEventsRuleCloudWatchEvent{index}
    • **CloudWatch Log**: {normalizedFunctionName}LambdaPermissionLogsSubscriptionFilterCloudWatchLog{index}
    • **IoT**: {normalizedFunctionName}LambdaPermissionIotTopicRule{index}
    • **S3**: {normalizedFunctionName}LambdaPermission{normalizedBucketName}S3
    • **APIG**: {normalizedFunctionName}LambdaPermissionApiGateway
    • **SNS**: {normalizedFunctionName}LambdaPermission{normalizedTopicName}SNS
    • **Alexa Skill**: {normalizedFunctionName}LambdaPermissionAlexaSkill
    • **Alexa Smart Home**: {normalizedFunctionName}LambdaPermissionAlexaSmartHome{index}
    • **Cognito User Pool Trigger Source**: {normalizedFunctionName}LambdaPermissionCognitoUserPool{normalizedPoolId}TriggerSource{triggerSource}
    |
    • **Schedule**: HelloLambdaPermissionEventsRuleSchedule1
    • **CloudWatch Event**: HelloLambdaPermissionEventsRuleCloudWatchEvent1
    • **CloudWatch Log**: HelloLambdaPermissionLogsSubscriptionFilterCloudWatchLog1
    • **IoT**: HelloLambdaPermissionIotTopicRule1
    • **S3**: HelloLambdaPermissionBucketS3
    • **APIG**: HelloLambdaPermissionApiGateway
    • **SNS**: HelloLambdaPermissionTopicSNS
    • **Alexa Skill**: HelloLambdaPermissionAlexaSkill
    • **Cognito User Pool Trigger Source**: HelloLambdaPermissionCognitoUserPoolMyPoolTriggerSourceCustomMessage
    | |Events::Rule |
    • **Schedule**: {normalizedFuntionName}EventsRuleSchedule{SequentialID}
    • **CloudWatch Event**: {normalizedFuntionName}EventsRuleCloudWatchEvent{SequentialID}
    |
    • **Schedule**: HelloEventsRuleSchedule1
    • **CloudWatch Event**: HelloEventsRuleCloudWatchEvent1
    | |AWS::Logs::SubscriptionFilter | {normalizedFuntionName}LogsSubscriptionFilterCloudWatchLog{SequentialID} | HelloLogsSubscriptionFilterCloudWatchLog1 | |AWS::IoT::TopicRule | {normalizedFuntionName}IotTopicRule{SequentialID} | HelloIotTopicRule1 | diff --git a/docs/providers/aws/guide/serverless.yml.md b/docs/providers/aws/guide/serverless.yml.md index 6a3f01540..282228217 100644 --- a/docs/providers/aws/guide/serverless.yml.md +++ b/docs/providers/aws/guide/serverless.yml.md @@ -150,6 +150,9 @@ functions: startingPosition: LATEST enabled: false - alexaSkill + - alexaSmartHome: + appId: amzn1.ask.skill.xx-xx-xx-xx + enabled: true - iot: name: myIoTEvent description: An IoT event diff --git a/lib/plugins/create/templates/aws-csharp/serverless.yml b/lib/plugins/create/templates/aws-csharp/serverless.yml index 1498ed2a5..fb55c7aac 100644 --- a/lib/plugins/create/templates/aws-csharp/serverless.yml +++ b/lib/plugins/create/templates/aws-csharp/serverless.yml @@ -68,6 +68,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: diff --git a/lib/plugins/create/templates/aws-fsharp/serverless.yml b/lib/plugins/create/templates/aws-fsharp/serverless.yml index 314962e28..21dd15dd3 100644 --- a/lib/plugins/create/templates/aws-fsharp/serverless.yml +++ b/lib/plugins/create/templates/aws-fsharp/serverless.yml @@ -68,6 +68,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: diff --git a/lib/plugins/create/templates/aws-groovy-gradle/serverless.yml b/lib/plugins/create/templates/aws-groovy-gradle/serverless.yml index 9ef210f6b..a1adaaf4d 100644 --- a/lib/plugins/create/templates/aws-groovy-gradle/serverless.yml +++ b/lib/plugins/create/templates/aws-groovy-gradle/serverless.yml @@ -65,6 +65,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: diff --git a/lib/plugins/create/templates/aws-java-gradle/serverless.yml b/lib/plugins/create/templates/aws-java-gradle/serverless.yml index d421ab1d5..e8811732e 100644 --- a/lib/plugins/create/templates/aws-java-gradle/serverless.yml +++ b/lib/plugins/create/templates/aws-java-gradle/serverless.yml @@ -65,6 +65,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: diff --git a/lib/plugins/create/templates/aws-java-maven/serverless.yml b/lib/plugins/create/templates/aws-java-maven/serverless.yml index d6fe45620..106bab8aa 100644 --- a/lib/plugins/create/templates/aws-java-maven/serverless.yml +++ b/lib/plugins/create/templates/aws-java-maven/serverless.yml @@ -65,6 +65,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: diff --git a/lib/plugins/create/templates/aws-kotlin-jvm-maven/serverless.yml b/lib/plugins/create/templates/aws-kotlin-jvm-maven/serverless.yml index 3659a390d..cb892140f 100644 --- a/lib/plugins/create/templates/aws-kotlin-jvm-maven/serverless.yml +++ b/lib/plugins/create/templates/aws-kotlin-jvm-maven/serverless.yml @@ -65,6 +65,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: diff --git a/lib/plugins/create/templates/aws-nodejs/serverless.yml b/lib/plugins/create/templates/aws-nodejs/serverless.yml index 059b386d4..1cce386a1 100644 --- a/lib/plugins/create/templates/aws-nodejs/serverless.yml +++ b/lib/plugins/create/templates/aws-nodejs/serverless.yml @@ -70,6 +70,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: diff --git a/lib/plugins/create/templates/aws-python/serverless.yml b/lib/plugins/create/templates/aws-python/serverless.yml index 110ae584f..f651608e0 100644 --- a/lib/plugins/create/templates/aws-python/serverless.yml +++ b/lib/plugins/create/templates/aws-python/serverless.yml @@ -70,6 +70,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: diff --git a/lib/plugins/create/templates/aws-python3/serverless.yml b/lib/plugins/create/templates/aws-python3/serverless.yml index 73cce39e6..1d69fcb9d 100644 --- a/lib/plugins/create/templates/aws-python3/serverless.yml +++ b/lib/plugins/create/templates/aws-python3/serverless.yml @@ -70,6 +70,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: diff --git a/lib/plugins/create/templates/aws-scala-sbt/serverless.yml b/lib/plugins/create/templates/aws-scala-sbt/serverless.yml index c7ce81f69..7eb89a39d 100644 --- a/lib/plugins/create/templates/aws-scala-sbt/serverless.yml +++ b/lib/plugins/create/templates/aws-scala-sbt/serverless.yml @@ -67,6 +67,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: From d4a627388872d78b2a27286d4021097fb4b7c94d Mon Sep 17 00:00:00 2001 From: horike37 Date: Sat, 9 Sep 2017 19:02:46 +0900 Subject: [PATCH 008/128] minor tweak --- docs/providers/aws/events/alexa-smart-home.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers/aws/events/alexa-smart-home.md b/docs/providers/aws/events/alexa-smart-home.md index 640ca0bf7..acefe13d2 100644 --- a/docs/providers/aws/events/alexa-smart-home.md +++ b/docs/providers/aws/events/alexa-smart-home.md @@ -10,7 +10,7 @@ layout: Doc ### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/aws/events/alexa-smart-home) -# Alexa Skill +# Alexa Smart Home ## Event definition From ad6d14bd4d025ce59e0b60a78dec38a9a821042d Mon Sep 17 00:00:00 2001 From: horike37 Date: Tue, 19 Sep 2017 22:01:17 +0900 Subject: [PATCH 009/128] minor tweaks --- docs/providers/aws/events/alexa-smart-home.md | 5 ++++- docs/providers/aws/guide/resources.md | 2 +- .../aws/package/compile/events/alexaSmartHome/index.js | 4 ++-- .../aws/package/compile/events/alexaSmartHome/index.test.js | 2 +- .../create/templates/aws-kotlin-nodejs-gradle/serverless.yml | 3 ++- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/providers/aws/events/alexa-smart-home.md b/docs/providers/aws/events/alexa-smart-home.md index acefe13d2..f6557597f 100644 --- a/docs/providers/aws/events/alexa-smart-home.md +++ b/docs/providers/aws/events/alexa-smart-home.md @@ -15,7 +15,10 @@ layout: Doc ## Event definition This will enable your Lambda function to be called by an Alexa Smart Home Skill. -`amzn1.ask.skill.xx-xx-xx-xx` is an application ID for Alexa Smart Home. You need to sign up [Amazon Developer Console](https://developer.amazon.com/) and get your application ID. +`amzn1.ask.skill.xx-xx-xx-xx` is an application ID for Alexa Smart Home. You need to sign up [Amazon Developer Console](https://developer.amazon.com/) and get your application ID. +After deploying, add your deployed Lambda function ARN to which this event is attached to the Service Endpoint under Configuration on Amazon Developer Console. + +Please see [Steps to Create a Smart Home Skill](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/steps-to-create-a-smart-home-skill) for more info. ```yml functions: diff --git a/docs/providers/aws/guide/resources.md b/docs/providers/aws/guide/resources.md index 7eef1329e..a4077624b 100644 --- a/docs/providers/aws/guide/resources.md +++ b/docs/providers/aws/guide/resources.md @@ -70,7 +70,7 @@ We're also using the term `normalizedName` or similar terms in this guide. This |Lambda::Function | {normalizedFunctionName}LambdaFunction | HelloLambdaFunction | |Lambda::Version | {normalizedFunctionName}LambdaVersion{sha256} | HelloLambdaVersionr3pgoTvv1xT4E4NiCL6JG02fl6vIyi7OS1aW0FwAI | |Logs::LogGroup | {normalizedFunctionName}LogGroup | HelloLogGroup | -|Lambda::Permission |
    • **Schedule**: {normalizedFunctionName}LambdaPermissionEventsRuleSchedule{index}
    • **CloudWatch Event**: {normalizedFunctionName}LambdaPermissionEventsRuleCloudWatchEvent{index}
    • **CloudWatch Log**: {normalizedFunctionName}LambdaPermissionLogsSubscriptionFilterCloudWatchLog{index}
    • **IoT**: {normalizedFunctionName}LambdaPermissionIotTopicRule{index}
    • **S3**: {normalizedFunctionName}LambdaPermission{normalizedBucketName}S3
    • **APIG**: {normalizedFunctionName}LambdaPermissionApiGateway
    • **SNS**: {normalizedFunctionName}LambdaPermission{normalizedTopicName}SNS
    • **Alexa Skill**: {normalizedFunctionName}LambdaPermissionAlexaSkill
    • **Alexa Smart Home**: {normalizedFunctionName}LambdaPermissionAlexaSmartHome{index}
    • **Cognito User Pool Trigger Source**: {normalizedFunctionName}LambdaPermissionCognitoUserPool{normalizedPoolId}TriggerSource{triggerSource}
    |
    • **Schedule**: HelloLambdaPermissionEventsRuleSchedule1
    • **CloudWatch Event**: HelloLambdaPermissionEventsRuleCloudWatchEvent1
    • **CloudWatch Log**: HelloLambdaPermissionLogsSubscriptionFilterCloudWatchLog1
    • **IoT**: HelloLambdaPermissionIotTopicRule1
    • **S3**: HelloLambdaPermissionBucketS3
    • **APIG**: HelloLambdaPermissionApiGateway
    • **SNS**: HelloLambdaPermissionTopicSNS
    • **Alexa Skill**: HelloLambdaPermissionAlexaSkill
    • **Cognito User Pool Trigger Source**: HelloLambdaPermissionCognitoUserPoolMyPoolTriggerSourceCustomMessage
    | +|Lambda::Permission |
    • **Schedule**: {normalizedFunctionName}LambdaPermissionEventsRuleSchedule{index}
    • **CloudWatch Event**: {normalizedFunctionName}LambdaPermissionEventsRuleCloudWatchEvent{index}
    • **CloudWatch Log**: {normalizedFunctionName}LambdaPermissionLogsSubscriptionFilterCloudWatchLog{index}
    • **IoT**: {normalizedFunctionName}LambdaPermissionIotTopicRule{index}
    • **S3**: {normalizedFunctionName}LambdaPermission{normalizedBucketName}S3
    • **APIG**: {normalizedFunctionName}LambdaPermissionApiGateway
    • **SNS**: {normalizedFunctionName}LambdaPermission{normalizedTopicName}SNS
    • **Alexa Skill**: {normalizedFunctionName}LambdaPermissionAlexaSkill
    • **Alexa Smart Home**: {normalizedFunctionName}LambdaPermissionAlexaSmartHome{index}
    • **Cognito User Pool Trigger Source**: {normalizedFunctionName}LambdaPermissionCognitoUserPool{normalizedPoolId}TriggerSource{triggerSource}
    |
    • **Schedule**: HelloLambdaPermissionEventsRuleSchedule1
    • **CloudWatch Event**: HelloLambdaPermissionEventsRuleCloudWatchEvent1
    • **CloudWatch Log**: HelloLambdaPermissionLogsSubscriptionFilterCloudWatchLog1
    • **IoT**: HelloLambdaPermissionIotTopicRule1
    • **S3**: HelloLambdaPermissionBucketS3
    • **APIG**: HelloLambdaPermissionApiGateway
    • **SNS**: HelloLambdaPermissionTopicSNS
    • **Alexa Skill**: HelloLambdaPermissionAlexaSkill
    • **Alexa Smart Home**: HelloLambdaPermissionAlexaSmartHome
    • **Cognito User Pool Trigger Source**: HelloLambdaPermissionCognitoUserPoolMyPoolTriggerSourceCustomMessage
    | |Events::Rule |
    • **Schedule**: {normalizedFuntionName}EventsRuleSchedule{SequentialID}
    • **CloudWatch Event**: {normalizedFuntionName}EventsRuleCloudWatchEvent{SequentialID}
    |
    • **Schedule**: HelloEventsRuleSchedule1
    • **CloudWatch Event**: HelloEventsRuleCloudWatchEvent1
    | |AWS::Logs::SubscriptionFilter | {normalizedFuntionName}LogsSubscriptionFilterCloudWatchLog{SequentialID} | HelloLogsSubscriptionFilterCloudWatchLog1 | |AWS::IoT::TopicRule | {normalizedFuntionName}IotTopicRule{SequentialID} | HelloIotTopicRule1 | diff --git a/lib/plugins/aws/package/compile/events/alexaSmartHome/index.js b/lib/plugins/aws/package/compile/events/alexaSmartHome/index.js index d35cd0152..97d34abf7 100644 --- a/lib/plugins/aws/package/compile/events/alexaSmartHome/index.js +++ b/lib/plugins/aws/package/compile/events/alexaSmartHome/index.js @@ -71,12 +71,12 @@ class AwsCompileAlexaSmartHomeEvents { .getLambdaAlexaSmartHomePermissionLogicalId(functionName, alexaSmartHomeNumberInFunction); - const permissionCloudForamtionResource = { + const permissionCloudFormationResource = { [lambdaPermissionLogicalId]: permissionTemplate, }; _.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, - permissionCloudForamtionResource); + permissionCloudFormationResource); } }); } diff --git a/lib/plugins/aws/package/compile/events/alexaSmartHome/index.test.js b/lib/plugins/aws/package/compile/events/alexaSmartHome/index.test.js index 0bc1a2adb..4c0692846 100644 --- a/lib/plugins/aws/package/compile/events/alexaSmartHome/index.test.js +++ b/lib/plugins/aws/package/compile/events/alexaSmartHome/index.test.js @@ -5,7 +5,7 @@ const AwsProvider = require('../../../../provider/awsProvider'); const AwsCompileAlexaSmartHomeEvents = require('./index'); const Serverless = require('../../../../../../Serverless'); -describe('awsCompileAlexaSmartHomeEvents', () => { +describe('AwsCompileAlexaSmartHomeEvents', () => { let serverless; let awsCompileAlexaSmartHomeEvents; diff --git a/lib/plugins/create/templates/aws-kotlin-nodejs-gradle/serverless.yml b/lib/plugins/create/templates/aws-kotlin-nodejs-gradle/serverless.yml index c590ec2e2..5fd69aab1 100644 --- a/lib/plugins/create/templates/aws-kotlin-nodejs-gradle/serverless.yml +++ b/lib/plugins/create/templates/aws-kotlin-nodejs-gradle/serverless.yml @@ -61,6 +61,7 @@ functions: # - sns: greeter-topic # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 # - alexaSkill +# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx # - iot: # sql: "SELECT * FROM 'some_topic'" # - cloudwatchEvent: @@ -91,4 +92,4 @@ functions: # Outputs: # NewOutput: # Description: "Description for the output" -# Value: "Some output value" \ No newline at end of file +# Value: "Some output value" From c419c5b451bedf48570ddc107d66712ad73b55d9 Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Wed, 20 Sep 2017 18:40:19 +0000 Subject: [PATCH 010/128] Handle user-provided variableSyntax --- lib/plugins/print/print.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js index 70e60af5f..f28c603fc 100644 --- a/lib/plugins/print/print.js +++ b/lib/plugins/print/print.js @@ -24,9 +24,16 @@ class Print { print() { this.serverless.variables.options = this.serverless.processedInput.options; + this.serverless.variables.loadVariableSyntax(); getServerlessConfigFile(process.cwd()) - .then((data) => this.serverless.variables.populateObject(data)) - .then((data) => this.serverless.cli.consoleLog(YAML.dump(data))); + .then((data) => { + const conf = data; + // Need to delete variableSyntax to avoid potential matching errors + if (conf.provider.variableSyntax) { + delete conf.provider.variableSyntax; + } + return this.serverless.variables.populateObject(conf); + }).then((data) => this.serverless.cli.consoleLog(YAML.dump(data))); } } From 38166117dc64d74afb885ce4277e96a7657d78d6 Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Wed, 20 Sep 2017 19:41:03 +0000 Subject: [PATCH 011/128] Add documentation for sls print --- docs/providers/aws/README.md | 1 + docs/providers/aws/cli-reference/print.md | 78 ++++++++++++++++++ docs/providers/aws/cli-reference/slstats.md | 2 +- docs/providers/azure/README.md | 1 + docs/providers/azure/cli-reference/print.md | 69 ++++++++++++++++ docs/providers/google/README.md | 1 + docs/providers/google/cli-reference/print.md | 80 +++++++++++++++++++ docs/providers/openwhisk/README.md | 1 + .../openwhisk/cli-reference/print.md | 70 ++++++++++++++++ .../openwhisk/cli-reference/slstats.md | 2 +- 10 files changed, 303 insertions(+), 2 deletions(-) create mode 100644 docs/providers/aws/cli-reference/print.md create mode 100644 docs/providers/azure/cli-reference/print.md create mode 100644 docs/providers/google/cli-reference/print.md create mode 100644 docs/providers/openwhisk/cli-reference/print.md diff --git a/docs/providers/aws/README.md b/docs/providers/aws/README.md index 3ae4e335b..c798256f6 100644 --- a/docs/providers/aws/README.md +++ b/docs/providers/aws/README.md @@ -72,6 +72,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
  • Plugin Search
  • Plugin Install
  • Plugin Uninstall
  • +
  • Print
  • Serverless Stats
  • diff --git a/docs/providers/aws/cli-reference/print.md b/docs/providers/aws/cli-reference/print.md new file mode 100644 index 000000000..53bcb602f --- /dev/null +++ b/docs/providers/aws/cli-reference/print.md @@ -0,0 +1,78 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/aws/cli-reference/print) + + +# Print + +Print your `serverless.yml` config file with all variables resolved. + +If you're using [Serverless Variables](https://serverless.com/framework/docs/providers/aws/guide/variables/) +in your `serverless.yml`, it can be difficult to know if your syntax is correct +or if the variables are resolving as you expect. + +With this command, it will print the fully-resolved config to your console. + +```bash +serverless print +``` + +## Options + +- None + +## Examples: + +Assuming you have the following config file: + +```yml +service: my-service + +custom: + bucketName: test + +provider: + name: aws + runtime: nodejs6.10 + stage: ${opt:stage, "dev"} + +functions: + hello: + handler: handler.hello + +resources: + Resources: + MyBucket: + Type: AWS::S3::Bucket + Properties: + BucketName: ${self:custom.bucketName} +``` + +Using `sls print` will resolve the variables in `provider.stage` and `BucketName`. + +```bash +$ sls print +service: my-service +custom: + bucketName: test +provider: + name: aws + runtime: nodejs6.10 + stage: dev # <-- Resolved +functions: + hello: + handler: handler.hello +resources: + Resources: + MyBucket: + Type: 'AWS::S3::Bucket' + Properties: + BucketName: test # <-- Resolved +``` diff --git a/docs/providers/aws/cli-reference/slstats.md b/docs/providers/aws/cli-reference/slstats.md index 682765069..c62ac7f89 100644 --- a/docs/providers/aws/cli-reference/slstats.md +++ b/docs/providers/aws/cli-reference/slstats.md @@ -1,7 +1,7 @@ diff --git a/docs/providers/azure/README.md b/docs/providers/azure/README.md index d0f7300f7..e7ad1f63a 100644 --- a/docs/providers/azure/README.md +++ b/docs/providers/azure/README.md @@ -61,6 +61,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
  • Plugin Search
  • Plugin Install
  • Plugin Uninstall
  • +
  • Print
  • diff --git a/docs/providers/azure/cli-reference/print.md b/docs/providers/azure/cli-reference/print.md new file mode 100644 index 000000000..5a4c65077 --- /dev/null +++ b/docs/providers/azure/cli-reference/print.md @@ -0,0 +1,69 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/azure/cli-reference/print) + + +# Print + +Print your `serverless.yml` config file with all variables resolved. + +If you're using [Serverless Variables](https://serverless.com/framework/docs/providers/azure/guide/variables/) +in your `serverless.yml`, it can be difficult to know if your syntax is correct +or if the variables are resolving as you expect. + +With this command, it will print the fully-resolved config to your console. + +```bash +serverless print +``` + +## Options + +- None + +## Examples: + +Assuming you have the following config file: + +```yml +service: new-service +provider: azure +custom: + globalSchedule: cron(0 * * * *) + +functions: + hello: + handler: handler.hello + events: + - timer: ${self:custom.globalSchedule} + world: + handler: handler.world + events: + - timer: ${self:custom.globalSchedule} +``` + +Using `sls print` will resolve the variables in the `timer` blocks. + +```bash +service: new-service +provider: azure +custom: + globalSchedule: cron(0 * * * *) + +functions: + hello: + handler: handler.hello + events: + - timer: cron(0 * * * *) # <-- Resolved + world: + handler: handler.world + events: + - timer: cron(0 * * * *) # <-- Resolved +``` diff --git a/docs/providers/google/README.md b/docs/providers/google/README.md index 5010a5b41..e355f2ec8 100644 --- a/docs/providers/google/README.md +++ b/docs/providers/google/README.md @@ -62,6 +62,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
  • Plugin Search
  • Plugin Install
  • Plugin Uninstall
  • +
  • Print
  • diff --git a/docs/providers/google/cli-reference/print.md b/docs/providers/google/cli-reference/print.md new file mode 100644 index 000000000..c71b0410a --- /dev/null +++ b/docs/providers/google/cli-reference/print.md @@ -0,0 +1,80 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/google/cli-reference/print) + + +# Print + +Print your `serverless.yml` config file with all variables resolved. + +If you're using [Serverless Variables](https://serverless.com/framework/docs/providers/google/guide/variables/) +in your `serverless.yml`, it can be difficult to know if your syntax is correct +or if the variables are resolving as you expect. + +With this command, it will print the fully-resolved config to your console. + +```bash +serverless print +``` + +## Options + +- None + +## Examples: + +Assuming you have the following config file: + +```yml +service: new-service +provider: google + +custom: + resource: projects/*/topics/my-topic + +functions: + first: + handler: firstPubSub + events: + - event: + eventType: providers/cloud.pubsub/eventTypes/topics.publish + resource: ${self:custom.resource} + second: + handler: secondPubSub + events: + - event: + eventType: providers/cloud.pubsub/eventTypes/topics.publish + resource: ${self:custom.resource} +``` + +Using `sls print` will resolve the variables in the `resource` blocks: + +```bash +$ sls print +service: new-service +provider: google + +custom: + resource: projects/*/topics/my-topic + +functions: + first: + handler: firstPubSub + events: + - event: + eventType: providers/cloud.pubsub/eventTypes/topics.publish + resource: projects/*/topics/my-topic # <-- Resolved. + second: + handler: secondPubSub + events: + - event: + eventType: providers/cloud.pubsub/eventTypes/topics.publish + resource: projects/*/topics/my-topic # <-- Resolved. +``` diff --git a/docs/providers/openwhisk/README.md b/docs/providers/openwhisk/README.md index e09360f45..73330b2b5 100644 --- a/docs/providers/openwhisk/README.md +++ b/docs/providers/openwhisk/README.md @@ -67,6 +67,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
  • Plugin Search
  • Plugin Install
  • Plugin Uninstall
  • +
  • Print
  • Serverless Stats
  • diff --git a/docs/providers/openwhisk/cli-reference/print.md b/docs/providers/openwhisk/cli-reference/print.md new file mode 100644 index 000000000..e10ced465 --- /dev/null +++ b/docs/providers/openwhisk/cli-reference/print.md @@ -0,0 +1,70 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/openwhisk/cli-reference/print) + + +# Print + +Print your `serverless.yml` config file with all variables resolved. + +If you're using [Serverless Variables](https://serverless.com/framework/docs/providers/openwhisk/guide/variables/) +in your `serverless.yml`, it can be difficult to know if your syntax is correct +or if the variables are resolving as you expect. + +With this command, it will print the fully-resolved config to your console. + +```bash +serverless print +``` + +## Options + +- None + +## Examples: + +Assuming you have the following config file: + +```yml +service: new-service +provider: openwhisk +custom: + globalSchedule: cron(0 * * * *) + +functions: + hello: + handler: handler.hello + events: + - schedule: ${self:custom.globalSchedule} + world: + handler: handler.world + events: + - schedule: ${self:custom.globalSchedule} +``` + +Using `sls print` will resolve the variables in the `schedule` blocks. + +```bash +$ sls print +service: new-service +provider: openwhisk +custom: + globalSchedule: cron(0 * * * *) + +functions: + hello: + handler: handler.hello + events: + - schedule: cron(0 * * * *) # <-- Resolved + world: + handler: handler.world + events: + - schedule: cron(0 * * * *) # <-- Resolved +``` diff --git a/docs/providers/openwhisk/cli-reference/slstats.md b/docs/providers/openwhisk/cli-reference/slstats.md index 78de33a6d..e07997b14 100644 --- a/docs/providers/openwhisk/cli-reference/slstats.md +++ b/docs/providers/openwhisk/cli-reference/slstats.md @@ -1,7 +1,7 @@ From 3a6b33c63c8133c7e455a875079b6316a5cc83cf Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 21 Sep 2017 14:55:11 +0200 Subject: [PATCH 012/128] Run deploy:list if timestamp is not specified --- lib/plugins/aws/rollback/index.js | 19 +++++++++++++++---- lib/plugins/rollback/index.js | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/plugins/aws/rollback/index.js b/lib/plugins/aws/rollback/index.js index 9df1c17d0..8dac166f4 100644 --- a/lib/plugins/aws/rollback/index.js +++ b/lib/plugins/aws/rollback/index.js @@ -25,10 +25,21 @@ class AwsRollback { this.hooks = { 'before:rollback:initialize': () => BbPromise.bind(this) .then(this.validate), - 'rollback:rollback': () => BbPromise.bind(this) - .then(this.setBucketName) - .then(this.setStackToUpdate) - .then(this.updateStack), + 'rollback:rollback': () => { + if (!this.options.timestamp) { + const command = this.serverless.pluginManager.spawn('deploy:list'); + this.serverless.cli.log([ + 'Use a timestamp from the deploy list below to rollback to a specific version', + 'run `sls rollback -t YourTimeStampHere`', + ].join('\n')); + return command; + } + + return BbPromise.bind(this) + .then(this.setBucketName) + .then(this.setStackToUpdate) + .then(this.updateStack); + }, }; } diff --git a/lib/plugins/rollback/index.js b/lib/plugins/rollback/index.js index d7e4a52ad..68713727a 100644 --- a/lib/plugins/rollback/index.js +++ b/lib/plugins/rollback/index.js @@ -18,7 +18,7 @@ class Rollback { timestamp: { usage: 'Timestamp of the deployment (list deployments with `serverless deploy list`)', shortcut: 't', - required: true, + required: false, }, verbose: { usage: 'Show all stack events during deployment', From 3301d37244aefc64ea5e3e4ca93a47a1f8de5aa8 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 21 Sep 2017 14:58:08 +0200 Subject: [PATCH 013/128] Change wording --- lib/plugins/aws/rollback/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/plugins/aws/rollback/index.js b/lib/plugins/aws/rollback/index.js index 8dac166f4..037fa0bd0 100644 --- a/lib/plugins/aws/rollback/index.js +++ b/lib/plugins/aws/rollback/index.js @@ -29,8 +29,8 @@ class AwsRollback { if (!this.options.timestamp) { const command = this.serverless.pluginManager.spawn('deploy:list'); this.serverless.cli.log([ - 'Use a timestamp from the deploy list below to rollback to a specific version', - 'run `sls rollback -t YourTimeStampHere`', + 'Use a timestamp from the deploy list below to rollback to a specific version.', + 'Run `sls rollback -t YourTimeStampHere`', ].join('\n')); return command; } From 7a2c338e6f60cb128a4fd73b199be7a69bd877a5 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 21 Sep 2017 15:18:21 +0200 Subject: [PATCH 014/128] Fix failing test --- lib/plugins/rollback/index.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/plugins/rollback/index.test.js b/lib/plugins/rollback/index.test.js index 1ff84bb47..d5653a846 100644 --- a/lib/plugins/rollback/index.test.js +++ b/lib/plugins/rollback/index.test.js @@ -27,9 +27,9 @@ describe('Rollback', () => { ]); }); - it('should have a required option timestamp', () => { + it('should not have a required option timestamp', () => { // eslint-disable-next-line no-unused-expressions - expect(rollback.commands.rollback.options.timestamp.required).to.be.true; + expect(rollback.commands.rollback.options.timestamp.required).to.be.false; }); }); From 0350bbeadc057d1e5f77afecd6fef1747858ac75 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 21 Sep 2017 15:33:27 +0200 Subject: [PATCH 015/128] Add test case --- lib/plugins/aws/rollback/index.test.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/plugins/aws/rollback/index.test.js b/lib/plugins/aws/rollback/index.test.js index fcb25375c..e0e22e9dc 100644 --- a/lib/plugins/aws/rollback/index.test.js +++ b/lib/plugins/aws/rollback/index.test.js @@ -10,9 +10,11 @@ const sinon = require('sinon'); describe('AwsRollback', () => { let awsRollback; let s3Key; + let spawnStub; + let serverless; beforeEach(() => { - const serverless = new Serverless(); + serverless = new Serverless(); const options = { stage: 'dev', region: 'us-east-1', @@ -20,11 +22,16 @@ describe('AwsRollback', () => { }; serverless.setProvider('aws', new AwsProvider(serverless)); serverless.service.service = 'rollback'; + spawnStub = sinon.stub(serverless.pluginManager, 'spawn'); awsRollback = new AwsRollback(serverless, options); awsRollback.serverless.cli = new serverless.classes.CLI(); s3Key = `serverless/${serverless.service.service}/${options.stage}`; }); + afterEach(() => { + serverless.pluginManager.spawn.restore(); + }); + describe('#constructor()', () => { it('should have hooks', () => expect(awsRollback.hooks).to.be.not.empty); @@ -58,6 +65,15 @@ describe('AwsRollback', () => { .to.be.equal(true); }); }); + + it('should run "deploy:list" if timestamp is not specified', () => { + const spawnDeployListStub = spawnStub.withArgs('deploy:list').resolves(); + awsRollback.options.timestamp = undefined; + + return awsRollback.hooks['rollback:rollback']().then(() => { + expect(spawnDeployListStub.calledOnce).to.be.equal(true); + }); + }); }); describe('#setStackToUpdate()', () => { From 5cead0204d1a72bfdf7636e75b8bba0f0bbb6d2e Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 21 Sep 2017 15:38:08 +0200 Subject: [PATCH 016/128] Add documentation note --- docs/providers/aws/cli-reference/rollback.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/providers/aws/cli-reference/rollback.md b/docs/providers/aws/cli-reference/rollback.md index 3839566d4..de4a88eec 100644 --- a/docs/providers/aws/cli-reference/rollback.md +++ b/docs/providers/aws/cli-reference/rollback.md @@ -19,6 +19,8 @@ Rollback the Serverless service to a specific deployment. serverless rollback --timestamp timestamp ``` +If `timestamp` is not specified, Framework will show your existing deployments. + ## Options - `--timestamp` or `-t` The deployment you want to rollback to. - `--verbose` or `-v` Shows any Stack Output. From e4be10f48f7712a3716ce049c2c942709d71019e Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Thu, 21 Sep 2017 15:29:14 +0000 Subject: [PATCH 017/128] Begin better tests for print command --- lib/plugins/print/print.test.js | 38 +++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/plugins/print/print.test.js b/lib/plugins/print/print.test.js index 4012bc791..63faf4482 100644 --- a/lib/plugins/print/print.test.js +++ b/lib/plugins/print/print.test.js @@ -1,19 +1,53 @@ 'use strict'; const expect = require('chai').expect; -const Print = require('./print'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire'); const Serverless = require('../../Serverless'); +const CLI = require('../../classes/CLI'); + describe('Print', () => { let print; let serverless; + let getServerlessConfigFileStub; + let consoleLogStub; beforeEach(() => { + getServerlessConfigFileStub = sinon.stub(); + const printPlugin = proxyquire('./print.js', { + '../../utils/getServerlessConfigFile': getServerlessConfigFileStub, + }); serverless = new Serverless(); - print = new Print(serverless); + serverless.processedInput = { + commands: [ 'print' ], + options: { stage: undefined, region: undefined } + } + serverless.cli = new CLI(serverless); + print = new printPlugin(serverless); + consoleLogStub = sinon.stub(serverless.cli, 'consoleLog').returns(true); }); + afterEach(() => { + serverless.cli.consoleLog.restore(); + }) + describe('#constructor()', () => { it('should have commands', () => expect(print.commands).to.be.not.empty); }); + + it('should print standard config', () => { + getServerlessConfigFileStub.resolves({ + service: 'my-service', + provider: { + name: 'aws' + } + }) + + print.print(); + + expect(getServerlessConfigFileStub.calledOnce).to.equal(true); + expect(consoleLogStub.called).to.equal(true); + }); + }); From 7045e0db2d09488fb43b2c03ac0c6045082a9a59 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 21 Sep 2017 18:41:35 +0200 Subject: [PATCH 018/128] Change packaging order in zipFiles function --- lib/plugins/package/lib/zipService.js | 41 ++++++++++++++++----------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index fd0476fe0..76522cdcb 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -80,28 +80,35 @@ module.exports = { output.on('open', () => { zip.pipe(output); - BbPromise.all(files.map((filePath) => { - const fullPath = path.resolve( - this.serverless.config.servicePath, - filePath - ); + BbPromise.all(files.map(this.getFileContentAndStat.bind(this))).then((contents) => { + _.forEach(_.sortBy(contents, ['fullPath']), (file) => { + zip.append(file.data, { + name: file.filePath, + mode: file.stat.mode, + date: new Date(0), // necessary to get the same hash when zipping the same content + }); + }); - return fs.statAsync(fullPath).then(stats => - this.getFileContent(fullPath).then(fileContent => - zip.append(fileContent, { - name: filePath, - mode: stats.mode, - date: new Date(0), // necessary to get the same hash when zipping the same content - }) - ) - ); - })).then(() => zip.finalize()).catch(reject); + zip.finalize(); + }).catch(reject); }); }); }, - getFileContent(fullPath) { - return fs.readFileAsync(fullPath); + getFileContentAndStat(filePath) { + const fullPath = path.resolve( + this.serverless.config.servicePath, + filePath + ); + + return Promise.all([ // Get file contents and stat in parallel + fs.readFileAsync(fullPath), + fs.statAsync(fullPath), + ]).then((result) => ({ + data: result[0], + stat: result[1], + filePath, + })); }, }; From df7905e61d0602bd03e3cc17f232582aff0cb735 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 21 Sep 2017 18:50:43 +0200 Subject: [PATCH 019/128] Change sortkey --- lib/plugins/package/lib/zipService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index 76522cdcb..23341400d 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -81,7 +81,7 @@ module.exports = { zip.pipe(output); BbPromise.all(files.map(this.getFileContentAndStat.bind(this))).then((contents) => { - _.forEach(_.sortBy(contents, ['fullPath']), (file) => { + _.forEach(_.sortBy(contents, ['filePath']), (file) => { zip.append(file.data, { name: file.filePath, mode: file.stat.mode, From d20177f975b274143dde6cd67bdee32f123dde33 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 21 Sep 2017 18:52:49 +0200 Subject: [PATCH 020/128] Refactor getFileContentAndStat test --- lib/plugins/package/lib/zipService.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/plugins/package/lib/zipService.test.js b/lib/plugins/package/lib/zipService.test.js index 97c53c5ba..25d42df26 100644 --- a/lib/plugins/package/lib/zipService.test.js +++ b/lib/plugins/package/lib/zipService.test.js @@ -68,7 +68,7 @@ describe('zipService', () => { }); }); - describe('#getFileContent()', () => { + describe('#getFileContentAndStat()', () => { let servicePath; beforeEach(() => { @@ -82,9 +82,9 @@ describe('zipService', () => { fs.writeFileSync(filePath, buf); - return expect(packagePlugin.getFileContent(filePath)).to.be.fulfilled + return expect(packagePlugin.getFileContentAndStat(filePath)).to.be.fulfilled .then((result) => { - expect(result).to.deep.equal(buf); + expect(result.data).to.deep.equal(buf); }); }); }); From 52ce55e9031597e5bf0f3206decc528a2eb825c6 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 21 Sep 2017 23:01:49 +0200 Subject: [PATCH 021/128] Set ApiKeyRequired if http.private is not specified --- .../aws/package/compile/events/apiGateway/lib/method/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.js index e8e040b2b..ac0147d42 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.js @@ -26,6 +26,8 @@ module.exports = { if (event.http.private) { template.Properties.ApiKeyRequired = true; + } else { + template.Properties.ApiKeyRequired = false; } const methodLogicalId = this.provider.naming From 0024bcebf38f3b6075b772bc8a126ef2cb82f1fa Mon Sep 17 00:00:00 2001 From: David Wells Date: Thu, 21 Sep 2017 16:22:37 -0700 Subject: [PATCH 022/128] Update variables.md --- docs/providers/aws/guide/variables.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/providers/aws/guide/variables.md b/docs/providers/aws/guide/variables.md index 54e704ad1..ee08d62b9 100644 --- a/docs/providers/aws/guide/variables.md +++ b/docs/providers/aws/guide/variables.md @@ -12,19 +12,20 @@ layout: Doc # Variables -The Serverless framework provides a powerful variable system which allows you to add dynamic data into your `serverless.yml`. With Serverless Variables, you'll be able to do the following: +The Serverless framework provides a powerful variable system which allows you to add dynamic data into your `serverless.yml`. -- Reference & load variables from environment variables -- Reference & load variables from CLI options -- Reference & load variables from CloudFormation stack outputs -- Recursively reference properties of any type from the same `serverless.yml` file -- Recursively reference properties of any type from other YAML/JSON files -- Recursively reference properties exported from JS files, synchronously or asynchronously -- Recursively nest variable references within each other for ultimate flexibility -- Combine multiple variable references to overwrite each other -- Define your own variable syntax if it conflicts with CF syntax -- Reference & load variables from S3 -- Reference & load variables from SSM +With the serverless variables system you can reference variables from a variety of sources including: + +- [environment variables](https://serverless.com/framework/docs/providers/aws/guide/variables#referencing-environment-variables) +- [CLI options](https://serverless.com/framework/docs/providers/aws/guide/variables#referencing-cli-options) +- [other properties defined in `serverless.yml`](https://serverless.com/framework/docs/providers/aws/guide/variables#reference-properties-in-serverlessyml) +- [external YAML/JSON files](https://serverless.com/framework/docs/providers/aws/guide/variables#reference-variables-in-other-files) +- [variables from S3](https://serverless.com/framework/docs/providers/aws/guide/variables#referencing-s3-objects) +- [variables from AWS SSM Parameter Store](https://serverless.com/framework/docs/providers/aws/guide/variables#reference-variables-using-the-ssm-parameter-store) +- [CloudFormation stack outputs](https://serverless.com/framework/docs/providers/aws/guide/variables#reference-cloudformation-outputs) +- [properties exported from Javascript files (sync or async)](https://serverless.com/framework/docs/providers/aws/guide/variables#reference-variables-in-javascript-files) + +You can also **Recursively reference properties** with the variable system. This means you can combine multiple values and variable sources for a lot of flexibility. **Note:** You can only use variables in `serverless.yml` property **values**, not property keys. So you can't use variables to generate dynamic logical IDs in the custom resources section for example. From ac7078d806e3475fb80a2f790b66ce8a6b4c4b0f Mon Sep 17 00:00:00 2001 From: David Wells Date: Thu, 21 Sep 2017 16:37:33 -0700 Subject: [PATCH 023/128] Update variables.md --- docs/providers/aws/guide/variables.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/providers/aws/guide/variables.md b/docs/providers/aws/guide/variables.md index ee08d62b9..8f4fc14ac 100644 --- a/docs/providers/aws/guide/variables.md +++ b/docs/providers/aws/guide/variables.md @@ -12,9 +12,22 @@ layout: Doc # Variables -The Serverless framework provides a powerful variable system which allows you to add dynamic data into your `serverless.yml`. +Variables allow users to dynamically replace config values in `serverless.yml` config. -With the serverless variables system you can reference variables from a variety of sources including: +They are especially useful when providing secrets for your service to use and when you are working with multiple stages. + +## Syntax + +To use variables, you will need to reference values enclosed in `${}`. + +``` +yamlKeyXYZ: ${variableSource} +# see current variable sources list below +``` + +You can define your own variable syntax (regex) if it conflicts with CloudFormation's syntax + +## Current variable sources: - [environment variables](https://serverless.com/framework/docs/providers/aws/guide/variables#referencing-environment-variables) - [CLI options](https://serverless.com/framework/docs/providers/aws/guide/variables#referencing-cli-options) From 7cf3ec4e2e5bbf33bd037f604fad2f6f1c2ddded Mon Sep 17 00:00:00 2001 From: David Wells Date: Thu, 21 Sep 2017 16:43:55 -0700 Subject: [PATCH 024/128] Update variables.md --- docs/providers/aws/guide/variables.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/providers/aws/guide/variables.md b/docs/providers/aws/guide/variables.md index 8f4fc14ac..581b7b95e 100644 --- a/docs/providers/aws/guide/variables.md +++ b/docs/providers/aws/guide/variables.md @@ -20,9 +20,11 @@ They are especially useful when providing secrets for your service to use and wh To use variables, you will need to reference values enclosed in `${}`. -``` -yamlKeyXYZ: ${variableSource} +```yml # see current variable sources list below +yamlKeyXYZ: ${variableSource} +# this is an example of providing a default value as the second parameter +otherYamlKey: ${variableSource, defaultValue} ``` You can define your own variable syntax (regex) if it conflicts with CloudFormation's syntax @@ -40,6 +42,18 @@ You can define your own variable syntax (regex) if it conflicts with CloudFormat You can also **Recursively reference properties** with the variable system. This means you can combine multiple values and variable sources for a lot of flexibility. +For example: + +```yml +provider: + name: aws + stage: ${opt:stage, 'dev'} + environment: + MY_SECRET: ${file(./config.${self:provider.stage}.json):SECRET} +``` + +If `--stage dev` is supplied as an option then `${file(./config.${self:provider.stage}.json):SECRET}` is references the `config.dev.json` file + **Note:** You can only use variables in `serverless.yml` property **values**, not property keys. So you can't use variables to generate dynamic logical IDs in the custom resources section for example. ## Reference Properties In serverless.yml From 369d7b8804bfac5882ee85dee336baec0ac23d5b Mon Sep 17 00:00:00 2001 From: David Wells Date: Thu, 21 Sep 2017 16:46:27 -0700 Subject: [PATCH 025/128] Update variables.md --- docs/providers/aws/guide/variables.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/providers/aws/guide/variables.md b/docs/providers/aws/guide/variables.md index 581b7b95e..061be5023 100644 --- a/docs/providers/aws/guide/variables.md +++ b/docs/providers/aws/guide/variables.md @@ -18,11 +18,11 @@ They are especially useful when providing secrets for your service to use and wh ## Syntax -To use variables, you will need to reference values enclosed in `${}`. +To use variables, you will need to reference values enclosed in `${}` brackets. ```yml -# see current variable sources list below -yamlKeyXYZ: ${variableSource} +# serverless.yml file +yamlKeyXYZ: ${variableSource} # see list of current variable sources below # this is an example of providing a default value as the second parameter otherYamlKey: ${variableSource, defaultValue} ``` @@ -52,7 +52,7 @@ provider: MY_SECRET: ${file(./config.${self:provider.stage}.json):SECRET} ``` -If `--stage dev` is supplied as an option then `${file(./config.${self:provider.stage}.json):SECRET}` is references the `config.dev.json` file +If `--stage dev` is supplied as an option then `${file(./config.${self:provider.stage}.json):SECRET}` is references the `config.dev.json` file. Likewise, if `sls deploy --stage prod` is ran the `config.prod.json` file would be referenced. **Note:** You can only use variables in `serverless.yml` property **values**, not property keys. So you can't use variables to generate dynamic logical IDs in the custom resources section for example. From 9fbe91579a1f6e65fadb445e8a6b35b602995917 Mon Sep 17 00:00:00 2001 From: David Wells Date: Thu, 21 Sep 2017 16:50:30 -0700 Subject: [PATCH 026/128] Update variables.md --- docs/providers/aws/guide/variables.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/providers/aws/guide/variables.md b/docs/providers/aws/guide/variables.md index 061be5023..7efff2b9a 100644 --- a/docs/providers/aws/guide/variables.md +++ b/docs/providers/aws/guide/variables.md @@ -49,10 +49,12 @@ provider: name: aws stage: ${opt:stage, 'dev'} environment: - MY_SECRET: ${file(./config.${self:provider.stage}.json):SECRET} + MY_SECRET: ${file(./config.${self:provider.stage}.json):CREDS} ``` -If `--stage dev` is supplied as an option then `${file(./config.${self:provider.stage}.json):SECRET}` is references the `config.dev.json` file. Likewise, if `sls deploy --stage prod` is ran the `config.prod.json` file would be referenced. +So for example, If `sls deploy --stage dev` option is supplied then the `${file(./config.${self:provider.stage}.json):CREDS}` variable will references the `CREDS` key defined inside of the `config.dev.json` file. + +Likewise, if `sls deploy --stage prod` is ran the `config.prod.json` file would be found and the `CREDS` key would be resolved and used as the variable value. **Note:** You can only use variables in `serverless.yml` property **values**, not property keys. So you can't use variables to generate dynamic logical IDs in the custom resources section for example. From 2800ab250a0b5d1706f13ef815cfe802c61512d3 Mon Sep 17 00:00:00 2001 From: David Wells Date: Thu, 21 Sep 2017 17:01:25 -0700 Subject: [PATCH 027/128] Update variables.md --- docs/providers/aws/guide/variables.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/providers/aws/guide/variables.md b/docs/providers/aws/guide/variables.md index 7efff2b9a..9c96c49c6 100644 --- a/docs/providers/aws/guide/variables.md +++ b/docs/providers/aws/guide/variables.md @@ -27,7 +27,9 @@ yamlKeyXYZ: ${variableSource} # see list of current variable sources below otherYamlKey: ${variableSource, defaultValue} ``` -You can define your own variable syntax (regex) if it conflicts with CloudFormation's syntax +You can define your own variable syntax (regex) if it conflicts with CloudFormation's syntax. + +**Note:** You can only use variables in `serverless.yml` property **values**, not property keys. So you can't use variables to generate dynamic logical IDs in the custom resources section for example. ## Current variable sources: @@ -40,6 +42,8 @@ You can define your own variable syntax (regex) if it conflicts with CloudFormat - [CloudFormation stack outputs](https://serverless.com/framework/docs/providers/aws/guide/variables#reference-cloudformation-outputs) - [properties exported from Javascript files (sync or async)](https://serverless.com/framework/docs/providers/aws/guide/variables#reference-variables-in-javascript-files) +## Recursively reference properties + You can also **Recursively reference properties** with the variable system. This means you can combine multiple values and variable sources for a lot of flexibility. For example: @@ -52,11 +56,18 @@ provider: MY_SECRET: ${file(./config.${self:provider.stage}.json):CREDS} ``` -So for example, If `sls deploy --stage dev` option is supplied then the `${file(./config.${self:provider.stage}.json):CREDS}` variable will references the `CREDS` key defined inside of the `config.dev.json` file. +If `sls deploy --stage qa` is ran, the option `stage=qa` is used inside the `${file(./config.${self:provider.stage}.json):CREDS}` variable and it will resolve the `config.qa.json` file and use the `CREDS` key defined. -Likewise, if `sls deploy --stage prod` is ran the `config.prod.json` file would be found and the `CREDS` key would be resolved and used as the variable value. +**How that works:** -**Note:** You can only use variables in `serverless.yml` property **values**, not property keys. So you can't use variables to generate dynamic logical IDs in the custom resources section for example. +1. stage is set to `qa` from the option supplied to the `sls deploy --stage qa` command +2. `${self:provider.stage}` resolves to `qa` and is used in `${file(./config.${self:provider.stage}.json):CREDS}` +3. `${file(./config.qa.stage}.json):CREDS}` is found & the `CREDS` value is read +4. `MY_SECRET` value is set + +Likewise, if `sls deploy --stage prod` is ran the `config.prod.json` file would be found and the `CREDS` key would be used as the variable value. + +If no value is provided, the second parameter defined in `${opt:stage, 'dev'}` a.k.a `dev` will be used and result in `${file(./config.dev.json):CREDS}` ## Reference Properties In serverless.yml To self-reference properties in `serverless.yml`, use the `${self:someProperty}` syntax in your `serverless.yml`. `someProperty` can contain the empty string for a top-level self-reference or a dotted attribute reference to any depth of attribute, so you can go as shallow or deep in the object tree as you want. From d802250d3da42b4fc3728bab49842b04565c5ccd Mon Sep 17 00:00:00 2001 From: David Wells Date: Thu, 21 Sep 2017 17:02:57 -0700 Subject: [PATCH 028/128] Update variables.md --- docs/providers/aws/guide/variables.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/providers/aws/guide/variables.md b/docs/providers/aws/guide/variables.md index 9c96c49c6..8de9760ee 100644 --- a/docs/providers/aws/guide/variables.md +++ b/docs/providers/aws/guide/variables.md @@ -65,9 +65,9 @@ If `sls deploy --stage qa` is ran, the option `stage=qa` is used inside the `${f 3. `${file(./config.qa.stage}.json):CREDS}` is found & the `CREDS` value is read 4. `MY_SECRET` value is set -Likewise, if `sls deploy --stage prod` is ran the `config.prod.json` file would be found and the `CREDS` key would be used as the variable value. +Likewise, if `sls deploy --stage prod` is ran the `config.prod.json` file would be found and used. -If no value is provided, the second parameter defined in `${opt:stage, 'dev'}` a.k.a `dev` will be used and result in `${file(./config.dev.json):CREDS}` +If no `--stage` flag is provided, the second parameter defined in `${opt:stage, 'dev'}` a.k.a `dev` will be used and result in `${file(./config.dev.json):CREDS}`. ## Reference Properties In serverless.yml To self-reference properties in `serverless.yml`, use the `${self:someProperty}` syntax in your `serverless.yml`. `someProperty` can contain the empty string for a top-level self-reference or a dotted attribute reference to any depth of attribute, so you can go as shallow or deep in the object tree as you want. From 059d690cdc3b26aa53e993f1f31ecfbf37b037a0 Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Fri, 22 Sep 2017 15:50:01 +0000 Subject: [PATCH 029/128] Continued work on print tests --- lib/plugins/print/print.js | 2 ++ lib/plugins/print/print.test.js | 31 +++++++++++++++++-------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js index f28c603fc..82e08788c 100644 --- a/lib/plugins/print/print.js +++ b/lib/plugins/print/print.js @@ -34,6 +34,8 @@ class Print { } return this.serverless.variables.populateObject(conf); }).then((data) => this.serverless.cli.consoleLog(YAML.dump(data))); + + return BbPromise.resolve(); } } diff --git a/lib/plugins/print/print.test.js b/lib/plugins/print/print.test.js index 63faf4482..df1a57cda 100644 --- a/lib/plugins/print/print.test.js +++ b/lib/plugins/print/print.test.js @@ -5,16 +5,20 @@ const sinon = require('sinon'); const proxyquire = require('proxyquire'); const Serverless = require('../../Serverless'); const CLI = require('../../classes/CLI'); +const YAML = require('js-yaml'); describe('Print', () => { let print; let serverless; let getServerlessConfigFileStub; - let consoleLogStub; + let consoleLogSpy; + let sandbox; beforeEach(() => { - getServerlessConfigFileStub = sinon.stub(); + sandbox = sinon.sandbox.create(); + consoleLogSpy = sandbox.spy(console, 'log'); + getServerlessConfigFileStub = sandbox.stub(); const printPlugin = proxyquire('./print.js', { '../../utils/getServerlessConfigFile': getServerlessConfigFileStub, }); @@ -25,29 +29,28 @@ describe('Print', () => { } serverless.cli = new CLI(serverless); print = new printPlugin(serverless); - consoleLogStub = sinon.stub(serverless.cli, 'consoleLog').returns(true); }); afterEach(() => { - serverless.cli.consoleLog.restore(); + consoleLogSpy.restore(); }) - describe('#constructor()', () => { - it('should have commands', () => expect(print.commands).to.be.not.empty); - }); - it('should print standard config', () => { - getServerlessConfigFileStub.resolves({ + const conf = { service: 'my-service', provider: { name: 'aws' } + } + getServerlessConfigFileStub.resolves(conf) + + print.print().then(() => { + const message = consoleLogSpy.args.join(); + + expect(getServerlessConfigFileStub.calledOnce).to.equal(true); + expect(console.log.calledOnce).to.equal(true); + expect(message).to.have.string(YAML.dump(conf)); }) - - print.print(); - - expect(getServerlessConfigFileStub.calledOnce).to.equal(true); - expect(consoleLogStub.called).to.equal(true); }); }); From c8b6de516fa4f62ebff9ba515226d11ca0306bb7 Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Fri, 22 Sep 2017 20:23:28 +0000 Subject: [PATCH 030/128] The tests are passing!!! --- lib/plugins/print/print.js | 13 ++-- lib/plugins/print/print.test.js | 125 +++++++++++++++++++++++++++++--- 2 files changed, 123 insertions(+), 15 deletions(-) diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js index 82e08788c..dd0a7a67d 100644 --- a/lib/plugins/print/print.js +++ b/lib/plugins/print/print.js @@ -25,18 +25,21 @@ class Print { print() { this.serverless.variables.options = this.serverless.processedInput.options; this.serverless.variables.loadVariableSyntax(); - getServerlessConfigFile(process.cwd()) + return getServerlessConfigFile(process.cwd()) .then((data) => { const conf = data; // Need to delete variableSyntax to avoid potential matching errors if (conf.provider.variableSyntax) { delete conf.provider.variableSyntax; } - return this.serverless.variables.populateObject(conf); - }).then((data) => this.serverless.cli.consoleLog(YAML.dump(data))); - - return BbPromise.resolve(); + return conf; + }) + .then((data) => { + return this.serverless.variables.populateObject(data).then(() => { return data; }) + }) + .then((data) => this.serverless.cli.consoleLog(YAML.dump(data))); } + } module.exports = Print; diff --git a/lib/plugins/print/print.test.js b/lib/plugins/print/print.test.js index df1a57cda..5b6d0b03f 100644 --- a/lib/plugins/print/print.test.js +++ b/lib/plugins/print/print.test.js @@ -4,6 +4,7 @@ const expect = require('chai').expect; const sinon = require('sinon'); const proxyquire = require('proxyquire'); const Serverless = require('../../Serverless'); +const AwsProvider = require('../aws/provider/awsProvider'); const CLI = require('../../classes/CLI'); const YAML = require('js-yaml'); @@ -12,13 +13,9 @@ describe('Print', () => { let print; let serverless; let getServerlessConfigFileStub; - let consoleLogSpy; - let sandbox; beforeEach(() => { - sandbox = sinon.sandbox.create(); - consoleLogSpy = sandbox.spy(console, 'log'); - getServerlessConfigFileStub = sandbox.stub(); + getServerlessConfigFileStub = sinon.stub(); const printPlugin = proxyquire('./print.js', { '../../utils/getServerlessConfigFile': getServerlessConfigFileStub, }); @@ -29,11 +26,15 @@ describe('Print', () => { } serverless.cli = new CLI(serverless); print = new printPlugin(serverless); + print.serverless.cli = { + consoleLog: sinon.spy(), + }; }); afterEach(() => { - consoleLogSpy.restore(); - }) + //print.serverless.cli.consoleLog.restore(); + serverless.service.provider.variableSyntax = '\\${([ ~:a-zA-Z0-9._\'",\\-\\/\\(\\)]+?)}' + }); it('should print standard config', () => { const conf = { @@ -44,13 +45,117 @@ describe('Print', () => { } getServerlessConfigFileStub.resolves(conf) - print.print().then(() => { - const message = consoleLogSpy.args.join(); + return print.print().then(() => { + const message = print.serverless.cli.consoleLog.args.join(); expect(getServerlessConfigFileStub.calledOnce).to.equal(true); - expect(console.log.calledOnce).to.equal(true); + expect(print.serverless.cli.consoleLog.called).to.be.equal(true); expect(message).to.have.string(YAML.dump(conf)); }) }); + it('should resolve command line variables', () => { + const conf = { + service: 'my-service', + provider: { + name: 'aws', + stage: '${opt:stage}' + } + } + getServerlessConfigFileStub.resolves(conf) + + serverless.processedInput = { + commands: [ 'print' ], + options: { stage: 'dev', region: undefined } + } + + const expected = { + service: 'my-service', + provider: { + name: 'aws', + stage: 'dev' + } + } + + return print.print().then(() => { + const message = print.serverless.cli.consoleLog.args.join(); + + expect(getServerlessConfigFileStub.calledOnce).to.equal(true); + expect(print.serverless.cli.consoleLog.called).to.be.equal(true); + expect(message).to.equal(YAML.dump(expected)); + }) + }); + + it('should resolve using custom variable syntax', () => { + const conf = { + service: 'my-service', + provider: { + name: 'aws', + stage: '${{opt:stage}}' + } + } + serverless.service.provider.variableSyntax = "\\${{([ ~:a-zA-Z0-9._\\'\",\\-\\/\\(\\)]+?)}}"; + getServerlessConfigFileStub.resolves(conf); + + serverless.processedInput = { + commands: [ 'print' ], + options: { stage: 'dev', region: undefined } + } + + const expected = { + service: 'my-service', + provider: { + name: 'aws', + stage: 'dev' + } + } + + return print.print().then(() => { + const message = print.serverless.cli.consoleLog.args.join(); + + expect(getServerlessConfigFileStub.calledOnce).to.equal(true); + expect(print.serverless.cli.consoleLog.called).to.be.equal(true); + expect(message).to.equal(YAML.dump(expected)); + }) + }); + + it('should resolve custom variables', () => { + const conf = { + service: 'my-service', + custom: { region: 'us-east-1' }, + provider: { + name: 'aws', + stage: '${opt:stage}', + region: '${self:custom.region}' + } + } + getServerlessConfigFileStub.resolves(conf) + + serverless.processedInput = { + commands: [ 'print' ], + options: { stage: 'dev', region: undefined } + } + serverless.service.custom = { region: 'us-east-1' } + + const expected = { + service: 'my-service', + custom: { + region: 'us-east-1', + }, + provider: { + name: 'aws', + stage: 'dev', + region: 'us-east-1' + } + } + + return print.print().then(() => { + const message = print.serverless.cli.consoleLog.args.join(); + + expect(getServerlessConfigFileStub.calledOnce).to.equal(true); + expect(print.serverless.cli.consoleLog.called).to.be.equal(true); + expect(message).to.equal(YAML.dump(expected)); + }) + }); + }); From 00d05244ccd1db1626ab39f63c23e5b9c808cf1e Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Fri, 22 Sep 2017 20:50:41 +0000 Subject: [PATCH 031/128] And now the linter works! --- lib/plugins/print/print.js | 4 +- lib/plugins/print/print.test.js | 91 ++++++++++++++++----------------- 2 files changed, 45 insertions(+), 50 deletions(-) diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js index dd0a7a67d..8ae68ca3b 100644 --- a/lib/plugins/print/print.js +++ b/lib/plugins/print/print.js @@ -34,9 +34,7 @@ class Print { } return conf; }) - .then((data) => { - return this.serverless.variables.populateObject(data).then(() => { return data; }) - }) + .then((data) => this.serverless.variables.populateObject(data)) .then((data) => this.serverless.cli.consoleLog(YAML.dump(data))); } diff --git a/lib/plugins/print/print.test.js b/lib/plugins/print/print.test.js index 5b6d0b03f..d4aaebb91 100644 --- a/lib/plugins/print/print.test.js +++ b/lib/plugins/print/print.test.js @@ -4,7 +4,6 @@ const expect = require('chai').expect; const sinon = require('sinon'); const proxyquire = require('proxyquire'); const Serverless = require('../../Serverless'); -const AwsProvider = require('../aws/provider/awsProvider'); const CLI = require('../../classes/CLI'); const YAML = require('js-yaml'); @@ -16,34 +15,33 @@ describe('Print', () => { beforeEach(() => { getServerlessConfigFileStub = sinon.stub(); - const printPlugin = proxyquire('./print.js', { + const PrintPlugin = proxyquire('./print.js', { '../../utils/getServerlessConfigFile': getServerlessConfigFileStub, }); serverless = new Serverless(); serverless.processedInput = { - commands: [ 'print' ], - options: { stage: undefined, region: undefined } - } + commands: ['print'], + options: { stage: undefined, region: undefined }, + }; serverless.cli = new CLI(serverless); - print = new printPlugin(serverless); + print = new PrintPlugin(serverless); print.serverless.cli = { consoleLog: sinon.spy(), }; }); afterEach(() => { - //print.serverless.cli.consoleLog.restore(); - serverless.service.provider.variableSyntax = '\\${([ ~:a-zA-Z0-9._\'",\\-\\/\\(\\)]+?)}' + serverless.service.provider.variableSyntax = '\\${([ ~:a-zA-Z0-9._\'",\\-\\/\\(\\)]+?)}'; }); it('should print standard config', () => { const conf = { service: 'my-service', provider: { - name: 'aws' - } - } - getServerlessConfigFileStub.resolves(conf) + name: 'aws', + }, + }; + getServerlessConfigFileStub.resolves(conf); return print.print().then(() => { const message = print.serverless.cli.consoleLog.args.join(); @@ -51,7 +49,7 @@ describe('Print', () => { expect(getServerlessConfigFileStub.calledOnce).to.equal(true); expect(print.serverless.cli.consoleLog.called).to.be.equal(true); expect(message).to.have.string(YAML.dump(conf)); - }) + }); }); it('should resolve command line variables', () => { @@ -59,23 +57,23 @@ describe('Print', () => { service: 'my-service', provider: { name: 'aws', - stage: '${opt:stage}' - } - } - getServerlessConfigFileStub.resolves(conf) + stage: '${opt:stage}', + }, + }; + getServerlessConfigFileStub.resolves(conf); serverless.processedInput = { - commands: [ 'print' ], - options: { stage: 'dev', region: undefined } - } + commands: ['print'], + options: { stage: 'dev', region: undefined }, + }; const expected = { service: 'my-service', provider: { name: 'aws', - stage: 'dev' - } - } + stage: 'dev', + }, + }; return print.print().then(() => { const message = print.serverless.cli.consoleLog.args.join(); @@ -83,7 +81,7 @@ describe('Print', () => { expect(getServerlessConfigFileStub.calledOnce).to.equal(true); expect(print.serverless.cli.consoleLog.called).to.be.equal(true); expect(message).to.equal(YAML.dump(expected)); - }) + }); }); it('should resolve using custom variable syntax', () => { @@ -91,24 +89,24 @@ describe('Print', () => { service: 'my-service', provider: { name: 'aws', - stage: '${{opt:stage}}' - } - } + stage: '${{opt:stage}}', + }, + }; serverless.service.provider.variableSyntax = "\\${{([ ~:a-zA-Z0-9._\\'\",\\-\\/\\(\\)]+?)}}"; getServerlessConfigFileStub.resolves(conf); serverless.processedInput = { - commands: [ 'print' ], - options: { stage: 'dev', region: undefined } - } + commands: ['print'], + options: { stage: 'dev', region: undefined }, + }; const expected = { service: 'my-service', provider: { name: 'aws', - stage: 'dev' - } - } + stage: 'dev', + }, + }; return print.print().then(() => { const message = print.serverless.cli.consoleLog.args.join(); @@ -116,7 +114,7 @@ describe('Print', () => { expect(getServerlessConfigFileStub.calledOnce).to.equal(true); expect(print.serverless.cli.consoleLog.called).to.be.equal(true); expect(message).to.equal(YAML.dump(expected)); - }) + }); }); it('should resolve custom variables', () => { @@ -126,16 +124,16 @@ describe('Print', () => { provider: { name: 'aws', stage: '${opt:stage}', - region: '${self:custom.region}' - } - } - getServerlessConfigFileStub.resolves(conf) + region: '${self:custom.region}', + }, + }; + getServerlessConfigFileStub.resolves(conf); serverless.processedInput = { - commands: [ 'print' ], - options: { stage: 'dev', region: undefined } - } - serverless.service.custom = { region: 'us-east-1' } + commands: ['print'], + options: { stage: 'dev', region: undefined }, + }; + serverless.service.custom = { region: 'us-east-1' }; const expected = { service: 'my-service', @@ -145,9 +143,9 @@ describe('Print', () => { provider: { name: 'aws', stage: 'dev', - region: 'us-east-1' - } - } + region: 'us-east-1', + }, + }; return print.print().then(() => { const message = print.serverless.cli.consoleLog.args.join(); @@ -155,7 +153,6 @@ describe('Print', () => { expect(getServerlessConfigFileStub.calledOnce).to.equal(true); expect(print.serverless.cli.consoleLog.called).to.be.equal(true); expect(message).to.equal(YAML.dump(expected)); - }) + }); }); - }); From b67c0920a3e4ef1469f7f555f43530dd95a961f8 Mon Sep 17 00:00:00 2001 From: Simon Males Date: Sat, 23 Sep 2017 20:30:00 +0200 Subject: [PATCH 032/128] SQS queue, not SNS queue --- docs/providers/aws/guide/functions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers/aws/guide/functions.md b/docs/providers/aws/guide/functions.md index 59d20a5e0..42100b9e8 100644 --- a/docs/providers/aws/guide/functions.md +++ b/docs/providers/aws/guide/functions.md @@ -305,7 +305,7 @@ These versions are not cleaned up by serverless, so make sure you use a plugin o ## Dead Letter Queue (DLQ) -When AWS lambda functions fail, they are [retried](http://docs.aws.amazon.com/lambda/latest/dg/retries-on-errors.html). If the retries also fail, AWS has a feature to send information about the failed request to a SNS topic or SNS queue, called the [Dead Letter Queue](http://docs.aws.amazon.com/lambda/latest/dg/dlq.html), which you can use to track and diagnose and react to lambda failures. +When AWS lambda functions fail, they are [retried](http://docs.aws.amazon.com/lambda/latest/dg/retries-on-errors.html). If the retries also fail, AWS has a feature to send information about the failed request to a SNS topic or SQS queue, called the [Dead Letter Queue](http://docs.aws.amazon.com/lambda/latest/dg/dlq.html), which you can use to track and diagnose and react to lambda failures. You can setup a dead letter queue for your serverless functions with the help of a SNS topic and the `onError` config parameter. From d692b8448e078534d009e523a05ec5c97258b053 Mon Sep 17 00:00:00 2001 From: Andres Date: Tue, 26 Sep 2017 10:29:08 +0200 Subject: [PATCH 033/128] Add docs for scheduled events for Kubeless --- docs/providers/kubeless/README.md | 1 + .../kubeless/cli-reference/remove.md | 3 ++ docs/providers/kubeless/events/http.md | 8 ++--- docs/providers/kubeless/events/scheduler.md | 34 +++++++++++++++++++ docs/providers/kubeless/guide/deploying.md | 2 +- docs/providers/kubeless/guide/installation.md | 2 +- docs/providers/kubeless/guide/intro.md | 2 +- 7 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 docs/providers/kubeless/events/scheduler.md diff --git a/docs/providers/kubeless/README.md b/docs/providers/kubeless/README.md index 082347329..b9bba665a 100644 --- a/docs/providers/kubeless/README.md +++ b/docs/providers/kubeless/README.md @@ -68,6 +68,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se diff --git a/docs/providers/kubeless/cli-reference/remove.md b/docs/providers/kubeless/cli-reference/remove.md index 2b6992a49..ea1bd14b6 100644 --- a/docs/providers/kubeless/cli-reference/remove.md +++ b/docs/providers/kubeless/cli-reference/remove.md @@ -20,5 +20,8 @@ serverless remove It will remove the Kubeless Function objects from your Kubernetes cluster, the Kubernetes Deployments and the Kubernetes Services associated with the Serverless service. +## Options +- `--verbose` or `-v` Shows additional information during the removal. + ## Provided lifecycle events - `remove:remove` diff --git a/docs/providers/kubeless/events/http.md b/docs/providers/kubeless/events/http.md index a6440fe42..8196f46f2 100644 --- a/docs/providers/kubeless/events/http.md +++ b/docs/providers/kubeless/events/http.md @@ -84,10 +84,6 @@ If the events HTTP definitions contain a `path` attribute, when deploying this S ``` kubectl get ingress -NAME HOSTS ADDRESS PORTS AGE -ingress-create * 192.168.99.100 80 2m -ingress-delete * 192.168.99.100 80 2m -ingress-read-all * 192.168.99.100 80 2m -ingress-read-one * 192.168.99.100 80 2m -ingress-update * 192.168.99.100 80 2m +NAME HOSTS ADDRESS PORTS AGE +ingress-1506350705094 192.168.99.100.nip.io 80 28s ``` \ No newline at end of file diff --git a/docs/providers/kubeless/events/scheduler.md b/docs/providers/kubeless/events/scheduler.md new file mode 100644 index 000000000..387bcfe63 --- /dev/null +++ b/docs/providers/kubeless/events/scheduler.md @@ -0,0 +1,34 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/kubeless/events/schedule) + + +# Kubeless Scheduled Events + +Kubeless functions can be triggered following a certain schedule. The schedule can be specified events section of the `serverless.yml` following the Cron notation: + +``` +service: clock + +provider: + name: kubeless + runtime: nodejs6 + +plugins: + - serverless-kubeless + +functions: + clock: + handler: handler.printClock + events: + - schedule: "* * * * *" +``` + +When deploying this `serverless.yml` file, Kubeless will create a Kubernetes cron job that will trigger the function `printClock` every minute. diff --git a/docs/providers/kubeless/guide/deploying.md b/docs/providers/kubeless/guide/deploying.md index 9c8288c1d..cdb4883d9 100644 --- a/docs/providers/kubeless/guide/deploying.md +++ b/docs/providers/kubeless/guide/deploying.md @@ -76,7 +76,7 @@ Kubeless will create a [Kubernetes Deployment](https://kubernetes.io/docs/concep ## Deploy Function -This deployment method updates a single function. It performs the platform API call to deploy your package without the other resources. It is much faster than redeploying your whole service each time. +This deployment method updates or deploys a single function. It performs the platform API call to deploy your package without the other resources. It is much faster than redeploying your whole service each time. ```bash serverless deploy function --function myFunction diff --git a/docs/providers/kubeless/guide/installation.md b/docs/providers/kubeless/guide/installation.md index c1a1a181a..483a87516 100644 --- a/docs/providers/kubeless/guide/installation.md +++ b/docs/providers/kubeless/guide/installation.md @@ -26,7 +26,7 @@ Go to the official [Node.js website](https://nodejs.org), download and follow th **Note:** Serverless runs on Node v4 or higher. -You can verify that Node.js is installed successfully by runnning `node --version` in your terminal. You should see the corresponding Node version number printed out. +You can verify that Node.js is installed successfully by running `node --version` in your terminal. You should see the corresponding Node version number printed out. ## Installing the Serverless Framework diff --git a/docs/providers/kubeless/guide/intro.md b/docs/providers/kubeless/guide/intro.md index 521658292..a6227c941 100644 --- a/docs/providers/kubeless/guide/intro.md +++ b/docs/providers/kubeless/guide/intro.md @@ -24,7 +24,7 @@ Here are the Serverless Framework's main concepts and how they pertain to Kubele ### Functions -A Function is an [Kubeless Function](http://kubeless.io/). It's an independent unit of deployment, like a microservice. It's merely code, deployed in the cloud, that is most often written to perform a single job such as: +A Function is a [Kubeless Function](http://kubeless.io/). It's an independent unit of deployment, like a microservice. It's merely code, deployed in the cloud, that is most often written to perform a single job such as: * *Saving a user to the database* * *Processing a file in a database* From 45c8ade73c31db6321fbd43cc6b5a091c5e7cc03 Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Wed, 27 Sep 2017 15:56:23 +0000 Subject: [PATCH 034/128] Show custom variableSyntax in output --- lib/plugins/print/print.js | 10 +++++++++- lib/plugins/print/print.test.js | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js index 8ae68ca3b..4ad04c791 100644 --- a/lib/plugins/print/print.js +++ b/lib/plugins/print/print.js @@ -23,6 +23,7 @@ class Print { } print() { + let variableSyntax; this.serverless.variables.options = this.serverless.processedInput.options; this.serverless.variables.loadVariableSyntax(); return getServerlessConfigFile(process.cwd()) @@ -30,12 +31,19 @@ class Print { const conf = data; // Need to delete variableSyntax to avoid potential matching errors if (conf.provider.variableSyntax) { + variableSyntax = conf.provider.variableSyntax; delete conf.provider.variableSyntax; } return conf; }) .then((data) => this.serverless.variables.populateObject(data)) - .then((data) => this.serverless.cli.consoleLog(YAML.dump(data))); + .then((data) => { + const conf = data; + if (variableSyntax !== undefined) { + conf.provider.variableSyntax = variableSyntax; + } + this.serverless.cli.consoleLog(YAML.dump(conf)); + }); } } diff --git a/lib/plugins/print/print.test.js b/lib/plugins/print/print.test.js index d4aaebb91..95fc05935 100644 --- a/lib/plugins/print/print.test.js +++ b/lib/plugins/print/print.test.js @@ -90,6 +90,7 @@ describe('Print', () => { provider: { name: 'aws', stage: '${{opt:stage}}', + variableSyntax: "\\${{([ ~:a-zA-Z0-9._\\'\",\\-\\/\\(\\)]+?)}}", }, }; serverless.service.provider.variableSyntax = "\\${{([ ~:a-zA-Z0-9._\\'\",\\-\\/\\(\\)]+?)}}"; @@ -105,6 +106,7 @@ describe('Print', () => { provider: { name: 'aws', stage: 'dev', + variableSyntax: "\\${{([ ~:a-zA-Z0-9._\\'\",\\-\\/\\(\\)]+?)}}", }, }; From 2e6d9733ecdf05bfbd7779412a64921d29466c7e Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 28 Sep 2017 19:01:34 +0200 Subject: [PATCH 035/128] Add IAM Role normalization --- lib/plugins/aws/deployFunction/index.js | 63 +++++++++++++++++++------ 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/lib/plugins/aws/deployFunction/index.js b/lib/plugins/aws/deployFunction/index.js index 3b098f8b3..bbe04a6f1 100644 --- a/lib/plugins/aws/deployFunction/index.js +++ b/lib/plugins/aws/deployFunction/index.js @@ -73,6 +73,40 @@ class AwsDeployFunction { }); } + normalizeArnRole(role) { + if (typeof role === 'string') { + if (role.indexOf(':') === -1) { + const roleResource = this.serverless.service.resources.Resources[role]; + + if (roleResource.Type !== 'AWS::IAM::Role') { + throw new Error('Provided resource is not IAM Role.'); + } + + const roleProperties = roleResource.Properties; + const compiledFullRoleName = `${roleProperties.Path}${roleProperties.RoleName}`; + + return this.provider.getAccountId().then((accountId) => + `arn:aws:iam::${accountId}:role${compiledFullRoleName}` + ); + } + + return BbPromise.resolve(role); + } + + return BbPromise.resolve(role['Fn::GetAtt'][0]); + } + + callUpdateFunctionConfiguration(params) { + return this.provider.request( + 'Lambda', + 'updateFunctionConfiguration', + params, + this.options.stage, this.options.region + ).then(() => { + this.serverless.cli.log(`Successfully updated function: ${this.options.function}`); + }); + } + updateFunctionConfiguration() { const functionObj = this.options.functionObj; const serviceObj = this.serverless.service.serviceObject; @@ -97,12 +131,6 @@ class AwsDeployFunction { params.MemorySize = providerObj.memorySize; } - if ('role' in functionObj) { - params.Role = functionObj.role; - } else if ('role' in providerObj) { - params.Role = providerObj.role; - } - if ('timeout' in functionObj) { params.Timeout = functionObj.timeout; } else if ('timeout' in providerObj) { @@ -148,14 +176,21 @@ class AwsDeployFunction { params.VpcConfig.SubnetIds = providerObj.vpc.subnetIds; } - return this.provider.request( - 'Lambda', - 'updateFunctionConfiguration', - params, - this.options.stage, this.options.region - ).then(() => { - this.serverless.cli.log(`Successfully updated function: ${this.options.function}`); - }); + if ('role' in functionObj) { + return this.normalizeArnRole(functionObj.role).then(roleArn => { + params.Role = roleArn; + + return this.callUpdateFunctionConfiguration(params); + }); + } else if ('role' in providerObj) { + return this.normalizeArnRole(providerObj.role).then(roleArn => { + params.Role = roleArn; + + return this.callUpdateFunctionConfiguration(params); + }); + } + + return this.callUpdateFunctionConfiguration(params); } deployFunction() { From 5423d8bf2808d96c0cdd5373afb75f0d6b01c1c7 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 28 Sep 2017 19:19:54 +0200 Subject: [PATCH 036/128] Fix Fn::GetAtt case --- lib/plugins/aws/deployFunction/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/plugins/aws/deployFunction/index.js b/lib/plugins/aws/deployFunction/index.js index bbe04a6f1..a473d4a95 100644 --- a/lib/plugins/aws/deployFunction/index.js +++ b/lib/plugins/aws/deployFunction/index.js @@ -93,7 +93,9 @@ class AwsDeployFunction { return BbPromise.resolve(role); } - return BbPromise.resolve(role['Fn::GetAtt'][0]); + return this.provider.getAccountId().then((accountId) => + `arn:aws:iam::${accountId}:role${role['Fn::GetAtt'][0]}` + ); } callUpdateFunctionConfiguration(params) { From 52bf02e634e8506ec8ca1f6467575c36bebd2fd2 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Fri, 29 Sep 2017 07:37:38 +1300 Subject: [PATCH 037/128] Fix tabbing for iamRoleStatements --- docs/providers/aws/guide/serverless.yml.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/providers/aws/guide/serverless.yml.md b/docs/providers/aws/guide/serverless.yml.md index 2b699727a..3193237c9 100644 --- a/docs/providers/aws/guide/serverless.yml.md +++ b/docs/providers/aws/guide/serverless.yml.md @@ -55,13 +55,13 @@ provider: key: value iamRoleStatements: # IAM role statements so that services can be accessed in the AWS account - Effect: 'Allow' - Action: - - 's3:ListBucket' - Resource: - Fn::Join: - - '' - - - 'arn:aws:s3:::' - - Ref: ServerlessDeploymentBucket + Action: + - 's3:ListBucket' + Resource: + Fn::Join: + - '' + - - 'arn:aws:s3:::' + - Ref: ServerlessDeploymentBucket stackPolicy: # Optional CF stack policy. The example below allows updates to all resources except deleting/replacing EC2 instances (use with caution!) - Effect: Allow Principal: "*" From 7689cff5a907fe9e561e1a9df52037c63016d379 Mon Sep 17 00:00:00 2001 From: Mariusz Nowak Date: Fri, 29 Sep 2017 16:25:29 +0200 Subject: [PATCH 038/128] Improve plugin initialization error reporting Distinguish not found errors from "initialization errors (so far in both cases not found error was thrown) --- lib/classes/PluginManager.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/classes/PluginManager.js b/lib/classes/PluginManager.js index 75fd3d89e..7cf4f75da 100644 --- a/lib/classes/PluginManager.js +++ b/lib/classes/PluginManager.js @@ -90,17 +90,23 @@ class PluginManager { this.addPlugin(Plugin); } catch (error) { - // Rethrow the original error in case we're in debug mode. - if (process.env.SLS_DEBUG) { - throw error; + let errorMessage; + if (error && error.code === 'MODULE_NOT_FOUND' && error.message.endsWith(`'${plugin}'`)) { + // Plugin not installed + errorMessage = [ + `Serverless plugin "${plugin}" not found.`, + ' Make sure it\'s installed and listed in the "plugins" section', + ' of your serverless config file.', + ].join(''); + } else { + // Plugin initialization error + // Rethrow the original error in case we're in debug mode. + if (process.env.SLS_DEBUG) { + throw error; + } + errorMessage = + `Serverless plugin "${plugin}" initialization errored: ${error.message}`; } - - const errorMessage = [ - `Serverless plugin "${plugin}" not found.`, - ' Make sure it\'s installed and listed in the "plugins" section', - ' of your serverless config file.', - ].join(''); - if (!this.cliOptions.help) { throw new this.serverless.classes.Error(errorMessage); } From 08fc6c6b6d9c32b35f477f51f87dcd39bac515e7 Mon Sep 17 00:00:00 2001 From: Takahiro Horike Date: Fri, 29 Sep 2017 23:39:51 +0900 Subject: [PATCH 039/128] Update resources.md --- docs/providers/aws/guide/resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers/aws/guide/resources.md b/docs/providers/aws/guide/resources.md index a4077624b..f8741ecbe 100644 --- a/docs/providers/aws/guide/resources.md +++ b/docs/providers/aws/guide/resources.md @@ -70,7 +70,7 @@ We're also using the term `normalizedName` or similar terms in this guide. This |Lambda::Function | {normalizedFunctionName}LambdaFunction | HelloLambdaFunction | |Lambda::Version | {normalizedFunctionName}LambdaVersion{sha256} | HelloLambdaVersionr3pgoTvv1xT4E4NiCL6JG02fl6vIyi7OS1aW0FwAI | |Logs::LogGroup | {normalizedFunctionName}LogGroup | HelloLogGroup | -|Lambda::Permission |
    • **Schedule**: {normalizedFunctionName}LambdaPermissionEventsRuleSchedule{index}
    • **CloudWatch Event**: {normalizedFunctionName}LambdaPermissionEventsRuleCloudWatchEvent{index}
    • **CloudWatch Log**: {normalizedFunctionName}LambdaPermissionLogsSubscriptionFilterCloudWatchLog{index}
    • **IoT**: {normalizedFunctionName}LambdaPermissionIotTopicRule{index}
    • **S3**: {normalizedFunctionName}LambdaPermission{normalizedBucketName}S3
    • **APIG**: {normalizedFunctionName}LambdaPermissionApiGateway
    • **SNS**: {normalizedFunctionName}LambdaPermission{normalizedTopicName}SNS
    • **Alexa Skill**: {normalizedFunctionName}LambdaPermissionAlexaSkill
    • **Alexa Smart Home**: {normalizedFunctionName}LambdaPermissionAlexaSmartHome{index}
    • **Cognito User Pool Trigger Source**: {normalizedFunctionName}LambdaPermissionCognitoUserPool{normalizedPoolId}TriggerSource{triggerSource}
    |
    • **Schedule**: HelloLambdaPermissionEventsRuleSchedule1
    • **CloudWatch Event**: HelloLambdaPermissionEventsRuleCloudWatchEvent1
    • **CloudWatch Log**: HelloLambdaPermissionLogsSubscriptionFilterCloudWatchLog1
    • **IoT**: HelloLambdaPermissionIotTopicRule1
    • **S3**: HelloLambdaPermissionBucketS3
    • **APIG**: HelloLambdaPermissionApiGateway
    • **SNS**: HelloLambdaPermissionTopicSNS
    • **Alexa Skill**: HelloLambdaPermissionAlexaSkill
    • **Alexa Smart Home**: HelloLambdaPermissionAlexaSmartHome
    • **Cognito User Pool Trigger Source**: HelloLambdaPermissionCognitoUserPoolMyPoolTriggerSourceCustomMessage
    | +|Lambda::Permission |
    • **Schedule**: {normalizedFunctionName}LambdaPermissionEventsRuleSchedule{index}
    • **CloudWatch Event**: {normalizedFunctionName}LambdaPermissionEventsRuleCloudWatchEvent{index}
    • **CloudWatch Log**: {normalizedFunctionName}LambdaPermissionLogsSubscriptionFilterCloudWatchLog{index}
    • **IoT**: {normalizedFunctionName}LambdaPermissionIotTopicRule{index}
    • **S3**: {normalizedFunctionName}LambdaPermission{normalizedBucketName}S3
    • **APIG**: {normalizedFunctionName}LambdaPermissionApiGateway
    • **SNS**: {normalizedFunctionName}LambdaPermission{normalizedTopicName}SNS
    • **Alexa Skill**: {normalizedFunctionName}LambdaPermissionAlexaSkill
    • **Alexa Smart Home**: {normalizedFunctionName}LambdaPermissionAlexaSmartHome{index}
    • **Cognito User Pool Trigger Source**: {normalizedFunctionName}LambdaPermissionCognitoUserPool{normalizedPoolId}TriggerSource{triggerSource}
    |
    • **Schedule**: HelloLambdaPermissionEventsRuleSchedule1
    • **CloudWatch Event**: HelloLambdaPermissionEventsRuleCloudWatchEvent1
    • **CloudWatch Log**: HelloLambdaPermissionLogsSubscriptionFilterCloudWatchLog1
    • **IoT**: HelloLambdaPermissionIotTopicRule1
    • **S3**: HelloLambdaPermissionBucketS3
    • **APIG**: HelloLambdaPermissionApiGateway
    • **SNS**: HelloLambdaPermissionTopicSNS
    • **Alexa Skill**: HelloLambdaPermissionAlexaSkill
    • **Alexa Smart Home**: HelloLambdaPermissionAlexaSmartHome1
    • **Cognito User Pool Trigger Source**: HelloLambdaPermissionCognitoUserPoolMyPoolTriggerSourceCustomMessage
    | |Events::Rule |
    • **Schedule**: {normalizedFuntionName}EventsRuleSchedule{SequentialID}
    • **CloudWatch Event**: {normalizedFuntionName}EventsRuleCloudWatchEvent{SequentialID}
    |
    • **Schedule**: HelloEventsRuleSchedule1
    • **CloudWatch Event**: HelloEventsRuleCloudWatchEvent1
    | |AWS::Logs::SubscriptionFilter | {normalizedFuntionName}LogsSubscriptionFilterCloudWatchLog{SequentialID} | HelloLogsSubscriptionFilterCloudWatchLog1 | |AWS::IoT::TopicRule | {normalizedFuntionName}IotTopicRule{SequentialID} | HelloIotTopicRule1 | From bafd7ede5ad4046f39ec04c6e23757ab952c6fee Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Fri, 29 Sep 2017 21:02:37 +0200 Subject: [PATCH 040/128] Fix failing tests --- lib/plugins/aws/deployFunction/index.js | 2 ++ lib/plugins/aws/deployFunction/index.test.js | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/plugins/aws/deployFunction/index.js b/lib/plugins/aws/deployFunction/index.js index a473d4a95..6751b1fdb 100644 --- a/lib/plugins/aws/deployFunction/index.js +++ b/lib/plugins/aws/deployFunction/index.js @@ -179,12 +179,14 @@ class AwsDeployFunction { } if ('role' in functionObj) { + console.log('functionObj'); return this.normalizeArnRole(functionObj.role).then(roleArn => { params.Role = roleArn; return this.callUpdateFunctionConfiguration(params); }); } else if ('role' in providerObj) { + console.log('providerObj'); return this.normalizeArnRole(providerObj.role).then(roleArn => { params.Role = roleArn; diff --git a/lib/plugins/aws/deployFunction/index.test.js b/lib/plugins/aws/deployFunction/index.test.js index e51eebcc0..5376c2324 100644 --- a/lib/plugins/aws/deployFunction/index.test.js +++ b/lib/plugins/aws/deployFunction/index.test.js @@ -118,6 +118,7 @@ describe('AwsDeployFunction', () => { describe('#updateFunctionConfiguration', () => { let updateFunctionConfigurationStub; + let normalizeArnRoleStub; const options = { stage: 'dev', region: 'us-east-1', @@ -131,6 +132,10 @@ describe('AwsDeployFunction', () => { updateFunctionConfigurationStub = sinon .stub(awsDeployFunction.provider, 'request') .resolves(); + + normalizeArnRoleStub = sinon + .stub(awsDeployFunction, 'normalizeArnRole') + .resolves('arn:aws:us-east-1:123456789012:role/role'); }); afterEach(() => { @@ -162,6 +167,8 @@ describe('AwsDeployFunction', () => { awsDeployFunction.options = options; return awsDeployFunction.updateFunctionConfiguration().then(() => { + expect(normalizeArnRoleStub.calledOnce).to.be.equal(true); + expect(normalizeArnRoleStub.calledWithExactly('arn:aws:iam::123456789012:role/Admin')); expect(updateFunctionConfigurationStub.calledOnce).to.be.equal(true); expect(updateFunctionConfigurationStub.calledWithExactly( 'Lambda', @@ -179,7 +186,7 @@ describe('AwsDeployFunction', () => { FunctionName: 'first', KMSKeyArn: 'arn:aws:kms:us-east-1:123456789012', MemorySize: 128, - Role: 'arn:aws:iam::123456789012:role/Admin', + Role: 'arn:aws:us-east-1:123456789012:role/role', Timeout: 3, VpcConfig: { SecurityGroupIds: ['1'], @@ -247,6 +254,8 @@ describe('AwsDeployFunction', () => { awsDeployFunction.options = options; return awsDeployFunction.updateFunctionConfiguration().then(() => { + expect(normalizeArnRoleStub.calledOnce).to.be.equal(true); + expect(normalizeArnRoleStub.calledWithExactly('role')); expect(updateFunctionConfigurationStub.calledOnce).to.be.equal(true); expect(updateFunctionConfigurationStub.calledWithExactly( 'Lambda', @@ -260,7 +269,7 @@ describe('AwsDeployFunction', () => { }, Timeout: 12, MemorySize: 512, - Role: 'role', + Role: 'arn:aws:us-east-1:123456789012:role/role', }, awsDeployFunction.options.stage, awsDeployFunction.options.region From a48ed390ea5aacedebe6de440f4303ac66a5950d Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Fri, 29 Sep 2017 22:09:33 +0200 Subject: [PATCH 041/128] Add normalizeArnRole tests --- lib/plugins/aws/deployFunction/index.js | 6 +- lib/plugins/aws/deployFunction/index.test.js | 59 ++++++++++++++++++++ 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/lib/plugins/aws/deployFunction/index.js b/lib/plugins/aws/deployFunction/index.js index 6751b1fdb..42e973683 100644 --- a/lib/plugins/aws/deployFunction/index.js +++ b/lib/plugins/aws/deployFunction/index.js @@ -83,7 +83,7 @@ class AwsDeployFunction { } const roleProperties = roleResource.Properties; - const compiledFullRoleName = `${roleProperties.Path}${roleProperties.RoleName}`; + const compiledFullRoleName = `${roleProperties.Path || '/'}${roleProperties.RoleName}`; return this.provider.getAccountId().then((accountId) => `arn:aws:iam::${accountId}:role${compiledFullRoleName}` @@ -94,7 +94,7 @@ class AwsDeployFunction { } return this.provider.getAccountId().then((accountId) => - `arn:aws:iam::${accountId}:role${role['Fn::GetAtt'][0]}` + `arn:aws:iam::${accountId}:role/${role['Fn::GetAtt'][0]}` ); } @@ -179,14 +179,12 @@ class AwsDeployFunction { } if ('role' in functionObj) { - console.log('functionObj'); return this.normalizeArnRole(functionObj.role).then(roleArn => { params.Role = roleArn; return this.callUpdateFunctionConfiguration(params); }); } else if ('role' in providerObj) { - console.log('providerObj'); return this.normalizeArnRole(providerObj.role).then(roleArn => { params.Role = roleArn; diff --git a/lib/plugins/aws/deployFunction/index.test.js b/lib/plugins/aws/deployFunction/index.test.js index 5376c2324..5331ff15f 100644 --- a/lib/plugins/aws/deployFunction/index.test.js +++ b/lib/plugins/aws/deployFunction/index.test.js @@ -116,6 +116,64 @@ describe('AwsDeployFunction', () => { }); }); + describe('#normalizeArnRole', () => { + let getAccountIdStub; + + beforeEach(() => { + getAccountIdStub = sinon + .stub(awsDeployFunction.provider, 'getAccountId') + .resolves('123456789012'); + + serverless.service.resources = { + Resources: { + MyCustomRole: { + Type: 'AWS::IAM::Role', + Properties: { + RoleName: 'role_123', + }, + }, + }, + }; + }); + + afterEach(() => { + awsDeployFunction.provider.getAccountId.restore(); + serverless.service.resources = undefined; + }); + + it('should return unmodified ARN if ARN was provided', () => { + const arn = 'arn:aws:iam::123456789012:role/role'; + + return awsDeployFunction.normalizeArnRole(arn).then((result) => { + expect(getAccountIdStub.calledOnce).to.be.equal(false); + expect(result).to.be.equal(arn); + }); + }); + + it('should return compiled ARN if role name was provided', () => { + const roleName = 'MyCustomRole'; + + return awsDeployFunction.normalizeArnRole(roleName).then((result) => { + expect(getAccountIdStub.calledOnce).to.be.equal(true); + expect(result).to.be.equal('arn:aws:iam::123456789012:role/role_123'); + }); + }); + + it('should return compiled ARN if object role was provided', () => { + const roleObj = { + 'Fn::GetAtt': [ + 'role_123', + 'arn', + ], + }; + + return awsDeployFunction.normalizeArnRole(roleObj).then((result) => { + expect(getAccountIdStub.calledOnce).to.be.equal(true); + expect(result).to.be.equal('arn:aws:iam::123456789012:role/role_123'); + }); + }); + }); + describe('#updateFunctionConfiguration', () => { let updateFunctionConfigurationStub; let normalizeArnRoleStub; @@ -140,6 +198,7 @@ describe('AwsDeployFunction', () => { afterEach(() => { awsDeployFunction.provider.request.restore(); + awsDeployFunction.normalizeArnRole.restore(); awsDeployFunction.serverless.service.provider.timeout = undefined; awsDeployFunction.serverless.service.provider.memorySize = undefined; awsDeployFunction.serverless.service.provider.role = undefined; From db97a5fd2fdca7c48c87cc42c0c9e41f26709b06 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Fri, 29 Sep 2017 22:18:58 +0200 Subject: [PATCH 042/128] Fix edge case with implicit root path --- lib/plugins/aws/deployFunction/index.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/plugins/aws/deployFunction/index.js b/lib/plugins/aws/deployFunction/index.js index 42e973683..8aad56291 100644 --- a/lib/plugins/aws/deployFunction/index.js +++ b/lib/plugins/aws/deployFunction/index.js @@ -93,9 +93,10 @@ class AwsDeployFunction { return BbPromise.resolve(role); } - return this.provider.getAccountId().then((accountId) => - `arn:aws:iam::${accountId}:role/${role['Fn::GetAtt'][0]}` - ); + return this.provider.getAccountId().then((accountId) => { + const delimeter = role['Fn::GetAtt'][0][0] === '/' ? '' : '/'; + return `arn:aws:iam::${accountId}:role${delimeter}${role['Fn::GetAtt'][0]}`; + }); } callUpdateFunctionConfiguration(params) { From a0833cfbda972d9f74660dc13d00561977b28281 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Fri, 29 Sep 2017 22:24:56 +0200 Subject: [PATCH 043/128] Add implicit private = false test --- .../events/apiGateway/lib/method/index.test.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.test.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.test.js index c81ed7edb..5811f7312 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.test.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.test.js @@ -538,6 +538,24 @@ describe('#compileMethods()', () => { }); }); + it('should set api key as not required if private property is not specified', () => { + awsCompileApigEvents.validated.events = [ + { + functionName: 'First', + http: { + path: 'users/create', + method: 'post', + }, + }, + ]; + return awsCompileApigEvents.compileMethods().then(() => { + expect( + awsCompileApigEvents.serverless.service.provider.compiledCloudFormationTemplate + .Resources.ApiGatewayMethodUsersCreatePost.Properties.ApiKeyRequired + ).to.equal(false); + }); + }); + it('should set the correct lambdaUri', () => { awsCompileApigEvents.validated.events = [ { From c3df4b085eca0b74c040477f5fd83ec06e89a71d Mon Sep 17 00:00:00 2001 From: Ulili Date: Sun, 1 Oct 2017 23:02:21 -0300 Subject: [PATCH 044/128] Update IBM registration URL --- docs/providers/openwhisk/guide/quick-start.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers/openwhisk/guide/quick-start.md b/docs/providers/openwhisk/guide/quick-start.md index 79afc26e1..a62bf6419 100644 --- a/docs/providers/openwhisk/guide/quick-start.md +++ b/docs/providers/openwhisk/guide/quick-start.md @@ -13,7 +13,7 @@ layout: Doc 1. Node.js `v6.5.0` or later. 2. Serverless CLI `v1.9.0` or later. You can run `npm install -g serverless` to install it. -3. An IBM Bluemix account. If you don't already have one, you can sign up for an [account](https://aws.amazon.com/s/dm/optimization/server-side-test/free-tier/free_np/) and then follow the instructions for getting access to [OpenWhisk on Bluemix](https://console.ng.bluemix.net/openwhisk/). +3. An IBM Bluemix account. If you don't already have one, you can sign up for an [account](https://console.bluemix.net/registration/) and then follow the instructions for getting access to [OpenWhisk on Bluemix](https://console.ng.bluemix.net/openwhisk/). 4. **Set-up your [Provider Credentials](./credentials.md)**. 5. Install Framework & Dependencies *Due to an [outstanding issue](https://github.com/serverless/serverless/issues/2895) with provider plugins, the [OpenWhisk provider](https://github.com/serverless/serverless-openwhisk) must be installed as a global module.* From f4b0752f4e527f3985f09a97d8cdb99ffa24c45d Mon Sep 17 00:00:00 2001 From: Boaz de Jong Date: Mon, 2 Oct 2017 16:35:18 +0800 Subject: [PATCH 045/128] ResourcesGuide: Specify resource type Specify type in example for overwriting resource. --- docs/providers/aws/guide/resources.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/providers/aws/guide/resources.md b/docs/providers/aws/guide/resources.md index f8741ecbe..0fc8bb3be 100644 --- a/docs/providers/aws/guide/resources.md +++ b/docs/providers/aws/guide/resources.md @@ -111,6 +111,7 @@ functions: resources: Resources: WriteDashPostLogGroup: + Type: AWS::Logs::LogGroup Properties: RetentionInDays: "30" ``` From ebdc522c5a3f2dfba4db133139ad3ba414ec60de Mon Sep 17 00:00:00 2001 From: Mariusz Nowak Date: Tue, 3 Oct 2017 15:07:26 +0200 Subject: [PATCH 046/128] Bump bluebird version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b36f1b0ae..8c382e2b9 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "archiver": "^1.1.0", "async": "^1.5.2", "aws-sdk": "^2.75.0", - "bluebird": "^3.4.0", + "bluebird": "^3.5.0", "chalk": "^2.0.0", "ci-info": "^1.1.1", "download": "^5.0.2", From 60662f04819ce02305ce1dddc7197173901715fb Mon Sep 17 00:00:00 2001 From: Mariusz Nowak Date: Tue, 3 Oct 2017 15:09:42 +0200 Subject: [PATCH 047/128] Enable bluebird long stack traces only in SLS_DEBUG mode --- bin/serverless | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/bin/serverless b/bin/serverless index d87b19226..bb59dae19 100755 --- a/bin/serverless +++ b/bin/serverless @@ -10,9 +10,12 @@ const initializeErrorReporter = require('../lib/utils/sentry').initializeErrorRe Error.stackTraceLimit = Infinity; -BbPromise.config({ - longStackTraces: true, -}); +if (process.env.SLS_DEBUG) { + // For performance reasons enabled only in SLS_DEBUG mode + BbPromise.config({ + longStackTraces: true, + }); +} process.on('unhandledRejection', (e) => { logError(e); From 924ad118a5cae923191de20e17fcb7637beaf41b Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Tue, 3 Oct 2017 13:49:15 -0700 Subject: [PATCH 048/128] updating docs --- docs/providers/spotinst/cli-reference/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers/spotinst/cli-reference/README.md b/docs/providers/spotinst/cli-reference/README.md index 87cb241ee..f4efe854c 100755 --- a/docs/providers/spotinst/cli-reference/README.md +++ b/docs/providers/spotinst/cli-reference/README.md @@ -14,4 +14,4 @@ Welcome to the Serverless Spotinst Functions CLI Reference! Please select a section on the left to get started. -**Note:** Before continuing [Spotinst Functions credentials](../guide/credentials.md) are required for using the CLI. +**Note:** Before continuing [Spotinst Functions credentials](../guide/credentials.md) are required for using the CLI.. From 5c426ecf6eff0efd0f9f1fdccf0b78ed7fca64e1 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Tue, 3 Oct 2017 14:49:29 -0700 Subject: [PATCH 049/128] updating spotinst homepage readme --- docs/providers/spotinst/README.md | 92 ++++++++++++++----- .../spotinst/cli-reference/README.md | 2 +- docs/providers/spotinst/events/schedule.md | 6 +- docs/providers/spotinst/guide/permissions.md | 0 4 files changed, 74 insertions(+), 26 deletions(-) create mode 100644 docs/providers/spotinst/guide/permissions.md diff --git a/docs/providers/spotinst/README.md b/docs/providers/spotinst/README.md index 0672b9785..0f6cb3497 100755 --- a/docs/providers/spotinst/README.md +++ b/docs/providers/spotinst/README.md @@ -1,6 +1,6 @@ @@ -14,28 +14,72 @@ Welcome to the Serverless Spotinst documentation! If you have questions, join the [chat in gitter](https://gitter.im/serverless/serverless) or [post over on the forums](https://forum.serverless.com/) -## Getting Started + diff --git a/docs/providers/spotinst/cli-reference/README.md b/docs/providers/spotinst/cli-reference/README.md index f4efe854c..87cb241ee 100755 --- a/docs/providers/spotinst/cli-reference/README.md +++ b/docs/providers/spotinst/cli-reference/README.md @@ -14,4 +14,4 @@ Welcome to the Serverless Spotinst Functions CLI Reference! Please select a section on the left to get started. -**Note:** Before continuing [Spotinst Functions credentials](../guide/credentials.md) are required for using the CLI.. +**Note:** Before continuing [Spotinst Functions credentials](../guide/credentials.md) are required for using the CLI. diff --git a/docs/providers/spotinst/events/schedule.md b/docs/providers/spotinst/events/schedule.md index 19621cbeb..6c8c5511b 100755 --- a/docs/providers/spotinst/events/schedule.md +++ b/docs/providers/spotinst/events/schedule.md @@ -12,14 +12,18 @@ layout: Doc # Schedule -You can trigger the functions by using a scheduled event. This will execute the function according to the cron expressions you specify +You can trigger the functions by using a scheduled event. This will execute the function according to the cron expressions you specify. You can either use the `rate` or `cron` syntax. +The following two examples are function configurations in the serverless.yml file that are scheduled to trigger the function crawl every 2 hours. You are able to attach more than one schedule to a function. + + ```yml functions: crawl: handler: crawl events: + - schedule: rate(2 hours) - schedule: cron(0 12 * * ? *) ``` diff --git a/docs/providers/spotinst/guide/permissions.md b/docs/providers/spotinst/guide/permissions.md new file mode 100644 index 000000000..e69de29bb From dc5a33c667c8256e6cdca4d1378baf55b7d3864f Mon Sep 17 00:00:00 2001 From: Takahiro Horike Date: Wed, 4 Oct 2017 09:02:55 +0900 Subject: [PATCH 050/128] drop the complex integration test --- .travis.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 81590be86..abb99c87c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,13 +23,6 @@ matrix: - SLS_IGNORE_WARNING=* - secure: Ia2nYzOeYvTE6qOP7DBKX3BO7s/U7TXdsvB2nlc3kOPFi//IbTVD0/cLKCAE5XqTzrrliHINSVsFcJNSfjCwmDSRmgoIGrHj5CJkWpkI6FEPageo3mdqFQYEc8CZeAjsPBNaHe6Ewzg0Ev/sjTByLSJYVqokzDCF1QostSxx1Ss6SGt1zjxeP/Hp4yOJn52VAm9IHAKYn7Y62nMAFTaaTPUQHvW0mJj6m2Z8TWyPU+2Bx6mliO65gTPFGs+PdHGwHtmSF/4IcUO504x+HjDuwzW2itomLXZmIOFfGDcFYadKWzVMAfJzoRWOcVKF4jXdMoSCOviWpHGtK35E7K956MTXkroVoWCS7V0knQDovbRZj8c8td8mS4tdprUA+TzgZoHet2atWNtMuTh79rdmwoAO+IAWJegYj62Tdfy3ycESzY+KxSaV8kysG9sR3PRFoWjZerA7MhLZEzQMORXDGjJlgwLaZfYVqjlsGe5p5etFBUTd0WbFgSwOKLoA2U/fm7WzqItkjs3UWaHuvFVvwYixGxjEVmVczS6wa2cdGpHtVD9H7km4fPEzljHqQ26v0P5e8eylgqLF2IB6mL7UqGFrAtrMvAgN/M3gnq4dTs/wq1AJIOxEP7YW7kc0NAldk8vUz6t5GzCPNcuukxAku91Awnh0twxgUywatgJLZPY= - secure: Dgaa5XIsA5Vbw/CYQLUAuVVsDX26C8+f1XYGwsbNmFQKbKvM8iy9lGrHlfrT3jftJkJH6re8tP1RjyZjjzLe25KPk4Tps7grNteCyiIIEDsC2aHhiXHD6zNHsItpxYusaFfyQinFWnK4CAYKWb9ZNIwHIDUIB4vq807QGAhYsnoj1Lg/ajWvtEKBwYjEzDz9OjB91lw7lpCnHtmKKw5A+TNIVGpDDZ/jRBqETsPaePtiXC9UTHZQyM3gFoeVXiJw9KSU/gjIx9REihCaWWPbnuQSeIONGGlVWY9V4DTZIsJr9/uwDcbioeXDD3G1ezGtNPPRSNTtq08QlUtE4mEtKea/+ObpllKZCeZGn6AJhMn+uqMIP95FFlqBB55YzRcLZY+Igi/qm/9LJ9RinAhxRVXiwzeQ+BdVA6jshAAzr+7wklux6lZAa0xGw9pgTv7MI4RP2LJ/LMP1ppFsnv9n/qt93Ax1VEwEu3xHZe3VTYL9tbXOPTZutf6fKjUrW7wSSuy637queESjYnnPKSb1vZcPxjSFlyh+GJvxu/3PurF9aqfiBdiorIBre+pQS4lakLtoft5nsbA+4iYUwrXR58qUPVUqQ7a0A0hedOWlp6g9ixLa6nugUP5aobJzR71T8l/IjqpnY2EEd/iINEb0XfUiZtB5zHaqFWejBtmWwCI= - - node_js: '6.2' - env: - - INTEGRATION_TEST=true - - INTEGRATION_TEST_SUITE=complex - - SLS_IGNORE_WARNING=* - - secure: Ia2nYzOeYvTE6qOP7DBKX3BO7s/U7TXdsvB2nlc3kOPFi//IbTVD0/cLKCAE5XqTzrrliHINSVsFcJNSfjCwmDSRmgoIGrHj5CJkWpkI6FEPageo3mdqFQYEc8CZeAjsPBNaHe6Ewzg0Ev/sjTByLSJYVqokzDCF1QostSxx1Ss6SGt1zjxeP/Hp4yOJn52VAm9IHAKYn7Y62nMAFTaaTPUQHvW0mJj6m2Z8TWyPU+2Bx6mliO65gTPFGs+PdHGwHtmSF/4IcUO504x+HjDuwzW2itomLXZmIOFfGDcFYadKWzVMAfJzoRWOcVKF4jXdMoSCOviWpHGtK35E7K956MTXkroVoWCS7V0knQDovbRZj8c8td8mS4tdprUA+TzgZoHet2atWNtMuTh79rdmwoAO+IAWJegYj62Tdfy3ycESzY+KxSaV8kysG9sR3PRFoWjZerA7MhLZEzQMORXDGjJlgwLaZfYVqjlsGe5p5etFBUTd0WbFgSwOKLoA2U/fm7WzqItkjs3UWaHuvFVvwYixGxjEVmVczS6wa2cdGpHtVD9H7km4fPEzljHqQ26v0P5e8eylgqLF2IB6mL7UqGFrAtrMvAgN/M3gnq4dTs/wq1AJIOxEP7YW7kc0NAldk8vUz6t5GzCPNcuukxAku91Awnh0twxgUywatgJLZPY= - - secure: Dgaa5XIsA5Vbw/CYQLUAuVVsDX26C8+f1XYGwsbNmFQKbKvM8iy9lGrHlfrT3jftJkJH6re8tP1RjyZjjzLe25KPk4Tps7grNteCyiIIEDsC2aHhiXHD6zNHsItpxYusaFfyQinFWnK4CAYKWb9ZNIwHIDUIB4vq807QGAhYsnoj1Lg/ajWvtEKBwYjEzDz9OjB91lw7lpCnHtmKKw5A+TNIVGpDDZ/jRBqETsPaePtiXC9UTHZQyM3gFoeVXiJw9KSU/gjIx9REihCaWWPbnuQSeIONGGlVWY9V4DTZIsJr9/uwDcbioeXDD3G1ezGtNPPRSNTtq08QlUtE4mEtKea/+ObpllKZCeZGn6AJhMn+uqMIP95FFlqBB55YzRcLZY+Igi/qm/9LJ9RinAhxRVXiwzeQ+BdVA6jshAAzr+7wklux6lZAa0xGw9pgTv7MI4RP2LJ/LMP1ppFsnv9n/qt93Ax1VEwEu3xHZe3VTYL9tbXOPTZutf6fKjUrW7wSSuy637queESjYnnPKSb1vZcPxjSFlyh+GJvxu/3PurF9aqfiBdiorIBre+pQS4lakLtoft5nsbA+4iYUwrXR58qUPVUqQ7a0A0hedOWlp6g9ixLa6nugUP5aobJzR71T8l/IjqpnY2EEd/iINEb0XfUiZtB5zHaqFWejBtmWwCI= - node_js: '6.2' env: - DISABLE_TESTS=true @@ -44,7 +37,6 @@ script: - if [[ -z "$INTEGRATION_TEST" && -z "$DISABLE_TESTS" ]]; then npm test; fi - if [[ ! -z "$DISABLE_TESTS" && ! -z "$LINTING" && -z "$INTEGRATION_TEST" ]]; then npm run lint; fi - if [[ ! -z "$INTEGRATION_TEST" && ! -z ${AWS_ACCESS_KEY_ID+x} && "$INTEGRATION_TEST_SUITE" == "simple" ]]; then npm run simple-integration-test; fi - - if [[ ! -z "$INTEGRATION_TEST" && ! -z ${AWS_ACCESS_KEY_ID+x} && "$INTEGRATION_TEST_SUITE" == "complex" && "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" ]]; then npm run complex-integration-test; fi after_success: - cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage From f636f4f73676a220d6d32e68007a45f2d50f60ab Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Tue, 3 Oct 2017 17:07:24 -0700 Subject: [PATCH 051/128] added permissions to the guide, created hello world examples, updated main readme --- docs/providers/spotinst/README.md | 9 ++-- docs/providers/spotinst/events/schedule.md | 24 ++++++++++ docs/providers/spotinst/examples/README.md | 18 ++++++++ .../spotinst/examples/node/README.md | 45 +++++++++++++++++++ .../spotinst/examples/node/handler.js | 25 +++++++++++ .../spotinst/examples/node/package.json | 13 ++++++ .../spotinst/examples/node/serverless.yml | 31 +++++++++++++ .../spotinst/examples/python/README.md | 45 +++++++++++++++++++ .../spotinst/examples/python/handler.py | 14 ++++++ .../spotinst/examples/python/package.json | 13 ++++++ .../spotinst/examples/python/serverless.yml | 31 +++++++++++++ docs/providers/spotinst/guide/permissions.md | 24 ++++++++++ 12 files changed, 288 insertions(+), 4 deletions(-) create mode 100644 docs/providers/spotinst/examples/README.md create mode 100644 docs/providers/spotinst/examples/node/README.md create mode 100644 docs/providers/spotinst/examples/node/handler.js create mode 100644 docs/providers/spotinst/examples/node/package.json create mode 100644 docs/providers/spotinst/examples/node/serverless.yml create mode 100644 docs/providers/spotinst/examples/python/README.md create mode 100644 docs/providers/spotinst/examples/python/handler.py create mode 100644 docs/providers/spotinst/examples/python/package.json create mode 100644 docs/providers/spotinst/examples/python/serverless.yml diff --git a/docs/providers/spotinst/README.md b/docs/providers/spotinst/README.md index 0f6cb3497..832e47a89 100755 --- a/docs/providers/spotinst/README.md +++ b/docs/providers/spotinst/README.md @@ -1,6 +1,6 @@ @@ -25,6 +25,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se @@ -71,13 +72,13 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    diff --git a/docs/providers/spotinst/events/schedule.md b/docs/providers/spotinst/events/schedule.md index 6c8c5511b..7dd5d49f7 100755 --- a/docs/providers/spotinst/events/schedule.md +++ b/docs/providers/spotinst/events/schedule.md @@ -27,3 +27,27 @@ functions: - schedule: rate(2 hours) - schedule: cron(0 12 * * ? *) ``` + + +## Active Status + +You also have the option to set your functions active status as either true or false + +**Note** `schedule` events active status are set to true by default + +This example will create and attach a schedule event for the function `crawl` which is active status is set to `false`. If the status is changed to true the `crawl` function will be called every 10 minutes. + +```yml +functions: + crawl: + handler: crawl + events: + - schedule: + rate: rate(10 minutes) + active: false + +``` + + +## Value + diff --git a/docs/providers/spotinst/examples/README.md b/docs/providers/spotinst/examples/README.md new file mode 100644 index 000000000..1767a48b1 --- /dev/null +++ b/docs/providers/spotinst/examples/README.md @@ -0,0 +1,18 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/aws/examples/hello-world/) + + +# Hello World Serverless Example + +Pick your language of choice: + +* [JavaScript](./node) +* [Python](./python) + diff --git a/docs/providers/spotinst/examples/node/README.md b/docs/providers/spotinst/examples/node/README.md new file mode 100644 index 000000000..40b59a494 --- /dev/null +++ b/docs/providers/spotinst/examples/node/README.md @@ -0,0 +1,45 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/spotinst/node) + + +# Hello World JavaScript Example + +Make sure `serverless` is installed. + +## 1. Create a service +`serverless create --template spotinst-nodejs --path serviceName` `serviceName` is going to be a new directory there the python template will be loaded. Once the download is complete change into that directory + +## 2. Deploy +`serverless deploy` + +## 3. Invoke deployed function +`serverless invoke --function hello` + +In your terminal window you should see the response + +```bash +{ +Deploy functions: +hello: created +Service Information +service: spotinst-python +functions: + hello +} +``` + +Congrats you have just deployed and ran your Hello World function! + +## Short Hand Guide + +`sls` is short hand for serverless cli commands +`-f` is short hand for `--function` +`-t` is short hand for `--template` +`-p` is short hang for `--path` \ No newline at end of file diff --git a/docs/providers/spotinst/examples/node/handler.js b/docs/providers/spotinst/examples/node/handler.js new file mode 100644 index 000000000..56ada204c --- /dev/null +++ b/docs/providers/spotinst/examples/node/handler.js @@ -0,0 +1,25 @@ +/* + * + * Implement your function here. + * The function will get the request as a parameter with query/body properties: + * var queryparams = req.query; + * var body = req.body; + * + * The function should return a Promise that resolves with the following structure: + * resolve({ + * statusCode: 200, + * body: '{"hello":"from NodeJS4.8 function"}', + * headers: {"Content-Type": "application/json"} + * }) + * + */ + +exports.main = function main (req, res) { + // The function should return a Promise. + return new Promise(function(resolve, reject){ + return resolve({ + statusCode: 200, + body: `hello ${req.query.name || "world"}!` + }); + }); +}; diff --git a/docs/providers/spotinst/examples/node/package.json b/docs/providers/spotinst/examples/node/package.json new file mode 100644 index 000000000..ccfcb802d --- /dev/null +++ b/docs/providers/spotinst/examples/node/package.json @@ -0,0 +1,13 @@ +{ + "name": "spotionst-nodejs", + "version": "1.0.0", + "description": "Spotinst Functions NodeJS sample for serverless framework service.", + "main": "handler.js", + "keywords": [ + "serverless", + "spotinst" + ], + "dependencies": { + "serverless-spotinst-functions": "*" + } +} diff --git a/docs/providers/spotinst/examples/node/serverless.yml b/docs/providers/spotinst/examples/node/serverless.yml new file mode 100644 index 000000000..5b6231275 --- /dev/null +++ b/docs/providers/spotinst/examples/node/serverless.yml @@ -0,0 +1,31 @@ +# Welcome to Serverless! +# +# This file is the main config file for your service. +# It's very minimal at this point and uses default values. +# You can always add more config options for more control. +# We've included some commented out config examples here. +# Just uncomment any of them to get that config option. +# +# For full config options, check the docs: +# docs.serverless.com +# +# Happy Coding! + +service: spotinst-nodejs # NOTE: update this with your service name + +provider: + name: spotinst + spotinst: + #environment: # NOTE: Remember to add the environment ID + +functions: + hello: + runtime: nodejs4.8 + handler: handler.main + memory: 128 + timeout: 30 + +# extend the framework using plugins listed here: +# https://github.com/serverless/plugins +plugins: + - serverless-spotinst-functions diff --git a/docs/providers/spotinst/examples/python/README.md b/docs/providers/spotinst/examples/python/README.md new file mode 100644 index 000000000..d716b56ed --- /dev/null +++ b/docs/providers/spotinst/examples/python/README.md @@ -0,0 +1,45 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/spotinst/examples/python/) + + +# Hello World Python Example + +Make sure `serverless` is installed. + +## 1. Create a service +`serverless create --template spotinst-python --path serviceName` `serviceName` is going to be a new directory there the python template will be loaded. Once the download is complete change into that directory + +## 2. Deploy +`serverless deploy` + +## 3. Invoke deployed function +`serverless invoke --function hello` + +In your terminal window you should see the response + +```bash +{ +Deploy functions: +hello: created +Service Information +service: spotinst-python +functions: + hello +} +``` + +Congrats you have just deployed and ran your Hello World function! + +## Short Hand Guide + +`sls` is short hand for serverless cli commands +`-f` is short hand for `--function` +`-t` is short hand for `--template` +`-p` is short hang for `--path` \ No newline at end of file diff --git a/docs/providers/spotinst/examples/python/handler.py b/docs/providers/spotinst/examples/python/handler.py new file mode 100644 index 000000000..9b6df147f --- /dev/null +++ b/docs/providers/spotinst/examples/python/handler.py @@ -0,0 +1,14 @@ +# Implement your function here. +# The function will get the request as parameter. +# The function should return an object + + +def main(args): + queryparams = args.get("query", {}) + body = args.get("body", {}) + + return { + 'statusCode': 200, + 'body': '{"hello":"from Python2.7 function"}', + 'headers': {"Content-Type": "application/json"} + } diff --git a/docs/providers/spotinst/examples/python/package.json b/docs/providers/spotinst/examples/python/package.json new file mode 100644 index 000000000..a7aed6929 --- /dev/null +++ b/docs/providers/spotinst/examples/python/package.json @@ -0,0 +1,13 @@ +{ + "name": "spotionst-python", + "version": "1.0.0", + "description": "Spotinst Functions Python sample for serverless framework service.", + "main": "handler.js", + "keywords": [ + "serverless", + "spotinst" + ], + "dependencies": { + "serverless-spotinst-functions": "*" + } +} diff --git a/docs/providers/spotinst/examples/python/serverless.yml b/docs/providers/spotinst/examples/python/serverless.yml new file mode 100644 index 000000000..58cd69d69 --- /dev/null +++ b/docs/providers/spotinst/examples/python/serverless.yml @@ -0,0 +1,31 @@ +# Welcome to Serverless! +# +# This file is the main config file for your service. +# It's very minimal at this point and uses default values. +# You can always add more config options for more control. +# We've included some commented out config examples here. +# Just uncomment any of them to get that config option. +# +# For full config options, check the docs: +# docs.serverless.com +# +# Happy Coding! + +service: spotinst-python # NOTE: update this with your service name + +provider: + name: spotinst + spotinst: + #environment: # NOTE: Remember to add the environment ID + +functions: + hello: + runtime: python2.7 + handler: handler.main + memory: 128 + timeout: 30 + +# extend the framework using plugins listed here: +# https://github.com/serverless/plugins +plugins: + - serverless-spotinst-functions diff --git a/docs/providers/spotinst/guide/permissions.md b/docs/providers/spotinst/guide/permissions.md index e69de29bb..0c01ea1d9 100644 --- a/docs/providers/spotinst/guide/permissions.md +++ b/docs/providers/spotinst/guide/permissions.md @@ -0,0 +1,24 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/spotinst/guide/intro) + + +# Spotinst - Permissions + +Serverless functions can have to optional access permissions to either public or private. A public function is accessable from anywhere, while private access can only be triggered by authorized machines. + +The following is an example of how a private function would be set up in the serverless.yml file + +``` + functions: + hello: + handler: heandler.main + access: private +``` From 4a2191baebe383183abb52216edc0cf36df36a04 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Tue, 3 Oct 2017 17:21:56 -0700 Subject: [PATCH 052/128] updating spotinst pictures --- docs/providers/spotinst/README.md | 8 ++++---- docs/providers/spotinst/examples/node/README.md | 10 +++++----- docs/providers/spotinst/examples/python/README.md | 10 +++++----- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/providers/spotinst/README.md b/docs/providers/spotinst/README.md index 832e47a89..2fb1cc82f 100755 --- a/docs/providers/spotinst/README.md +++ b/docs/providers/spotinst/README.md @@ -18,7 +18,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    @@ -34,7 +34,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    @@ -58,7 +58,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    @@ -72,7 +72,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    diff --git a/docs/providers/spotinst/examples/node/README.md b/docs/providers/spotinst/examples/node/README.md index 40b59a494..b10a16f67 100644 --- a/docs/providers/spotinst/examples/node/README.md +++ b/docs/providers/spotinst/examples/node/README.md @@ -6,7 +6,7 @@ layout: Doc --> -### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/spotinst/node) +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/spotinst/) # Hello World JavaScript Example @@ -27,11 +27,11 @@ In your terminal window you should see the response ```bash { Deploy functions: -hello: created + hello: created Service Information -service: spotinst-python -functions: - hello + service: spotinst-python + functions: + hello } ``` diff --git a/docs/providers/spotinst/examples/python/README.md b/docs/providers/spotinst/examples/python/README.md index d716b56ed..e6d30079f 100644 --- a/docs/providers/spotinst/examples/python/README.md +++ b/docs/providers/spotinst/examples/python/README.md @@ -6,7 +6,7 @@ layout: Doc --> -### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/spotinst/examples/python/) +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/spotinst/) # Hello World Python Example @@ -27,11 +27,11 @@ In your terminal window you should see the response ```bash { Deploy functions: -hello: created + hello: created Service Information -service: spotinst-python -functions: - hello + service: spotinst-python + functions: + hello } ``` From bd55c3dda132bd7ff6f885121f563a04129c8696 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Tue, 3 Oct 2017 17:22:52 -0700 Subject: [PATCH 053/128] reverting the pictures --- docs/providers/spotinst/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/providers/spotinst/README.md b/docs/providers/spotinst/README.md index 2fb1cc82f..832e47a89 100755 --- a/docs/providers/spotinst/README.md +++ b/docs/providers/spotinst/README.md @@ -18,7 +18,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    @@ -34,7 +34,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    @@ -58,7 +58,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    @@ -72,7 +72,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    From 84fa89e24c4daf8ea0beb6cb6a91c1bce6876c54 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Tue, 3 Oct 2017 17:24:14 -0700 Subject: [PATCH 054/128] forgot the .md on link --- docs/providers/spotinst/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers/spotinst/README.md b/docs/providers/spotinst/README.md index 832e47a89..24b80410f 100755 --- a/docs/providers/spotinst/README.md +++ b/docs/providers/spotinst/README.md @@ -25,7 +25,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    From 331203945fdf90fa9ec6c2b35198eee7e1814eef Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Tue, 3 Oct 2017 17:31:24 -0700 Subject: [PATCH 055/128] adding ruby hello world example from template --- .../spotinst/examples/ruby/README.md | 45 +++++++++++++++++++ .../spotinst/examples/ruby/handler.rb | 14 ++++++ .../spotinst/examples/ruby/package.json | 13 ++++++ .../spotinst/examples/ruby/serverless.yml | 36 +++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 docs/providers/spotinst/examples/ruby/README.md create mode 100644 docs/providers/spotinst/examples/ruby/handler.rb create mode 100644 docs/providers/spotinst/examples/ruby/package.json create mode 100644 docs/providers/spotinst/examples/ruby/serverless.yml diff --git a/docs/providers/spotinst/examples/ruby/README.md b/docs/providers/spotinst/examples/ruby/README.md new file mode 100644 index 000000000..f276d2da6 --- /dev/null +++ b/docs/providers/spotinst/examples/ruby/README.md @@ -0,0 +1,45 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/spotinst/) + + +# Hello World Ruby Example + +Make sure `serverless` is installed. + +## 1. Create a service +`serverless create --template spotinst-ruby --path serviceName` `serviceName` is going to be a new directory there the python template will be loaded. Once the download is complete change into that directory + +## 2. Deploy +`serverless deploy` + +## 3. Invoke deployed function +`serverless invoke --function hello` + +In your terminal window you should see the response + +```bash +{ +Deploy functions: + hello: created +Service Information + service: spotinst-ruby + functions: + hello +} +``` + +Congrats you have just deployed and ran your Hello World function! + +## Short Hand Guide + +`sls` is short hand for serverless cli commands +`-f` is short hand for `--function` +`-t` is short hand for `--template` +`-p` is short hang for `--path` \ No newline at end of file diff --git a/docs/providers/spotinst/examples/ruby/handler.rb b/docs/providers/spotinst/examples/ruby/handler.rb new file mode 100644 index 000000000..55a9e7455 --- /dev/null +++ b/docs/providers/spotinst/examples/ruby/handler.rb @@ -0,0 +1,14 @@ + +# Implement your function here. +# The function will get the request as parameter. +# The function should return an Hash + +def main(args) + queryparams = args["query"] + body = args["body"] + + { + :statusCode => 200, + :body => '{"hello":"from Ruby2.4.1 function"}' + } +end \ No newline at end of file diff --git a/docs/providers/spotinst/examples/ruby/package.json b/docs/providers/spotinst/examples/ruby/package.json new file mode 100644 index 000000000..8748ab56c --- /dev/null +++ b/docs/providers/spotinst/examples/ruby/package.json @@ -0,0 +1,13 @@ +{ + "name": "spotionst-ruby", + "version": "1.0.0", + "description": "Spotinst Functions Ruby sample for serverless framework service.", + "main": "handler.js", + "keywords": [ + "serverless", + "spotinst" + ], + "dependencies": { + "serverless-spotinst-functions": "*" + } +} \ No newline at end of file diff --git a/docs/providers/spotinst/examples/ruby/serverless.yml b/docs/providers/spotinst/examples/ruby/serverless.yml new file mode 100644 index 000000000..ff1aca4bb --- /dev/null +++ b/docs/providers/spotinst/examples/ruby/serverless.yml @@ -0,0 +1,36 @@ +# Welcome to Serverless! +# +# This file is the main config file for your service. +# It's very minimal at this point and uses default values. +# You can always add more config options for more control. +# We've included some commented out config examples here. +# Just uncomment any of them to get that config option. +# +# For full config options, check the docs: +# docs.serverless.com +# +# Happy Coding! + +service: spotinst-ruby # NOTE: update this with your service name + +provider: + name: spotinst + spotinst: + #environment: # NOTE: Remember to add the environment ID + +functions: + hello: + runtime: ruby2.4.1 + handler: handler.main + memory: 128 + timeout: 30 + access: private +# cron: # Setup scheduled trigger with cron expression +# active: true +# value: * * * * * + + +# extend the framework using plugins listed here: +# https://github.com/serverless/plugins +plugins: + - serverless-spotinst-functions \ No newline at end of file From c0cc7b4ffc46d1d6bea07c0ea64b2691377a2e41 Mon Sep 17 00:00:00 2001 From: Mariusz Nowak Date: Wed, 4 Oct 2017 08:28:14 +0200 Subject: [PATCH 056/128] Bring back getFileContent method --- lib/plugins/package/lib/zipService.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index 23341400d..c36145e56 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -102,7 +102,7 @@ module.exports = { ); return Promise.all([ // Get file contents and stat in parallel - fs.readFileAsync(fullPath), + this.getFileContent(fullPath), fs.statAsync(fullPath), ]).then((result) => ({ data: result[0], @@ -110,6 +110,10 @@ module.exports = { filePath, })); }, + + getFileContent(fullPath) { + return fs.readFileAsync(fullPath); + }, }; // eslint-disable-next-line From 5181fae73e6f2608cbb0be58014f07164ba3e135 Mon Sep 17 00:00:00 2001 From: Mariusz Nowak Date: Wed, 4 Oct 2017 08:37:05 +0200 Subject: [PATCH 057/128] Configure getFileContent test --- lib/plugins/package/lib/zipService.test.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lib/plugins/package/lib/zipService.test.js b/lib/plugins/package/lib/zipService.test.js index 25d42df26..cbf8498e1 100644 --- a/lib/plugins/package/lib/zipService.test.js +++ b/lib/plugins/package/lib/zipService.test.js @@ -89,6 +89,27 @@ describe('zipService', () => { }); }); + describe('#getFileContent()', () => { + let servicePath; + + beforeEach(() => { + servicePath = serverless.config.servicePath; + fs.mkdirSync(servicePath); + }); + + it('should keep the file content as is', () => { + const buf = new Buffer([10, 20, 30, 40, 50]); + const filePath = path.join(servicePath, 'bin-file'); + + fs.writeFileSync(filePath, buf); + + return expect(packagePlugin.getFileContent(filePath)).to.be.fulfilled + .then((result) => { + expect(result).to.deep.equal(buf); + }); + }); + }); + describe('#excludeDevDependencies()', () => { it('should resolve when opted out of dev dependency exclusion', () => { packagePlugin.serverless.service.package.excludeDevDependencies = false; From 6dde0207332101a52fec4862b0bf9bdbcd77d612 Mon Sep 17 00:00:00 2001 From: Mariusz Nowak Date: Wed, 4 Oct 2017 08:38:39 +0200 Subject: [PATCH 058/128] Document getFilContent reasoning --- lib/plugins/package/lib/zipService.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index c36145e56..d76c36ef5 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -111,6 +111,7 @@ module.exports = { })); }, + // Useful point of entry for e.g. transpilation plugins getFileContent(fullPath) { return fs.readFileAsync(fullPath); }, From 3b49dcd588ee992db9744db1b840c0bce4a96015 Mon Sep 17 00:00:00 2001 From: Mariusz Nowak Date: Wed, 4 Oct 2017 09:49:21 +0200 Subject: [PATCH 059/128] Rely on bluebirds Promise.all for consistency --- lib/plugins/package/lib/zipService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index d76c36ef5..0dbca0790 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -101,7 +101,7 @@ module.exports = { filePath ); - return Promise.all([ // Get file contents and stat in parallel + return BbPromise.all([ // Get file contents and stat in parallel this.getFileContent(fullPath), fs.statAsync(fullPath), ]).then((result) => ({ From b9487e4700ba61b4190e8b1ccfd17c05a289ca81 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Wed, 4 Oct 2017 10:56:42 -0700 Subject: [PATCH 060/128] Adding new chron documentation --- docs/providers/spotinst/README.md | 3 +- .../spotinst/cli-reference/deploy-function.md | 4 +++ docs/providers/spotinst/events/http.md | 16 ++--------- docs/providers/spotinst/events/schedule.md | 28 ++++++++----------- docs/providers/spotinst/examples/README.md | 2 +- .../spotinst/examples/node/README.md | 5 +++- .../spotinst/examples/node/serverless.yml | 4 +++ .../spotinst/examples/python/README.md | 5 +++- .../spotinst/examples/python/serverless.yml | 4 +++ .../spotinst/examples/ruby/README.md | 5 +++- .../spotinst/examples/ruby/serverless.yml | 2 +- docs/providers/spotinst/guide/intro.md | 4 +++ docs/providers/spotinst/guide/permissions.md | 24 ---------------- 13 files changed, 46 insertions(+), 60 deletions(-) delete mode 100644 docs/providers/spotinst/guide/permissions.md diff --git a/docs/providers/spotinst/README.md b/docs/providers/spotinst/README.md index 24b80410f..1cb718de1 100755 --- a/docs/providers/spotinst/README.md +++ b/docs/providers/spotinst/README.md @@ -21,11 +21,10 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se Serverless Spotinst Guide
    -
    + diff --git a/docs/providers/spotinst/cli-reference/deploy-function.md b/docs/providers/spotinst/cli-reference/deploy-function.md index b8dc2a867..2b4e2d0dd 100644 --- a/docs/providers/spotinst/cli-reference/deploy-function.md +++ b/docs/providers/spotinst/cli-reference/deploy-function.md @@ -33,6 +33,10 @@ functions: handler: handler.main memory: 128 timeout: 30 + access: private +# cron: # Setup scheduled trigger with cron expression +# active: true +# value: * * * * * # extend the framework using plugins listed here: # https://github.com/serverless/plugins diff --git a/docs/providers/spotinst/events/http.md b/docs/providers/spotinst/events/http.md index 2454a6ee3..4ac098b08 100755 --- a/docs/providers/spotinst/events/http.md +++ b/docs/providers/spotinst/events/http.md @@ -12,18 +12,8 @@ layout: Doc # HTTP -Spotinst Functions can be triggered by an HTTP endpoint. To create HTTP endpoints as event sources for your Spotinst Functions, use the `http` event syntax. +Spotinst Functions are automatically given an HTTP endpoint when they are created. This means that you do not need to specify the event type when writing your function. After you deploy your function for the first time a unique URL is generated based on the application ID, environment where your application is launched, and the function ID. Here is a sample of how the URL is created -This setup specifies that the `first` function should be run when someone accesses the Functions API endpoint via a `GET` request. You can get the URL for the endpoint by running the `serverless info` command after deploying your service. +`https://{app id}{environment id}.spotinst.io/{function id}` -Here's an example: - -```yml -# serverless.yml - -functions: - first: - handler: http - events: - - http: path -``` +For information on your application ID, environment ID and function ID please checkout your Spotinst Functions dashboard on the [Spotinst website](https://console.spotinst.com/#/dashboard) \ No newline at end of file diff --git a/docs/providers/spotinst/events/schedule.md b/docs/providers/spotinst/events/schedule.md index 7dd5d49f7..49207a01d 100755 --- a/docs/providers/spotinst/events/schedule.md +++ b/docs/providers/spotinst/events/schedule.md @@ -14,18 +14,17 @@ layout: Doc You can trigger the functions by using a scheduled event. This will execute the function according to the cron expressions you specify. -You can either use the `rate` or `cron` syntax. - -The following two examples are function configurations in the serverless.yml file that are scheduled to trigger the function crawl every 2 hours. You are able to attach more than one schedule to a function. +You can use `cron` syntax. +The following example is a function configuration in the serverless.yml file that are scheduled to trigger the function crawl every day at 6:30 PM. ```yml functions: crawl: - handler: crawl - events: - - schedule: rate(2 hours) - - schedule: cron(0 12 * * ? *) + handler: handler.crawl + cron: # Setup scheduled trigger with cron expression + active: true + value: 30 18 * * * ``` @@ -35,19 +34,16 @@ You also have the option to set your functions active status as either true or f **Note** `schedule` events active status are set to true by default -This example will create and attach a schedule event for the function `crawl` which is active status is set to `false`. If the status is changed to true the `crawl` function will be called every 10 minutes. +This example will create and attach a schedule event for the function `crawl` which is active status is set to `false`. If the status is changed to true the `crawl` function will be called every Monday at 6:00 PM. ```yml functions: crawl: - handler: crawl - events: - - schedule: - rate: rate(10 minutes) - active: false + handler: handler.crawl + cron: # Setup scheduled trigger with cron expression + active: false + value: * 18 * * 1 ``` - -## Value - +**Note** When creating a `cron` trigger the `value` is the crontab expression. For help on crontab check out the [documentation](http://www.adminschoice.com/crontab-quick-reference) diff --git a/docs/providers/spotinst/examples/README.md b/docs/providers/spotinst/examples/README.md index 1767a48b1..126965022 100644 --- a/docs/providers/spotinst/examples/README.md +++ b/docs/providers/spotinst/examples/README.md @@ -15,4 +15,4 @@ Pick your language of choice: * [JavaScript](./node) * [Python](./python) - +* [Ruby](./ruby) diff --git a/docs/providers/spotinst/examples/node/README.md b/docs/providers/spotinst/examples/node/README.md index b10a16f67..8765e4235 100644 --- a/docs/providers/spotinst/examples/node/README.md +++ b/docs/providers/spotinst/examples/node/README.md @@ -39,7 +39,10 @@ Congrats you have just deployed and ran your Hello World function! ## Short Hand Guide -`sls` is short hand for serverless cli commands +`sls` is short hand for serverless cli commands + `-f` is short hand for `--function` + `-t` is short hand for `--template` + `-p` is short hang for `--path` \ No newline at end of file diff --git a/docs/providers/spotinst/examples/node/serverless.yml b/docs/providers/spotinst/examples/node/serverless.yml index 5b6231275..4dd81b530 100644 --- a/docs/providers/spotinst/examples/node/serverless.yml +++ b/docs/providers/spotinst/examples/node/serverless.yml @@ -24,6 +24,10 @@ functions: handler: handler.main memory: 128 timeout: 30 +# access: private +# cron: # Setup scheduled trigger with cron expression +# active: true +# value: * * * * * # extend the framework using plugins listed here: # https://github.com/serverless/plugins diff --git a/docs/providers/spotinst/examples/python/README.md b/docs/providers/spotinst/examples/python/README.md index e6d30079f..7bdf7e558 100644 --- a/docs/providers/spotinst/examples/python/README.md +++ b/docs/providers/spotinst/examples/python/README.md @@ -39,7 +39,10 @@ Congrats you have just deployed and ran your Hello World function! ## Short Hand Guide -`sls` is short hand for serverless cli commands +`sls` is short hand for serverless cli commands + `-f` is short hand for `--function` + `-t` is short hand for `--template` + `-p` is short hang for `--path` \ No newline at end of file diff --git a/docs/providers/spotinst/examples/python/serverless.yml b/docs/providers/spotinst/examples/python/serverless.yml index 58cd69d69..ff9d02be0 100644 --- a/docs/providers/spotinst/examples/python/serverless.yml +++ b/docs/providers/spotinst/examples/python/serverless.yml @@ -24,6 +24,10 @@ functions: handler: handler.main memory: 128 timeout: 30 +# access: private +# cron: # Setup scheduled trigger with cron expression +# active: true +# value: * * * * * # extend the framework using plugins listed here: # https://github.com/serverless/plugins diff --git a/docs/providers/spotinst/examples/ruby/README.md b/docs/providers/spotinst/examples/ruby/README.md index f276d2da6..5276f68ca 100644 --- a/docs/providers/spotinst/examples/ruby/README.md +++ b/docs/providers/spotinst/examples/ruby/README.md @@ -39,7 +39,10 @@ Congrats you have just deployed and ran your Hello World function! ## Short Hand Guide -`sls` is short hand for serverless cli commands +`sls` is short hand for serverless cli commands + `-f` is short hand for `--function` + `-t` is short hand for `--template` + `-p` is short hang for `--path` \ No newline at end of file diff --git a/docs/providers/spotinst/examples/ruby/serverless.yml b/docs/providers/spotinst/examples/ruby/serverless.yml index ff1aca4bb..3d9dd5226 100644 --- a/docs/providers/spotinst/examples/ruby/serverless.yml +++ b/docs/providers/spotinst/examples/ruby/serverless.yml @@ -24,7 +24,7 @@ functions: handler: handler.main memory: 128 timeout: 30 - access: private +# access: private # cron: # Setup scheduled trigger with cron expression # active: true # value: * * * * * diff --git a/docs/providers/spotinst/guide/intro.md b/docs/providers/spotinst/guide/intro.md index 6ff12b465..0ab95f4bf 100644 --- a/docs/providers/spotinst/guide/intro.md +++ b/docs/providers/spotinst/guide/intro.md @@ -92,6 +92,10 @@ functions: handler: handler.main memory: 128 timeout: 30 +# access: private +# cron: # Setup scheduled trigger with cron expression +# active: true +# value: * * * * * ``` When you deploy with the Framework by running `serverless deploy`, everything in `serverless.yml` is deployed at once. diff --git a/docs/providers/spotinst/guide/permissions.md b/docs/providers/spotinst/guide/permissions.md deleted file mode 100644 index 0c01ea1d9..000000000 --- a/docs/providers/spotinst/guide/permissions.md +++ /dev/null @@ -1,24 +0,0 @@ - - - -### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/spotinst/guide/intro) - - -# Spotinst - Permissions - -Serverless functions can have to optional access permissions to either public or private. A public function is accessable from anywhere, while private access can only be triggered by authorized machines. - -The following is an example of how a private function would be set up in the serverless.yml file - -``` - functions: - hello: - handler: heandler.main - access: private -``` From fb2fb3d14d5273db29eddd13e81e216cb19e4ee0 Mon Sep 17 00:00:00 2001 From: Alex DeBrie Date: Wed, 4 Oct 2017 18:53:06 +0000 Subject: [PATCH 061/128] Expand refs in YAML --- lib/plugins/print/print.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js index 4ad04c791..4838f9e25 100644 --- a/lib/plugins/print/print.js +++ b/lib/plugins/print/print.js @@ -42,7 +42,7 @@ class Print { if (variableSyntax !== undefined) { conf.provider.variableSyntax = variableSyntax; } - this.serverless.cli.consoleLog(YAML.dump(conf)); + this.serverless.cli.consoleLog(YAML.dump(conf, {noRefs: true} )); }); } From 9259be47596d55ca07c0a49a4911a47f03e72312 Mon Sep 17 00:00:00 2001 From: Preston Tighe Date: Wed, 4 Oct 2017 15:02:25 -0500 Subject: [PATCH 062/128] API Gateway timeout hardcap I ran into this problem. I would like to point it out to future Serverless users. --- docs/providers/aws/guide/serverless.yml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers/aws/guide/serverless.yml.md b/docs/providers/aws/guide/serverless.yml.md index 43be53a6d..e52f887c6 100644 --- a/docs/providers/aws/guide/serverless.yml.md +++ b/docs/providers/aws/guide/serverless.yml.md @@ -30,7 +30,7 @@ provider: region: us-east-1 # Overwrite the default region used. Default is us-east-1 profile: production # The default profile to use with this service memorySize: 512 # Overwrite the default memory size. Default is 1024 - timeout: 10 # The default is 6 seconds + timeout: 10 # The default is 6 seconds. Note: API Gateway current maximum is 30 seconds deploymentBucket: name: com.serverless.${self:provider.region}.deploys # Deployment bucket name. Default is generated by the framework serverSideEncryption: AES256 # when using server-side encryption From 460abc74d0ae79f3c5a0482499f2a15f5b240c71 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Wed, 4 Oct 2017 17:14:39 -0700 Subject: [PATCH 063/128] Spotinst Functions - add public and private support and Ruby template --- docker-compose.yml | 4 +++ lib/plugins/create/create.js | 1 + .../templates/spotinst-nodejs/serverless.yml | 6 +++- .../templates/spotinst-python/serverless.yml | 3 ++ .../create/templates/spotinst-ruby/gitignore | 6 ++++ .../create/templates/spotinst-ruby/handler.rb | 14 ++++++++ .../templates/spotinst-ruby/package.json | 13 +++++++ .../templates/spotinst-ruby/serverless.yml | 36 +++++++++++++++++++ tests/templates/test_all_templates | 3 +- 9 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 lib/plugins/create/templates/spotinst-ruby/gitignore create mode 100644 lib/plugins/create/templates/spotinst-ruby/handler.rb create mode 100644 lib/plugins/create/templates/spotinst-ruby/package.json create mode 100644 lib/plugins/create/templates/spotinst-ruby/serverless.yml diff --git a/docker-compose.yml b/docker-compose.yml index 9d9703d0f..4c2bbf7d2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -79,6 +79,10 @@ services: image: python2.7 volumes: - ./tmp/serverless-integration-test-spotinst-python:/app + spotinst-ruby: + image: ruby2.4.1 + volumes: + - ./tmp/serverless-integration-test-spotinst-ruby:/app webtasks-nodejs: image: node:6.10.3 volumes: diff --git a/lib/plugins/create/create.js b/lib/plugins/create/create.js index cb2851a31..98be2ae96 100644 --- a/lib/plugins/create/create.js +++ b/lib/plugins/create/create.js @@ -31,6 +31,7 @@ const validTemplates = [ 'openwhisk-swift', 'spotinst-nodejs', 'spotinst-python', + 'spotinst-ruby', 'webtasks-nodejs', 'plugin', diff --git a/lib/plugins/create/templates/spotinst-nodejs/serverless.yml b/lib/plugins/create/templates/spotinst-nodejs/serverless.yml index 5b6231275..9958bb28f 100644 --- a/lib/plugins/create/templates/spotinst-nodejs/serverless.yml +++ b/lib/plugins/create/templates/spotinst-nodejs/serverless.yml @@ -20,10 +20,14 @@ provider: functions: hello: - runtime: nodejs4.8 + runtime: nodejs8.3 handler: handler.main memory: 128 timeout: 30 + access: private +# cron: # Setup scheduled trigger with cron expression +# active: true +# value: * * * * * # extend the framework using plugins listed here: # https://github.com/serverless/plugins diff --git a/lib/plugins/create/templates/spotinst-python/serverless.yml b/lib/plugins/create/templates/spotinst-python/serverless.yml index 58cd69d69..7cba92fa6 100644 --- a/lib/plugins/create/templates/spotinst-python/serverless.yml +++ b/lib/plugins/create/templates/spotinst-python/serverless.yml @@ -24,6 +24,9 @@ functions: handler: handler.main memory: 128 timeout: 30 +# cron: # Setup scheduled trigger with cron expression +# active: true +# value: * * * * * # extend the framework using plugins listed here: # https://github.com/serverless/plugins diff --git a/lib/plugins/create/templates/spotinst-ruby/gitignore b/lib/plugins/create/templates/spotinst-ruby/gitignore new file mode 100644 index 000000000..2b48c8bd5 --- /dev/null +++ b/lib/plugins/create/templates/spotinst-ruby/gitignore @@ -0,0 +1,6 @@ +# package directories +node_modules +jspm_packages + +# Serverless directories +.serverless \ No newline at end of file diff --git a/lib/plugins/create/templates/spotinst-ruby/handler.rb b/lib/plugins/create/templates/spotinst-ruby/handler.rb new file mode 100644 index 000000000..55a9e7455 --- /dev/null +++ b/lib/plugins/create/templates/spotinst-ruby/handler.rb @@ -0,0 +1,14 @@ + +# Implement your function here. +# The function will get the request as parameter. +# The function should return an Hash + +def main(args) + queryparams = args["query"] + body = args["body"] + + { + :statusCode => 200, + :body => '{"hello":"from Ruby2.4.1 function"}' + } +end \ No newline at end of file diff --git a/lib/plugins/create/templates/spotinst-ruby/package.json b/lib/plugins/create/templates/spotinst-ruby/package.json new file mode 100644 index 000000000..8748ab56c --- /dev/null +++ b/lib/plugins/create/templates/spotinst-ruby/package.json @@ -0,0 +1,13 @@ +{ + "name": "spotionst-ruby", + "version": "1.0.0", + "description": "Spotinst Functions Ruby sample for serverless framework service.", + "main": "handler.js", + "keywords": [ + "serverless", + "spotinst" + ], + "dependencies": { + "serverless-spotinst-functions": "*" + } +} \ No newline at end of file diff --git a/lib/plugins/create/templates/spotinst-ruby/serverless.yml b/lib/plugins/create/templates/spotinst-ruby/serverless.yml new file mode 100644 index 000000000..ff1aca4bb --- /dev/null +++ b/lib/plugins/create/templates/spotinst-ruby/serverless.yml @@ -0,0 +1,36 @@ +# Welcome to Serverless! +# +# This file is the main config file for your service. +# It's very minimal at this point and uses default values. +# You can always add more config options for more control. +# We've included some commented out config examples here. +# Just uncomment any of them to get that config option. +# +# For full config options, check the docs: +# docs.serverless.com +# +# Happy Coding! + +service: spotinst-ruby # NOTE: update this with your service name + +provider: + name: spotinst + spotinst: + #environment: # NOTE: Remember to add the environment ID + +functions: + hello: + runtime: ruby2.4.1 + handler: handler.main + memory: 128 + timeout: 30 + access: private +# cron: # Setup scheduled trigger with cron expression +# active: true +# value: * * * * * + + +# extend the framework using plugins listed here: +# https://github.com/serverless/plugins +plugins: + - serverless-spotinst-functions \ No newline at end of file diff --git a/tests/templates/test_all_templates b/tests/templates/test_all_templates index badbe786a..4ad8b7041 100755 --- a/tests/templates/test_all_templates +++ b/tests/templates/test_all_templates @@ -24,4 +24,5 @@ integration-test aws-nodejs-ecma-script integration-test google-nodejs integration-test spotinst-nodejs integration-test spotinst-python -integration-test webtasks-nodejs +integration-test spotinst-ruby +integration-test webtasks-nodejs \ No newline at end of file From a99130453cbfd00f05c174a7f655a4d64b35c0b4 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Wed, 4 Oct 2017 17:26:37 -0700 Subject: [PATCH 064/128] adding events to the docs homepage --- docs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/README.md b/docs/README.md index b7698d63b..448002d85 100644 --- a/docs/README.md +++ b/docs/README.md @@ -122,6 +122,7 @@ Already using AWS or another cloud provider? Read on.
  • Guide
  • CLI Reference
  • Events
  • +
  • Examples
  • From da684801a3a75e6a8e06ee7b297361db14fea75f Mon Sep 17 00:00:00 2001 From: Wouter92 Date: Thu, 5 Oct 2017 10:24:25 +0200 Subject: [PATCH 065/128] Updated postinstall.js to make it also work with spaces in path --- scripts/postinstall.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/postinstall.js b/scripts/postinstall.js index a32f64078..bad733a49 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -27,12 +27,12 @@ function setupAutocomplete() { const tabtabCliPath = path.join(tabtabPath, 'src', 'cli.js'); try { - execSync(`node ${tabtabCliPath} install --name serverless --auto`); - execSync(`node ${tabtabCliPath} install --name sls --auto`); + execSync(`node "${tabtabCliPath}" install --name serverless --auto`); + execSync(`node "${tabtabCliPath}" install --name sls --auto`); return resolve(); } catch (error) { - execSync(`node ${tabtabCliPath} install --name serverless --stdout`); - execSync(`node ${tabtabCliPath} install --name sls --stdout`); + execSync(`node "${tabtabCliPath}" install --name serverless --stdout`); + execSync(`node "${tabtabCliPath}" install --name sls --stdout`); console.log('Could not auto-install serverless autocomplete script.'); console.log('Please copy / paste the script above into your shell.'); return reject(error); From 995e0b74e042c161af95ddd762763437cd8e2d87 Mon Sep 17 00:00:00 2001 From: guyklainer Date: Thu, 5 Oct 2017 18:51:36 +0300 Subject: [PATCH 066/128] [src] surround cronExpression with ticks. [src] install spotinst plugin as devDependencies --- .../spotinst/cli-reference/deploy-function.md | 2 +- docs/providers/spotinst/events/schedule.md | 10 +++++----- docs/providers/spotinst/examples/node/serverless.yml | 2 +- docs/providers/spotinst/examples/python/serverless.yml | 2 +- docs/providers/spotinst/examples/ruby/serverless.yml | 4 ++-- docs/providers/spotinst/guide/intro.md | 4 ++-- .../create/templates/spotinst-nodejs/package.json | 2 +- .../create/templates/spotinst-nodejs/serverless.yml | 2 +- .../create/templates/spotinst-python/package.json | 2 +- .../create/templates/spotinst-python/serverless.yml | 2 +- .../create/templates/spotinst-ruby/package.json | 4 ++-- .../create/templates/spotinst-ruby/serverless.yml | 4 ++-- 12 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/providers/spotinst/cli-reference/deploy-function.md b/docs/providers/spotinst/cli-reference/deploy-function.md index 2b4e2d0dd..5d350188b 100644 --- a/docs/providers/spotinst/cli-reference/deploy-function.md +++ b/docs/providers/spotinst/cli-reference/deploy-function.md @@ -36,7 +36,7 @@ functions: access: private # cron: # Setup scheduled trigger with cron expression # active: true -# value: * * * * * +# value: '* * * * *' # extend the framework using plugins listed here: # https://github.com/serverless/plugins diff --git a/docs/providers/spotinst/events/schedule.md b/docs/providers/spotinst/events/schedule.md index 49207a01d..bf8cf48b8 100755 --- a/docs/providers/spotinst/events/schedule.md +++ b/docs/providers/spotinst/events/schedule.md @@ -12,11 +12,11 @@ layout: Doc # Schedule -You can trigger the functions by using a scheduled event. This will execute the function according to the cron expressions you specify. +You can trigger the functions by using a scheduled event. This will execute the function according to the cron expressions you specify. You can use `cron` syntax. -The following example is a function configuration in the serverless.yml file that are scheduled to trigger the function crawl every day at 6:30 PM. +The following example is a function configuration in the serverless.yml file that are scheduled to trigger the function crawl every day at 6:30 PM. ```yml functions: @@ -24,13 +24,13 @@ functions: handler: handler.crawl cron: # Setup scheduled trigger with cron expression active: true - value: 30 18 * * * + value: '30 18 * * *' ``` ## Active Status -You also have the option to set your functions active status as either true or false +You also have the option to set your functions active status as either true or false **Note** `schedule` events active status are set to true by default @@ -42,7 +42,7 @@ functions: handler: handler.crawl cron: # Setup scheduled trigger with cron expression active: false - value: * 18 * * 1 + value: '* 18 * * 1' ``` diff --git a/docs/providers/spotinst/examples/node/serverless.yml b/docs/providers/spotinst/examples/node/serverless.yml index 4dd81b530..a08289ec4 100644 --- a/docs/providers/spotinst/examples/node/serverless.yml +++ b/docs/providers/spotinst/examples/node/serverless.yml @@ -27,7 +27,7 @@ functions: # access: private # cron: # Setup scheduled trigger with cron expression # active: true -# value: * * * * * +# value: '* * * * *' # extend the framework using plugins listed here: # https://github.com/serverless/plugins diff --git a/docs/providers/spotinst/examples/python/serverless.yml b/docs/providers/spotinst/examples/python/serverless.yml index ff9d02be0..d012b9b57 100644 --- a/docs/providers/spotinst/examples/python/serverless.yml +++ b/docs/providers/spotinst/examples/python/serverless.yml @@ -27,7 +27,7 @@ functions: # access: private # cron: # Setup scheduled trigger with cron expression # active: true -# value: * * * * * +# value: '* * * * *' # extend the framework using plugins listed here: # https://github.com/serverless/plugins diff --git a/docs/providers/spotinst/examples/ruby/serverless.yml b/docs/providers/spotinst/examples/ruby/serverless.yml index 3d9dd5226..c1f094af9 100644 --- a/docs/providers/spotinst/examples/ruby/serverless.yml +++ b/docs/providers/spotinst/examples/ruby/serverless.yml @@ -27,10 +27,10 @@ functions: # access: private # cron: # Setup scheduled trigger with cron expression # active: true -# value: * * * * * +# value: '* * * * *' # extend the framework using plugins listed here: # https://github.com/serverless/plugins plugins: - - serverless-spotinst-functions \ No newline at end of file + - serverless-spotinst-functions diff --git a/docs/providers/spotinst/guide/intro.md b/docs/providers/spotinst/guide/intro.md index 0ab95f4bf..767d2ed62 100644 --- a/docs/providers/spotinst/guide/intro.md +++ b/docs/providers/spotinst/guide/intro.md @@ -95,7 +95,7 @@ functions: # access: private # cron: # Setup scheduled trigger with cron expression # active: true -# value: * * * * * +# value: '* * * * *' ``` When you deploy with the Framework by running `serverless deploy`, everything in `serverless.yml` is deployed at once. @@ -109,4 +109,4 @@ You can overwrite or extend the functionality of the Framework using **Plugins** plugins: - serverless-spotinst-functions -``` \ No newline at end of file +``` diff --git a/lib/plugins/create/templates/spotinst-nodejs/package.json b/lib/plugins/create/templates/spotinst-nodejs/package.json index ccfcb802d..96824a70b 100644 --- a/lib/plugins/create/templates/spotinst-nodejs/package.json +++ b/lib/plugins/create/templates/spotinst-nodejs/package.json @@ -7,7 +7,7 @@ "serverless", "spotinst" ], - "dependencies": { + "devDependencies": { "serverless-spotinst-functions": "*" } } diff --git a/lib/plugins/create/templates/spotinst-nodejs/serverless.yml b/lib/plugins/create/templates/spotinst-nodejs/serverless.yml index 9958bb28f..ac559c0d7 100644 --- a/lib/plugins/create/templates/spotinst-nodejs/serverless.yml +++ b/lib/plugins/create/templates/spotinst-nodejs/serverless.yml @@ -27,7 +27,7 @@ functions: access: private # cron: # Setup scheduled trigger with cron expression # active: true -# value: * * * * * +# value: '* * * * *' # extend the framework using plugins listed here: # https://github.com/serverless/plugins diff --git a/lib/plugins/create/templates/spotinst-python/package.json b/lib/plugins/create/templates/spotinst-python/package.json index a7aed6929..4a1f3a5f2 100644 --- a/lib/plugins/create/templates/spotinst-python/package.json +++ b/lib/plugins/create/templates/spotinst-python/package.json @@ -7,7 +7,7 @@ "serverless", "spotinst" ], - "dependencies": { + "devDependencies": { "serverless-spotinst-functions": "*" } } diff --git a/lib/plugins/create/templates/spotinst-python/serverless.yml b/lib/plugins/create/templates/spotinst-python/serverless.yml index 7cba92fa6..97fb4ea37 100644 --- a/lib/plugins/create/templates/spotinst-python/serverless.yml +++ b/lib/plugins/create/templates/spotinst-python/serverless.yml @@ -26,7 +26,7 @@ functions: timeout: 30 # cron: # Setup scheduled trigger with cron expression # active: true -# value: * * * * * +# value: '* * * * *' # extend the framework using plugins listed here: # https://github.com/serverless/plugins diff --git a/lib/plugins/create/templates/spotinst-ruby/package.json b/lib/plugins/create/templates/spotinst-ruby/package.json index 8748ab56c..e1558bcd8 100644 --- a/lib/plugins/create/templates/spotinst-ruby/package.json +++ b/lib/plugins/create/templates/spotinst-ruby/package.json @@ -7,7 +7,7 @@ "serverless", "spotinst" ], - "dependencies": { + "devDependencies": { "serverless-spotinst-functions": "*" } -} \ No newline at end of file +} diff --git a/lib/plugins/create/templates/spotinst-ruby/serverless.yml b/lib/plugins/create/templates/spotinst-ruby/serverless.yml index ff1aca4bb..f41386f3c 100644 --- a/lib/plugins/create/templates/spotinst-ruby/serverless.yml +++ b/lib/plugins/create/templates/spotinst-ruby/serverless.yml @@ -27,10 +27,10 @@ functions: access: private # cron: # Setup scheduled trigger with cron expression # active: true -# value: * * * * * +# value: '* * * * *' # extend the framework using plugins listed here: # https://github.com/serverless/plugins plugins: - - serverless-spotinst-functions \ No newline at end of file + - serverless-spotinst-functions From 1c25e3a8be6a30b6c8210a35bb89b960b306d12d Mon Sep 17 00:00:00 2001 From: guyklainer Date: Thu, 5 Oct 2017 19:12:10 +0300 Subject: [PATCH 067/128] [src] add text for ruby template --- lib/plugins/create/create.test.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/plugins/create/create.test.js b/lib/plugins/create/create.test.js index 3ec10d292..914b77b0d 100644 --- a/lib/plugins/create/create.test.js +++ b/lib/plugins/create/create.test.js @@ -462,6 +462,19 @@ describe('Create', () => { }); }); + it('should generate scaffolding for "spotinst-ruby" template', () => { + process.chdir(tmpDir); + create.options.template = 'spotinst-ruby'; + + return create.create().then(() => { + const dirContent = fs.readdirSync(tmpDir); + expect(dirContent).to.include('package.json'); + expect(dirContent).to.include('serverless.yml'); + expect(dirContent).to.include('handler.rb'); + expect(dirContent).to.include('.gitignore'); + }); + }); + it('should generate scaffolding for "webtasks-nodejs" template', () => { process.chdir(tmpDir); create.options.template = 'webtasks-nodejs'; From c66d2c92fc0dbbc03723de94e346ce3fae456483 Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Sun, 20 Aug 2017 19:31:21 +0300 Subject: [PATCH 068/128] abstract downloadtemplate, renameservice functions --- lib/plugins/install/install.js | 135 ++-------------- lib/plugins/install/install.test.js | 170 +-------------------- lib/utils/downloadTemplateFromRepo.js | 116 ++++++++++++++ lib/utils/downloadTemplateFromRepo.test.js | 124 +++++++++++++++ lib/utils/renameService.js | 41 +++++ lib/utils/renameService.test.js | 108 +++++++++++++ 6 files changed, 401 insertions(+), 293 deletions(-) create mode 100644 lib/utils/downloadTemplateFromRepo.js create mode 100644 lib/utils/downloadTemplateFromRepo.test.js create mode 100644 lib/utils/renameService.js create mode 100644 lib/utils/renameService.test.js diff --git a/lib/plugins/install/install.js b/lib/plugins/install/install.js index ff623c3fe..1454acd22 100644 --- a/lib/plugins/install/install.js +++ b/lib/plugins/install/install.js @@ -1,12 +1,9 @@ 'use strict'; const BbPromise = require('bluebird'); -const path = require('path'); -const URL = require('url'); -const download = require('download'); -const fse = require('fs-extra'); -const os = require('os'); + const userStats = require('../../utils/userStats'); +const { downloadTemplateFromRepo } = require('../../utils/downloadTemplateFromRepo'); class Install { constructor(serverless, options) { @@ -37,130 +34,20 @@ class Install { 'install:install': () => BbPromise.bind(this) .then(this.install), }; - - this.renameService = (name, servicePath) => { - const serviceFile = path.join(servicePath, 'serverless.yml'); - const packageFile = path.join(servicePath, 'package.json'); - - if (!this.serverless.utils.fileExistsSync(serviceFile)) { - const errorMessage = [ - 'serverless.yml not found in', - ` ${servicePath}`, - ].join(''); - throw new this.serverless.classes.Error(errorMessage); - } - - const serverlessYml = - fse.readFileSync(serviceFile, 'utf-8') - .replace(/service\s*:.+/gi, (match) => { - const fractions = match.split('#'); - fractions[0] = `service: ${name}`; - return fractions.join(' #'); - }); - - fse.writeFileSync(serviceFile, serverlessYml); - - if (this.serverless.utils.fileExistsSync(packageFile)) { - const json = this.serverless.utils.readFileSync(packageFile); - this.serverless.utils.writeFile(packageFile, Object.assign(json, { name })); - } - }; } install() { - const url = URL.parse(this.options.url.replace(/\/$/, '')); + return downloadTemplateFromRepo(this.options.name, this.options.url) + .then(dirName => { + const message = `Successfully installed "${this.options.name}" ${this.options.name !== dirName ? `as "${dirName}"` : ''}`; + userStats.track('service_installed', { + data: { // will be updated with core analtyics lib + url: this.options.url, + }, + }); - // check if url parameter is a valid url - if (!url.host) { - throw new this.serverless.classes.Error('The URL you passed is not a valid URL'); - } - - const parts = url.pathname.split('/'); - const parsedGitHubUrl = { - owner: parts[1], - repo: parts[2], - branch: parts[4] || 'master', - }; - - // validate if given url is a valid GitHub url - if (url.hostname !== 'github.com' || !parsedGitHubUrl.owner || !parsedGitHubUrl.repo) { - const errorMessage = [ - 'The URL must be a valid GitHub URL in the following format:', - ' https://github.com/serverless/serverless', - ].join(''); - throw new this.serverless.classes.Error(errorMessage); - } - - const downloadUrl = [ - 'https://github.com/', - parsedGitHubUrl.owner, - '/', - parsedGitHubUrl.repo, - '/archive/', - parsedGitHubUrl.branch, - '.zip', - ].join(''); - - const endIndex = parts.length - 1; - let dirName; - let serviceName; - let downloadServicePath; - - // check if it's a directory or the whole repository - if (parts.length > 4) { - serviceName = parts[endIndex]; - dirName = this.options.name || parts[endIndex]; - // download the repo into a temporary directory - downloadServicePath = path.join(os.tmpdir(), parsedGitHubUrl.repo); - } else { - serviceName = parsedGitHubUrl.repo; - dirName = this.options.name || parsedGitHubUrl.repo; - downloadServicePath = path.join(process.cwd(), dirName); - } - - const servicePath = path.join(process.cwd(), dirName); - const renamed = dirName !== (parts.length > 4 ? parts[endIndex] : parsedGitHubUrl.repo); - - if (this.serverless.utils.dirExistsSync(path.join(process.cwd(), dirName))) { - const errorMessage = `A folder named "${dirName}" already exists.`; - throw new this.serverless.classes.Error(errorMessage); - } - - this.serverless.cli.log(`Downloading and installing "${serviceName}"...`); - - const that = this; - - // download service - return download( - downloadUrl, - downloadServicePath, - { timeout: 30000, extract: true, strip: 1, mode: '755' } - ).then(() => { - // if it's a directory inside of git - if (parts.length > 4) { - let directory = downloadServicePath; - for (let i = 5; i <= endIndex; i++) { - directory = path.join(directory, parts[i]); - } - that.serverless.utils - .copyDirContentsSync(directory, servicePath); - fse.removeSync(downloadServicePath); - } - }).then(() => { - if (!renamed) return BbPromise.resolve(); - - return this.renameService(dirName, servicePath); - }).then(() => { - let message = `Successfully installed "${serviceName}"`; - userStats.track('service_installed', { - data: { // will be updated with core analtyics lib - url: this.options.url, - }, + this.serverless.cli.log(message); }); - if (renamed) message = `${message} as "${dirName}"`; - - that.serverless.cli.log(message); - }); } } diff --git a/lib/plugins/install/install.test.js b/lib/plugins/install/install.test.js index 398dc3906..ed94b69a4 100644 --- a/lib/plugins/install/install.test.js +++ b/lib/plugins/install/install.test.js @@ -2,24 +2,18 @@ const expect = require('chai').expect; const Serverless = require('../../Serverless'); +const Install = require('./install.js'); const sinon = require('sinon'); -const BbPromise = require('bluebird'); const testUtils = require('../../../tests/utils'); const fse = require('fs-extra'); const path = require('path'); -const proxyquire = require('proxyquire'); - -const remove = BbPromise.promisify(fse.remove); describe('Install', () => { let install; let serverless; - let downloadStub; - let Install; let cwd; let servicePath; - let newServicePath; beforeEach(() => { const tmpDir = testUtils.getTmpDirPath(); @@ -29,13 +23,7 @@ describe('Install', () => { process.chdir(tmpDir); servicePath = tmpDir; - newServicePath = path.join(servicePath, 'new-service-name'); - downloadStub = sinon.stub().resolves(); - - Install = proxyquire('./install.js', { - download: downloadStub, - }); serverless = new Serverless(); install = new Install(serverless); serverless.init(); @@ -61,78 +49,6 @@ describe('Install', () => { install.install.restore(); }); }); - - it('should set new service in serverless.yml and name in package.json', () => { - const defaultServiceYml = - 'service: service-name\n\nprovider:\n name: aws\n'; - const newServiceYml = - 'service: new-service-name\n\nprovider:\n name: aws\n'; - - const defaultServiceName = 'service-name'; - const newServiceName = 'new-service-name'; - - const packageFile = path.join(servicePath, 'package.json'); - const serviceFile = path.join(servicePath, 'serverless.yml'); - - serverless.utils.writeFileSync(packageFile, { name: defaultServiceName }); - fse.writeFileSync(serviceFile, defaultServiceYml); - - install.renameService(newServiceName, servicePath); - const serviceYml = fse.readFileSync(serviceFile, 'utf-8'); - const packageJson = serverless.utils.readFileSync(packageFile); - expect(serviceYml).to.equal(newServiceYml); - expect(packageJson.name).to.equal(newServiceName); - }); - - it('should set new service in commented serverless.yml and name in package.json', () => { - const defaultServiceYml = - '# comment\nservice: service-name #comment\n\nprovider:\n name: aws\n# comment'; - const newServiceYml = - '# comment\nservice: new-service-name #comment\n\nprovider:\n name: aws\n# comment'; - - const defaultServiceName = 'service-name'; - const newServiceName = 'new-service-name'; - - const packageFile = path.join(servicePath, 'package.json'); - const serviceFile = path.join(servicePath, 'serverless.yml'); - - serverless.utils.writeFileSync(packageFile, { name: defaultServiceName }); - fse.writeFileSync(serviceFile, defaultServiceYml); - - install.renameService(newServiceName, servicePath); - const serviceYml = fse.readFileSync(serviceFile, 'utf-8'); - const packageJson = serverless.utils.readFileSync(packageFile); - expect(serviceYml).to.equal(newServiceYml); - expect(packageJson.name).to.equal(newServiceName); - }); - - it('should set new service in commented serverless.yml without existing package.json', () => { - const defaultServiceYml = - '# comment\nservice: service-name #comment\n\nprovider:\n name: aws\n# comment'; - const newServiceYml = - '# comment\nservice: new-service-name #comment\n\nprovider:\n name: aws\n# comment'; - - const serviceFile = path.join(servicePath, 'serverless.yml'); - - serverless.utils.writeFileDir(serviceFile); - fse.writeFileSync(serviceFile, defaultServiceYml); - - install.renameService('new-service-name', servicePath); - const serviceYml = fse.readFileSync(serviceFile, 'utf-8'); - expect(serviceYml).to.equal(newServiceYml); - }); - - it('should fail to set new service name in serverless.yml', () => { - const defaultServiceYml = - '# comment\nservice: service-name #comment\n\nprovider:\n name: aws\n# comment'; - - const serviceFile = path.join(servicePath, 'serverledss.yml'); - - serverless.utils.writeFileDir(serviceFile); - fse.writeFileSync(serviceFile, defaultServiceYml); - - expect(() => install.renameService('new-service-name', servicePath)).to.throw(Error); - }); }); describe('#install()', () => { @@ -156,89 +72,5 @@ describe('Install', () => { expect(() => install.install()).to.throw(Error); }); - - it('should download the service based on the GitHub URL', () => { - install.options = { url: 'https://github.com/johndoe/service-to-be-downloaded' }; - - return install.install().then(() => { - expect(downloadStub.calledOnce).to.equal(true); - expect(downloadStub.args[0][0]).to.equal(`${install.options.url}/archive/master.zip`); - }); - }); - - it('should download the service based on directories in the GitHub URL', () => { - install.options = { url: 'https://github.com/serverless/examples/tree/master/rest-api-with-dynamodb' }; - sinon.stub(serverless.utils, 'copyDirContentsSync').returns(true); - sinon.stub(fse, 'removeSync').returns(true); - - return install.install().then(() => { - expect(downloadStub.calledOnce).to.equal(true); - expect(downloadStub.args[0][0]).to.equal('https://github.com/serverless/examples/archive/master.zip'); - expect(serverless.utils.copyDirContentsSync.calledOnce).to.equal(true); - expect(fse.removeSync.calledOnce).to.equal(true); - - serverless.utils.copyDirContentsSync.restore(); - fse.removeSync.restore(); - }); - }); - - it('should throw an error if the same service name exists as directory in Github', () => { - install.options = { url: 'https://github.com/serverless/examples/tree/master/rest-api-with-dynamodb' }; - const serviceDirName = path.join(servicePath, 'rest-api-with-dynamodb'); - fse.mkdirsSync(serviceDirName); - - expect(() => install.install()).to.throw(Error); - }); - - it('should download and rename the service based on the GitHub URL', () => { - install.options = { - url: 'https://github.com/johndoe/service-to-be-downloaded', - name: 'new-service-name', - }; - - downloadStub.returns( - remove(newServicePath) - .then(() => { - const sp = downloadStub.args[0][1]; - const slsYml = path.join( - sp, - 'serverless.yml'); - serverless - .utils.writeFileSync(slsYml, 'service: service-name'); - })); - - return install.install().then(() => { - expect(downloadStub.calledOnce).to.equal(true); - expect(downloadStub.args[0][1]).to.contain(install.options.name); - expect(downloadStub.args[0][0]).to.equal(`${install.options.url}/archive/master.zip`); - const yml = serverless.utils.readFileSync(path.join(newServicePath, 'serverless.yml')); - expect(yml.service).to.equal(install.options.name); - }); - }); - - it('should download and rename the service based directories in the GitHub URL', () => { - install.options = { - url: 'https://github.com/serverless/examples/tree/master/rest-api-with-dynamodb', - name: 'new-service-name', - }; - - downloadStub.returns( - remove(newServicePath) - .then(() => { - const sp = downloadStub.args[0][1]; - const slsYml = path.join( - sp, - 'rest-api-with-dynamodb', - 'serverless.yml'); - serverless - .utils.writeFileSync(slsYml, 'service: service-name'); - })); - - return install.install().then(() => { - expect(downloadStub.calledOnce).to.equal(true); - const yml = serverless.utils.readFileSync(path.join(newServicePath, 'serverless.yml')); - expect(yml.service).to.equal(install.options.name); - }); - }); }); }); diff --git a/lib/utils/downloadTemplateFromRepo.js b/lib/utils/downloadTemplateFromRepo.js new file mode 100644 index 000000000..6c9ae2d8c --- /dev/null +++ b/lib/utils/downloadTemplateFromRepo.js @@ -0,0 +1,116 @@ +const path = require('path'); +const os = require('os'); +const URL = require('url'); +const download = require('download'); +const BbPromise = require('bluebird'); +const fse = require('fs-extra'); +const chalk = require('chalk'); + +const { renameService } = require('./renameService'); +const { ServerlessError } = require('../classes/Error'); +const walkDirSync = require('./fs/walkDirSync'); + +function copyDirContentsSync(srcDir, destDir) { + const fullFilesPaths = walkDirSync(srcDir); + + fullFilesPaths.forEach(fullFilePath => { + const relativeFilePath = fullFilePath.replace(srcDir, ''); + fse.copySync(fullFilePath, path.join(destDir, relativeFilePath)); + }); +} + +function dirExistsSync(dirPath) { + try { + const stats = fse.statSync(dirPath); + return stats.isDirectory(); + } catch (e) { + return false; + } +} + +function downloadTemplateFromRepo(name, inputUrl) { + const url = URL.parse(inputUrl.replace(/\/$/, '')); + + // check if url parameter is a valid url + if (!url.host) { + throw new ServerlessError('The URL you passed is not a valid URL'); + } + + const parts = url.pathname.split('/'); + const parsedGitHubUrl = { + owner: parts[1], + repo: parts[2], + branch: parts[4] || 'master', + }; + + // validate if given url is a valid GitHub url + if (url.hostname !== 'github.com' || !parsedGitHubUrl.owner || !parsedGitHubUrl.repo) { + const errorMessage = [ + 'The URL must be a valid GitHub URL in the following format:', + ' https://github.com/serverless/serverless', + ].join(''); + throw new ServerlessError(errorMessage); + } + + const downloadUrl = [ + 'https://github.com/', + parsedGitHubUrl.owner, + '/', + parsedGitHubUrl.repo, + '/archive/', + parsedGitHubUrl.branch, + '.zip', + ].join(''); + + const endIndex = parts.length - 1; + let dirName; + let serviceName; + let downloadServicePath; + + // check if it's a directory or the whole repository + if (parts.length > 4) { + serviceName = parts[endIndex]; + dirName = name || parts[endIndex]; + // download the repo into a temporary directory + downloadServicePath = path.join(os.tmpdir(), parsedGitHubUrl.repo); + } else { + serviceName = parsedGitHubUrl.repo; + dirName = name || parsedGitHubUrl.repo; + downloadServicePath = path.join(process.cwd(), dirName); + } + + const servicePath = path.join(process.cwd(), dirName); + const renamed = dirName !== (parts.length > 4 ? parts[endIndex] : parsedGitHubUrl.repo); + + if (dirExistsSync(path.join(process.cwd(), dirName))) { + const errorMessage = `A folder named "${dirName}" already exists.`; + throw new ServerlessError(errorMessage); + } + + console.log(`Serverless: ${chalk.yellow(`Downloading and installing "${serviceName}"...`)}`); + + // download service + return download( + downloadUrl, + downloadServicePath, + { timeout: 30000, extract: true, strip: 1, mode: '755' } + ).then(() => { + // if it's a directory inside of git + if (parts.length > 4) { + let directory = downloadServicePath; + for (let i = 5; i <= endIndex; i++) { + directory = path.join(directory, parts[i]); + } + copyDirContentsSync(directory, servicePath); + fse.removeSync(downloadServicePath); + } + }).then(() => { + if (!renamed) return BbPromise.resolve(); + + return renameService(dirName, servicePath); + }); +} + +module.exports = { + downloadTemplateFromRepo, +}; diff --git a/lib/utils/downloadTemplateFromRepo.test.js b/lib/utils/downloadTemplateFromRepo.test.js new file mode 100644 index 000000000..05b89c134 --- /dev/null +++ b/lib/utils/downloadTemplateFromRepo.test.js @@ -0,0 +1,124 @@ +'use strict'; + +const expect = require('chai').expect; +const sinon = require('sinon'); +const BbPromise = require('bluebird'); +const testUtils = require('../../tests/utils'); +const fse = require('fs-extra'); +const path = require('path'); +const proxyquire = require('proxyquire'); + +const writeFileSync = require('./fs/writeFileSync'); +const readFileSync = require('./fs/readFileSync'); + +const remove = BbPromise.promisify(fse.remove); + +describe('downloadTemplateFromRepo', () => { + let downloadTemplateFromRepo; + let downloadStub; + let cwd; + + let servicePath; + let newServicePath; + + beforeEach(() => { + const tmpDir = testUtils.getTmpDirPath(); + cwd = process.cwd(); + + fse.mkdirsSync(tmpDir); + process.chdir(tmpDir); + + servicePath = tmpDir; + newServicePath = path.join(servicePath, 'new-service-name'); + + downloadStub = sinon.stub().resolves(); + + downloadTemplateFromRepo = proxyquire('./downloadTemplateFromRepo', { + download: downloadStub, + }).downloadTemplateFromRepo; + }); + + afterEach(() => { + // change back to the old cwd + process.chdir(cwd); + }); + + describe('downloadTemplateFromRepo', () => { + it('should throw an error if the passed URL option is not a valid URL', () => { + expect(() => downloadTemplateFromRepo(null, 'invalidUrl')).to.throw(Error); + }); + + it('should throw an error if the passed URL is not a valid GitHub URL', () => { + expect(() => downloadTemplateFromRepo(null, 'http://no-github-url.com/foo/bar')).to.throw(Error); + }); + + it('should throw an error if a directory with the same service name is already present', () => { + const serviceDirName = path.join(servicePath, 'existing-service'); + fse.mkdirsSync(serviceDirName); + + expect(() => downloadTemplateFromRepo(null, 'https://github.com/johndoe/existing-service')).to.throw(Error); + }); + + it('should download the service based on the GitHub URL', () => { + const url = 'https://github.com/johndoe/service-to-be-downloaded'; + + return downloadTemplateFromRepo(null, url).then(() => { + expect(downloadStub.calledOnce).to.equal(true); + expect(downloadStub.args[0][0]).to.equal(`${url}/archive/master.zip`); + }); + }); + + it('should throw an error if the same service name exists as directory in Github', () => { + const url = 'https://github.com/serverless/examples/tree/master/rest-api-with-dynamodb'; + const serviceDirName = path.join(servicePath, 'rest-api-with-dynamodb'); + fse.mkdirsSync(serviceDirName); + + expect(() => downloadTemplateFromRepo(null, url)).to.throw(Error); + }); + + it('should download and rename the service based on the GitHub URL', () => { + const url = 'https://github.com/johndoe/service-to-be-downloaded'; + const name = 'new-service-name'; + + downloadStub.returns( + remove(newServicePath) + .then(() => { + const sp = downloadStub.args[0][1]; + const slsYml = path.join( + sp, + 'serverless.yml'); + writeFileSync(slsYml, 'service: service-name'); + })); + + return downloadTemplateFromRepo(name, url).then(() => { + expect(downloadStub.calledOnce).to.equal(true); + expect(downloadStub.args[0][1]).to.contain(name); + expect(downloadStub.args[0][0]).to.equal(`${url}/archive/master.zip`); + const yml = readFileSync(path.join(newServicePath, 'serverless.yml')); + expect(yml.service).to.equal(name); + }); + }); + + it('should download and rename the service based directories in the GitHub URL', () => { + const url = 'https://github.com/serverless/examples/tree/master/rest-api-with-dynamodb'; + const name = 'new-service-name'; + + downloadStub.returns( + remove(newServicePath) + .then(() => { + const sp = downloadStub.args[0][1]; + const slsYml = path.join( + sp, + 'rest-api-with-dynamodb', + 'serverless.yml'); + writeFileSync(slsYml, 'service: service-name'); + })); + + return downloadTemplateFromRepo(name, url).then(() => { + expect(downloadStub.calledOnce).to.equal(true); + const yml = readFileSync(path.join(newServicePath, 'serverless.yml')); + expect(yml.service).to.equal(name); + }); + }); + }); +}); diff --git a/lib/utils/renameService.js b/lib/utils/renameService.js new file mode 100644 index 000000000..c5e73a370 --- /dev/null +++ b/lib/utils/renameService.js @@ -0,0 +1,41 @@ +const path = require('path'); +const fse = require('fs-extra'); + +const fileExistsSync = require('./fs/fileExistsSync'); +const readFileSync = require('./fs/readFileSync'); +const writeFileSync = require('./fs/writeFileSync'); +const { ServerlessError } = require('../classes/Error'); + +function renameService(name, servicePath) { + const serviceFile = path.join(servicePath, 'serverless.yml'); + const packageFile = path.join(servicePath, 'package.json'); + + if (!fileExistsSync(serviceFile)) { + const errorMessage = [ + 'serverless.yml not found in', + ` ${servicePath}`, + ].join(''); + throw new ServerlessError(errorMessage); + } + + const serverlessYml = + fse.readFileSync(serviceFile, 'utf-8') + .replace(/service\s*:.+/gi, (match) => { + const fractions = match.split('#'); + fractions[0] = `service: ${name}`; + return fractions.join(' #'); + }); + + fse.writeFileSync(serviceFile, serverlessYml); + + if (fileExistsSync(packageFile)) { + const json = readFileSync(packageFile); + writeFileSync(packageFile, Object.assign(json, { name })); + } + + return name; +} + +module.exports = { + renameService, +}; diff --git a/lib/utils/renameService.test.js b/lib/utils/renameService.test.js new file mode 100644 index 000000000..d446d6ca2 --- /dev/null +++ b/lib/utils/renameService.test.js @@ -0,0 +1,108 @@ +'use strict'; + +const expect = require('chai').expect; +const Serverless = require('../Serverless'); +const testUtils = require('../../tests/utils'); +const fse = require('fs-extra'); +const path = require('path'); + +const { renameService } = require('./renameService'); + +describe('renameService', () => { + let serverless; + let cwd; + + let servicePath; + let newServicePath; + + beforeEach(() => { + const tmpDir = testUtils.getTmpDirPath(); + cwd = process.cwd(); + + fse.mkdirsSync(tmpDir); + process.chdir(tmpDir); + + servicePath = tmpDir; + newServicePath = path.join(servicePath, 'new-service-name'); + + serverless = new Serverless(); + serverless.init(); + }); + + afterEach(() => { + // change back to the old cwd + process.chdir(cwd); + }); + + it('should set new service in serverless.yml and name in package.json', () => { + const defaultServiceYml = + 'service: service-name\n\nprovider:\n name: aws\n'; + const newServiceYml = + 'service: new-service-name\n\nprovider:\n name: aws\n'; + + const defaultServiceName = 'service-name'; + const newServiceName = 'new-service-name'; + + const packageFile = path.join(servicePath, 'package.json'); + const serviceFile = path.join(servicePath, 'serverless.yml'); + + serverless.utils.writeFileSync(packageFile, { name: defaultServiceName }); + fse.writeFileSync(serviceFile, defaultServiceYml); + + renameService(newServiceName, servicePath); + const serviceYml = fse.readFileSync(serviceFile, 'utf-8'); + const packageJson = serverless.utils.readFileSync(packageFile); + expect(serviceYml).to.equal(newServiceYml); + expect(packageJson.name).to.equal(newServiceName); + }); + + it('should set new service in commented serverless.yml and name in package.json', () => { + const defaultServiceYml = + '# comment\nservice: service-name #comment\n\nprovider:\n name: aws\n# comment'; + const newServiceYml = + '# comment\nservice: new-service-name #comment\n\nprovider:\n name: aws\n# comment'; + + const defaultServiceName = 'service-name'; + const newServiceName = 'new-service-name'; + + const packageFile = path.join(servicePath, 'package.json'); + const serviceFile = path.join(servicePath, 'serverless.yml'); + + serverless.utils.writeFileSync(packageFile, { name: defaultServiceName }); + fse.writeFileSync(serviceFile, defaultServiceYml); + + renameService(newServiceName, servicePath); + const serviceYml = fse.readFileSync(serviceFile, 'utf-8'); + const packageJson = serverless.utils.readFileSync(packageFile); + expect(serviceYml).to.equal(newServiceYml); + expect(packageJson.name).to.equal(newServiceName); + }); + + it('should set new service in commented serverless.yml without existing package.json', () => { + const defaultServiceYml = + '# comment\nservice: service-name #comment\n\nprovider:\n name: aws\n# comment'; + const newServiceYml = + '# comment\nservice: new-service-name #comment\n\nprovider:\n name: aws\n# comment'; + + const serviceFile = path.join(servicePath, 'serverless.yml'); + + serverless.utils.writeFileDir(serviceFile); + fse.writeFileSync(serviceFile, defaultServiceYml); + + renameService('new-service-name', servicePath); + const serviceYml = fse.readFileSync(serviceFile, 'utf-8'); + expect(serviceYml).to.equal(newServiceYml); + }); + + it('should fail to set new service name in serverless.yml', () => { + const defaultServiceYml = + '# comment\nservice: service-name #comment\n\nprovider:\n name: aws\n# comment'; + + const serviceFile = path.join(servicePath, 'serverledss.yml'); + + serverless.utils.writeFileDir(serviceFile); + fse.writeFileSync(serviceFile, defaultServiceYml); + + expect(() => renameService('new-service-name', servicePath)).to.throw(Error); + }); +}); From 1baaf8de65674fe401535eb01cda0c19184d885a Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Sun, 20 Aug 2017 23:46:44 +0300 Subject: [PATCH 069/128] add support for bitbucket and add more tests --- lib/utils/downloadTemplateFromRepo.js | 144 ++++++++++++++++----- lib/utils/downloadTemplateFromRepo.test.js | 77 +++++++++++ 2 files changed, 187 insertions(+), 34 deletions(-) diff --git a/lib/utils/downloadTemplateFromRepo.js b/lib/utils/downloadTemplateFromRepo.js index 6c9ae2d8c..9fba178fd 100644 --- a/lib/utils/downloadTemplateFromRepo.js +++ b/lib/utils/downloadTemplateFromRepo.js @@ -5,6 +5,7 @@ const download = require('download'); const BbPromise = require('bluebird'); const fse = require('fs-extra'); const chalk = require('chalk'); +const qs = require('querystring'); const { renameService } = require('./renameService'); const { ServerlessError } = require('../classes/Error'); @@ -28,23 +29,15 @@ function dirExistsSync(dirPath) { } } -function downloadTemplateFromRepo(name, inputUrl) { - const url = URL.parse(inputUrl.replace(/\/$/, '')); - - // check if url parameter is a valid url - if (!url.host) { - throw new ServerlessError('The URL you passed is not a valid URL'); - } - +function parseGitHubURL(url) { const parts = url.pathname.split('/'); - const parsedGitHubUrl = { - owner: parts[1], - repo: parts[2], - branch: parts[4] || 'master', - }; + const isSubdirectory = parts.length > 4; + const owner = parts[1]; + const repo = parts[2]; + const branch = isSubdirectory ? parts[4] : 'master'; // validate if given url is a valid GitHub url - if (url.hostname !== 'github.com' || !parsedGitHubUrl.owner || !parsedGitHubUrl.repo) { + if (url.hostname !== 'github.com' || !owner || !repo) { const errorMessage = [ 'The URL must be a valid GitHub URL in the following format:', ' https://github.com/serverless/serverless', @@ -52,35 +45,120 @@ function downloadTemplateFromRepo(name, inputUrl) { throw new ServerlessError(errorMessage); } + let pathToDirectory = ''; + for (let i = 5; i <= (parts.length - 1); i++) { + pathToDirectory = path.join(pathToDirectory, parts[i]); + } + const downloadUrl = [ 'https://github.com/', - parsedGitHubUrl.owner, + owner, '/', - parsedGitHubUrl.repo, + repo, '/archive/', - parsedGitHubUrl.branch, + branch, '.zip', ].join(''); - const endIndex = parts.length - 1; - let dirName; + return { + owner, + repo, + branch, + downloadUrl, + isSubdirectory, + pathToDirectory, + }; +} + +function parseBitBucketURL(url) { + const parts = url.pathname.split('/'); + const isSubdirectory = parts.length > 4; + const owner = parts[1]; + const repo = parts[2]; + + const query = qs.parse(url.query); + const branch = 'at' in query ? query.at : 'master'; + + // validate if given url is a valid GitHub url + if (url.hostname !== 'bitbucket.org' || !owner || !repo) { + const errorMessage = [ + 'The URL must be a valid GitHub URL in the following format:', + ' https://github.com/serverless/serverless', + ].join(''); + throw new ServerlessError(errorMessage); + } + + let pathToDirectory = ''; + for (let i = 5; i <= (parts.length - 1); i++) { + pathToDirectory = path.join(pathToDirectory, parts[i]); + } + + const downloadUrl = [ + 'https://bitbucket.org/', + owner, + '/', + repo, + '/get/', + branch, + '.zip', + ].join(''); + + return { + owner, + repo, + branch, + downloadUrl, + isSubdirectory, + pathToDirectory, + }; +} + +function parseRepoURL(inputUrl) { + if (!inputUrl) { + throw new ServerlessError('URL is required'); + } + + const url = URL.parse(inputUrl.replace(/\/$/, '')); + + // check if url parameter is a valid url + if (!url.host) { + throw new ServerlessError('The URL you passed is not a valid URL'); + } + + switch (url.hostname) { + case 'github.com': { + return parseGitHubURL(url); + } + case 'bitbucket.org': { + return parseBitBucketURL(url); + } + default: { + const msg = 'The URL you passed is not one of the valid providers: "GitHub", "BitBucket".'; + throw new ServerlessError(msg); + } + } +} + +function downloadTemplateFromRepo(name, inputUrl) { + const repoInformation = parseRepoURL(inputUrl); + let serviceName; + let dirName; let downloadServicePath; - // check if it's a directory or the whole repository - if (parts.length > 4) { - serviceName = parts[endIndex]; - dirName = name || parts[endIndex]; - // download the repo into a temporary directory - downloadServicePath = path.join(os.tmpdir(), parsedGitHubUrl.repo); + if (repoInformation.isSubdirectory) { + const folderName = repoInformation.pathToDirectory.split('/').splice(-1)[0]; + serviceName = folderName; + dirName = name || folderName; + downloadServicePath = path.join(os.tmpdir(), repoInformation.repo); } else { - serviceName = parsedGitHubUrl.repo; - dirName = name || parsedGitHubUrl.repo; + serviceName = repoInformation.repo; + dirName = name || repoInformation.repo; downloadServicePath = path.join(process.cwd(), dirName); } const servicePath = path.join(process.cwd(), dirName); - const renamed = dirName !== (parts.length > 4 ? parts[endIndex] : parsedGitHubUrl.repo); + const renamed = dirName !== repoInformation.repo; if (dirExistsSync(path.join(process.cwd(), dirName))) { const errorMessage = `A folder named "${dirName}" already exists.`; @@ -91,16 +169,13 @@ function downloadTemplateFromRepo(name, inputUrl) { // download service return download( - downloadUrl, + repoInformation.downloadUrl, downloadServicePath, { timeout: 30000, extract: true, strip: 1, mode: '755' } ).then(() => { // if it's a directory inside of git - if (parts.length > 4) { - let directory = downloadServicePath; - for (let i = 5; i <= endIndex; i++) { - directory = path.join(directory, parts[i]); - } + if (repoInformation.isSubdirectory) { + const directory = path.join(downloadServicePath, repoInformation.pathToDirectory); copyDirContentsSync(directory, servicePath); fse.removeSync(downloadServicePath); } @@ -113,4 +188,5 @@ function downloadTemplateFromRepo(name, inputUrl) { module.exports = { downloadTemplateFromRepo, + parseRepoURL, }; diff --git a/lib/utils/downloadTemplateFromRepo.test.js b/lib/utils/downloadTemplateFromRepo.test.js index 05b89c134..f3f0e498e 100644 --- a/lib/utils/downloadTemplateFromRepo.test.js +++ b/lib/utils/downloadTemplateFromRepo.test.js @@ -13,6 +13,8 @@ const readFileSync = require('./fs/readFileSync'); const remove = BbPromise.promisify(fse.remove); +const { parseRepoURL } = require('./downloadTemplateFromRepo'); + describe('downloadTemplateFromRepo', () => { let downloadTemplateFromRepo; let downloadStub; @@ -121,4 +123,79 @@ describe('downloadTemplateFromRepo', () => { }); }); }); + + describe('parseRepoURL', () => { + + it('should throw an error if no URL is provided', () => { + expect(parseRepoURL).to.throw(Error); + }); + + it('should throw an error if URL is not valid', () => { + try { + parseRepoURL('non_valid_url') + } catch(e) { + expect(e).to.be.an.instanceOf(Error); + } + }); + + it('should throw an error if URL is not of valid provider', () => { + try { + parseRepoURL('https://kostasbariotis.com/repo/owner'); + } catch(e) { + expect(e).to.be.an.instanceOf(Error); + } + }); + + it('should parse a valid GitHub URL', () => { + const output = parseRepoURL('https://github.com/serverless/serverless'); + + expect(output).to.deep.eq({ + owner: 'serverless', + repo: 'serverless', + branch: 'master', + downloadUrl: 'https://github.com/serverless/serverless/archive/master.zip', + isSubdirectory: false, + pathToDirectory: '', + }); + }); + + it('should parse a valid GitHub URL with subdirectory', () => { + const output = parseRepoURL('https://github.com/serverless/serverless/tree/master/assets'); + + expect(output).to.deep.eq({ + owner: 'serverless', + repo: 'serverless', + branch: 'master', + downloadUrl: 'https://github.com/serverless/serverless/archive/master.zip', + isSubdirectory: true, + pathToDirectory: 'assets', + }); + }); + + it('should parse a valid BitBucket URL ', () => { + const output = parseRepoURL('https://bitbucket.org/atlassian/localstack'); + + expect(output).to.deep.eq({ + owner: 'atlassian', + repo: 'localstack', + branch: 'master', + downloadUrl: 'https://bitbucket.org/atlassian/localstack/get/master.zip', + isSubdirectory: false, + pathToDirectory: '', + }); + }); + + it('should parse a valid BitBucket URL with subdirectory', () => { + const output = parseRepoURL('https://bitbucket.org/atlassian/localstack/src/85870856fd6941ae75c0fa946a51cf756ff2f53a/localstack/dashboard/?at=mvn'); + + expect(output).to.deep.eq({ + owner: 'atlassian', + repo: 'localstack', + branch: 'mvn', + downloadUrl: 'https://bitbucket.org/atlassian/localstack/get/mvn.zip', + isSubdirectory: true, + pathToDirectory: 'localstack/dashboard', + }); + }); + }); }); From f48092fba40d56c9a3db8715aa630a79a240eff4 Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Mon, 21 Aug 2017 22:59:57 +0300 Subject: [PATCH 070/128] add custom template url to create method --- lib/plugins/create/create.js | 41 +++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/lib/plugins/create/create.js b/lib/plugins/create/create.js index cb2851a31..614811b8c 100644 --- a/lib/plugins/create/create.js +++ b/lib/plugins/create/create.js @@ -4,7 +4,9 @@ const BbPromise = require('bluebird'); const path = require('path'); const fse = require('fs-extra'); const _ = require('lodash'); + const userStats = require('../../utils/userStats'); +const download = require('../../utils/downloadTemplateFromRepo'); // class wide constants const validTemplates = [ @@ -56,9 +58,12 @@ class Create { options: { template: { usage: `Template for the service. Available templates: ${humanReadableTemplateList}`, - required: true, shortcut: 't', }, + 'template-url': { + usage: 'Template URL for the service. Supports: GitHub, BitBucket', + shortcut: 'u', + }, path: { usage: 'The path where the service should be created (e.g. --path my-service)', shortcut: 'p', @@ -79,6 +84,38 @@ class Create { create() { this.serverless.cli.log('Generating boilerplate...'); + + if ('template' in this.options) { + this.createFromTemplate(); + } else if ('template-url' in this.options) { + return download.downloadTemplateFromRepo(this.options.name, this.options['template-url']) + .then(dirName => { + const message = [ + `Successfully installed "${this.options.name} `, + `${this.options.name !== dirName ? `as "${dirName}"` : ''}`, + ].join(''); + + this.serverless.cli.log(message); + + userStats.track('service_created', { + template: this.options.template, + serviceName: this.options.name, + }); + }) + .catch(err => { + throw new this.serverless.classes.Error(err); + }); + } else { + const errorMessage = [ + 'You must either pass a template name (--template) or a ', + 'a URL (--template-url).', + ].join(''); + throw new this.serverless.classes.Error(errorMessage); + } + return BbPromise.resolve(); + } + + createFromTemplate() { const notPlugin = this.options.template !== 'plugin'; if (validTemplates.indexOf(this.options.template) === -1) { @@ -180,8 +217,6 @@ class Create { this.serverless.cli .log('NOTE: Please update the "service" property in serverless.yml with your service name'); } - - return BbPromise.resolve(); } } From 63621d41a548d7b90890b1d082c7c5e266a4e352 Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Fri, 25 Aug 2017 23:33:11 +0300 Subject: [PATCH 071/128] remove too long line --- lib/plugins/install/install.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/plugins/install/install.js b/lib/plugins/install/install.js index 1454acd22..4a32bc496 100644 --- a/lib/plugins/install/install.js +++ b/lib/plugins/install/install.js @@ -39,7 +39,10 @@ class Install { install() { return downloadTemplateFromRepo(this.options.name, this.options.url) .then(dirName => { - const message = `Successfully installed "${this.options.name}" ${this.options.name !== dirName ? `as "${dirName}"` : ''}`; + const message = [ + `Successfully installed "${this.options.name}" `, + `${this.options.name !== dirName ? `as "${dirName}"` : ''}`, + ].join(''); userStats.track('service_installed', { data: { // will be updated with core analtyics lib url: this.options.url, From b80bd52801c5f9255d7b23d3a1e703c38243d4be Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Fri, 25 Aug 2017 23:46:33 +0300 Subject: [PATCH 072/128] fix messages --- lib/plugins/create/create.js | 4 ++-- lib/plugins/install/install.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/plugins/create/create.js b/lib/plugins/create/create.js index 614811b8c..8978e4c46 100644 --- a/lib/plugins/create/create.js +++ b/lib/plugins/create/create.js @@ -91,8 +91,8 @@ class Create { return download.downloadTemplateFromRepo(this.options.name, this.options['template-url']) .then(dirName => { const message = [ - `Successfully installed "${this.options.name} `, - `${this.options.name !== dirName ? `as "${dirName}"` : ''}`, + `Successfully installed "${dirName}" `, + `${this.options.name && this.options.name !== dirName ? `as "${dirName}"` : ''}`, ].join(''); this.serverless.cli.log(message); diff --git a/lib/plugins/install/install.js b/lib/plugins/install/install.js index 4a32bc496..ca66beb59 100644 --- a/lib/plugins/install/install.js +++ b/lib/plugins/install/install.js @@ -40,8 +40,8 @@ class Install { return downloadTemplateFromRepo(this.options.name, this.options.url) .then(dirName => { const message = [ - `Successfully installed "${this.options.name}" `, - `${this.options.name !== dirName ? `as "${dirName}"` : ''}`, + `Successfully installed "${dirName}" `, + `${this.options.name && this.options.name !== dirName ? `as "${dirName}"` : ''}`, ].join(''); userStats.track('service_installed', { data: { // will be updated with core analtyics lib From 47082fbc436639cf4ced7f48bfb909e11b12b5d3 Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Fri, 25 Aug 2017 23:59:55 +0300 Subject: [PATCH 073/128] move fs utils, refactor tests --- lib/classes/Utils.js | 16 ++------ lib/plugins/create/create.js | 6 ++- lib/plugins/install/install.js | 2 +- lib/utils/downloadTemplateFromRepo.js | 48 ++++++++++++---------- lib/utils/downloadTemplateFromRepo.test.js | 12 +++--- lib/utils/fs/copyDirContentsSync.js | 16 ++++++++ lib/utils/fs/dirExistsSync.js | 14 +++++++ 7 files changed, 72 insertions(+), 42 deletions(-) create mode 100644 lib/utils/fs/copyDirContentsSync.js create mode 100644 lib/utils/fs/dirExistsSync.js diff --git a/lib/classes/Utils.js b/lib/classes/Utils.js index 7c01b147c..e73a5d374 100644 --- a/lib/classes/Utils.js +++ b/lib/classes/Utils.js @@ -8,8 +8,10 @@ const fse = BbPromise.promisifyAll(require('fs-extra')); const _ = require('lodash'); const fileExistsSync = require('../utils/fs/fileExistsSync'); const writeFileSync = require('../utils/fs/writeFileSync'); +const copyDirContentsSync = require('../utils/fs/copyDirContentsSync'); const readFileSync = require('../utils/fs/readFileSync'); const walkDirSync = require('../utils/fs/walkDirSync'); +const dirExistsSync = require('../utils/fs/dirExistsSync'); const isDockerContainer = require('is-docker'); const version = require('../../package.json').version; const segment = require('../utils/segment'); @@ -25,12 +27,7 @@ class Utils { } dirExistsSync(dirPath) { - try { - const stats = fse.statSync(dirPath); - return stats.isDirectory(); - } catch (e) { - return false; - } + return dirExistsSync(dirPath); } fileExistsSync(filePath) { @@ -92,12 +89,7 @@ class Utils { } copyDirContentsSync(srcDir, destDir) { - const fullFilesPaths = this.walkDirSync(srcDir); - - fullFilesPaths.forEach(fullFilePath => { - const relativeFilePath = fullFilePath.replace(srcDir, ''); - fse.copySync(fullFilePath, path.join(destDir, relativeFilePath)); - }); + return copyDirContentsSync(srcDir, destDir); } generateShortId(length) { diff --git a/lib/plugins/create/create.js b/lib/plugins/create/create.js index 8978e4c46..2ee84e9c1 100644 --- a/lib/plugins/create/create.js +++ b/lib/plugins/create/create.js @@ -88,7 +88,11 @@ class Create { if ('template' in this.options) { this.createFromTemplate(); } else if ('template-url' in this.options) { - return download.downloadTemplateFromRepo(this.options.name, this.options['template-url']) + return download.downloadTemplateFromRepo( + this.options['template-url'], + this.options.name, + this.options.path + ) .then(dirName => { const message = [ `Successfully installed "${dirName}" `, diff --git a/lib/plugins/install/install.js b/lib/plugins/install/install.js index ca66beb59..977de6f51 100644 --- a/lib/plugins/install/install.js +++ b/lib/plugins/install/install.js @@ -37,7 +37,7 @@ class Install { } install() { - return downloadTemplateFromRepo(this.options.name, this.options.url) + return downloadTemplateFromRepo(this.options.url, this.options.name) .then(dirName => { const message = [ `Successfully installed "${dirName}" `, diff --git a/lib/utils/downloadTemplateFromRepo.js b/lib/utils/downloadTemplateFromRepo.js index 9fba178fd..df00388c9 100644 --- a/lib/utils/downloadTemplateFromRepo.js +++ b/lib/utils/downloadTemplateFromRepo.js @@ -9,26 +9,13 @@ const qs = require('querystring'); const { renameService } = require('./renameService'); const { ServerlessError } = require('../classes/Error'); -const walkDirSync = require('./fs/walkDirSync'); - -function copyDirContentsSync(srcDir, destDir) { - const fullFilesPaths = walkDirSync(srcDir); - - fullFilesPaths.forEach(fullFilePath => { - const relativeFilePath = fullFilePath.replace(srcDir, ''); - fse.copySync(fullFilePath, path.join(destDir, relativeFilePath)); - }); -} - -function dirExistsSync(dirPath) { - try { - const stats = fse.statSync(dirPath); - return stats.isDirectory(); - } catch (e) { - return false; - } -} +const copyDirContentsSync = require('./fs/copyDirContentsSync'); +const dirExistsSync = require('./fs/dirExistsSync'); +/** + * @param {Object} url + * @returns {Object} + */ function parseGitHubURL(url) { const parts = url.pathname.split('/'); const isSubdirectory = parts.length > 4; @@ -70,6 +57,10 @@ function parseGitHubURL(url) { }; } +/** + * @param {Object} url + * @returns {Object} + */ function parseBitBucketURL(url) { const parts = url.pathname.split('/'); const isSubdirectory = parts.length > 4; @@ -113,6 +104,13 @@ function parseBitBucketURL(url) { }; } +/** + * Parse URL and call the appropriate adaptor + * + * @param {string} inputUrl + * @throws {ServerlessError} + * @returns {Object} + */ function parseRepoURL(inputUrl) { if (!inputUrl) { throw new ServerlessError('URL is required'); @@ -139,7 +137,13 @@ function parseRepoURL(inputUrl) { } } -function downloadTemplateFromRepo(name, inputUrl) { +/** + * @param {string} inputUrl + * @param {string} [templateName] + * @param {string} [path] + * @returns {Promise} + */ +function downloadTemplateFromRepo(inputUrl, templateName, downloadPath) { const repoInformation = parseRepoURL(inputUrl); let serviceName; @@ -149,11 +153,11 @@ function downloadTemplateFromRepo(name, inputUrl) { if (repoInformation.isSubdirectory) { const folderName = repoInformation.pathToDirectory.split('/').splice(-1)[0]; serviceName = folderName; - dirName = name || folderName; + dirName = downloadPath || templateName || folderName; downloadServicePath = path.join(os.tmpdir(), repoInformation.repo); } else { serviceName = repoInformation.repo; - dirName = name || repoInformation.repo; + dirName = downloadPath || templateName || repoInformation.repo; downloadServicePath = path.join(process.cwd(), dirName); } diff --git a/lib/utils/downloadTemplateFromRepo.test.js b/lib/utils/downloadTemplateFromRepo.test.js index f3f0e498e..15b69e7b2 100644 --- a/lib/utils/downloadTemplateFromRepo.test.js +++ b/lib/utils/downloadTemplateFromRepo.test.js @@ -47,24 +47,24 @@ describe('downloadTemplateFromRepo', () => { describe('downloadTemplateFromRepo', () => { it('should throw an error if the passed URL option is not a valid URL', () => { - expect(() => downloadTemplateFromRepo(null, 'invalidUrl')).to.throw(Error); + expect(() => downloadTemplateFromRepo('invalidUrl')).to.throw(Error); }); it('should throw an error if the passed URL is not a valid GitHub URL', () => { - expect(() => downloadTemplateFromRepo(null, 'http://no-github-url.com/foo/bar')).to.throw(Error); + expect(() => downloadTemplateFromRepo('http://no-github-url.com/foo/bar')).to.throw(Error); }); it('should throw an error if a directory with the same service name is already present', () => { const serviceDirName = path.join(servicePath, 'existing-service'); fse.mkdirsSync(serviceDirName); - expect(() => downloadTemplateFromRepo(null, 'https://github.com/johndoe/existing-service')).to.throw(Error); + expect(() => downloadTemplateFromRepo('https://github.com/johndoe/existing-service')).to.throw(Error); }); it('should download the service based on the GitHub URL', () => { const url = 'https://github.com/johndoe/service-to-be-downloaded'; - return downloadTemplateFromRepo(null, url).then(() => { + return downloadTemplateFromRepo(url).then(() => { expect(downloadStub.calledOnce).to.equal(true); expect(downloadStub.args[0][0]).to.equal(`${url}/archive/master.zip`); }); @@ -92,7 +92,7 @@ describe('downloadTemplateFromRepo', () => { writeFileSync(slsYml, 'service: service-name'); })); - return downloadTemplateFromRepo(name, url).then(() => { + return downloadTemplateFromRepo(url, name).then(() => { expect(downloadStub.calledOnce).to.equal(true); expect(downloadStub.args[0][1]).to.contain(name); expect(downloadStub.args[0][0]).to.equal(`${url}/archive/master.zip`); @@ -116,7 +116,7 @@ describe('downloadTemplateFromRepo', () => { writeFileSync(slsYml, 'service: service-name'); })); - return downloadTemplateFromRepo(name, url).then(() => { + return downloadTemplateFromRepo(url, name).then(() => { expect(downloadStub.calledOnce).to.equal(true); const yml = readFileSync(path.join(newServicePath, 'serverless.yml')); expect(yml.service).to.equal(name); diff --git a/lib/utils/fs/copyDirContentsSync.js b/lib/utils/fs/copyDirContentsSync.js new file mode 100644 index 000000000..5c38378b2 --- /dev/null +++ b/lib/utils/fs/copyDirContentsSync.js @@ -0,0 +1,16 @@ +'use strict'; + +const path = require('path'); +const fse = require('./fse'); +const walkDirSync = require('./walkDirSync'); + +function fileExists(srcDir, destDir) { + const fullFilesPaths = walkDirSync(srcDir); + + fullFilesPaths.forEach(fullFilePath => { + const relativeFilePath = fullFilePath.replace(srcDir, ''); + fse.copySync(fullFilePath, path.join(destDir, relativeFilePath)); + }); +} + +module.exports = fileExists; diff --git a/lib/utils/fs/dirExistsSync.js b/lib/utils/fs/dirExistsSync.js new file mode 100644 index 000000000..d04d53de5 --- /dev/null +++ b/lib/utils/fs/dirExistsSync.js @@ -0,0 +1,14 @@ +'use strict'; + +const fse = require('./fse'); + +function dirExistsSync(dirPath) { + try { + const stats = fse.statSync(dirPath); + return stats.isDirectory(); + } catch (e) { + return false; + } +} + +module.exports = dirExistsSync; From d7d1f79fa41ecbdf7324d90ebfbf9511dfb5cbcd Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Wed, 27 Sep 2017 22:03:38 +0300 Subject: [PATCH 074/128] add some examples and docs --- docs/providers/aws/cli-reference/create.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/providers/aws/cli-reference/create.md b/docs/providers/aws/cli-reference/create.md index e88221851..7e6e3a9fe 100644 --- a/docs/providers/aws/cli-reference/create.md +++ b/docs/providers/aws/cli-reference/create.md @@ -26,8 +26,15 @@ serverless create --template aws-nodejs serverless create --template aws-nodejs --path myService ``` +**Create service in new folder using a custom template:** + +```bash +serverless create --template-url https://github.com/serverless/serverless/tree/master/lib/plugins/create/templates/aws-nodejs --path myService +``` + ## Options -- `--template` or `-t` The name of one of the available templates. **Required**. +- `--template` or `-t` The name of one of the available templates. **Required if --template-url is not present**. +- `--template-url` or `-t` The name of one of the available templates. **Required if --template is not present**. - `--path` or `-p` The path where the service should be created. - `--name` or `-n` the name of the service in `serverless.yml`. From 7191afb9026366719b69ce2117610bba60fdfbd1 Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Fri, 29 Sep 2017 23:07:15 +0300 Subject: [PATCH 075/128] add docs for other providers --- docs/providers/aws/cli-reference/create.md | 2 +- docs/providers/azure/cli-reference/create.md | 9 ++++++++- docs/providers/google/cli-reference/create.md | 9 ++++++++- docs/providers/openwhisk/cli-reference/create.md | 9 ++++++++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/docs/providers/aws/cli-reference/create.md b/docs/providers/aws/cli-reference/create.md index 7e6e3a9fe..9555e0903 100644 --- a/docs/providers/aws/cli-reference/create.md +++ b/docs/providers/aws/cli-reference/create.md @@ -34,7 +34,7 @@ serverless create --template-url https://github.com/serverless/serverless/tree/m ## Options - `--template` or `-t` The name of one of the available templates. **Required if --template-url is not present**. -- `--template-url` or `-t` The name of one of the available templates. **Required if --template is not present**. +- `--template-url` or `-u` The name of one of the available templates. **Required if --template is not present**. - `--path` or `-p` The path where the service should be created. - `--name` or `-n` the name of the service in `serverless.yml`. diff --git a/docs/providers/azure/cli-reference/create.md b/docs/providers/azure/cli-reference/create.md index 742af639f..998a09cef 100644 --- a/docs/providers/azure/cli-reference/create.md +++ b/docs/providers/azure/cli-reference/create.md @@ -28,7 +28,8 @@ serverless create --template azure-nodejs --path myService ``` ## Options -- `--template` or `-t` The name of one of the available templates. **Required**. +- `--template` or `-t` The name of one of the available templates. **Required if --template-url is not present**. +- `--template-url` or `-u` The name of one of the available templates. **Required if --template is not present**. - `--path` or `-p` The path where the service should be created. - `--name` or `-n` the name of the service in `serverless.yml`. @@ -68,3 +69,9 @@ Serverless will use the already present directory. Additionally Serverless will rename the service according to the path you provide. In this example the service will be renamed to `my-new-service`. + +### Create service in new folder using a custom template + +```bash +serverless create --template-url https://github.com/serverless/serverless/tree/master/lib/plugins/create/templates/azure-nodejs --path myService +``` diff --git a/docs/providers/google/cli-reference/create.md b/docs/providers/google/cli-reference/create.md index 834c10f6d..232c84bdc 100644 --- a/docs/providers/google/cli-reference/create.md +++ b/docs/providers/google/cli-reference/create.md @@ -28,7 +28,8 @@ serverless create --template google-nodejs --path my-service ## Options -- `--template` or `-t` The name of one of the available templates. **Required**. +- `--template` or `-t` The name of one of the available templates. **Required if --template-url is not present**. +- `--template-url` or `-u` The name of one of the available templates. **Required if --template is not present**. - `--path` or `-p` The path where the service should be created. - `--name` or `-n` the name of the service in `serverless.yml`. @@ -59,3 +60,9 @@ serverless create --template google-nodejs --path my-new-service This example will generate scaffolding for a service with `google` as a provider and `nodejs` as runtime. The scaffolding will be generated in the `my-new-service` directory. This directory will be created if not present. Otherwise Serverless will use the already present directory. Additionally Serverless will rename the service according to the path you provide. In this example the service will be renamed to `my-new-service`. + +### Create service in new folder using a custom template + +```bash +serverless create --template-url https://github.com/serverless/serverless/tree/master/lib/plugins/create/templates/google-nodejs --path myService +``` diff --git a/docs/providers/openwhisk/cli-reference/create.md b/docs/providers/openwhisk/cli-reference/create.md index 12af9bba5..5c5201e47 100644 --- a/docs/providers/openwhisk/cli-reference/create.md +++ b/docs/providers/openwhisk/cli-reference/create.md @@ -27,7 +27,8 @@ serverless create --template openwhisk-nodejs --path myService ``` ## Options -- `--template` or `-t` The name of one of the available templates. **Required**. +- `--template` or `-t` The name of one of the available templates. **Required if --template-url is not present**. +- `--template-url` or `-u` The name of one of the available templates. **Required if --template is not present**. - `--path` or `-p` The path where the service should be created. - `--name` or `-n` the name of the service in `serverless.yml`. @@ -68,6 +69,12 @@ This example will generate scaffolding for a service with `openwhisk` as a provi Additionally Serverless will rename the service according to the path you provide. In this example the service will be renamed to `my-new-service`. +### Create service in new folder using a custom template + +```bash +serverless create --template-url https://github.com/serverless/serverless/tree/master/lib/plugins/create/templates/openwhisk-nodejs --path myService +``` + ### Creating a new plugin ``` From 0c6a45052a5c0f115fad961086fa08fcaea42d6b Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Fri, 6 Oct 2017 16:41:32 +0300 Subject: [PATCH 076/128] resolve conflist --- lib/plugins/create/create.test.js | 26 + package-lock.json | 6354 +++++++++++++++++++++++++++++ 2 files changed, 6380 insertions(+) create mode 100644 package-lock.json diff --git a/lib/plugins/create/create.test.js b/lib/plugins/create/create.test.js index 3ec10d292..2d6f45820 100644 --- a/lib/plugins/create/create.test.js +++ b/lib/plugins/create/create.test.js @@ -9,6 +9,7 @@ const Serverless = require('../../Serverless'); const sinon = require('sinon'); const testUtils = require('../../../tests/utils'); const walkDirSync = require('../../utils/fs/walkDirSync'); +const download = require('./../../utils/downloadTemplateFromRepo'); describe('Create', () => { let create; @@ -606,5 +607,30 @@ describe('Create', () => { expect(() => create.create()).to.throw(Error); }); + + it('should reject if download fails', (done) => { + sinon.stub(download, 'downloadTemplateFromRepo'); + + create.options = {}; + create.options['template-url'] = 'https://github.com/serverless/serverless'; + + download.downloadTemplateFromRepo.rejects(new Error('Wrong')); + + create + .create() + .catch(() => download.downloadTemplateFromRepo.restore()) + .then(() => done()); + }); + + it('should resolve if download succeeds', () => { + sinon.stub(download, 'downloadTemplateFromRepo'); + + create.options = {}; + create.options['template-url'] = 'https://github.com/serverless/serverless'; + + download.downloadTemplateFromRepo.resolves(); + + return create.create().catch(() => download.downloadTemplateFromRepo.restore()); + }); }); }); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..046f0eebd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6354 @@ +{ + "name": "serverless", + "version": "1.23.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@serverless/fdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@serverless/fdk/-/fdk-0.5.1.tgz", + "integrity": "sha512-Z/+5R0AohLwDT1E+9BTeUA7NozlyIoTh0iEt6x8x+ZZhIBK5HBMBN6v2LfkI4wmmOOyceTvsN0l8nWfGp4Oh5g==", + "requires": { + "isomorphic-fetch": "2.2.1", + "ramda": "0.24.1", + "url-parse": "1.1.9" + } + }, + "@types/graphql": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-0.10.2.tgz", + "integrity": "sha512-Ayw0w+kr8vYd8DToiMXjcHxXv1ljWbqX2mnLwXDxkBgog3vywGriC0JZ+npsuohKs3+E88M8OOtobo4g0X3SIA==", + "optional": true + }, + "abab": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz", + "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0=", + "dev": true + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "acorn": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", + "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", + "dev": true + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "requires": { + "extend": "3.0.1", + "semver": "5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=" + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=", + "dev": true + }, + "apollo-client": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-1.9.3.tgz", + "integrity": "sha512-JABKKbqvcw8DJm3YUkEmyx1SK74i+/DesEtAtyocJi10LLmeMQYQFpg8W3BG1tZsYEQ3owEmPbsdNGTly+VOQg==", + "requires": { + "@types/graphql": "0.10.2", + "apollo-link-core": "0.5.4", + "graphql": "0.10.5", + "graphql-anywhere": "3.1.0", + "graphql-tag": "2.4.2", + "redux": "3.7.2", + "symbol-observable": "1.0.4", + "whatwg-fetch": "2.0.3" + } + }, + "apollo-link-core": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/apollo-link-core/-/apollo-link-core-0.5.4.tgz", + "integrity": "sha512-OxL0Kjizb0eS2ObldDqJEs/tFN9xI9RZuTJcaszgGy+xudoPXhIMCHMr7hGZhy0mK+U+BbBULZJw4YQU4J0ODQ==", + "requires": { + "graphql": "0.10.5", + "graphql-tag": "2.4.2", + "zen-observable-ts": "0.4.4" + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "archiver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "requires": { + "archiver-utils": "1.3.0", + "async": "2.5.0", + "buffer-crc32": "0.2.13", + "glob": "7.1.2", + "lodash": "4.17.4", + "readable-stream": "2.3.3", + "tar-stream": "1.5.4", + "walkdir": "0.0.11", + "zip-stream": "1.2.0" + }, + "dependencies": { + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "requires": { + "lodash": "4.17.4" + } + } + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "requires": { + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lazystream": "1.0.0", + "lodash": "4.17.4", + "normalize-path": "2.1.1", + "readable-stream": "2.3.3" + } + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "array.prototype.find": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", + "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.8.0" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "autolinker": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", + "dev": true + }, + "aws-sdk": { + "version": "2.100.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.100.0.tgz", + "integrity": "sha1-/A+8p2kNbCjv/Si9Uf6F99ukK/8=", + "requires": { + "buffer": "4.9.1", + "crypto-browserify": "1.0.9", + "events": "1.1.1", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.0.1", + "xml2js": "0.4.17", + "xmlbuilder": "4.2.1" + }, + "dependencies": { + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" + } + } + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.0", + "debug": "2.6.8", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.7", + "slash": "1.0.0", + "source-map": "0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.6", + "trim-right": "1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-jest": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-18.0.0.tgz", + "integrity": "sha1-F+u6jLMoXJBthZ6HB+Tnl5X7ZeM=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-plugin-istanbul": "3.1.2", + "babel-preset-jest": "18.0.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-istanbul": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz", + "integrity": "sha1-EdWr3hhCXsJLXWSMfgtdJc01SiI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "istanbul-lib-instrument": "1.7.4", + "object-assign": "4.1.1", + "test-exclude": "3.3.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz", + "integrity": "sha1-QVDnDsq1YObnNErchJSYBy004So=", + "dev": true + }, + "babel-preset-jest": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz", + "integrity": "sha1-hPr4yj7GWrp9Xj9Zu67ZNaskBJ4=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "18.0.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.0", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.16" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.0", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.8", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "bl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", + "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", + "dev": true, + "requires": { + "node-int64": "0.4.0" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-id/-/caller-id-0.1.0.tgz", + "integrity": "sha1-Wb2sCJPRLDhxQIJ5Ix+XRYNk8Hs=", + "dev": true, + "requires": { + "stack-trace": "0.0.9" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "cardinal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", + "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", + "dev": true, + "requires": { + "ansicolors": "0.2.1", + "redeyed": "1.0.1" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "requires": { + "get-proxy": "2.1.0", + "isurl": "1.0.0", + "tunnel-agent": "0.6.0", + "url-to-options": "1.0.1" + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + } + }, + "chai-as-promised": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-6.0.0.tgz", + "integrity": "sha1-GgKkM6byTa+sY7nJb6FoTbGqjaY=", + "dev": true, + "requires": { + "check-error": "1.0.2" + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.1" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "ci-info": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.1.tgz", + "integrity": "sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ==" + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "requires": { + "restore-cursor": "1.0.1" + } + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, + "cli-usage": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.4.tgz", + "integrity": "sha1-fAHg3HBsI0s5yTODjI4gshdXduI=", + "dev": true, + "requires": { + "marked": "0.3.6", + "marked-terminal": "1.7.0" + } + }, + "cli-width": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "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=" + }, + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "compress-commons": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", + "integrity": "sha1-WFhwku8g03y1i68AARLJJ4/3O58=", + "requires": { + "buffer-crc32": "0.2.13", + "crc32-stream": "2.0.0", + "normalize-path": "2.1.1", + "readable-stream": "2.3.3" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "config-chain": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "requires": { + "ini": "1.3.4", + "proto-list": "1.2.4" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-type-parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", + "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" + }, + "core-js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz", + "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "coveralls": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.1.tgz", + "integrity": "sha1-1wu5rMGDXsTwY/+drFQjwXsR8Xg=", + "dev": true, + "requires": { + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.79.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + } + } + }, + "crc": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", + "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "requires": { + "crc": "3.4.4", + "readable-stream": "2.3.3" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "crypto-browserify": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-1.0.9.tgz", + "integrity": "sha1-zFRJaF37hesRyYKKzHy4erW7/MA=" + }, + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "dev": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "requires": { + "cssom": "0.3.2" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.27" + } + }, + "damerau-levenshtein": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "requires": { + "decompress-tar": "4.1.1", + "decompress-tarbz2": "4.1.0", + "decompress-targz": "4.1.1", + "decompress-unzip": "4.0.1", + "graceful-fs": "4.1.11", + "make-dir": "1.0.0", + "pify": "2.3.0", + "strip-dirs": "2.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "requires": { + "file-type": "5.2.0", + "is-stream": "1.1.0", + "tar-stream": "1.5.4" + } + }, + "decompress-tarbz2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.0.tgz", + "integrity": "sha1-+6tY1d5z8/0hPKw68cGDNPUcuJE=", + "requires": { + "decompress-tar": "4.1.1", + "file-type": "3.9.0", + "is-stream": "1.1.0", + "pify": "2.3.0", + "seek-bzip": "1.0.5", + "unbzip2-stream": "1.2.5" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "requires": { + "decompress-tar": "4.1.1", + "file-type": "5.2.0", + "is-stream": "1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "requires": { + "file-type": "3.9.0", + "get-stream": "2.3.1", + "pify": "2.3.0", + "yauzl": "2.8.0" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + } + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.1.tgz", + "integrity": "sha512-Ndl8eeOHB9dQkmT1HWCgY3t0odl4bmWKFzjQZBYAxVTNs2B3nn5b6orimRYHKZ4FI8psvZkA1INRCW6l7vc9lQ==", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.1" + }, + "dependencies": { + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "diacritics-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", + "integrity": "sha1-bfwP+dAQAKLt8oZTccrDFulJd68=", + "dev": true + }, + "diff": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", + "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==", + "dev": true + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "download": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/download/-/download-5.0.3.tgz", + "integrity": "sha1-Y1N/l3+ZJmow64oqL70fILgAD3o=", + "requires": { + "caw": "2.0.1", + "decompress": "4.2.0", + "filenamify": "2.0.0", + "get-stream": "3.0.0", + "got": "6.7.1", + "mkdirp": "0.5.1", + "pify": "2.3.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.18" + } + }, + "end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "requires": { + "once": "1.4.0" + } + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true, + "requires": { + "prr": "0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.0.tgz", + "integrity": "sha512-Cf9/h5MrXtExM20gSS55YFrGKCyPrRBjIVBtVyy8vmlsDfe0NPKMWj65tPLgzyfPuapWxh5whpXCtW4+AW5mRg==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.0", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.27", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.27.tgz", + "integrity": "sha512-3KXJRYzKXTd7xfFy5uZsJCXue55fAYQ035PRjyYk2PicllxIwcW9l3AbM/eGaw3vgVAUW4tl4xg9AXDEI6yw0w==", + "dev": true, + "requires": { + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27", + "es6-iterator": "2.0.1", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + } + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.8", + "doctrine": "2.0.0", + "escope": "3.6.0", + "espree": "3.5.0", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.3", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.9.1", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.1.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.0.3", + "rechoir": "0.6.2" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "eslint-config-airbnb": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-10.0.1.tgz", + "integrity": "sha1-pHAQhkbWxF4fY5oD8R1QShqkrtw=", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "5.0.3" + } + }, + "eslint-config-airbnb-base": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-5.0.3.tgz", + "integrity": "sha1-lxSsNews1/qw1E0Uip+R2ylEB00=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "dev": true, + "requires": { + "debug": "2.6.8", + "object-assign": "4.1.1", + "resolve": "1.4.0" + } + }, + "eslint-plugin-import": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz", + "integrity": "sha1-svoH68xTUE0PKkR3WC7Iv/GHG58=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.8", + "doctrine": "1.3.0", + "es6-map": "0.1.5", + "es6-set": "0.1.5", + "eslint-import-resolver-node": "0.2.3", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "lodash.endswith": "4.2.1", + "lodash.find": "4.6.0", + "lodash.findindex": "4.6.0", + "minimatch": "3.0.4", + "object-assign": "4.1.1", + "pkg-dir": "1.0.0", + "pkg-up": "1.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.3.0.tgz", + "integrity": "sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz", + "integrity": "sha1-TjXLcbin23AqxBXIBuuOjZ6mxl0=", + "dev": true, + "requires": { + "damerau-levenshtein": "1.0.4", + "jsx-ast-utils": "1.4.1", + "object-assign": "4.1.1" + } + }, + "eslint-plugin-react": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", + "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", + "dev": true, + "requires": { + "array.prototype.find": "2.0.4", + "doctrine": "1.5.0", + "has": "1.0.1", + "jsx-ast-utils": "1.4.1", + "object.assign": "4.0.4" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "espree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", + "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", + "dev": true, + "requires": { + "acorn": "5.1.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "exec-sh": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz", + "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=", + "dev": true, + "requires": { + "merge": "1.2.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "external-editor": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", + "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", + "requires": { + "extend": "3.0.1", + "spawn-sync": "1.0.15", + "tmp": "0.0.29" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", + "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", + "dev": true, + "requires": { + "bser": "1.0.2" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "1.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.2.2", + "object-assign": "4.1.1" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" + }, + "filenamify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.0.0.tgz", + "integrity": "sha1-vRYiYsC26Uv7zc8Zo7uzdk94VpU=", + "requires": { + "filename-reserved-regex": "2.0.0", + "strip-outer": "1.0.0", + "trim-repeated": "1.0.0" + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.1.2", + "minimatch": "3.0.4" + } + }, + "filesize": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.10.tgz", + "integrity": "sha1-/I+iPdtO+eXgq24eZPZ5okpWdh8=" + }, + "fill-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", + "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", + "dev": true, + "requires": { + "is-object": "1.0.1", + "merge-descriptors": "1.0.1" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.2.0.tgz", + "integrity": "sha1-ml47kpX5gLJiPPZPojixTOvKcHs=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.16" + } + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "1.1.2" + } + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" + }, + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true + }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "requires": { + "ansi": "0.3.1", + "has-unicode": "2.0.1", + "lodash.pad": "4.5.1", + "lodash.padend": "4.6.1", + "lodash.padstart": "4.6.1" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "requires": { + "npm-conf": "1.1.2" + } + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "graphlib": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.1.tgz", + "integrity": "sha1-QjUsUrovTQNctWbrkfc5X3bryVE=", + "requires": { + "lodash": "4.17.4" + } + }, + "graphql": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.10.5.tgz", + "integrity": "sha512-Q7cx22DiLhwHsEfUnUip1Ww/Vfx7FS0w6+iHItNuN61+XpegHSa3k5U0+6M5BcpavQImBwFiy0z3uYwY7cXMLQ==", + "requires": { + "iterall": "1.1.1" + } + }, + "graphql-anywhere": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/graphql-anywhere/-/graphql-anywhere-3.1.0.tgz", + "integrity": "sha1-PqDY6GRrXO5oA1AWqadVfBXCHpY=" + }, + "graphql-tag": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.4.2.tgz", + "integrity": "sha1-amMpfYUi0DorctJvGyOaqzQ4QM0=" + }, + "gray-matter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", + "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=", + "dev": true, + "requires": { + "ansi-red": "0.1.1", + "coffee-script": "1.12.7", + "extend-shallow": "2.0.1", + "js-yaml": "3.9.1", + "toml": "2.3.2" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", + "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "has-symbol-support-x": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.0.tgz", + "integrity": "sha512-F1NtLDtW9NyUrS3faUcI1yVFHCTXyzPb1jfrZBQi5NHxFPlXxZnFLFGzfA2DsdmgCxv2MZ0+bfcgC4EZTmk4SQ==" + }, + "has-to-string-tag-x": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.0.tgz", + "integrity": "sha512-R3OdOP9j6AH5hS1yXeu9wAS+iKSZQx/CC6aMdN6WiaqPlBoA2S+47MtoMsZgKr2m0eAJ+73WWGX0RaFFE5XWKA==", + "requires": { + "has-symbol-support-x": "1.4.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", + "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", + "dev": true, + "requires": { + "whatwg-encoding": "1.0.1" + } + }, + "http-basic": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-2.5.1.tgz", + "integrity": "sha1-jORHvbW2xXf4pj4/p4BW7Eu02/s=", + "dev": true, + "requires": { + "caseless": "0.11.0", + "concat-stream": "1.6.0", + "http-response-object": "1.1.0" + } + }, + "http-response-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-1.1.0.tgz", + "integrity": "sha1-p8TnWq6C87tJBOT0P2FWc7TVGMM=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.8", + "extend": "3.0.1" + } + }, + "iconv-lite": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "ignore": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", + "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, + "inquirer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", + "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", + "requires": { + "ansi-escapes": "1.4.0", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.1.0", + "external-editor": "1.1.1", + "figures": "1.7.0", + "lodash": "4.17.4", + "mute-stream": "0.0.6", + "pinkie-promise": "2.0.1", + "run-async": "2.3.0", + "rx": "4.1.0", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "interpret": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-ci": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", + "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "dev": true, + "requires": { + "ci-info": "1.1.1" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-docker": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", + "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "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.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-local-path": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-local-path/-/is-local-path-0.1.6.tgz", + "integrity": "sha1-gV0USxTVac7L6tTVaTCX8Aqb9sU=", + "dev": true + }, + "is-my-json-valid": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "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 + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.2", + "whatwg-fetch": "2.0.3" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.10", + "js-yaml": "3.9.1", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.3.0", + "wordwrap": "1.0.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-api": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.11.tgz", + "integrity": "sha1-/MC0YeKzvaceMFFVE4I4doJX2d4=", + "dev": true, + "requires": { + "async": "2.5.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-hook": "1.0.7", + "istanbul-lib-instrument": "1.7.4", + "istanbul-lib-report": "1.1.1", + "istanbul-lib-source-maps": "1.2.1", + "istanbul-reports": "1.1.1", + "js-yaml": "3.9.1", + "mkdirp": "0.5.1", + "once": "1.4.0" + }, + "dependencies": { + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", + "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", + "integrity": "sha1-6f2SDkdn89Ge3HZeLWs/XMvQ7qg=", + "dev": true, + "requires": { + "babel-generator": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.4.1" + } + }, + "istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-tvF+YmCmH4thnez6JFX06ujIA19WPa9YUiwjc1uALF2cv5dmE3It8b5I8Ob7FHJ70H9Y5yF+TDkVa/mcADuw1Q==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", + "integrity": "sha512-mukVvSXCn9JQvdJl8wP/iPhqig0MRtuWuD4ZNKo6vB2Ik//AmhAKe3QnPN02dmkRe3lTudFk3rzoHhwU4hb94w==", + "dev": true, + "requires": { + "debug": "2.6.8", + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.1", + "source-map": "0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-P8G873A0kW24XRlxHVGhMJBhQ8gWAec+dae7ZxOBzxT4w+a9ATSPvRVK3LB1RAJ9S8bg2tOyWHAGW40Zd2dKfw==", + "dev": true, + "requires": { + "handlebars": "4.0.10" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "1.4.0", + "is-object": "1.0.1" + } + }, + "iterall": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.1.tgz", + "integrity": "sha1-9/CvEemgTsZCYmD1AZ2fzKTVAhQ=" + }, + "jest-changed-files": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-17.0.2.tgz", + "integrity": "sha1-9WV3WHNplvWQpRuH5ck2nZBLp7c=", + "dev": true + }, + "jest-cli": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-18.1.0.tgz", + "integrity": "sha1-Xq027K1CCBfCybqiqnV09jJXs9Y=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "callsites": "2.0.0", + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "is-ci": "1.0.10", + "istanbul-api": "1.1.11", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-instrument": "1.7.4", + "jest-changed-files": "17.0.2", + "jest-config": "18.1.0", + "jest-environment-jsdom": "18.1.0", + "jest-file-exists": "17.0.0", + "jest-haste-map": "18.1.0", + "jest-jasmine2": "18.1.0", + "jest-mock": "18.0.0", + "jest-resolve": "18.1.0", + "jest-resolve-dependencies": "18.1.0", + "jest-runtime": "18.1.0", + "jest-snapshot": "18.1.0", + "jest-util": "18.1.0", + "json-stable-stringify": "1.0.1", + "node-notifier": "4.6.1", + "sane": "1.4.1", + "strip-ansi": "3.0.1", + "throat": "3.2.0", + "which": "1.3.0", + "worker-farm": "1.5.0", + "yargs": "6.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + } + } + }, + "jest-config": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-18.1.0.tgz", + "integrity": "sha1-YRF0Cm1Iqrhv9anmqwuYvZk7b/Q=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "jest-environment-jsdom": "18.1.0", + "jest-environment-node": "18.1.0", + "jest-jasmine2": "18.1.0", + "jest-mock": "18.0.0", + "jest-resolve": "18.1.0", + "jest-util": "18.1.0", + "json-stable-stringify": "1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "jest-diff": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-18.1.0.tgz", + "integrity": "sha1-T/eedN2YjBORlbNl3GXYf2BvSAM=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "diff": "3.3.0", + "jest-matcher-utils": "18.1.0", + "pretty-format": "18.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "jest-environment-jsdom": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz", + "integrity": "sha1-GLQvDE6iuunzbKs2ObHo+MOE4k4=", + "dev": true, + "requires": { + "jest-mock": "18.0.0", + "jest-util": "18.1.0", + "jsdom": "9.12.0" + } + }, + "jest-environment-node": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-18.1.0.tgz", + "integrity": "sha1-TWeXVyyN2pms9frmlutilFVHx3k=", + "dev": true, + "requires": { + "jest-mock": "18.0.0", + "jest-util": "18.1.0" + } + }, + "jest-file-exists": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/jest-file-exists/-/jest-file-exists-17.0.0.tgz", + "integrity": "sha1-f2Prc6HEOhP0Yb4mF2i0WvLN0Wk=", + "dev": true + }, + "jest-haste-map": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-18.1.0.tgz", + "integrity": "sha1-BoOcdLdwpAwaEGlohR340oHAg3U=", + "dev": true, + "requires": { + "fb-watchman": "1.9.2", + "graceful-fs": "4.1.11", + "micromatch": "2.3.11", + "sane": "1.4.1", + "worker-farm": "1.5.0" + } + }, + "jest-jasmine2": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz", + "integrity": "sha1-CU4QTCwYlwh2bHcmO7Kuy1hgqAs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jest-matcher-utils": "18.1.0", + "jest-matchers": "18.1.0", + "jest-snapshot": "18.1.0", + "jest-util": "18.1.0" + } + }, + "jest-matcher-utils": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz", + "integrity": "sha1-GsRlGVXuKmDO8ef8yYzf13PA+TI=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "pretty-format": "18.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "jest-matchers": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-18.1.0.tgz", + "integrity": "sha1-A0FIS/h6H9C6wKTSyJnit3o/Hq0=", + "dev": true, + "requires": { + "jest-diff": "18.1.0", + "jest-matcher-utils": "18.1.0", + "jest-util": "18.1.0", + "pretty-format": "18.1.0" + } + }, + "jest-mock": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-18.0.0.tgz", + "integrity": "sha1-XCSIRuoz+lWLUm9TEqtKZ2XkibM=", + "dev": true + }, + "jest-resolve": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-18.1.0.tgz", + "integrity": "sha1-aACsy1NmWMkGzV4p3kErGrmsJJs=", + "dev": true, + "requires": { + "browser-resolve": "1.11.2", + "jest-file-exists": "17.0.0", + "jest-haste-map": "18.1.0", + "resolve": "1.4.0" + } + }, + "jest-resolve-dependencies": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz", + "integrity": "sha1-gTT7XK9Zye2EL+AVKrAcUnEfG7s=", + "dev": true, + "requires": { + "jest-file-exists": "17.0.0", + "jest-resolve": "18.1.0" + } + }, + "jest-runtime": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-18.1.0.tgz", + "integrity": "sha1-Or/WhxdbIfw7haK4BkOZ6ZeFmSI=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-jest": "18.0.0", + "babel-plugin-istanbul": "3.1.2", + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "jest-config": "18.1.0", + "jest-file-exists": "17.0.0", + "jest-haste-map": "18.1.0", + "jest-mock": "18.0.0", + "jest-resolve": "18.1.0", + "jest-snapshot": "18.1.0", + "jest-util": "18.1.0", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", + "yargs": "6.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + } + } + }, + "jest-snapshot": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-18.1.0.tgz", + "integrity": "sha1-VbltLuY5ybznb4fyo/1Atxx6WRY=", + "dev": true, + "requires": { + "jest-diff": "18.1.0", + "jest-file-exists": "17.0.0", + "jest-matcher-utils": "18.1.0", + "jest-util": "18.1.0", + "natural-compare": "1.4.0", + "pretty-format": "18.1.0" + } + }, + "jest-util": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-18.1.0.tgz", + "integrity": "sha1-OpnDIRSrF/hL4JQ4JScAbm1L/Go=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "diff": "3.3.0", + "graceful-fs": "4.1.11", + "jest-file-exists": "17.0.0", + "jest-mock": "18.0.0", + "mkdirp": "0.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", + "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "dev": true, + "requires": { + "abab": "1.0.3", + "acorn": "4.0.13", + "acorn-globals": "3.1.0", + "array-equal": "1.0.0", + "content-type-parser": "1.0.1", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "escodegen": "1.8.1", + "html-encoding-sniffer": "1.0.1", + "nwmatcher": "1.4.1", + "parse5": "1.5.1", + "request": "2.79.0", + "sax": "1.2.1", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.2", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.1", + "whatwg-url": "4.8.0", + "xml-name-validator": "2.0.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-refs": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-2.1.7.tgz", + "integrity": "sha1-uesB/in16j6Sh48VrqEK04taz4k=", + "requires": { + "commander": "2.11.0", + "graphlib": "2.1.1", + "js-yaml": "3.9.1", + "native-promise-only": "0.8.1", + "path-loader": "1.0.2", + "slash": "1.0.0", + "uri-js": "3.0.2" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + } + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "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=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "jsx-ast-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", + "dev": true + }, + "jszip": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.3.tgz", + "integrity": "sha1-ipIEA7KxZRwPwSa+kBktkICVfDc=", + "dev": true, + "requires": { + "core-js": "2.3.0", + "es6-promise": "3.0.2", + "lie": "3.1.1", + "pako": "1.0.5", + "readable-stream": "2.0.6" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "jwt-decode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", + "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dev": true, + "requires": { + "immediate": "3.0.6" + } + }, + "list-item": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", + "integrity": "sha1-DGXQDih8tmPMs8s4Sad+iewmilY=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "extend-shallow": "2.0.1", + "is-number": "2.1.0", + "repeat-string": "1.6.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash-es": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha1-3MHXVS4VCgZABzupyzHXDwMpUOc=" + }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", + "dev": true + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._baseclone": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", + "dev": true, + "requires": { + "lodash._arraycopy": "3.0.0", + "lodash._arrayeach": "3.0.0", + "lodash._baseassign": "3.2.0", + "lodash._basefor": "3.0.3", + "lodash.isarray": "3.0.4", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.clonedeep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", + "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", + "dev": true, + "requires": { + "lodash._baseclone": "3.3.0", + "lodash._bindcallback": "3.0.1" + } + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "lodash.endswith": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", + "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=", + "dev": true + }, + "lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", + "dev": true + }, + "lodash.findindex": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", + "integrity": "sha1-oyRd7mH7m24GJLU1ElYku2nBEQY=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lsmod": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz", + "integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks=" + }, + "make-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "requires": { + "pify": "2.3.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.4" + } + }, + "markdown-link": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", + "integrity": "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88=", + "dev": true + }, + "markdown-magic": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/markdown-magic/-/markdown-magic-0.1.17.tgz", + "integrity": "sha1-lj/jsNvoIF5ycJRJpErS9NsR/24=", + "dev": true, + "requires": { + "commander": "2.11.0", + "deepmerge": "1.5.1", + "find-up": "2.1.0", + "fs-extra": "1.0.0", + "globby": "6.1.0", + "is-local-path": "0.1.6", + "markdown-toc": "1.1.0", + "sync-request": "3.0.1" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1" + } + } + } + }, + "markdown-toc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.1.0.tgz", + "integrity": "sha1-GORyN9iVSelEcSHmniyoU8otdSo=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "diacritics-map": "0.1.0", + "gray-matter": "2.1.1", + "lazy-cache": "2.0.2", + "list-item": "1.1.1", + "markdown-link": "0.1.1", + "minimist": "1.2.0", + "mixin-deep": "1.2.0", + "object.pick": "1.2.0", + "remarkable": "1.7.1", + "repeat-string": "1.6.1", + "strip-color": "0.1.0" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "0.1.0" + } + } + } + }, + "marked": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", + "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", + "dev": true + }, + "marked-terminal": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-1.7.0.tgz", + "integrity": "sha1-yMRgiBx3LHYEtkNnAH7l938SWQQ=", + "dev": true, + "requires": { + "cardinal": "1.0.0", + "chalk": "1.1.3", + "cli-table": "0.3.1", + "lodash.assign": "4.2.0", + "node-emoji": "1.8.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.3" + } + }, + "mime": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" + }, + "mime-db": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", + "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" + }, + "mime-types": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", + "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", + "requires": { + "mime-db": "1.29.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mixin-deep": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.2.0.tgz", + "integrity": "sha1-0CuMb4ttS49ZgtP9AJxJGYUcP+I=", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "0.1.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mocha": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.0.tgz", + "integrity": "sha512-pIU2PJjrPYvYRqVpjXzj76qltO9uBYI7woYAMoxbSefsa+vqAfptjoeevd6bUgwD0mPIO+hv9f7ltvsNreL2PA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "mocha-lcov-reporter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", + "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=", + "dev": true + }, + "mock-require": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mock-require/-/mock-require-1.3.0.tgz", + "integrity": "sha1-gmFElS5QR2L45pJKqPY5Rl0deiQ=", + "dev": true, + "requires": { + "caller-id": "0.1.0" + } + }, + "module-not-found-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", + "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", + "dev": true + }, + "moment": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", + "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=" + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-emoji": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", + "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", + "dev": true, + "requires": { + "lodash.toarray": "4.4.0" + } + }, + "node-fetch": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.2.tgz", + "integrity": "sha512-xZZUq2yDhKMIn/UgG5q//IZSNLJIwW2QxS14CNH5spuiXkITM2pUitjdq58yLSaU7m4M0wBNaM2Gh/ggY4YJig==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node-forge": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", + "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-4.6.1.tgz", + "integrity": "sha1-BW0UJE89zBzq3+aK+c/wxUc6M/M=", + "dev": true, + "requires": { + "cli-usage": "0.1.4", + "growly": "1.3.0", + "lodash.clonedeep": "3.0.2", + "minimist": "1.2.0", + "semver": "5.4.1", + "shellwords": "0.1.1", + "which": "1.3.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.0.9" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-conf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.2.tgz", + "integrity": "sha512-dotwbpwVzfNB/2EF3A2wjK5tEMLggKfuA/8TG6WvBB1Zrv+JsvF7E8ei9B/HGq211st/GwXFbREcNJvJ1eySUQ==", + "requires": { + "config-chain": "1.1.11", + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "npmlog": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", + "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", + "requires": { + "ansi": "0.3.1", + "are-we-there-yet": "1.1.4", + "gauge": "1.2.7" + } + }, + "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=" + }, + "nwmatcher": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.1.tgz", + "integrity": "sha1-eumwew6oBNt+JfBctf5Al9TklJ8=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.assign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.0", + "object-keys": "1.0.11" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.2.0.tgz", + "integrity": "sha1-tTkr7peC2m2ft9avr1OXefEjTCs=", + "dev": true, + "requires": { + "isobject": "2.1.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "requires": { + "is-wsl": "1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=" + }, + "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=" + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "pako": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.5.tgz", + "integrity": "sha1-0iBd/ludqK95fnwWPbTR+E5GALw=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "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=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-loader": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.2.tgz", + "integrity": "sha1-zVxz5+OakQEb4UjWv92KhbuTHvk=", + "requires": { + "native-promise-only": "0.8.1", + "superagent": "3.5.2" + } + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pkg-up": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-18.1.0.tgz", + "integrity": "sha1-+2Wob3p/kZSWPu6RhlwbzxA54oQ=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + } + } + }, + "private": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "2.0.6" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "proxyquire": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.8.0.tgz", + "integrity": "sha1-AtUUpb7ZhvBMuyCTrxZ0FTX3ntw=", + "dev": true, + "requires": { + "fill-keys": "1.0.2", + "module-not-found-error": "1.0.1", + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "qs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", + "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" + }, + "ramda": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", + "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "raven": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/raven/-/raven-1.2.1.tgz", + "integrity": "sha1-lJwTTbAooZC3u/j3kKrlQbfAIL0=", + "requires": { + "cookie": "0.3.1", + "json-stringify-safe": "5.0.1", + "lsmod": "1.0.0", + "stack-trace": "0.0.9", + "uuid": "3.0.0" + }, + "dependencies": { + "uuid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", + "integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=" + } + } + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.4.0" + } + }, + "redeyed": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", + "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", + "dev": true, + "requires": { + "esprima": "3.0.0" + }, + "dependencies": { + "esprima": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", + "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", + "dev": true + } + } + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "4.17.4", + "lodash-es": "4.17.4", + "loose-envify": "1.3.1", + "symbol-observable": "1.0.4" + } + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "dev": true + }, + "regex-cache": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3", + "is-primitive": "2.0.0" + } + }, + "remarkable": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", + "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", + "dev": true, + "requires": { + "argparse": "0.1.16", + "autolinker": "0.15.3" + }, + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "dev": true, + "requires": { + "underscore": "1.7.0", + "underscore.string": "2.4.0" + } + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "replaceall": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz", + "integrity": "sha1-gdgax663LX9cSUKt8ml6MiBojY4=" + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.16", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + }, + "dependencies": { + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.16" + } + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "2.1.0" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "sane": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sane/-/sane-1.4.1.tgz", + "integrity": "sha1-iPdj10BA9fDCVrYWPbOZvxEKxxU=", + "dev": true, + "requires": { + "exec-sh": "0.2.0", + "fb-watchman": "1.9.2", + "minimatch": "3.0.4", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.10.0" + } + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "requires": { + "commander": "2.8.1" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=" + }, + "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 + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "0.3.0" + } + }, + "shelljs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": "0.10.3" + } + }, + "sinon-bluebird": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sinon-bluebird/-/sinon-bluebird-3.1.0.tgz", + "integrity": "sha1-+SaA+lRtVTpPX2LekEJetdxHhB0=", + "dev": true + }, + "sinon-chai": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.13.0.tgz", + "integrity": "sha512-hRNu/TlYEp4Rw5IbzO8ykGoZMSG489PGUx1rvePpHGrtl20cXivRBgtr/EWYxIwL9EOO9+on04nd9k3tW8tVww==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "source-map-support": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.16.tgz", + "integrity": "sha512-A6vlydY7H/ljr4L2UOhDSajQdZQ6dMD7cLH0pzwcmwLyc9u8PNI4WGtnfDDzX7uzGL6c/T+ORL97Zlh+S4iOrg==", + "dev": true, + "requires": { + "source-map": "0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "requires": { + "concat-stream": "1.6.0", + "os-shim": "0.1.3" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + }, + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "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.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=", + "dev": true + }, + "strip-dirs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.0.0.tgz", + "integrity": "sha1-YQzbKSggDaAAT0HcuQ/JXNkZoLY=", + "requires": { + "is-natural-number": "4.0.1" + } + }, + "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=" + }, + "strip-outer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.0.tgz", + "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "superagent": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.5.2.tgz", + "integrity": "sha1-M2GjlxVnUEw1EGOr6q4PqiPb8/g=", + "requires": { + "component-emitter": "1.2.1", + "cookiejar": "2.1.1", + "debug": "2.6.8", + "extend": "3.0.1", + "form-data": "2.2.0", + "formidable": "1.1.1", + "methods": "1.1.2", + "mime": "1.3.6", + "qs": "6.5.0", + "readable-stream": "2.3.3" + } + }, + "supports-color": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", + "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", + "requires": { + "has-flag": "2.0.0" + } + }, + "symbol-observable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", + "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "sync-request": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-3.0.1.tgz", + "integrity": "sha1-yqEjWq+Im6UBB2oYNMQ2gwqC+3M=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "http-response-object": "1.1.0", + "then-request": "2.2.0" + } + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "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 + }, + "string-width": { + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "tabtab": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-2.2.2.tgz", + "integrity": "sha1-egR/FDsBC0y9MfhX6ClhUSy/ThQ=", + "requires": { + "debug": "2.6.8", + "inquirer": "1.2.3", + "lodash.difference": "4.5.0", + "lodash.uniq": "4.5.0", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "npmlog": "2.0.4", + "object-assign": "4.1.1" + } + }, + "tar-stream": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", + "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", + "requires": { + "bl": "1.2.1", + "end-of-stream": "1.4.0", + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "test-exclude": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-3.3.0.tgz", + "integrity": "sha1-ehfKEjmYjJg2ewYhRW27fUvDiXc=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "then-request": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-2.2.0.tgz", + "integrity": "sha1-ZnizL6DKIY/laZgbvYhxtZQGDYE=", + "dev": true, + "requires": { + "caseless": "0.11.0", + "concat-stream": "1.6.0", + "http-basic": "2.5.1", + "http-response-object": "1.1.0", + "promise": "7.3.1", + "qs": "6.5.0" + } + }, + "throat": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", + "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "toml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.2.tgz", + "integrity": "sha1-Xt7VykKIeSSUn9BusOlVZWAB6DQ=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "requires": { + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.6", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true, + "optional": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "unbzip2-stream": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", + "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", + "requires": { + "buffer": "3.6.0", + "through": "2.3.8" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "requires": { + "base64-js": "0.0.8", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + } + } + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + } + } + }, + "url-parse": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", + "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "walkdir": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", + "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=" + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.11" + } + }, + "watch": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", + "dev": true + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", + "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", + "dev": true, + "requires": { + "iconv-lite": "0.4.13" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + } + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, + "whatwg-url": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "dev": true, + "requires": { + "tr46": "0.0.3", + "webidl-conversions": "3.0.1" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.0.tgz", + "integrity": "sha512-DHRiUggxtbruaTwnLDm2/BRDKZIoOYvrgYUj5Bam4fU6Gtvc0FaEyoswFPBjMXAweGW2H4BDNIpy//1yXXuaqQ==", + "dev": true, + "requires": { + "errno": "0.1.4", + "xtend": "4.0.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "write-file-atomic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", + "integrity": "sha1-F2n0tVHu3OQZ8FBd6uLiZ2NULTc=", + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "dev": true + }, + "xml2js": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", + "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", + "requires": { + "sax": "1.2.1", + "xmlbuilder": "4.2.1" + } + }, + "xmlbuilder": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", + "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", + "requires": { + "lodash": "4.17.4" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yaml-ast-parser": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.34.tgz", + "integrity": "sha1-0A88+ddztyQUCa6SpnQNHbGfSeY=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz", + "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=", + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } + }, + "zen-observable-ts": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.4.4.tgz", + "integrity": "sha512-SNVY1sWWhoe7FwFmHpD9ERi+7Mhhj3+JdS0BGy2UxLIg7cY+3zQbyZauQCI6DN6YK4uoKNaIm3S7Qkqi1Lr+Fw==" + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "requires": { + "archiver-utils": "1.3.0", + "compress-commons": "1.2.0", + "lodash": "4.17.4", + "readable-stream": "2.3.3" + } + } + } +} From 232c8c38ffee839ee4264c8dff562f6912c2d5d3 Mon Sep 17 00:00:00 2001 From: James Thomas Date: Fri, 6 Oct 2017 15:43:17 +0200 Subject: [PATCH 077/128] Document `resp` parameter support in API GW docs --- docs/providers/openwhisk/events/apigateway.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/providers/openwhisk/events/apigateway.md b/docs/providers/openwhisk/events/apigateway.md index 536d57b03..5bbbbb7d5 100644 --- a/docs/providers/openwhisk/events/apigateway.md +++ b/docs/providers/openwhisk/events/apigateway.md @@ -111,8 +111,15 @@ functions: - http: path: posts/create method: post + resp: json ``` +HTTP event configuration supports the following parameters. + +- `method` - HTTP method (mandatory). +- `path` - URI path for API gateway (mandatory). +- `resp` - controls [web action content type](https://github.com/apache/incubator-openwhisk/blob/master/docs/webactions.md#additional-features), values include: `json`, `html`, `http`, `svg`or `text` (optional, defaults to `json`). + ### CORS Support **Note:** All HTTP endpoints defined in this manner have cross-site requests From a71e09016b9a0d9f37650c18cdff56405482456e Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Fri, 6 Oct 2017 17:45:23 +0300 Subject: [PATCH 078/128] remove descruction on importing --- lib/utils/downloadTemplateFromRepo.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/utils/downloadTemplateFromRepo.js b/lib/utils/downloadTemplateFromRepo.js index df00388c9..7efd4577d 100644 --- a/lib/utils/downloadTemplateFromRepo.js +++ b/lib/utils/downloadTemplateFromRepo.js @@ -7,8 +7,8 @@ const fse = require('fs-extra'); const chalk = require('chalk'); const qs = require('querystring'); -const { renameService } = require('./renameService'); -const { ServerlessError } = require('../classes/Error'); +const renameService = require('./renameService').renameService; +const ServerlessError = require('../classes/Error').ServerlessError; const copyDirContentsSync = require('./fs/copyDirContentsSync'); const dirExistsSync = require('./fs/dirExistsSync'); From 234d66549ef529c67b533b4d0b51e2f3b98790a0 Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Fri, 6 Oct 2017 17:56:00 +0300 Subject: [PATCH 079/128] add node 4 compat --- lib/plugins/install/install.js | 3 ++- lib/utils/downloadTemplateFromRepo.js | 8 ++++---- lib/utils/downloadTemplateFromRepo.test.js | 2 +- lib/utils/renameService.js | 6 ++---- lib/utils/renameService.test.js | 2 +- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/plugins/install/install.js b/lib/plugins/install/install.js index 977de6f51..65641d7a8 100644 --- a/lib/plugins/install/install.js +++ b/lib/plugins/install/install.js @@ -3,7 +3,8 @@ const BbPromise = require('bluebird'); const userStats = require('../../utils/userStats'); -const { downloadTemplateFromRepo } = require('../../utils/downloadTemplateFromRepo'); +const downloadTemplateFromRepo = require('../../utils/downloadTemplateFromRepo') + .downloadTemplateFromRepo; class Install { constructor(serverless, options) { diff --git a/lib/utils/downloadTemplateFromRepo.js b/lib/utils/downloadTemplateFromRepo.js index 7efd4577d..91119263a 100644 --- a/lib/utils/downloadTemplateFromRepo.js +++ b/lib/utils/downloadTemplateFromRepo.js @@ -1,3 +1,5 @@ +'use strict'; + const path = require('path'); const os = require('os'); const URL = require('url'); @@ -190,7 +192,5 @@ function downloadTemplateFromRepo(inputUrl, templateName, downloadPath) { }); } -module.exports = { - downloadTemplateFromRepo, - parseRepoURL, -}; +module.exports.downloadTemplateFromRepo = downloadTemplateFromRepo; +module.exports.parseRepoURL = parseRepoURL; diff --git a/lib/utils/downloadTemplateFromRepo.test.js b/lib/utils/downloadTemplateFromRepo.test.js index 15b69e7b2..d005185ad 100644 --- a/lib/utils/downloadTemplateFromRepo.test.js +++ b/lib/utils/downloadTemplateFromRepo.test.js @@ -13,7 +13,7 @@ const readFileSync = require('./fs/readFileSync'); const remove = BbPromise.promisify(fse.remove); -const { parseRepoURL } = require('./downloadTemplateFromRepo'); +const parseRepoURL = require('./downloadTemplateFromRepo').parseRepoURL; describe('downloadTemplateFromRepo', () => { let downloadTemplateFromRepo; diff --git a/lib/utils/renameService.js b/lib/utils/renameService.js index c5e73a370..c0da76f91 100644 --- a/lib/utils/renameService.js +++ b/lib/utils/renameService.js @@ -4,7 +4,7 @@ const fse = require('fs-extra'); const fileExistsSync = require('./fs/fileExistsSync'); const readFileSync = require('./fs/readFileSync'); const writeFileSync = require('./fs/writeFileSync'); -const { ServerlessError } = require('../classes/Error'); +const ServerlessError = require('../classes/Error').ServerlessError; function renameService(name, servicePath) { const serviceFile = path.join(servicePath, 'serverless.yml'); @@ -36,6 +36,4 @@ function renameService(name, servicePath) { return name; } -module.exports = { - renameService, -}; +module.exports.renameService = renameService; diff --git a/lib/utils/renameService.test.js b/lib/utils/renameService.test.js index d446d6ca2..c8a4d7d1a 100644 --- a/lib/utils/renameService.test.js +++ b/lib/utils/renameService.test.js @@ -6,7 +6,7 @@ const testUtils = require('../../tests/utils'); const fse = require('fs-extra'); const path = require('path'); -const { renameService } = require('./renameService'); +const renameService = require('./renameService').renameService; describe('renameService', () => { let serverless; From 8ce5d2f3be987eb3adeed0728e4aec4ce0b2b95d Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Fri, 6 Oct 2017 21:24:48 +0300 Subject: [PATCH 080/128] pass linter --- lib/utils/downloadTemplateFromRepo.test.js | 7 +++---- lib/utils/renameService.test.js | 2 -- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/utils/downloadTemplateFromRepo.test.js b/lib/utils/downloadTemplateFromRepo.test.js index d005185ad..ac2259707 100644 --- a/lib/utils/downloadTemplateFromRepo.test.js +++ b/lib/utils/downloadTemplateFromRepo.test.js @@ -125,15 +125,14 @@ describe('downloadTemplateFromRepo', () => { }); describe('parseRepoURL', () => { - it('should throw an error if no URL is provided', () => { expect(parseRepoURL).to.throw(Error); }); it('should throw an error if URL is not valid', () => { try { - parseRepoURL('non_valid_url') - } catch(e) { + parseRepoURL('non_valid_url'); + } catch (e) { expect(e).to.be.an.instanceOf(Error); } }); @@ -141,7 +140,7 @@ describe('downloadTemplateFromRepo', () => { it('should throw an error if URL is not of valid provider', () => { try { parseRepoURL('https://kostasbariotis.com/repo/owner'); - } catch(e) { + } catch (e) { expect(e).to.be.an.instanceOf(Error); } }); diff --git a/lib/utils/renameService.test.js b/lib/utils/renameService.test.js index c8a4d7d1a..0eecc66cd 100644 --- a/lib/utils/renameService.test.js +++ b/lib/utils/renameService.test.js @@ -13,7 +13,6 @@ describe('renameService', () => { let cwd; let servicePath; - let newServicePath; beforeEach(() => { const tmpDir = testUtils.getTmpDirPath(); @@ -23,7 +22,6 @@ describe('renameService', () => { process.chdir(tmpDir); servicePath = tmpDir; - newServicePath = path.join(servicePath, 'new-service-name'); serverless = new Serverless(); serverless.init(); From 9ceabcded8ef9c5d6b7bbfb9097b98979dab3885 Mon Sep 17 00:00:00 2001 From: horike37 Date: Sat, 7 Oct 2017 17:18:22 +0900 Subject: [PATCH 081/128] add this to the others providers --- docs/providers/kubeless/cli-reference/create.md | 5 +++-- docs/providers/spotinst/cli-reference/create.md | 3 ++- docs/providers/webtasks/cli-reference/create.md | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/providers/kubeless/cli-reference/create.md b/docs/providers/kubeless/cli-reference/create.md index a331f2801..7911ef281 100644 --- a/docs/providers/kubeless/cli-reference/create.md +++ b/docs/providers/kubeless/cli-reference/create.md @@ -35,7 +35,8 @@ serverless create --template kubeless-nodejs --path my-service ``` ## Options -- `--template` or `-t` The name of one of the available templates. **Required**. +- `--template` or `-t` The name of one of the available templates. **Required if --template-url is not present**. +- `--template-url` or `-u` The name of one of the available templates. **Required if --template is not present**. - `--path` or `-p` The path where the service should be created. - `--name` or `-n` the name of the service in `serverless.yml`. @@ -71,4 +72,4 @@ serverless create --template kubeless-python --path my-new-service This example will generate scaffolding for a service with `kubeless` as a provider and `python2.7` as runtime. The scaffolding will be generated in the `my-new-service` directory. This directory will be created if not present. Otherwise Serverless will use the already present directory. -Additionally Serverless will rename the service according to the path you provide. In this example the service will be renamed to `my-new-service`. \ No newline at end of file +Additionally Serverless will rename the service according to the path you provide. In this example the service will be renamed to `my-new-service`. diff --git a/docs/providers/spotinst/cli-reference/create.md b/docs/providers/spotinst/cli-reference/create.md index 28d7af7a1..0009dea57 100755 --- a/docs/providers/spotinst/cli-reference/create.md +++ b/docs/providers/spotinst/cli-reference/create.md @@ -27,7 +27,8 @@ serverless create -t spotinst-nodejs -p myService ``` ## Options -- `--template` or `-t` The name of one of the available templates. **Required**. +- `--template` or `-t` The name of one of the available templates. **Required if --template-url is not present**. +- `--template-url` or `-u` The name of one of the available templates. **Required if --template is not present**. - `--path` or `-p` The path where the service should be created. - `--name` or `-n` the name of the service in `serverless.yml`. diff --git a/docs/providers/webtasks/cli-reference/create.md b/docs/providers/webtasks/cli-reference/create.md index 64633059f..56da10709 100755 --- a/docs/providers/webtasks/cli-reference/create.md +++ b/docs/providers/webtasks/cli-reference/create.md @@ -28,7 +28,8 @@ serverless create --template webtasks-nodejs --path my-service ## Options -- `--template` or `-t` The name of one of the available templates. **Required**. +- `--template` or `-t` The name of one of the available templates. **Required if --template-url is not present**. +- `--template-url` or `-u` The name of one of the available templates. **Required if --template is not present**. - `--path` or `-p` The path where the service should be created. - `--name` or `-n` the name of the service in `serverless.yml`. From 4b623b0e187216153a307b62c467e07b935617ec Mon Sep 17 00:00:00 2001 From: horike37 Date: Sat, 7 Oct 2017 18:54:09 +0900 Subject: [PATCH 082/128] change position which false is assigned --- lib/plugins/aws/provider/awsProvider.test.js | 2 +- package-lock.json | 6386 ++++++++++++++++++ 2 files changed, 6387 insertions(+), 1 deletion(-) create mode 100644 package-lock.json diff --git a/lib/plugins/aws/provider/awsProvider.test.js b/lib/plugins/aws/provider/awsProvider.test.js index ca78c99b5..8e8389f5a 100644 --- a/lib/plugins/aws/provider/awsProvider.test.js +++ b/lib/plugins/aws/provider/awsProvider.test.js @@ -167,11 +167,11 @@ describe('AwsProvider', () => { return { send(cb) { if (first) { + first = false; cb(error); } else { cb(undefined, {}); } - first = false; }, }; } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..e3021127a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6386 @@ +{ + "name": "serverless", + "version": "1.23.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@serverless/fdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@serverless/fdk/-/fdk-0.5.1.tgz", + "integrity": "sha512-Z/+5R0AohLwDT1E+9BTeUA7NozlyIoTh0iEt6x8x+ZZhIBK5HBMBN6v2LfkI4wmmOOyceTvsN0l8nWfGp4Oh5g==", + "requires": { + "isomorphic-fetch": "2.2.1", + "ramda": "0.24.1", + "url-parse": "1.1.9" + } + }, + "@types/graphql": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-0.10.2.tgz", + "integrity": "sha512-Ayw0w+kr8vYd8DToiMXjcHxXv1ljWbqX2mnLwXDxkBgog3vywGriC0JZ+npsuohKs3+E88M8OOtobo4g0X3SIA==", + "optional": true + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "acorn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "dev": true + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "requires": { + "extend": "3.0.1", + "semver": "5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=" + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=", + "dev": true + }, + "apollo-client": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-1.9.3.tgz", + "integrity": "sha512-JABKKbqvcw8DJm3YUkEmyx1SK74i+/DesEtAtyocJi10LLmeMQYQFpg8W3BG1tZsYEQ3owEmPbsdNGTly+VOQg==", + "requires": { + "@types/graphql": "0.10.2", + "apollo-link-core": "0.5.4", + "graphql": "0.10.5", + "graphql-anywhere": "3.1.0", + "graphql-tag": "2.4.2", + "redux": "3.7.2", + "symbol-observable": "1.0.4", + "whatwg-fetch": "2.0.3" + } + }, + "apollo-link-core": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/apollo-link-core/-/apollo-link-core-0.5.4.tgz", + "integrity": "sha512-OxL0Kjizb0eS2ObldDqJEs/tFN9xI9RZuTJcaszgGy+xudoPXhIMCHMr7hGZhy0mK+U+BbBULZJw4YQU4J0ODQ==", + "requires": { + "graphql": "0.10.5", + "graphql-tag": "2.4.2", + "zen-observable-ts": "0.4.4" + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "archiver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "requires": { + "archiver-utils": "1.3.0", + "async": "2.5.0", + "buffer-crc32": "0.2.13", + "glob": "7.1.2", + "lodash": "4.17.4", + "readable-stream": "2.3.3", + "tar-stream": "1.5.4", + "walkdir": "0.0.11", + "zip-stream": "1.2.0" + }, + "dependencies": { + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "requires": { + "lodash": "4.17.4" + } + } + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "requires": { + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lazystream": "1.0.0", + "lodash": "4.17.4", + "normalize-path": "2.1.1", + "readable-stream": "2.3.3" + } + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "array.prototype.find": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", + "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "autolinker": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", + "dev": true + }, + "aws-sdk": { + "version": "2.130.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.130.0.tgz", + "integrity": "sha1-8Mbafb2poVywwr6zAw9toqTAPDY=", + "requires": { + "buffer": "4.9.1", + "crypto-browserify": "1.0.9", + "events": "1.1.1", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.1.0", + "xml2js": "0.4.17", + "xmlbuilder": "4.2.1" + }, + "dependencies": { + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + } + } + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.0", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.7", + "slash": "1.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-jest": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-18.0.0.tgz", + "integrity": "sha1-F+u6jLMoXJBthZ6HB+Tnl5X7ZeM=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-plugin-istanbul": "3.1.2", + "babel-preset-jest": "18.0.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-istanbul": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz", + "integrity": "sha1-EdWr3hhCXsJLXWSMfgtdJc01SiI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "istanbul-lib-instrument": "1.8.0", + "object-assign": "4.1.1", + "test-exclude": "3.3.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz", + "integrity": "sha1-QVDnDsq1YObnNErchJSYBy004So=", + "dev": true + }, + "babel-preset-jest": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz", + "integrity": "sha1-hPr4yj7GWrp9Xj9Zu67ZNaskBJ4=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "18.0.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "bl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", + "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", + "dev": true, + "requires": { + "node-int64": "0.4.0" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-id/-/caller-id-0.1.0.tgz", + "integrity": "sha1-Wb2sCJPRLDhxQIJ5Ix+XRYNk8Hs=", + "dev": true, + "requires": { + "stack-trace": "0.0.9" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "cardinal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", + "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", + "dev": true, + "requires": { + "ansicolors": "0.2.1", + "redeyed": "1.0.1" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "requires": { + "get-proxy": "2.1.0", + "isurl": "1.0.0", + "tunnel-agent": "0.6.0", + "url-to-options": "1.0.1" + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + } + }, + "chai-as-promised": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-6.0.0.tgz", + "integrity": "sha1-GgKkM6byTa+sY7nJb6FoTbGqjaY=", + "dev": true, + "requires": { + "check-error": "1.0.2" + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "ci-info": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.1.tgz", + "integrity": "sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ==" + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "requires": { + "restore-cursor": "1.0.1" + } + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, + "cli-usage": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.4.tgz", + "integrity": "sha1-fAHg3HBsI0s5yTODjI4gshdXduI=", + "dev": true, + "requires": { + "marked": "0.3.6", + "marked-terminal": "1.7.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "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=" + }, + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "compress-commons": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", + "integrity": "sha1-WFhwku8g03y1i68AARLJJ4/3O58=", + "requires": { + "buffer-crc32": "0.2.13", + "crc32-stream": "2.0.0", + "normalize-path": "2.1.1", + "readable-stream": "2.3.3" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "config-chain": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "requires": { + "ini": "1.3.4", + "proto-list": "1.2.4" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-type-parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", + "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "coveralls": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", + "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==", + "dev": true, + "requires": { + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.79.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + } + } + }, + "crc": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", + "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=" + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "requires": { + "crc": "3.5.0", + "readable-stream": "2.3.3" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "crypto-browserify": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-1.0.9.tgz", + "integrity": "sha1-zFRJaF37hesRyYKKzHy4erW7/MA=" + }, + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "dev": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "requires": { + "cssom": "0.3.2" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.30" + } + }, + "damerau-levenshtein": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "requires": { + "decompress-tar": "4.1.1", + "decompress-tarbz2": "4.1.1", + "decompress-targz": "4.1.1", + "decompress-unzip": "4.0.1", + "graceful-fs": "4.1.11", + "make-dir": "1.0.0", + "pify": "2.3.0", + "strip-dirs": "2.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "requires": { + "file-type": "5.2.0", + "is-stream": "1.1.0", + "tar-stream": "1.5.4" + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "requires": { + "decompress-tar": "4.1.1", + "file-type": "6.2.0", + "is-stream": "1.1.0", + "seek-bzip": "1.0.5", + "unbzip2-stream": "1.2.5" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "requires": { + "decompress-tar": "4.1.1", + "file-type": "5.2.0", + "is-stream": "1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "requires": { + "file-type": "3.9.0", + "get-stream": "2.3.1", + "pify": "2.3.0", + "yauzl": "2.8.0" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + } + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + }, + "dependencies": { + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "diacritics-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", + "integrity": "sha1-bfwP+dAQAKLt8oZTccrDFulJd68=", + "dev": true + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "download": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/download/-/download-5.0.3.tgz", + "integrity": "sha1-Y1N/l3+ZJmow64oqL70fILgAD3o=", + "requires": { + "caw": "2.0.1", + "decompress": "4.2.0", + "filenamify": "2.0.0", + "get-stream": "3.0.0", + "got": "6.7.1", + "mkdirp": "0.5.1", + "pify": "2.3.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.19" + } + }, + "end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "requires": { + "once": "1.4.0" + } + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true, + "requires": { + "prr": "0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", + "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.30", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", + "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", + "dev": true, + "requires": { + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-iterator": "2.0.1", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + } + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.9", + "doctrine": "2.0.0", + "escope": "3.6.0", + "espree": "3.5.1", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.5", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.1", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.0.4", + "rechoir": "0.6.2" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "eslint-config-airbnb": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-10.0.1.tgz", + "integrity": "sha1-pHAQhkbWxF4fY5oD8R1QShqkrtw=", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "5.0.3" + } + }, + "eslint-config-airbnb-base": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-5.0.3.tgz", + "integrity": "sha1-lxSsNews1/qw1E0Uip+R2ylEB00=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "dev": true, + "requires": { + "debug": "2.6.9", + "object-assign": "4.1.1", + "resolve": "1.4.0" + } + }, + "eslint-plugin-import": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz", + "integrity": "sha1-svoH68xTUE0PKkR3WC7Iv/GHG58=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.3.0", + "es6-map": "0.1.5", + "es6-set": "0.1.5", + "eslint-import-resolver-node": "0.2.3", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "lodash.endswith": "4.2.1", + "lodash.find": "4.6.0", + "lodash.findindex": "4.6.0", + "minimatch": "3.0.4", + "object-assign": "4.1.1", + "pkg-dir": "1.0.0", + "pkg-up": "1.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.3.0.tgz", + "integrity": "sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz", + "integrity": "sha1-TjXLcbin23AqxBXIBuuOjZ6mxl0=", + "dev": true, + "requires": { + "damerau-levenshtein": "1.0.4", + "jsx-ast-utils": "1.4.1", + "object-assign": "4.1.1" + } + }, + "eslint-plugin-react": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", + "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", + "dev": true, + "requires": { + "array.prototype.find": "2.0.4", + "doctrine": "1.5.0", + "has": "1.0.1", + "jsx-ast-utils": "1.4.1", + "object.assign": "4.0.4" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "espree": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "dev": true, + "requires": { + "acorn": "5.1.2", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "exec-sh": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", + "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "dev": true, + "requires": { + "merge": "1.2.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "external-editor": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", + "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", + "requires": { + "extend": "3.0.1", + "spawn-sync": "1.0.15", + "tmp": "0.0.29" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", + "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", + "dev": true, + "requires": { + "bser": "1.0.2" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "1.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" + }, + "filenamify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.0.0.tgz", + "integrity": "sha1-vRYiYsC26Uv7zc8Zo7uzdk94VpU=", + "requires": { + "filename-reserved-regex": "2.0.0", + "strip-outer": "1.0.0", + "trim-repeated": "1.0.0" + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.1.2", + "minimatch": "3.0.4" + } + }, + "filesize": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.10.tgz", + "integrity": "sha1-/I+iPdtO+eXgq24eZPZ5okpWdh8=" + }, + "fill-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", + "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", + "dev": true, + "requires": { + "is-object": "1.0.1", + "merge-descriptors": "1.0.1" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "1.1.2" + } + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" + }, + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "requires": { + "ansi": "0.3.1", + "has-unicode": "2.0.1", + "lodash.pad": "4.5.1", + "lodash.padend": "4.6.1", + "lodash.padstart": "4.6.1" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "requires": { + "npm-conf": "1.1.2" + } + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "graphlib": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.1.tgz", + "integrity": "sha1-QjUsUrovTQNctWbrkfc5X3bryVE=", + "requires": { + "lodash": "4.17.4" + } + }, + "graphql": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.10.5.tgz", + "integrity": "sha512-Q7cx22DiLhwHsEfUnUip1Ww/Vfx7FS0w6+iHItNuN61+XpegHSa3k5U0+6M5BcpavQImBwFiy0z3uYwY7cXMLQ==", + "requires": { + "iterall": "1.1.3" + } + }, + "graphql-anywhere": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/graphql-anywhere/-/graphql-anywhere-3.1.0.tgz", + "integrity": "sha1-PqDY6GRrXO5oA1AWqadVfBXCHpY=" + }, + "graphql-tag": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.4.2.tgz", + "integrity": "sha1-amMpfYUi0DorctJvGyOaqzQ4QM0=" + }, + "gray-matter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", + "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=", + "dev": true, + "requires": { + "ansi-red": "0.1.1", + "coffee-script": "1.12.7", + "extend-shallow": "2.0.1", + "js-yaml": "3.10.0", + "toml": "2.3.3" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", + "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.1", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "has-symbol-support-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz", + "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "1.4.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", + "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", + "dev": true, + "requires": { + "whatwg-encoding": "1.0.1" + } + }, + "http-basic": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-2.5.1.tgz", + "integrity": "sha1-jORHvbW2xXf4pj4/p4BW7Eu02/s=", + "dev": true, + "requires": { + "caseless": "0.11.0", + "concat-stream": "1.6.0", + "http-response-object": "1.1.0" + } + }, + "http-response-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-1.1.0.tgz", + "integrity": "sha1-p8TnWq6C87tJBOT0P2FWc7TVGMM=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "ignore": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", + "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, + "inquirer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", + "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", + "requires": { + "ansi-escapes": "1.4.0", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "external-editor": "1.1.1", + "figures": "1.7.0", + "lodash": "4.17.4", + "mute-stream": "0.0.6", + "pinkie-promise": "2.0.1", + "run-async": "2.3.0", + "rx": "4.1.0", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-ci": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", + "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "dev": true, + "requires": { + "ci-info": "1.1.1" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-docker": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", + "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "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.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-local-path": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-local-path/-/is-local-path-0.1.6.tgz", + "integrity": "sha1-gV0USxTVac7L6tTVaTCX8Aqb9sU=", + "dev": true + }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "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 + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.3" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.10", + "js-yaml": "3.10.0", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.3.0", + "wordwrap": "1.0.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-api": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.14.tgz", + "integrity": "sha1-JbxXAffGgMD//5E95G42GaOm5oA=", + "dev": true, + "requires": { + "async": "2.5.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-hook": "1.0.7", + "istanbul-lib-instrument": "1.8.0", + "istanbul-lib-report": "1.1.1", + "istanbul-lib-source-maps": "1.2.1", + "istanbul-reports": "1.1.2", + "js-yaml": "3.10.0", + "mkdirp": "0.5.1", + "once": "1.4.0" + }, + "dependencies": { + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", + "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", + "integrity": "sha1-ZvbJQhzJ7EcE928tsIS6kHiitTI=", + "dev": true, + "requires": { + "babel-generator": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.4.1" + } + }, + "istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-tvF+YmCmH4thnez6JFX06ujIA19WPa9YUiwjc1uALF2cv5dmE3It8b5I8Ob7FHJ70H9Y5yF+TDkVa/mcADuw1Q==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", + "integrity": "sha512-mukVvSXCn9JQvdJl8wP/iPhqig0MRtuWuD4ZNKo6vB2Ik//AmhAKe3QnPN02dmkRe3lTudFk3rzoHhwU4hb94w==", + "dev": true, + "requires": { + "debug": "2.6.9", + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha1-D7Lj9qqZIr085F0F2KtNXo4HvU8=", + "dev": true, + "requires": { + "handlebars": "4.0.10" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" + } + }, + "iterall": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", + "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==" + }, + "jest-changed-files": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-17.0.2.tgz", + "integrity": "sha1-9WV3WHNplvWQpRuH5ck2nZBLp7c=", + "dev": true + }, + "jest-cli": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-18.1.0.tgz", + "integrity": "sha1-Xq027K1CCBfCybqiqnV09jJXs9Y=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "callsites": "2.0.0", + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "is-ci": "1.0.10", + "istanbul-api": "1.1.14", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-instrument": "1.8.0", + "jest-changed-files": "17.0.2", + "jest-config": "18.1.0", + "jest-environment-jsdom": "18.1.0", + "jest-file-exists": "17.0.0", + "jest-haste-map": "18.1.0", + "jest-jasmine2": "18.1.0", + "jest-mock": "18.0.0", + "jest-resolve": "18.1.0", + "jest-resolve-dependencies": "18.1.0", + "jest-runtime": "18.1.0", + "jest-snapshot": "18.1.0", + "jest-util": "18.1.0", + "json-stable-stringify": "1.0.1", + "node-notifier": "4.6.1", + "sane": "1.4.1", + "strip-ansi": "3.0.1", + "throat": "3.2.0", + "which": "1.3.0", + "worker-farm": "1.5.0", + "yargs": "6.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + } + } + }, + "jest-config": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-18.1.0.tgz", + "integrity": "sha1-YRF0Cm1Iqrhv9anmqwuYvZk7b/Q=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "jest-environment-jsdom": "18.1.0", + "jest-environment-node": "18.1.0", + "jest-jasmine2": "18.1.0", + "jest-mock": "18.0.0", + "jest-resolve": "18.1.0", + "jest-util": "18.1.0", + "json-stable-stringify": "1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "jest-diff": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-18.1.0.tgz", + "integrity": "sha1-T/eedN2YjBORlbNl3GXYf2BvSAM=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "diff": "3.3.1", + "jest-matcher-utils": "18.1.0", + "pretty-format": "18.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "jest-environment-jsdom": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz", + "integrity": "sha1-GLQvDE6iuunzbKs2ObHo+MOE4k4=", + "dev": true, + "requires": { + "jest-mock": "18.0.0", + "jest-util": "18.1.0", + "jsdom": "9.12.0" + } + }, + "jest-environment-node": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-18.1.0.tgz", + "integrity": "sha1-TWeXVyyN2pms9frmlutilFVHx3k=", + "dev": true, + "requires": { + "jest-mock": "18.0.0", + "jest-util": "18.1.0" + } + }, + "jest-file-exists": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/jest-file-exists/-/jest-file-exists-17.0.0.tgz", + "integrity": "sha1-f2Prc6HEOhP0Yb4mF2i0WvLN0Wk=", + "dev": true + }, + "jest-haste-map": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-18.1.0.tgz", + "integrity": "sha1-BoOcdLdwpAwaEGlohR340oHAg3U=", + "dev": true, + "requires": { + "fb-watchman": "1.9.2", + "graceful-fs": "4.1.11", + "micromatch": "2.3.11", + "sane": "1.4.1", + "worker-farm": "1.5.0" + } + }, + "jest-jasmine2": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz", + "integrity": "sha1-CU4QTCwYlwh2bHcmO7Kuy1hgqAs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jest-matcher-utils": "18.1.0", + "jest-matchers": "18.1.0", + "jest-snapshot": "18.1.0", + "jest-util": "18.1.0" + } + }, + "jest-matcher-utils": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz", + "integrity": "sha1-GsRlGVXuKmDO8ef8yYzf13PA+TI=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "pretty-format": "18.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "jest-matchers": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-18.1.0.tgz", + "integrity": "sha1-A0FIS/h6H9C6wKTSyJnit3o/Hq0=", + "dev": true, + "requires": { + "jest-diff": "18.1.0", + "jest-matcher-utils": "18.1.0", + "jest-util": "18.1.0", + "pretty-format": "18.1.0" + } + }, + "jest-mock": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-18.0.0.tgz", + "integrity": "sha1-XCSIRuoz+lWLUm9TEqtKZ2XkibM=", + "dev": true + }, + "jest-resolve": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-18.1.0.tgz", + "integrity": "sha1-aACsy1NmWMkGzV4p3kErGrmsJJs=", + "dev": true, + "requires": { + "browser-resolve": "1.11.2", + "jest-file-exists": "17.0.0", + "jest-haste-map": "18.1.0", + "resolve": "1.4.0" + } + }, + "jest-resolve-dependencies": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz", + "integrity": "sha1-gTT7XK9Zye2EL+AVKrAcUnEfG7s=", + "dev": true, + "requires": { + "jest-file-exists": "17.0.0", + "jest-resolve": "18.1.0" + } + }, + "jest-runtime": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-18.1.0.tgz", + "integrity": "sha1-Or/WhxdbIfw7haK4BkOZ6ZeFmSI=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-jest": "18.0.0", + "babel-plugin-istanbul": "3.1.2", + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "jest-config": "18.1.0", + "jest-file-exists": "17.0.0", + "jest-haste-map": "18.1.0", + "jest-mock": "18.0.0", + "jest-resolve": "18.1.0", + "jest-snapshot": "18.1.0", + "jest-util": "18.1.0", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", + "yargs": "6.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + } + } + }, + "jest-snapshot": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-18.1.0.tgz", + "integrity": "sha1-VbltLuY5ybznb4fyo/1Atxx6WRY=", + "dev": true, + "requires": { + "jest-diff": "18.1.0", + "jest-file-exists": "17.0.0", + "jest-matcher-utils": "18.1.0", + "jest-util": "18.1.0", + "natural-compare": "1.4.0", + "pretty-format": "18.1.0" + } + }, + "jest-util": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-18.1.0.tgz", + "integrity": "sha1-OpnDIRSrF/hL4JQ4JScAbm1L/Go=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "diff": "3.3.1", + "graceful-fs": "4.1.11", + "jest-file-exists": "17.0.0", + "jest-mock": "18.0.0", + "mkdirp": "0.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "dev": true, + "requires": { + "abab": "1.0.4", + "acorn": "4.0.13", + "acorn-globals": "3.1.0", + "array-equal": "1.0.0", + "content-type-parser": "1.0.1", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "escodegen": "1.8.1", + "html-encoding-sniffer": "1.0.1", + "nwmatcher": "1.4.2", + "parse5": "1.5.1", + "request": "2.79.0", + "sax": "1.2.1", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.3", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.1", + "whatwg-url": "4.8.0", + "xml-name-validator": "2.0.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-refs": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-2.1.7.tgz", + "integrity": "sha1-uesB/in16j6Sh48VrqEK04taz4k=", + "requires": { + "commander": "2.11.0", + "graphlib": "2.1.1", + "js-yaml": "3.10.0", + "native-promise-only": "0.8.1", + "path-loader": "1.0.2", + "slash": "1.0.0", + "uri-js": "3.0.2" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + } + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "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=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "jsx-ast-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", + "dev": true + }, + "jszip": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.4.tgz", + "integrity": "sha512-z6w8iYIxZ/fcgul0j/OerkYnkomH8BZigvzbxVmr2h5HkZUrPtk2kjYtLkqR9wwQxEP6ecKNoKLsbhd18jfnGA==", + "dev": true, + "requires": { + "core-js": "2.3.0", + "es6-promise": "3.0.2", + "lie": "3.1.1", + "pako": "1.0.6", + "readable-stream": "2.0.6" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "jwt-decode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", + "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dev": true, + "requires": { + "immediate": "3.0.6" + } + }, + "list-item": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", + "integrity": "sha1-DGXQDih8tmPMs8s4Sad+iewmilY=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "extend-shallow": "2.0.1", + "is-number": "2.1.0", + "repeat-string": "1.6.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash-es": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha1-3MHXVS4VCgZABzupyzHXDwMpUOc=" + }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", + "dev": true + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._baseclone": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", + "dev": true, + "requires": { + "lodash._arraycopy": "3.0.0", + "lodash._arrayeach": "3.0.0", + "lodash._baseassign": "3.2.0", + "lodash._basefor": "3.0.3", + "lodash.isarray": "3.0.4", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.clonedeep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", + "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", + "dev": true, + "requires": { + "lodash._baseclone": "3.3.0", + "lodash._bindcallback": "3.0.1" + } + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "lodash.endswith": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", + "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=", + "dev": true + }, + "lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", + "dev": true + }, + "lodash.findindex": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", + "integrity": "sha1-oyRd7mH7m24GJLU1ElYku2nBEQY=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lsmod": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz", + "integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks=" + }, + "make-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "requires": { + "pify": "2.3.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.4" + } + }, + "markdown-link": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", + "integrity": "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88=", + "dev": true + }, + "markdown-magic": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/markdown-magic/-/markdown-magic-0.1.19.tgz", + "integrity": "sha1-IKnWWdqgx7DOt64DCVxuLK41KgM=", + "dev": true, + "requires": { + "commander": "2.11.0", + "deepmerge": "1.5.2", + "find-up": "2.1.0", + "fs-extra": "1.0.0", + "globby": "6.1.0", + "is-local-path": "0.1.6", + "markdown-toc": "1.2.0", + "sync-request": "3.0.1" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1" + } + } + } + }, + "markdown-toc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "diacritics-map": "0.1.0", + "gray-matter": "2.1.1", + "lazy-cache": "2.0.2", + "list-item": "1.1.1", + "markdown-link": "0.1.1", + "minimist": "1.2.0", + "mixin-deep": "1.2.0", + "object.pick": "1.3.0", + "remarkable": "1.7.1", + "repeat-string": "1.6.1", + "strip-color": "0.1.0" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "0.1.0" + } + } + } + }, + "marked": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", + "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", + "dev": true + }, + "marked-terminal": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-1.7.0.tgz", + "integrity": "sha1-yMRgiBx3LHYEtkNnAH7l938SWQQ=", + "dev": true, + "requires": { + "cardinal": "1.0.0", + "chalk": "1.1.3", + "cli-table": "0.3.1", + "lodash.assign": "4.2.0", + "node-emoji": "1.8.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mixin-deep": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.2.0.tgz", + "integrity": "sha1-0CuMb4ttS49ZgtP9AJxJGYUcP+I=", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "0.1.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "mocha-lcov-reporter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", + "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=", + "dev": true + }, + "mock-require": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mock-require/-/mock-require-1.3.0.tgz", + "integrity": "sha1-gmFElS5QR2L45pJKqPY5Rl0deiQ=", + "dev": true, + "requires": { + "caller-id": "0.1.0" + } + }, + "module-not-found-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", + "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", + "dev": true + }, + "moment": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", + "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=" + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-emoji": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", + "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", + "dev": true, + "requires": { + "lodash.toarray": "4.4.0" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node-forge": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", + "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-4.6.1.tgz", + "integrity": "sha1-BW0UJE89zBzq3+aK+c/wxUc6M/M=", + "dev": true, + "requires": { + "cli-usage": "0.1.4", + "growly": "1.3.0", + "lodash.clonedeep": "3.0.2", + "minimist": "1.2.0", + "semver": "5.4.1", + "shellwords": "0.1.1", + "which": "1.3.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.0.9" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-conf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.2.tgz", + "integrity": "sha512-dotwbpwVzfNB/2EF3A2wjK5tEMLggKfuA/8TG6WvBB1Zrv+JsvF7E8ei9B/HGq211st/GwXFbREcNJvJ1eySUQ==", + "requires": { + "config-chain": "1.1.11", + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "npmlog": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", + "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", + "requires": { + "ansi": "0.3.1", + "are-we-there-yet": "1.1.4", + "gauge": "1.2.7" + } + }, + "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=" + }, + "nwmatcher": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.2.tgz", + "integrity": "sha512-QMkCGQFYp5p+zwU3INntLmz1HMfSx9dMVJMYKmE1yuSf/22Wjo6VPFa405mCLUuQn9lbQvH2DZN9lt10ZNvtAg==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.assign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "object-keys": "1.0.11" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "requires": { + "is-wsl": "1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=" + }, + "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=" + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "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=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-loader": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.2.tgz", + "integrity": "sha1-zVxz5+OakQEb4UjWv92KhbuTHvk=", + "requires": { + "native-promise-only": "0.8.1", + "superagent": "3.6.3" + } + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pkg-up": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-18.1.0.tgz", + "integrity": "sha1-+2Wob3p/kZSWPu6RhlwbzxA54oQ=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + } + } + }, + "private": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "2.0.6" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "proxyquire": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.8.0.tgz", + "integrity": "sha1-AtUUpb7ZhvBMuyCTrxZ0FTX3ntw=", + "dev": true, + "requires": { + "fill-keys": "1.0.2", + "module-not-found-error": "1.0.1", + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" + }, + "ramda": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", + "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "raven": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/raven/-/raven-1.2.1.tgz", + "integrity": "sha1-lJwTTbAooZC3u/j3kKrlQbfAIL0=", + "requires": { + "cookie": "0.3.1", + "json-stringify-safe": "5.0.1", + "lsmod": "1.0.0", + "stack-trace": "0.0.9", + "uuid": "3.0.0" + }, + "dependencies": { + "uuid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", + "integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=" + } + } + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.4.0" + } + }, + "redeyed": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", + "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", + "dev": true, + "requires": { + "esprima": "3.0.0" + }, + "dependencies": { + "esprima": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", + "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", + "dev": true + } + } + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "4.17.4", + "lodash-es": "4.17.4", + "loose-envify": "1.3.1", + "symbol-observable": "1.0.4" + } + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remarkable": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", + "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", + "dev": true, + "requires": { + "argparse": "0.1.16", + "autolinker": "0.15.3" + }, + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "dev": true, + "requires": { + "underscore": "1.7.0", + "underscore.string": "2.4.0" + } + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "replaceall": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz", + "integrity": "sha1-gdgax663LX9cSUKt8ml6MiBojY4=" + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + }, + "dependencies": { + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "2.1.0" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "sane": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sane/-/sane-1.4.1.tgz", + "integrity": "sha1-iPdj10BA9fDCVrYWPbOZvxEKxxU=", + "dev": true, + "requires": { + "exec-sh": "0.2.1", + "fb-watchman": "1.9.2", + "minimatch": "3.0.4", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.10.0" + } + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "requires": { + "commander": "2.8.1" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=" + }, + "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 + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "0.3.0" + } + }, + "shelljs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": "0.10.3" + } + }, + "sinon-bluebird": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sinon-bluebird/-/sinon-bluebird-3.1.0.tgz", + "integrity": "sha1-+SaA+lRtVTpPX2LekEJetdxHhB0=", + "dev": true + }, + "sinon-chai": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", + "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "requires": { + "concat-stream": "1.6.0", + "os-shim": "0.1.3" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + }, + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "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.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=", + "dev": true + }, + "strip-dirs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.0.0.tgz", + "integrity": "sha1-YQzbKSggDaAAT0HcuQ/JXNkZoLY=", + "requires": { + "is-natural-number": "4.0.1" + } + }, + "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=" + }, + "strip-outer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.0.tgz", + "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "superagent": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.6.3.tgz", + "integrity": "sha512-GjsfCFijfjqoz2tRiStSOoTdy7gNZOcK3ar4zONP9D8dXQWE+Qg7cbePHimRpapo06WUvoU3dmgi2e4q+sab5A==", + "requires": { + "component-emitter": "1.2.1", + "cookiejar": "2.1.1", + "debug": "3.1.0", + "extend": "3.0.1", + "form-data": "2.3.1", + "formidable": "1.1.1", + "methods": "1.1.2", + "mime": "1.4.1", + "qs": "6.5.1", + "readable-stream": "2.3.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "requires": { + "has-flag": "2.0.0" + } + }, + "symbol-observable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", + "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "sync-request": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-3.0.1.tgz", + "integrity": "sha1-yqEjWq+Im6UBB2oYNMQ2gwqC+3M=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "http-response-object": "1.1.0", + "then-request": "2.2.0" + } + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "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 + }, + "string-width": { + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "tabtab": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-2.2.2.tgz", + "integrity": "sha1-egR/FDsBC0y9MfhX6ClhUSy/ThQ=", + "requires": { + "debug": "2.6.9", + "inquirer": "1.2.3", + "lodash.difference": "4.5.0", + "lodash.uniq": "4.5.0", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "npmlog": "2.0.4", + "object-assign": "4.1.1" + } + }, + "tar-stream": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", + "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", + "requires": { + "bl": "1.2.1", + "end-of-stream": "1.4.0", + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "test-exclude": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-3.3.0.tgz", + "integrity": "sha1-ehfKEjmYjJg2ewYhRW27fUvDiXc=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "then-request": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-2.2.0.tgz", + "integrity": "sha1-ZnizL6DKIY/laZgbvYhxtZQGDYE=", + "dev": true, + "requires": { + "caseless": "0.11.0", + "concat-stream": "1.6.0", + "http-basic": "2.5.1", + "http-response-object": "1.1.0", + "promise": "7.3.1", + "qs": "6.5.1" + } + }, + "throat": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", + "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "toml": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz", + "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==", + "dev": true + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "unbzip2-stream": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", + "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", + "requires": { + "buffer": "3.6.0", + "through": "2.3.8" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "requires": { + "base64-js": "0.0.8", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + } + } + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + } + } + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "url-parse": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", + "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "walkdir": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", + "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=" + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.11" + } + }, + "watch": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", + "dev": true + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", + "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", + "dev": true, + "requires": { + "iconv-lite": "0.4.13" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + } + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, + "whatwg-url": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "dev": true, + "requires": { + "tr46": "0.0.3", + "webidl-conversions": "3.0.1" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.0.tgz", + "integrity": "sha512-DHRiUggxtbruaTwnLDm2/BRDKZIoOYvrgYUj5Bam4fU6Gtvc0FaEyoswFPBjMXAweGW2H4BDNIpy//1yXXuaqQ==", + "dev": true, + "requires": { + "errno": "0.1.4", + "xtend": "4.0.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "dev": true + }, + "xml2js": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", + "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", + "requires": { + "sax": "1.2.1", + "xmlbuilder": "4.2.1" + } + }, + "xmlbuilder": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", + "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", + "requires": { + "lodash": "4.17.4" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yaml-ast-parser": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.34.tgz", + "integrity": "sha1-0A88+ddztyQUCa6SpnQNHbGfSeY=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz", + "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=", + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } + }, + "zen-observable-ts": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.4.4.tgz", + "integrity": "sha512-SNVY1sWWhoe7FwFmHpD9ERi+7Mhhj3+JdS0BGy2UxLIg7cY+3zQbyZauQCI6DN6YK4uoKNaIm3S7Qkqi1Lr+Fw==" + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "requires": { + "archiver-utils": "1.3.0", + "compress-commons": "1.2.0", + "lodash": "4.17.4", + "readable-stream": "2.3.3" + } + } + } +} From a7f267ae249e2d4d14cea0c5bb0603328843c519 Mon Sep 17 00:00:00 2001 From: horike37 Date: Sat, 7 Oct 2017 19:54:00 +0900 Subject: [PATCH 083/128] remove package-lock.json --- package-lock.json | 6386 --------------------------------------------- 1 file changed, 6386 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index e3021127a..000000000 --- a/package-lock.json +++ /dev/null @@ -1,6386 +0,0 @@ -{ - "name": "serverless", - "version": "1.23.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@serverless/fdk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@serverless/fdk/-/fdk-0.5.1.tgz", - "integrity": "sha512-Z/+5R0AohLwDT1E+9BTeUA7NozlyIoTh0iEt6x8x+ZZhIBK5HBMBN6v2LfkI4wmmOOyceTvsN0l8nWfGp4Oh5g==", - "requires": { - "isomorphic-fetch": "2.2.1", - "ramda": "0.24.1", - "url-parse": "1.1.9" - } - }, - "@types/graphql": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-0.10.2.tgz", - "integrity": "sha512-Ayw0w+kr8vYd8DToiMXjcHxXv1ljWbqX2mnLwXDxkBgog3vywGriC0JZ+npsuohKs3+E88M8OOtobo4g0X3SIA==", - "optional": true - }, - "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", - "dev": true - }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", - "dev": true - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "dev": true, - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", - "requires": { - "extend": "3.0.1", - "semver": "5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=" - } - } - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" - }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "1.9.0" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "ansicolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", - "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=", - "dev": true - }, - "apollo-client": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-1.9.3.tgz", - "integrity": "sha512-JABKKbqvcw8DJm3YUkEmyx1SK74i+/DesEtAtyocJi10LLmeMQYQFpg8W3BG1tZsYEQ3owEmPbsdNGTly+VOQg==", - "requires": { - "@types/graphql": "0.10.2", - "apollo-link-core": "0.5.4", - "graphql": "0.10.5", - "graphql-anywhere": "3.1.0", - "graphql-tag": "2.4.2", - "redux": "3.7.2", - "symbol-observable": "1.0.4", - "whatwg-fetch": "2.0.3" - } - }, - "apollo-link-core": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/apollo-link-core/-/apollo-link-core-0.5.4.tgz", - "integrity": "sha512-OxL0Kjizb0eS2ObldDqJEs/tFN9xI9RZuTJcaszgGy+xudoPXhIMCHMr7hGZhy0mK+U+BbBULZJw4YQU4J0ODQ==", - "requires": { - "graphql": "0.10.5", - "graphql-tag": "2.4.2", - "zen-observable-ts": "0.4.4" - } - }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "1.0.0" - } - }, - "archiver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", - "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", - "requires": { - "archiver-utils": "1.3.0", - "async": "2.5.0", - "buffer-crc32": "0.2.13", - "glob": "7.1.2", - "lodash": "4.17.4", - "readable-stream": "2.3.3", - "tar-stream": "1.5.4", - "walkdir": "0.0.11", - "zip-stream": "1.2.0" - }, - "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "requires": { - "lodash": "4.17.4" - } - } - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "requires": { - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lazystream": "1.0.0", - "lodash": "4.17.4", - "normalize-path": "2.1.1", - "readable-stream": "2.3.3" - } - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "array.prototype.find": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", - "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "assertion-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "autolinker": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", - "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", - "dev": true - }, - "aws-sdk": { - "version": "2.130.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.130.0.tgz", - "integrity": "sha1-8Mbafb2poVywwr6zAw9toqTAPDY=", - "requires": { - "buffer": "4.9.1", - "crypto-browserify": "1.0.9", - "events": "1.1.1", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.1.0", - "xml2js": "0.4.17", - "xmlbuilder": "4.2.1" - }, - "dependencies": { - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - } - } - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.0", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-jest": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-18.0.0.tgz", - "integrity": "sha1-F+u6jLMoXJBthZ6HB+Tnl5X7ZeM=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-plugin-istanbul": "3.1.2", - "babel-preset-jest": "18.0.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-istanbul": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz", - "integrity": "sha1-EdWr3hhCXsJLXWSMfgtdJc01SiI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "istanbul-lib-instrument": "1.8.0", - "object-assign": "4.1.1", - "test-exclude": "3.3.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz", - "integrity": "sha1-QVDnDsq1YObnNErchJSYBy004So=", - "dev": true - }, - "babel-preset-jest": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz", - "integrity": "sha1-hPr4yj7GWrp9Xj9Zu67ZNaskBJ4=", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "18.0.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "2.3.3" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "bser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", - "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", - "dev": true, - "requires": { - "node-int64": "0.4.0" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "caller-id": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-id/-/caller-id-0.1.0.tgz", - "integrity": "sha1-Wb2sCJPRLDhxQIJ5Ix+XRYNk8Hs=", - "dev": true, - "requires": { - "stack-trace": "0.0.9" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" - }, - "cardinal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", - "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", - "dev": true, - "requires": { - "ansicolors": "0.2.1", - "redeyed": "1.0.1" - } - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "caw": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", - "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", - "requires": { - "get-proxy": "2.1.0", - "isurl": "1.0.0", - "tunnel-agent": "0.6.0", - "url-to-options": "1.0.1" - } - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", - "dev": true, - "requires": { - "assertion-error": "1.0.2", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" - } - }, - "chai-as-promised": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-6.0.0.tgz", - "integrity": "sha1-GgKkM6byTa+sY7nJb6FoTbGqjaY=", - "dev": true, - "requires": { - "check-error": "1.0.2" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "ci-info": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.1.tgz", - "integrity": "sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ==" - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "requires": { - "restore-cursor": "1.0.1" - } - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - } - }, - "cli-usage": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.4.tgz", - "integrity": "sha1-fAHg3HBsI0s5yTODjI4gshdXduI=", - "dev": true, - "requires": { - "marked": "0.3.6", - "marked-terminal": "1.7.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "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=" - }, - "coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", - "dev": true - }, - "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "compress-commons": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", - "integrity": "sha1-WFhwku8g03y1i68AARLJJ4/3O58=", - "requires": { - "buffer-crc32": "0.2.13", - "crc32-stream": "2.0.0", - "normalize-path": "2.1.1", - "readable-stream": "2.3.3" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, - "config-chain": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", - "requires": { - "ini": "1.3.4", - "proto-list": "1.2.4" - } - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-type-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", - "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookiejar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" - }, - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "coveralls": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", - "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==", - "dev": true, - "requires": { - "js-yaml": "3.6.1", - "lcov-parse": "0.0.10", - "log-driver": "1.2.5", - "minimist": "1.2.0", - "request": "2.79.0" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" - } - } - } - }, - "crc": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", - "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=" - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "requires": { - "crc": "3.5.0", - "readable-stream": "2.3.3" - } - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "requires": { - "capture-stack-trace": "1.0.0" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "crypto-browserify": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-1.0.9.tgz", - "integrity": "sha1-zFRJaF37hesRyYKKzHy4erW7/MA=" - }, - "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", - "dev": true - }, - "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", - "dev": true, - "requires": { - "cssom": "0.3.2" - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.30" - } - }, - "damerau-levenshtein": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", - "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "requires": { - "decompress-tar": "4.1.1", - "decompress-tarbz2": "4.1.1", - "decompress-targz": "4.1.1", - "decompress-unzip": "4.0.1", - "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "pify": "2.3.0", - "strip-dirs": "2.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "requires": { - "file-type": "5.2.0", - "is-stream": "1.1.0", - "tar-stream": "1.5.4" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "requires": { - "decompress-tar": "4.1.1", - "file-type": "6.2.0", - "is-stream": "1.1.0", - "seek-bzip": "1.0.5", - "unbzip2-stream": "1.2.5" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "requires": { - "decompress-tar": "4.1.1", - "file-type": "5.2.0", - "is-stream": "1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "requires": { - "file-type": "3.9.0", - "get-stream": "2.3.1", - "pify": "2.3.0", - "yauzl": "2.8.0" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" - } - } - } - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - } - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - }, - "dependencies": { - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "diacritics-map": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", - "integrity": "sha1-bfwP+dAQAKLt8oZTccrDFulJd68=", - "dev": true - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "doctrine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "download": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/download/-/download-5.0.3.tgz", - "integrity": "sha1-Y1N/l3+ZJmow64oqL70fILgAD3o=", - "requires": { - "caw": "2.0.1", - "decompress": "4.2.0", - "filenamify": "2.0.0", - "get-stream": "3.0.0", - "got": "6.7.1", - "mkdirp": "0.5.1", - "pify": "2.3.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "0.4.19" - } - }, - "end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "requires": { - "once": "1.4.0" - } - }, - "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "dev": true, - "requires": { - "prr": "0.0.0" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es-abstract": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", - "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", - "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" - } - }, - "es5-ext": { - "version": "0.10.30", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", - "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", - "dev": true, - "requires": { - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-iterator": "2.0.1", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "dev": true - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "2.7.3", - "estraverse": "1.9.3", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.2.0" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.9", - "doctrine": "2.0.0", - "escope": "3.6.0", - "espree": "3.5.1", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.5", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.1", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" - } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.0.4", - "rechoir": "0.6.2" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "eslint-config-airbnb": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-10.0.1.tgz", - "integrity": "sha1-pHAQhkbWxF4fY5oD8R1QShqkrtw=", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "5.0.3" - } - }, - "eslint-config-airbnb-base": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-5.0.3.tgz", - "integrity": "sha1-lxSsNews1/qw1E0Uip+R2ylEB00=", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", - "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", - "dev": true, - "requires": { - "debug": "2.6.9", - "object-assign": "4.1.1", - "resolve": "1.4.0" - } - }, - "eslint-plugin-import": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz", - "integrity": "sha1-svoH68xTUE0PKkR3WC7Iv/GHG58=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.9", - "doctrine": "1.3.0", - "es6-map": "0.1.5", - "es6-set": "0.1.5", - "eslint-import-resolver-node": "0.2.3", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "lodash.endswith": "4.2.1", - "lodash.find": "4.6.0", - "lodash.findindex": "4.6.0", - "minimatch": "3.0.4", - "object-assign": "4.1.1", - "pkg-dir": "1.0.0", - "pkg-up": "1.0.0" - }, - "dependencies": { - "doctrine": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.3.0.tgz", - "integrity": "sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz", - "integrity": "sha1-TjXLcbin23AqxBXIBuuOjZ6mxl0=", - "dev": true, - "requires": { - "damerau-levenshtein": "1.0.4", - "jsx-ast-utils": "1.4.1", - "object-assign": "4.1.1" - } - }, - "eslint-plugin-react": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", - "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", - "dev": true, - "requires": { - "array.prototype.find": "2.0.4", - "doctrine": "1.5.0", - "has": "1.0.1", - "jsx-ast-utils": "1.4.1", - "object.assign": "4.0.4" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - } - } - }, - "espree": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", - "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", - "dev": true, - "requires": { - "acorn": "5.1.2", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.30" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "exec-sh": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", - "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", - "dev": true, - "requires": { - "merge": "1.2.0" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "external-editor": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", - "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", - "requires": { - "extend": "3.0.1", - "spawn-sync": "1.0.15", - "tmp": "0.0.29" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fb-watchman": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", - "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", - "dev": true, - "requires": { - "bser": "1.0.2" - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "requires": { - "pend": "1.2.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" - }, - "filenamify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.0.0.tgz", - "integrity": "sha1-vRYiYsC26Uv7zc8Zo7uzdk94VpU=", - "requires": { - "filename-reserved-regex": "2.0.0", - "strip-outer": "1.0.0", - "trim-repeated": "1.0.0" - } - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" - } - }, - "filesize": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.10.tgz", - "integrity": "sha1-/I+iPdtO+eXgq24eZPZ5okpWdh8=" - }, - "fill-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", - "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", - "dev": true, - "requires": { - "is-object": "1.0.1", - "merge-descriptors": "1.0.1" - } - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "dev": true, - "requires": { - "samsam": "1.1.2" - } - }, - "formidable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" - }, - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", - "requires": { - "ansi": "0.3.1", - "has-unicode": "2.0.1", - "lodash.pad": "4.5.1", - "lodash.padend": "4.6.1", - "lodash.padstart": "4.6.1" - } - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-proxy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", - "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", - "requires": { - "npm-conf": "1.1.2" - } - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "graphlib": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.1.tgz", - "integrity": "sha1-QjUsUrovTQNctWbrkfc5X3bryVE=", - "requires": { - "lodash": "4.17.4" - } - }, - "graphql": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.10.5.tgz", - "integrity": "sha512-Q7cx22DiLhwHsEfUnUip1Ww/Vfx7FS0w6+iHItNuN61+XpegHSa3k5U0+6M5BcpavQImBwFiy0z3uYwY7cXMLQ==", - "requires": { - "iterall": "1.1.3" - } - }, - "graphql-anywhere": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/graphql-anywhere/-/graphql-anywhere-3.1.0.tgz", - "integrity": "sha1-PqDY6GRrXO5oA1AWqadVfBXCHpY=" - }, - "graphql-tag": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.4.2.tgz", - "integrity": "sha1-amMpfYUi0DorctJvGyOaqzQ4QM0=" - }, - "gray-matter": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", - "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=", - "dev": true, - "requires": { - "ansi-red": "0.1.1", - "coffee-script": "1.12.7", - "extend-shallow": "2.0.1", - "js-yaml": "3.10.0", - "toml": "2.3.3" - } - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "commander": "2.11.0", - "is-my-json-valid": "2.16.1", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "has-symbol-support-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz", - "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "1.4.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", - "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", - "dev": true, - "requires": { - "whatwg-encoding": "1.0.1" - } - }, - "http-basic": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-2.5.1.tgz", - "integrity": "sha1-jORHvbW2xXf4pj4/p4BW7Eu02/s=", - "dev": true, - "requires": { - "caseless": "0.11.0", - "concat-stream": "1.6.0", - "http-response-object": "1.1.0" - } - }, - "http-response-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-1.1.0.tgz", - "integrity": "sha1-p8TnWq6C87tJBOT0P2FWc7TVGMM=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "ignore": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", - "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", - "dev": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "inquirer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", - "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", - "requires": { - "ansi-escapes": "1.4.0", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "external-editor": "1.1.1", - "figures": "1.7.0", - "lodash": "4.17.4", - "mute-stream": "0.0.6", - "pinkie-promise": "2.0.1", - "run-async": "2.3.0", - "rx": "4.1.0", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "interpret": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", - "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true - }, - "is-ci": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", - "dev": true, - "requires": { - "ci-info": "1.1.1" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-docker": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", - "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "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.1" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-local-path": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-local-path/-/is-local-path-0.1.6.tgz", - "integrity": "sha1-gV0USxTVac7L6tTVaTCX8Aqb9sU=", - "dev": true - }, - "is-my-json-valid": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", - "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "1.0.1" - } - }, - "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "1.0.3" - } - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "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 - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.3" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.9", - "async": "1.5.2", - "escodegen": "1.8.1", - "esprima": "2.7.3", - "glob": "5.0.15", - "handlebars": "4.0.10", - "js-yaml": "3.10.0", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.4.0", - "resolve": "1.1.7", - "supports-color": "3.2.3", - "which": "1.3.0", - "wordwrap": "1.0.0" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "istanbul-api": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.14.tgz", - "integrity": "sha1-JbxXAffGgMD//5E95G42GaOm5oA=", - "dev": true, - "requires": { - "async": "2.5.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.0.7", - "istanbul-lib-instrument": "1.8.0", - "istanbul-lib-report": "1.1.1", - "istanbul-lib-source-maps": "1.2.1", - "istanbul-reports": "1.1.2", - "js-yaml": "3.10.0", - "mkdirp": "0.5.1", - "once": "1.4.0" - }, - "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - } - } - }, - "istanbul-lib-coverage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==", - "dev": true, - "requires": { - "append-transform": "0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", - "integrity": "sha1-ZvbJQhzJ7EcE928tsIS6kHiitTI=", - "dev": true, - "requires": { - "babel-generator": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.1.1", - "semver": "5.4.1" - } - }, - "istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-tvF+YmCmH4thnez6JFX06ujIA19WPa9YUiwjc1uALF2cv5dmE3It8b5I8Ob7FHJ70H9Y5yF+TDkVa/mcADuw1Q==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", - "integrity": "sha512-mukVvSXCn9JQvdJl8wP/iPhqig0MRtuWuD4ZNKo6vB2Ik//AmhAKe3QnPN02dmkRe3lTudFk3rzoHhwU4hb94w==", - "dev": true, - "requires": { - "debug": "2.6.9", - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha1-D7Lj9qqZIr085F0F2KtNXo4HvU8=", - "dev": true, - "requires": { - "handlebars": "4.0.10" - } - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" - } - }, - "iterall": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", - "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==" - }, - "jest-changed-files": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-17.0.2.tgz", - "integrity": "sha1-9WV3WHNplvWQpRuH5ck2nZBLp7c=", - "dev": true - }, - "jest-cli": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-18.1.0.tgz", - "integrity": "sha1-Xq027K1CCBfCybqiqnV09jJXs9Y=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "callsites": "2.0.0", - "chalk": "1.1.3", - "graceful-fs": "4.1.11", - "is-ci": "1.0.10", - "istanbul-api": "1.1.14", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-instrument": "1.8.0", - "jest-changed-files": "17.0.2", - "jest-config": "18.1.0", - "jest-environment-jsdom": "18.1.0", - "jest-file-exists": "17.0.0", - "jest-haste-map": "18.1.0", - "jest-jasmine2": "18.1.0", - "jest-mock": "18.0.0", - "jest-resolve": "18.1.0", - "jest-resolve-dependencies": "18.1.0", - "jest-runtime": "18.1.0", - "jest-snapshot": "18.1.0", - "jest-util": "18.1.0", - "json-stable-stringify": "1.0.1", - "node-notifier": "4.6.1", - "sane": "1.4.1", - "strip-ansi": "3.0.1", - "throat": "3.2.0", - "which": "1.3.0", - "worker-farm": "1.5.0", - "yargs": "6.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - } - } - } - }, - "jest-config": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-18.1.0.tgz", - "integrity": "sha1-YRF0Cm1Iqrhv9anmqwuYvZk7b/Q=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "jest-environment-jsdom": "18.1.0", - "jest-environment-node": "18.1.0", - "jest-jasmine2": "18.1.0", - "jest-mock": "18.0.0", - "jest-resolve": "18.1.0", - "jest-util": "18.1.0", - "json-stable-stringify": "1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "jest-diff": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-18.1.0.tgz", - "integrity": "sha1-T/eedN2YjBORlbNl3GXYf2BvSAM=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "diff": "3.3.1", - "jest-matcher-utils": "18.1.0", - "pretty-format": "18.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "jest-environment-jsdom": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz", - "integrity": "sha1-GLQvDE6iuunzbKs2ObHo+MOE4k4=", - "dev": true, - "requires": { - "jest-mock": "18.0.0", - "jest-util": "18.1.0", - "jsdom": "9.12.0" - } - }, - "jest-environment-node": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-18.1.0.tgz", - "integrity": "sha1-TWeXVyyN2pms9frmlutilFVHx3k=", - "dev": true, - "requires": { - "jest-mock": "18.0.0", - "jest-util": "18.1.0" - } - }, - "jest-file-exists": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/jest-file-exists/-/jest-file-exists-17.0.0.tgz", - "integrity": "sha1-f2Prc6HEOhP0Yb4mF2i0WvLN0Wk=", - "dev": true - }, - "jest-haste-map": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-18.1.0.tgz", - "integrity": "sha1-BoOcdLdwpAwaEGlohR340oHAg3U=", - "dev": true, - "requires": { - "fb-watchman": "1.9.2", - "graceful-fs": "4.1.11", - "micromatch": "2.3.11", - "sane": "1.4.1", - "worker-farm": "1.5.0" - } - }, - "jest-jasmine2": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz", - "integrity": "sha1-CU4QTCwYlwh2bHcmO7Kuy1hgqAs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jest-matcher-utils": "18.1.0", - "jest-matchers": "18.1.0", - "jest-snapshot": "18.1.0", - "jest-util": "18.1.0" - } - }, - "jest-matcher-utils": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz", - "integrity": "sha1-GsRlGVXuKmDO8ef8yYzf13PA+TI=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "pretty-format": "18.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "jest-matchers": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-18.1.0.tgz", - "integrity": "sha1-A0FIS/h6H9C6wKTSyJnit3o/Hq0=", - "dev": true, - "requires": { - "jest-diff": "18.1.0", - "jest-matcher-utils": "18.1.0", - "jest-util": "18.1.0", - "pretty-format": "18.1.0" - } - }, - "jest-mock": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-18.0.0.tgz", - "integrity": "sha1-XCSIRuoz+lWLUm9TEqtKZ2XkibM=", - "dev": true - }, - "jest-resolve": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-18.1.0.tgz", - "integrity": "sha1-aACsy1NmWMkGzV4p3kErGrmsJJs=", - "dev": true, - "requires": { - "browser-resolve": "1.11.2", - "jest-file-exists": "17.0.0", - "jest-haste-map": "18.1.0", - "resolve": "1.4.0" - } - }, - "jest-resolve-dependencies": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz", - "integrity": "sha1-gTT7XK9Zye2EL+AVKrAcUnEfG7s=", - "dev": true, - "requires": { - "jest-file-exists": "17.0.0", - "jest-resolve": "18.1.0" - } - }, - "jest-runtime": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-18.1.0.tgz", - "integrity": "sha1-Or/WhxdbIfw7haK4BkOZ6ZeFmSI=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-jest": "18.0.0", - "babel-plugin-istanbul": "3.1.2", - "chalk": "1.1.3", - "graceful-fs": "4.1.11", - "jest-config": "18.1.0", - "jest-file-exists": "17.0.0", - "jest-haste-map": "18.1.0", - "jest-mock": "18.0.0", - "jest-resolve": "18.1.0", - "jest-snapshot": "18.1.0", - "jest-util": "18.1.0", - "json-stable-stringify": "1.0.1", - "micromatch": "2.3.11", - "yargs": "6.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - } - } - } - }, - "jest-snapshot": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-18.1.0.tgz", - "integrity": "sha1-VbltLuY5ybznb4fyo/1Atxx6WRY=", - "dev": true, - "requires": { - "jest-diff": "18.1.0", - "jest-file-exists": "17.0.0", - "jest-matcher-utils": "18.1.0", - "jest-util": "18.1.0", - "natural-compare": "1.4.0", - "pretty-format": "18.1.0" - } - }, - "jest-util": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-18.1.0.tgz", - "integrity": "sha1-OpnDIRSrF/hL4JQ4JScAbm1L/Go=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "diff": "3.3.1", - "graceful-fs": "4.1.11", - "jest-file-exists": "17.0.0", - "jest-mock": "18.0.0", - "mkdirp": "0.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jsdom": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", - "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", - "dev": true, - "requires": { - "abab": "1.0.4", - "acorn": "4.0.13", - "acorn-globals": "3.1.0", - "array-equal": "1.0.0", - "content-type-parser": "1.0.1", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "escodegen": "1.8.1", - "html-encoding-sniffer": "1.0.1", - "nwmatcher": "1.4.2", - "parse5": "1.5.1", - "request": "2.79.0", - "sax": "1.2.1", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.3", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.1", - "whatwg-url": "4.8.0", - "xml-name-validator": "2.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-refs": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-2.1.7.tgz", - "integrity": "sha1-uesB/in16j6Sh48VrqEK04taz4k=", - "requires": { - "commander": "2.11.0", - "graphlib": "2.1.1", - "js-yaml": "3.10.0", - "native-promise-only": "0.8.1", - "path-loader": "1.0.2", - "slash": "1.0.0", - "uri-js": "3.0.2" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" - } - } - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "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=" - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "jsx-ast-utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", - "dev": true - }, - "jszip": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.4.tgz", - "integrity": "sha512-z6w8iYIxZ/fcgul0j/OerkYnkomH8BZigvzbxVmr2h5HkZUrPtk2kjYtLkqR9wwQxEP6ecKNoKLsbhd18jfnGA==", - "dev": true, - "requires": { - "core-js": "2.3.0", - "es6-promise": "3.0.2", - "lie": "3.1.1", - "pako": "1.0.6", - "readable-stream": "2.0.6" - }, - "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "jwt-decode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", - "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "2.3.3" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "dev": true, - "requires": { - "immediate": "3.0.6" - } - }, - "list-item": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", - "integrity": "sha1-DGXQDih8tmPMs8s4Sad+iewmilY=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "extend-shallow": "2.0.1", - "is-number": "2.1.0", - "repeat-string": "1.6.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash-es": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", - "integrity": "sha1-3MHXVS4VCgZABzupyzHXDwMpUOc=" - }, - "lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", - "dev": true - }, - "lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._baseclone": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", - "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", - "dev": true, - "requires": { - "lodash._arraycopy": "3.0.0", - "lodash._arrayeach": "3.0.0", - "lodash._baseassign": "3.2.0", - "lodash._basefor": "3.0.3", - "lodash.isarray": "3.0.4", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.clonedeep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", - "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", - "dev": true, - "requires": { - "lodash._baseclone": "3.3.0", - "lodash._bindcallback": "3.0.1" - } - }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", - "dev": true - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "lodash.endswith": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", - "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=", - "dev": true - }, - "lodash.find": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", - "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", - "dev": true - }, - "lodash.findindex": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", - "integrity": "sha1-oyRd7mH7m24GJLU1ElYku2nBEQY=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" - }, - "lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" - }, - "lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "log-driver": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", - "dev": true - }, - "lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, - "lsmod": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz", - "integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks=" - }, - "make-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", - "requires": { - "pify": "2.3.0" - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.4" - } - }, - "markdown-link": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", - "integrity": "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88=", - "dev": true - }, - "markdown-magic": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/markdown-magic/-/markdown-magic-0.1.19.tgz", - "integrity": "sha1-IKnWWdqgx7DOt64DCVxuLK41KgM=", - "dev": true, - "requires": { - "commander": "2.11.0", - "deepmerge": "1.5.2", - "find-up": "2.1.0", - "fs-extra": "1.0.0", - "globby": "6.1.0", - "is-local-path": "0.1.6", - "markdown-toc": "1.2.0", - "sync-request": "3.0.1" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1" - } - } - } - }, - "markdown-toc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", - "dev": true, - "requires": { - "concat-stream": "1.6.0", - "diacritics-map": "0.1.0", - "gray-matter": "2.1.1", - "lazy-cache": "2.0.2", - "list-item": "1.1.1", - "markdown-link": "0.1.1", - "minimist": "1.2.0", - "mixin-deep": "1.2.0", - "object.pick": "1.3.0", - "remarkable": "1.7.1", - "repeat-string": "1.6.1", - "strip-color": "0.1.0" - }, - "dependencies": { - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "dev": true, - "requires": { - "set-getter": "0.1.0" - } - } - } - }, - "marked": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", - "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", - "dev": true - }, - "marked-terminal": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-1.7.0.tgz", - "integrity": "sha1-yMRgiBx3LHYEtkNnAH7l938SWQQ=", - "dev": true, - "requires": { - "cardinal": "1.0.0", - "chalk": "1.1.3", - "cli-table": "0.3.1", - "lodash.assign": "4.2.0", - "node-emoji": "1.8.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "mixin-deep": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.2.0.tgz", - "integrity": "sha1-0CuMb4ttS49ZgtP9AJxJGYUcP+I=", - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "0.1.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "mocha-lcov-reporter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", - "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=", - "dev": true - }, - "mock-require": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mock-require/-/mock-require-1.3.0.tgz", - "integrity": "sha1-gmFElS5QR2L45pJKqPY5Rl0deiQ=", - "dev": true, - "requires": { - "caller-id": "0.1.0" - } - }, - "module-not-found-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", - "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", - "dev": true - }, - "moment": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", - "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=" - }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-emoji": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", - "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", - "dev": true, - "requires": { - "lodash.toarray": "4.4.0" - } - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" - } - }, - "node-forge": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", - "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-notifier": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-4.6.1.tgz", - "integrity": "sha1-BW0UJE89zBzq3+aK+c/wxUc6M/M=", - "dev": true, - "requires": { - "cli-usage": "0.1.4", - "growly": "1.3.0", - "lodash.clonedeep": "3.0.2", - "minimist": "1.2.0", - "semver": "5.4.1", - "shellwords": "0.1.1", - "which": "1.3.0" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.0.9" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "npm-conf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.2.tgz", - "integrity": "sha512-dotwbpwVzfNB/2EF3A2wjK5tEMLggKfuA/8TG6WvBB1Zrv+JsvF7E8ei9B/HGq211st/GwXFbREcNJvJ1eySUQ==", - "requires": { - "config-chain": "1.1.11", - "pify": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "npmlog": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", - "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", - "requires": { - "ansi": "0.3.1", - "are-we-there-yet": "1.1.4", - "gauge": "1.2.7" - } - }, - "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=" - }, - "nwmatcher": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.2.tgz", - "integrity": "sha512-QMkCGQFYp5p+zwU3INntLmz1HMfSx9dMVJMYKmE1yuSf/22Wjo6VPFa405mCLUuQn9lbQvH2DZN9lt10ZNvtAg==", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, - "object.assign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", - "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "object-keys": "1.0.11" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" - }, - "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", - "requires": { - "is-wsl": "1.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=" - }, - "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=" - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.1.0" - } - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "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=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-loader": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.2.tgz", - "integrity": "sha1-zVxz5+OakQEb4UjWv92KhbuTHvk=", - "requires": { - "native-promise-only": "0.8.1", - "superagent": "3.6.3" - } - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - }, - "pkg-up": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-format": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-18.1.0.tgz", - "integrity": "sha1-+2Wob3p/kZSWPu6RhlwbzxA54oQ=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - } - } - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "2.0.6" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "proxyquire": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.8.0.tgz", - "integrity": "sha1-AtUUpb7ZhvBMuyCTrxZ0FTX3ntw=", - "dev": true, - "requires": { - "fill-keys": "1.0.2", - "module-not-found-error": "1.0.1", - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", - "dev": true - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", - "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" - }, - "ramda": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", - "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=" - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "raven": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/raven/-/raven-1.2.1.tgz", - "integrity": "sha1-lJwTTbAooZC3u/j3kKrlQbfAIL0=", - "requires": { - "cookie": "0.3.1", - "json-stringify-safe": "5.0.1", - "lsmod": "1.0.0", - "stack-trace": "0.0.9", - "uuid": "3.0.0" - }, - "dependencies": { - "uuid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", - "integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=" - } - } - }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - }, - "dependencies": { - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.4.0" - } - }, - "redeyed": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", - "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", - "dev": true, - "requires": { - "esprima": "3.0.0" - }, - "dependencies": { - "esprima": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", - "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", - "dev": true - } - } - }, - "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "requires": { - "lodash": "4.17.4", - "lodash-es": "4.17.4", - "loose-envify": "1.3.1", - "symbol-observable": "1.0.4" - } - }, - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "remarkable": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", - "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", - "dev": true, - "requires": { - "argparse": "0.1.16", - "autolinker": "0.15.3" - }, - "dependencies": { - "argparse": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", - "dev": true, - "requires": { - "underscore": "1.7.0", - "underscore.string": "2.4.0" - } - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "replaceall": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz", - "integrity": "sha1-gdgax663LX9cSUKt8ml6MiBojY4=" - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.4.3", - "uuid": "3.1.0" - }, - "dependencies": { - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.2" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "2.1.0" - } - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", - "dev": true - }, - "sane": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sane/-/sane-1.4.1.tgz", - "integrity": "sha1-iPdj10BA9fDCVrYWPbOZvxEKxxU=", - "dev": true, - "requires": { - "exec-sh": "0.2.1", - "fb-watchman": "1.9.2", - "minimatch": "3.0.4", - "minimist": "1.2.0", - "walker": "1.0.7", - "watch": "0.10.0" - } - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "requires": { - "commander": "2.8.1" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "semver-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=" - }, - "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 - }, - "set-getter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "dev": true, - "requires": { - "to-object-path": "0.3.0" - } - }, - "shelljs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", - "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=" - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", - "dev": true, - "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": "0.10.3" - } - }, - "sinon-bluebird": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/sinon-bluebird/-/sinon-bluebird-3.1.0.tgz", - "integrity": "sha1-+SaA+lRtVTpPX2LekEJetdxHhB0=", - "dev": true - }, - "sinon-chai": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", - "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", - "requires": { - "concat-stream": "1.6.0", - "os-shim": "0.1.3" - } - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" - }, - "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.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "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.1.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-color": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", - "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=", - "dev": true - }, - "strip-dirs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.0.0.tgz", - "integrity": "sha1-YQzbKSggDaAAT0HcuQ/JXNkZoLY=", - "requires": { - "is-natural-number": "4.0.1" - } - }, - "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=" - }, - "strip-outer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.0.tgz", - "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=", - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "superagent": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.6.3.tgz", - "integrity": "sha512-GjsfCFijfjqoz2tRiStSOoTdy7gNZOcK3ar4zONP9D8dXQWE+Qg7cbePHimRpapo06WUvoU3dmgi2e4q+sab5A==", - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "3.1.0", - "extend": "3.0.1", - "form-data": "2.3.1", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.1", - "readable-stream": "2.3.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - }, - "symbol-observable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", - "dev": true - }, - "sync-request": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-3.0.1.tgz", - "integrity": "sha1-yqEjWq+Im6UBB2oYNMQ2gwqC+3M=", - "dev": true, - "requires": { - "concat-stream": "1.6.0", - "http-response-object": "1.1.0", - "then-request": "2.2.0" - } - }, - "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", - "slice-ansi": "0.0.4", - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "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 - }, - "string-width": { - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "tabtab": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-2.2.2.tgz", - "integrity": "sha1-egR/FDsBC0y9MfhX6ClhUSy/ThQ=", - "requires": { - "debug": "2.6.9", - "inquirer": "1.2.3", - "lodash.difference": "4.5.0", - "lodash.uniq": "4.5.0", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "npmlog": "2.0.4", - "object-assign": "4.1.1" - } - }, - "tar-stream": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", - "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", - "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.0", - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - }, - "test-exclude": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-3.3.0.tgz", - "integrity": "sha1-ehfKEjmYjJg2ewYhRW27fUvDiXc=", - "dev": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "then-request": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-2.2.0.tgz", - "integrity": "sha1-ZnizL6DKIY/laZgbvYhxtZQGDYE=", - "dev": true, - "requires": { - "caseless": "0.11.0", - "concat-stream": "1.6.0", - "http-basic": "2.5.1", - "http-response-object": "1.1.0", - "promise": "7.3.1", - "qs": "6.5.1" - } - }, - "throat": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "toml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz", - "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==", - "dev": true - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "dev": true, - "requires": { - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2" - } - }, - "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "unbzip2-stream": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", - "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", - "requires": { - "buffer": "3.6.0", - "through": "2.3.8" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" - }, - "buffer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "requires": { - "base64-js": "0.0.8", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - } - } - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true - }, - "underscore.string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", - "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", - "dev": true - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, - "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" - } - } - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "url-parse": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", - "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", - "requires": { - "querystringify": "1.0.0", - "requires-port": "1.0.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "1.0.4" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "walkdir": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", - "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=" - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.11" - } - }, - "watch": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", - "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", - "dev": true - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", - "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", - "dev": true, - "requires": { - "iconv-lite": "0.4.13" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - } - } - }, - "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" - }, - "whatwg-url": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", - "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", - "dev": true, - "requires": { - "tr46": "0.0.3", - "webidl-conversions": "3.0.1" - }, - "dependencies": { - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - } - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "worker-farm": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.0.tgz", - "integrity": "sha512-DHRiUggxtbruaTwnLDm2/BRDKZIoOYvrgYUj5Bam4fU6Gtvc0FaEyoswFPBjMXAweGW2H4BDNIpy//1yXXuaqQ==", - "dev": true, - "requires": { - "errno": "0.1.4", - "xtend": "4.0.1" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "0.5.1" - } - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", - "dev": true - }, - "xml2js": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", - "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", - "requires": { - "sax": "1.2.1", - "xmlbuilder": "4.2.1" - } - }, - "xmlbuilder": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", - "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", - "requires": { - "lodash": "4.17.4" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yaml-ast-parser": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.34.tgz", - "integrity": "sha1-0A88+ddztyQUCa6SpnQNHbGfSeY=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } - }, - "yauzl": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz", - "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=", - "requires": { - "buffer-crc32": "0.2.13", - "fd-slicer": "1.0.1" - } - }, - "zen-observable-ts": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.4.4.tgz", - "integrity": "sha512-SNVY1sWWhoe7FwFmHpD9ERi+7Mhhj3+JdS0BGy2UxLIg7cY+3zQbyZauQCI6DN6YK4uoKNaIm3S7Qkqi1Lr+Fw==" - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "requires": { - "archiver-utils": "1.3.0", - "compress-commons": "1.2.0", - "lodash": "4.17.4", - "readable-stream": "2.3.3" - } - } - } -} From 4a3d7602a31c87f6242f34f00611796c9e6e0c1b Mon Sep 17 00:00:00 2001 From: Andrew Oh Date: Sun, 8 Oct 2017 21:05:04 +1100 Subject: [PATCH 084/128] Upgrade serverless-webpack plugin from version 2.2.0 to 3.1.1 for aws-nodejs-ecma-script template --- .../create/templates/aws-nodejs-ecma-script/package.json | 2 +- .../create/templates/aws-nodejs-ecma-script/serverless.yml | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/lib/plugins/create/templates/aws-nodejs-ecma-script/package.json b/lib/plugins/create/templates/aws-nodejs-ecma-script/package.json index e6e8c12a2..bcfad7dd9 100644 --- a/lib/plugins/create/templates/aws-nodejs-ecma-script/package.json +++ b/lib/plugins/create/templates/aws-nodejs-ecma-script/package.json @@ -11,7 +11,7 @@ "babel-plugin-transform-runtime": "^6.23.0", "babel-polyfill": "^6.23.0", "babel-preset-env": "^1.6.0", - "serverless-webpack": "^2.2.0", + "serverless-webpack": "^3.1.1", "webpack": "^3.3.0" }, "author": "The serverless webpack authors (https://github.com/elastic-coders/serverless-webpack)", diff --git a/lib/plugins/create/templates/aws-nodejs-ecma-script/serverless.yml b/lib/plugins/create/templates/aws-nodejs-ecma-script/serverless.yml index 62e5090fb..1b53b5c30 100644 --- a/lib/plugins/create/templates/aws-nodejs-ecma-script/serverless.yml +++ b/lib/plugins/create/templates/aws-nodejs-ecma-script/serverless.yml @@ -10,14 +10,8 @@ provider: runtime: nodejs6.10 functions: - # Example without LAMBDA-PROXY integration - # Invoking locally: - # sls webpack invoke -f first first: handler: first.hello - # Example with LAMBDA-PROXY integration - # Invoking locally: - # sls webpack invoke -f second second: handler: second.hello events: From e8e8d3692190cb133222187b0a934c074a4c182f Mon Sep 17 00:00:00 2001 From: Wouter92 Date: Mon, 9 Oct 2017 09:45:19 +0200 Subject: [PATCH 085/128] Empty commit to let run travis CI again From 1a6a23d836e622f0638d3e30559b06dd9dbda830 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Mon, 9 Oct 2017 09:44:43 -0700 Subject: [PATCH 086/128] Spotinst - deleting example code because its not displayed on site --- .../spotinst/examples/node/handler.js | 25 ------------- .../spotinst/examples/node/package.json | 13 ------- .../spotinst/examples/node/serverless.yml | 35 ------------------ .../spotinst/examples/python/handler.py | 14 -------- .../spotinst/examples/python/package.json | 13 ------- .../spotinst/examples/python/serverless.yml | 35 ------------------ .../spotinst/examples/ruby/handler.rb | 14 -------- .../spotinst/examples/ruby/package.json | 13 ------- .../spotinst/examples/ruby/serverless.yml | 36 ------------------- .../templates/spotinst-python/serverless.yml | 1 + .../templates/spotinst-ruby/serverless.yml | 1 - 11 files changed, 1 insertion(+), 199 deletions(-) delete mode 100644 docs/providers/spotinst/examples/node/handler.js delete mode 100644 docs/providers/spotinst/examples/node/package.json delete mode 100644 docs/providers/spotinst/examples/node/serverless.yml delete mode 100644 docs/providers/spotinst/examples/python/handler.py delete mode 100644 docs/providers/spotinst/examples/python/package.json delete mode 100644 docs/providers/spotinst/examples/python/serverless.yml delete mode 100644 docs/providers/spotinst/examples/ruby/handler.rb delete mode 100644 docs/providers/spotinst/examples/ruby/package.json delete mode 100644 docs/providers/spotinst/examples/ruby/serverless.yml diff --git a/docs/providers/spotinst/examples/node/handler.js b/docs/providers/spotinst/examples/node/handler.js deleted file mode 100644 index 56ada204c..000000000 --- a/docs/providers/spotinst/examples/node/handler.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Implement your function here. - * The function will get the request as a parameter with query/body properties: - * var queryparams = req.query; - * var body = req.body; - * - * The function should return a Promise that resolves with the following structure: - * resolve({ - * statusCode: 200, - * body: '{"hello":"from NodeJS4.8 function"}', - * headers: {"Content-Type": "application/json"} - * }) - * - */ - -exports.main = function main (req, res) { - // The function should return a Promise. - return new Promise(function(resolve, reject){ - return resolve({ - statusCode: 200, - body: `hello ${req.query.name || "world"}!` - }); - }); -}; diff --git a/docs/providers/spotinst/examples/node/package.json b/docs/providers/spotinst/examples/node/package.json deleted file mode 100644 index ccfcb802d..000000000 --- a/docs/providers/spotinst/examples/node/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "spotionst-nodejs", - "version": "1.0.0", - "description": "Spotinst Functions NodeJS sample for serverless framework service.", - "main": "handler.js", - "keywords": [ - "serverless", - "spotinst" - ], - "dependencies": { - "serverless-spotinst-functions": "*" - } -} diff --git a/docs/providers/spotinst/examples/node/serverless.yml b/docs/providers/spotinst/examples/node/serverless.yml deleted file mode 100644 index 4dd81b530..000000000 --- a/docs/providers/spotinst/examples/node/serverless.yml +++ /dev/null @@ -1,35 +0,0 @@ -# Welcome to Serverless! -# -# This file is the main config file for your service. -# It's very minimal at this point and uses default values. -# You can always add more config options for more control. -# We've included some commented out config examples here. -# Just uncomment any of them to get that config option. -# -# For full config options, check the docs: -# docs.serverless.com -# -# Happy Coding! - -service: spotinst-nodejs # NOTE: update this with your service name - -provider: - name: spotinst - spotinst: - #environment: # NOTE: Remember to add the environment ID - -functions: - hello: - runtime: nodejs4.8 - handler: handler.main - memory: 128 - timeout: 30 -# access: private -# cron: # Setup scheduled trigger with cron expression -# active: true -# value: * * * * * - -# extend the framework using plugins listed here: -# https://github.com/serverless/plugins -plugins: - - serverless-spotinst-functions diff --git a/docs/providers/spotinst/examples/python/handler.py b/docs/providers/spotinst/examples/python/handler.py deleted file mode 100644 index 9b6df147f..000000000 --- a/docs/providers/spotinst/examples/python/handler.py +++ /dev/null @@ -1,14 +0,0 @@ -# Implement your function here. -# The function will get the request as parameter. -# The function should return an object - - -def main(args): - queryparams = args.get("query", {}) - body = args.get("body", {}) - - return { - 'statusCode': 200, - 'body': '{"hello":"from Python2.7 function"}', - 'headers': {"Content-Type": "application/json"} - } diff --git a/docs/providers/spotinst/examples/python/package.json b/docs/providers/spotinst/examples/python/package.json deleted file mode 100644 index a7aed6929..000000000 --- a/docs/providers/spotinst/examples/python/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "spotionst-python", - "version": "1.0.0", - "description": "Spotinst Functions Python sample for serverless framework service.", - "main": "handler.js", - "keywords": [ - "serverless", - "spotinst" - ], - "dependencies": { - "serverless-spotinst-functions": "*" - } -} diff --git a/docs/providers/spotinst/examples/python/serverless.yml b/docs/providers/spotinst/examples/python/serverless.yml deleted file mode 100644 index ff9d02be0..000000000 --- a/docs/providers/spotinst/examples/python/serverless.yml +++ /dev/null @@ -1,35 +0,0 @@ -# Welcome to Serverless! -# -# This file is the main config file for your service. -# It's very minimal at this point and uses default values. -# You can always add more config options for more control. -# We've included some commented out config examples here. -# Just uncomment any of them to get that config option. -# -# For full config options, check the docs: -# docs.serverless.com -# -# Happy Coding! - -service: spotinst-python # NOTE: update this with your service name - -provider: - name: spotinst - spotinst: - #environment: # NOTE: Remember to add the environment ID - -functions: - hello: - runtime: python2.7 - handler: handler.main - memory: 128 - timeout: 30 -# access: private -# cron: # Setup scheduled trigger with cron expression -# active: true -# value: * * * * * - -# extend the framework using plugins listed here: -# https://github.com/serverless/plugins -plugins: - - serverless-spotinst-functions diff --git a/docs/providers/spotinst/examples/ruby/handler.rb b/docs/providers/spotinst/examples/ruby/handler.rb deleted file mode 100644 index 55a9e7455..000000000 --- a/docs/providers/spotinst/examples/ruby/handler.rb +++ /dev/null @@ -1,14 +0,0 @@ - -# Implement your function here. -# The function will get the request as parameter. -# The function should return an Hash - -def main(args) - queryparams = args["query"] - body = args["body"] - - { - :statusCode => 200, - :body => '{"hello":"from Ruby2.4.1 function"}' - } -end \ No newline at end of file diff --git a/docs/providers/spotinst/examples/ruby/package.json b/docs/providers/spotinst/examples/ruby/package.json deleted file mode 100644 index 8748ab56c..000000000 --- a/docs/providers/spotinst/examples/ruby/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "spotionst-ruby", - "version": "1.0.0", - "description": "Spotinst Functions Ruby sample for serverless framework service.", - "main": "handler.js", - "keywords": [ - "serverless", - "spotinst" - ], - "dependencies": { - "serverless-spotinst-functions": "*" - } -} \ No newline at end of file diff --git a/docs/providers/spotinst/examples/ruby/serverless.yml b/docs/providers/spotinst/examples/ruby/serverless.yml deleted file mode 100644 index 3d9dd5226..000000000 --- a/docs/providers/spotinst/examples/ruby/serverless.yml +++ /dev/null @@ -1,36 +0,0 @@ -# Welcome to Serverless! -# -# This file is the main config file for your service. -# It's very minimal at this point and uses default values. -# You can always add more config options for more control. -# We've included some commented out config examples here. -# Just uncomment any of them to get that config option. -# -# For full config options, check the docs: -# docs.serverless.com -# -# Happy Coding! - -service: spotinst-ruby # NOTE: update this with your service name - -provider: - name: spotinst - spotinst: - #environment: # NOTE: Remember to add the environment ID - -functions: - hello: - runtime: ruby2.4.1 - handler: handler.main - memory: 128 - timeout: 30 -# access: private -# cron: # Setup scheduled trigger with cron expression -# active: true -# value: * * * * * - - -# extend the framework using plugins listed here: -# https://github.com/serverless/plugins -plugins: - - serverless-spotinst-functions \ No newline at end of file diff --git a/lib/plugins/create/templates/spotinst-python/serverless.yml b/lib/plugins/create/templates/spotinst-python/serverless.yml index 7cba92fa6..6319947f0 100644 --- a/lib/plugins/create/templates/spotinst-python/serverless.yml +++ b/lib/plugins/create/templates/spotinst-python/serverless.yml @@ -24,6 +24,7 @@ functions: handler: handler.main memory: 128 timeout: 30 + access: private # cron: # Setup scheduled trigger with cron expression # active: true # value: * * * * * diff --git a/lib/plugins/create/templates/spotinst-ruby/serverless.yml b/lib/plugins/create/templates/spotinst-ruby/serverless.yml index ff1aca4bb..1fdba3d95 100644 --- a/lib/plugins/create/templates/spotinst-ruby/serverless.yml +++ b/lib/plugins/create/templates/spotinst-ruby/serverless.yml @@ -29,7 +29,6 @@ functions: # active: true # value: * * * * * - # extend the framework using plugins listed here: # https://github.com/serverless/plugins plugins: From b6027faf2ebf2475feb4e97effadd4149e709b71 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Mon, 9 Oct 2017 09:51:10 -0700 Subject: [PATCH 087/128] Spotinst: deleting example templates --- .../spotinst/examples/node/serverless.yml | 35 ------------------ .../spotinst/examples/python/serverless.yml | 35 ------------------ .../spotinst/examples/ruby/serverless.yml | 36 ------------------- 3 files changed, 106 deletions(-) delete mode 100644 docs/providers/spotinst/examples/node/serverless.yml delete mode 100644 docs/providers/spotinst/examples/python/serverless.yml delete mode 100644 docs/providers/spotinst/examples/ruby/serverless.yml diff --git a/docs/providers/spotinst/examples/node/serverless.yml b/docs/providers/spotinst/examples/node/serverless.yml deleted file mode 100644 index a08289ec4..000000000 --- a/docs/providers/spotinst/examples/node/serverless.yml +++ /dev/null @@ -1,35 +0,0 @@ -# Welcome to Serverless! -# -# This file is the main config file for your service. -# It's very minimal at this point and uses default values. -# You can always add more config options for more control. -# We've included some commented out config examples here. -# Just uncomment any of them to get that config option. -# -# For full config options, check the docs: -# docs.serverless.com -# -# Happy Coding! - -service: spotinst-nodejs # NOTE: update this with your service name - -provider: - name: spotinst - spotinst: - #environment: # NOTE: Remember to add the environment ID - -functions: - hello: - runtime: nodejs4.8 - handler: handler.main - memory: 128 - timeout: 30 -# access: private -# cron: # Setup scheduled trigger with cron expression -# active: true -# value: '* * * * *' - -# extend the framework using plugins listed here: -# https://github.com/serverless/plugins -plugins: - - serverless-spotinst-functions diff --git a/docs/providers/spotinst/examples/python/serverless.yml b/docs/providers/spotinst/examples/python/serverless.yml deleted file mode 100644 index d012b9b57..000000000 --- a/docs/providers/spotinst/examples/python/serverless.yml +++ /dev/null @@ -1,35 +0,0 @@ -# Welcome to Serverless! -# -# This file is the main config file for your service. -# It's very minimal at this point and uses default values. -# You can always add more config options for more control. -# We've included some commented out config examples here. -# Just uncomment any of them to get that config option. -# -# For full config options, check the docs: -# docs.serverless.com -# -# Happy Coding! - -service: spotinst-python # NOTE: update this with your service name - -provider: - name: spotinst - spotinst: - #environment: # NOTE: Remember to add the environment ID - -functions: - hello: - runtime: python2.7 - handler: handler.main - memory: 128 - timeout: 30 -# access: private -# cron: # Setup scheduled trigger with cron expression -# active: true -# value: '* * * * *' - -# extend the framework using plugins listed here: -# https://github.com/serverless/plugins -plugins: - - serverless-spotinst-functions diff --git a/docs/providers/spotinst/examples/ruby/serverless.yml b/docs/providers/spotinst/examples/ruby/serverless.yml deleted file mode 100644 index c1f094af9..000000000 --- a/docs/providers/spotinst/examples/ruby/serverless.yml +++ /dev/null @@ -1,36 +0,0 @@ -# Welcome to Serverless! -# -# This file is the main config file for your service. -# It's very minimal at this point and uses default values. -# You can always add more config options for more control. -# We've included some commented out config examples here. -# Just uncomment any of them to get that config option. -# -# For full config options, check the docs: -# docs.serverless.com -# -# Happy Coding! - -service: spotinst-ruby # NOTE: update this with your service name - -provider: - name: spotinst - spotinst: - #environment: # NOTE: Remember to add the environment ID - -functions: - hello: - runtime: ruby2.4.1 - handler: handler.main - memory: 128 - timeout: 30 -# access: private -# cron: # Setup scheduled trigger with cron expression -# active: true -# value: '* * * * *' - - -# extend the framework using plugins listed here: -# https://github.com/serverless/plugins -plugins: - - serverless-spotinst-functions From a0f7babc6ef0911955323cfad83cacae6a132bbf Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Mon, 9 Oct 2017 10:01:55 -0700 Subject: [PATCH 088/128] Spotinst - fixing spacing issues in creare.test.js --- lib/plugins/create/create.test.js | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/lib/plugins/create/create.test.js b/lib/plugins/create/create.test.js index 914b77b0d..d8c8b9a41 100644 --- a/lib/plugins/create/create.test.js +++ b/lib/plugins/create/create.test.js @@ -462,19 +462,6 @@ describe('Create', () => { }); }); - it('should generate scaffolding for "spotinst-ruby" template', () => { - process.chdir(tmpDir); - create.options.template = 'spotinst-ruby'; - - return create.create().then(() => { - const dirContent = fs.readdirSync(tmpDir); - expect(dirContent).to.include('package.json'); - expect(dirContent).to.include('serverless.yml'); - expect(dirContent).to.include('handler.rb'); - expect(dirContent).to.include('.gitignore'); - }); - }); - it('should generate scaffolding for "webtasks-nodejs" template', () => { process.chdir(tmpDir); create.options.template = 'webtasks-nodejs'; @@ -620,4 +607,4 @@ describe('Create', () => { expect(() => create.create()).to.throw(Error); }); }); -}); +}); \ No newline at end of file From c55e66e422a818f06252094692f2ff270e416500 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Mon, 9 Oct 2017 10:06:03 -0700 Subject: [PATCH 089/128] Spotinst - adding in new line to EOF --- lib/plugins/create/create.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugins/create/create.test.js b/lib/plugins/create/create.test.js index d8c8b9a41..3ec10d292 100644 --- a/lib/plugins/create/create.test.js +++ b/lib/plugins/create/create.test.js @@ -607,4 +607,4 @@ describe('Create', () => { expect(() => create.create()).to.throw(Error); }); }); -}); \ No newline at end of file +}); From 377976c876e313d87cdb123cfd9520449ada8110 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Mon, 9 Oct 2017 10:12:19 -0700 Subject: [PATCH 090/128] Spotinst - adding reuby text accidentially deleted --- lib/plugins/create/create.test.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/plugins/create/create.test.js b/lib/plugins/create/create.test.js index 3ec10d292..825384357 100644 --- a/lib/plugins/create/create.test.js +++ b/lib/plugins/create/create.test.js @@ -462,6 +462,19 @@ describe('Create', () => { }); }); + it('should generate scaffolding for "spotinst-ruby" template', () => { + process.chdir(tmpDir); + create.options.template = 'spotinst-ruby'; + + return create.create().then(() => { + const dirContent = fs.readdirSync(tmpDir); + expect(dirContent).to.include('package.json'); + expect(dirContent).to.include('serverless.yml'); + expect(dirContent).to.include('handler.rb'); + expect(dirContent).to.include('.gitignore'); + }); + }); + it('should generate scaffolding for "webtasks-nodejs" template', () => { process.chdir(tmpDir); create.options.template = 'webtasks-nodejs'; From e6876ef7c8a6747fc5327ef05ae308f8e1a3934e Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Mon, 9 Oct 2017 10:23:44 -0700 Subject: [PATCH 091/128] Spotinst - fixing spacing issues --- lib/plugins/create/create.test.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/plugins/create/create.test.js b/lib/plugins/create/create.test.js index 825384357..334d0787a 100644 --- a/lib/plugins/create/create.test.js +++ b/lib/plugins/create/create.test.js @@ -463,17 +463,17 @@ describe('Create', () => { }); it('should generate scaffolding for "spotinst-ruby" template', () => { - process.chdir(tmpDir); - create.options.template = 'spotinst-ruby'; - - return create.create().then(() => { + process.chdir(tmpDir); + create.options.template = 'spotinst-ruby'; + + return create.create().then(() => { const dirContent = fs.readdirSync(tmpDir); expect(dirContent).to.include('package.json'); expect(dirContent).to.include('serverless.yml'); expect(dirContent).to.include('handler.rb'); expect(dirContent).to.include('.gitignore'); }); - }); + }); it('should generate scaffolding for "webtasks-nodejs" template', () => { process.chdir(tmpDir); From e9dc43f42e540d01170113d83d51842b5e8022c2 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Mon, 9 Oct 2017 10:27:20 -0700 Subject: [PATCH 092/128] Spotinst o fixing spacing issue --- lib/plugins/create/create.test.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/plugins/create/create.test.js b/lib/plugins/create/create.test.js index 334d0787a..22bc89f76 100644 --- a/lib/plugins/create/create.test.js +++ b/lib/plugins/create/create.test.js @@ -467,12 +467,12 @@ describe('Create', () => { create.options.template = 'spotinst-ruby'; return create.create().then(() => { - const dirContent = fs.readdirSync(tmpDir); - expect(dirContent).to.include('package.json'); - expect(dirContent).to.include('serverless.yml'); - expect(dirContent).to.include('handler.rb'); - expect(dirContent).to.include('.gitignore'); - }); + const dirContent = fs.readdirSync(tmpDir); + expect(dirContent).to.include('package.json'); + expect(dirContent).to.include('serverless.yml'); + expect(dirContent).to.include('handler.rb'); + expect(dirContent).to.include('.gitignore'); + }); }); it('should generate scaffolding for "webtasks-nodejs" template', () => { From 3c45339b2e2d3a4d3243cae494a195d5ad71e91a Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Mon, 9 Oct 2017 17:11:53 -0700 Subject: [PATCH 093/128] Spotinst - adjusting spacing in templates --- lib/plugins/create/templates/spotinst-ruby/handler.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/plugins/create/templates/spotinst-ruby/handler.rb b/lib/plugins/create/templates/spotinst-ruby/handler.rb index 55a9e7455..f1d2d9fd5 100644 --- a/lib/plugins/create/templates/spotinst-ruby/handler.rb +++ b/lib/plugins/create/templates/spotinst-ruby/handler.rb @@ -6,7 +6,6 @@ def main(args) queryparams = args["query"] body = args["body"] - { :statusCode => 200, :body => '{"hello":"from Ruby2.4.1 function"}' From 1df8bf5795de8142b3ff2b70724be85ac696b7e0 Mon Sep 17 00:00:00 2001 From: sharathm Date: Tue, 10 Oct 2017 11:51:10 +0530 Subject: [PATCH 094/128] provide additional information for running lambda inside VPC as part of guide --- docs/providers/aws/guide/functions.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/providers/aws/guide/functions.md b/docs/providers/aws/guide/functions.md index 42100b9e8..de2538c87 100644 --- a/docs/providers/aws/guide/functions.md +++ b/docs/providers/aws/guide/functions.md @@ -139,7 +139,7 @@ provider: - Effect: "Allow" Action: - "s3:ListBucket" - # You can put CloudFormation syntax in here. No one will judge you. + # You can put CloudFormation syntax in here. No one will judge you. # Remember, this all gets translated to CloudFormation. Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket"} ] ] } - Effect: "Allow" @@ -226,6 +226,11 @@ Then, when you run `serverless deploy`, VPC configuration will be deployed along The Lambda function execution role must have permissions to create, describe and delete [Elastic Network Interfaces](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ElasticNetworkInterfaces.html) (ENI). When VPC configuration is provided the default AWS `AWSLambdaVPCAccessExecutionRole` will be associated with your Lambda execution role. In case custom roles are provided be sure to include the proper [ManagedPolicyArns](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-managepolicyarns). For more information please check [configuring a Lambda Function for Amazon VPC Access](http://docs.aws.amazon.com/lambda/latest/dg/vpc.html) +**VPC Lambda Internet Access** + +By default, when a Lambda function is executed inside a VPC, it looses internet access and some resources inside AWS may become unavailable. In order for S3 resources and DynamoDB resources to be available for your Lambda function running inside the VPC, a VPC end point needs to be created. For more information please check [VPC Endpoint for Amazon S3](https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/). +In order for other services such as Kinesis streams to be made available, a NAT Gateway needs to be configured inside the subnets that are being used to run the Lambda, for the VPC used to execute the Lambda. For more information, please check [Enable Outgoing Internet Access within VPC](https://medium.com/@philippholly/aws-lambda-enable-outgoing-internet-access-within-vpc-8dd250e11e12) + ## Environment Variables You can add environment variable configuration to a specific function in `serverless.yml` by adding an `environment` object property in the function configuration. This object should contain a key/value collection of strings: From e75c783365f024cff81a186c16bf67e9c8a52d22 Mon Sep 17 00:00:00 2001 From: Jonathan Spies Date: Tue, 10 Oct 2017 12:31:22 -0500 Subject: [PATCH 095/128] add type option to authorizer. implements #4325 --- docs/providers/aws/events/apigateway.md | 19 +++++++++++++++++++ .../events/apiGateway/lib/authorizers.js | 2 +- .../events/apiGateway/lib/authorizers.test.js | 3 ++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/providers/aws/events/apigateway.md b/docs/providers/aws/events/apigateway.md index ff68cfbc3..8ee5aad0c 100644 --- a/docs/providers/aws/events/apigateway.md +++ b/docs/providers/aws/events/apigateway.md @@ -277,6 +277,7 @@ functions: resultTtlInSeconds: 0 identitySource: method.request.header.Authorization identityValidationExpression: someRegex + type: token authorizerFunc: handler: handler.authorizerFunc ``` @@ -313,6 +314,24 @@ functions: identityValidationExpression: someRegex ``` +You can also use the Request Type Authorizer by setting the `type` property. In this case, you +do not need the `identitySource` + +```yml +functions: + create: + handler: posts.create + events: + - http: + path: posts/create + method: post + authorizer: + arn: xxx:xxx:Lambda-Name + resultTtlInSeconds: 0 + identityValidationExpression: someRegex + type: request +``` + You can also configure an existing Cognito User Pool as the authorizer, as shown in the following example: diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.js index 84b861684..e041f45fb 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.js @@ -37,7 +37,7 @@ module.exports = { '/invocations', ], ] }; - authorizerProperties.Type = 'TOKEN'; + authorizerProperties.Type = authorizer.type ? authorizer.type.toUpperCase() : 'TOKEN'; } _.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, { diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.test.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.test.js index aa32f062c..c4429362f 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.test.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.test.js @@ -68,6 +68,7 @@ describe('#compileAuthorizers()', () => { resultTtlInSeconds: 500, identitySource: 'method.request.header.Custom', identityValidationExpression: 'regex', + type: 'request', }, }, }]; @@ -92,7 +93,7 @@ describe('#compileAuthorizers()', () => { expect(resource.Properties.IdentityValidationExpression).to.equal('regex'); expect(resource.Properties.Name).to.equal('authorizer'); expect(resource.Properties.RestApiId.Ref).to.equal('ApiGatewayRestApi'); - expect(resource.Properties.Type).to.equal('TOKEN'); + expect(resource.Properties.Type).to.equal('REQUEST'); }); }); From 2341e5beaec7994096560070e111e9efbdef9e62 Mon Sep 17 00:00:00 2001 From: Jonathan Spies Date: Tue, 10 Oct 2017 12:36:16 -0500 Subject: [PATCH 096/128] separate expectation for REQUEST into its own test --- .../events/apiGateway/lib/authorizers.test.js | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.test.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.test.js index c4429362f..ee84ad8a2 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.test.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/authorizers.test.js @@ -68,7 +68,6 @@ describe('#compileAuthorizers()', () => { resultTtlInSeconds: 500, identitySource: 'method.request.header.Custom', identityValidationExpression: 'regex', - type: 'request', }, }, }]; @@ -93,10 +92,57 @@ describe('#compileAuthorizers()', () => { expect(resource.Properties.IdentityValidationExpression).to.equal('regex'); expect(resource.Properties.Name).to.equal('authorizer'); expect(resource.Properties.RestApiId.Ref).to.equal('ApiGatewayRestApi'); + expect(resource.Properties.Type).to.equal('TOKEN'); + }); + }); + + it('should apply optional provided type value to Authorizer Type', () => { + awsCompileApigEvents.validated.events = [{ + http: { + path: 'users/create', + method: 'POST', + authorizer: { + name: 'authorizer', + arn: 'foo', + resultTtlInSeconds: 500, + identityValidationExpression: 'regex', + type: 'request', + }, + }, + }]; + + return awsCompileApigEvents.compileAuthorizers().then(() => { + const resource = awsCompileApigEvents.serverless.service.provider + .compiledCloudFormationTemplate.Resources.AuthorizerApiGatewayAuthorizer; + + expect(resource.Type).to.equal('AWS::ApiGateway::Authorizer'); expect(resource.Properties.Type).to.equal('REQUEST'); }); }); + it('should apply TOKEN as authorizer Type when not given a type value', () => { + awsCompileApigEvents.validated.events = [{ + http: { + path: 'users/create', + method: 'POST', + authorizer: { + name: 'authorizer', + arn: 'foo', + resultTtlInSeconds: 500, + identityValidationExpression: 'regex', + }, + }, + }]; + + return awsCompileApigEvents.compileAuthorizers().then(() => { + const resource = awsCompileApigEvents.serverless.service.provider + .compiledCloudFormationTemplate.Resources.AuthorizerApiGatewayAuthorizer; + + expect(resource.Type).to.equal('AWS::ApiGateway::Authorizer'); + expect(resource.Properties.Type).to.equal('TOKEN'); + }); + }); + it('should create a valid cognito user pool authorizer', () => { awsCompileApigEvents.validated.events = [{ http: { From 1f086cfa14b9ae11087900c2985b598bf1642d01 Mon Sep 17 00:00:00 2001 From: Jonathan Spies Date: Tue, 10 Oct 2017 13:08:40 -0500 Subject: [PATCH 097/128] update validator to accept type --- README.md | 315 +++++++++--------- .../compile/events/apiGateway/lib/validate.js | 4 + .../events/apiGateway/lib/validate.test.js | 27 ++ 3 files changed, 194 insertions(+), 152 deletions(-) diff --git a/README.md b/README.md index 03f42434d..d0c9e26d5 100644 --- a/README.md +++ b/README.md @@ -154,104 +154,108 @@ This table is generated from https://github.com/serverless/plugins/blob/master/p --> | Plugin | Author | |:-------|:------:| -| **[Raml Serverless](https://github.com/andrewcurioso/raml-serverless)**
    Serverless plugin to work with RAML API spec documents | [andrewcurioso](http://github.com/andrewcurioso) | -| **[Serverless Alexa Plugin](https://github.com/rajington/serverless-alexa-plugin)**
    Serverless plugin to support Alexa Lambda events | [rajington](http://github.com/rajington) | -| **[Serverless Api Stage](https://github.com/leftclickben/serverless-api-stage)**
    Serverless API Stage plugin, enables stage variables and logging for AWS API Gateway. | [leftclickben](http://github.com/leftclickben) | -| **[Serverless Apig S3](https://github.com/sdd/serverless-apig-s3)**
    Serve static front-end content from S3 via the API Gatewy and deploy client bundle to S3. | [sdd](http://github.com/sdd) | -| **[Serverless Apigateway Plugin](https://github.com/GFG/serverless-apigateway-plugin)**
    Configure the AWS api gateway: Binary support, Headers and Body template mappings | [GFG](http://github.com/GFG) | -| **[Serverless Apigw Binary](https://github.com/maciejtreder/serverless-apigw-binary)**
    Plugin to enable binary support in AWS API Gateway. | [maciejtreder](http://github.com/maciejtreder) | -| **[Serverless Apigwy Binary](https://github.com/ryanmurakami/serverless-apigwy-binary)**
    Serverless plugin for configuring API Gateway to return binary responses | [ryanmurakami](http://github.com/ryanmurakami) | -| **[Serverless Aws Alias](https://github.com/HyperBrain/serverless-aws-alias)**
    This plugin enables use of AWS aliases on Lambda functions. | [HyperBrain](http://github.com/HyperBrain) | -| **[Serverless Aws Documentation](https://github.com/9cookies/serverless-aws-documentation)**
    Serverless plugin to add documentation and models to the serverless generated API Gateway | [9cookies](http://github.com/9cookies) | -| **[Serverless Build Plugin](https://github.com/nfour/serverless-build-plugin)**
    A Node.js focused build plugin for serverless. | [nfour](http://github.com/nfour) | -| **[Serverless Cf Vars](https://gitlab.com/kabo/serverless-cf-vars)**
    Enables use of AWS pseudo functions and Fn::Sub string substitution | [kabo](http://github.com/kabo) | -| **[Serverless Cljs Plugin](https://github.com/nervous-systems/serverless-cljs-plugin)**
    Enables Clojurescript as an implementation language for Lambda handlers | [nervous-systems](http://github.com/nervous-systems) | -| **[Serverless Coffeescript](https://github.com/duanefields/serverless-coffeescript)**
    A Serverless plugin to compile your CoffeeScript into JavaScript at deployment | [duanefields](http://github.com/duanefields) | -| **[Serverless Command Line Event Args](https://github.com/horike37/serverless-command-line-event-args)**
    This module is Serverless Framework plugin. Event JSON passes to your Lambda function in commandline. | [horike37](http://github.com/horike37) | -| **[Serverless Crypt](https://github.com/marcy-terui/serverless-crypt)**
    Securing the secrets on Serverless Framework by AWS KMS encryption. | [marcy-terui](http://github.com/marcy-terui) | -| **[Serverless Custom Packaging Plugin](https://github.com/hypoport/serverless-custom-packaging-plugin)**
    Plugin to package your sourcecode using a custom target path inside the zip. | [hypoport](http://github.com/hypoport) | -| **[Serverless Dir Config Plugin](https://github.com/economysizegeek/serverless-dir-config-plugin)**
    EXPERIMENTAL - Serverless plugin to load function and resource definitions from a directory. | [economysizegeek](http://github.com/economysizegeek) | -| **[Serverless Domain Manager](https://github.com/amplify-education/serverless-domain-manager)**
    Serverless plugin for managing custom domains with API Gateways. | [amplify-education](http://github.com/amplify-education) | -| **[Serverless Dotenv](https://github.com/Jimdo/serverless-dotenv)**
    Fetch environment variables and write it to a .env file | [Jimdo](http://github.com/Jimdo) | -| **[Serverless Dotnet](https://github.com/fruffin/serverless-dotnet)**
    A serverless plugin to run 'dotnet' commands as part of the deploy process | [fruffin](http://github.com/fruffin) | -| **[Serverless Dynalite](https://github.com/sdd/serverless-dynalite)**
    Run dynalite locally (no JVM, all JS) to simulate DynamoDB. Watch serverless.yml for table config updates. | [sdd](http://github.com/sdd) | -| **[Serverless Dynamodb Autoscaling](https://github.com/sbstjn/serverless-dynamodb-autoscaling)**
    Configure Amazon DynamoDB's native Auto Scaling for your table capacities. | [sbstjn](http://github.com/sbstjn) | -| **[Serverless Dynamodb Local](https://github.com/99xt/serverless-dynamodb-local)**
    Serverless Dynamodb Local Plugin - Allows to run dynamodb locally for serverless | [99xt](http://github.com/99xt) | -| **[Serverless Dynamodb Ttl](https://github.com/Jimdo/serverless-dynamodb-ttl)**
    Configure DynamoDB TTL in serverless.yml (until CloudFormation supports this). | [Jimdo](http://github.com/Jimdo) | -| **[Serverless Enable Api Logs](https://github.com/paulSambolin/serverless-enable-api-logs)**
    Enables Coudwatch logging for API Gateway events | [paulSambolin](http://github.com/paulSambolin) | -| **[Serverless Env Generator](https://github.com/DieProduktMacher/serverless-env-generator)**
    Manage environment variables with YAML and load them with dotenv. Supports variable encryption with KMS, multiple stages and custom profiles. | [DieProduktMacher](http://github.com/DieProduktMacher) | -| **[Serverless Event Constant Inputs](https://github.com/dittto/serverless-event-constant-inputs)**
    Allows you to add constant inputs to events in Serverless 1.0. For more info see [constant values in Cloudwatch](https://aws.amazon.com/blogs/compute/simply-serverless-use-constant-values-in-cloudwatch-event-triggered-lambda-functions/) | [dittto](http://github.com/dittto) | -| **[Serverless Export Env](https://github.com/arabold/serverless-export-env)**
    Export environment variables into a .env file with automatic AWS CloudFormation reference resolution. | [arabold](http://github.com/arabold) | -| **[Serverless Gulp](https://github.com/rhythminme/serverless-gulp)**
    A thin task wrapper around @goserverless that allows you to automate build, test and deploy tasks using gulp | [rhythminme](http://github.com/rhythminme) | -| **[Serverless Hooks Plugin](https://github.com/uswitch/serverless-hooks-plugin)**
    Run arbitrary commands on any lifecycle event in serverless | [uswitch](http://github.com/uswitch) | -| **[Serverless Jest Plugin](https://github.com/SC5/serverless-jest-plugin)**
    A Serverless Plugin for the Serverless Framework which adds support for test-driven development using Jest | [SC5](http://github.com/SC5) | -| **[Serverless Kms Secrets](https://github.com/SC5/serverless-kms-secrets)**
    Allows to easily encrypt and decrypt secrets using KMS from the serverless CLI | [SC5](http://github.com/SC5) | -| **[Serverless Kubeless](https://github.com/serverless/serverless-kubeless)**
    Serverless plugin for deploying functions to Kubeless. | [serverless](http://github.com/serverless) | -| **[Serverless Local Dev Server](https://github.com/DieProduktMacher/serverless-local-dev-server)**
    Speeds up development of Alexa Skills, Chatbots and APIs by exposing your functions as local HTTP endpoints and mapping received events. | [DieProduktMacher](http://github.com/DieProduktMacher) | -| **[Serverless Log Forwarding](https://github.com/amplify-education/serverless-log-forwarding)**
    Serverless plugin for forwarding CloudWatch logs to another Lambda function. | [amplify-education](http://github.com/amplify-education) | -| **[Serverless Mocha Plugin](https://github.com/SC5/serverless-mocha-plugin)**
    A Serverless Plugin for the Serverless Framework which adds support for test-driven development using Mocha | [SC5](http://github.com/SC5) | -| **[Serverless Nested Stack](https://github.com/jagdish-176/serverless-nested-stack)**
    A plugin to Workaround for Cloudformation 200 resource limit | [jagdish-176](http://github.com/jagdish-176) | -| **[Serverless Offline](https://github.com/dherault/serverless-offline)**
    Emulate AWS λ and API Gateway locally when developing your Serverless project | [dherault](http://github.com/dherault) | -| **[Serverless Offline Scheduler](https://github.com/ajmath/serverless-offline-scheduler)**
    Runs scheduled functions offline while integrating with serverless-offline | [ajmath](http://github.com/ajmath) | -| **[Serverless Package Python Functions](https://github.com/ubaniabalogun/serverless-package-python-functions)**
    Packaging Python Lambda functions with only the dependencies/requirements they need. | [ubaniabalogun](http://github.com/ubaniabalogun) | -| **[Serverless Parameters](https://github.com/svdgraaf/serverless-parameters)**
    Add parameters to the generated cloudformation templates | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Plugin Aws Alerts](https://github.com/ACloudGuru/serverless-plugin-aws-alerts)**
    A Serverless plugin to easily add CloudWatch alarms to functions | [ACloudGuru](http://github.com/ACloudGuru) | -| **[Serverless Plugin Aws Resolvers](https://github.com/DopplerLabs/serverless-plugin-aws-resolvers)**
    Resolves variables from ESS, RDS, or Kinesis for serverless services | [DopplerLabs](http://github.com/DopplerLabs) | -| **[Serverless Plugin Bespoken](https://github.com/bespoken/serverless-plugin-bespoken)**
    Creates a local server and a proxy so you don't have to deploy anytime you want to test your code | [bespoken](http://github.com/bespoken) | -| **[Serverless Plugin Bind Deployment Id](https://github.com/jacob-meacham/serverless-plugin-bind-deployment-id)**
    A Serverless plugin to bind the randomly generated deployment resource to your custom resources | [jacob-meacham](http://github.com/jacob-meacham) | -| **[Serverless Plugin Browserifier](https://github.com/digitalmaas/serverless-plugin-browserifier)**
    Reduce the size and speed up your Node.js based lambda's using browserify. | [digitalmaas](http://github.com/digitalmaas) | -| **[Serverless Plugin Browserify](https://github.com/doapp-ryanp/serverless-plugin-browserify)**
    Speed up your node based lambda's | [doapp-ryanp](http://github.com/doapp-ryanp) | -| **[Serverless Plugin Cfauthorizer](https://github.com/SC5/serverless-plugin-cfauthorizer)**
    This plugin allows you to define your own API Gateway Authorizers as the Serverless CloudFormation resources and apply them to HTTP endpoints. | [SC5](http://github.com/SC5) | -| **[Serverless Plugin Cloudwatch Sumologic](https://github.com/ACloudGuru/serverless-plugin-cloudwatch-sumologic)**
    Plugin which auto-subscribes a log delivery lambda function to lambda log groups created by serverless | [ACloudGuru](http://github.com/ACloudGuru) | -| **[Serverless Plugin Common Excludes](https://github.com/dougmoscrop/serverless-plugin-common-excludes)**
    Adds commonly excluded files to package.excludes | [dougmoscrop](http://github.com/dougmoscrop) | -| **[Serverless Plugin Custom Domain](https://github.com/dougmoscrop/serverless-plugin-custom-domain)**
    Reliably sets a BasePathMapping to an API Gateway Custom Domain | [dougmoscrop](http://github.com/dougmoscrop) | -| **[Serverless Plugin Deploy Environment](https://github.com/DopplerLabs/serverless-plugin-deploy-environment)**
    Plugin to manage deployment environment across stages | [DopplerLabs](http://github.com/DopplerLabs) | -| **[Serverless Plugin Diff](https://github.com/nicka/serverless-plugin-diff)**
    Compares your local AWS CloudFormation templates against deployed ones. | [nicka](http://github.com/nicka) | -| **[Serverless Plugin Elastic Beanstalk](https://github.com/rawphp/serverless-plugin-elastic-beanstalk)**
    A serverless plugin to deploy applications to AWS ElasticBeanstalk. | [rawphp](http://github.com/rawphp) | -| **[Serverless Plugin Encode Env Var Objects](https://github.com/yonomi/serverless-plugin-encode-env-var-objects)**
    Serverless plugin to encode any environment variable objects. | [yonomi](http://github.com/yonomi) | -| **[Serverless Plugin External Sns Events](https://github.com/silvermine/serverless-plugin-external-sns-events)**
    Add ability for functions to use existing or external SNS topics as an event source | [silvermine](http://github.com/silvermine) | -| **[Serverless Plugin Git Variables](https://github.com/jacob-meacham/serverless-plugin-git-variables)**
    A Serverless plugin to expose git variables (branch name, HEAD description, full commit hash) to your serverless services | [jacob-meacham](http://github.com/jacob-meacham) | -| **[Serverless Plugin Graphiql](https://github.com/bencooling/serverless-plugin-graphiql)**
    A Serverless plugin to run a local http server for graphiql and your graphql handler | [bencooling](http://github.com/bencooling) | -| **[Serverless Plugin Include Dependencies](https://github.com/dougmoscrop/serverless-plugin-include-dependencies)**
    This is a Serverless plugin that should make your deployed functions smaller. | [dougmoscrop](http://github.com/dougmoscrop) | -| **[Serverless Plugin Iopipe](https://github.com/iopipe/serverless-plugin-iopipe)**
    See inside your Lambda functions with high fidelity metrics and monitoring. | [iopipe](http://github.com/iopipe) | -| **[Serverless Plugin Lambda Dead Letter](https://github.com/gmetzker/serverless-plugin-lambda-dead-letter)**
    A Serverless plugin that can configure a lambda with a dead letter queue or topic | [gmetzker](http://github.com/gmetzker) | -| **[Serverless Plugin Log Subscription](https://github.com/dougmoscrop/serverless-plugin-log-subscription)**
    Adds a CloudWatch LogSubscription for functions | [dougmoscrop](http://github.com/dougmoscrop) | -| **[Serverless Plugin Multiple Responses](https://github.com/silvermine/serverless-plugin-multiple-responses)**
    Enable multiple content-types for Response template | [silvermine](http://github.com/silvermine) | -| **[Serverless Plugin Offline Kinesis Events](https://github.com/DopplerLabs/serverless-plugin-offline-kinesis-events)**
    Plugin that works with serverless-offline to allow offline testing of serverless functions that are triggered by Kinesis events. | [DopplerLabs](http://github.com/DopplerLabs) | -| **[Serverless Plugin Optimize](https://github.com/FidelLimited/serverless-plugin-optimize)**
    Bundle with Browserify, transpile with Babel to ES5 and minify with Uglify your Serverless functions. | [FidelLimited](http://github.com/FidelLimited) | -| **[Serverless Plugin Package Dotenv File](https://github.com/ACloudGuru/serverless-plugin-package-dotenv-file)**
    A Serverless plugin to copy a .env file into the serverless package | [ACloudGuru](http://github.com/ACloudGuru) | -| **[Serverless Plugin Scripts](https://github.com/mvila/serverless-plugin-scripts)**
    Add scripting capabilities to the Serverless Framework | [mvila](http://github.com/mvila) | -| **[Serverless Plugin Select](https://github.com/FidelLimited/serverless-plugin-select)**
    Select which functions are to be deployed based on region and stage. | [FidelLimited](http://github.com/FidelLimited) | -| **[Serverless Plugin Simulate](https://github.com/gertjvr/serverless-plugin-simulate)**
    Simulate AWS Lambda and API Gateway locally using Docker | [gertjvr](http://github.com/gertjvr) | -| **[Serverless Plugin Split Stacks](https://github.com/dougmoscrop/serverless-plugin-split-stacks)**
    Migrate certain resources to nested stacks | [dougmoscrop](http://github.com/dougmoscrop) | -| **[Serverless Plugin Stack Config](https://github.com/rawphp/serverless-plugin-stack-config)**
    A serverless plugin to manage configurations for a stack across micro-services. | [rawphp](http://github.com/rawphp) | -| **[Serverless Plugin Stack Outputs](https://github.com/svdgraaf/serverless-plugin-stack-outputs)**
    Displays stack outputs for your serverless stacks when `sls info` is ran | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Plugin Stage Variables](https://github.com/svdgraaf/serverless-plugin-stage-variables)**
    Add stage variables for Serverless 1.x to ApiGateway, so you can use variables in your Lambda's | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Plugin Subscription Filter](https://github.com/tsub/serverless-plugin-subscription-filter)**
    A serverless plugin to register AWS CloudWatchLogs subscription filter | [tsub](http://github.com/tsub) | -| **[Serverless Plugin Typescript](https://github.com/graphcool/serverless-plugin-typescript)**
    Serverless plugin for zero-config Typescript support. | [graphcool](http://github.com/graphcool) | -| **[Serverless Plugin Warmup](https://github.com/FidelLimited/serverless-plugin-warmup)**
    Keep your lambdas warm during Winter. | [FidelLimited](http://github.com/FidelLimited) | -| **[Serverless Plugin Webpack](https://github.com/goldwasserexchange/serverless-plugin-webpack)**
    A serverless plugin to automatically bundle your functions individually with webpack | [goldwasserexchange](http://github.com/goldwasserexchange) | -| **[Serverless Plugin Write Env Vars](https://github.com/silvermine/serverless-plugin-write-env-vars)**
    Write environment variables out to a file that is compatible with dotenv | [silvermine](http://github.com/silvermine) | -| **[Serverless Prune Plugin](https://github.com/claygregory/serverless-prune-plugin)**
    Deletes old versions of functions from AWS, preserving recent and aliased versions | [claygregory](http://github.com/claygregory) | -| **[Serverless Pseudo Parameters](https://github.com/svdgraaf/serverless-pseudo-parameters)**
    Use ${AWS::AccountId} and other cloudformation pseudo parameters in your serverless.yml values | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Python Individually](https://github.com/cfchou/serverless-python-individually)**
    A serverless framework plugin to install multiple lambda functions written in python | [cfchou](http://github.com/cfchou) | -| **[Serverless Python Requirements](https://github.com/UnitedIncome/serverless-python-requirements)**
    Serverless plugin to bundle Python packages | [UnitedIncome](http://github.com/UnitedIncome) | -| **[Serverless Resources Env](https://github.com/rurri/serverless-resources-env)**
    After Deploy, this plugin fetches cloudformation resource identifiers and sets them on AWS lambdas, and creates local .-env file | [rurri](http://github.com/rurri) | -| **[Serverless Run Function Plugin](https://github.com/lithin/serverless-run-function-plugin)**
    Run serverless function locally | [lithin](http://github.com/lithin) | -| **[Serverless S3 Remover](https://github.com/sinofseven/serverless-s3-remover)**
    A serverless plugin to make s3 buckets empty before deleting cloudformation stack when ```sls remove``` | [sinofseven](http://github.com/sinofseven) | -| **[Serverless S3 Sync](https://github.com/k1LoW/serverless-s3-sync)**
    A plugin to sync local directories and S3 prefixes for Serverless Framework, | [k1LoW](http://github.com/k1LoW) | -| **[Serverless S3bucket Sync](https://github.com/sbstjn/serverless-s3bucket-sync)**
    Sync a local folder with a S3 bucket after sls deploy | [sbstjn](http://github.com/sbstjn) | -| **[Serverless Sam](https://github.com/SAPessi/serverless-sam)**
    Exports an AWS SAM template for a service created with the Serverless Framework. | [SAPessi](http://github.com/SAPessi) | -| **[Serverless Scriptable Plugin](https://github.com/weixu365/serverless-scriptable-plugin)**
    Customize Serverless behavior without writing a plugin. | [weixu365](http://github.com/weixu365) | -| **[Serverless Sentry](https://github.com/arabold/serverless-sentry-plugin)**
    Automatic monitoring of memory usage, execution timeouts and forwarding of Lambda errors to Sentry (https://sentry.io). | [arabold](http://github.com/arabold) | -| **[Serverless Shell](https://github.com/UnitedIncome/serverless-shell)**
    Drop to a runtime shell with all the environment variables set that you'd have in lambda. | [UnitedIncome](http://github.com/UnitedIncome) | -| **[Serverless Sqs Alarms Plugin](https://github.com/sbstjn/serverless-sqs-alarms-plugin)**
    Wrapper to setup CloudWatch Alarms on SQS queue length | [sbstjn](http://github.com/sbstjn) | -| **[Serverless Sqs Fifo](https://github.com/vortarian/serverless-sqs-fifo)**
    A serverless plugin to handle creation of sqs fifo queue's in aws (stop-gap) | [vortarian](http://github.com/vortarian) | -| **[Serverless Stack Output](https://github.com/sbstjn/serverless-stack-output)**
    Store output from your AWS CloudFormation Stack in JSON/YAML/TOML files, or to pass it to a JavaScript function for further processing. | [sbstjn](http://github.com/sbstjn) | -| **[Serverless Step Functions](https://github.com/horike37/serverless-step-functions)**
    AWS Step Functions with Serverless Framework. | [horike37](http://github.com/horike37) | -| **[Serverless Subscription Filter](https://github.com/blackevil245/serverless-subscription-filter)**
    Serverless plugin to register subscription filter for Lambda logs. Register and pipe the logs of one lambda to another to process. | [blackevil245](http://github.com/blackevil245) | -| **[Serverless Vpc Discovery](https://github.com/amplify-education/serverless-vpc-discovery)**
    Serverless plugin for discovering VPC / Subnet / Security Group configuration by name. | [amplify-education](http://github.com/amplify-education) | -| **[Serverless Webpack](https://github.com/serverless-heaven/serverless-webpack)**
    Serverless plugin to bundle your lambdas with Webpack | [serverless-heaven](http://github.com/serverless-heaven) | +| **[Raml Serverless](https://github.com/andrewcurioso/raml-serverless)**
    Serverless plugin to work with RAML API spec documents | [andrewcurioso](http://github.com/andrewcurioso) | +| **[Serverless Alexa Plugin](https://github.com/rajington/serverless-alexa-plugin)**
    Serverless plugin to support Alexa Lambda events | [rajington](http://github.com/rajington) | +| **[Serverless Api Cloudfront](https://github.com/Droplr/serverless-api-cloudfront)**
    Plugin that adds CloudFront distribution in front of your API Gateway for custom domain, CDN caching and access log. | [Droplr](http://github.com/Droplr) | +| **[Serverless Api Stage](https://github.com/leftclickben/serverless-api-stage)**
    Serverless API Stage plugin, enables stage variables and logging for AWS API Gateway. | [leftclickben](http://github.com/leftclickben) | +| **[Serverless Apig S3](https://github.com/sdd/serverless-apig-s3)**
    Serve static front-end content from S3 via the API Gatewy and deploy client bundle to S3. | [sdd](http://github.com/sdd) | +| **[Serverless Apigateway Plugin](https://github.com/GFG/serverless-apigateway-plugin)**
    Configure the AWS api gateway: Binary support, Headers and Body template mappings | [GFG](http://github.com/GFG) | +| **[Serverless Apigw Binary](https://github.com/maciejtreder/serverless-apigw-binary)**
    Plugin to enable binary support in AWS API Gateway. | [maciejtreder](http://github.com/maciejtreder) | +| **[Serverless Apigwy Binary](https://github.com/ryanmurakami/serverless-apigwy-binary)**
    Serverless plugin for configuring API Gateway to return binary responses | [ryanmurakami](http://github.com/ryanmurakami) | +| **[Serverless Aws Alias](https://github.com/HyperBrain/serverless-aws-alias)**
    This plugin enables use of AWS aliases on Lambda functions. | [HyperBrain](http://github.com/HyperBrain) | +| **[Serverless Aws Documentation](https://github.com/9cookies/serverless-aws-documentation)**
    Serverless plugin to add documentation and models to the serverless generated API Gateway | [9cookies](http://github.com/9cookies) | +| **[Serverless Build Plugin](https://github.com/nfour/serverless-build-plugin)**
    A Node.js focused build plugin for serverless. | [nfour](http://github.com/nfour) | +| **[Serverless Cf Vars](https://gitlab.com/kabo/serverless-cf-vars)**
    Enables use of AWS pseudo functions and Fn::Sub string substitution | [kabo](http://github.com/kabo) | +| **[Serverless Cljs Plugin](https://github.com/nervous-systems/serverless-cljs-plugin)**
    Enables Clojurescript as an implementation language for Lambda handlers | [nervous-systems](http://github.com/nervous-systems) | +| **[Serverless Coffeescript](https://github.com/duanefields/serverless-coffeescript)**
    A Serverless plugin to compile your CoffeeScript into JavaScript at deployment | [duanefields](http://github.com/duanefields) | +| **[Serverless Command Line Event Args](https://github.com/horike37/serverless-command-line-event-args)**
    This module is Serverless Framework plugin. Event JSON passes to your Lambda function in commandline. | [horike37](http://github.com/horike37) | +| **[Serverless Crypt](https://github.com/marcy-terui/serverless-crypt)**
    Securing the secrets on Serverless Framework by AWS KMS encryption. | [marcy-terui](http://github.com/marcy-terui) | +| **[Serverless Custom Packaging Plugin](https://github.com/hypoport/serverless-custom-packaging-plugin)**
    Plugin to package your sourcecode using a custom target path inside the zip. | [hypoport](http://github.com/hypoport) | +| **[Serverless Dir Config Plugin](https://github.com/economysizegeek/serverless-dir-config-plugin)**
    EXPERIMENTAL - Serverless plugin to load function and resource definitions from a directory. | [economysizegeek](http://github.com/economysizegeek) | +| **[Serverless Domain Manager](https://github.com/amplify-education/serverless-domain-manager)**
    Serverless plugin for managing custom domains with API Gateways. | [amplify-education](http://github.com/amplify-education) | +| **[Serverless Dotenv](https://github.com/Jimdo/serverless-dotenv)**
    Fetch environment variables and write it to a .env file | [Jimdo](http://github.com/Jimdo) | +| **[Serverless Dotnet](https://github.com/fruffin/serverless-dotnet)**
    A serverless plugin to run 'dotnet' commands as part of the deploy process | [fruffin](http://github.com/fruffin) | +| **[Serverless Dynalite](https://github.com/sdd/serverless-dynalite)**
    Run dynalite locally (no JVM, all JS) to simulate DynamoDB. Watch serverless.yml for table config updates. | [sdd](http://github.com/sdd) | +| **[Serverless Dynamodb Autoscaling](https://github.com/sbstjn/serverless-dynamodb-autoscaling)**
    Configure Amazon DynamoDB's native Auto Scaling for your table capacities. | [sbstjn](http://github.com/sbstjn) | +| **[Serverless Dynamodb Local](https://github.com/99xt/serverless-dynamodb-local)**
    Serverless Dynamodb Local Plugin - Allows to run dynamodb locally for serverless | [99xt](http://github.com/99xt) | +| **[Serverless Dynamodb Ttl](https://github.com/Jimdo/serverless-dynamodb-ttl)**
    Configure DynamoDB TTL in serverless.yml (until CloudFormation supports this). | [Jimdo](http://github.com/Jimdo) | +| **[Serverless Enable Api Logs](https://github.com/paulSambolin/serverless-enable-api-logs)**
    Enables Coudwatch logging for API Gateway events | [paulSambolin](http://github.com/paulSambolin) | +| **[Serverless Env Generator](https://github.com/DieProduktMacher/serverless-env-generator)**
    Manage environment variables with YAML and load them with dotenv. Supports variable encryption with KMS, multiple stages and custom profiles. | [DieProduktMacher](http://github.com/DieProduktMacher) | +| **[Serverless Event Constant Inputs](https://github.com/dittto/serverless-event-constant-inputs)**
    Allows you to add constant inputs to events in Serverless 1.0. For more info see [constant values in Cloudwatch](https://aws.amazon.com/blogs/compute/simply-serverless-use-constant-values-in-cloudwatch-event-triggered-lambda-functions/) | [dittto](http://github.com/dittto) | +| **[Serverless Export Env](https://github.com/arabold/serverless-export-env)**
    Export environment variables into a .env file with automatic AWS CloudFormation reference resolution. | [arabold](http://github.com/arabold) | +| **[Serverless Gulp](https://github.com/rhythminme/serverless-gulp)**
    A thin task wrapper around @goserverless that allows you to automate build, test and deploy tasks using gulp | [rhythminme](http://github.com/rhythminme) | +| **[Serverless Hooks Plugin](https://github.com/uswitch/serverless-hooks-plugin)**
    Run arbitrary commands on any lifecycle event in serverless | [uswitch](http://github.com/uswitch) | +| **[Serverless Jest Plugin](https://github.com/SC5/serverless-jest-plugin)**
    A Serverless Plugin for the Serverless Framework which adds support for test-driven development using Jest | [SC5](http://github.com/SC5) | +| **[Serverless Kms Secrets](https://github.com/SC5/serverless-kms-secrets)**
    Allows to easily encrypt and decrypt secrets using KMS from the serverless CLI | [SC5](http://github.com/SC5) | +| **[Serverless Kubeless](https://github.com/serverless/serverless-kubeless)**
    Serverless plugin for deploying functions to Kubeless. | [serverless](http://github.com/serverless) | +| **[Serverless Local Dev Server](https://github.com/DieProduktMacher/serverless-local-dev-server)**
    Speeds up development of Alexa Skills, Chatbots and APIs by exposing your functions as local HTTP endpoints and mapping received events. | [DieProduktMacher](http://github.com/DieProduktMacher) | +| **[Serverless Log Forwarding](https://github.com/amplify-education/serverless-log-forwarding)**
    Serverless plugin for forwarding CloudWatch logs to another Lambda function. | [amplify-education](http://github.com/amplify-education) | +| **[Serverless Micro](https://github.com/barstoolsports/serverless-micro)**
    Plugin to help manage multiple micro services under one main service. | [barstoolsports](http://github.com/barstoolsports) | +| **[Serverless Mocha Plugin](https://github.com/SC5/serverless-mocha-plugin)**
    A Serverless Plugin for the Serverless Framework which adds support for test-driven development using Mocha | [SC5](http://github.com/SC5) | +| **[Serverless Nested Stack](https://github.com/jagdish-176/serverless-nested-stack)**
    A plugin to Workaround for Cloudformation 200 resource limit | [jagdish-176](http://github.com/jagdish-176) | +| **[Serverless Offline](https://github.com/dherault/serverless-offline)**
    Emulate AWS λ and API Gateway locally when developing your Serverless project | [dherault](http://github.com/dherault) | +| **[Serverless Offline Scheduler](https://github.com/ajmath/serverless-offline-scheduler)**
    Runs scheduled functions offline while integrating with serverless-offline | [ajmath](http://github.com/ajmath) | +| **[Serverless Offline Sns](https://github.com/mj1618/serverless-offline-sns)**
    Serverless plugin to run a local SNS server and call serverless SNS handlers with events notifications. | [mj1618](http://github.com/mj1618) | +| **[Serverless Package Python Functions](https://github.com/ubaniabalogun/serverless-package-python-functions)**
    Packaging Python Lambda functions with only the dependencies/requirements they need. | [ubaniabalogun](http://github.com/ubaniabalogun) | +| **[Serverless Parameters](https://github.com/svdgraaf/serverless-parameters)**
    Add parameters to the generated cloudformation templates | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Plugin Aws Alerts](https://github.com/ACloudGuru/serverless-plugin-aws-alerts)**
    A Serverless plugin to easily add CloudWatch alarms to functions | [ACloudGuru](http://github.com/ACloudGuru) | +| **[Serverless Plugin Aws Resolvers](https://github.com/DopplerLabs/serverless-plugin-aws-resolvers)**
    Resolves variables from ESS, RDS, or Kinesis for serverless services | [DopplerLabs](http://github.com/DopplerLabs) | +| **[Serverless Plugin Bespoken](https://github.com/bespoken/serverless-plugin-bespoken)**
    Creates a local server and a proxy so you don't have to deploy anytime you want to test your code | [bespoken](http://github.com/bespoken) | +| **[Serverless Plugin Bind Deployment Id](https://github.com/jacob-meacham/serverless-plugin-bind-deployment-id)**
    A Serverless plugin to bind the randomly generated deployment resource to your custom resources | [jacob-meacham](http://github.com/jacob-meacham) | +| **[Serverless Plugin Browserifier](https://github.com/digitalmaas/serverless-plugin-browserifier)**
    Reduce the size and speed up your Node.js based lambda's using browserify. | [digitalmaas](http://github.com/digitalmaas) | +| **[Serverless Plugin Browserify](https://github.com/doapp-ryanp/serverless-plugin-browserify)**
    Speed up your node based lambda's | [doapp-ryanp](http://github.com/doapp-ryanp) | +| **[Serverless Plugin Cfauthorizer](https://github.com/SC5/serverless-plugin-cfauthorizer)**
    This plugin allows you to define your own API Gateway Authorizers as the Serverless CloudFormation resources and apply them to HTTP endpoints. | [SC5](http://github.com/SC5) | +| **[Serverless Plugin Cloudwatch Sumologic](https://github.com/ACloudGuru/serverless-plugin-cloudwatch-sumologic)**
    Plugin which auto-subscribes a log delivery lambda function to lambda log groups created by serverless | [ACloudGuru](http://github.com/ACloudGuru) | +| **[Serverless Plugin Common Excludes](https://github.com/dougmoscrop/serverless-plugin-common-excludes)**
    Adds commonly excluded files to package.excludes | [dougmoscrop](http://github.com/dougmoscrop) | +| **[Serverless Plugin Custom Domain](https://github.com/dougmoscrop/serverless-plugin-custom-domain)**
    Reliably sets a BasePathMapping to an API Gateway Custom Domain | [dougmoscrop](http://github.com/dougmoscrop) | +| **[Serverless Plugin Deploy Environment](https://github.com/DopplerLabs/serverless-plugin-deploy-environment)**
    Plugin to manage deployment environment across stages | [DopplerLabs](http://github.com/DopplerLabs) | +| **[Serverless Plugin Diff](https://github.com/nicka/serverless-plugin-diff)**
    Compares your local AWS CloudFormation templates against deployed ones. | [nicka](http://github.com/nicka) | +| **[Serverless Plugin Elastic Beanstalk](https://github.com/rawphp/serverless-plugin-elastic-beanstalk)**
    A serverless plugin to deploy applications to AWS ElasticBeanstalk. | [rawphp](http://github.com/rawphp) | +| **[Serverless Plugin Encode Env Var Objects](https://github.com/yonomi/serverless-plugin-encode-env-var-objects)**
    Serverless plugin to encode any environment variable objects. | [yonomi](http://github.com/yonomi) | +| **[Serverless Plugin External Sns Events](https://github.com/silvermine/serverless-plugin-external-sns-events)**
    Add ability for functions to use existing or external SNS topics as an event source | [silvermine](http://github.com/silvermine) | +| **[Serverless Plugin Git Variables](https://github.com/jacob-meacham/serverless-plugin-git-variables)**
    A Serverless plugin to expose git variables (branch name, HEAD description, full commit hash) to your serverless services | [jacob-meacham](http://github.com/jacob-meacham) | +| **[Serverless Plugin Graphiql](https://github.com/bencooling/serverless-plugin-graphiql)**
    A Serverless plugin to run a local http server for graphiql and your graphql handler | [bencooling](http://github.com/bencooling) | +| **[Serverless Plugin Include Dependencies](https://github.com/dougmoscrop/serverless-plugin-include-dependencies)**
    This is a Serverless plugin that should make your deployed functions smaller. | [dougmoscrop](http://github.com/dougmoscrop) | +| **[Serverless Plugin Iopipe](https://github.com/iopipe/serverless-plugin-iopipe)**
    See inside your Lambda functions with high fidelity metrics and monitoring. | [iopipe](http://github.com/iopipe) | +| **[Serverless Plugin Lambda Dead Letter](https://github.com/gmetzker/serverless-plugin-lambda-dead-letter)**
    A Serverless plugin that can configure a lambda with a dead letter queue or topic | [gmetzker](http://github.com/gmetzker) | +| **[Serverless Plugin Log Subscription](https://github.com/dougmoscrop/serverless-plugin-log-subscription)**
    Adds a CloudWatch LogSubscription for functions | [dougmoscrop](http://github.com/dougmoscrop) | +| **[Serverless Plugin Multiple Responses](https://github.com/silvermine/serverless-plugin-multiple-responses)**
    Enable multiple content-types for Response template | [silvermine](http://github.com/silvermine) | +| **[Serverless Plugin Offline Kinesis Events](https://github.com/DopplerLabs/serverless-plugin-offline-kinesis-events)**
    Plugin that works with serverless-offline to allow offline testing of serverless functions that are triggered by Kinesis events. | [DopplerLabs](http://github.com/DopplerLabs) | +| **[Serverless Plugin Optimize](https://github.com/FidelLimited/serverless-plugin-optimize)**
    Bundle with Browserify, transpile with Babel to ES5 and minify with Uglify your Serverless functions. | [FidelLimited](http://github.com/FidelLimited) | +| **[Serverless Plugin Package Dotenv File](https://github.com/ACloudGuru/serverless-plugin-package-dotenv-file)**
    A Serverless plugin to copy a .env file into the serverless package | [ACloudGuru](http://github.com/ACloudGuru) | +| **[Serverless Plugin Scripts](https://github.com/mvila/serverless-plugin-scripts)**
    Add scripting capabilities to the Serverless Framework | [mvila](http://github.com/mvila) | +| **[Serverless Plugin Select](https://github.com/FidelLimited/serverless-plugin-select)**
    Select which functions are to be deployed based on region and stage. | [FidelLimited](http://github.com/FidelLimited) | +| **[Serverless Plugin Simulate](https://github.com/gertjvr/serverless-plugin-simulate)**
    Simulate AWS Lambda and API Gateway locally using Docker | [gertjvr](http://github.com/gertjvr) | +| **[Serverless Plugin Split Stacks](https://github.com/dougmoscrop/serverless-plugin-split-stacks)**
    Migrate certain resources to nested stacks | [dougmoscrop](http://github.com/dougmoscrop) | +| **[Serverless Plugin Stack Config](https://github.com/rawphp/serverless-plugin-stack-config)**
    A serverless plugin to manage configurations for a stack across micro-services. | [rawphp](http://github.com/rawphp) | +| **[Serverless Plugin Stack Outputs](https://github.com/svdgraaf/serverless-plugin-stack-outputs)**
    Displays stack outputs for your serverless stacks when `sls info` is ran | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Plugin Stage Variables](https://github.com/svdgraaf/serverless-plugin-stage-variables)**
    Add stage variables for Serverless 1.x to ApiGateway, so you can use variables in your Lambda's | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Plugin Subscription Filter](https://github.com/tsub/serverless-plugin-subscription-filter)**
    A serverless plugin to register AWS CloudWatchLogs subscription filter | [tsub](http://github.com/tsub) | +| **[Serverless Plugin Typescript](https://github.com/graphcool/serverless-plugin-typescript)**
    Serverless plugin for zero-config Typescript support. | [graphcool](http://github.com/graphcool) | +| **[Serverless Plugin Warmup](https://github.com/FidelLimited/serverless-plugin-warmup)**
    Keep your lambdas warm during Winter. | [FidelLimited](http://github.com/FidelLimited) | +| **[Serverless Plugin Webpack](https://github.com/goldwasserexchange/serverless-plugin-webpack)**
    A serverless plugin to automatically bundle your functions individually with webpack | [goldwasserexchange](http://github.com/goldwasserexchange) | +| **[Serverless Plugin Write Env Vars](https://github.com/silvermine/serverless-plugin-write-env-vars)**
    Write environment variables out to a file that is compatible with dotenv | [silvermine](http://github.com/silvermine) | +| **[Serverless Prune Plugin](https://github.com/claygregory/serverless-prune-plugin)**
    Deletes old versions of functions from AWS, preserving recent and aliased versions | [claygregory](http://github.com/claygregory) | +| **[Serverless Pseudo Parameters](https://github.com/svdgraaf/serverless-pseudo-parameters)**
    Use CloudFormation Pseudo Parameters in your Serverless project | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Pseudo Parameters](https://github.com/svdgraaf/serverless-pseudo-parameters)**
    Use ${AWS::AccountId} and other cloudformation pseudo parameters in your serverless.yml values | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Python Individually](https://github.com/cfchou/serverless-python-individually)**
    A serverless framework plugin to install multiple lambda functions written in python | [cfchou](http://github.com/cfchou) | +| **[Serverless Python Requirements](https://github.com/UnitedIncome/serverless-python-requirements)**
    Serverless plugin to bundle Python packages | [UnitedIncome](http://github.com/UnitedIncome) | +| **[Serverless Resources Env](https://github.com/rurri/serverless-resources-env)**
    After Deploy, this plugin fetches cloudformation resource identifiers and sets them on AWS lambdas, and creates local .-env file | [rurri](http://github.com/rurri) | +| **[Serverless Run Function Plugin](https://github.com/lithin/serverless-run-function-plugin)**
    Run serverless function locally | [lithin](http://github.com/lithin) | +| **[Serverless S3 Remover](https://github.com/sinofseven/serverless-s3-remover)**
    A serverless plugin to make s3 buckets empty before deleting cloudformation stack when ```sls remove``` | [sinofseven](http://github.com/sinofseven) | +| **[Serverless S3 Sync](https://github.com/k1LoW/serverless-s3-sync)**
    A plugin to sync local directories and S3 prefixes for Serverless Framework, | [k1LoW](http://github.com/k1LoW) | +| **[Serverless S3bucket Sync](https://github.com/sbstjn/serverless-s3bucket-sync)**
    Sync a local folder with a S3 bucket after sls deploy | [sbstjn](http://github.com/sbstjn) | +| **[Serverless Sam](https://github.com/SAPessi/serverless-sam)**
    Exports an AWS SAM template for a service created with the Serverless Framework. | [SAPessi](http://github.com/SAPessi) | +| **[Serverless Scriptable Plugin](https://github.com/weixu365/serverless-scriptable-plugin)**
    Customize Serverless behavior without writing a plugin. | [weixu365](http://github.com/weixu365) | +| **[Serverless Sentry](https://github.com/arabold/serverless-sentry-plugin)**
    Automatic monitoring of memory usage, execution timeouts and forwarding of Lambda errors to Sentry (https://sentry.io). | [arabold](http://github.com/arabold) | +| **[Serverless Shell](https://github.com/UnitedIncome/serverless-shell)**
    Drop to a runtime shell with all the environment variables set that you'd have in lambda. | [UnitedIncome](http://github.com/UnitedIncome) | +| **[Serverless Sqs Alarms Plugin](https://github.com/sbstjn/serverless-sqs-alarms-plugin)**
    Wrapper to setup CloudWatch Alarms on SQS queue length | [sbstjn](http://github.com/sbstjn) | +| **[Serverless Sqs Fifo](https://github.com/vortarian/serverless-sqs-fifo)**
    A serverless plugin to handle creation of sqs fifo queue's in aws (stop-gap) | [vortarian](http://github.com/vortarian) | +| **[Serverless Stack Output](https://github.com/sbstjn/serverless-stack-output)**
    Store output from your AWS CloudFormation Stack in JSON/YAML/TOML files, or to pass it to a JavaScript function for further processing. | [sbstjn](http://github.com/sbstjn) | +| **[Serverless Step Functions](https://github.com/horike37/serverless-step-functions)**
    AWS Step Functions with Serverless Framework. | [horike37](http://github.com/horike37) | +| **[Serverless Subscription Filter](https://github.com/blackevil245/serverless-subscription-filter)**
    Serverless plugin to register subscription filter for Lambda logs. Register and pipe the logs of one lambda to another to process. | [blackevil245](http://github.com/blackevil245) | +| **[Serverless Vpc Discovery](https://github.com/amplify-education/serverless-vpc-discovery)**
    Serverless plugin for discovering VPC / Subnet / Security Group configuration by name. | [amplify-education](http://github.com/amplify-education) | +| **[Serverless Webpack](https://github.com/serverless-heaven/serverless-webpack)**
    Serverless plugin to bundle your lambdas with Webpack | [serverless-heaven](http://github.com/serverless-heaven) | | **[Serverless Wsgi](https://github.com/logandk/serverless-wsgi)**
    Serverless plugin to deploy WSGI applications (Flask/Django/Pyramid etc.) and bundle Python packages | [logandk](http://github.com/logandk) | @@ -262,60 +266,67 @@ This table is generated from https://github.com/serverless/examples/blob/master/ --> | Project Name | Author | |:-------------|:------:| -| **[Jwtauthorizr](https://github.com/serverlessbuch/jwtAuthorizr)**
    Custom JWT Authorizer Lambda function for Amazon API Gateway with Bearer JWT | [serverlessbuch](http://github.com/serverlessbuch) | -| **[Serverless Graphql Api](https://github.com/boazdejong/serverless-graphql-api)**
    Serverless GraphQL API using Lambda and DynamoDB | [boazdejong](http://github.com/boazdejong) | -| **[Serverless Screenshot](https://github.com/svdgraaf/serverless-screenshot)**
    Serverless Screenshot Service using PhantomJS | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Postgraphql](https://github.com/rentrop/serverless-postgraphql)**
    GraphQL endpoint for PostgreSQL using postgraphql | [rentrop](http://github.com/rentrop) | -| **[Serverless Messenger Boilerplate](https://github.com/SC5/serverless-messenger-boilerplate)**
    Serverless messenger bot boilerplate | [SC5](http://github.com/SC5) | -| **[Serverless Npm Registry](https://github.com/craftship/yith)**
    Serverless private npm registry, proxy and cache. | [craftship](http://github.com/craftship) | -| **[Serverless Pokego](https://github.com/jch254/pokego-serverless)**
    Serverless-powered API to fetch nearby Pokemon Go data | [jch254](http://github.com/jch254) | -| **[Serverless Weekly2pocket App](https://github.com/s0enke/weekly2pocket)**
    Serverless-powered API for sending posts to pocket app | [s0enke](http://github.com/s0enke) | -| **[Serverless Facebook Quotebot](https://github.com/pmuens/quotebot)**
    100% Serverless Facebook messenger chatbot which will respond with inspiring quotes | [pmuens](http://github.com/pmuens) | -| **[Serverless Slack Trevorbot](https://github.com/conveyal/trevorbot)**
    Slack bot for info on where in the world is Trevor Gerhardt? | [conveyal](http://github.com/conveyal) | -| **[Serverless Garden Aid](https://github.com/garden-aid/web-bff)**
    IoT Garden Aid Backend | [garden-aid](http://github.com/garden-aid) | -| **[Serverless React Boilerplate](https://github.com/99xt/serverless-react-boilerplate)**
    A serverless react boilerplate for offline development | [99xt](http://github.com/99xt) | -| **[Serverless Delivery Framework](https://github.com/99xt/serverless-delivery-framework)**
    This is a boilerplate for version release pipeline with serverless framework | [99xt](http://github.com/99xt) | -| **[Serverless Mailgun Slack](https://github.com/Marcus-L/serverless-mailgun-slack)**
    A Serverless function for posting to a Slack Webhook in response to a Mailgun route | [Marcus-L](http://github.com/Marcus-L) | -| **[Pfs Email Serverless](https://github.com/SCPR/pfs-email-serverless)**
    This is a lambda function created by the serverless framework. It searches through members in our mongodb who have not been sent emails and sends them an email with their custom token to unlock the pledge free stream. It then marks those members off as already receiving the email. | [SCPR](http://github.com/SCPR) | -| **[Plaid Cashburndown Service](https://github.com/cplee/cashburndown-service)**
    Service for calculating cash burndown with plaid. Frontend code can be found here: https://github.com/cplee/cashburndown-site | [cplee](http://github.com/cplee) | -| **[Cordis Serverless](https://github.com/marzeelabs/cordis-serverless)**
    A serverless API for EU Cordis data | [marzeelabs](http://github.com/marzeelabs) | -| **[Serverless Newsletter Signup](https://github.com/ivanderbu2/serverless-newsletter-signup)**
    Saves user details into DynamoDB table. Required values are email, first_name and last_name. | [ivanderbu2](http://github.com/ivanderbu2) | -| **[Serverless Slack Cron](https://github.com/ivanderbu2/serverless-slack-cron)**
    Lambda function which sends messages to Slack channel in regular intervals via cron trigger. | [ivanderbu2](http://github.com/ivanderbu2) | -| **[Giphy Bot](https://github.com/tywong/lambda-workshop-2016/tree/master/giphy-bot)**
    giphy-bot for Facebook chat | [tywong](http://github.com/tywong) | -| **[Jwt Lambda Python](https://github.com/mikaelmork/jwt-auth.serverless)**
    Minimal proof-of-concept implementation of JWT with Serverless / AWS Lambda | [mikaelmork](http://github.com/mikaelmork) | -| **[Sls Access Counter](https://github.com/takahashim/sls-access-counter)**
    Site visitor counter | [takahashim](http://github.com/takahashim) | -| **[Sls Form Mail](https://github.com/takahashim/sls-form-mail)**
    Send SNS email from form data | [takahashim](http://github.com/takahashim) | -| **[Serverless Python Sample](https://github.com/bennybauer/serverless-python-sample)**
    A simple serverless python sample with REST API endpoints and dependencies | [bennybauer](http://github.com/bennybauer) | -| **[Serverless Msg Gateway](https://github.com/yonahforst/msg-gateway)**
    A messaging aggregator for kik, skype, twilio, telegram, & messenger. Send and receive messages in a standard format. | [yonahforst](http://github.com/yonahforst) | -| **[Serverless Aws Rekognition Finpics](https://github.com/rgfindl/finpics)**
    Use AWS Rekognition to provide a faces search of finpics.com | [rgfindl](http://github.com/rgfindl) | -| **[Serverless Slack Emojibot](https://github.com/markhobson/emojibot)**
    Serverless slack bot for emoji | [markhobson](http://github.com/markhobson) | -| **[Keboola Developer Portal](https://github.com/keboola/developer-portal)**
    Keboola developer portal built with Serverless | [keboola](http://github.com/keboola) | -| **[Serverless Cloudwatch Rds Custom Metrics](https://github.com/AndrewFarley/serverless-cloudwatch-rds-custom-metrics)**
    A NodeJS-based MySQL RDS Data Collection script to push Custom Metrics to Cloudwatch with Serverless | [AndrewFarley](http://github.com/AndrewFarley) | -| **[Jrestless Examples](https://github.com/bbilger/jrestless-examples)**
    [JRestless](https://github.com/bbilger/jrestless) (Java / JAX-RS) examples for [API Gateway Functions](https://github.com/bbilger/jrestless-examples/tree/master/aws/gateway) ([plain JAX-RS](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-showcase), [Spring](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-spring), [binary data requests/responses](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-binary), [custom authorizers](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-security-custom-authorizer) and [Cognito User Pool authorizers](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-security-cognito-authorizer)), [SNS Functions](https://github.com/bbilger/jrestless-examples/blob/master/aws/sns/aws-sns-usage-example) (asynchronous communication between functions) and [Service Functions](https://github.com/bbilger/jrestless-examples/blob/master/aws/service/aws-service-usage-example) (synchronous HTTP-like communication between functions - transparent through Feign) | [bbilger](http://github.com/bbilger) | -| **[Sc5 Serverless Boilerplate](https://github.com/SC5/sc5-serverless-boilerplate)**
    A boilerplate that contains setup for test-driven development | [SC5](http://github.com/SC5) | -| **[Serverless Blog To Podcast](https://github.com/SC5/serverless-blog-to-podcast)**
    Service that reads RSS feed and converts the entries to a podcast feed and audio files using Amazon Polly | [SC5](http://github.com/SC5) | -| **[Offset Trump](https://github.com/FLGMwt/offset-trump)**
    Single page app using Serverless (C# runtime) and S3 site hosting. Pledge to do a good thing for the next four years to offset the potential negative effects of the US Presidency | [FLGMwt](http://github.com/FLGMwt) | -| **[Serverless Url Shortener](https://github.com/aletheia/serverless-url-shortener)**
    A simple url-shortener, using Serverless framework | [aletheia](http://github.com/aletheia) | -| **[Serverless Html Pdf](https://github.com/calvintychan/serverless-html-pdf)**
    Service that convert HTML to PDF using PhantomJS's rasterize example. | [calvintychan](http://github.com/calvintychan) | -| **[Serverless Examples Cached Rds Ws](https://github.com/mugglmenzel/serverless-examples-cached-rds-ws)**
    A serverless framework example project that uses API Gateway, ElastiCache, and RDS PostgreSQL. | [mugglmenzel](http://github.com/mugglmenzel) | -| **[Bittman](https://github.com/rhlsthrm/bittman)**
    A serverless project that follows a stock trading algorithm and uses scheduled functions to save data to DynamoDB and send emails through Mailgun. | [rhlsthrm](http://github.com/rhlsthrm) | -| **[Adoptable Pet Bot](https://github.com/lynnaloo/adoptable-pet-bot)**
    Tweets adoptable pets using Serverless (Node.js) and AWS Lambda | [lynnaloo](http://github.com/lynnaloo) | -| **[Owntracks Serverless](https://github.com/dschep/owntracks-serverless)**
    A serverless implementation of the OwnTracks HTTP backend | [dschep](http://github.com/dschep) | -| **[Serverless Modern Koa](https://github.com/barczaG/serverless-modern-koa)**
    Serverless modern koa starter kit | [barczaG](http://github.com/barczaG) | -| **[Serverless Reactjs Universal Rendering Boilerplate](https://github.com/TylorShin/react-universal-in-serverless)**
    ReactJS web app Starter kit does universal (isomorphic) rendering with Serverless | [TylorShin](http://github.com/TylorShin) | -| **[Open Bot](https://github.com/open-bot/open-bot)**
    An unoptionated Github bot driven by a configuration file in the repository | [open-bot](http://github.com/open-bot) | -| **[Aws Ses Serverless Example](https://github.com/lakshmantgld/aws-ses-serverless-example)**
    AWS SES example in NodeJS using lambda | [lakshmantgld](http://github.com/lakshmantgld) | -| **[Aws Api Gateway Serverless Project Written In Go](https://github.com/yunspace/serverless-golang)**
    A serverless project that contains an API Gateway endpoint powered by a Lambda function written in golang and built using [eawsy/aws-lambda-go-shim](https://github.com/eawsy/aws-lambda-go-shim). | [yunspace](http://github.com/yunspace) | -| **[Video Preview And Analysis Service](https://github.com/laardee/video-preview-and-analysis-service)**
    An event-driven service that generates labels using Amazon Rekognition and creates preview GIF animation from a video file. | [laardee](http://github.com/laardee) | -| **[Serverless Es6/7 Crud Api](https://github.com/AnomalyInnovations/serverless-stack-demo-api)**
    [Serverless Stack](http://serverless-stack.com) examples of backend CRUD APIs (DynamoDB + Lambda + API Gateway + Cognito User Pool authorizer) for [React.js single-page app](http://demo.serverless-stack.com) | [AnomalyInnovations](http://github.com/AnomalyInnovations) | -| **[Sqs Worker With Aws Lambda And Cloudwatch Alarms](https://github.com/sbstjn/sqs-worker-serverless)**
    Process messages stored in SQS with an [auto-scaled AWS Lambda worker](https://sbstjn.com/serverless-sqs-worker-with-aws-lambda.html) function. | [sbstjn](http://github.com/sbstjn) | -| **[Aws Lambda Power Tuning (Powered By Step Functions)](https://github.com/alexcasalboni/aws-lambda-power-tuning)**
    Build a [Step Functions](https://aws.amazon.com/step-functions/) state machine to optimize your AWS Lambda Function memory/power configuration. | [alexcasalboni](http://github.com/alexcasalboni) | -| **[Amazon Kinesis Streams Fan Out Via Kinesis Analytics](https://github.com/alexcasalboni/kinesis-streams-fan-out-kinesis-analytics)**
    Use [Amazon Kinesis Analytics](https://aws.amazon.com/kinesis/analytics/) to fan-out your Kinesis Streams and avoid read throttling. | [alexcasalboni](http://github.com/alexcasalboni) | -| **[Grants Api Serverless](https://github.com/comicrelief/grants-api-serverless)**
    ES6 API to consume data from an external API, ingest into Elasticsearch and return a queryable endpoint on top of Elasticsearch | [comicrelief](http://github.com/comicrelief) | -| **[Honeylambda](https://github.com/0x4D31/honeyLambda)**
    a simple, serverless application designed to create and monitor URL {honey}tokens, on top of AWS Lambda and Amazon API Gateway | [0x4D31](http://github.com/0x4D31) | -| **[Stack Overflow Monitor](https://github.com/picsoung/stackoverflowmonitor)**
    Monitor Stack Overflow questions and post them in a Slack channel | [picsoung](http://github.com/picsoung) | -| **[React & Stripe Serverless Ecommerce](https://github.com/patrick-michelberger/serverless-shop)**
    Serverless E-Commerce App with AWS Lambda, Stripe and React | [patrick-michelberger](http://github.com/patrick-michelberger) | -| **[Serverless + Medium Text To Speech](https://github.com/RafalWilinski/serverless-medium-text-to-speech)**
    Serverless-based, text-to-speech service for Medium articles | [RafalWilinski](http://github.com/RafalWilinski) | +| **[Jwtauthorizr](https://github.com/serverlessbuch/jwtAuthorizr)**
    Custom JWT Authorizer Lambda function for Amazon API Gateway with Bearer JWT | [serverlessbuch](http://github.com/serverlessbuch) | +| **[Slack Signup Serverless](https://github.com/dzimine/slack-signup-serverless)**
    Serverless signup to Slack and more. Lambda with Python, StepFunctions, and Web front end. Python boilerplate included. | [dzimine](http://github.com/dzimine) | +| **[Serverless Graphql Api](https://github.com/boazdejong/serverless-graphql-api)**
    Serverless GraphQL API using Lambda and DynamoDB | [boazdejong](http://github.com/boazdejong) | +| **[Serverless Screenshot](https://github.com/svdgraaf/serverless-screenshot)**
    Serverless Screenshot Service using PhantomJS | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Postgraphql](https://github.com/rentrop/serverless-postgraphql)**
    GraphQL endpoint for PostgreSQL using postgraphql | [rentrop](http://github.com/rentrop) | +| **[Serverless Messenger Boilerplate](https://github.com/SC5/serverless-messenger-boilerplate)**
    Serverless messenger bot boilerplate | [SC5](http://github.com/SC5) | +| **[Serverless Npm Registry](https://github.com/craftship/yith)**
    Serverless private npm registry, proxy and cache. | [craftship](http://github.com/craftship) | +| **[Serverless Pokego](https://github.com/jch254/pokego-serverless)**
    Serverless-powered API to fetch nearby Pokemon Go data | [jch254](http://github.com/jch254) | +| **[Serverless Weekly2pocket App](https://github.com/s0enke/weekly2pocket)**
    Serverless-powered API for sending posts to pocket app | [s0enke](http://github.com/s0enke) | +| **[Serverless Facebook Quotebot](https://github.com/pmuens/quotebot)**
    100% Serverless Facebook messenger chatbot which will respond with inspiring quotes | [pmuens](http://github.com/pmuens) | +| **[Serverless Slack Trevorbot](https://github.com/conveyal/trevorbot)**
    Slack bot for info on where in the world is Trevor Gerhardt? | [conveyal](http://github.com/conveyal) | +| **[Serverless Garden Aid](https://github.com/garden-aid/web-bff)**
    IoT Garden Aid Backend | [garden-aid](http://github.com/garden-aid) | +| **[Serverless React Boilerplate](https://github.com/99xt/serverless-react-boilerplate)**
    A serverless react boilerplate for offline development | [99xt](http://github.com/99xt) | +| **[Serverless Delivery Framework](https://github.com/99xt/serverless-delivery-framework)**
    This is a boilerplate for version release pipeline with serverless framework | [99xt](http://github.com/99xt) | +| **[Serverless Mailgun Slack](https://github.com/Marcus-L/serverless-mailgun-slack)**
    A Serverless function for posting to a Slack Webhook in response to a Mailgun route | [Marcus-L](http://github.com/Marcus-L) | +| **[Pfs Email Serverless](https://github.com/SCPR/pfs-email-serverless)**
    This is a lambda function created by the serverless framework. It searches through members in our mongodb who have not been sent emails and sends them an email with their custom token to unlock the pledge free stream. It then marks those members off as already receiving the email. | [SCPR](http://github.com/SCPR) | +| **[Plaid Cashburndown Service](https://github.com/cplee/cashburndown-service)**
    Service for calculating cash burndown with plaid. Frontend code can be found here: https://github.com/cplee/cashburndown-site | [cplee](http://github.com/cplee) | +| **[Cordis Serverless](https://github.com/marzeelabs/cordis-serverless)**
    A serverless API for EU Cordis data | [marzeelabs](http://github.com/marzeelabs) | +| **[Serverless Newsletter Signup](https://github.com/ivanderbu2/serverless-newsletter-signup)**
    Saves user details into DynamoDB table. Required values are email, first_name and last_name. | [ivanderbu2](http://github.com/ivanderbu2) | +| **[Serverless Slack Cron](https://github.com/ivanderbu2/serverless-slack-cron)**
    Lambda function which sends messages to Slack channel in regular intervals via cron trigger. | [ivanderbu2](http://github.com/ivanderbu2) | +| **[Giphy Bot](https://github.com/tywong/lambda-workshop-2016/tree/master/giphy-bot)**
    giphy-bot for Facebook chat | [tywong](http://github.com/tywong) | +| **[Jwt Lambda Python](https://github.com/mikaelmork/jwt-auth.serverless)**
    Minimal proof-of-concept implementation of JWT with Serverless / AWS Lambda | [mikaelmork](http://github.com/mikaelmork) | +| **[Sls Access Counter](https://github.com/takahashim/sls-access-counter)**
    Site visitor counter | [takahashim](http://github.com/takahashim) | +| **[Sls Form Mail](https://github.com/takahashim/sls-form-mail)**
    Send SNS email from form data | [takahashim](http://github.com/takahashim) | +| **[Serverless Python Sample](https://github.com/bennybauer/serverless-python-sample)**
    A simple serverless python sample with REST API endpoints and dependencies | [bennybauer](http://github.com/bennybauer) | +| **[Serverless Msg Gateway](https://github.com/yonahforst/msg-gateway)**
    A messaging aggregator for kik, skype, twilio, telegram, & messenger. Send and receive messages in a standard format. | [yonahforst](http://github.com/yonahforst) | +| **[Serverless Aws Rekognition Finpics](https://github.com/rgfindl/finpics)**
    Use AWS Rekognition to provide a faces search of finpics.com | [rgfindl](http://github.com/rgfindl) | +| **[Serverless Slack Emojibot](https://github.com/markhobson/emojibot)**
    Serverless slack bot for emoji | [markhobson](http://github.com/markhobson) | +| **[Keboola Developer Portal](https://github.com/keboola/developer-portal)**
    Keboola developer portal built with Serverless | [keboola](http://github.com/keboola) | +| **[Serverless Cloudwatch Rds Custom Metrics](https://github.com/AndrewFarley/serverless-cloudwatch-rds-custom-metrics)**
    A NodeJS-based MySQL RDS Data Collection script to push Custom Metrics to Cloudwatch with Serverless | [AndrewFarley](http://github.com/AndrewFarley) | +| **[Jrestless Examples](https://github.com/bbilger/jrestless-examples)**
    [JRestless](https://github.com/bbilger/jrestless) (Java / JAX-RS) examples for [API Gateway Functions](https://github.com/bbilger/jrestless-examples/tree/master/aws/gateway) ([plain JAX-RS](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-showcase), [Spring](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-spring), [binary data requests/responses](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-binary), [custom authorizers](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-security-custom-authorizer) and [Cognito User Pool authorizers](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-security-cognito-authorizer)), [SNS Functions](https://github.com/bbilger/jrestless-examples/blob/master/aws/sns/aws-sns-usage-example) (asynchronous communication between functions) and [Service Functions](https://github.com/bbilger/jrestless-examples/blob/master/aws/service/aws-service-usage-example) (synchronous HTTP-like communication between functions - transparent through Feign) | [bbilger](http://github.com/bbilger) | +| **[Sc5 Serverless Boilerplate](https://github.com/SC5/sc5-serverless-boilerplate)**
    A boilerplate that contains setup for test-driven development | [SC5](http://github.com/SC5) | +| **[Serverless Blog To Podcast](https://github.com/SC5/serverless-blog-to-podcast)**
    Service that reads RSS feed and converts the entries to a podcast feed and audio files using Amazon Polly | [SC5](http://github.com/SC5) | +| **[Offset Trump](https://github.com/FLGMwt/offset-trump)**
    Single page app using Serverless (C# runtime) and S3 site hosting. Pledge to do a good thing for the next four years to offset the potential negative effects of the US Presidency | [FLGMwt](http://github.com/FLGMwt) | +| **[Serverless Url Shortener](https://github.com/aletheia/serverless-url-shortener)**
    A simple url-shortener, using Serverless framework | [aletheia](http://github.com/aletheia) | +| **[Serverless Html Pdf](https://github.com/calvintychan/serverless-html-pdf)**
    Service that convert HTML to PDF using PhantomJS's rasterize example. | [calvintychan](http://github.com/calvintychan) | +| **[Serverless Examples Cached Rds Ws](https://github.com/mugglmenzel/serverless-examples-cached-rds-ws)**
    A serverless framework example project that uses API Gateway, ElastiCache, and RDS PostgreSQL. | [mugglmenzel](http://github.com/mugglmenzel) | +| **[Bittman](https://github.com/rhlsthrm/bittman)**
    A serverless project that follows a stock trading algorithm and uses scheduled functions to save data to DynamoDB and send emails through Mailgun. | [rhlsthrm](http://github.com/rhlsthrm) | +| **[Adoptable Pet Bot](https://github.com/lynnaloo/adoptable-pet-bot)**
    Tweets adoptable pets using Serverless (Node.js) and AWS Lambda | [lynnaloo](http://github.com/lynnaloo) | +| **[Owntracks Serverless](https://github.com/dschep/owntracks-serverless)**
    A serverless implementation of the OwnTracks HTTP backend | [dschep](http://github.com/dschep) | +| **[Serverless Modern Koa](https://github.com/barczaG/serverless-modern-koa)**
    Serverless modern koa starter kit | [barczaG](http://github.com/barczaG) | +| **[Serverless Reactjs Universal Rendering Boilerplate](https://github.com/TylorShin/react-universal-in-serverless)**
    ReactJS web app Starter kit does universal (isomorphic) rendering with Serverless | [TylorShin](http://github.com/TylorShin) | +| **[Open Bot](https://github.com/open-bot/open-bot)**
    An unoptionated Github bot driven by a configuration file in the repository | [open-bot](http://github.com/open-bot) | +| **[Aws Ses Serverless Example](https://github.com/lakshmantgld/aws-ses-serverless-example)**
    AWS SES example in NodeJS using lambda | [lakshmantgld](http://github.com/lakshmantgld) | +| **[Aws Api Gateway Serverless Project Written In Go](https://github.com/yunspace/serverless-golang)**
    A serverless project that contains an API Gateway endpoint powered by a Lambda function written in golang and built using [eawsy/aws-lambda-go-shim](https://github.com/eawsy/aws-lambda-go-shim). | [yunspace](http://github.com/yunspace) | +| **[Video Preview And Analysis Service](https://github.com/laardee/video-preview-and-analysis-service)**
    An event-driven service that generates labels using Amazon Rekognition and creates preview GIF animation from a video file. | [laardee](http://github.com/laardee) | +| **[Serverless Es6/7 Crud Api](https://github.com/AnomalyInnovations/serverless-stack-demo-api)**
    [Serverless Stack](http://serverless-stack.com) examples of backend CRUD APIs (DynamoDB + Lambda + API Gateway + Cognito User Pool authorizer) for [React.js single-page app](http://demo.serverless-stack.com) | [AnomalyInnovations](http://github.com/AnomalyInnovations) | +| **[Sqs Worker With Aws Lambda And Cloudwatch Alarms](https://github.com/sbstjn/sqs-worker-serverless)**
    Process messages stored in SQS with an [auto-scaled AWS Lambda worker](https://sbstjn.com/serverless-sqs-worker-with-aws-lambda.html) function. | [sbstjn](http://github.com/sbstjn) | +| **[Serverless Image Manager](https://github.com/TylorShin/lambda-image-manager)**
    image upload / download with resizing. Used API gateway's binary support & serverless | [TylorShin](http://github.com/TylorShin) | +| **[Aws Lambda Power Tuning (Powered By Step Functions)](https://github.com/alexcasalboni/aws-lambda-power-tuning)**
    Build a [Step Functions](https://aws.amazon.com/step-functions/) state machine to optimize your AWS Lambda Function memory/power configuration. | [alexcasalboni](http://github.com/alexcasalboni) | +| **[Amazon Kinesis Streams Fan Out Via Kinesis Analytics](https://github.com/alexcasalboni/kinesis-streams-fan-out-kinesis-analytics)**
    Use [Amazon Kinesis Analytics](https://aws.amazon.com/kinesis/analytics/) to fan-out your Kinesis Streams and avoid read throttling. | [alexcasalboni](http://github.com/alexcasalboni) | +| **[Grants Api Serverless](https://github.com/comicrelief/grants-api-serverless)**
    ES6 API to consume data from an external API, ingest into Elasticsearch and return a queryable endpoint on top of Elasticsearch | [comicrelief](http://github.com/comicrelief) | +| **[Honeylambda](https://github.com/0x4D31/honeyLambda)**
    a simple, serverless application designed to create and monitor URL {honey}tokens, on top of AWS Lambda and Amazon API Gateway | [0x4D31](http://github.com/0x4D31) | +| **[Faultline](https://github.com/faultline/faultline)**
    Error tracking tool on AWS managed services. | [faultline](http://github.com/faultline) | +| **[Stack Overflow Monitor](https://github.com/picsoung/stackoverflowmonitor)**
    Monitor Stack Overflow questions and post them in a Slack channel | [picsoung](http://github.com/picsoung) | +| **[Serverless Analytics](https://github.com/sbstjn/serverless-analytics)**
    Write your own Google Analytics clone and track website visitors serverless with API Gateway, Kinesis, Lambda, and DynamoDB. | [sbstjn](http://github.com/sbstjn) | +| **[React & Stripe Serverless Ecommerce](https://github.com/patrick-michelberger/serverless-shop)**
    Serverless E-Commerce App with AWS Lambda, Stripe and React | [patrick-michelberger](http://github.com/patrick-michelberger) | +| **[Serverless + Medium Text To Speech](https://github.com/RafalWilinski/serverless-medium-text-to-speech)**
    Serverless-based, text-to-speech service for Medium articles | [RafalWilinski](http://github.com/RafalWilinski) | +| **[Serverless + Java Dynamodb Imlementation Example](https://github.com/igorbakman/java-lambda-dynamodb)**
    example for java programmers that want to work with AWS-Lambda and DynamoDB | [igorbakman](http://github.com/igorbakman) | +| **[Aws Cognito Custom User Pool Example](https://github.com/bsdkurt/aws-node-custom-user-pool)**
    Example CloudFormation custom resource backed by a lambda using Cognito User Pools | [bsdkurt](http://github.com/bsdkurt) | +| **[Serverless + Lambda Protobuf Responses](https://github.com/theburningmonk/lambda-protobuf-demo)**
    Demo using API Gateway and Lambda with Protocol Buffer | [theburningmonk](http://github.com/theburningmonk) | ## Contributing diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/validate.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/validate.js index 1d7e55b9d..247d07367 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/validate.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/validate.js @@ -251,6 +251,10 @@ module.exports = { throw new this.serverless.classes.Error('Please provide either an authorizer name or ARN'); } + if (!type) { + type = authorizer.type; + } + resultTtlInSeconds = Number.parseInt(authorizer.resultTtlInSeconds, 10); resultTtlInSeconds = Number.isNaN(resultTtlInSeconds) ? 300 : resultTtlInSeconds; claims = authorizer.claims || []; diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/validate.test.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/validate.test.js index 6e9c6a12b..15fae5f22 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/validate.test.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/validate.test.js @@ -406,6 +406,33 @@ describe('#validate()', () => { expect(authorizer.identityValidationExpression).to.equal('foo'); }); + it('should accept authorizer config with a type', () => { + awsCompileApigEvents.serverless.service.functions = { + foo: {}, + first: { + events: [ + { + http: { + method: 'GET', + path: 'foo/bar', + authorizer: { + name: 'foo', + type: 'request', + resultTtlInSeconds: 500, + identitySource: 'method.request.header.Custom', + identityValidationExpression: 'foo', + }, + }, + }, + ], + }, + }; + + const validated = awsCompileApigEvents.validate(); + const authorizer = validated.events[0].http.authorizer; + expect(authorizer.type).to.equal('request'); + }); + it('should accept authorizer config when resultTtlInSeconds is 0', () => { awsCompileApigEvents.serverless.service.functions = { foo: {}, From 29a85498f5361a0c56b7e14f9e2ef5516612e9f1 Mon Sep 17 00:00:00 2001 From: Daniel Schep Date: Fri, 6 Oct 2017 14:50:12 -0400 Subject: [PATCH 098/128] Set stdin to a TTY in invoke.py to allow PDB use Setting `sys.stdin` to a TTY prevents `pdb.set_trace()` from immediatly throwing `BdbQuit`. I am unsure if there is a way to make this work in Windows --- lib/plugins/aws/invokeLocal/invoke.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/plugins/aws/invokeLocal/invoke.py b/lib/plugins/aws/invokeLocal/invoke.py index 3d9482473..1078d4b8a 100755 --- a/lib/plugins/aws/invokeLocal/invoke.py +++ b/lib/plugins/aws/invokeLocal/invoke.py @@ -58,6 +58,8 @@ if __name__ == '__main__': handler = getattr(module, args.handler_name) input = json.load(sys.stdin) + if sys.platform != 'win32': + sys.stdin = open('/dev/tty') context = FakeLambdaContext(**input.get('context', {})) result = handler(input['event'], context) sys.stdout.write(json.dumps(result, indent=4)) From 84e98e45c1e09ab2daec7fc337cb0c271b92ad79 Mon Sep 17 00:00:00 2001 From: Jonathan Spies Date: Tue, 10 Oct 2017 13:49:56 -0500 Subject: [PATCH 099/128] update docs to reflect multiple identity sources: --- docs/providers/aws/events/apigateway.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/providers/aws/events/apigateway.md b/docs/providers/aws/events/apigateway.md index 8ee5aad0c..4b7c11b65 100644 --- a/docs/providers/aws/events/apigateway.md +++ b/docs/providers/aws/events/apigateway.md @@ -314,8 +314,7 @@ functions: identityValidationExpression: someRegex ``` -You can also use the Request Type Authorizer by setting the `type` property. In this case, you -do not need the `identitySource` +You can also use the Request Type Authorizer by setting the `type` property. In this case, your `identitySource` could contain multiple entries for you policy cache. ```yml functions: @@ -328,6 +327,7 @@ functions: authorizer: arn: xxx:xxx:Lambda-Name resultTtlInSeconds: 0 + identitySource: method.request.header.Authorization, context.identity.sourceIp identityValidationExpression: someRegex type: request ``` From b4ca2a125a205052338622995c9a2d5f931ae902 Mon Sep 17 00:00:00 2001 From: Jonathan Spies Date: Tue, 10 Oct 2017 16:08:56 -0500 Subject: [PATCH 100/128] add default token to docs and roll readme back --- README.md | 315 ++++++++++++------------ docs/providers/aws/events/apigateway.md | 2 +- 2 files changed, 153 insertions(+), 164 deletions(-) diff --git a/README.md b/README.md index d0c9e26d5..03f42434d 100644 --- a/README.md +++ b/README.md @@ -154,108 +154,104 @@ This table is generated from https://github.com/serverless/plugins/blob/master/p --> | Plugin | Author | |:-------|:------:| -| **[Raml Serverless](https://github.com/andrewcurioso/raml-serverless)**
    Serverless plugin to work with RAML API spec documents | [andrewcurioso](http://github.com/andrewcurioso) | -| **[Serverless Alexa Plugin](https://github.com/rajington/serverless-alexa-plugin)**
    Serverless plugin to support Alexa Lambda events | [rajington](http://github.com/rajington) | -| **[Serverless Api Cloudfront](https://github.com/Droplr/serverless-api-cloudfront)**
    Plugin that adds CloudFront distribution in front of your API Gateway for custom domain, CDN caching and access log. | [Droplr](http://github.com/Droplr) | -| **[Serverless Api Stage](https://github.com/leftclickben/serverless-api-stage)**
    Serverless API Stage plugin, enables stage variables and logging for AWS API Gateway. | [leftclickben](http://github.com/leftclickben) | -| **[Serverless Apig S3](https://github.com/sdd/serverless-apig-s3)**
    Serve static front-end content from S3 via the API Gatewy and deploy client bundle to S3. | [sdd](http://github.com/sdd) | -| **[Serverless Apigateway Plugin](https://github.com/GFG/serverless-apigateway-plugin)**
    Configure the AWS api gateway: Binary support, Headers and Body template mappings | [GFG](http://github.com/GFG) | -| **[Serverless Apigw Binary](https://github.com/maciejtreder/serverless-apigw-binary)**
    Plugin to enable binary support in AWS API Gateway. | [maciejtreder](http://github.com/maciejtreder) | -| **[Serverless Apigwy Binary](https://github.com/ryanmurakami/serverless-apigwy-binary)**
    Serverless plugin for configuring API Gateway to return binary responses | [ryanmurakami](http://github.com/ryanmurakami) | -| **[Serverless Aws Alias](https://github.com/HyperBrain/serverless-aws-alias)**
    This plugin enables use of AWS aliases on Lambda functions. | [HyperBrain](http://github.com/HyperBrain) | -| **[Serverless Aws Documentation](https://github.com/9cookies/serverless-aws-documentation)**
    Serverless plugin to add documentation and models to the serverless generated API Gateway | [9cookies](http://github.com/9cookies) | -| **[Serverless Build Plugin](https://github.com/nfour/serverless-build-plugin)**
    A Node.js focused build plugin for serverless. | [nfour](http://github.com/nfour) | -| **[Serverless Cf Vars](https://gitlab.com/kabo/serverless-cf-vars)**
    Enables use of AWS pseudo functions and Fn::Sub string substitution | [kabo](http://github.com/kabo) | -| **[Serverless Cljs Plugin](https://github.com/nervous-systems/serverless-cljs-plugin)**
    Enables Clojurescript as an implementation language for Lambda handlers | [nervous-systems](http://github.com/nervous-systems) | -| **[Serverless Coffeescript](https://github.com/duanefields/serverless-coffeescript)**
    A Serverless plugin to compile your CoffeeScript into JavaScript at deployment | [duanefields](http://github.com/duanefields) | -| **[Serverless Command Line Event Args](https://github.com/horike37/serverless-command-line-event-args)**
    This module is Serverless Framework plugin. Event JSON passes to your Lambda function in commandline. | [horike37](http://github.com/horike37) | -| **[Serverless Crypt](https://github.com/marcy-terui/serverless-crypt)**
    Securing the secrets on Serverless Framework by AWS KMS encryption. | [marcy-terui](http://github.com/marcy-terui) | -| **[Serverless Custom Packaging Plugin](https://github.com/hypoport/serverless-custom-packaging-plugin)**
    Plugin to package your sourcecode using a custom target path inside the zip. | [hypoport](http://github.com/hypoport) | -| **[Serverless Dir Config Plugin](https://github.com/economysizegeek/serverless-dir-config-plugin)**
    EXPERIMENTAL - Serverless plugin to load function and resource definitions from a directory. | [economysizegeek](http://github.com/economysizegeek) | -| **[Serverless Domain Manager](https://github.com/amplify-education/serverless-domain-manager)**
    Serverless plugin for managing custom domains with API Gateways. | [amplify-education](http://github.com/amplify-education) | -| **[Serverless Dotenv](https://github.com/Jimdo/serverless-dotenv)**
    Fetch environment variables and write it to a .env file | [Jimdo](http://github.com/Jimdo) | -| **[Serverless Dotnet](https://github.com/fruffin/serverless-dotnet)**
    A serverless plugin to run 'dotnet' commands as part of the deploy process | [fruffin](http://github.com/fruffin) | -| **[Serverless Dynalite](https://github.com/sdd/serverless-dynalite)**
    Run dynalite locally (no JVM, all JS) to simulate DynamoDB. Watch serverless.yml for table config updates. | [sdd](http://github.com/sdd) | -| **[Serverless Dynamodb Autoscaling](https://github.com/sbstjn/serverless-dynamodb-autoscaling)**
    Configure Amazon DynamoDB's native Auto Scaling for your table capacities. | [sbstjn](http://github.com/sbstjn) | -| **[Serverless Dynamodb Local](https://github.com/99xt/serverless-dynamodb-local)**
    Serverless Dynamodb Local Plugin - Allows to run dynamodb locally for serverless | [99xt](http://github.com/99xt) | -| **[Serverless Dynamodb Ttl](https://github.com/Jimdo/serverless-dynamodb-ttl)**
    Configure DynamoDB TTL in serverless.yml (until CloudFormation supports this). | [Jimdo](http://github.com/Jimdo) | -| **[Serverless Enable Api Logs](https://github.com/paulSambolin/serverless-enable-api-logs)**
    Enables Coudwatch logging for API Gateway events | [paulSambolin](http://github.com/paulSambolin) | -| **[Serverless Env Generator](https://github.com/DieProduktMacher/serverless-env-generator)**
    Manage environment variables with YAML and load them with dotenv. Supports variable encryption with KMS, multiple stages and custom profiles. | [DieProduktMacher](http://github.com/DieProduktMacher) | -| **[Serverless Event Constant Inputs](https://github.com/dittto/serverless-event-constant-inputs)**
    Allows you to add constant inputs to events in Serverless 1.0. For more info see [constant values in Cloudwatch](https://aws.amazon.com/blogs/compute/simply-serverless-use-constant-values-in-cloudwatch-event-triggered-lambda-functions/) | [dittto](http://github.com/dittto) | -| **[Serverless Export Env](https://github.com/arabold/serverless-export-env)**
    Export environment variables into a .env file with automatic AWS CloudFormation reference resolution. | [arabold](http://github.com/arabold) | -| **[Serverless Gulp](https://github.com/rhythminme/serverless-gulp)**
    A thin task wrapper around @goserverless that allows you to automate build, test and deploy tasks using gulp | [rhythminme](http://github.com/rhythminme) | -| **[Serverless Hooks Plugin](https://github.com/uswitch/serverless-hooks-plugin)**
    Run arbitrary commands on any lifecycle event in serverless | [uswitch](http://github.com/uswitch) | -| **[Serverless Jest Plugin](https://github.com/SC5/serverless-jest-plugin)**
    A Serverless Plugin for the Serverless Framework which adds support for test-driven development using Jest | [SC5](http://github.com/SC5) | -| **[Serverless Kms Secrets](https://github.com/SC5/serverless-kms-secrets)**
    Allows to easily encrypt and decrypt secrets using KMS from the serverless CLI | [SC5](http://github.com/SC5) | -| **[Serverless Kubeless](https://github.com/serverless/serverless-kubeless)**
    Serverless plugin for deploying functions to Kubeless. | [serverless](http://github.com/serverless) | -| **[Serverless Local Dev Server](https://github.com/DieProduktMacher/serverless-local-dev-server)**
    Speeds up development of Alexa Skills, Chatbots and APIs by exposing your functions as local HTTP endpoints and mapping received events. | [DieProduktMacher](http://github.com/DieProduktMacher) | -| **[Serverless Log Forwarding](https://github.com/amplify-education/serverless-log-forwarding)**
    Serverless plugin for forwarding CloudWatch logs to another Lambda function. | [amplify-education](http://github.com/amplify-education) | -| **[Serverless Micro](https://github.com/barstoolsports/serverless-micro)**
    Plugin to help manage multiple micro services under one main service. | [barstoolsports](http://github.com/barstoolsports) | -| **[Serverless Mocha Plugin](https://github.com/SC5/serverless-mocha-plugin)**
    A Serverless Plugin for the Serverless Framework which adds support for test-driven development using Mocha | [SC5](http://github.com/SC5) | -| **[Serverless Nested Stack](https://github.com/jagdish-176/serverless-nested-stack)**
    A plugin to Workaround for Cloudformation 200 resource limit | [jagdish-176](http://github.com/jagdish-176) | -| **[Serverless Offline](https://github.com/dherault/serverless-offline)**
    Emulate AWS λ and API Gateway locally when developing your Serverless project | [dherault](http://github.com/dherault) | -| **[Serverless Offline Scheduler](https://github.com/ajmath/serverless-offline-scheduler)**
    Runs scheduled functions offline while integrating with serverless-offline | [ajmath](http://github.com/ajmath) | -| **[Serverless Offline Sns](https://github.com/mj1618/serverless-offline-sns)**
    Serverless plugin to run a local SNS server and call serverless SNS handlers with events notifications. | [mj1618](http://github.com/mj1618) | -| **[Serverless Package Python Functions](https://github.com/ubaniabalogun/serverless-package-python-functions)**
    Packaging Python Lambda functions with only the dependencies/requirements they need. | [ubaniabalogun](http://github.com/ubaniabalogun) | -| **[Serverless Parameters](https://github.com/svdgraaf/serverless-parameters)**
    Add parameters to the generated cloudformation templates | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Plugin Aws Alerts](https://github.com/ACloudGuru/serverless-plugin-aws-alerts)**
    A Serverless plugin to easily add CloudWatch alarms to functions | [ACloudGuru](http://github.com/ACloudGuru) | -| **[Serverless Plugin Aws Resolvers](https://github.com/DopplerLabs/serverless-plugin-aws-resolvers)**
    Resolves variables from ESS, RDS, or Kinesis for serverless services | [DopplerLabs](http://github.com/DopplerLabs) | -| **[Serverless Plugin Bespoken](https://github.com/bespoken/serverless-plugin-bespoken)**
    Creates a local server and a proxy so you don't have to deploy anytime you want to test your code | [bespoken](http://github.com/bespoken) | -| **[Serverless Plugin Bind Deployment Id](https://github.com/jacob-meacham/serverless-plugin-bind-deployment-id)**
    A Serverless plugin to bind the randomly generated deployment resource to your custom resources | [jacob-meacham](http://github.com/jacob-meacham) | -| **[Serverless Plugin Browserifier](https://github.com/digitalmaas/serverless-plugin-browserifier)**
    Reduce the size and speed up your Node.js based lambda's using browserify. | [digitalmaas](http://github.com/digitalmaas) | -| **[Serverless Plugin Browserify](https://github.com/doapp-ryanp/serverless-plugin-browserify)**
    Speed up your node based lambda's | [doapp-ryanp](http://github.com/doapp-ryanp) | -| **[Serverless Plugin Cfauthorizer](https://github.com/SC5/serverless-plugin-cfauthorizer)**
    This plugin allows you to define your own API Gateway Authorizers as the Serverless CloudFormation resources and apply them to HTTP endpoints. | [SC5](http://github.com/SC5) | -| **[Serverless Plugin Cloudwatch Sumologic](https://github.com/ACloudGuru/serverless-plugin-cloudwatch-sumologic)**
    Plugin which auto-subscribes a log delivery lambda function to lambda log groups created by serverless | [ACloudGuru](http://github.com/ACloudGuru) | -| **[Serverless Plugin Common Excludes](https://github.com/dougmoscrop/serverless-plugin-common-excludes)**
    Adds commonly excluded files to package.excludes | [dougmoscrop](http://github.com/dougmoscrop) | -| **[Serverless Plugin Custom Domain](https://github.com/dougmoscrop/serverless-plugin-custom-domain)**
    Reliably sets a BasePathMapping to an API Gateway Custom Domain | [dougmoscrop](http://github.com/dougmoscrop) | -| **[Serverless Plugin Deploy Environment](https://github.com/DopplerLabs/serverless-plugin-deploy-environment)**
    Plugin to manage deployment environment across stages | [DopplerLabs](http://github.com/DopplerLabs) | -| **[Serverless Plugin Diff](https://github.com/nicka/serverless-plugin-diff)**
    Compares your local AWS CloudFormation templates against deployed ones. | [nicka](http://github.com/nicka) | -| **[Serverless Plugin Elastic Beanstalk](https://github.com/rawphp/serverless-plugin-elastic-beanstalk)**
    A serverless plugin to deploy applications to AWS ElasticBeanstalk. | [rawphp](http://github.com/rawphp) | -| **[Serverless Plugin Encode Env Var Objects](https://github.com/yonomi/serverless-plugin-encode-env-var-objects)**
    Serverless plugin to encode any environment variable objects. | [yonomi](http://github.com/yonomi) | -| **[Serverless Plugin External Sns Events](https://github.com/silvermine/serverless-plugin-external-sns-events)**
    Add ability for functions to use existing or external SNS topics as an event source | [silvermine](http://github.com/silvermine) | -| **[Serverless Plugin Git Variables](https://github.com/jacob-meacham/serverless-plugin-git-variables)**
    A Serverless plugin to expose git variables (branch name, HEAD description, full commit hash) to your serverless services | [jacob-meacham](http://github.com/jacob-meacham) | -| **[Serverless Plugin Graphiql](https://github.com/bencooling/serverless-plugin-graphiql)**
    A Serverless plugin to run a local http server for graphiql and your graphql handler | [bencooling](http://github.com/bencooling) | -| **[Serverless Plugin Include Dependencies](https://github.com/dougmoscrop/serverless-plugin-include-dependencies)**
    This is a Serverless plugin that should make your deployed functions smaller. | [dougmoscrop](http://github.com/dougmoscrop) | -| **[Serverless Plugin Iopipe](https://github.com/iopipe/serverless-plugin-iopipe)**
    See inside your Lambda functions with high fidelity metrics and monitoring. | [iopipe](http://github.com/iopipe) | -| **[Serverless Plugin Lambda Dead Letter](https://github.com/gmetzker/serverless-plugin-lambda-dead-letter)**
    A Serverless plugin that can configure a lambda with a dead letter queue or topic | [gmetzker](http://github.com/gmetzker) | -| **[Serverless Plugin Log Subscription](https://github.com/dougmoscrop/serverless-plugin-log-subscription)**
    Adds a CloudWatch LogSubscription for functions | [dougmoscrop](http://github.com/dougmoscrop) | -| **[Serverless Plugin Multiple Responses](https://github.com/silvermine/serverless-plugin-multiple-responses)**
    Enable multiple content-types for Response template | [silvermine](http://github.com/silvermine) | -| **[Serverless Plugin Offline Kinesis Events](https://github.com/DopplerLabs/serverless-plugin-offline-kinesis-events)**
    Plugin that works with serverless-offline to allow offline testing of serverless functions that are triggered by Kinesis events. | [DopplerLabs](http://github.com/DopplerLabs) | -| **[Serverless Plugin Optimize](https://github.com/FidelLimited/serverless-plugin-optimize)**
    Bundle with Browserify, transpile with Babel to ES5 and minify with Uglify your Serverless functions. | [FidelLimited](http://github.com/FidelLimited) | -| **[Serverless Plugin Package Dotenv File](https://github.com/ACloudGuru/serverless-plugin-package-dotenv-file)**
    A Serverless plugin to copy a .env file into the serverless package | [ACloudGuru](http://github.com/ACloudGuru) | -| **[Serverless Plugin Scripts](https://github.com/mvila/serverless-plugin-scripts)**
    Add scripting capabilities to the Serverless Framework | [mvila](http://github.com/mvila) | -| **[Serverless Plugin Select](https://github.com/FidelLimited/serverless-plugin-select)**
    Select which functions are to be deployed based on region and stage. | [FidelLimited](http://github.com/FidelLimited) | -| **[Serverless Plugin Simulate](https://github.com/gertjvr/serverless-plugin-simulate)**
    Simulate AWS Lambda and API Gateway locally using Docker | [gertjvr](http://github.com/gertjvr) | -| **[Serverless Plugin Split Stacks](https://github.com/dougmoscrop/serverless-plugin-split-stacks)**
    Migrate certain resources to nested stacks | [dougmoscrop](http://github.com/dougmoscrop) | -| **[Serverless Plugin Stack Config](https://github.com/rawphp/serverless-plugin-stack-config)**
    A serverless plugin to manage configurations for a stack across micro-services. | [rawphp](http://github.com/rawphp) | -| **[Serverless Plugin Stack Outputs](https://github.com/svdgraaf/serverless-plugin-stack-outputs)**
    Displays stack outputs for your serverless stacks when `sls info` is ran | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Plugin Stage Variables](https://github.com/svdgraaf/serverless-plugin-stage-variables)**
    Add stage variables for Serverless 1.x to ApiGateway, so you can use variables in your Lambda's | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Plugin Subscription Filter](https://github.com/tsub/serverless-plugin-subscription-filter)**
    A serverless plugin to register AWS CloudWatchLogs subscription filter | [tsub](http://github.com/tsub) | -| **[Serverless Plugin Typescript](https://github.com/graphcool/serverless-plugin-typescript)**
    Serverless plugin for zero-config Typescript support. | [graphcool](http://github.com/graphcool) | -| **[Serverless Plugin Warmup](https://github.com/FidelLimited/serverless-plugin-warmup)**
    Keep your lambdas warm during Winter. | [FidelLimited](http://github.com/FidelLimited) | -| **[Serverless Plugin Webpack](https://github.com/goldwasserexchange/serverless-plugin-webpack)**
    A serverless plugin to automatically bundle your functions individually with webpack | [goldwasserexchange](http://github.com/goldwasserexchange) | -| **[Serverless Plugin Write Env Vars](https://github.com/silvermine/serverless-plugin-write-env-vars)**
    Write environment variables out to a file that is compatible with dotenv | [silvermine](http://github.com/silvermine) | -| **[Serverless Prune Plugin](https://github.com/claygregory/serverless-prune-plugin)**
    Deletes old versions of functions from AWS, preserving recent and aliased versions | [claygregory](http://github.com/claygregory) | -| **[Serverless Pseudo Parameters](https://github.com/svdgraaf/serverless-pseudo-parameters)**
    Use CloudFormation Pseudo Parameters in your Serverless project | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Pseudo Parameters](https://github.com/svdgraaf/serverless-pseudo-parameters)**
    Use ${AWS::AccountId} and other cloudformation pseudo parameters in your serverless.yml values | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Python Individually](https://github.com/cfchou/serverless-python-individually)**
    A serverless framework plugin to install multiple lambda functions written in python | [cfchou](http://github.com/cfchou) | -| **[Serverless Python Requirements](https://github.com/UnitedIncome/serverless-python-requirements)**
    Serverless plugin to bundle Python packages | [UnitedIncome](http://github.com/UnitedIncome) | -| **[Serverless Resources Env](https://github.com/rurri/serverless-resources-env)**
    After Deploy, this plugin fetches cloudformation resource identifiers and sets them on AWS lambdas, and creates local .-env file | [rurri](http://github.com/rurri) | -| **[Serverless Run Function Plugin](https://github.com/lithin/serverless-run-function-plugin)**
    Run serverless function locally | [lithin](http://github.com/lithin) | -| **[Serverless S3 Remover](https://github.com/sinofseven/serverless-s3-remover)**
    A serverless plugin to make s3 buckets empty before deleting cloudformation stack when ```sls remove``` | [sinofseven](http://github.com/sinofseven) | -| **[Serverless S3 Sync](https://github.com/k1LoW/serverless-s3-sync)**
    A plugin to sync local directories and S3 prefixes for Serverless Framework, | [k1LoW](http://github.com/k1LoW) | -| **[Serverless S3bucket Sync](https://github.com/sbstjn/serverless-s3bucket-sync)**
    Sync a local folder with a S3 bucket after sls deploy | [sbstjn](http://github.com/sbstjn) | -| **[Serverless Sam](https://github.com/SAPessi/serverless-sam)**
    Exports an AWS SAM template for a service created with the Serverless Framework. | [SAPessi](http://github.com/SAPessi) | -| **[Serverless Scriptable Plugin](https://github.com/weixu365/serverless-scriptable-plugin)**
    Customize Serverless behavior without writing a plugin. | [weixu365](http://github.com/weixu365) | -| **[Serverless Sentry](https://github.com/arabold/serverless-sentry-plugin)**
    Automatic monitoring of memory usage, execution timeouts and forwarding of Lambda errors to Sentry (https://sentry.io). | [arabold](http://github.com/arabold) | -| **[Serverless Shell](https://github.com/UnitedIncome/serverless-shell)**
    Drop to a runtime shell with all the environment variables set that you'd have in lambda. | [UnitedIncome](http://github.com/UnitedIncome) | -| **[Serverless Sqs Alarms Plugin](https://github.com/sbstjn/serverless-sqs-alarms-plugin)**
    Wrapper to setup CloudWatch Alarms on SQS queue length | [sbstjn](http://github.com/sbstjn) | -| **[Serverless Sqs Fifo](https://github.com/vortarian/serverless-sqs-fifo)**
    A serverless plugin to handle creation of sqs fifo queue's in aws (stop-gap) | [vortarian](http://github.com/vortarian) | -| **[Serverless Stack Output](https://github.com/sbstjn/serverless-stack-output)**
    Store output from your AWS CloudFormation Stack in JSON/YAML/TOML files, or to pass it to a JavaScript function for further processing. | [sbstjn](http://github.com/sbstjn) | -| **[Serverless Step Functions](https://github.com/horike37/serverless-step-functions)**
    AWS Step Functions with Serverless Framework. | [horike37](http://github.com/horike37) | -| **[Serverless Subscription Filter](https://github.com/blackevil245/serverless-subscription-filter)**
    Serverless plugin to register subscription filter for Lambda logs. Register and pipe the logs of one lambda to another to process. | [blackevil245](http://github.com/blackevil245) | -| **[Serverless Vpc Discovery](https://github.com/amplify-education/serverless-vpc-discovery)**
    Serverless plugin for discovering VPC / Subnet / Security Group configuration by name. | [amplify-education](http://github.com/amplify-education) | -| **[Serverless Webpack](https://github.com/serverless-heaven/serverless-webpack)**
    Serverless plugin to bundle your lambdas with Webpack | [serverless-heaven](http://github.com/serverless-heaven) | +| **[Raml Serverless](https://github.com/andrewcurioso/raml-serverless)**
    Serverless plugin to work with RAML API spec documents | [andrewcurioso](http://github.com/andrewcurioso) | +| **[Serverless Alexa Plugin](https://github.com/rajington/serverless-alexa-plugin)**
    Serverless plugin to support Alexa Lambda events | [rajington](http://github.com/rajington) | +| **[Serverless Api Stage](https://github.com/leftclickben/serverless-api-stage)**
    Serverless API Stage plugin, enables stage variables and logging for AWS API Gateway. | [leftclickben](http://github.com/leftclickben) | +| **[Serverless Apig S3](https://github.com/sdd/serverless-apig-s3)**
    Serve static front-end content from S3 via the API Gatewy and deploy client bundle to S3. | [sdd](http://github.com/sdd) | +| **[Serverless Apigateway Plugin](https://github.com/GFG/serverless-apigateway-plugin)**
    Configure the AWS api gateway: Binary support, Headers and Body template mappings | [GFG](http://github.com/GFG) | +| **[Serverless Apigw Binary](https://github.com/maciejtreder/serverless-apigw-binary)**
    Plugin to enable binary support in AWS API Gateway. | [maciejtreder](http://github.com/maciejtreder) | +| **[Serverless Apigwy Binary](https://github.com/ryanmurakami/serverless-apigwy-binary)**
    Serverless plugin for configuring API Gateway to return binary responses | [ryanmurakami](http://github.com/ryanmurakami) | +| **[Serverless Aws Alias](https://github.com/HyperBrain/serverless-aws-alias)**
    This plugin enables use of AWS aliases on Lambda functions. | [HyperBrain](http://github.com/HyperBrain) | +| **[Serverless Aws Documentation](https://github.com/9cookies/serverless-aws-documentation)**
    Serverless plugin to add documentation and models to the serverless generated API Gateway | [9cookies](http://github.com/9cookies) | +| **[Serverless Build Plugin](https://github.com/nfour/serverless-build-plugin)**
    A Node.js focused build plugin for serverless. | [nfour](http://github.com/nfour) | +| **[Serverless Cf Vars](https://gitlab.com/kabo/serverless-cf-vars)**
    Enables use of AWS pseudo functions and Fn::Sub string substitution | [kabo](http://github.com/kabo) | +| **[Serverless Cljs Plugin](https://github.com/nervous-systems/serverless-cljs-plugin)**
    Enables Clojurescript as an implementation language for Lambda handlers | [nervous-systems](http://github.com/nervous-systems) | +| **[Serverless Coffeescript](https://github.com/duanefields/serverless-coffeescript)**
    A Serverless plugin to compile your CoffeeScript into JavaScript at deployment | [duanefields](http://github.com/duanefields) | +| **[Serverless Command Line Event Args](https://github.com/horike37/serverless-command-line-event-args)**
    This module is Serverless Framework plugin. Event JSON passes to your Lambda function in commandline. | [horike37](http://github.com/horike37) | +| **[Serverless Crypt](https://github.com/marcy-terui/serverless-crypt)**
    Securing the secrets on Serverless Framework by AWS KMS encryption. | [marcy-terui](http://github.com/marcy-terui) | +| **[Serverless Custom Packaging Plugin](https://github.com/hypoport/serverless-custom-packaging-plugin)**
    Plugin to package your sourcecode using a custom target path inside the zip. | [hypoport](http://github.com/hypoport) | +| **[Serverless Dir Config Plugin](https://github.com/economysizegeek/serverless-dir-config-plugin)**
    EXPERIMENTAL - Serverless plugin to load function and resource definitions from a directory. | [economysizegeek](http://github.com/economysizegeek) | +| **[Serverless Domain Manager](https://github.com/amplify-education/serverless-domain-manager)**
    Serverless plugin for managing custom domains with API Gateways. | [amplify-education](http://github.com/amplify-education) | +| **[Serverless Dotenv](https://github.com/Jimdo/serverless-dotenv)**
    Fetch environment variables and write it to a .env file | [Jimdo](http://github.com/Jimdo) | +| **[Serverless Dotnet](https://github.com/fruffin/serverless-dotnet)**
    A serverless plugin to run 'dotnet' commands as part of the deploy process | [fruffin](http://github.com/fruffin) | +| **[Serverless Dynalite](https://github.com/sdd/serverless-dynalite)**
    Run dynalite locally (no JVM, all JS) to simulate DynamoDB. Watch serverless.yml for table config updates. | [sdd](http://github.com/sdd) | +| **[Serverless Dynamodb Autoscaling](https://github.com/sbstjn/serverless-dynamodb-autoscaling)**
    Configure Amazon DynamoDB's native Auto Scaling for your table capacities. | [sbstjn](http://github.com/sbstjn) | +| **[Serverless Dynamodb Local](https://github.com/99xt/serverless-dynamodb-local)**
    Serverless Dynamodb Local Plugin - Allows to run dynamodb locally for serverless | [99xt](http://github.com/99xt) | +| **[Serverless Dynamodb Ttl](https://github.com/Jimdo/serverless-dynamodb-ttl)**
    Configure DynamoDB TTL in serverless.yml (until CloudFormation supports this). | [Jimdo](http://github.com/Jimdo) | +| **[Serverless Enable Api Logs](https://github.com/paulSambolin/serverless-enable-api-logs)**
    Enables Coudwatch logging for API Gateway events | [paulSambolin](http://github.com/paulSambolin) | +| **[Serverless Env Generator](https://github.com/DieProduktMacher/serverless-env-generator)**
    Manage environment variables with YAML and load them with dotenv. Supports variable encryption with KMS, multiple stages and custom profiles. | [DieProduktMacher](http://github.com/DieProduktMacher) | +| **[Serverless Event Constant Inputs](https://github.com/dittto/serverless-event-constant-inputs)**
    Allows you to add constant inputs to events in Serverless 1.0. For more info see [constant values in Cloudwatch](https://aws.amazon.com/blogs/compute/simply-serverless-use-constant-values-in-cloudwatch-event-triggered-lambda-functions/) | [dittto](http://github.com/dittto) | +| **[Serverless Export Env](https://github.com/arabold/serverless-export-env)**
    Export environment variables into a .env file with automatic AWS CloudFormation reference resolution. | [arabold](http://github.com/arabold) | +| **[Serverless Gulp](https://github.com/rhythminme/serverless-gulp)**
    A thin task wrapper around @goserverless that allows you to automate build, test and deploy tasks using gulp | [rhythminme](http://github.com/rhythminme) | +| **[Serverless Hooks Plugin](https://github.com/uswitch/serverless-hooks-plugin)**
    Run arbitrary commands on any lifecycle event in serverless | [uswitch](http://github.com/uswitch) | +| **[Serverless Jest Plugin](https://github.com/SC5/serverless-jest-plugin)**
    A Serverless Plugin for the Serverless Framework which adds support for test-driven development using Jest | [SC5](http://github.com/SC5) | +| **[Serverless Kms Secrets](https://github.com/SC5/serverless-kms-secrets)**
    Allows to easily encrypt and decrypt secrets using KMS from the serverless CLI | [SC5](http://github.com/SC5) | +| **[Serverless Kubeless](https://github.com/serverless/serverless-kubeless)**
    Serverless plugin for deploying functions to Kubeless. | [serverless](http://github.com/serverless) | +| **[Serverless Local Dev Server](https://github.com/DieProduktMacher/serverless-local-dev-server)**
    Speeds up development of Alexa Skills, Chatbots and APIs by exposing your functions as local HTTP endpoints and mapping received events. | [DieProduktMacher](http://github.com/DieProduktMacher) | +| **[Serverless Log Forwarding](https://github.com/amplify-education/serverless-log-forwarding)**
    Serverless plugin for forwarding CloudWatch logs to another Lambda function. | [amplify-education](http://github.com/amplify-education) | +| **[Serverless Mocha Plugin](https://github.com/SC5/serverless-mocha-plugin)**
    A Serverless Plugin for the Serverless Framework which adds support for test-driven development using Mocha | [SC5](http://github.com/SC5) | +| **[Serverless Nested Stack](https://github.com/jagdish-176/serverless-nested-stack)**
    A plugin to Workaround for Cloudformation 200 resource limit | [jagdish-176](http://github.com/jagdish-176) | +| **[Serverless Offline](https://github.com/dherault/serverless-offline)**
    Emulate AWS λ and API Gateway locally when developing your Serverless project | [dherault](http://github.com/dherault) | +| **[Serverless Offline Scheduler](https://github.com/ajmath/serverless-offline-scheduler)**
    Runs scheduled functions offline while integrating with serverless-offline | [ajmath](http://github.com/ajmath) | +| **[Serverless Package Python Functions](https://github.com/ubaniabalogun/serverless-package-python-functions)**
    Packaging Python Lambda functions with only the dependencies/requirements they need. | [ubaniabalogun](http://github.com/ubaniabalogun) | +| **[Serverless Parameters](https://github.com/svdgraaf/serverless-parameters)**
    Add parameters to the generated cloudformation templates | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Plugin Aws Alerts](https://github.com/ACloudGuru/serverless-plugin-aws-alerts)**
    A Serverless plugin to easily add CloudWatch alarms to functions | [ACloudGuru](http://github.com/ACloudGuru) | +| **[Serverless Plugin Aws Resolvers](https://github.com/DopplerLabs/serverless-plugin-aws-resolvers)**
    Resolves variables from ESS, RDS, or Kinesis for serverless services | [DopplerLabs](http://github.com/DopplerLabs) | +| **[Serverless Plugin Bespoken](https://github.com/bespoken/serverless-plugin-bespoken)**
    Creates a local server and a proxy so you don't have to deploy anytime you want to test your code | [bespoken](http://github.com/bespoken) | +| **[Serverless Plugin Bind Deployment Id](https://github.com/jacob-meacham/serverless-plugin-bind-deployment-id)**
    A Serverless plugin to bind the randomly generated deployment resource to your custom resources | [jacob-meacham](http://github.com/jacob-meacham) | +| **[Serverless Plugin Browserifier](https://github.com/digitalmaas/serverless-plugin-browserifier)**
    Reduce the size and speed up your Node.js based lambda's using browserify. | [digitalmaas](http://github.com/digitalmaas) | +| **[Serverless Plugin Browserify](https://github.com/doapp-ryanp/serverless-plugin-browserify)**
    Speed up your node based lambda's | [doapp-ryanp](http://github.com/doapp-ryanp) | +| **[Serverless Plugin Cfauthorizer](https://github.com/SC5/serverless-plugin-cfauthorizer)**
    This plugin allows you to define your own API Gateway Authorizers as the Serverless CloudFormation resources and apply them to HTTP endpoints. | [SC5](http://github.com/SC5) | +| **[Serverless Plugin Cloudwatch Sumologic](https://github.com/ACloudGuru/serverless-plugin-cloudwatch-sumologic)**
    Plugin which auto-subscribes a log delivery lambda function to lambda log groups created by serverless | [ACloudGuru](http://github.com/ACloudGuru) | +| **[Serverless Plugin Common Excludes](https://github.com/dougmoscrop/serverless-plugin-common-excludes)**
    Adds commonly excluded files to package.excludes | [dougmoscrop](http://github.com/dougmoscrop) | +| **[Serverless Plugin Custom Domain](https://github.com/dougmoscrop/serverless-plugin-custom-domain)**
    Reliably sets a BasePathMapping to an API Gateway Custom Domain | [dougmoscrop](http://github.com/dougmoscrop) | +| **[Serverless Plugin Deploy Environment](https://github.com/DopplerLabs/serverless-plugin-deploy-environment)**
    Plugin to manage deployment environment across stages | [DopplerLabs](http://github.com/DopplerLabs) | +| **[Serverless Plugin Diff](https://github.com/nicka/serverless-plugin-diff)**
    Compares your local AWS CloudFormation templates against deployed ones. | [nicka](http://github.com/nicka) | +| **[Serverless Plugin Elastic Beanstalk](https://github.com/rawphp/serverless-plugin-elastic-beanstalk)**
    A serverless plugin to deploy applications to AWS ElasticBeanstalk. | [rawphp](http://github.com/rawphp) | +| **[Serverless Plugin Encode Env Var Objects](https://github.com/yonomi/serverless-plugin-encode-env-var-objects)**
    Serverless plugin to encode any environment variable objects. | [yonomi](http://github.com/yonomi) | +| **[Serverless Plugin External Sns Events](https://github.com/silvermine/serverless-plugin-external-sns-events)**
    Add ability for functions to use existing or external SNS topics as an event source | [silvermine](http://github.com/silvermine) | +| **[Serverless Plugin Git Variables](https://github.com/jacob-meacham/serverless-plugin-git-variables)**
    A Serverless plugin to expose git variables (branch name, HEAD description, full commit hash) to your serverless services | [jacob-meacham](http://github.com/jacob-meacham) | +| **[Serverless Plugin Graphiql](https://github.com/bencooling/serverless-plugin-graphiql)**
    A Serverless plugin to run a local http server for graphiql and your graphql handler | [bencooling](http://github.com/bencooling) | +| **[Serverless Plugin Include Dependencies](https://github.com/dougmoscrop/serverless-plugin-include-dependencies)**
    This is a Serverless plugin that should make your deployed functions smaller. | [dougmoscrop](http://github.com/dougmoscrop) | +| **[Serverless Plugin Iopipe](https://github.com/iopipe/serverless-plugin-iopipe)**
    See inside your Lambda functions with high fidelity metrics and monitoring. | [iopipe](http://github.com/iopipe) | +| **[Serverless Plugin Lambda Dead Letter](https://github.com/gmetzker/serverless-plugin-lambda-dead-letter)**
    A Serverless plugin that can configure a lambda with a dead letter queue or topic | [gmetzker](http://github.com/gmetzker) | +| **[Serverless Plugin Log Subscription](https://github.com/dougmoscrop/serverless-plugin-log-subscription)**
    Adds a CloudWatch LogSubscription for functions | [dougmoscrop](http://github.com/dougmoscrop) | +| **[Serverless Plugin Multiple Responses](https://github.com/silvermine/serverless-plugin-multiple-responses)**
    Enable multiple content-types for Response template | [silvermine](http://github.com/silvermine) | +| **[Serverless Plugin Offline Kinesis Events](https://github.com/DopplerLabs/serverless-plugin-offline-kinesis-events)**
    Plugin that works with serverless-offline to allow offline testing of serverless functions that are triggered by Kinesis events. | [DopplerLabs](http://github.com/DopplerLabs) | +| **[Serverless Plugin Optimize](https://github.com/FidelLimited/serverless-plugin-optimize)**
    Bundle with Browserify, transpile with Babel to ES5 and minify with Uglify your Serverless functions. | [FidelLimited](http://github.com/FidelLimited) | +| **[Serverless Plugin Package Dotenv File](https://github.com/ACloudGuru/serverless-plugin-package-dotenv-file)**
    A Serverless plugin to copy a .env file into the serverless package | [ACloudGuru](http://github.com/ACloudGuru) | +| **[Serverless Plugin Scripts](https://github.com/mvila/serverless-plugin-scripts)**
    Add scripting capabilities to the Serverless Framework | [mvila](http://github.com/mvila) | +| **[Serverless Plugin Select](https://github.com/FidelLimited/serverless-plugin-select)**
    Select which functions are to be deployed based on region and stage. | [FidelLimited](http://github.com/FidelLimited) | +| **[Serverless Plugin Simulate](https://github.com/gertjvr/serverless-plugin-simulate)**
    Simulate AWS Lambda and API Gateway locally using Docker | [gertjvr](http://github.com/gertjvr) | +| **[Serverless Plugin Split Stacks](https://github.com/dougmoscrop/serverless-plugin-split-stacks)**
    Migrate certain resources to nested stacks | [dougmoscrop](http://github.com/dougmoscrop) | +| **[Serverless Plugin Stack Config](https://github.com/rawphp/serverless-plugin-stack-config)**
    A serverless plugin to manage configurations for a stack across micro-services. | [rawphp](http://github.com/rawphp) | +| **[Serverless Plugin Stack Outputs](https://github.com/svdgraaf/serverless-plugin-stack-outputs)**
    Displays stack outputs for your serverless stacks when `sls info` is ran | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Plugin Stage Variables](https://github.com/svdgraaf/serverless-plugin-stage-variables)**
    Add stage variables for Serverless 1.x to ApiGateway, so you can use variables in your Lambda's | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Plugin Subscription Filter](https://github.com/tsub/serverless-plugin-subscription-filter)**
    A serverless plugin to register AWS CloudWatchLogs subscription filter | [tsub](http://github.com/tsub) | +| **[Serverless Plugin Typescript](https://github.com/graphcool/serverless-plugin-typescript)**
    Serverless plugin for zero-config Typescript support. | [graphcool](http://github.com/graphcool) | +| **[Serverless Plugin Warmup](https://github.com/FidelLimited/serverless-plugin-warmup)**
    Keep your lambdas warm during Winter. | [FidelLimited](http://github.com/FidelLimited) | +| **[Serverless Plugin Webpack](https://github.com/goldwasserexchange/serverless-plugin-webpack)**
    A serverless plugin to automatically bundle your functions individually with webpack | [goldwasserexchange](http://github.com/goldwasserexchange) | +| **[Serverless Plugin Write Env Vars](https://github.com/silvermine/serverless-plugin-write-env-vars)**
    Write environment variables out to a file that is compatible with dotenv | [silvermine](http://github.com/silvermine) | +| **[Serverless Prune Plugin](https://github.com/claygregory/serverless-prune-plugin)**
    Deletes old versions of functions from AWS, preserving recent and aliased versions | [claygregory](http://github.com/claygregory) | +| **[Serverless Pseudo Parameters](https://github.com/svdgraaf/serverless-pseudo-parameters)**
    Use ${AWS::AccountId} and other cloudformation pseudo parameters in your serverless.yml values | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Python Individually](https://github.com/cfchou/serverless-python-individually)**
    A serverless framework plugin to install multiple lambda functions written in python | [cfchou](http://github.com/cfchou) | +| **[Serverless Python Requirements](https://github.com/UnitedIncome/serverless-python-requirements)**
    Serverless plugin to bundle Python packages | [UnitedIncome](http://github.com/UnitedIncome) | +| **[Serverless Resources Env](https://github.com/rurri/serverless-resources-env)**
    After Deploy, this plugin fetches cloudformation resource identifiers and sets them on AWS lambdas, and creates local .-env file | [rurri](http://github.com/rurri) | +| **[Serverless Run Function Plugin](https://github.com/lithin/serverless-run-function-plugin)**
    Run serverless function locally | [lithin](http://github.com/lithin) | +| **[Serverless S3 Remover](https://github.com/sinofseven/serverless-s3-remover)**
    A serverless plugin to make s3 buckets empty before deleting cloudformation stack when ```sls remove``` | [sinofseven](http://github.com/sinofseven) | +| **[Serverless S3 Sync](https://github.com/k1LoW/serverless-s3-sync)**
    A plugin to sync local directories and S3 prefixes for Serverless Framework, | [k1LoW](http://github.com/k1LoW) | +| **[Serverless S3bucket Sync](https://github.com/sbstjn/serverless-s3bucket-sync)**
    Sync a local folder with a S3 bucket after sls deploy | [sbstjn](http://github.com/sbstjn) | +| **[Serverless Sam](https://github.com/SAPessi/serverless-sam)**
    Exports an AWS SAM template for a service created with the Serverless Framework. | [SAPessi](http://github.com/SAPessi) | +| **[Serverless Scriptable Plugin](https://github.com/weixu365/serverless-scriptable-plugin)**
    Customize Serverless behavior without writing a plugin. | [weixu365](http://github.com/weixu365) | +| **[Serverless Sentry](https://github.com/arabold/serverless-sentry-plugin)**
    Automatic monitoring of memory usage, execution timeouts and forwarding of Lambda errors to Sentry (https://sentry.io). | [arabold](http://github.com/arabold) | +| **[Serverless Shell](https://github.com/UnitedIncome/serverless-shell)**
    Drop to a runtime shell with all the environment variables set that you'd have in lambda. | [UnitedIncome](http://github.com/UnitedIncome) | +| **[Serverless Sqs Alarms Plugin](https://github.com/sbstjn/serverless-sqs-alarms-plugin)**
    Wrapper to setup CloudWatch Alarms on SQS queue length | [sbstjn](http://github.com/sbstjn) | +| **[Serverless Sqs Fifo](https://github.com/vortarian/serverless-sqs-fifo)**
    A serverless plugin to handle creation of sqs fifo queue's in aws (stop-gap) | [vortarian](http://github.com/vortarian) | +| **[Serverless Stack Output](https://github.com/sbstjn/serverless-stack-output)**
    Store output from your AWS CloudFormation Stack in JSON/YAML/TOML files, or to pass it to a JavaScript function for further processing. | [sbstjn](http://github.com/sbstjn) | +| **[Serverless Step Functions](https://github.com/horike37/serverless-step-functions)**
    AWS Step Functions with Serverless Framework. | [horike37](http://github.com/horike37) | +| **[Serverless Subscription Filter](https://github.com/blackevil245/serverless-subscription-filter)**
    Serverless plugin to register subscription filter for Lambda logs. Register and pipe the logs of one lambda to another to process. | [blackevil245](http://github.com/blackevil245) | +| **[Serverless Vpc Discovery](https://github.com/amplify-education/serverless-vpc-discovery)**
    Serverless plugin for discovering VPC / Subnet / Security Group configuration by name. | [amplify-education](http://github.com/amplify-education) | +| **[Serverless Webpack](https://github.com/serverless-heaven/serverless-webpack)**
    Serverless plugin to bundle your lambdas with Webpack | [serverless-heaven](http://github.com/serverless-heaven) | | **[Serverless Wsgi](https://github.com/logandk/serverless-wsgi)**
    Serverless plugin to deploy WSGI applications (Flask/Django/Pyramid etc.) and bundle Python packages | [logandk](http://github.com/logandk) | @@ -266,67 +262,60 @@ This table is generated from https://github.com/serverless/examples/blob/master/ --> | Project Name | Author | |:-------------|:------:| -| **[Jwtauthorizr](https://github.com/serverlessbuch/jwtAuthorizr)**
    Custom JWT Authorizer Lambda function for Amazon API Gateway with Bearer JWT | [serverlessbuch](http://github.com/serverlessbuch) | -| **[Slack Signup Serverless](https://github.com/dzimine/slack-signup-serverless)**
    Serverless signup to Slack and more. Lambda with Python, StepFunctions, and Web front end. Python boilerplate included. | [dzimine](http://github.com/dzimine) | -| **[Serverless Graphql Api](https://github.com/boazdejong/serverless-graphql-api)**
    Serverless GraphQL API using Lambda and DynamoDB | [boazdejong](http://github.com/boazdejong) | -| **[Serverless Screenshot](https://github.com/svdgraaf/serverless-screenshot)**
    Serverless Screenshot Service using PhantomJS | [svdgraaf](http://github.com/svdgraaf) | -| **[Serverless Postgraphql](https://github.com/rentrop/serverless-postgraphql)**
    GraphQL endpoint for PostgreSQL using postgraphql | [rentrop](http://github.com/rentrop) | -| **[Serverless Messenger Boilerplate](https://github.com/SC5/serverless-messenger-boilerplate)**
    Serverless messenger bot boilerplate | [SC5](http://github.com/SC5) | -| **[Serverless Npm Registry](https://github.com/craftship/yith)**
    Serverless private npm registry, proxy and cache. | [craftship](http://github.com/craftship) | -| **[Serverless Pokego](https://github.com/jch254/pokego-serverless)**
    Serverless-powered API to fetch nearby Pokemon Go data | [jch254](http://github.com/jch254) | -| **[Serverless Weekly2pocket App](https://github.com/s0enke/weekly2pocket)**
    Serverless-powered API for sending posts to pocket app | [s0enke](http://github.com/s0enke) | -| **[Serverless Facebook Quotebot](https://github.com/pmuens/quotebot)**
    100% Serverless Facebook messenger chatbot which will respond with inspiring quotes | [pmuens](http://github.com/pmuens) | -| **[Serverless Slack Trevorbot](https://github.com/conveyal/trevorbot)**
    Slack bot for info on where in the world is Trevor Gerhardt? | [conveyal](http://github.com/conveyal) | -| **[Serverless Garden Aid](https://github.com/garden-aid/web-bff)**
    IoT Garden Aid Backend | [garden-aid](http://github.com/garden-aid) | -| **[Serverless React Boilerplate](https://github.com/99xt/serverless-react-boilerplate)**
    A serverless react boilerplate for offline development | [99xt](http://github.com/99xt) | -| **[Serverless Delivery Framework](https://github.com/99xt/serverless-delivery-framework)**
    This is a boilerplate for version release pipeline with serverless framework | [99xt](http://github.com/99xt) | -| **[Serverless Mailgun Slack](https://github.com/Marcus-L/serverless-mailgun-slack)**
    A Serverless function for posting to a Slack Webhook in response to a Mailgun route | [Marcus-L](http://github.com/Marcus-L) | -| **[Pfs Email Serverless](https://github.com/SCPR/pfs-email-serverless)**
    This is a lambda function created by the serverless framework. It searches through members in our mongodb who have not been sent emails and sends them an email with their custom token to unlock the pledge free stream. It then marks those members off as already receiving the email. | [SCPR](http://github.com/SCPR) | -| **[Plaid Cashburndown Service](https://github.com/cplee/cashburndown-service)**
    Service for calculating cash burndown with plaid. Frontend code can be found here: https://github.com/cplee/cashburndown-site | [cplee](http://github.com/cplee) | -| **[Cordis Serverless](https://github.com/marzeelabs/cordis-serverless)**
    A serverless API for EU Cordis data | [marzeelabs](http://github.com/marzeelabs) | -| **[Serverless Newsletter Signup](https://github.com/ivanderbu2/serverless-newsletter-signup)**
    Saves user details into DynamoDB table. Required values are email, first_name and last_name. | [ivanderbu2](http://github.com/ivanderbu2) | -| **[Serverless Slack Cron](https://github.com/ivanderbu2/serverless-slack-cron)**
    Lambda function which sends messages to Slack channel in regular intervals via cron trigger. | [ivanderbu2](http://github.com/ivanderbu2) | -| **[Giphy Bot](https://github.com/tywong/lambda-workshop-2016/tree/master/giphy-bot)**
    giphy-bot for Facebook chat | [tywong](http://github.com/tywong) | -| **[Jwt Lambda Python](https://github.com/mikaelmork/jwt-auth.serverless)**
    Minimal proof-of-concept implementation of JWT with Serverless / AWS Lambda | [mikaelmork](http://github.com/mikaelmork) | -| **[Sls Access Counter](https://github.com/takahashim/sls-access-counter)**
    Site visitor counter | [takahashim](http://github.com/takahashim) | -| **[Sls Form Mail](https://github.com/takahashim/sls-form-mail)**
    Send SNS email from form data | [takahashim](http://github.com/takahashim) | -| **[Serverless Python Sample](https://github.com/bennybauer/serverless-python-sample)**
    A simple serverless python sample with REST API endpoints and dependencies | [bennybauer](http://github.com/bennybauer) | -| **[Serverless Msg Gateway](https://github.com/yonahforst/msg-gateway)**
    A messaging aggregator for kik, skype, twilio, telegram, & messenger. Send and receive messages in a standard format. | [yonahforst](http://github.com/yonahforst) | -| **[Serverless Aws Rekognition Finpics](https://github.com/rgfindl/finpics)**
    Use AWS Rekognition to provide a faces search of finpics.com | [rgfindl](http://github.com/rgfindl) | -| **[Serverless Slack Emojibot](https://github.com/markhobson/emojibot)**
    Serverless slack bot for emoji | [markhobson](http://github.com/markhobson) | -| **[Keboola Developer Portal](https://github.com/keboola/developer-portal)**
    Keboola developer portal built with Serverless | [keboola](http://github.com/keboola) | -| **[Serverless Cloudwatch Rds Custom Metrics](https://github.com/AndrewFarley/serverless-cloudwatch-rds-custom-metrics)**
    A NodeJS-based MySQL RDS Data Collection script to push Custom Metrics to Cloudwatch with Serverless | [AndrewFarley](http://github.com/AndrewFarley) | -| **[Jrestless Examples](https://github.com/bbilger/jrestless-examples)**
    [JRestless](https://github.com/bbilger/jrestless) (Java / JAX-RS) examples for [API Gateway Functions](https://github.com/bbilger/jrestless-examples/tree/master/aws/gateway) ([plain JAX-RS](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-showcase), [Spring](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-spring), [binary data requests/responses](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-binary), [custom authorizers](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-security-custom-authorizer) and [Cognito User Pool authorizers](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-security-cognito-authorizer)), [SNS Functions](https://github.com/bbilger/jrestless-examples/blob/master/aws/sns/aws-sns-usage-example) (asynchronous communication between functions) and [Service Functions](https://github.com/bbilger/jrestless-examples/blob/master/aws/service/aws-service-usage-example) (synchronous HTTP-like communication between functions - transparent through Feign) | [bbilger](http://github.com/bbilger) | -| **[Sc5 Serverless Boilerplate](https://github.com/SC5/sc5-serverless-boilerplate)**
    A boilerplate that contains setup for test-driven development | [SC5](http://github.com/SC5) | -| **[Serverless Blog To Podcast](https://github.com/SC5/serverless-blog-to-podcast)**
    Service that reads RSS feed and converts the entries to a podcast feed and audio files using Amazon Polly | [SC5](http://github.com/SC5) | -| **[Offset Trump](https://github.com/FLGMwt/offset-trump)**
    Single page app using Serverless (C# runtime) and S3 site hosting. Pledge to do a good thing for the next four years to offset the potential negative effects of the US Presidency | [FLGMwt](http://github.com/FLGMwt) | -| **[Serverless Url Shortener](https://github.com/aletheia/serverless-url-shortener)**
    A simple url-shortener, using Serverless framework | [aletheia](http://github.com/aletheia) | -| **[Serverless Html Pdf](https://github.com/calvintychan/serverless-html-pdf)**
    Service that convert HTML to PDF using PhantomJS's rasterize example. | [calvintychan](http://github.com/calvintychan) | -| **[Serverless Examples Cached Rds Ws](https://github.com/mugglmenzel/serverless-examples-cached-rds-ws)**
    A serverless framework example project that uses API Gateway, ElastiCache, and RDS PostgreSQL. | [mugglmenzel](http://github.com/mugglmenzel) | -| **[Bittman](https://github.com/rhlsthrm/bittman)**
    A serverless project that follows a stock trading algorithm and uses scheduled functions to save data to DynamoDB and send emails through Mailgun. | [rhlsthrm](http://github.com/rhlsthrm) | -| **[Adoptable Pet Bot](https://github.com/lynnaloo/adoptable-pet-bot)**
    Tweets adoptable pets using Serverless (Node.js) and AWS Lambda | [lynnaloo](http://github.com/lynnaloo) | -| **[Owntracks Serverless](https://github.com/dschep/owntracks-serverless)**
    A serverless implementation of the OwnTracks HTTP backend | [dschep](http://github.com/dschep) | -| **[Serverless Modern Koa](https://github.com/barczaG/serverless-modern-koa)**
    Serverless modern koa starter kit | [barczaG](http://github.com/barczaG) | -| **[Serverless Reactjs Universal Rendering Boilerplate](https://github.com/TylorShin/react-universal-in-serverless)**
    ReactJS web app Starter kit does universal (isomorphic) rendering with Serverless | [TylorShin](http://github.com/TylorShin) | -| **[Open Bot](https://github.com/open-bot/open-bot)**
    An unoptionated Github bot driven by a configuration file in the repository | [open-bot](http://github.com/open-bot) | -| **[Aws Ses Serverless Example](https://github.com/lakshmantgld/aws-ses-serverless-example)**
    AWS SES example in NodeJS using lambda | [lakshmantgld](http://github.com/lakshmantgld) | -| **[Aws Api Gateway Serverless Project Written In Go](https://github.com/yunspace/serverless-golang)**
    A serverless project that contains an API Gateway endpoint powered by a Lambda function written in golang and built using [eawsy/aws-lambda-go-shim](https://github.com/eawsy/aws-lambda-go-shim). | [yunspace](http://github.com/yunspace) | -| **[Video Preview And Analysis Service](https://github.com/laardee/video-preview-and-analysis-service)**
    An event-driven service that generates labels using Amazon Rekognition and creates preview GIF animation from a video file. | [laardee](http://github.com/laardee) | -| **[Serverless Es6/7 Crud Api](https://github.com/AnomalyInnovations/serverless-stack-demo-api)**
    [Serverless Stack](http://serverless-stack.com) examples of backend CRUD APIs (DynamoDB + Lambda + API Gateway + Cognito User Pool authorizer) for [React.js single-page app](http://demo.serverless-stack.com) | [AnomalyInnovations](http://github.com/AnomalyInnovations) | -| **[Sqs Worker With Aws Lambda And Cloudwatch Alarms](https://github.com/sbstjn/sqs-worker-serverless)**
    Process messages stored in SQS with an [auto-scaled AWS Lambda worker](https://sbstjn.com/serverless-sqs-worker-with-aws-lambda.html) function. | [sbstjn](http://github.com/sbstjn) | -| **[Serverless Image Manager](https://github.com/TylorShin/lambda-image-manager)**
    image upload / download with resizing. Used API gateway's binary support & serverless | [TylorShin](http://github.com/TylorShin) | -| **[Aws Lambda Power Tuning (Powered By Step Functions)](https://github.com/alexcasalboni/aws-lambda-power-tuning)**
    Build a [Step Functions](https://aws.amazon.com/step-functions/) state machine to optimize your AWS Lambda Function memory/power configuration. | [alexcasalboni](http://github.com/alexcasalboni) | -| **[Amazon Kinesis Streams Fan Out Via Kinesis Analytics](https://github.com/alexcasalboni/kinesis-streams-fan-out-kinesis-analytics)**
    Use [Amazon Kinesis Analytics](https://aws.amazon.com/kinesis/analytics/) to fan-out your Kinesis Streams and avoid read throttling. | [alexcasalboni](http://github.com/alexcasalboni) | -| **[Grants Api Serverless](https://github.com/comicrelief/grants-api-serverless)**
    ES6 API to consume data from an external API, ingest into Elasticsearch and return a queryable endpoint on top of Elasticsearch | [comicrelief](http://github.com/comicrelief) | -| **[Honeylambda](https://github.com/0x4D31/honeyLambda)**
    a simple, serverless application designed to create and monitor URL {honey}tokens, on top of AWS Lambda and Amazon API Gateway | [0x4D31](http://github.com/0x4D31) | -| **[Faultline](https://github.com/faultline/faultline)**
    Error tracking tool on AWS managed services. | [faultline](http://github.com/faultline) | -| **[Stack Overflow Monitor](https://github.com/picsoung/stackoverflowmonitor)**
    Monitor Stack Overflow questions and post them in a Slack channel | [picsoung](http://github.com/picsoung) | -| **[Serverless Analytics](https://github.com/sbstjn/serverless-analytics)**
    Write your own Google Analytics clone and track website visitors serverless with API Gateway, Kinesis, Lambda, and DynamoDB. | [sbstjn](http://github.com/sbstjn) | -| **[React & Stripe Serverless Ecommerce](https://github.com/patrick-michelberger/serverless-shop)**
    Serverless E-Commerce App with AWS Lambda, Stripe and React | [patrick-michelberger](http://github.com/patrick-michelberger) | -| **[Serverless + Medium Text To Speech](https://github.com/RafalWilinski/serverless-medium-text-to-speech)**
    Serverless-based, text-to-speech service for Medium articles | [RafalWilinski](http://github.com/RafalWilinski) | -| **[Serverless + Java Dynamodb Imlementation Example](https://github.com/igorbakman/java-lambda-dynamodb)**
    example for java programmers that want to work with AWS-Lambda and DynamoDB | [igorbakman](http://github.com/igorbakman) | -| **[Aws Cognito Custom User Pool Example](https://github.com/bsdkurt/aws-node-custom-user-pool)**
    Example CloudFormation custom resource backed by a lambda using Cognito User Pools | [bsdkurt](http://github.com/bsdkurt) | -| **[Serverless + Lambda Protobuf Responses](https://github.com/theburningmonk/lambda-protobuf-demo)**
    Demo using API Gateway and Lambda with Protocol Buffer | [theburningmonk](http://github.com/theburningmonk) | +| **[Jwtauthorizr](https://github.com/serverlessbuch/jwtAuthorizr)**
    Custom JWT Authorizer Lambda function for Amazon API Gateway with Bearer JWT | [serverlessbuch](http://github.com/serverlessbuch) | +| **[Serverless Graphql Api](https://github.com/boazdejong/serverless-graphql-api)**
    Serverless GraphQL API using Lambda and DynamoDB | [boazdejong](http://github.com/boazdejong) | +| **[Serverless Screenshot](https://github.com/svdgraaf/serverless-screenshot)**
    Serverless Screenshot Service using PhantomJS | [svdgraaf](http://github.com/svdgraaf) | +| **[Serverless Postgraphql](https://github.com/rentrop/serverless-postgraphql)**
    GraphQL endpoint for PostgreSQL using postgraphql | [rentrop](http://github.com/rentrop) | +| **[Serverless Messenger Boilerplate](https://github.com/SC5/serverless-messenger-boilerplate)**
    Serverless messenger bot boilerplate | [SC5](http://github.com/SC5) | +| **[Serverless Npm Registry](https://github.com/craftship/yith)**
    Serverless private npm registry, proxy and cache. | [craftship](http://github.com/craftship) | +| **[Serverless Pokego](https://github.com/jch254/pokego-serverless)**
    Serverless-powered API to fetch nearby Pokemon Go data | [jch254](http://github.com/jch254) | +| **[Serverless Weekly2pocket App](https://github.com/s0enke/weekly2pocket)**
    Serverless-powered API for sending posts to pocket app | [s0enke](http://github.com/s0enke) | +| **[Serverless Facebook Quotebot](https://github.com/pmuens/quotebot)**
    100% Serverless Facebook messenger chatbot which will respond with inspiring quotes | [pmuens](http://github.com/pmuens) | +| **[Serverless Slack Trevorbot](https://github.com/conveyal/trevorbot)**
    Slack bot for info on where in the world is Trevor Gerhardt? | [conveyal](http://github.com/conveyal) | +| **[Serverless Garden Aid](https://github.com/garden-aid/web-bff)**
    IoT Garden Aid Backend | [garden-aid](http://github.com/garden-aid) | +| **[Serverless React Boilerplate](https://github.com/99xt/serverless-react-boilerplate)**
    A serverless react boilerplate for offline development | [99xt](http://github.com/99xt) | +| **[Serverless Delivery Framework](https://github.com/99xt/serverless-delivery-framework)**
    This is a boilerplate for version release pipeline with serverless framework | [99xt](http://github.com/99xt) | +| **[Serverless Mailgun Slack](https://github.com/Marcus-L/serverless-mailgun-slack)**
    A Serverless function for posting to a Slack Webhook in response to a Mailgun route | [Marcus-L](http://github.com/Marcus-L) | +| **[Pfs Email Serverless](https://github.com/SCPR/pfs-email-serverless)**
    This is a lambda function created by the serverless framework. It searches through members in our mongodb who have not been sent emails and sends them an email with their custom token to unlock the pledge free stream. It then marks those members off as already receiving the email. | [SCPR](http://github.com/SCPR) | +| **[Plaid Cashburndown Service](https://github.com/cplee/cashburndown-service)**
    Service for calculating cash burndown with plaid. Frontend code can be found here: https://github.com/cplee/cashburndown-site | [cplee](http://github.com/cplee) | +| **[Cordis Serverless](https://github.com/marzeelabs/cordis-serverless)**
    A serverless API for EU Cordis data | [marzeelabs](http://github.com/marzeelabs) | +| **[Serverless Newsletter Signup](https://github.com/ivanderbu2/serverless-newsletter-signup)**
    Saves user details into DynamoDB table. Required values are email, first_name and last_name. | [ivanderbu2](http://github.com/ivanderbu2) | +| **[Serverless Slack Cron](https://github.com/ivanderbu2/serverless-slack-cron)**
    Lambda function which sends messages to Slack channel in regular intervals via cron trigger. | [ivanderbu2](http://github.com/ivanderbu2) | +| **[Giphy Bot](https://github.com/tywong/lambda-workshop-2016/tree/master/giphy-bot)**
    giphy-bot for Facebook chat | [tywong](http://github.com/tywong) | +| **[Jwt Lambda Python](https://github.com/mikaelmork/jwt-auth.serverless)**
    Minimal proof-of-concept implementation of JWT with Serverless / AWS Lambda | [mikaelmork](http://github.com/mikaelmork) | +| **[Sls Access Counter](https://github.com/takahashim/sls-access-counter)**
    Site visitor counter | [takahashim](http://github.com/takahashim) | +| **[Sls Form Mail](https://github.com/takahashim/sls-form-mail)**
    Send SNS email from form data | [takahashim](http://github.com/takahashim) | +| **[Serverless Python Sample](https://github.com/bennybauer/serverless-python-sample)**
    A simple serverless python sample with REST API endpoints and dependencies | [bennybauer](http://github.com/bennybauer) | +| **[Serverless Msg Gateway](https://github.com/yonahforst/msg-gateway)**
    A messaging aggregator for kik, skype, twilio, telegram, & messenger. Send and receive messages in a standard format. | [yonahforst](http://github.com/yonahforst) | +| **[Serverless Aws Rekognition Finpics](https://github.com/rgfindl/finpics)**
    Use AWS Rekognition to provide a faces search of finpics.com | [rgfindl](http://github.com/rgfindl) | +| **[Serverless Slack Emojibot](https://github.com/markhobson/emojibot)**
    Serverless slack bot for emoji | [markhobson](http://github.com/markhobson) | +| **[Keboola Developer Portal](https://github.com/keboola/developer-portal)**
    Keboola developer portal built with Serverless | [keboola](http://github.com/keboola) | +| **[Serverless Cloudwatch Rds Custom Metrics](https://github.com/AndrewFarley/serverless-cloudwatch-rds-custom-metrics)**
    A NodeJS-based MySQL RDS Data Collection script to push Custom Metrics to Cloudwatch with Serverless | [AndrewFarley](http://github.com/AndrewFarley) | +| **[Jrestless Examples](https://github.com/bbilger/jrestless-examples)**
    [JRestless](https://github.com/bbilger/jrestless) (Java / JAX-RS) examples for [API Gateway Functions](https://github.com/bbilger/jrestless-examples/tree/master/aws/gateway) ([plain JAX-RS](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-showcase), [Spring](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-spring), [binary data requests/responses](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-binary), [custom authorizers](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-security-custom-authorizer) and [Cognito User Pool authorizers](https://github.com/bbilger/jrestless-examples/blob/master/aws/gateway/aws-gateway-security-cognito-authorizer)), [SNS Functions](https://github.com/bbilger/jrestless-examples/blob/master/aws/sns/aws-sns-usage-example) (asynchronous communication between functions) and [Service Functions](https://github.com/bbilger/jrestless-examples/blob/master/aws/service/aws-service-usage-example) (synchronous HTTP-like communication between functions - transparent through Feign) | [bbilger](http://github.com/bbilger) | +| **[Sc5 Serverless Boilerplate](https://github.com/SC5/sc5-serverless-boilerplate)**
    A boilerplate that contains setup for test-driven development | [SC5](http://github.com/SC5) | +| **[Serverless Blog To Podcast](https://github.com/SC5/serverless-blog-to-podcast)**
    Service that reads RSS feed and converts the entries to a podcast feed and audio files using Amazon Polly | [SC5](http://github.com/SC5) | +| **[Offset Trump](https://github.com/FLGMwt/offset-trump)**
    Single page app using Serverless (C# runtime) and S3 site hosting. Pledge to do a good thing for the next four years to offset the potential negative effects of the US Presidency | [FLGMwt](http://github.com/FLGMwt) | +| **[Serverless Url Shortener](https://github.com/aletheia/serverless-url-shortener)**
    A simple url-shortener, using Serverless framework | [aletheia](http://github.com/aletheia) | +| **[Serverless Html Pdf](https://github.com/calvintychan/serverless-html-pdf)**
    Service that convert HTML to PDF using PhantomJS's rasterize example. | [calvintychan](http://github.com/calvintychan) | +| **[Serverless Examples Cached Rds Ws](https://github.com/mugglmenzel/serverless-examples-cached-rds-ws)**
    A serverless framework example project that uses API Gateway, ElastiCache, and RDS PostgreSQL. | [mugglmenzel](http://github.com/mugglmenzel) | +| **[Bittman](https://github.com/rhlsthrm/bittman)**
    A serverless project that follows a stock trading algorithm and uses scheduled functions to save data to DynamoDB and send emails through Mailgun. | [rhlsthrm](http://github.com/rhlsthrm) | +| **[Adoptable Pet Bot](https://github.com/lynnaloo/adoptable-pet-bot)**
    Tweets adoptable pets using Serverless (Node.js) and AWS Lambda | [lynnaloo](http://github.com/lynnaloo) | +| **[Owntracks Serverless](https://github.com/dschep/owntracks-serverless)**
    A serverless implementation of the OwnTracks HTTP backend | [dschep](http://github.com/dschep) | +| **[Serverless Modern Koa](https://github.com/barczaG/serverless-modern-koa)**
    Serverless modern koa starter kit | [barczaG](http://github.com/barczaG) | +| **[Serverless Reactjs Universal Rendering Boilerplate](https://github.com/TylorShin/react-universal-in-serverless)**
    ReactJS web app Starter kit does universal (isomorphic) rendering with Serverless | [TylorShin](http://github.com/TylorShin) | +| **[Open Bot](https://github.com/open-bot/open-bot)**
    An unoptionated Github bot driven by a configuration file in the repository | [open-bot](http://github.com/open-bot) | +| **[Aws Ses Serverless Example](https://github.com/lakshmantgld/aws-ses-serverless-example)**
    AWS SES example in NodeJS using lambda | [lakshmantgld](http://github.com/lakshmantgld) | +| **[Aws Api Gateway Serverless Project Written In Go](https://github.com/yunspace/serverless-golang)**
    A serverless project that contains an API Gateway endpoint powered by a Lambda function written in golang and built using [eawsy/aws-lambda-go-shim](https://github.com/eawsy/aws-lambda-go-shim). | [yunspace](http://github.com/yunspace) | +| **[Video Preview And Analysis Service](https://github.com/laardee/video-preview-and-analysis-service)**
    An event-driven service that generates labels using Amazon Rekognition and creates preview GIF animation from a video file. | [laardee](http://github.com/laardee) | +| **[Serverless Es6/7 Crud Api](https://github.com/AnomalyInnovations/serverless-stack-demo-api)**
    [Serverless Stack](http://serverless-stack.com) examples of backend CRUD APIs (DynamoDB + Lambda + API Gateway + Cognito User Pool authorizer) for [React.js single-page app](http://demo.serverless-stack.com) | [AnomalyInnovations](http://github.com/AnomalyInnovations) | +| **[Sqs Worker With Aws Lambda And Cloudwatch Alarms](https://github.com/sbstjn/sqs-worker-serverless)**
    Process messages stored in SQS with an [auto-scaled AWS Lambda worker](https://sbstjn.com/serverless-sqs-worker-with-aws-lambda.html) function. | [sbstjn](http://github.com/sbstjn) | +| **[Aws Lambda Power Tuning (Powered By Step Functions)](https://github.com/alexcasalboni/aws-lambda-power-tuning)**
    Build a [Step Functions](https://aws.amazon.com/step-functions/) state machine to optimize your AWS Lambda Function memory/power configuration. | [alexcasalboni](http://github.com/alexcasalboni) | +| **[Amazon Kinesis Streams Fan Out Via Kinesis Analytics](https://github.com/alexcasalboni/kinesis-streams-fan-out-kinesis-analytics)**
    Use [Amazon Kinesis Analytics](https://aws.amazon.com/kinesis/analytics/) to fan-out your Kinesis Streams and avoid read throttling. | [alexcasalboni](http://github.com/alexcasalboni) | +| **[Grants Api Serverless](https://github.com/comicrelief/grants-api-serverless)**
    ES6 API to consume data from an external API, ingest into Elasticsearch and return a queryable endpoint on top of Elasticsearch | [comicrelief](http://github.com/comicrelief) | +| **[Honeylambda](https://github.com/0x4D31/honeyLambda)**
    a simple, serverless application designed to create and monitor URL {honey}tokens, on top of AWS Lambda and Amazon API Gateway | [0x4D31](http://github.com/0x4D31) | +| **[Stack Overflow Monitor](https://github.com/picsoung/stackoverflowmonitor)**
    Monitor Stack Overflow questions and post them in a Slack channel | [picsoung](http://github.com/picsoung) | +| **[React & Stripe Serverless Ecommerce](https://github.com/patrick-michelberger/serverless-shop)**
    Serverless E-Commerce App with AWS Lambda, Stripe and React | [patrick-michelberger](http://github.com/patrick-michelberger) | +| **[Serverless + Medium Text To Speech](https://github.com/RafalWilinski/serverless-medium-text-to-speech)**
    Serverless-based, text-to-speech service for Medium articles | [RafalWilinski](http://github.com/RafalWilinski) | ## Contributing diff --git a/docs/providers/aws/events/apigateway.md b/docs/providers/aws/events/apigateway.md index 4b7c11b65..aa593e447 100644 --- a/docs/providers/aws/events/apigateway.md +++ b/docs/providers/aws/events/apigateway.md @@ -314,7 +314,7 @@ functions: identityValidationExpression: someRegex ``` -You can also use the Request Type Authorizer by setting the `type` property. In this case, your `identitySource` could contain multiple entries for you policy cache. +You can also use the Request Type Authorizer by setting the `type` property. In this case, your `identitySource` could contain multiple entries for you policy cache. The default `type` is 'token'. ```yml functions: From a7b711dc33fe6fc6d782b13b55aa869482bc226f Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Wed, 11 Oct 2017 12:49:08 +0200 Subject: [PATCH 101/128] Add function attached to APIGW timeout warning --- .../aws/deploy/lib/extendedValidate.js | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/plugins/aws/deploy/lib/extendedValidate.js b/lib/plugins/aws/deploy/lib/extendedValidate.js index 0c670d128..ff83c83bd 100644 --- a/lib/plugins/aws/deploy/lib/extendedValidate.js +++ b/lib/plugins/aws/deploy/lib/extendedValidate.js @@ -29,6 +29,28 @@ module.exports = { this.serverless.service.package.artifact = path .join(this.serverless.config.servicePath, '.serverless', state.package.artifact); } + + // Check function's attached to API Gateway timeout + if (!_.isEmpty(this.serverless.service.functions)) { + this.serverless.service.getAllFunctions().forEach(functionName => { + const functionObject = this.serverless.service.getFunction(functionName); + + // Check if function timeout is greater than API Gateway timeout + if (functionObject.timeout > 30 && functionObject.events) { + functionObject.events.forEach(event => { + if (Object.keys(event)[0] === 'http') { + const warnMessage = [ + `WARNING: Function ${functionName} has timeout of ${functionObject.timeout} seconds, `, + `however, it's attached to API Gateway so it's automatically limited to 30 seconds.` + ].join(''); + + this.serverless.cli.log(warnMessage); + } + }); + } + }); + } + if (!_.isEmpty(this.serverless.service.functions) && this.serverless.service.package.individually) { // artifact file validation (multiple function artifacts) From 9e99b3aed042592c66bc05c45ca3caa5613a53a4 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Wed, 11 Oct 2017 13:01:03 +0200 Subject: [PATCH 102/128] Fix linter issues --- lib/plugins/aws/deploy/lib/extendedValidate.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/plugins/aws/deploy/lib/extendedValidate.js b/lib/plugins/aws/deploy/lib/extendedValidate.js index ff83c83bd..c0b99cf9d 100644 --- a/lib/plugins/aws/deploy/lib/extendedValidate.js +++ b/lib/plugins/aws/deploy/lib/extendedValidate.js @@ -40,10 +40,11 @@ module.exports = { functionObject.events.forEach(event => { if (Object.keys(event)[0] === 'http') { const warnMessage = [ - `WARNING: Function ${functionName} has timeout of ${functionObject.timeout} seconds, `, - `however, it's attached to API Gateway so it's automatically limited to 30 seconds.` + `WARNING: Function ${functionName} has timeout of ${functionObject.timeout} `, + 'seconds, however, it\'s attached to API Gateway so it\'s automatically ', + 'limited to 30 seconds.' ].join(''); - + this.serverless.cli.log(warnMessage); } }); From 1c57e3936543c8418399ee016795a37a3ef4cb6c Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Wed, 11 Oct 2017 13:53:01 +0200 Subject: [PATCH 103/128] Add extendedValidate test --- .../aws/deploy/lib/extendedValidate.js | 2 +- .../aws/deploy/lib/extendedValidate.test.js | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/plugins/aws/deploy/lib/extendedValidate.js b/lib/plugins/aws/deploy/lib/extendedValidate.js index c0b99cf9d..2a1bf15e3 100644 --- a/lib/plugins/aws/deploy/lib/extendedValidate.js +++ b/lib/plugins/aws/deploy/lib/extendedValidate.js @@ -42,7 +42,7 @@ module.exports = { const warnMessage = [ `WARNING: Function ${functionName} has timeout of ${functionObject.timeout} `, 'seconds, however, it\'s attached to API Gateway so it\'s automatically ', - 'limited to 30 seconds.' + 'limited to 30 seconds.', ].join(''); this.serverless.cli.log(warnMessage); diff --git a/lib/plugins/aws/deploy/lib/extendedValidate.test.js b/lib/plugins/aws/deploy/lib/extendedValidate.test.js index 5e0d010b1..96281bbb6 100644 --- a/lib/plugins/aws/deploy/lib/extendedValidate.test.js +++ b/lib/plugins/aws/deploy/lib/extendedValidate.test.js @@ -43,6 +43,9 @@ describe('extendedValidate', () => { awsDeploy = new AwsDeploy(serverless, options); awsDeploy.serverless.service.service = `service-${(new Date()).getTime().toString()}`; awsDeploy.serverless.cli = new serverless.classes.CLI(); + awsDeploy.serverless.cli = { + log: sinon.spy(), + }; }); describe('extendedValidate()', () => { @@ -148,5 +151,30 @@ describe('extendedValidate', () => { delete awsDeploy.serverless.service.package.artifact; }); }); + + it('should warn user if function\'s timeout is greater than 30 and it\'s attached to APIGW', () => { + stateFileMock.service.functions = { + first: { + timeout: 31, + package: { + artifact: 'artifact.zip', + }, + events: [{ + http: {}, + }], + }, + }; + awsDeploy.serverless.service.package.individually = true; + fileExistsSyncStub.returns(true); + readFileSyncStub.returns(stateFileMock); + + return awsDeploy.extendedValidate().then(() => { + console.log(awsDeploy.serverless.cli.log); + const msg = [ + 'WARNING: Function first has timeout of 31 seconds, however, it\'s attached to API Gateway so it\'s automatically limited to 30 seconds.' + ].join(''); + expect(awsDeploy.serverless.cli.log.firstCall.calledWithExactly(msg)).to.be.equal(true); + }); + }); }); }); From da33790a789a1004c56c409c98cb08013beafc93 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Wed, 11 Oct 2017 13:57:06 +0200 Subject: [PATCH 104/128] Fix test linter issues --- lib/plugins/aws/deploy/lib/extendedValidate.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/plugins/aws/deploy/lib/extendedValidate.test.js b/lib/plugins/aws/deploy/lib/extendedValidate.test.js index 96281bbb6..2a55d9199 100644 --- a/lib/plugins/aws/deploy/lib/extendedValidate.test.js +++ b/lib/plugins/aws/deploy/lib/extendedValidate.test.js @@ -169,9 +169,9 @@ describe('extendedValidate', () => { readFileSyncStub.returns(stateFileMock); return awsDeploy.extendedValidate().then(() => { - console.log(awsDeploy.serverless.cli.log); const msg = [ - 'WARNING: Function first has timeout of 31 seconds, however, it\'s attached to API Gateway so it\'s automatically limited to 30 seconds.' + 'WARNING: Function first has timeout of 31 seconds, however, it\'s ', + 'attached to API Gateway so it\'s automatically limited to 30 seconds.', ].join(''); expect(awsDeploy.serverless.cli.log.firstCall.calledWithExactly(msg)).to.be.equal(true); }); From 656862919eb5e475c30be7776edb7ebca209b12a Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Wed, 11 Oct 2017 14:03:09 +0200 Subject: [PATCH 105/128] Shorten test description --- lib/plugins/aws/deploy/lib/extendedValidate.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugins/aws/deploy/lib/extendedValidate.test.js b/lib/plugins/aws/deploy/lib/extendedValidate.test.js index 2a55d9199..3074f5089 100644 --- a/lib/plugins/aws/deploy/lib/extendedValidate.test.js +++ b/lib/plugins/aws/deploy/lib/extendedValidate.test.js @@ -152,7 +152,7 @@ describe('extendedValidate', () => { }); }); - it('should warn user if function\'s timeout is greater than 30 and it\'s attached to APIGW', () => { + it('should warn if function\'s timeout is greater than 30 and it\'s attached to APIGW', () => { stateFileMock.service.functions = { first: { timeout: 31, From cf8e15778d09fed82b97e3b02a71f74e14d89bff Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Thu, 12 Oct 2017 00:55:20 +0200 Subject: [PATCH 106/128] Fix linter issue --- lib/plugins/print/print.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugins/print/print.js b/lib/plugins/print/print.js index 4838f9e25..e4263aa8b 100644 --- a/lib/plugins/print/print.js +++ b/lib/plugins/print/print.js @@ -42,7 +42,7 @@ class Print { if (variableSyntax !== undefined) { conf.provider.variableSyntax = variableSyntax; } - this.serverless.cli.consoleLog(YAML.dump(conf, {noRefs: true} )); + this.serverless.cli.consoleLog(YAML.dump(conf, { noRefs: true })); }); } From 3c3ec62562f076df31538a5e45a08779235836b0 Mon Sep 17 00:00:00 2001 From: Ben Burhans Date: Thu, 12 Oct 2017 09:47:36 -0400 Subject: [PATCH 107/128] Fix relative hyperlink to quick-start page --- docs/providers/webtasks/guide/intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers/webtasks/guide/intro.md b/docs/providers/webtasks/guide/intro.md index 6174e3f9e..3dce6f97b 100644 --- a/docs/providers/webtasks/guide/intro.md +++ b/docs/providers/webtasks/guide/intro.md @@ -14,7 +14,7 @@ layout: Doc The Serverless Framework helps you develop and deploy serverless applications using Auth0 Webtasks. The Serverless CLI offers structure, automation and best practices out-of-the-box. And with Auth0 Webtasks it's simple and easy to deploy code in just seconds. -**Note:** A local profile is required to use Auth0 Webtasks with the Serverless Framework. Follow the steps in the [Quick Start](../quick-start.md) to get setup in less than a minute. +**Note:** A local profile is required to use Auth0 Webtasks with the Serverless Framework. Follow the steps in the [Quick Start](quick-start.md) to get setup in less than a minute. ## Core Concepts From 41414a09d28ec34a5bd78e80ac4214565f4e7db1 Mon Sep 17 00:00:00 2001 From: horike37 Date: Fri, 13 Oct 2017 01:58:33 +0900 Subject: [PATCH 108/128] update path separator --- lib/utils/downloadTemplateFromRepo.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/utils/downloadTemplateFromRepo.test.js b/lib/utils/downloadTemplateFromRepo.test.js index ac2259707..d1cdf290f 100644 --- a/lib/utils/downloadTemplateFromRepo.test.js +++ b/lib/utils/downloadTemplateFromRepo.test.js @@ -193,7 +193,7 @@ describe('downloadTemplateFromRepo', () => { branch: 'mvn', downloadUrl: 'https://bitbucket.org/atlassian/localstack/get/mvn.zip', isSubdirectory: true, - pathToDirectory: 'localstack/dashboard', + pathToDirectory: `localstack${path.sep}dashboard`, }); }); }); From 6bfcafa3451d84e424cb49d21e3269322f2d2fff Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Thu, 12 Oct 2017 10:45:57 -0700 Subject: [PATCH 109/128] Spotinst - adding provider images for events, cli, examples and guide --- docs/providers/spotinst/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/providers/spotinst/README.md b/docs/providers/spotinst/README.md index 1cb718de1..cc2be7137 100755 --- a/docs/providers/spotinst/README.md +++ b/docs/providers/spotinst/README.md @@ -18,6 +18,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    @@ -33,7 +34,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    @@ -57,7 +58,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    @@ -71,7 +72,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    From cfc3614c45f1ee759cbd2f4600caf8a001b82fde Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Thu, 12 Oct 2017 10:48:18 -0700 Subject: [PATCH 110/128] Spotinst - deleting extra image --- docs/providers/spotinst/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/providers/spotinst/README.md b/docs/providers/spotinst/README.md index cc2be7137..551696812 100755 --- a/docs/providers/spotinst/README.md +++ b/docs/providers/spotinst/README.md @@ -18,8 +18,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
    From 98b74a4b7e90ae53b0b6718886980f7b659bd2ef Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 12 Oct 2017 17:50:09 -0400 Subject: [PATCH 111/128] Google credentials.md: remove duplicate "Console" --- docs/providers/google/guide/credentials.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers/google/guide/credentials.md b/docs/providers/google/guide/credentials.md index 60b858614..fa46773b9 100644 --- a/docs/providers/google/guide/credentials.md +++ b/docs/providers/google/guide/credentials.md @@ -28,7 +28,7 @@ If necessary, a more detailed guide on creating a Billing Account can be found < A Google Cloud Project is required to use Google Cloud Functions. Here's how to create one: -1. Go to the Google Cloud Console Console. +1. Go to the Google Cloud Console. 2. There is a dropdown near the top left of the screen (near the search bar that lists your projects). Click it and select "Create Project". 3. Enter a Project name and select the Billing Account you created in the steps above (or any Billing Account with a valid credit card attached). 3. Click on "Create" to start the creation process. From ae68865c1531dd8dedcaa4393b8e1d674b823dd4 Mon Sep 17 00:00:00 2001 From: daviskoh Date: Fri, 13 Oct 2017 23:35:53 -0400 Subject: [PATCH 112/128] add swp files to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 4699a968f..4d98e9617 100755 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,6 @@ tracking-config.json # Misc jest + +# VIM +*.swp From 507a40d860bc293742e0dde02a6332858c178754 Mon Sep 17 00:00:00 2001 From: horike37 Date: Sat, 14 Oct 2017 19:31:01 +0900 Subject: [PATCH 113/128] fix linting error --- lib/utils/downloadTemplateFromRepo.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/utils/downloadTemplateFromRepo.js b/lib/utils/downloadTemplateFromRepo.js index 91119263a..1ae503ec9 100644 --- a/lib/utils/downloadTemplateFromRepo.js +++ b/lib/utils/downloadTemplateFromRepo.js @@ -6,13 +6,12 @@ const URL = require('url'); const download = require('download'); const BbPromise = require('bluebird'); const fse = require('fs-extra'); -const chalk = require('chalk'); const qs = require('querystring'); - const renameService = require('./renameService').renameService; const ServerlessError = require('../classes/Error').ServerlessError; const copyDirContentsSync = require('./fs/copyDirContentsSync'); const dirExistsSync = require('./fs/dirExistsSync'); +const log = require('./log/serverlessLog'); /** * @param {Object} url @@ -171,7 +170,7 @@ function downloadTemplateFromRepo(inputUrl, templateName, downloadPath) { throw new ServerlessError(errorMessage); } - console.log(`Serverless: ${chalk.yellow(`Downloading and installing "${serviceName}"...`)}`); + log(`Downloading and installing "${serviceName}"...`); // download service return download( From 36a37d08e0118f96c1c5249eb449ffdd75785ce4 Mon Sep 17 00:00:00 2001 From: Rafal Wilinski Date: Sat, 14 Oct 2017 13:39:37 +0200 Subject: [PATCH 114/128] Fix helloTwo function deployment --- lib/plugins/aws/deployFunction/index.js | 12 ++++++++---- lib/plugins/aws/deployFunction/index.test.js | 14 ++++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/plugins/aws/deployFunction/index.js b/lib/plugins/aws/deployFunction/index.js index 8aad56291..4d347b8d9 100644 --- a/lib/plugins/aws/deployFunction/index.js +++ b/lib/plugins/aws/deployFunction/index.js @@ -93,10 +93,14 @@ class AwsDeployFunction { return BbPromise.resolve(role); } - return this.provider.getAccountId().then((accountId) => { - const delimeter = role['Fn::GetAtt'][0][0] === '/' ? '' : '/'; - return `arn:aws:iam::${accountId}:role${delimeter}${role['Fn::GetAtt'][0]}`; - }); + return this.provider.request( + 'IAM', + 'getRole', + { + RoleName: role['Fn::GetAtt'][0], + }, + this.options.stage, this.options.region + ).then((data) => data.Arn); } callUpdateFunctionConfiguration(params) { diff --git a/lib/plugins/aws/deployFunction/index.test.js b/lib/plugins/aws/deployFunction/index.test.js index 5331ff15f..5e6def27f 100644 --- a/lib/plugins/aws/deployFunction/index.test.js +++ b/lib/plugins/aws/deployFunction/index.test.js @@ -118,11 +118,15 @@ describe('AwsDeployFunction', () => { describe('#normalizeArnRole', () => { let getAccountIdStub; + let getRoleStub; beforeEach(() => { getAccountIdStub = sinon .stub(awsDeployFunction.provider, 'getAccountId') .resolves('123456789012'); + getRoleStub = sinon + .stub(awsDeployFunction.provider, 'request') + .resolves({ Arn: 'arn:aws:iam::123456789012:role/role_2' }); serverless.service.resources = { Resources: { @@ -138,6 +142,7 @@ describe('AwsDeployFunction', () => { afterEach(() => { awsDeployFunction.provider.getAccountId.restore(); + awsDeployFunction.provider.request.restore(); serverless.service.resources = undefined; }); @@ -162,14 +167,15 @@ describe('AwsDeployFunction', () => { it('should return compiled ARN if object role was provided', () => { const roleObj = { 'Fn::GetAtt': [ - 'role_123', - 'arn', + 'role_2', + 'Arn', ], }; return awsDeployFunction.normalizeArnRole(roleObj).then((result) => { - expect(getAccountIdStub.calledOnce).to.be.equal(true); - expect(result).to.be.equal('arn:aws:iam::123456789012:role/role_123'); + expect(getRoleStub.calledOnce).to.be.equal(true); + expect(getAccountIdStub.calledOnce).to.be.equal(false); + expect(result).to.be.equal('arn:aws:iam::123456789012:role/role_2'); }); }); }); From 12d22792a09daac8dd487daf280356b15c395a63 Mon Sep 17 00:00:00 2001 From: daviskoh Date: Sun, 15 Oct 2017 17:02:30 -0400 Subject: [PATCH 115/128] bugfix: exclude .bin executables from dev dependencies --- lib/plugins/package/lib/zipService.js | 29 +++- lib/plugins/package/lib/zipService.test.js | 169 ++++++++++++++++++++- 2 files changed, 188 insertions(+), 10 deletions(-) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index 23341400d..36313397e 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -181,11 +181,32 @@ function excludeNodeDevDependencies(servicePath) { const nodeModulesRegex = new RegExp(`${path.join('node_modules', path.sep)}.*`, 'g'); if (!_.isEmpty(dependencies)) { - const globs = dependencies - .map((item) => item.replace(path.join(servicePath, path.sep), '')) + return BbPromise + .map(dependencies, (item) => item.replace(path.join(servicePath, path.sep), '')) .filter((item) => item.length > 0 && item.match(nodeModulesRegex)) - .map((item) => `${item}/**`); - exAndIn.exclude = globs; + .map((item) => fs.readFileAsync(`${item}/package.json`, 'utf-8').then((packageJsonFile) => { + const lastIndex = item.lastIndexOf('/') + 1; + const moduleName = item.substr(lastIndex); + const modulePath = item.substr(0, lastIndex); + + const globs = [`${item}/**`]; + + const packageJson = JSON.parse(packageJsonFile); + const bin = packageJson.bin; + + // NOTE: pkg.bin can be object, string, or undefined + if (typeof bin === 'object') { + globs.push(`${modulePath}.bin/${Object.keys(bin)[0]}`); + } else if (typeof bin === 'string') { + globs.push(`${modulePath}.bin/${moduleName}`); + } + + return globs; + })) + .then((globs) => { + exAndIn.exclude = exAndIn.exclude.concat(_.flatten(globs)); + return exAndIn; + }); } return exAndIn; diff --git a/lib/plugins/package/lib/zipService.test.js b/lib/plugins/package/lib/zipService.test.js index 25d42df26..596a91e60 100644 --- a/lib/plugins/package/lib/zipService.test.js +++ b/lib/plugins/package/lib/zipService.test.js @@ -231,7 +231,8 @@ describe('zipService', () => { globbySyncStub.returns(filePaths); execAsyncStub.resolves(); - readFileAsyncStub.onCall(0).resolves(); + + readFileAsyncStub.onCall(0).rejects(); readFileAsyncStub.onCall(1).rejects(); return expect(packagePlugin.excludeDevDependencies(params)).to.be @@ -277,12 +278,20 @@ describe('zipService', () => { ].join('\n'); readFileAsyncStub.withArgs(sinon.match(/dev$/)).resolves(depPaths); readFileAsyncStub.withArgs(sinon.match(/prod$/)).resolves([]); + readFileAsyncStub.onCall(2).resolves('{}'); + readFileAsyncStub.onCall(3).resolves('{}'); + readFileAsyncStub.onCall(4).resolves('{}'); + readFileAsyncStub.onCall(5).resolves('{}'); return expect(packagePlugin.excludeDevDependencies(params)).to.be .fulfilled.then((updatedParams) => { expect(globbySyncStub).to.have.been.calledOnce; expect(execAsyncStub.callCount).to.equal(6); - expect(readFileAsyncStub).to.have.been.calledTwice; + expect(readFileAsyncStub).to.have.callCount(6); + expect(readFileAsyncStub).to.have.been.calledWith('node_modules/module-1/package.json'); + expect(readFileAsyncStub).to.have.been.calledWith('node_modules/module-2/package.json'); + expect(readFileAsyncStub).to.have.been.calledWith('1st/2nd/node_modules/module-1/package.json'); + expect(readFileAsyncStub).to.have.been.calledWith('1st/2nd/node_modules/module-1/package.json'); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -341,12 +350,16 @@ describe('zipService', () => { ].join('\n'); readFileAsyncStub.withArgs(sinon.match(/dev$/)).resolves(depPaths); readFileAsyncStub.withArgs(sinon.match(/prod$/)).resolves([]); + readFileAsyncStub.onCall(2).resolves('{}'); + readFileAsyncStub.onCall(3).resolves('{}'); return expect(packagePlugin.excludeDevDependencies(params)).to.be .fulfilled.then((updatedParams) => { expect(globbySyncStub).to.have.been.calledOnce; expect(execAsyncStub).to.have.been.calledTwice; - expect(readFileAsyncStub).to.have.been.calledTwice; + expect(readFileAsyncStub).to.have.callCount(4); + expect(readFileAsyncStub).to.have.been.calledWith('node_modules/module-1/package.json'); + expect(readFileAsyncStub).to.have.been.calledWith('node_modules/module-2/package.json'); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -397,15 +410,20 @@ describe('zipService', () => { path.join(`${servicePath}`, '1st/2nd/node_modules/module-1'), path.join(`${servicePath}`, '1st/2nd/node_modules/module-2'), ].join('\n'); - readFileAsyncStub.resolves(depPaths); readFileAsyncStub.withArgs(sinon.match(/dev$/)).resolves(depPaths); readFileAsyncStub.withArgs(sinon.match(/prod$/)).resolves([]); + readFileAsyncStub.onCall(2).resolves('{}'); + readFileAsyncStub.onCall(3).resolves('{}'); + readFileAsyncStub.onCall(4).resolves('{}'); + readFileAsyncStub.onCall(5).resolves('{}'); + readFileAsyncStub.onCall(6).resolves('{}'); + readFileAsyncStub.onCall(7).resolves('{}'); return expect(packagePlugin.excludeDevDependencies(params)).to.be .fulfilled.then((updatedParams) => { expect(globbySyncStub).to.have.been.calledOnce; expect(execAsyncStub.callCount).to.equal(6); - expect(readFileAsyncStub).to.have.been.calledTwice; + expect(readFileAsyncStub).to.have.callCount(8); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -470,12 +488,14 @@ describe('zipService', () => { path.join(`${servicePath}`, 'node_modules/module-2'), ]; readFileAsyncStub.withArgs(sinon.match(/prod$/)).resolves(prodDepPaths); + readFileAsyncStub.onCall(2).resolves('{}'); return expect(packagePlugin.excludeDevDependencies(params)).to.be .fulfilled.then((updatedParams) => { expect(globbySyncStub).to.have.been.calledOnce; expect(execAsyncStub).to.have.been.calledTwice; - expect(readFileAsyncStub).to.have.been.calledTwice; + expect(readFileAsyncStub).to.have.been.calledThrice; + expect(readFileAsyncStub).to.have.been.calledWith('node_modules/module-1/package.json'); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -502,6 +522,143 @@ describe('zipService', () => { expect(updatedParams.zipFileName).to.equal(params.zipFileName); }); }); + + it('should exclude dev dependency executables in node_modules/.bin', () => { + const devPaths = [ + 'node_modules/bro-module', + 'node_modules/node-dude', + 'node_modules/lumo-clj', + ]; + + const prodPaths = [ + 'node_modules/node-dude', + ]; + + const filePaths = [ + 'node_modules/', + 'package.json', + ].concat(devPaths).concat(prodPaths); + + globbySyncStub.returns(filePaths); + execAsyncStub.resolves(); + + const mapper = (depPath) => path.join(`${servicePath}`, depPath); + + const devDepPaths = devPaths.map(mapper).join('\n'); + readFileAsyncStub.withArgs(sinon.match(/dev$/)).resolves(devDepPaths); + + const prodDepPaths = prodPaths.map(mapper).join('\n'); + readFileAsyncStub.withArgs(sinon.match(/prod$/)).resolves(prodDepPaths); + + readFileAsyncStub + .onCall(2) + .resolves('{"name": "bro-module", "bin": "main.js"}'); + readFileAsyncStub + .onCall(3) + .resolves('{"name": "lumo-clj", "bin": {"lumo": "./bin/lumo.js"}}'); + + return expect(packagePlugin.excludeDevDependencies(params)).to.be + .fulfilled.then((updatedParams) => { + expect(globbySyncStub).to.been.calledOnce; + expect(execAsyncStub).to.have.been.calledTwice; + + expect(readFileAsyncStub).to.have.callCount(4); + expect(readFileAsyncStub).to.have.been.calledWith('node_modules/bro-module/package.json'); + expect(readFileAsyncStub).to.have.been.calledWith('node_modules/lumo-clj/package.json'); + + expect(updatedParams.exclude).to.deep.equal([ + 'user-defined-exclude-me', + `${path.join('node_modules/bro-module')}/**`, + `${path.join('node_modules/.bin/bro-module')}`, + `${path.join('node_modules/lumo-clj')}/**`, + `${path.join('node_modules/.bin/lumo')}`, + ]); + expect(updatedParams.include).to.deep.equal([ + 'user-defined-include-me', + ]); + expect(updatedParams.zipFileName).to.equal(params.zipFileName); + }); + }); + + it('should exclude .bin executables in deeply nested folders', () => { + const filePaths = [ + 'package.json', 'node_modules', + path.join('1st', 'package.json'), + path.join('1st', 'node_modules'), + path.join('1st', '2nd', 'package.json'), + path.join('1st', '2nd', 'node_modules'), + ]; + + globbySyncStub.returns(filePaths); + execAsyncStub.resolves(); + const deps = [ + 'node_modules/module-1', + 'node_modules/module-2', + '1st/node_modules/module-1', + '1st/node_modules/module-2', + '1st/2nd/node_modules/module-1', + '1st/2nd/node_modules/module-2', + ]; + const depPaths = deps.map((depPath) => path.join(`${servicePath}`, depPath)); + readFileAsyncStub.withArgs(sinon.match(/dev$/)).resolves(depPaths.join('\n')); + readFileAsyncStub.withArgs(sinon.match(/prod$/)).resolves([]); + + const module1PackageJson = JSON.stringify({ + name: 'module-1', + bin: { + 'cool-module': './index.js', + }, + }); + const module2PackageJson = JSON.stringify({ + name: 'module-2', + bin: './main.js', + }); + + readFileAsyncStub.onCall(2).resolves(module1PackageJson); + readFileAsyncStub.onCall(3).resolves(module2PackageJson); + readFileAsyncStub.onCall(4).resolves(module1PackageJson); + readFileAsyncStub.onCall(5).resolves(module2PackageJson); + readFileAsyncStub.onCall(6).resolves(module1PackageJson); + readFileAsyncStub.onCall(7).resolves(module2PackageJson); + + return expect(packagePlugin.excludeDevDependencies(params)).to.be + .fulfilled.then((updatedParams) => { + expect(globbySyncStub).to.have.been.calledOnce; + expect(execAsyncStub.callCount).to.equal(6); + expect(readFileAsyncStub).to.have.callCount(8); + for (let depPath of deps) { + expect(readFileAsyncStub).to.have.been.calledWith(`${depPath}/package.json`); + } + expect(globbySyncStub).to.have.been + .calledWithExactly(['**/package.json'], { + cwd: packagePlugin.serverless.config.servicePath, + dot: true, + silent: true, + follow: true, + nosort: true, + }); + + expect(updatedParams.exclude).to.deep.equal([ + 'user-defined-exclude-me', + `${path.join('node_modules/module-1')}/**`, + `${path.join('node_modules/.bin/cool-module')}`, + `${path.join('node_modules/module-2')}/**`, + `${path.join('node_modules/.bin/module-2')}`, + `${path.join('1st/node_modules/module-1')}/**`, + `${path.join('1st/node_modules/.bin/cool-module')}`, + `${path.join('1st/node_modules/module-2')}/**`, + `${path.join('1st/node_modules/.bin/module-2')}`, + `${path.join('1st/2nd/node_modules/module-1')}/**`, + `${path.join('1st/2nd/node_modules/.bin/cool-module')}`, + `${path.join('1st/2nd/node_modules/module-2')}/**`, + `${path.join('1st/2nd/node_modules/.bin/module-2')}`, + ]); + expect(updatedParams.include).to.deep.equal([ + 'user-defined-include-me', + ]); + expect(updatedParams.zipFileName).to.equal(params.zipFileName); + }); + }); }); }); From f87ecb88d9078abf3510b435d05e453c9e62b1e5 Mon Sep 17 00:00:00 2001 From: daviskoh Date: Sun, 15 Oct 2017 17:06:59 -0400 Subject: [PATCH 116/128] fix lint issues --- lib/plugins/package/lib/zipService.js | 33 ++++++++++++---------- lib/plugins/package/lib/zipService.test.js | 20 ++++++++----- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index 36313397e..85500e44c 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -184,25 +184,28 @@ function excludeNodeDevDependencies(servicePath) { return BbPromise .map(dependencies, (item) => item.replace(path.join(servicePath, path.sep), '')) .filter((item) => item.length > 0 && item.match(nodeModulesRegex)) - .map((item) => fs.readFileAsync(`${item}/package.json`, 'utf-8').then((packageJsonFile) => { - const lastIndex = item.lastIndexOf('/') + 1; - const moduleName = item.substr(lastIndex); - const modulePath = item.substr(0, lastIndex); + .map((item) => { + const packagePath = `${item}/package.json`; + return fs.readFileAsync(packagePath, 'utf-8').then((packageJsonFile) => { + const lastIndex = item.lastIndexOf('/') + 1; + const moduleName = item.substr(lastIndex); + const modulePath = item.substr(0, lastIndex); - const globs = [`${item}/**`]; + const globs = [`${item}/**`]; - const packageJson = JSON.parse(packageJsonFile); - const bin = packageJson.bin; + const packageJson = JSON.parse(packageJsonFile); + const bin = packageJson.bin; - // NOTE: pkg.bin can be object, string, or undefined - if (typeof bin === 'object') { - globs.push(`${modulePath}.bin/${Object.keys(bin)[0]}`); - } else if (typeof bin === 'string') { - globs.push(`${modulePath}.bin/${moduleName}`); - } + // NOTE: pkg.bin can be object, string, or undefined + if (typeof bin === 'object') { + globs.push(`${modulePath}.bin/${Object.keys(bin)[0]}`); + } else if (typeof bin === 'string') { + globs.push(`${modulePath}.bin/${moduleName}`); + } - return globs; - })) + return globs; + }); + }) .then((globs) => { exAndIn.exclude = exAndIn.exclude.concat(_.flatten(globs)); return exAndIn; diff --git a/lib/plugins/package/lib/zipService.test.js b/lib/plugins/package/lib/zipService.test.js index 596a91e60..5f0ca910d 100644 --- a/lib/plugins/package/lib/zipService.test.js +++ b/lib/plugins/package/lib/zipService.test.js @@ -288,10 +288,14 @@ describe('zipService', () => { expect(globbySyncStub).to.have.been.calledOnce; expect(execAsyncStub.callCount).to.equal(6); expect(readFileAsyncStub).to.have.callCount(6); - expect(readFileAsyncStub).to.have.been.calledWith('node_modules/module-1/package.json'); - expect(readFileAsyncStub).to.have.been.calledWith('node_modules/module-2/package.json'); - expect(readFileAsyncStub).to.have.been.calledWith('1st/2nd/node_modules/module-1/package.json'); - expect(readFileAsyncStub).to.have.been.calledWith('1st/2nd/node_modules/module-1/package.json'); + expect(readFileAsyncStub).to.have.been + .calledWith('node_modules/module-1/package.json'); + expect(readFileAsyncStub).to.have.been + .calledWith('node_modules/module-2/package.json'); + expect(readFileAsyncStub).to.have.been + .calledWith('1st/2nd/node_modules/module-1/package.json'); + expect(readFileAsyncStub).to.have.been + .calledWith('1st/2nd/node_modules/module-1/package.json'); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -563,8 +567,10 @@ describe('zipService', () => { expect(execAsyncStub).to.have.been.calledTwice; expect(readFileAsyncStub).to.have.callCount(4); - expect(readFileAsyncStub).to.have.been.calledWith('node_modules/bro-module/package.json'); - expect(readFileAsyncStub).to.have.been.calledWith('node_modules/lumo-clj/package.json'); + expect(readFileAsyncStub).to.have.been + .calledWith('node_modules/bro-module/package.json'); + expect(readFileAsyncStub).to.have.been + .calledWith('node_modules/lumo-clj/package.json'); expect(updatedParams.exclude).to.deep.equal([ 'user-defined-exclude-me', @@ -626,7 +632,7 @@ describe('zipService', () => { expect(globbySyncStub).to.have.been.calledOnce; expect(execAsyncStub.callCount).to.equal(6); expect(readFileAsyncStub).to.have.callCount(8); - for (let depPath of deps) { + for (const depPath of deps) { expect(readFileAsyncStub).to.have.been.calledWith(`${depPath}/package.json`); } expect(globbySyncStub).to.have.been From 35f755e3b0cba71b3574ec0e806dfe1481a72e3c Mon Sep 17 00:00:00 2001 From: daviskoh Date: Sun, 15 Oct 2017 17:36:09 -0400 Subject: [PATCH 117/128] include all dev dep .bin executables specified in package.json file for glob patterns --- lib/plugins/package/lib/zipService.js | 9 ++++++--- lib/plugins/package/lib/zipService.test.js | 12 +++++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index 85500e44c..5a55aa76e 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -191,14 +191,17 @@ function excludeNodeDevDependencies(servicePath) { const moduleName = item.substr(lastIndex); const modulePath = item.substr(0, lastIndex); - const globs = [`${item}/**`]; - const packageJson = JSON.parse(packageJsonFile); const bin = packageJson.bin; + let globs = [`${item}/**`]; + // NOTE: pkg.bin can be object, string, or undefined if (typeof bin === 'object') { - globs.push(`${modulePath}.bin/${Object.keys(bin)[0]}`); + const binGlobs = Object.keys(bin) + .map((executable) => `${modulePath}.bin/${executable}`); + globs = globs.concat(binGlobs); + // only 1 executable with same name as lib } else if (typeof bin === 'string') { globs.push(`${modulePath}.bin/${moduleName}`); } diff --git a/lib/plugins/package/lib/zipService.test.js b/lib/plugins/package/lib/zipService.test.js index 5f0ca910d..157274906 100644 --- a/lib/plugins/package/lib/zipService.test.js +++ b/lib/plugins/package/lib/zipService.test.js @@ -532,6 +532,7 @@ describe('zipService', () => { 'node_modules/bro-module', 'node_modules/node-dude', 'node_modules/lumo-clj', + 'node_modules/meowmix', ]; const prodPaths = [ @@ -560,17 +561,23 @@ describe('zipService', () => { readFileAsyncStub .onCall(3) .resolves('{"name": "lumo-clj", "bin": {"lumo": "./bin/lumo.js"}}'); + readFileAsyncStub + .onCall(4) + // need to handle possibility of multiple executables provided by the lib + .resolves('{"name": "meowmix", "bin": {"meow": "./bin/meow.js", "mix": "./bin/mix.js"}}'); return expect(packagePlugin.excludeDevDependencies(params)).to.be .fulfilled.then((updatedParams) => { expect(globbySyncStub).to.been.calledOnce; expect(execAsyncStub).to.have.been.calledTwice; - expect(readFileAsyncStub).to.have.callCount(4); + expect(readFileAsyncStub).to.have.callCount(5); expect(readFileAsyncStub).to.have.been .calledWith('node_modules/bro-module/package.json'); expect(readFileAsyncStub).to.have.been .calledWith('node_modules/lumo-clj/package.json'); + expect(readFileAsyncStub).to.have.been + .calledWith('node_modules/meowmix/package.json'); expect(updatedParams.exclude).to.deep.equal([ 'user-defined-exclude-me', @@ -578,6 +585,9 @@ describe('zipService', () => { `${path.join('node_modules/.bin/bro-module')}`, `${path.join('node_modules/lumo-clj')}/**`, `${path.join('node_modules/.bin/lumo')}`, + `${path.join('node_modules/meowmix')}/**`, + `${path.join('node_modules/.bin/meow')}`, + `${path.join('node_modules/.bin/mix')}`, ]); expect(updatedParams.include).to.deep.equal([ 'user-defined-include-me', From 90126d6a88168f63b410066cd21152e74d1776d2 Mon Sep 17 00:00:00 2001 From: daviskoh Date: Sun, 15 Oct 2017 18:50:58 -0400 Subject: [PATCH 118/128] use path.join --- lib/plugins/package/lib/zipService.js | 2 +- lib/plugins/package/lib/zipService.test.js | 26 +++++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index 5a55aa76e..c07bf8135 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -185,7 +185,7 @@ function excludeNodeDevDependencies(servicePath) { .map(dependencies, (item) => item.replace(path.join(servicePath, path.sep), '')) .filter((item) => item.length > 0 && item.match(nodeModulesRegex)) .map((item) => { - const packagePath = `${item}/package.json`; + const packagePath = path.join(servicePath, path.sep, `${item}/package.json`); return fs.readFileAsync(packagePath, 'utf-8').then((packageJsonFile) => { const lastIndex = item.lastIndexOf('/') + 1; const moduleName = item.substr(lastIndex); diff --git a/lib/plugins/package/lib/zipService.test.js b/lib/plugins/package/lib/zipService.test.js index 157274906..4d7809854 100644 --- a/lib/plugins/package/lib/zipService.test.js +++ b/lib/plugins/package/lib/zipService.test.js @@ -289,13 +289,13 @@ describe('zipService', () => { expect(execAsyncStub.callCount).to.equal(6); expect(readFileAsyncStub).to.have.callCount(6); expect(readFileAsyncStub).to.have.been - .calledWith('node_modules/module-1/package.json'); + .calledWith(path.join(servicePath, 'node_modules/module-1/package.json')); expect(readFileAsyncStub).to.have.been - .calledWith('node_modules/module-2/package.json'); + .calledWith(path.join(servicePath, 'node_modules/module-2/package.json')); expect(readFileAsyncStub).to.have.been - .calledWith('1st/2nd/node_modules/module-1/package.json'); + .calledWith(path.join(servicePath, '1st/2nd/node_modules/module-1/package.json')); expect(readFileAsyncStub).to.have.been - .calledWith('1st/2nd/node_modules/module-1/package.json'); + .calledWith(path.join(servicePath, '1st/2nd/node_modules/module-1/package.json')); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -362,8 +362,10 @@ describe('zipService', () => { expect(globbySyncStub).to.have.been.calledOnce; expect(execAsyncStub).to.have.been.calledTwice; expect(readFileAsyncStub).to.have.callCount(4); - expect(readFileAsyncStub).to.have.been.calledWith('node_modules/module-1/package.json'); - expect(readFileAsyncStub).to.have.been.calledWith('node_modules/module-2/package.json'); + expect(readFileAsyncStub).to.have.been + .calledWith(path.join(servicePath, 'node_modules/module-1/package.json')); + expect(readFileAsyncStub).to.have.been + .calledWith(path.join(servicePath, 'node_modules/module-2/package.json')); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -499,7 +501,8 @@ describe('zipService', () => { expect(globbySyncStub).to.have.been.calledOnce; expect(execAsyncStub).to.have.been.calledTwice; expect(readFileAsyncStub).to.have.been.calledThrice; - expect(readFileAsyncStub).to.have.been.calledWith('node_modules/module-1/package.json'); + expect(readFileAsyncStub).to.have.been + .calledWith(path.join(servicePath, 'node_modules/module-1/package.json')); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -573,11 +576,11 @@ describe('zipService', () => { expect(readFileAsyncStub).to.have.callCount(5); expect(readFileAsyncStub).to.have.been - .calledWith('node_modules/bro-module/package.json'); + .calledWith(path.join(servicePath, 'node_modules/bro-module/package.json')); expect(readFileAsyncStub).to.have.been - .calledWith('node_modules/lumo-clj/package.json'); + .calledWith(path.join(servicePath, 'node_modules/lumo-clj/package.json')); expect(readFileAsyncStub).to.have.been - .calledWith('node_modules/meowmix/package.json'); + .calledWith(path.join(servicePath, 'node_modules/meowmix/package.json')); expect(updatedParams.exclude).to.deep.equal([ 'user-defined-exclude-me', @@ -643,7 +646,8 @@ describe('zipService', () => { expect(execAsyncStub.callCount).to.equal(6); expect(readFileAsyncStub).to.have.callCount(8); for (const depPath of deps) { - expect(readFileAsyncStub).to.have.been.calledWith(`${depPath}/package.json`); + expect(readFileAsyncStub).to.have.been + .calledWith(path.join(servicePath, (`${depPath}/package.json`))); } expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { From b407cc571309fddb32b38593c64a8a1015c54048 Mon Sep 17 00:00:00 2001 From: daviskoh Date: Sun, 15 Oct 2017 19:43:13 -0400 Subject: [PATCH 119/128] path.join all the things! --- lib/plugins/package/lib/zipService.js | 10 +++++----- lib/plugins/package/lib/zipService.test.js | 22 +++++++++++----------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index c07bf8135..56ff60a9c 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -185,25 +185,25 @@ function excludeNodeDevDependencies(servicePath) { .map(dependencies, (item) => item.replace(path.join(servicePath, path.sep), '')) .filter((item) => item.length > 0 && item.match(nodeModulesRegex)) .map((item) => { - const packagePath = path.join(servicePath, path.sep, `${item}/package.json`); + const packagePath = path.join(servicePath, item, 'package.json'); return fs.readFileAsync(packagePath, 'utf-8').then((packageJsonFile) => { - const lastIndex = item.lastIndexOf('/') + 1; + const lastIndex = item.lastIndexOf(path.sep) + 1; const moduleName = item.substr(lastIndex); const modulePath = item.substr(0, lastIndex); const packageJson = JSON.parse(packageJsonFile); const bin = packageJson.bin; - let globs = [`${item}/**`]; + let globs = [path.join(item, '**')]; // NOTE: pkg.bin can be object, string, or undefined if (typeof bin === 'object') { const binGlobs = Object.keys(bin) - .map((executable) => `${modulePath}.bin/${executable}`); + .map((executable) => path.join(modulePath, '.bin', executable)); globs = globs.concat(binGlobs); // only 1 executable with same name as lib } else if (typeof bin === 'string') { - globs.push(`${modulePath}.bin/${moduleName}`); + globs.push(path.join(modulePath, '.bin', moduleName)); } return globs; diff --git a/lib/plugins/package/lib/zipService.test.js b/lib/plugins/package/lib/zipService.test.js index 4d7809854..48195f8e4 100644 --- a/lib/plugins/package/lib/zipService.test.js +++ b/lib/plugins/package/lib/zipService.test.js @@ -289,13 +289,13 @@ describe('zipService', () => { expect(execAsyncStub.callCount).to.equal(6); expect(readFileAsyncStub).to.have.callCount(6); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, 'node_modules/module-1/package.json')); + .calledWith(path.join(servicePath, 'node_modules', 'module-1', 'package.json')); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, 'node_modules/module-2/package.json')); + .calledWith(path.join(servicePath, 'node_modules', 'module-2', 'package.json')); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, '1st/2nd/node_modules/module-1/package.json')); + .calledWith(path.join(servicePath, '1st', '2nd', 'node_modules', 'module-1', 'package.json')); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, '1st/2nd/node_modules/module-1/package.json')); + .calledWith(path.join(servicePath, '1st', '2nd', 'node_modules', 'module-1', 'package.json')); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -363,9 +363,9 @@ describe('zipService', () => { expect(execAsyncStub).to.have.been.calledTwice; expect(readFileAsyncStub).to.have.callCount(4); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, 'node_modules/module-1/package.json')); + .calledWith(path.join(servicePath, 'node_modules', 'module-1', 'package.json')); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, 'node_modules/module-2/package.json')); + .calledWith(path.join(servicePath, 'node_modules', 'module-2', 'package.json')); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -502,7 +502,7 @@ describe('zipService', () => { expect(execAsyncStub).to.have.been.calledTwice; expect(readFileAsyncStub).to.have.been.calledThrice; expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, 'node_modules/module-1/package.json')); + .calledWith(path.join(servicePath, 'node_modules', 'module-1', 'package.json')); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, @@ -576,11 +576,11 @@ describe('zipService', () => { expect(readFileAsyncStub).to.have.callCount(5); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, 'node_modules/bro-module/package.json')); + .calledWith(path.join(servicePath, 'node_modules', 'bro-module', 'package.json')); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, 'node_modules/lumo-clj/package.json')); + .calledWith(path.join(servicePath, 'node_modules', 'lumo-clj', 'package.json')); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, 'node_modules/meowmix/package.json')); + .calledWith(path.join(servicePath, 'node_modules', 'meowmix', 'package.json')); expect(updatedParams.exclude).to.deep.equal([ 'user-defined-exclude-me', @@ -647,7 +647,7 @@ describe('zipService', () => { expect(readFileAsyncStub).to.have.callCount(8); for (const depPath of deps) { expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, (`${depPath}/package.json`))); + .calledWith(path.join(servicePath, depPath, 'package.json')); } expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { From 0ab0ed4a5b860ae7be447e66e45e4ca71242e356 Mon Sep 17 00:00:00 2001 From: daviskoh Date: Sun, 15 Oct 2017 19:44:44 -0400 Subject: [PATCH 120/128] fix lint issues --- lib/plugins/package/lib/zipService.test.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/plugins/package/lib/zipService.test.js b/lib/plugins/package/lib/zipService.test.js index 48195f8e4..50cbfe357 100644 --- a/lib/plugins/package/lib/zipService.test.js +++ b/lib/plugins/package/lib/zipService.test.js @@ -293,9 +293,23 @@ describe('zipService', () => { expect(readFileAsyncStub).to.have.been .calledWith(path.join(servicePath, 'node_modules', 'module-2', 'package.json')); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, '1st', '2nd', 'node_modules', 'module-1', 'package.json')); + .calledWith(path.join( + servicePath, + '1st', + '2nd', + 'node_modules', + 'module-1', + 'package.json' + )); expect(readFileAsyncStub).to.have.been - .calledWith(path.join(servicePath, '1st', '2nd', 'node_modules', 'module-1', 'package.json')); + .calledWith(path.join( + servicePath, + '1st', + '2nd', + 'node_modules', + 'module-1', + 'package.json' + )); expect(globbySyncStub).to.have.been .calledWithExactly(['**/package.json'], { cwd: packagePlugin.serverless.config.servicePath, From 4c5c9f833e59d2f0239ad78f5dcf775568b72a74 Mon Sep 17 00:00:00 2001 From: daviskoh Date: Sun, 15 Oct 2017 20:05:25 -0400 Subject: [PATCH 121/128] path.join all path refs in zipService spec --- lib/plugins/package/lib/zipService.test.js | 94 +++++++++++----------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/lib/plugins/package/lib/zipService.test.js b/lib/plugins/package/lib/zipService.test.js index 50cbfe357..d7cfac665 100644 --- a/lib/plugins/package/lib/zipService.test.js +++ b/lib/plugins/package/lib/zipService.test.js @@ -271,10 +271,10 @@ describe('zipService', () => { execAsyncStub.onCall(4).resolves(); execAsyncStub.onCall(5).resolves(); const depPaths = [ - path.join(`${servicePath}`, 'node_modules/module-1'), - path.join(`${servicePath}`, 'node_modules/module-2'), - path.join(`${servicePath}`, '1st/2nd/node_modules/module-1'), - path.join(`${servicePath}`, '1st/2nd/node_modules/module-2'), + path.join(servicePath, 'node_modules', 'module-1'), + path.join(servicePath, 'node_modules', 'module-2'), + path.join(servicePath, '1st', '2nd', 'node_modules', 'module-1'), + path.join(servicePath, '1st', '2nd', 'node_modules', 'module-2'), ].join('\n'); readFileAsyncStub.withArgs(sinon.match(/dev$/)).resolves(depPaths); readFileAsyncStub.withArgs(sinon.match(/prod$/)).resolves([]); @@ -344,10 +344,10 @@ describe('zipService', () => { .match(/.+/); expect(updatedParams.exclude).to.deep.equal([ 'user-defined-exclude-me', - `${path.join('node_modules/module-1')}/**`, - `${path.join('node_modules/module-2')}/**`, - `${path.join('1st/2nd/node_modules/module-1')}/**`, - `${path.join('1st/2nd/node_modules/module-2')}/**`, + path.join('node_modules', 'module-1', '**'), + path.join('node_modules', 'module-2', '**'), + path.join('1st', '2nd', 'node_modules', 'module-1', '**'), + path.join('1st', '2nd', 'node_modules', 'module-2', '**'), ]); expect(updatedParams.include).to .deep.equal([ @@ -363,8 +363,8 @@ describe('zipService', () => { globbySyncStub.returns(filePaths); execAsyncStub.resolves(); const depPaths = [ - path.join(`${servicePath}`, 'node_modules/module-1'), - path.join(`${servicePath}`, 'node_modules/module-2'), + path.join(servicePath, 'node_modules', 'module-1'), + path.join(servicePath, 'node_modules', 'module-2'), ].join('\n'); readFileAsyncStub.withArgs(sinon.match(/dev$/)).resolves(depPaths); readFileAsyncStub.withArgs(sinon.match(/prod$/)).resolves([]); @@ -398,8 +398,8 @@ describe('zipService', () => { .match(/.+/); expect(updatedParams.exclude).to.deep.equal([ 'user-defined-exclude-me', - `${path.join('node_modules/module-1')}/**`, - `${path.join('node_modules/module-2')}/**`, + path.join('node_modules', 'module-1', '**'), + path.join('node_modules', 'module-2', '**'), ]); expect(updatedParams.include).to.deep.equal([ 'user-defined-include-me', @@ -423,12 +423,12 @@ describe('zipService', () => { globbySyncStub.returns(filePaths); execAsyncStub.resolves(); const depPaths = [ - path.join(`${servicePath}`, 'node_modules/module-1'), - path.join(`${servicePath}`, 'node_modules/module-2'), - path.join(`${servicePath}`, '1st/node_modules/module-1'), - path.join(`${servicePath}`, '1st/node_modules/module-2'), - path.join(`${servicePath}`, '1st/2nd/node_modules/module-1'), - path.join(`${servicePath}`, '1st/2nd/node_modules/module-2'), + path.join(servicePath, 'node_modules', 'module-1'), + path.join(servicePath, 'node_modules', 'module-2'), + path.join(servicePath, '1st', 'node_modules', 'module-1'), + path.join(servicePath, '1st', 'node_modules', 'module-2'), + path.join(servicePath, '1st', '2nd', 'node_modules', 'module-1'), + path.join(servicePath, '1st', '2nd', 'node_modules', 'module-2'), ].join('\n'); readFileAsyncStub.withArgs(sinon.match(/dev$/)).resolves(depPaths); readFileAsyncStub.withArgs(sinon.match(/prod$/)).resolves([]); @@ -478,12 +478,12 @@ describe('zipService', () => { .match(/.+/); expect(updatedParams.exclude).to.deep.equal([ 'user-defined-exclude-me', - `${path.join('node_modules/module-1')}/**`, - `${path.join('node_modules/module-2')}/**`, - `${path.join('1st/node_modules/module-1')}/**`, - `${path.join('1st/node_modules/module-2')}/**`, - `${path.join('1st/2nd/node_modules/module-1')}/**`, - `${path.join('1st/2nd/node_modules/module-2')}/**`, + path.join('node_modules', 'module-1', '**'), + path.join('node_modules', 'module-2', '**'), + path.join('1st', 'node_modules', 'module-1', '**'), + path.join('1st', 'node_modules', 'module-2', '**'), + path.join('1st', '2nd', 'node_modules', 'module-1', '**'), + path.join('1st', '2nd', 'node_modules', 'module-2', '**'), ]); expect(updatedParams.include).to.deep.equal([ 'user-defined-include-me', @@ -499,13 +499,13 @@ describe('zipService', () => { execAsyncStub.resolves(); const devDepPaths = [ - path.join(`${servicePath}`, 'node_modules/module-1'), - path.join(`${servicePath}`, 'node_modules/module-2'), + path.join(servicePath, 'node_modules', 'module-1'), + path.join(servicePath, 'node_modules', 'module-2'), ].join('\n'); readFileAsyncStub.withArgs(sinon.match(/dev$/)).resolves(devDepPaths); const prodDepPaths = [ - path.join(`${servicePath}`, 'node_modules/module-2'), + path.join(servicePath, 'node_modules', 'module-2'), ]; readFileAsyncStub.withArgs(sinon.match(/prod$/)).resolves(prodDepPaths); readFileAsyncStub.onCall(2).resolves('{}'); @@ -535,7 +535,7 @@ describe('zipService', () => { .match(/.+/); expect(updatedParams.exclude).to.deep.equal([ 'user-defined-exclude-me', - `${path.join('node_modules/module-1')}/**`, + path.join('node_modules', 'module-1', '**'), ]); expect(updatedParams.include).to.deep.equal([ 'user-defined-include-me', @@ -598,13 +598,13 @@ describe('zipService', () => { expect(updatedParams.exclude).to.deep.equal([ 'user-defined-exclude-me', - `${path.join('node_modules/bro-module')}/**`, - `${path.join('node_modules/.bin/bro-module')}`, - `${path.join('node_modules/lumo-clj')}/**`, - `${path.join('node_modules/.bin/lumo')}`, - `${path.join('node_modules/meowmix')}/**`, - `${path.join('node_modules/.bin/meow')}`, - `${path.join('node_modules/.bin/mix')}`, + path.join('node_modules', 'bro-module', '**'), + path.join('node_modules', '.bin', 'bro-module'), + path.join('node_modules', 'lumo-clj', '**'), + path.join('node_modules', '.bin', 'lumo'), + path.join('node_modules', 'meowmix', '**'), + path.join('node_modules', '.bin', 'meow'), + path.join('node_modules', '.bin', 'mix'), ]); expect(updatedParams.include).to.deep.equal([ 'user-defined-include-me', @@ -674,18 +674,18 @@ describe('zipService', () => { expect(updatedParams.exclude).to.deep.equal([ 'user-defined-exclude-me', - `${path.join('node_modules/module-1')}/**`, - `${path.join('node_modules/.bin/cool-module')}`, - `${path.join('node_modules/module-2')}/**`, - `${path.join('node_modules/.bin/module-2')}`, - `${path.join('1st/node_modules/module-1')}/**`, - `${path.join('1st/node_modules/.bin/cool-module')}`, - `${path.join('1st/node_modules/module-2')}/**`, - `${path.join('1st/node_modules/.bin/module-2')}`, - `${path.join('1st/2nd/node_modules/module-1')}/**`, - `${path.join('1st/2nd/node_modules/.bin/cool-module')}`, - `${path.join('1st/2nd/node_modules/module-2')}/**`, - `${path.join('1st/2nd/node_modules/.bin/module-2')}`, + path.join('node_modules', 'module-1', '**'), + path.join('node_modules', '.bin', 'cool-module'), + path.join('node_modules', 'module-2', '**'), + path.join('node_modules', '.bin/module-2'), + path.join('1st', 'node_modules', 'module-1', '**'), + path.join('1st', 'node_modules', '.bin', 'cool-module'), + path.join('1st', 'node_modules', 'module-2', '**'), + path.join('1st', 'node_modules', '.bin', 'module-2'), + path.join('1st', '2nd', 'node_modules', 'module-1', '**'), + path.join('1st', '2nd', 'node_modules', '.bin', 'cool-module'), + path.join('1st', '2nd', 'node_modules', 'module-2', '**'), + path.join('1st', '2nd', 'node_modules', '.bin', 'module-2'), ]); expect(updatedParams.include).to.deep.equal([ 'user-defined-include-me', From 6886f121c0fcfc0f9f7d25c68e6bd9ef72a9170a Mon Sep 17 00:00:00 2001 From: daviskoh Date: Sun, 15 Oct 2017 20:45:00 -0400 Subject: [PATCH 122/128] remove odd duplicate assignment --- lib/plugins/aws/deploy/lib/extendedValidate.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/plugins/aws/deploy/lib/extendedValidate.test.js b/lib/plugins/aws/deploy/lib/extendedValidate.test.js index 3074f5089..2e453a038 100644 --- a/lib/plugins/aws/deploy/lib/extendedValidate.test.js +++ b/lib/plugins/aws/deploy/lib/extendedValidate.test.js @@ -42,7 +42,6 @@ describe('extendedValidate', () => { }; awsDeploy = new AwsDeploy(serverless, options); awsDeploy.serverless.service.service = `service-${(new Date()).getTime().toString()}`; - awsDeploy.serverless.cli = new serverless.classes.CLI(); awsDeploy.serverless.cli = { log: sinon.spy(), }; From 0db3fe76de7b66089de2e6b647d477c0417ec913 Mon Sep 17 00:00:00 2001 From: daviskoh Date: Mon, 16 Oct 2017 09:14:31 -0400 Subject: [PATCH 123/128] opt for using .reduce instead of awkard .flatten --- lib/plugins/package/lib/zipService.js | 18 +++++++++--------- lib/plugins/package/lib/zipService.test.js | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/plugins/package/lib/zipService.js b/lib/plugins/package/lib/zipService.js index 56ff60a9c..c92733d3c 100644 --- a/lib/plugins/package/lib/zipService.js +++ b/lib/plugins/package/lib/zipService.js @@ -184,7 +184,7 @@ function excludeNodeDevDependencies(servicePath) { return BbPromise .map(dependencies, (item) => item.replace(path.join(servicePath, path.sep), '')) .filter((item) => item.length > 0 && item.match(nodeModulesRegex)) - .map((item) => { + .reduce((globs, item) => { const packagePath = path.join(servicePath, item, 'package.json'); return fs.readFileAsync(packagePath, 'utf-8').then((packageJsonFile) => { const lastIndex = item.lastIndexOf(path.sep) + 1; @@ -194,23 +194,23 @@ function excludeNodeDevDependencies(servicePath) { const packageJson = JSON.parse(packageJsonFile); const bin = packageJson.bin; - let globs = [path.join(item, '**')]; + const baseGlobs = [path.join(item, '**')]; // NOTE: pkg.bin can be object, string, or undefined if (typeof bin === 'object') { - const binGlobs = Object.keys(bin) - .map((executable) => path.join(modulePath, '.bin', executable)); - globs = globs.concat(binGlobs); + _.each(_.keys(bin), (executable) => { + baseGlobs.push(path.join(modulePath, '.bin', executable)); + }); // only 1 executable with same name as lib } else if (typeof bin === 'string') { - globs.push(path.join(modulePath, '.bin', moduleName)); + baseGlobs.push(path.join(modulePath, '.bin', moduleName)); } - return globs; + return globs.concat(baseGlobs); }); - }) + }, []) .then((globs) => { - exAndIn.exclude = exAndIn.exclude.concat(_.flatten(globs)); + exAndIn.exclude = exAndIn.exclude.concat(globs); return exAndIn; }); } diff --git a/lib/plugins/package/lib/zipService.test.js b/lib/plugins/package/lib/zipService.test.js index d7cfac665..c71b2b3fe 100644 --- a/lib/plugins/package/lib/zipService.test.js +++ b/lib/plugins/package/lib/zipService.test.js @@ -232,7 +232,7 @@ describe('zipService', () => { globbySyncStub.returns(filePaths); execAsyncStub.resolves(); - readFileAsyncStub.onCall(0).rejects(); + readFileAsyncStub.onCall(0).resolves(); readFileAsyncStub.onCall(1).rejects(); return expect(packagePlugin.excludeDevDependencies(params)).to.be From d26a4f5c4de60355ddccbaff38ebcc107fb2b1a9 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Mon, 16 Oct 2017 16:52:13 -0700 Subject: [PATCH 124/128] Spotinst - adding Serverless.yml file reference for documentation --- docs/providers/spotinst/README.md | 1 + docs/providers/spotinst/guide/quick-start.md | 2 +- .../spotinst/guide/serverless.yml.md | 51 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 docs/providers/spotinst/guide/serverless.yml.md diff --git a/docs/providers/spotinst/README.md b/docs/providers/spotinst/README.md index 551696812..f43b6c78e 100755 --- a/docs/providers/spotinst/README.md +++ b/docs/providers/spotinst/README.md @@ -26,6 +26,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se
  • Intro
  • Quick Start
  • Credentials
  • +
  • Serverless.yml Reference
  • diff --git a/docs/providers/spotinst/guide/quick-start.md b/docs/providers/spotinst/guide/quick-start.md index 00a17c253..d54d4dc0f 100644 --- a/docs/providers/spotinst/guide/quick-start.md +++ b/docs/providers/spotinst/guide/quick-start.md @@ -1,7 +1,7 @@ diff --git a/docs/providers/spotinst/guide/serverless.yml.md b/docs/providers/spotinst/guide/serverless.yml.md new file mode 100644 index 000000000..81e8f4e9b --- /dev/null +++ b/docs/providers/spotinst/guide/serverless.yml.md @@ -0,0 +1,51 @@ + +# Serverless.yml Reference + +This is an outline of a `serverless.yml` file with descriptions of the properties for reference + +```yml +# serverless.yml + +# The service can be whatever you choose. You can have multiple functions +# under one service + +service: your-service + +# The provider is Spotinst and the Environment ID can be found on the +# Spotinst Console under Functions + +provider: + name: spotinst + spotinst: + environment: #{Your Environment ID} + +# Here is where you will list your functions for this service. Each Function is +# required to have a name, runtime, handler, memory and timeout. The runtime is +# the language that you want to run your function with, the handler tells which +# file and function to run, memory is the amount of memory needed to run your +# function, timeout is the time the function will take to run, if it goes over +# this time it will terminate itself. Access is default set to private so if you +# want to be able to run the function by HTTPS request this needs to be set to +# public. For information on cron functions read the post here. + +functions: + function-name: + runtime: nodejs4.8 + handler: handler.main + memory: 128 + timeout: 30 +# access: public +# cron: +# active: false +# value: '*/1 * * * *' + + +plugins: + - serverless-spotinst-functions +``` \ No newline at end of file From ebcde3b6837a91869b97a407fed6bda8cfceed62 Mon Sep 17 00:00:00 2001 From: horike37 Date: Wed, 18 Oct 2017 01:03:44 +0900 Subject: [PATCH 125/128] update createStack test with using sinon sandbox --- .../aws/deploy/lib/createStack.test.js | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/plugins/aws/deploy/lib/createStack.test.js b/lib/plugins/aws/deploy/lib/createStack.test.js index 898b80618..084625628 100644 --- a/lib/plugins/aws/deploy/lib/createStack.test.js +++ b/lib/plugins/aws/deploy/lib/createStack.test.js @@ -11,6 +11,7 @@ const testUtils = require('../../../../../tests/utils'); describe('createStack', () => { let awsDeploy; + let sandbox; const tmpDirPath = testUtils.getTmpDirPath(); const serverlessYmlPath = path.join(tmpDirPath, 'serverless.yml'); @@ -38,13 +39,21 @@ describe('createStack', () => { awsDeploy.serverless.cli = new serverless.classes.CLI(); }); + beforeEach(() => { + sandbox = sinon.sandbox.create(); + }); + + afterEach(() => { + sandbox.restore(); + }); + describe('#create()', () => { it('should include custom stack tags', () => { awsDeploy.serverless.service.provider.stackTags = { STAGE: 'overridden', tag1: 'value1' }; - const createStackStub = sinon + const createStackStub = sandbox .stub(awsDeploy.provider, 'request').resolves(); - sinon.stub(awsDeploy, 'monitorStack').resolves(); + sandbox.stub(awsDeploy, 'monitorStack').resolves(); return awsDeploy.create().then(() => { expect(createStackStub.args[0][2].Tags) @@ -52,33 +61,29 @@ describe('createStack', () => { { Key: 'STAGE', Value: 'overridden' }, { Key: 'tag1', Value: 'value1' }, ]); - awsDeploy.provider.request.restore(); - awsDeploy.monitorStack.restore(); }); }); it('should use CloudFormation service role ARN if it is specified', () => { awsDeploy.serverless.service.provider.cfnRole = 'arn:aws:iam::123456789012:role/myrole'; - const createStackStub = sinon + const createStackStub = sandbox .stub(awsDeploy.provider, 'request').resolves(); - sinon.stub(awsDeploy, 'monitorStack').resolves(); + sandbox.stub(awsDeploy, 'monitorStack').resolves(); return awsDeploy.create().then(() => { expect(createStackStub.args[0][2].RoleARN) .to.equal('arn:aws:iam::123456789012:role/myrole'); - awsDeploy.provider.request.restore(); - awsDeploy.monitorStack.restore(); }); }); }); describe('#createStack()', () => { it('should resolve if stack already created', () => { - const createStub = sinon + const createStub = sandbox .stub(awsDeploy, 'create').resolves(); - sinon.stub(awsDeploy.provider, 'request').resolves(); + sandbox.stub(awsDeploy.provider, 'request').resolves(); return awsDeploy.createStack().then(() => { expect(createStub.called).to.be.equal(false); @@ -87,7 +92,7 @@ describe('createStack', () => { it('should set the createLater flag and resolve if deployment bucket is provided', () => { awsDeploy.serverless.service.provider.deploymentBucket = 'serverless'; - sinon.stub(awsDeploy.provider, 'request') + sandbox.stub(awsDeploy.provider, 'request') .returns(BbPromise.reject({ message: 'does not exist' })); return awsDeploy.createStack().then(() => { @@ -100,7 +105,7 @@ describe('createStack', () => { message: 'Something went wrong.', }; - sinon.stub(awsDeploy.provider, 'request').rejects(errorMock); + sandbox.stub(awsDeploy.provider, 'request').rejects(errorMock); const createStub = sinon .stub(awsDeploy, 'create').resolves(); @@ -117,7 +122,7 @@ describe('createStack', () => { message: 'does not exist', }; - sinon.stub(awsDeploy.provider, 'request').rejects(errorMock); + sandbox.stub(awsDeploy.provider, 'request').rejects(errorMock); const createStub = sinon .stub(awsDeploy, 'create').resolves(); From 2b08f8a77691827e0210c37156fcd2ce12d5a6f8 Mon Sep 17 00:00:00 2001 From: leoybkim Date: Tue, 17 Oct 2017 15:57:00 -0500 Subject: [PATCH 126/128] Fix typo in aws guide --- docs/providers/aws/guide/variables.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/providers/aws/guide/variables.md b/docs/providers/aws/guide/variables.md index 8de9760ee..b4db4067b 100644 --- a/docs/providers/aws/guide/variables.md +++ b/docs/providers/aws/guide/variables.md @@ -62,7 +62,7 @@ If `sls deploy --stage qa` is ran, the option `stage=qa` is used inside the `${f 1. stage is set to `qa` from the option supplied to the `sls deploy --stage qa` command 2. `${self:provider.stage}` resolves to `qa` and is used in `${file(./config.${self:provider.stage}.json):CREDS}` -3. `${file(./config.qa.stage}.json):CREDS}` is found & the `CREDS` value is read +3. `${file(./config.qa.json):CREDS}` is found & the `CREDS` value is read 4. `MY_SECRET` value is set Likewise, if `sls deploy --stage prod` is ran the `config.prod.json` file would be found and used. @@ -246,7 +246,7 @@ In your `serverless.yml`, depending on the type of your source file, either have functions: hello: handler: handler.hello - events: ${file(./myCustomFile.yml):myevents + events: ${file(./myCustomFile.yml):myevents} ``` or for a JSON reference file use this sytax: @@ -255,7 +255,7 @@ or for a JSON reference file use this sytax: functions: hello: handler: handler.hello - events: ${file(./myCustomFile.json):myevents + events: ${file(./myCustomFile.json):myevents} ``` ## Reference Variables in Javascript Files From 347634e081fc13ea63cdab9d4cb74d1ef250782a Mon Sep 17 00:00:00 2001 From: Daron Yondem Date: Wed, 18 Oct 2017 14:01:53 +0300 Subject: [PATCH 127/128] Default value for Timer Trigger Fixed See: https://github.com/serverless/serverless-azure-functions/blob/629ade76534b82df0977f9e629906ded29a94fce/shared/bindings.json#L32 --- docs/providers/azure/events/timer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers/azure/events/timer.md b/docs/providers/azure/events/timer.md index ff44f911a..929d0bc11 100644 --- a/docs/providers/azure/events/timer.md +++ b/docs/providers/azure/events/timer.md @@ -33,7 +33,7 @@ functions: events: - timer: x-azure-settings: - name: item #, default - "myQueueItem", specifies which name it's available on `context.bindings` + name: timerObj #, default - "myTimer", specifies which name it's available on `context.bindings` schedule: 0 */5 * * * * #, cron expression to run on ``` From ba1c078925379661abe939c49af258c112afee34 Mon Sep 17 00:00:00 2001 From: jeffnoehren Date: Wed, 18 Oct 2017 16:34:43 -0700 Subject: [PATCH 128/128] Spotinst - Updating docs to set up Spotinst credentials --- docs/providers/spotinst/README.md | 1 + .../spotinst/examples/node/README.md | 2 +- .../spotinst/examples/python/README.md | 3 +- .../spotinst/examples/ruby/README.md | 3 +- docs/providers/spotinst/guide/create-token.md | 72 +++++++++++++++++++ docs/providers/spotinst/guide/credentials.md | 66 +++++------------ .../spotinst/guide/serverless.yml.md | 4 +- 7 files changed, 99 insertions(+), 52 deletions(-) create mode 100644 docs/providers/spotinst/guide/create-token.md diff --git a/docs/providers/spotinst/README.md b/docs/providers/spotinst/README.md index f43b6c78e..648396c47 100755 --- a/docs/providers/spotinst/README.md +++ b/docs/providers/spotinst/README.md @@ -25,6 +25,7 @@ If you have questions, join the [chat in gitter](https://gitter.im/serverless/se diff --git a/docs/providers/spotinst/examples/node/README.md b/docs/providers/spotinst/examples/node/README.md index 8765e4235..a238f7512 100644 --- a/docs/providers/spotinst/examples/node/README.md +++ b/docs/providers/spotinst/examples/node/README.md @@ -14,7 +14,7 @@ layout: Doc Make sure `serverless` is installed. ## 1. Create a service -`serverless create --template spotinst-nodejs --path serviceName` `serviceName` is going to be a new directory there the python template will be loaded. Once the download is complete change into that directory +`serverless create --template spotinst-nodejs --path serviceName` `serviceName` is going to be a new directory there the python template will be loaded. Once the download is complete change into that directory. Next you will need to install the Spotinst Serverless Functions plugin by running `npm install` in the root directory ## 2. Deploy `serverless deploy` diff --git a/docs/providers/spotinst/examples/python/README.md b/docs/providers/spotinst/examples/python/README.md index 7bdf7e558..fe3c8e1ee 100644 --- a/docs/providers/spotinst/examples/python/README.md +++ b/docs/providers/spotinst/examples/python/README.md @@ -14,7 +14,8 @@ layout: Doc Make sure `serverless` is installed. ## 1. Create a service -`serverless create --template spotinst-python --path serviceName` `serviceName` is going to be a new directory there the python template will be loaded. Once the download is complete change into that directory +`serverless create --template spotinst-python --path serviceName` `serviceName` is going to be a new directory there the python template will be loaded. Once the download is complete change into that directory. Next you will need to install the Spotinst Serverless Functions plugin by running `npm install` in the root directory + ## 2. Deploy `serverless deploy` diff --git a/docs/providers/spotinst/examples/ruby/README.md b/docs/providers/spotinst/examples/ruby/README.md index 5276f68ca..39789b49b 100644 --- a/docs/providers/spotinst/examples/ruby/README.md +++ b/docs/providers/spotinst/examples/ruby/README.md @@ -14,7 +14,8 @@ layout: Doc Make sure `serverless` is installed. ## 1. Create a service -`serverless create --template spotinst-ruby --path serviceName` `serviceName` is going to be a new directory there the python template will be loaded. Once the download is complete change into that directory +`serverless create --template spotinst-ruby --path serviceName` `serviceName` is going to be a new directory there the python template will be loaded. Once the download is complete change into that directory. Next you will need to install the Spotinst Serverless Functions plugin by running `npm install` in the root directory + ## 2. Deploy `serverless deploy` diff --git a/docs/providers/spotinst/guide/create-token.md b/docs/providers/spotinst/guide/create-token.md new file mode 100644 index 000000000..9fbaf1d9b --- /dev/null +++ b/docs/providers/spotinst/guide/create-token.md @@ -0,0 +1,72 @@ + + + +### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/spotinst/guide/credentials) + + +# Spotinst Functions - Create Token + +The Serverless Framework needs access to your Spotinst account so that it can create and manage resources on your behalf. To do this you will need either a permanent or tempary token that is linked to your account + +## Create a Permanent Token + +You can generate a Permanent Token from the [Spotinst Console](https://console.spotinst.com/#/settings/tokens/permanent). + +> `WARNING`: Do not share your personal access token or your application secret with anyone outside your organization. Please contact our support if you’re concerned your token has been compromised. + +## Temporary Access Token +You can also generate a the temporary access token, which is only valid for 2 hours (7200 seconds). + +You can generate a temporary token from the [Spotinst Console](https://console.spotinst.com/#/settings/tokens/temporary). Or, using the below command: + +```bash +$ curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'username=&password=&grant_type=password&client_id=&client_secret=' https://oauth.spotinst.io/token +``` + +Replace the following parameters, more info can be found [here](https://console.spotinst.com/#/settings/tokens/temporary) + - `` + - `` + - `` + - `` + +The request will return two tokens: +```json +{ + "request": { + "id": "a2285a3f-4950-4874-a931-1ee1cdf33012", + "url": "/token", + "method": "POST", + "timestamp": "2017-08-30T22:00:34.610Z" + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "kind": "spotinst:oauth2:token", + "items": [ + { + "accessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzcG90aW5zdCIsInVpZCI6LTgsIm9pZCI6NjA2MDc5ODYxOTExLCJyb2xlIjoyLCJleHAiOjE1MDQxMzc2MzQsImlhdCI6MTUwNDEzMDQzNH0.xyax", + "tokenType": "bearer", + "expiresIn": 7199 + } + ], + "count": 1 + } +} +``` + +* *accessToken* - Use this token when making calls to Spotinst API +* *refreshToken* - Use this token in order to refresh the temporary token. This will return a new token that is valid for additional 2 hours: + + +```bash +$ curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'refresh_token=&grant_type=refresh_token&client_id=&client_secret=' https://api.spotinst.io/token +``` + diff --git a/docs/providers/spotinst/guide/credentials.md b/docs/providers/spotinst/guide/credentials.md index 6266c551c..c42e86a5e 100644 --- a/docs/providers/spotinst/guide/credentials.md +++ b/docs/providers/spotinst/guide/credentials.md @@ -1,7 +1,7 @@ @@ -12,60 +12,32 @@ layout: Doc # Spotinst Functions - Credentials -The Serverless Framework needs access to your Spotinst account so that it can create and manage resources on your behalf. +The Serverless Framework needs access to your Spotinst account so that it can create and manage resources on your behalf. Please make sure you have created and saved your Permanent or Temporary Token before continuing. -## Create a Permanent Token +## Configure Credentials -You can generate a Permanent Token from the [Spotinst Console](https://console.spotinst.com/#/settings/tokens/permanent). +You will need to have your account ID number and your account token ready. Your account ID can be found on the Spotinst console and your token can be generated by following the [Create Token Guide](./create-token.md). -> `WARNING`: Do not share your personal access token or your application secret with anyone outside your organization. Please contact our support if you’re concerned your token has been compromised. +In order to run the config credentials command from the terminal you will need to start a new Spotinst project and install the plugin. First you will need to run the create a new project using the Spotinst template. To do this run: -## Temporary Access Token -You can also generate a the temporary access token, which is only valid for 2 hours (7200 seconds). - -You can generate a temporary token from the [Spotinst Console](https://console.spotinst.com/#/settings/tokens/temporary). Or, using the below command: - -```bash -$ curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'username=&password=&grant_type=password&client_id=&client_secret=' https://oauth.spotinst.io/token +``` +serverless create -t spotinst-nodejs -p new-function ``` -Replace the following parameters, more info can be found [here](https://console.spotinst.com/#/settings/tokens/temporary) - - `` - - `` - - `` - - `` +Then navigate to the directory that was just created `new-function` and install the Spotinst Serverless Plugin by running the `npm install` command. -The request will return two tokens: -```json -{ - "request": { - "id": "a2285a3f-4950-4874-a931-1ee1cdf33012", - "url": "/token", - "method": "POST", - "timestamp": "2017-08-30T22:00:34.610Z" - }, - "response": { - "status": { - "code": 200, - "message": "OK" - }, - "kind": "spotinst:oauth2:token", - "items": [ - { - "accessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzcG90aW5zdCIsInVpZCI6LTgsIm9pZCI6NjA2MDc5ODYxOTExLCJyb2xlIjoyLCJleHAiOjE1MDQxMzc2MzQsImlhdCI6MTUwNDEzMDQzNH0.xyax", - "tokenType": "bearer", - "expiresIn": 7199 - } - ], - "count": 1 - } -} +Once this has completed you will be able to configure your credentials by running + +``` +serverless config credentials -p spotinst -k {your account number} -t {your token} ``` -* *accessToken* - Use this token when making calls to Spotinst API -* *refreshToken* - Use this token in order to refresh the temporary token. This will return a new token that is valid for additional 2 hours: +This will create a ~/.spotinst/credentials file the file should look like this when if done correctly: +``` +default: + token: {your token} + account: {your account number} +``` -```bash -$ curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'refresh_token=&grant_type=refresh_token&client_id=&client_secret=' https://api.spotinst.io/token -``` \ No newline at end of file +After this is set up properly you will be able to deploy functions from your computer and monitor them on the Spotinst Console. diff --git a/docs/providers/spotinst/guide/serverless.yml.md b/docs/providers/spotinst/guide/serverless.yml.md index 81e8f4e9b..5c60b26b2 100644 --- a/docs/providers/spotinst/guide/serverless.yml.md +++ b/docs/providers/spotinst/guide/serverless.yml.md @@ -1,7 +1,7 @@ @@ -48,4 +48,4 @@ functions: plugins: - serverless-spotinst-functions -``` \ No newline at end of file +```