From ee3c4aa1bdca551b6c30b41e79857f916c30dc7a Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Sat, 29 Sep 2018 15:46:23 -0600 Subject: [PATCH 01/12] Installed standard and linted files Also audited and fixed vulnerabilities --- .vscode/settings.json | 4 + examples/scratch.js | 38 +- hooks/post-version.js | 30 +- hooks/pre-test.js | 39 +- index.js | 4 +- lib/primitives/AWSResource.js | 84 +- lib/primitives/AWSService.js | 232 +-- lib/primitives/Dynamic.js | 84 +- lib/primitives/Utility.js | 158 +- lib/primitives/index.js | 12 +- lib/services/acm/ACM.js | 190 +-- lib/services/acm/Certificate.js | 92 +- lib/services/acm/index.js | 4 +- lib/services/ecs/Cluster.js | 346 ++-- lib/services/ecs/ContainerInstance.js | 98 +- lib/services/ecs/ECS.js | 246 +-- lib/services/ecs/Service.js | 48 +- lib/services/ecs/Task.js | 106 +- lib/services/ecs/TaskDefinition.js | 110 +- lib/services/ecs/index.js | 4 +- lib/services/index.js | 16 +- lib/services/route53/ChangeBatch.js | 66 +- lib/services/route53/RecordSet.js | 128 +- lib/services/route53/Route53.js | 200 +-- lib/services/route53/Zone.js | 94 +- lib/services/route53/index.js | 4 +- lib/services/s3/Bucket.js | 122 +- lib/services/s3/Item.js | 44 +- lib/services/s3/S3.js | 66 +- lib/services/s3/index.js | 4 +- lib/services/ses/Email.js | 240 +-- lib/services/ses/SES.js | 44 +- lib/services/ses/index.js | 4 +- lib/services/sqs/Message.js | 144 +- lib/services/sqs/Queue.js | 154 +- lib/services/sqs/SQS.js | 84 +- lib/services/sqs/index.js | 4 +- package-lock.json | 2125 +++++++++++++++++++++++++ package.json | 7 +- test/primitives/AWSResource.spec.js | 16 +- test/primitives/AWSService.spec.js | 16 +- test/primitives/Dynamic.spec.js | 16 +- test/primitives/Utility.spec.js | 16 +- test/services/ACM.spec.js | 196 +-- test/services/ECS.spec.js | 309 ++-- test/services/Route53.spec.js | 100 +- test/services/S3.spec.js | 88 +- test/services/SES.spec.js | 195 ++- test/services/SQS.spec.js | 129 +- 49 files changed, 4341 insertions(+), 2219 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 package-lock.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..cabf6b9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.tabSize": 2, + "editor.renderWhitespace": "all" +} \ No newline at end of file diff --git a/examples/scratch.js b/examples/scratch.js index 03bfc8c..9f07fb6 100644 --- a/examples/scratch.js +++ b/examples/scratch.js @@ -1,24 +1,24 @@ -'use strict'; +'use strict' -const fs = require('fs'); -const uuid = require('uuid'); +const fs = require('fs') +const uuid = require('uuid') -const { S3, SQS, Route53, ECS, ACM } = require('../lib/services'); +const { S3, SQS, Route53, ECS, ACM } = require('../lib/services') -const r53 = new Route53(); +const r53 = new Route53() const params = { - Name: 'somethingfancy-bowtie.io', - CallerReference: uuid.v1() -}; + Name: 'somethingfancy-bowtie.io', + CallerReference: uuid.v1() +} r53.createZone(params, zone => { - console.log(zone); + console.log(zone) - zone.delete(resp => { - console.log(resp); - }); -}); + zone.delete(resp => { + console.log(resp) + }) +}) // const acm = new ACM({ // region: process.env.AWS_DEFAULT_REGION || 'us-east-1' @@ -34,8 +34,6 @@ r53.createZone(params, zone => { // console.log(cert); // }); - - // var params = { // Certificate: fs.readFileSync('cert.pem'), /* required */ // PrivateKey: fs.readFileSync('privkey.pem'), /* required */ @@ -63,9 +61,9 @@ r53.createZone(params, zone => { // // }); // ecs.newCluster({ clusterName: 'bowtie-v1-test' }, cluster => { -// ecs.getTaskDefinitions({ -// maxResults: 1, -// familyPrefix: 'family-prefix' +// ecs.getTaskDefinitions({ +// maxResults: 1, +// familyPrefix: 'family-prefix' // }, taskDefinitions => { // console.log(`Found ${taskDefinitions.length} task definition(s)`); @@ -99,8 +97,6 @@ r53.createZone(params, zone => { // }); // }); - - // ecs.getClusters(clusters => { // // console.log(clusters); // console.log(`Found ${clusters.length} cluster(s)!\n\n`); @@ -166,7 +162,7 @@ r53.createZone(params, zone => { // recordSet.upsert(resp => { // Route53.log('Upserted record set!'); - + // recordSet.delete(resp => { // Route53.log('Deleted record set!'); // }); diff --git a/hooks/post-version.js b/hooks/post-version.js index 3cc9749..87303fc 100644 --- a/hooks/post-version.js +++ b/hooks/post-version.js @@ -1,19 +1,19 @@ -'use strict'; +'use strict' -const path = require('path'); -const replace = require('replace'); -const rootDir = path.join(__dirname, '..'); -const packageInfo = require(path.join(rootDir, 'package.json')); +const path = require('path') +const replace = require('replace') +const rootDir = path.join(__dirname, '..') +const packageInfo = require(path.join(rootDir, 'package.json')) -console.log(`Updating markdown files with tagged TravisCI badge to version: "${packageInfo.version}"`); +console.log(`Updating markdown files with tagged TravisCI badge to version: "${packageInfo.version}"`) replace({ - regex: /(https\:\/\/travis\-ci\.org\/cmr1\/node-aws\.svg\?branch\=|\|\s*)v[0-9]+\.[0-9]+\.[0-9]+(\s*\|)?/g, - replacement: `$1v${packageInfo.version}$2`, - paths: [ - rootDir - ], - include: '*.md', - recursive: true, - silent: false -}); + regex: /(https\:\/\/travis\-ci\.org\/cmr1\/node-aws\.svg\?branch\=|\|\s*)v[0-9]+\.[0-9]+\.[0-9]+(\s*\|)?/g, + replacement: `$1v${packageInfo.version}$2`, + paths: [ + rootDir + ], + include: '*.md', + recursive: true, + silent: false +}) diff --git a/hooks/pre-test.js b/hooks/pre-test.js index 643c265..2414edc 100644 --- a/hooks/pre-test.js +++ b/hooks/pre-test.js @@ -1,9 +1,9 @@ -'use strict'; +'use strict' -const fs = require('fs'); -const Cmr1Cli = require('cmr1-cli'); +const fs = require('fs') +const Cmr1Cli = require('cmr1-cli') -const cli = new Cmr1Cli(); +const cli = new Cmr1Cli() const aws_env_groups = [ [ @@ -13,34 +13,33 @@ const aws_env_groups = [ 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY' ] -]; +] -function succeed(env_group) { - - cli.success(`Using AWS credentials defined by: ${env_group.join(' & ')}`); - process.exit(0); +function succeed (env_group) { + cli.success(`Using AWS credentials defined by: ${env_group.join(' & ')}`) + process.exit(0) } -function fail() { - cli.warn("Locate the missing CMR1 Travis CI AWS account keys, and export as ENV variables before testing."); - cli.error("Unable to find CMR1 AWS test account credentials!"); +function fail () { + cli.warn('Locate the missing CMR1 Travis CI AWS account keys, and export as ENV variables before testing.') + cli.error('Unable to find CMR1 AWS test account credentials!') - process.exit(1); + process.exit(1) } aws_env_groups.forEach(env_group => { - let is_valid = true; + let is_valid = true env_group.forEach(env_var => { if (typeof process.env[env_var] === 'undefined' || process.env[env_var].trim() === '') { - cli.warn(`Unable to find '${env_var}' in environment.`); - is_valid = false; + cli.warn(`Unable to find '${env_var}' in environment.`) + is_valid = false } - }); + }) if (is_valid) { - succeed(env_group); + succeed(env_group) } -}); +}) -fail(); \ No newline at end of file +fail() diff --git a/index.js b/index.js index c0b5df2..1b99d80 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,3 @@ -'use strict'; +'use strict' -module.exports = require('./lib/services'); \ No newline at end of file +module.exports = require('./lib/services') diff --git a/lib/primitives/AWSResource.js b/lib/primitives/AWSResource.js index 17cd185..d884aad 100644 --- a/lib/primitives/AWSResource.js +++ b/lib/primitives/AWSResource.js @@ -1,62 +1,62 @@ -'use strict'; +'use strict' -const AWSService = require('./AWSService'); -const Dynamic = require('./Dynamic'); +const AWSService = require('./AWSService') +const Dynamic = require('./Dynamic') class AWSResource extends Dynamic { - constructor() { - super(...arguments); - - const { service, resource, properties } = AWSResource.getArgs(arguments, { - 'object': (obj) => { - if (obj instanceof AWSService) { - return 'service'; - } else if (obj instanceof AWSResource) { - return 'resource'; - } - - return 'properties'; - } - }); - - if (resource) { - this.defaultParams = Object.assign({}, this.defaultParams, resource.defaultParams); + constructor () { + super(...arguments) + + const { service, resource, properties } = AWSResource.getArgs(arguments, { + 'object': (obj) => { + if (obj instanceof AWSService) { + return 'service' + } else if (obj instanceof AWSResource) { + return 'resource' } - this.parent = resource || service; + return 'properties' + } + }) - this.service = service || resource.service; + if (resource) { + this.defaultParams = Object.assign({}, this.defaultParams, resource.defaultParams) + } - if (!this.service) { - AWSResource.error(`Missing service for resource: ${this.name}!`); - } + this.parent = resource || service + + this.service = service || resource.service - AWSResource.debug(`Creating AWS ${this.name} resource for ${this.service.name} service`); + if (!this.service) { + AWSResource.error(`Missing service for resource: ${this.name}!`) + } - this.setProperties(properties); + AWSResource.debug(`Creating AWS ${this.name} resource for ${this.service.name} service`) - const nameAlias =`${this.constructor.name.toLowerCase()}Name`; + this.setProperties(properties) - if (typeof this[nameAlias] === 'string') { - this.name = this[nameAlias]; - } + const nameAlias = `${this.constructor.name.toLowerCase()}Name` - this.buildMethods(); + if (typeof this[nameAlias] === 'string') { + this.name = this[nameAlias] } - setProperties(properties, safe = true) { - if (typeof properties === 'object') { - this.properties = Object.assign({}, properties); + this.buildMethods() + } - Object.keys(this.properties).forEach(key => { - if (safe && typeof this[key] !== 'undefined') { - AWSResource.error(`Conflicting property key: '${key}'`); - } + setProperties (properties, safe = true) { + if (typeof properties === 'object') { + this.properties = Object.assign({}, properties) - this[key] = this.properties[key]; - }); + Object.keys(this.properties).forEach(key => { + if (safe && typeof this[key] !== 'undefined') { + AWSResource.error(`Conflicting property key: '${key}'`) } + + this[key] = this.properties[key] + }) } + } } -module.exports = AWSResource; +module.exports = AWSResource diff --git a/lib/primitives/AWSService.js b/lib/primitives/AWSService.js index 5709030..7a101ef 100644 --- a/lib/primitives/AWSService.js +++ b/lib/primitives/AWSService.js @@ -1,158 +1,158 @@ -'use strict'; +'use strict' -const async = require('async'); -const AWS = require('aws-sdk'); -const Dynamic = require('./Dynamic'); +const async = require('async') +const AWS = require('aws-sdk') +const Dynamic = require('./Dynamic') class AWSService extends Dynamic { - constructor() { - super(...arguments); + constructor () { + super(...arguments) - this.autoPaginate = true; + this.autoPaginate = true - AWSService.debug(`Creating AWS ${this.name} service`); + AWSService.debug(`Creating AWS ${this.name} service`) - let awsArgs = {}; + let awsArgs = {} - const { params } = AWSService.getArgs(arguments); + const { params } = AWSService.getArgs(arguments) - if (params) { - awsArgs = params - } - - if (!awsArgs.region) { - if (process.env.AWS_DEFAULT_REGION) { - awsArgs.region = process.env.AWS_DEFAULT_REGION; - } else if (process.env.AWS_REGION) { - awsArgs.region = process.env.AWS_REGION; - } else { - AWSService.debug(`Unable to set region for service: ${this.name}`); - } - } - - this.handler = (typeof AWS[this.name] === 'function') ? new AWS[this.name](awsArgs) : null; - - this.buildMethods(); + if (params) { + awsArgs = params } - hasMethod(method) { - return typeof method === 'string' && typeof this.handler[method] === 'function'; + if (!awsArgs.region) { + if (process.env.AWS_DEFAULT_REGION) { + awsArgs.region = process.env.AWS_DEFAULT_REGION + } else if (process.env.AWS_REGION) { + awsArgs.region = process.env.AWS_REGION + } else { + AWSService.debug(`Unable to set region for service: ${this.name}`) + } } - reduceResponses(responses = []) { - if (!Array.isArray(responses)) { - AWSService.error('Can only reduce Arrays!'); - } + this.handler = (typeof AWS[this.name] === 'function') ? new AWS[this.name](awsArgs) : null - AWSService.debug('Reducing ' + responses.length + ' responses'); + this.buildMethods() + } - if (responses.length === 1) { - AWSService.debug('Returning single response'); - return responses[0]; - } else if (responses.length > 1) { - AWSService.debug('Collapsing immediate arrays...'); + hasMethod (method) { + return typeof method === 'string' && typeof this.handler[method] === 'function' + } - const template = responses[0]; - - for (let i=1; i { - if (Array.isArray(template[key]) && Array.isArray(response[key])) { - template[key] = template[key].concat(response[key]); - } - }); - } + AWSService.debug('Reducing ' + responses.length + ' responses') - return template; - } + if (responses.length === 1) { + AWSService.debug('Returning single response') + return responses[0] + } else if (responses.length > 1) { + AWSService.debug('Collapsing immediate arrays...') - AWSService.warn('Unable to reduce responses!'); + const template = responses[0] - return {}; - } + for (let i = 1; i < responses.length; i++) { + const response = responses[i] - generic() { - const { method, params, callback, required } = AWSService.getArgs(arguments); + Object.keys(template).forEach(key => { + if (Array.isArray(template[key]) && Array.isArray(response[key])) { + template[key] = template[key].concat(response[key]) + } + }) + } - if (required) { - AWSService.requireParams(params, required); - } - - if (typeof callback !== 'function') { - AWSService.warn(`Executing generic method '${method}' without callback!`); - } + return template + } - AWSService.debug('Executing method:', method, 'with params:', params); + AWSService.warn('Unable to reduce responses!') - let isFinished = true; + return {} + } - const responses = []; + generic () { + const { method, params, callback, required } = AWSService.getArgs(arguments) - async.doWhilst( - (next) => { - this.exec(method, params).then(data => { - AWSService.debug('Result:', data); + if (required) { + AWSService.requireParams(params, required) + } - responses.push(data); + if (typeof callback !== 'function') { + AWSService.warn(`Executing generic method '${method}' without callback!`) + } - isFinished = !this.autoPaginate || (this.autoPaginate && !(data.IsTruncated || data.nextToken)); + AWSService.debug('Executing method:', method, 'with params:', params) - if (data.IsTruncated) { - AWSService.debug('Result is truncated'); + let isFinished = true - let nextMarker = data.NextMarker; + const responses = [] - if (typeof nextMarker !== 'string') { - nextMarker = data.Contents[data.Contents.length - 1].Key; - } + async.doWhilst( + (next) => { + this.exec(method, params).then(data => { + AWSService.debug('Result:', data) - AWSService.debug('Load nextMarker:', nextMarker); + responses.push(data) - params.Marker = nextMarker; - } else if (data.nextToken) { - AWSService.debug('Result is truncated'); + isFinished = !this.autoPaginate || (this.autoPaginate && !(data.IsTruncated || data.nextToken)) - AWSService.debug('Load nextToken:', data.nextToken); + if (data.IsTruncated) { + AWSService.debug('Result is truncated') - params.nextToken = data.nextToken; - } + let nextMarker = data.NextMarker - next(); - }).catch(AWSService.error); - }, - () => { - return !isFinished; - }, - (err) => { - if (typeof callback === 'function') { - callback(this.reduceResponses(responses)); - } + if (typeof nextMarker !== 'string') { + nextMarker = data.Contents[data.Contents.length - 1].Key } - ); - } - exec() { - const { method, params } = AWSService.getArgs(arguments); + AWSService.debug('Load nextMarker:', nextMarker) - return new Promise((resolve, reject) => { - if (typeof this.handler[method] !== 'function') { - reject(`Invalid service method: ${this.name}:${method}`); - } + params.Marker = nextMarker + } else if (data.nextToken) { + AWSService.debug('Result is truncated') - if (typeof params !== 'object') { - reject('Invalid params'); - } + AWSService.debug('Load nextToken:', data.nextToken) - this.handler[method](params, (err, data) => { - if (err) { - reject(err); - } else { - resolve(data); - } - }); - }); - } + params.nextToken = data.nextToken + } + + next() + }).catch(AWSService.error) + }, + () => { + return !isFinished + }, + (err) => { + if (typeof callback === 'function') { + callback(this.reduceResponses(responses)) + } + } + ) + } + + exec () { + const { method, params } = AWSService.getArgs(arguments) + + return new Promise((resolve, reject) => { + if (typeof this.handler[method] !== 'function') { + reject(`Invalid service method: ${this.name}:${method}`) + } + + if (typeof params !== 'object') { + reject('Invalid params') + } + + this.handler[method](params, (err, data) => { + if (err) { + reject(err) + } else { + resolve(data) + } + }) + }) + } } -module.exports = AWSService; +module.exports = AWSService diff --git a/lib/primitives/Dynamic.js b/lib/primitives/Dynamic.js index 3938340..50f0215 100644 --- a/lib/primitives/Dynamic.js +++ b/lib/primitives/Dynamic.js @@ -1,62 +1,62 @@ -'use strict'; +'use strict' -const Utility = require('./Utility'); +const Utility = require('./Utility') class Dynamic extends Utility { - constructor() { - super(); + constructor () { + super() - const { name } = Dynamic.getArgs(arguments, { - 'string': 'name' - }); + const { name } = Dynamic.getArgs(arguments, { + 'string': 'name' + }) - this.name = name || this.constructor.name; - this.defaultParams = {}; - } - - setDefaultParams() { - const { params } = Dynamic.getArgs(arguments); + this.name = name || this.constructor.name + this.defaultParams = {} + } - Dynamic.debug('Setting default params:', params); + setDefaultParams () { + const { params } = Dynamic.getArgs(arguments) - this.defaultParams = Object.assign({}, this.defaultParams, params); - } + Dynamic.debug('Setting default params:', params) - buildMethods() { - let service = this; + this.defaultParams = Object.assign({}, this.defaultParams, params) + } - if (this.service) { - service = this.service; - } + buildMethods () { + let service = this - this.supportedMethods().forEach(methodConfig => { - Dynamic.requireParams(methodConfig, ['method']); + if (this.service) { + service = this.service + } - const { method, params, required } = Dynamic.getArgs(methodConfig); + this.supportedMethods().forEach(methodConfig => { + Dynamic.requireParams(methodConfig, ['method']) - const autoParams = Object.assign({}, params); + const { method, params, required } = Dynamic.getArgs(methodConfig) - Dynamic.debug(`Building method '${method}' for '${this.name}`, autoParams); + const autoParams = Object.assign({}, params) - if (service.hasMethod(method)) { - this[method] = (...args) => { - const { params, callback } = Dynamic.getArgs(args); + Dynamic.debug(`Building method '${method}' for '${this.name}`, autoParams) - const compiledParams = Object.assign({}, this.defaultParams, autoParams, params); + if (service.hasMethod(method)) { + this[method] = (...args) => { + const { params, callback } = Dynamic.getArgs(args) - Dynamic.debug(`Calling generic execution for method '${method}' with params:`, compiledParams); + const compiledParams = Object.assign({}, this.defaultParams, autoParams, params) - service.generic(method, compiledParams, callback, required); - } - } else { - Dynamic.warn(`Invalid method '${method}' for this ${this.name}`); - } - }); - } + Dynamic.debug(`Calling generic execution for method '${method}' with params:`, compiledParams) - supportedMethods() { - return []; - } + service.generic(method, compiledParams, callback, required) + } + } else { + Dynamic.warn(`Invalid method '${method}' for this ${this.name}`) + } + }) + } + + supportedMethods () { + return [] + } } -module.exports = Dynamic; +module.exports = Dynamic diff --git a/lib/primitives/Utility.js b/lib/primitives/Utility.js index 02f2113..fdaabf6 100644 --- a/lib/primitives/Utility.js +++ b/lib/primitives/Utility.js @@ -1,106 +1,106 @@ -'use strict'; +'use strict' -const colors = require('colors/safe'); +const colors = require('colors/safe') const defaultArgTypes = { - 'string': 'method', - 'function': 'callback', - 'object': (obj) => { return Array.isArray(obj) ? 'required' : 'params' } -}; + 'string': 'method', + 'function': 'callback', + 'object': (obj) => { return Array.isArray(obj) ? 'required' : 'params' } +} -let isVerbose = false; +let isVerbose = false class Utility { - static verbose() { - Utility.setVerbose(true); - } + static verbose () { + Utility.setVerbose(true) + } - static setVerbose(verbose) { - isVerbose = !!verbose; - } - - static toggleVerbose() { - isVerbose = !isVerbose; - } + static setVerbose (verbose) { + isVerbose = !!verbose + } - static getArgs(args, types = {}) { - const typeMap = Object.assign({}, defaultArgTypes, types); + static toggleVerbose () { + isVerbose = !isVerbose + } - const parsed = {}; + static getArgs (args, types = {}) { + const typeMap = Object.assign({}, defaultArgTypes, types) - Object.keys(args).forEach(index => { - const argValue = args[index]; - const argType = typeof argValue; + const parsed = {} - if (typeMap[argType]) { - const argName = typeMap[argType]; + Object.keys(args).forEach(index => { + const argValue = args[index] + const argType = typeof argValue - if (typeof argName === 'string') { - parsed[argName] = argValue; - } else if (typeof argName === 'function') { - const argKey = argName(argValue); - parsed[argKey] = argValue; - } else if (typeof argName !== 'boolean') { - Utility.error(`Invalid arg name for type: ${argType}! Arg name must be string or function.`); - } - } else if (argType !== 'undefined') { - Utility.warn('Unknown argument type: ', argType); - } - }); + if (typeMap[argType]) { + const argName = typeMap[argType] - // Utility.debug('Processing raw args:', args); - // Utility.debug('Parsed args:', parsed); - - return parsed; - } - - static colorize(args, color) { - if (typeof colors[color] === 'function') { - Object.keys(args).forEach(key => { - if (typeof args[key] === 'string') { - args[key] = colors[color](args[key]); - } - }); + if (typeof argName === 'string') { + parsed[argName] = argValue + } else if (typeof argName === 'function') { + const argKey = argName(argValue) + parsed[argKey] = argValue + } else if (typeof argName !== 'boolean') { + Utility.error(`Invalid arg name for type: ${argType}! Arg name must be string or function.`) } - - return args; + } else if (argType !== 'undefined') { + Utility.warn('Unknown argument type: ', argType) + } + }) + + // Utility.debug('Processing raw args:', args); + // Utility.debug('Parsed args:', parsed); + + return parsed + } + + static colorize (args, color) { + if (typeof colors[color] === 'function') { + Object.keys(args).forEach(key => { + if (typeof args[key] === 'string') { + args[key] = colors[color](args[key]) + } + }) } - static dateString() { - let stamp = new Date().toISOString(); + return args + } - return `[${stamp}] `; - } + static dateString () { + let stamp = new Date().toISOString() - static log() { - console.log(Utility.dateString(),...Utility.colorize(arguments, 'green')); - } + return `[${stamp}] ` + } - static warn() { - console.warn(Utility.dateString(),colors.yellow('WARN: '), ...Utility.colorize(arguments, 'yellow')); - } + static log () { + console.log(Utility.dateString(), ...Utility.colorize(arguments, 'green')) + } - static debug() { - if (isVerbose) { - Utility.log(colors.cyan('DEBUG: '), ...Utility.colorize(arguments, 'cyan')); - } + static warn () { + console.warn(Utility.dateString(), colors.yellow('WARN: '), ...Utility.colorize(arguments, 'yellow')) + } + + static debug () { + if (isVerbose) { + Utility.log(colors.cyan('DEBUG: '), ...Utility.colorize(arguments, 'cyan')) } + } - static error() { - const err_msg = (typeof arguments[0] === 'string' ? arguments[0] : 'Unknown error'); + static error () { + const err_msg = (typeof arguments[0] === 'string' ? arguments[0] : 'Unknown error') - console.error(Utility.dateString(),colors.red('ERROR: '), ...Utility.colorize(arguments, 'red')); + console.error(Utility.dateString(), colors.red('ERROR: '), ...Utility.colorize(arguments, 'red')) - throw new Error(err_msg); - } + throw new Error(err_msg) + } - static requireParams(params, requiredKeys = []) { - requiredKeys.forEach(key => { - if (typeof params[key] === 'undefined') { - Utility.error(`Missing required parameter: '${key}'`); - } - }); - } + static requireParams (params, requiredKeys = []) { + requiredKeys.forEach(key => { + if (typeof params[key] === 'undefined') { + Utility.error(`Missing required parameter: '${key}'`) + } + }) + } } -module.exports = Utility; +module.exports = Utility diff --git a/lib/primitives/index.js b/lib/primitives/index.js index 174cc4d..7a49a0e 100644 --- a/lib/primitives/index.js +++ b/lib/primitives/index.js @@ -1,8 +1,8 @@ -'use strict'; +'use strict' module.exports = { - Utility: require('./Utility'), - Dynamic: require('./Dynamic'), - AWSService: require('./AWSService'), - AWSResource: require('./AWSResource') -}; \ No newline at end of file + Utility: require('./Utility'), + Dynamic: require('./Dynamic'), + AWSService: require('./AWSService'), + AWSResource: require('./AWSResource') +} diff --git a/lib/services/acm/ACM.js b/lib/services/acm/ACM.js index e26315f..21c14ba 100644 --- a/lib/services/acm/ACM.js +++ b/lib/services/acm/ACM.js @@ -1,105 +1,105 @@ -'use strict'; +'use strict' -const path = require('path'); -const async = require('async'); +const path = require('path') +const async = require('async') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSService = require(primitivesPath).AWSService; -const Certificate = require('./Certificate'); +const AWSService = require(primitivesPath).AWSService +const Certificate = require('./Certificate') class ACM extends AWSService { - constructor() { - super(...arguments); - } - - createCertificate() { - const { params, callback } = ACM.getArgs(arguments); - - this.importCertificate(params, response => { - return callback(new Certificate(response, this)); - }); - } - - createOrUpdateCert() { - const { domain, params, callback } = ACM.getArgs(arguments, { - 'string': 'domain' - }); - - if (typeof domain === 'string' && domain.trim() !== '') { - this.getCertByDomain(domain, cert => { - if (cert) { - cert.update(params, callback); - } else { - this.createCertificate(params, callback); - } - }); + constructor () { + super(...arguments) + } + + createCertificate () { + const { params, callback } = ACM.getArgs(arguments) + + this.importCertificate(params, response => { + return callback(new Certificate(response, this)) + }) + } + + createOrUpdateCert () { + const { domain, params, callback } = ACM.getArgs(arguments, { + 'string': 'domain' + }) + + if (typeof domain === 'string' && domain.trim() !== '') { + this.getCertByDomain(domain, cert => { + if (cert) { + cert.update(params, callback) } else { - this.createCertificate(params, callback); + this.createCertificate(params, callback) } + }) + } else { + this.createCertificate(params, callback) } - - getCertByDomain() { - const { domain, callback } = ACM.getArgs(arguments, { - 'string': 'domain' - }); - - this.getCertificates(certs => { - const filtered = certs.filter(c => { return c.DomainName === domain }); - - const cert = filtered.length > 0 ? filtered[0] : null; - - return callback(cert); - }); - } - - getCertificates() { - const { params, callback } = ACM.getArgs(arguments); - - this.listCertificates(params, response => { - const certificates = []; - - if (response.CertificateSummaryList) { - response.CertificateSummaryList.forEach(cert => { - certificates.push(new Certificate(cert, this)); - }); - } - - return callback(certificates); - }); - } - - supportedMethods() { - return [ - { - method: 'deleteCertificate', - required: [ - 'CertificateArn' - ] - }, - { - method: 'getCertificate', - required: [ - 'CertificateArn' - ] - }, - { - method: 'importCertificate', - required: [ - 'Certificate', - 'PrivateKey' - ] - }, - { - method: 'listCertificates', - // CertificateStatuses - } - ]; - } - - static get Certificate() { - return Certificate - } + } + + getCertByDomain () { + const { domain, callback } = ACM.getArgs(arguments, { + 'string': 'domain' + }) + + this.getCertificates(certs => { + const filtered = certs.filter(c => { return c.DomainName === domain }) + + const cert = filtered.length > 0 ? filtered[0] : null + + return callback(cert) + }) + } + + getCertificates () { + const { params, callback } = ACM.getArgs(arguments) + + this.listCertificates(params, response => { + const certificates = [] + + if (response.CertificateSummaryList) { + response.CertificateSummaryList.forEach(cert => { + certificates.push(new Certificate(cert, this)) + }) + } + + return callback(certificates) + }) + } + + supportedMethods () { + return [ + { + method: 'deleteCertificate', + required: [ + 'CertificateArn' + ] + }, + { + method: 'getCertificate', + required: [ + 'CertificateArn' + ] + }, + { + method: 'importCertificate', + required: [ + 'Certificate', + 'PrivateKey' + ] + }, + { + method: 'listCertificates' + // CertificateStatuses + } + ] + } + + static get Certificate () { + return Certificate + } } -module.exports = ACM; +module.exports = ACM diff --git a/lib/services/acm/Certificate.js b/lib/services/acm/Certificate.js index 380cf8b..4cea5fc 100644 --- a/lib/services/acm/Certificate.js +++ b/lib/services/acm/Certificate.js @@ -1,53 +1,53 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; +const AWSResource = require(primitivesPath).AWSResource class Certificate extends AWSResource { - constructor() { - super(...arguments); - - this.setDefaultParams({ - CertificateArn: this.CertificateArn - }); - } - - delete() { - const { params, callback } = Certificate.getArgs(arguments); - - this.deleteCertificate(params, callback); - } - - update() { - const { params, callback } = Certificate.getArgs(arguments); - - this.importCertificate(params, response => { - if (response.CertificateArn === this.CertificateArn) { - return callback(this); - } else { - return callback(response); - } - }); - } - - supportedMethods() { - return [ - { - method: 'importCertificate', - required: [ - 'CertificateArn', - 'Certificate', - 'PrivateKey' - ] - }, - { - method: 'deleteCertificate' - } - ]; - } + constructor () { + super(...arguments) + + this.setDefaultParams({ + CertificateArn: this.CertificateArn + }) + } + + delete () { + const { params, callback } = Certificate.getArgs(arguments) + + this.deleteCertificate(params, callback) + } + + update () { + const { params, callback } = Certificate.getArgs(arguments) + + this.importCertificate(params, response => { + if (response.CertificateArn === this.CertificateArn) { + return callback(this) + } else { + return callback(response) + } + }) + } + + supportedMethods () { + return [ + { + method: 'importCertificate', + required: [ + 'CertificateArn', + 'Certificate', + 'PrivateKey' + ] + }, + { + method: 'deleteCertificate' + } + ] + } } -module.exports = Certificate; +module.exports = Certificate diff --git a/lib/services/acm/index.js b/lib/services/acm/index.js index 0010178..a0a5f2e 100644 --- a/lib/services/acm/index.js +++ b/lib/services/acm/index.js @@ -1,3 +1,3 @@ -'use strict'; +'use strict' -module.exports = require('./ACM'); \ No newline at end of file +module.exports = require('./ACM') diff --git a/lib/services/ecs/Cluster.js b/lib/services/ecs/Cluster.js index 1ed1ded..d40ef1c 100644 --- a/lib/services/ecs/Cluster.js +++ b/lib/services/ecs/Cluster.js @@ -1,189 +1,189 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; -const Task = require('./Task'); -const TaskDefinition = require('./TaskDefinition'); -const Service = require('./Service'); -const ContainerInstance = require('./ContainerInstance'); +const AWSResource = require(primitivesPath).AWSResource +const Task = require('./Task') +const TaskDefinition = require('./TaskDefinition') +const Service = require('./Service') +const ContainerInstance = require('./ContainerInstance') class Cluster extends AWSResource { - constructor() { - super(...arguments); + constructor () { + super(...arguments) - this.setDefaultParams({ - cluster: this.clusterName - }); - } + this.setDefaultParams({ + cluster: this.clusterName + }) + } - delete() { - const { params, callback } = Cluster.getArgs(arguments); + delete () { + const { params, callback } = Cluster.getArgs(arguments) - this.deleteCluster(params, callback); - } + this.deleteCluster(params, callback) + } - newService() { - const { params, callback } = Cluster.getArgs(arguments); + newService () { + const { params, callback } = Cluster.getArgs(arguments) - this.createService(params, response => { - if (response.service) { - return callback(new Service(response.service, this)); - } + this.createService(params, response => { + if (response.service) { + return callback(new Service(response.service, this)) + } - return callback(); - }); - } + return callback() + }) + } - runTaskDefinition() { - const { taskDefinition, callback } = Cluster.getArgs(arguments, { - 'object': 'taskDefinition' - }); - - if (taskDefinition instanceof TaskDefinition) { - taskDefinition.run({ cluster: this.clusterName }, callback); - } else { - return callback(); - } - } - - getTasks() { - const { params, callback } = Cluster.getArgs(arguments); - - this.listTasks(params, response => { - if (response.taskArns && response.taskArns.length > 0) { - this.describeTasks({ tasks: response.taskArns }, response => { - const tasks = []; - - if (response.tasks) { - response.tasks.forEach(task => { - tasks.push(new Task(task, this)); - }); - } - - return callback(tasks); - }); - } else { - return callback([]); - } - }); - } - - getServices() { - const { params, callback } = Cluster.getArgs(arguments); - - this.listServices(params, response => { - if (response.serviceArns && response.serviceArns.length > 0) { - this.describeServices({ services: response.serviceArns }, response => { - const services = []; - - if (response.services) { - response.services.forEach(service => { - services.push(new Service(service, this)); - }); - } - - return callback(services); - }); - } else { - return callback([]); - } - }); - } - - getContainerInstances() { - const { params, callback } = Cluster.getArgs(arguments); - - this.listContainerInstances(params, response => { - if (response.containerInstanceArns && response.containerInstanceArns.length) { - this.describeContainerInstances({ containerInstances: response.containerInstanceArns }, response => { - const containerInstances = []; - - if (response.containerInstances) { - response.containerInstances.forEach(ci => { - containerInstances.push(new ContainerInstance(ci, this)); - }); - } - - return callback(containerInstances); - }); - } else { - return callback([]); - } - }); - } - - supportedMethods() { - return [ - { - method: 'deleteCluster', - required: [ - 'cluster' - ] - }, - { - method: 'createService', - required: [ - 'desiredCount', - 'serviceName', - 'taskDefinition' - ] - }, - { - method: 'listTasks', - required: [ - 'cluster' - ] - }, - { - method: 'describeTasks', - required: [ - 'cluster', - 'tasks' - ] - }, - { - method: 'listServices', - required: [ - 'cluster' - ] - }, - { - method: 'describeServices', - required: [ - 'cluster', - 'services' - ] - }, - { - method: 'listContainerInstances', - required: [ - 'cluster' - ] - }, - { - method: 'describeContainerInstances', - required: [ - 'cluster', - 'containerInstances' - ] - } - ]; - } - - static get Task() { - return Task; - } - - static get Service() { - return Service; - } + runTaskDefinition () { + const { taskDefinition, callback } = Cluster.getArgs(arguments, { + 'object': 'taskDefinition' + }) - static get ContainerInstance() { - return ContainerInstance; + if (taskDefinition instanceof TaskDefinition) { + taskDefinition.run({ cluster: this.clusterName }, callback) + } else { + return callback() } + } + + getTasks () { + const { params, callback } = Cluster.getArgs(arguments) + + this.listTasks(params, response => { + if (response.taskArns && response.taskArns.length > 0) { + this.describeTasks({ tasks: response.taskArns }, response => { + const tasks = [] + + if (response.tasks) { + response.tasks.forEach(task => { + tasks.push(new Task(task, this)) + }) + } + + return callback(tasks) + }) + } else { + return callback([]) + } + }) + } + + getServices () { + const { params, callback } = Cluster.getArgs(arguments) + + this.listServices(params, response => { + if (response.serviceArns && response.serviceArns.length > 0) { + this.describeServices({ services: response.serviceArns }, response => { + const services = [] + + if (response.services) { + response.services.forEach(service => { + services.push(new Service(service, this)) + }) + } + + return callback(services) + }) + } else { + return callback([]) + } + }) + } + + getContainerInstances () { + const { params, callback } = Cluster.getArgs(arguments) + + this.listContainerInstances(params, response => { + if (response.containerInstanceArns && response.containerInstanceArns.length) { + this.describeContainerInstances({ containerInstances: response.containerInstanceArns }, response => { + const containerInstances = [] + + if (response.containerInstances) { + response.containerInstances.forEach(ci => { + containerInstances.push(new ContainerInstance(ci, this)) + }) + } + + return callback(containerInstances) + }) + } else { + return callback([]) + } + }) + } + + supportedMethods () { + return [ + { + method: 'deleteCluster', + required: [ + 'cluster' + ] + }, + { + method: 'createService', + required: [ + 'desiredCount', + 'serviceName', + 'taskDefinition' + ] + }, + { + method: 'listTasks', + required: [ + 'cluster' + ] + }, + { + method: 'describeTasks', + required: [ + 'cluster', + 'tasks' + ] + }, + { + method: 'listServices', + required: [ + 'cluster' + ] + }, + { + method: 'describeServices', + required: [ + 'cluster', + 'services' + ] + }, + { + method: 'listContainerInstances', + required: [ + 'cluster' + ] + }, + { + method: 'describeContainerInstances', + required: [ + 'cluster', + 'containerInstances' + ] + } + ] + } + + static get Task () { + return Task + } + + static get Service () { + return Service + } + + static get ContainerInstance () { + return ContainerInstance + } } -module.exports = Cluster; +module.exports = Cluster diff --git a/lib/services/ecs/ContainerInstance.js b/lib/services/ecs/ContainerInstance.js index 4807529..a7375b4 100644 --- a/lib/services/ecs/ContainerInstance.js +++ b/lib/services/ecs/ContainerInstance.js @@ -1,56 +1,56 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; +const AWSResource = require(primitivesPath).AWSResource class ContainerInstance extends AWSResource { - constructor() { - super(...arguments); - - // this.setDefaultParams({ - // cluster: this.clusterName - // }); - } - - // getContainerInstances() { - // const { params, callback } = Cluster.getArgs(arguments); - - // this.listContainerInstances(params, response => { - // if (response.containerInstanceArns) { - // this.describeContainerInstances({ containerInstances: response.containerInstanceArns }, response => { - // const containerInstances = []; - - // if (response.containerInstances) { - // response.containerInstances.forEach(ci => { - // containerInstances.push(new ContainerInstance(ci, this)); - // }); - // } - - // callback(containerInstances); - // }); - // } - // }); - // } - - supportedMethods() { - return [ - // { - // method: 'listServices', - // required: [ - // 'cluster' - // ] - // }, - // { - // method: 'listContainerInstances', - // required: [ - // 'cluster' - // ] - // } - ]; - } + constructor () { + super(...arguments) + + // this.setDefaultParams({ + // cluster: this.clusterName + // }); + } + + // getContainerInstances() { + // const { params, callback } = Cluster.getArgs(arguments); + + // this.listContainerInstances(params, response => { + // if (response.containerInstanceArns) { + // this.describeContainerInstances({ containerInstances: response.containerInstanceArns }, response => { + // const containerInstances = []; + + // if (response.containerInstances) { + // response.containerInstances.forEach(ci => { + // containerInstances.push(new ContainerInstance(ci, this)); + // }); + // } + + // callback(containerInstances); + // }); + // } + // }); + // } + + supportedMethods () { + return [ + // { + // method: 'listServices', + // required: [ + // 'cluster' + // ] + // }, + // { + // method: 'listContainerInstances', + // required: [ + // 'cluster' + // ] + // } + ] + } } -module.exports = ContainerInstance; +module.exports = ContainerInstance diff --git a/lib/services/ecs/ECS.js b/lib/services/ecs/ECS.js index 7c321d0..cad2e05 100644 --- a/lib/services/ecs/ECS.js +++ b/lib/services/ecs/ECS.js @@ -1,133 +1,133 @@ -'use strict'; +'use strict' -const path = require('path'); -const async = require('async'); +const path = require('path') +const async = require('async') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSService = require(primitivesPath).AWSService; -const Cluster = require('./Cluster'); -const TaskDefinition = require('./TaskDefinition'); +const AWSService = require(primitivesPath).AWSService +const Cluster = require('./Cluster') +const TaskDefinition = require('./TaskDefinition') class ECS extends AWSService { - constructor() { - super(...arguments); - - this.autoPaginate = false; - } - - newCluster() { - const { params, callback } = ECS.getArgs(arguments); - - this.createCluster(params, response => { - if (response.cluster) { - return callback(new Cluster(response.cluster, this)); - } else { - return callback(); - } - }); - } - - newTaskDefinition() { - const { params, callback } = ECS.getArgs(arguments); - - this.registerTaskDefinition(params, response => { + constructor () { + super(...arguments) + + this.autoPaginate = false + } + + newCluster () { + const { params, callback } = ECS.getArgs(arguments) + + this.createCluster(params, response => { + if (response.cluster) { + return callback(new Cluster(response.cluster, this)) + } else { + return callback() + } + }) + } + + newTaskDefinition () { + const { params, callback } = ECS.getArgs(arguments) + + this.registerTaskDefinition(params, response => { + if (response.taskDefinition) { + return callback(new TaskDefinition(response.taskDefinition, this)) + } else { + return callback() + } + }) + } + + getClusters () { + const { params, callback } = ECS.getArgs(arguments) + + this.listClusters(params, response => { + if (response.clusterArns && response.clusterArns.length > 0) { + this.describeClusters({ clusters: response.clusterArns }, response => { + const clusters = [] + + if (response.clusters) { + response.clusters.forEach(cluster => { + clusters.push(new Cluster(cluster, this)) + }) + } + + return callback(clusters) + }) + } else { + return callback([]) + } + }) + } + + getTaskDefinitions () { + const { params, callback } = ECS.getArgs(arguments) + + this.listTaskDefinitions(params, response => { + if (response.taskDefinitionArns && response.taskDefinitionArns.length > 0) { + const taskDefinitions = [] + + async.each(response.taskDefinitionArns, (taskDefinitionArn, next) => { + this.describeTaskDefinition({ taskDefinition: taskDefinitionArn }, response => { if (response.taskDefinition) { - return callback(new TaskDefinition(response.taskDefinition, this)); - } else { - return callback(); - } - }); - } - - getClusters() { - const { params, callback } = ECS.getArgs(arguments); - - this.listClusters(params, response => { - if (response.clusterArns && response.clusterArns.length > 0) { - this.describeClusters({ clusters: response.clusterArns }, response => { - const clusters = []; - - if (response.clusters) { - response.clusters.forEach(cluster => { - clusters.push(new Cluster(cluster, this)); - }); - } - - return callback(clusters); - }); - } else { - return callback([]); - } - }); - } - - getTaskDefinitions() { - const { params, callback } = ECS.getArgs(arguments); - - this.listTaskDefinitions(params, response => { - if (response.taskDefinitionArns && response.taskDefinitionArns.length > 0) { - const taskDefinitions = []; - - async.each(response.taskDefinitionArns, (taskDefinitionArn, next) => { - this.describeTaskDefinition({ taskDefinition: taskDefinitionArn }, response => { - if (response.taskDefinition) { - taskDefinitions.push(new TaskDefinition(response.taskDefinition, this)); - } - - next(); - }); - }, (err) => { - return callback(taskDefinitions); - }); - } else { - return callback([]); + taskDefinitions.push(new TaskDefinition(response.taskDefinition, this)) } - }); - } - - supportedMethods() { - return [ - { - method: 'createCluster', - required: [ - 'clusterName' - ] - }, - { - method: 'listClusters' - }, - { - method: 'describeClusters', - required: [ - 'clusters' - ] - }, - { - method: 'listTaskDefinitions' - }, - { - method: 'describeTaskDefinition', - required: [ - 'taskDefinition' - ] - }, { - method: 'registerTaskDefinition', - required: [ - 'family', - 'containerDefinitions' - ] - } - ]; - } - - static get Cluster() { - return Cluster; - } - static get TaskDefinition() { - return TaskDefinition; - } + next() + }) + }, (err) => { + return callback(taskDefinitions) + }) + } else { + return callback([]) + } + }) + } + + supportedMethods () { + return [ + { + method: 'createCluster', + required: [ + 'clusterName' + ] + }, + { + method: 'listClusters' + }, + { + method: 'describeClusters', + required: [ + 'clusters' + ] + }, + { + method: 'listTaskDefinitions' + }, + { + method: 'describeTaskDefinition', + required: [ + 'taskDefinition' + ] + }, { + method: 'registerTaskDefinition', + required: [ + 'family', + 'containerDefinitions' + ] + } + ] + } + + static get Cluster () { + return Cluster + } + + static get TaskDefinition () { + return TaskDefinition + } } -module.exports = ECS; +module.exports = ECS diff --git a/lib/services/ecs/Service.js b/lib/services/ecs/Service.js index 8796940..e1700b4 100644 --- a/lib/services/ecs/Service.js +++ b/lib/services/ecs/Service.js @@ -1,36 +1,36 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; -const Task = require('./Task'); +const AWSResource = require(primitivesPath).AWSResource +const Task = require('./Task') class Service extends AWSResource { - constructor() { - super(...arguments); + constructor () { + super(...arguments) - this.setDefaultParams({ - serviceName: this.serviceName - }); - } + this.setDefaultParams({ + serviceName: this.serviceName + }) + } - getTasks() { - const { params, callback } = Service.getArgs(arguments); + getTasks () { + const { params, callback } = Service.getArgs(arguments) - this.parent.getTasks(Object.assign({}, { serviceName: this.serviceName }, params), callback); - } + this.parent.getTasks(Object.assign({}, { serviceName: this.serviceName }, params), callback) + } - supportedMethods() { - return [ - - ]; - } + supportedMethods () { + return [ - static get Task() { - return Task; - } + ] + } + + static get Task () { + return Task + } } -module.exports = Service; +module.exports = Service diff --git a/lib/services/ecs/Task.js b/lib/services/ecs/Task.js index aad2af3..572aac2 100644 --- a/lib/services/ecs/Task.js +++ b/lib/services/ecs/Task.js @@ -1,60 +1,60 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; -const TaskDefinition = require('./TaskDefinition'); +const AWSResource = require(primitivesPath).AWSResource +const TaskDefinition = require('./TaskDefinition') class Task extends AWSResource { - constructor() { - super(...arguments); - - this.setDefaultParams({ - task: this.taskArn - }); - } - - getDefinition() { - const { params, callback } = Task.getArgs(arguments); - - this.service.describeTaskDefinition(Object.assign({}, { taskDefinition: this.taskDefinitionArn }, params), response => { - if (response.taskDefinition) { - return callback(new TaskDefinition(response.taskDefinition, this)); - } - - return callback(null); - }); - } - - stop() { - const { params, callback } = Task.getArgs(arguments); - - this.stopTask(params, response => { - if (response.taskArn && response.taskArn === this.taskArn) { - callback(); - } else { - Task.error('Oops'); - } - }); - } - - supportedMethods() { - return [ - { - method: 'stopTask', - required: [ - 'task', - 'cluster' - ] - } - ]; - } - - static get TaskDefinition() { - return TaskDefinition; - } + constructor () { + super(...arguments) + + this.setDefaultParams({ + task: this.taskArn + }) + } + + getDefinition () { + const { params, callback } = Task.getArgs(arguments) + + this.service.describeTaskDefinition(Object.assign({}, { taskDefinition: this.taskDefinitionArn }, params), response => { + if (response.taskDefinition) { + return callback(new TaskDefinition(response.taskDefinition, this)) + } + + return callback(null) + }) + } + + stop () { + const { params, callback } = Task.getArgs(arguments) + + this.stopTask(params, response => { + if (response.taskArn && response.taskArn === this.taskArn) { + callback() + } else { + Task.error('Oops') + } + }) + } + + supportedMethods () { + return [ + { + method: 'stopTask', + required: [ + 'task', + 'cluster' + ] + } + ] + } + + static get TaskDefinition () { + return TaskDefinition + } } -module.exports = Task; +module.exports = Task diff --git a/lib/services/ecs/TaskDefinition.js b/lib/services/ecs/TaskDefinition.js index 1c6dc18..d848acf 100644 --- a/lib/services/ecs/TaskDefinition.js +++ b/lib/services/ecs/TaskDefinition.js @@ -1,69 +1,69 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; +const AWSResource = require(primitivesPath).AWSResource -const Task = require('./Task'); +const Task = require('./Task') class TaskDefinition extends AWSResource { - constructor() { - super(...arguments); + constructor () { + super(...arguments) - this.autoPaginate = false; + this.autoPaginate = false - this.setDefaultParams({ - taskDefinition: this.taskDefinitionArn - }); - } - - run() { - const { params, callback } = TaskDefinition.getArgs(arguments); + this.setDefaultParams({ + taskDefinition: this.taskDefinitionArn + }) + } - this.runTask(params, response => { - if (response.tasks) { - return callback(response.tasks.map(t => { return new this.constructor.Task(t, this) })); - } else { - return callback(); - } - }); - } + run () { + const { params, callback } = TaskDefinition.getArgs(arguments) - delete() { - const { params, callback } = TaskDefinition.getArgs(arguments); + this.runTask(params, response => { + if (response.tasks) { + return callback(response.tasks.map(t => { return new this.constructor.Task(t, this) })) + } else { + return callback() + } + }) + } - this.deregisterTaskDefinition(params, response => { - if (response.taskDefinition) { - return callback(this); - } else { - return callback(); - } - }); - } - - supportedMethods() { - return [ - { - method: 'runTask', - required: [ - 'cluster', - 'taskDefinition' - ] - }, - { - method: 'deregisterTaskDefinition', - required: [ - 'taskDefinition' - ] - } - ]; - } + delete () { + const { params, callback } = TaskDefinition.getArgs(arguments) - static get Task() { - return require('./Task'); - } + this.deregisterTaskDefinition(params, response => { + if (response.taskDefinition) { + return callback(this) + } else { + return callback() + } + }) + } + + supportedMethods () { + return [ + { + method: 'runTask', + required: [ + 'cluster', + 'taskDefinition' + ] + }, + { + method: 'deregisterTaskDefinition', + required: [ + 'taskDefinition' + ] + } + ] + } + + static get Task () { + return require('./Task') + } } -module.exports = TaskDefinition; +module.exports = TaskDefinition diff --git a/lib/services/ecs/index.js b/lib/services/ecs/index.js index 6d0b447..43d3121 100644 --- a/lib/services/ecs/index.js +++ b/lib/services/ecs/index.js @@ -1,3 +1,3 @@ -'use strict'; +'use strict' -module.exports = require('./ECS'); \ No newline at end of file +module.exports = require('./ECS') diff --git a/lib/services/index.js b/lib/services/index.js index 3bd3377..dd2e673 100644 --- a/lib/services/index.js +++ b/lib/services/index.js @@ -1,10 +1,10 @@ -'use strict'; +'use strict' module.exports = { - S3: require('./s3'), - SES: require('./ses'), - SQS: require('./sqs'), - ECS: require('./ecs'), - ACM: require('./acm'), - Route53: require('./route53') -}; \ No newline at end of file + S3: require('./s3'), + SES: require('./ses'), + SQS: require('./sqs'), + ECS: require('./ecs'), + ACM: require('./acm'), + Route53: require('./route53') +} diff --git a/lib/services/route53/ChangeBatch.js b/lib/services/route53/ChangeBatch.js index 80f578a..af7fe79 100644 --- a/lib/services/route53/ChangeBatch.js +++ b/lib/services/route53/ChangeBatch.js @@ -1,65 +1,65 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; +const AWSResource = require(primitivesPath).AWSResource class ChangeBatch extends AWSResource { - constructor() { - super(...arguments); + constructor () { + super(...arguments) - this.setDefaultParams({ - Id: this.Id - }); + this.setDefaultParams({ + Id: this.Id + }) - this.timeout = 3600000; - this.elapsed = 0; - this.interval = 30000; - } + this.timeout = 3600000 + this.elapsed = 0 + this.interval = 30000 + } - wait() { - const { params, callback } = ChangeBatch.getArgs(arguments); + wait () { + const { params, callback } = ChangeBatch.getArgs(arguments) this.getChange(params, resp => { if (!resp.ChangeInfo) { - ChangeBatch.error('Missing ChangeInfo from getChange()!'); + ChangeBatch.error('Missing ChangeInfo from getChange()!') } - this.setProperties(resp.ChangeInfo, false); + this.setProperties(resp.ChangeInfo, false) if (this.Status === 'PENDING') { - ChangeBatch.debug('Waiting for pending change:', this.Id); + ChangeBatch.debug('Waiting for pending change:', this.Id) if (this.elapsed <= this.timeout) { - setTimeout(() => { - this.elapsed += this.interval; - this.wait(params, callback); - }, this.interval); + setTimeout(() => { + this.elapsed += this.interval + this.wait(params, callback) + }, this.interval) } else { - ChangeBatch.error(`ChangeBatch timed out! timeout = ${this.timeout}ms, interval = ${this.interval}`); + ChangeBatch.error(`ChangeBatch timed out! timeout = ${this.timeout}ms, interval = ${this.interval}`) } } else { - ChangeBatch.debug('Done waiting for change:', this.Id); - ChangeBatch.debug('Status is:', this.Status); + ChangeBatch.debug('Done waiting for change:', this.Id) + ChangeBatch.debug('Status is:', this.Status) if (this.Status === 'INSYNC') { - return callback(); + return callback() } else { ChangeBatch.error(`Unexpected ChangeBatch status while waiting: "${this.Status}"`) } } - }); - } + }) + } - supportedMethods() { - return [ + supportedMethods () { + return [ { method: 'getChange' } - ]; - } + ] + } } -module.exports = ChangeBatch; +module.exports = ChangeBatch diff --git a/lib/services/route53/RecordSet.js b/lib/services/route53/RecordSet.js index a067e5f..7720d87 100644 --- a/lib/services/route53/RecordSet.js +++ b/lib/services/route53/RecordSet.js @@ -1,82 +1,82 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; -const ChangeBatch = require('./ChangeBatch'); +const AWSResource = require(primitivesPath).AWSResource +const ChangeBatch = require('./ChangeBatch') class RecordSet extends AWSResource { - constructor() { - super(...arguments); - - this.setDefaultParams({ - HostedZoneId: this.parent.Id - }); - } - - getChange(action) { - return { - Action: action, - ResourceRecordSet: this.properties - } + constructor () { + super(...arguments) + + this.setDefaultParams({ + HostedZoneId: this.parent.Id + }) + } + + getChange (action) { + return { + Action: action, + ResourceRecordSet: this.properties } + } - create() { - const { callback } = RecordSet.getArgs(arguments); + create () { + const { callback } = RecordSet.getArgs(arguments) - this.change('CREATE', callback); - } + this.change('CREATE', callback) + } - upsert() { - const { callback } = RecordSet.getArgs(arguments); + upsert () { + const { callback } = RecordSet.getArgs(arguments) - this.change('UPSERT', callback); - } + this.change('UPSERT', callback) + } - delete() { - const { callback } = RecordSet.getArgs(arguments); + delete () { + const { callback } = RecordSet.getArgs(arguments) - this.change('DELETE', callback); - } + this.change('DELETE', callback) + } - change() { - const { action, callback } = RecordSet.getArgs(arguments, { - 'string': 'action' - }); - - const params = { - ChangeBatch: { - Changes: [ - this.getChange(action) - ] - } - }; - - this.changeResourceRecordSets(params, resp => { - if (resp.ChangeInfo) { - const batch = new ChangeBatch(resp.ChangeInfo, this.service); - - batch.wait(callback); - } - }); - } + change () { + const { action, callback } = RecordSet.getArgs(arguments, { + 'string': 'action' + }) - supportedMethods() { - return [ - { - method: 'changeResourceRecordSets', - required: [ - 'ChangeBatch' - ] - } - ]; + const params = { + ChangeBatch: { + Changes: [ + this.getChange(action) + ] + } } - static get ChangeBatch() { - return ChangeBatch; - } + this.changeResourceRecordSets(params, resp => { + if (resp.ChangeInfo) { + const batch = new ChangeBatch(resp.ChangeInfo, this.service) + + batch.wait(callback) + } + }) + } + + supportedMethods () { + return [ + { + method: 'changeResourceRecordSets', + required: [ + 'ChangeBatch' + ] + } + ] + } + + static get ChangeBatch () { + return ChangeBatch + } } -module.exports = RecordSet; +module.exports = RecordSet diff --git a/lib/services/route53/Route53.js b/lib/services/route53/Route53.js index 8c00556..c50f275 100644 --- a/lib/services/route53/Route53.js +++ b/lib/services/route53/Route53.js @@ -1,107 +1,107 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSService = require(primitivesPath).AWSService; -const Zone = require('./Zone'); +const AWSService = require(primitivesPath).AWSService +const Zone = require('./Zone') class Route53 extends AWSService { - createZone() { - const { params, callback } = Route53.getArgs(arguments); - - this.createHostedZone(params, data => { - if (data.HostedZone) { - return callback(new Zone(data.HostedZone, this)); - } - - return callback(null); - }); - } - - deleteZone() { - const { params, callback } = Route53.getArgs(arguments); - - this.deleteHostedZone(params, callback); - } - - getZoneCount() { - const { params, callback } = Route53.getArgs(arguments); - - this.getHostedZoneCount(params, resp => { - callback(resp.HostedZoneCount); - }); - } - - getZones() { - const { params, callback } = Route53.getArgs(arguments); - - this.listHostedZones(params, data => { - const hostedZones = data.HostedZones || []; - - callback(hostedZones.map(zoneData => { - return new Zone(zoneData, this); - })); - }); - } - - getZoneByName() { - const { name, params, callback } = Route53.getArgs(arguments, { - 'string': 'name' - }); - - this.listHostedZones(params, data => { - const hostedZones = data.HostedZones || []; - - const filtered = hostedZones.filter(zone => { - return zone.Name === name.trim() || zone.Name === name.trim() + '.'; - }); - - if (filtered.length > 0) { - return callback(filtered.map(z => { return new Zone(z, this); })[0]); - } else { - callback(); - } - }); - } - - supportedMethods() { - return [ - { - method: 'createHostedZone', - required: [ - 'Name', - 'CallerReference' - ] - }, - { - method: 'deleteHostedZone', - required: [ - 'Id' - ] - }, - { - method: 'listHostedZones' - }, - { - method: 'listHostedZonesByName' - }, - { - method: 'getHostedZone' - }, - { - method: 'getHostedZoneCount' - }, - { - method: 'getChange' - } - ]; - } - - static get Zone() { - return Zone; - } + createZone () { + const { params, callback } = Route53.getArgs(arguments) + + this.createHostedZone(params, data => { + if (data.HostedZone) { + return callback(new Zone(data.HostedZone, this)) + } + + return callback(null) + }) + } + + deleteZone () { + const { params, callback } = Route53.getArgs(arguments) + + this.deleteHostedZone(params, callback) + } + + getZoneCount () { + const { params, callback } = Route53.getArgs(arguments) + + this.getHostedZoneCount(params, resp => { + callback(resp.HostedZoneCount) + }) + } + + getZones () { + const { params, callback } = Route53.getArgs(arguments) + + this.listHostedZones(params, data => { + const hostedZones = data.HostedZones || [] + + callback(hostedZones.map(zoneData => { + return new Zone(zoneData, this) + })) + }) + } + + getZoneByName () { + const { name, params, callback } = Route53.getArgs(arguments, { + 'string': 'name' + }) + + this.listHostedZones(params, data => { + const hostedZones = data.HostedZones || [] + + const filtered = hostedZones.filter(zone => { + return zone.Name === name.trim() || zone.Name === name.trim() + '.' + }) + + if (filtered.length > 0) { + return callback(filtered.map(z => { return new Zone(z, this) })[0]) + } else { + callback() + } + }) + } + + supportedMethods () { + return [ + { + method: 'createHostedZone', + required: [ + 'Name', + 'CallerReference' + ] + }, + { + method: 'deleteHostedZone', + required: [ + 'Id' + ] + }, + { + method: 'listHostedZones' + }, + { + method: 'listHostedZonesByName' + }, + { + method: 'getHostedZone' + }, + { + method: 'getHostedZoneCount' + }, + { + method: 'getChange' + } + ] + } + + static get Zone () { + return Zone + } } -module.exports = Route53; +module.exports = Route53 diff --git a/lib/services/route53/Zone.js b/lib/services/route53/Zone.js index ce5706e..f5125bb 100644 --- a/lib/services/route53/Zone.js +++ b/lib/services/route53/Zone.js @@ -1,64 +1,64 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; -const RecordSet = require('./RecordSet'); +const AWSResource = require(primitivesPath).AWSResource +const RecordSet = require('./RecordSet') class Zone extends AWSResource { - constructor() { - super(...arguments); + constructor () { + super(...arguments) - this.setDefaultParams({ - HostedZoneId: this.Id - }); - } + this.setDefaultParams({ + HostedZoneId: this.Id + }) + } - getRecordSets() { - const { params, callback } = Zone.getArgs(arguments); + getRecordSets () { + const { params, callback } = Zone.getArgs(arguments) - this.listResourceRecordSets(params, data => { - const recordSets = data.ResourceRecordSets || []; + this.listResourceRecordSets(params, data => { + const recordSets = data.ResourceRecordSets || [] - callback(recordSets.map(recordData => { - return new RecordSet(recordData, this); - })); - }); - } + callback(recordSets.map(recordData => { + return new RecordSet(recordData, this) + })) + }) + } - newRecordSet() { - const { params } = Zone.getArgs(arguments); + newRecordSet () { + const { params } = Zone.getArgs(arguments) - return new RecordSet(params, this); - } + return new RecordSet(params, this) + } - delete() { - const { callback } = Zone.getArgs(arguments); + delete () { + const { callback } = Zone.getArgs(arguments) - this.service.deleteZone({ - Id: this.Id - }, callback); - } + this.service.deleteZone({ + Id: this.Id + }, callback) + } - supportedMethods() { - return [ - { - method: 'listResourceRecordSets' - }, - { - method: 'changeResourceRecordSets', - required: [ - 'ChangeBatch' - ] - } - ]; - } + supportedMethods () { + return [ + { + method: 'listResourceRecordSets' + }, + { + method: 'changeResourceRecordSets', + required: [ + 'ChangeBatch' + ] + } + ] + } - static get RecordSet() { - return Record; - } + static get RecordSet () { + return Record + } } -module.exports = Zone; +module.exports = Zone diff --git a/lib/services/route53/index.js b/lib/services/route53/index.js index 8b1a1c2..e33cab0 100644 --- a/lib/services/route53/index.js +++ b/lib/services/route53/index.js @@ -1,3 +1,3 @@ -'use strict'; +'use strict' -module.exports = require('./Route53'); \ No newline at end of file +module.exports = require('./Route53') diff --git a/lib/services/s3/Bucket.js b/lib/services/s3/Bucket.js index cf5c331..55bf4bb 100644 --- a/lib/services/s3/Bucket.js +++ b/lib/services/s3/Bucket.js @@ -1,76 +1,76 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; -const Item = require('./Item'); +const AWSResource = require(primitivesPath).AWSResource +const Item = require('./Item') class Bucket extends AWSResource { - constructor() { - super(...arguments); + constructor () { + super(...arguments) - this.setDefaultParams({ - Bucket: this.name - }); - } + this.setDefaultParams({ + Bucket: this.name + }) + } - getItems() { - const { params, callback } = Bucket.getArgs(arguments); - // const { params } = Bucket.getArgs(arguments); + getItems () { + const { params, callback } = Bucket.getArgs(arguments) + // const { params } = Bucket.getArgs(arguments); - this.listObjects(params, response => { - const items = []; + this.listObjects(params, response => { + const items = [] - if (response.Contents) { - response.Contents.forEach(itemData => { - items.push(new Item(itemData, this)); - }); - } + if (response.Contents) { + response.Contents.forEach(itemData => { + items.push(new Item(itemData, this)) + }) + } - callback(items); - }); + callback(items) + }) - // return new Promise((resolve, reject) => { - // try { - // this.listObjects(params, response => { - // const items = []; - // - // if (response.Contents) { - // response.Contents.forEach(itemData => { - // items.push(new Item(itemData, this)); - // }); - // } - // - // resolve(items); - // }); - // } catch (err) { - // reject(err); - // } - // }); - } + // return new Promise((resolve, reject) => { + // try { + // this.listObjects(params, response => { + // const items = []; + // + // if (response.Contents) { + // response.Contents.forEach(itemData => { + // items.push(new Item(itemData, this)); + // }); + // } + // + // resolve(items); + // }); + // } catch (err) { + // reject(err); + // } + // }); + } - supportedMethods() { - return [ - { - method: 'listObjects' - }, - { - method: 'listObjectsV2' - }, - { - method: 'getObjectAcl', - required: [ - 'Key' - ] - } - ]; - } + supportedMethods () { + return [ + { + method: 'listObjects' + }, + { + method: 'listObjectsV2' + }, + { + method: 'getObjectAcl', + required: [ + 'Key' + ] + } + ] + } - static get Item() { - return Item; - } + static get Item () { + return Item + } } -module.exports = Bucket; +module.exports = Bucket diff --git a/lib/services/s3/Item.js b/lib/services/s3/Item.js index 0623821..85a4b16 100644 --- a/lib/services/s3/Item.js +++ b/lib/services/s3/Item.js @@ -1,31 +1,31 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; +const AWSResource = require(primitivesPath).AWSResource class Item extends AWSResource { - constructor() { - super(...arguments); + constructor () { + super(...arguments) - this.setDefaultParams({ - Key: this.Key - }); - } + this.setDefaultParams({ + Key: this.Key + }) + } - supportedMethods() { - return [ - { - method: 'getObjectAcl', - required: [ - 'Bucket', - 'Key' - ] - } - ]; - } + supportedMethods () { + return [ + { + method: 'getObjectAcl', + required: [ + 'Bucket', + 'Key' + ] + } + ] + } } -module.exports = Item; +module.exports = Item diff --git a/lib/services/s3/S3.js b/lib/services/s3/S3.js index b035c1c..f8f7d8f 100644 --- a/lib/services/s3/S3.js +++ b/lib/services/s3/S3.js @@ -1,40 +1,40 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSService = require(primitivesPath).AWSService; -const Bucket = require('./Bucket'); +const AWSService = require(primitivesPath).AWSService +const Bucket = require('./Bucket') class S3 extends AWSService { - getBucket(name) { - return new Bucket(name, this); - } - - getBuckets() { - const { params, callback } = S3.getArgs(arguments); - - this.listBuckets(params, data => { - const bucketList = data.Buckets || []; - - callback(bucketList.map(bucketData => { - return this.getBucket(bucketData.Name); - })); - }); - } - - supportedMethods() { - return [ - { - method: 'listBuckets' - } - ]; - } - - static get Bucket() { - return Bucket; - } + getBucket (name) { + return new Bucket(name, this) + } + + getBuckets () { + const { params, callback } = S3.getArgs(arguments) + + this.listBuckets(params, data => { + const bucketList = data.Buckets || [] + + callback(bucketList.map(bucketData => { + return this.getBucket(bucketData.Name) + })) + }) + } + + supportedMethods () { + return [ + { + method: 'listBuckets' + } + ] + } + + static get Bucket () { + return Bucket + } } -module.exports = S3; +module.exports = S3 diff --git a/lib/services/s3/index.js b/lib/services/s3/index.js index 0e2e48d..43d6cc8 100644 --- a/lib/services/s3/index.js +++ b/lib/services/s3/index.js @@ -1,3 +1,3 @@ -'use strict'; +'use strict' -module.exports = require('./S3'); \ No newline at end of file +module.exports = require('./S3') diff --git a/lib/services/ses/Email.js b/lib/services/ses/Email.js index e8b7c54..b3f2b54 100644 --- a/lib/services/ses/Email.js +++ b/lib/services/ses/Email.js @@ -1,147 +1,147 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; +const AWSResource = require(primitivesPath).AWSResource -const REGEX_VALID_EMAIL_ADDRESS = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; +const REGEX_VALID_EMAIL_ADDRESS = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ class Email extends AWSResource { - constructor() { - super(...arguments); - - this._to = []; - this._cc = []; - this._bcc = []; - this._replyTo = []; - this._from = null; - this._subject = 'No Subject'; - this._body = ''; - this._bodyType = 'html'; + constructor () { + super(...arguments) + + this._to = [] + this._cc = [] + this._bcc = [] + this._replyTo = [] + this._from = null + this._subject = 'No Subject' + this._body = '' + this._bodyType = 'html' + } + + setFrom (from) { + if (Email.isValidEmailAddress(from)) { + this._from = from } + } - setFrom(from) { - if (Email.isValidEmailAddress(from)) { - this._from = from; - } - } + setTo (to) { + this._setEmailList('_to', to) + } - setTo(to) { - this._setEmailList('_to', to); - } + setCc (cc) { + this._setEmailList('_cc', cc) + } - setCc(cc) { - this._setEmailList('_cc', cc); - } + setBcc (bcc) { + this._setEmailList('_bcc', bcc) + } - setBcc(bcc) { - this._setEmailList('_bcc', bcc); - } + setReplyTo (replyTo) { + this._setEmailList('_replyTo', replyTo) + } - setReplyTo(replyTo) { - this._setEmailList('_replyTo', replyTo); - } + setSubject (subject) { + this._subject = subject + } - setSubject(subject) { - this._subject = subject; - } - - setBody(body) { - this._body = body; - } + setBody (body) { + this._body = body + } - setBodyType(type) { - if (type === 'html') { - this._bodyType = 'html'; - } else { - this._bodyType = 'text'; - } + setBodyType (type) { + if (type === 'html') { + this._bodyType = 'html' + } else { + this._bodyType = 'text' } - - getMessageData() { - const data = { - Source: this._from, - Destination: { - ToAddresses: this._to, - CcAddresses: this._cc, - BccAddresses: this._bcc - }, - Message: { - Subject: { - Data: this._subject - }, - Body: {} - }, - ReplyToAddresses: this._replyTo - }; - - if (this._bodyType === 'html') { - data.Message.Body.Html = { - Data: this._body - }; - } else { - data.Message.Body.Text = { - Data: this._body - }; - } - - return data; + } + + getMessageData () { + const data = { + Source: this._from, + Destination: { + ToAddresses: this._to, + CcAddresses: this._cc, + BccAddresses: this._bcc + }, + Message: { + Subject: { + Data: this._subject + }, + Body: {} + }, + ReplyToAddresses: this._replyTo } - send() { - const { params, callback } = Email.getArgs(arguments); - - Email.debug('Sending email'); - - var merged = Object.assign({}, this.getMessageData(), params); - - this.sendEmail(merged, response => { - this.setProperties(response); - - if (typeof callback === 'function') { - callback(response); - } - }); + if (this._bodyType === 'html') { + data.Message.Body.Html = { + Data: this._body + } + } else { + data.Message.Body.Text = { + Data: this._body + } } - supportedMethods() { - return [ - { - method: 'sendEmail', - required: [ - 'Source', - 'Destination', - 'Message' - ] - } - ]; + return data + } + + send () { + const { params, callback } = Email.getArgs(arguments) + + Email.debug('Sending email') + + var merged = Object.assign({}, this.getMessageData(), params) + + this.sendEmail(merged, response => { + this.setProperties(response) + + if (typeof callback === 'function') { + callback(response) + } + }) + } + + supportedMethods () { + return [ + { + method: 'sendEmail', + required: [ + 'Source', + 'Destination', + 'Message' + ] + } + ] + } + + _setEmailList (key, val) { + if (!this[key]) { + Email.error(`Invalid key: ${key}`) } - _setEmailList(key, val) { - if (!this[key]) { - Email.error(`Invalid key: ${key}`); - } - - if (Array.isArray(val)) { - val.forEach(emailAddress => { - if (Email.isValidEmailAddress(emailAddress)) { - this[key].push(emailAddress); - } else { - Email.error(`Invalid Email Address: '${emailAddress}'`); - } - }); - } else if (Email.isValidEmailAddress(val)) { - this[key].push(val); + if (Array.isArray(val)) { + val.forEach(emailAddress => { + if (Email.isValidEmailAddress(emailAddress)) { + this[key].push(emailAddress) } else { - Email.error(`Invalid Email Address: '${val}'`); + Email.error(`Invalid Email Address: '${emailAddress}'`) } + }) + } else if (Email.isValidEmailAddress(val)) { + this[key].push(val) + } else { + Email.error(`Invalid Email Address: '${val}'`) } + } - static isValidEmailAddress(emailAddress) { - return REGEX_VALID_EMAIL_ADDRESS.test(emailAddress); - } + static isValidEmailAddress (emailAddress) { + return REGEX_VALID_EMAIL_ADDRESS.test(emailAddress) + } } -module.exports = Email; +module.exports = Email diff --git a/lib/services/ses/SES.js b/lib/services/ses/SES.js index 290c7b5..138caac 100644 --- a/lib/services/ses/SES.js +++ b/lib/services/ses/SES.js @@ -1,34 +1,34 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSService = require(primitivesPath).AWSService; -const Email = require('./Email'); +const AWSService = require(primitivesPath).AWSService +const Email = require('./Email') class SES extends AWSService { - constructor() { - super(...arguments); + constructor () { + super(...arguments) - this.setDefaultParams({ - // Default SES parameters - }); - } + this.setDefaultParams({ + // Default SES parameters + }) + } - newEmail() { - const { params } = SES.getArgs(arguments); + newEmail () { + const { params } = SES.getArgs(arguments) - return new Email(params, this); - } + return new Email(params, this) + } - supportedMethods() { - return []; - } + supportedMethods () { + return [] + } - static get Email() { - return Email; - } + static get Email () { + return Email + } } -module.exports = SES; +module.exports = SES diff --git a/lib/services/ses/index.js b/lib/services/ses/index.js index 8222775..78c5a41 100644 --- a/lib/services/ses/index.js +++ b/lib/services/ses/index.js @@ -1,3 +1,3 @@ -'use strict'; +'use strict' -module.exports = require('./SES'); \ No newline at end of file +module.exports = require('./SES') diff --git a/lib/services/sqs/Message.js b/lib/services/sqs/Message.js index 062a862..a211b49 100644 --- a/lib/services/sqs/Message.js +++ b/lib/services/sqs/Message.js @@ -1,84 +1,84 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; +const AWSResource = require(primitivesPath).AWSResource class Message extends AWSResource { - constructor() { - super(...arguments); + constructor () { + super(...arguments) - this.setDefaultParams({ - // QueueUrl: this.service.defaultParams.QueueUrl, - QueueUrl: this.parent.name, - // ReceiptHandle: this.ReceiptHandle, - }); + this.setDefaultParams({ + // QueueUrl: this.service.defaultParams.QueueUrl, + QueueUrl: this.parent.name + // ReceiptHandle: this.ReceiptHandle, + }) - this.parseBody(); - } - - parseBody() { - this.parsed = this.Body; - - try { - this.parsed = JSON.parse(this.Body); - } catch (e) { - Message.debug(`Unable to parse body as json: ${this.Body}`); - } - } - - send() { - const { params, callback } = Message.getArgs(arguments); - - Message.debug(`Sending message: ${this.Body}`); - - this.sendMessage(params, response => { - this.setProperties(response); + this.parseBody() + } - if (typeof callback === 'function') { - callback(response); - } - }); - } - - delete() { - const { params, callback } = Message.getArgs(arguments); - - Message.debug(`Deleting message: ${this.MessageId}`); - - this.deleteMessage(params, callback); - } - - supportedMethods() { - return [ - { - method: 'sendMessage', - params: { - MessageBody: this.Body - }, - required: [ - 'QueueUrl', - 'MessageBody' - ] - }, - { - method: 'deleteMessage', - params: { - ReceiptHandle: this.ReceiptHandle - }, - required: [ - 'QueueUrl', - 'ReceiptHandle' - ] - } - ]; - } + parseBody () { + this.parsed = this.Body - toString() { - return `[${this.MessageId}] - '${this.Body}'`; + try { + this.parsed = JSON.parse(this.Body) + } catch (e) { + Message.debug(`Unable to parse body as json: ${this.Body}`) } + } + + send () { + const { params, callback } = Message.getArgs(arguments) + + Message.debug(`Sending message: ${this.Body}`) + + this.sendMessage(params, response => { + this.setProperties(response) + + if (typeof callback === 'function') { + callback(response) + } + }) + } + + delete () { + const { params, callback } = Message.getArgs(arguments) + + Message.debug(`Deleting message: ${this.MessageId}`) + + this.deleteMessage(params, callback) + } + + supportedMethods () { + return [ + { + method: 'sendMessage', + params: { + MessageBody: this.Body + }, + required: [ + 'QueueUrl', + 'MessageBody' + ] + }, + { + method: 'deleteMessage', + params: { + ReceiptHandle: this.ReceiptHandle + }, + required: [ + 'QueueUrl', + 'ReceiptHandle' + ] + } + ] + } + + toString () { + return `[${this.MessageId}] - '${this.Body}'` + } } -module.exports = Message; +module.exports = Message diff --git a/lib/services/sqs/Queue.js b/lib/services/sqs/Queue.js index 420727a..679aba0 100644 --- a/lib/services/sqs/Queue.js +++ b/lib/services/sqs/Queue.js @@ -1,86 +1,86 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSResource = require(primitivesPath).AWSResource; -const Message = require('./Message'); +const AWSResource = require(primitivesPath).AWSResource +const Message = require('./Message') class Queue extends AWSResource { - constructor() { - super(...arguments); - - this.setDefaultParams({ - QueueUrl: this.name - }); - } - - sendMessage() { - const { bodyString, bodyObject, callback } = Queue.getArgs(arguments, { - 'string': 'bodyString', - 'object': 'bodyObject' - }); - - if (bodyString && bodyObject) { - Queue.error('Provide only one body source! (string or object, both were provided)'); - } - - const newMessage = this.newMessage({ - Body: bodyObject ? JSON.stringify(bodyObject) : bodyString - }); - - newMessage.send(callback); - } - - newMessage() { - const { params } = Queue.getArgs(arguments); - - return new Message(params, this); - } - - delete() { - const { params, callback } = Queue.getArgs(arguments); - - this.deleteQueue(params, callback); - } - - listen() { - const { params, callback } = Queue.getArgs(arguments); - - Queue.debug(`Listening to queue url: `, this.defaultParams); - - this.receiveMessage(params, data => { - if (data.Messages) { - callback(data.Messages.map(msg => { - return new Message(msg, this); - })); - } - - this.listen(...arguments); - }); + constructor () { + super(...arguments) + + this.setDefaultParams({ + QueueUrl: this.name + }) + } + + sendMessage () { + const { bodyString, bodyObject, callback } = Queue.getArgs(arguments, { + 'string': 'bodyString', + 'object': 'bodyObject' + }) + + if (bodyString && bodyObject) { + Queue.error('Provide only one body source! (string or object, both were provided)') } - supportedMethods() { - return [ - { - method: 'receiveMessage', - required: [ - 'QueueUrl', - ] - }, - { - method: 'deleteQueue', - required: [ - 'QueueUrl' - ] - } - ]; - } - - static get Message() { - return Message; - } + const newMessage = this.newMessage({ + Body: bodyObject ? JSON.stringify(bodyObject) : bodyString + }) + + newMessage.send(callback) + } + + newMessage () { + const { params } = Queue.getArgs(arguments) + + return new Message(params, this) + } + + delete () { + const { params, callback } = Queue.getArgs(arguments) + + this.deleteQueue(params, callback) + } + + listen () { + const { params, callback } = Queue.getArgs(arguments) + + Queue.debug(`Listening to queue url: `, this.defaultParams) + + this.receiveMessage(params, data => { + if (data.Messages) { + callback(data.Messages.map(msg => { + return new Message(msg, this) + })) + } + + this.listen(...arguments) + }) + } + + supportedMethods () { + return [ + { + method: 'receiveMessage', + required: [ + 'QueueUrl' + ] + }, + { + method: 'deleteQueue', + required: [ + 'QueueUrl' + ] + } + ] + } + + static get Message () { + return Message + } } -module.exports = Queue; +module.exports = Queue diff --git a/lib/services/sqs/SQS.js b/lib/services/sqs/SQS.js index e585fd0..93ee9a2 100644 --- a/lib/services/sqs/SQS.js +++ b/lib/services/sqs/SQS.js @@ -1,49 +1,49 @@ -'use strict'; +'use strict' -const path = require('path'); +const path = require('path') -const primitivesPath = path.join('..', '..', 'primitives'); +const primitivesPath = path.join('..', '..', 'primitives') -const AWSService = require(primitivesPath).AWSService; -const Queue = require('./Queue'); +const AWSService = require(primitivesPath).AWSService +const Queue = require('./Queue') class SQS extends AWSService { - constructor() { - super(...arguments); - - this.setDefaultParams({ - // Default SQS parameters - }); - } - - getQueue() { - const { params, callback } = Queue.getArgs(arguments); - - this.createQueue(params, data => { - return callback(new Queue(data.QueueUrl, this)); - }); - } - - supportedMethods() { - return [ - { - method: 'getQueueUrl', - required: [ - 'QueueName' - ] - }, - { - method: 'createQueue', - required: [ - 'QueueName' - ] - } - ]; - } - - static get Queue() { - return Queue; - } + constructor () { + super(...arguments) + + this.setDefaultParams({ + // Default SQS parameters + }) + } + + getQueue () { + const { params, callback } = Queue.getArgs(arguments) + + this.createQueue(params, data => { + return callback(new Queue(data.QueueUrl, this)) + }) + } + + supportedMethods () { + return [ + { + method: 'getQueueUrl', + required: [ + 'QueueName' + ] + }, + { + method: 'createQueue', + required: [ + 'QueueName' + ] + } + ] + } + + static get Queue () { + return Queue + } } -module.exports = SQS; +module.exports = SQS diff --git a/lib/services/sqs/index.js b/lib/services/sqs/index.js index c93e5c5..40e62fe 100644 --- a/lib/services/sqs/index.js +++ b/lib/services/sqs/index.js @@ -1,3 +1,3 @@ -'use strict'; +'use strict' -module.exports = require('./SQS'); \ No newline at end of file +module.exports = require('./SQS') diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..048027d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2125 @@ +{ + "name": "cmr1-aws", + "version": "0.3.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + }, + "acorn-jsx": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", + "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", + "requires": { + "acorn": "^5.0.3" + } + }, + "ajv": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", + "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" + }, + "ansi-escape-sequences": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz", + "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=", + "dev": true, + "requires": { + "array-back": "^1.0.3" + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + }, + "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": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", + "dev": true, + "requires": { + "typical": "^2.6.0" + } + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "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.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "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": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "^4.14.0" + } + }, + "aws-sdk": { + "version": "2.325.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.325.0.tgz", + "integrity": "sha512-26V/4vzInQ5EO/+HCoZaXO5YB6XWo4sRXbNtc3bFEcUfMZ5Psin2M8McY/zasJyYbZuNisK608kjio+AXm8vig==", + "requires": { + "buffer": "4.9.1", + "events": "1.1.1", + "ieee754": "1.1.8", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.1.0", + "xml2js": "0.4.19" + }, + "dependencies": { + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + } + } + }, + "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=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^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=" + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + } + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer": { + "version": "4.9.1", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "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=" + }, + "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.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cmr1-cli": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/cmr1-cli/-/cmr1-cli-0.1.6.tgz", + "integrity": "sha1-thQRj1H4SJzv6tFaABMJkVsmJvA=", + "dev": true, + "requires": { + "cmr1-logger": "0.0.x", + "colors": "^1.1.2", + "command-line-args": "^3.0.5", + "command-line-usage": "^4.0.0", + "extend": "^3.0.0", + "readline-sync": "^1.4.6" + } + }, + "cmr1-logger": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/cmr1-logger/-/cmr1-logger-0.0.3.tgz", + "integrity": "sha1-/uJyeVAQWUIshTd9NvTC1jRxxOA=", + "dev": true, + "requires": { + "colors": "^1.1.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "command-line-args": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz", + "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=", + "dev": true, + "requires": { + "array-back": "^1.0.4", + "feature-detect-es6": "^1.3.1", + "find-replace": "^1.0.2", + "typical": "^2.6.0" + } + }, + "command-line-usage": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.0.0.tgz", + "integrity": "sha1-gWsyeItY+f66RNHm2sYPyuspteo=", + "dev": true, + "requires": { + "ansi-escape-sequences": "^3.0.0", + "array-back": "^1.0.4", + "table-layout": "^0.4.0", + "typical": "^2.6.0" + } + }, + "commander": { + "version": "2.15.1", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=" + }, + "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=", + "dev": true + }, + "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=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "deglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", + "requires": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^3.0.9", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + } + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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=" + }, + "eslint": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", + "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", + "requires": { + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "requires": { + "ms": "^2.1.1" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "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.7" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==" + }, + "eslint-config-standard-jsx": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", + "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==" + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "eslint-plugin-es": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.3.1.tgz", + "integrity": "sha512-9XcVyZiQRVeFjqHw8qHNDAZcQLqaHlOGGpeYqzYh8S4JYCWTCO3yzyen8yVmA5PratfzTRWDwCOFphtDEG+w/w==", + "requires": { + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "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" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "eslint-plugin-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", + "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "requires": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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.7" + } + } + } + }, + "eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==" + }, + "eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + } + }, + "eslint-plugin-standard": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", + "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==" + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==" + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + }, + "espree": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", + "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", + "requires": { + "acorn": "^5.6.0", + "acorn-jsx": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", + "dev": true + }, + "external-editor": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "feature-detect-es6": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.3.1.tgz", + "integrity": "sha1-+IhzavnLDJH1VmO/pHYuuW7nBH8=", + "dev": true, + "requires": { + "array-back": "^1.0.3" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "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=", + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "find-replace": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", + "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=", + "dev": true, + "requires": { + "array-back": "^1.0.4", + "test-value": "^2.1.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "requires": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.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.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" + }, + "glob": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", + "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==" + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "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.0.0" + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "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.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "5.2.0", + "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, + "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=" + }, + "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=" + }, + "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=" + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "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=" + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "requires": { + "array-includes": "^3.0.3" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "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=" + } + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "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" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "dev": true, + "requires": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "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==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "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.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "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=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } + }, + "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.0" + } + }, + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "requires": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "requires": { + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "requires": { + "find-up": "^1.0.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "readline-sync": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.6.tgz", + "integrity": "sha1-h/2s86FcUO6IdQJRsU3FpTHFkRg=", + "dev": true + }, + "reduce-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", + "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=", + "dev": true + }, + "regexpp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz", + "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==" + }, + "replace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.0.0.tgz", + "integrity": "sha512-5qUu+E1YMF9AMeVEoXa9VjEEgHk7cRNs3GWAN3Z1mt0ugwUxFuuXkDuoOS3nuvN9gH4KR/8Bd2R/Q944ofGtuA==", + "dev": true, + "requires": { + "colors": "1.2.4", + "minimatch": "3.0.4", + "nomnom": "1.8.1" + }, + "dependencies": { + "colors": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", + "integrity": "sha512-6Y+iBnWmXL+AWtlOp2Vr6R2w5MUlNJRwR0ShVFaAb1CqWzhPOpQg4L0jxD+xpw/Nc8QJwaq3KM79QUCriY8CWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "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=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + }, + "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" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "spdx-correct": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.1.tgz", + "integrity": "sha512-hxSPZbRZvSDuOvADntOElzJpenIR7wXJkuoUcUtS0erbgt2fgeaoPIYretfKpslMhfFDY4k0MZ2F5CUzhBsSvQ==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "standard": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", + "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", + "requires": { + "eslint": "~5.4.0", + "eslint-config-standard": "12.0.0", + "eslint-config-standard-jsx": "6.0.2", + "eslint-plugin-import": "~2.14.0", + "eslint-plugin-node": "~7.0.1", + "eslint-plugin-promise": "~4.0.0", + "eslint-plugin-react": "~7.11.1", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "~9.0.0" + } + }, + "standard-engine": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", + "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", + "requires": { + "deglob": "^2.1.0", + "get-stdin": "^6.0.0", + "minimist": "^1.1.0", + "pkg-conf": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "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=" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "table": { + "version": "4.0.3", + "resolved": "http://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "requires": { + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + }, + "table-layout": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.0.tgz", + "integrity": "sha1-xw/wRV2a3WO5H3wVp3kmKVwODn0=", + "dev": true, + "requires": { + "array-back": "^1.0.4", + "deep-extend": "~0.4.1", + "lodash.padend": "^4.6.1", + "typical": "^2.6.0", + "wordwrapjs": "^2.0.0" + } + }, + "test-value": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", + "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=", + "dev": true, + "requires": { + "array-back": "^1.0.3", + "typical": "^2.6.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "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 + }, + "typical": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.0.tgz", + "integrity": "sha1-idUVVKsTmEimW8wsh3L4+0UMQO0=", + "dev": true + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "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.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wordwrapjs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz", + "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=", + "dev": true, + "requires": { + "array-back": "^1.0.3", + "feature-detect-es6": "^1.3.1", + "reduce-flatten": "^1.0.1", + "typical": "^2.6.0" + } + }, + "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=", + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} diff --git a/package.json b/package.json index b46315c..90157c1 100644 --- a/package.json +++ b/package.json @@ -23,14 +23,15 @@ }, "dependencies": { "async": "^2.1.4", - "aws-sdk": "^2.7.21", + "aws-sdk": "^2.325.0", "colors": "^1.1.2", + "standard": "^12.0.1", "uuid": "^3.1.0" }, "devDependencies": { "chai": "^3.5.0", "cmr1-cli": "^0.1.0", - "mocha": "^3.2.0", - "replace": "^0.3.0" + "mocha": "^5.2.0", + "replace": "^1.0.0" } } diff --git a/test/primitives/AWSResource.spec.js b/test/primitives/AWSResource.spec.js index cf79e79..f63231b 100644 --- a/test/primitives/AWSResource.spec.js +++ b/test/primitives/AWSResource.spec.js @@ -1,12 +1,12 @@ -'use strict'; +'use strict' -const expect = require('chai').expect; +const expect = require('chai').expect // Require AWSResource Class -const { AWSResource } = require('../../lib/primitives'); +const { AWSResource } = require('../../lib/primitives') -describe('AWSResource', function() { - it('should exist', function() { - expect(AWSResource).to.exist; - }); -}); +describe('AWSResource', function () { + it('should exist', function () { + expect(AWSResource).to.exist + }) +}) diff --git a/test/primitives/AWSService.spec.js b/test/primitives/AWSService.spec.js index c471e19..7927bef 100644 --- a/test/primitives/AWSService.spec.js +++ b/test/primitives/AWSService.spec.js @@ -1,12 +1,12 @@ -'use strict'; +'use strict' -const expect = require('chai').expect; +const expect = require('chai').expect // Require AWSService Class -const { AWSService } = require('../../lib/primitives'); +const { AWSService } = require('../../lib/primitives') -describe('AWSService', function() { - it('should exist', function() { - expect(AWSService).to.exist; - }); -}); +describe('AWSService', function () { + it('should exist', function () { + expect(AWSService).to.exist + }) +}) diff --git a/test/primitives/Dynamic.spec.js b/test/primitives/Dynamic.spec.js index e034816..4a67c87 100644 --- a/test/primitives/Dynamic.spec.js +++ b/test/primitives/Dynamic.spec.js @@ -1,12 +1,12 @@ -'use strict'; +'use strict' -const expect = require('chai').expect; +const expect = require('chai').expect // Require Dynamic Class -const { Dynamic } = require('../../lib/primitives'); +const { Dynamic } = require('../../lib/primitives') -describe('Dynamic', function() { - it('should exist', function() { - expect(Dynamic).to.exist; - }); -}); \ No newline at end of file +describe('Dynamic', function () { + it('should exist', function () { + expect(Dynamic).to.exist + }) +}) diff --git a/test/primitives/Utility.spec.js b/test/primitives/Utility.spec.js index e9e81ce..fa8050f 100644 --- a/test/primitives/Utility.spec.js +++ b/test/primitives/Utility.spec.js @@ -1,12 +1,12 @@ -'use strict'; +'use strict' -const expect = require('chai').expect; +const expect = require('chai').expect // Require Utility Class -const { Utility } = require('../../lib/primitives'); +const { Utility } = require('../../lib/primitives') -describe('Utility', function() { - it('should exist', function() { - expect(Utility).to.exist; - }); -}); +describe('Utility', function () { + it('should exist', function () { + expect(Utility).to.exist + }) +}) diff --git a/test/services/ACM.spec.js b/test/services/ACM.spec.js index e959b13..9cddda8 100644 --- a/test/services/ACM.spec.js +++ b/test/services/ACM.spec.js @@ -1,105 +1,105 @@ -'use strict'; +'use strict' -const fs = require('fs'); -const path = require('path'); -const async = require('async'); -const expect = require('chai').expect; +const fs = require('fs') +const path = require('path') +const async = require('async') +const expect = require('chai').expect // Require ACM AWSService Class -const { ACM } = require('../../'); +const { ACM } = require('../../') describe('ACM', function () { - const acm = new ACM(); - let certCount = 0; - - it('should exist', function () { - expect(ACM).to.exist; - }); - - it('instance has supported methods', function () { - acm.supportedMethods().forEach(methodConfig => { - expect(acm[methodConfig.method]).to.be.a('function'); - }); - }); - - it('should be able to get certificates', function (done) { - acm.getCertificates(certs => { - expect(certs).to.be.an('array'); - expect(certs.length).to.be.at.least(0); - - certCount = certs.length; - - done(); - }); - }); - - describe('Certificate', function () { - let cert = null; - const certDomain = 'acm.test.aws.cmr1.com'; - const certData = { - Certificate: fs.readFileSync(path.join(__dirname, '..', 'certs', 'cert.pem')), /* required */ - PrivateKey: fs.readFileSync(path.join(__dirname, '..', 'certs', 'privkey.pem')), /* required */ - CertificateChain: fs.readFileSync(path.join(__dirname, '..', 'certs', 'chain.pem')) - }; - - before(function (done) { - done(); - - // acm.createCertificate(certData, objCert => { - // expect(objCert).to.be.an.instanceOf(ACM.Certificate); - - // done(); - // }); - }); - - // it('should be able to update an existing cert', function (done) { - // acm.createOrUpdateCert(certDomain, certData, cert => { - // expect(cert).to.be.an.instanceOf(ACM.Certificate); - - // done(); - // }); - // }); - - // it('should be able to create another cert', function (done) { - // acm.createCertificate(certData, cert => { - // expect(cert).to.be.an.instanceOf(ACM.Certificate); - - // acm.getCertificates(certs => { - // expect(certs).to.be.an('array'); - // expect(certs.length).to.greaterThan(1); - - // done(); - // }); - // }); - // }); - - // it('should be able to delete an existing cert', function (done) { - // expect(cert).to.be.an.instanceof(ACM.Certificate); - - // cert.delete(done); - // }); - - after(function (done) { - // acm.getCertificates(certs => { - // async.each(certs, (cert, next) => { - // expect(cert).to.be.an.instanceof(ACM.Certificate); - - // cert.delete(next); - // }, err => { - // expect(err).to.be.empty; - - // done(); - // }); - // }); - }); - }); + const acm = new ACM() + let certCount = 0 + + it('should exist', function () { + expect(ACM).to.exist + }) + + it('instance has supported methods', function () { + acm.supportedMethods().forEach(methodConfig => { + expect(acm[methodConfig.method]).to.be.a('function') + }) + }) + + it('should be able to get certificates', function (done) { + acm.getCertificates(certs => { + expect(certs).to.be.an('array') + expect(certs.length).to.be.at.least(0) + + certCount = certs.length + + done() + }) + }) + + describe('Certificate', function () { + let cert = null + const certDomain = 'acm.test.aws.cmr1.com' + const certData = { + Certificate: fs.readFileSync(path.join(__dirname, '..', 'certs', 'cert.pem')), /* required */ + PrivateKey: fs.readFileSync(path.join(__dirname, '..', 'certs', 'privkey.pem')), /* required */ + CertificateChain: fs.readFileSync(path.join(__dirname, '..', 'certs', 'chain.pem')) + } + + before(function (done) { + done() + + // acm.createCertificate(certData, objCert => { + // expect(objCert).to.be.an.instanceOf(ACM.Certificate); + + // done(); + // }); + }) + + // it('should be able to update an existing cert', function (done) { + // acm.createOrUpdateCert(certDomain, certData, cert => { + // expect(cert).to.be.an.instanceOf(ACM.Certificate); + + // done(); + // }); + // }); + + // it('should be able to create another cert', function (done) { + // acm.createCertificate(certData, cert => { + // expect(cert).to.be.an.instanceOf(ACM.Certificate); + + // acm.getCertificates(certs => { + // expect(certs).to.be.an('array'); + // expect(certs.length).to.greaterThan(1); + + // done(); + // }); + // }); + // }); + + // it('should be able to delete an existing cert', function (done) { + // expect(cert).to.be.an.instanceof(ACM.Certificate); + + // cert.delete(done); + // }); after(function (done) { - acm.getCertificates(certs => { - expect(certs).to.be.an('array'); - expect(certs.length).to.equal(certCount); - - done(); - }); - }); -}); \ No newline at end of file + // acm.getCertificates(certs => { + // async.each(certs, (cert, next) => { + // expect(cert).to.be.an.instanceof(ACM.Certificate); + + // cert.delete(next); + // }, err => { + // expect(err).to.be.empty; + + // done(); + // }); + // }); + }) + }) + + after(function (done) { + acm.getCertificates(certs => { + expect(certs).to.be.an('array') + expect(certs.length).to.equal(certCount) + + done() + }) + }) +}) diff --git a/test/services/ECS.spec.js b/test/services/ECS.spec.js index bfc1db1..8b04c3e 100644 --- a/test/services/ECS.spec.js +++ b/test/services/ECS.spec.js @@ -1,158 +1,157 @@ -'use strict'; +'use strict' -const expect = require('chai').expect; +const expect = require('chai').expect // Require ECS AWSService Class -const { ECS } = require('../../'); - -describe('ECS', function() { - const ecs = new ECS(); - const clusterName = 'cmr1-aws-test-' + Date.now().toString(); - let cluster = null; - - before(function(done) { - ecs.newCluster({ clusterName }, objCluster => { - if (objCluster) { - cluster = objCluster; - done(); - } else { - done('Unable to create/load cluster: ' + clusterName); - } - }); - }); - - after(function(done) { - cluster.delete(resp => { - done(); - }); - }); - - it('should exist', function() { - expect(ECS).to.exist; - }); - - it('instance has supported methods', function() { - ecs.supportedMethods().forEach(methodConfig => { - expect(ecs[methodConfig.method]).to.be.a('function'); - }); - }); - - it('should be able to get clusters', function(done) { - ecs.getClusters(clusters => { - expect(clusters).to.be.an.instanceof(Array); - - if (clusters.length > 0) { - expect(clusters[0]).to.be.an.instanceof(ECS.Cluster); - } - - done(); - }); - }); - - it('should be able to get task definitions', function(done) { - ecs.getTaskDefinitions({ maxResults: 1 }, taskDefinitions => { - expect(taskDefinitions).to.be.an.instanceof(Array); - - if (taskDefinitions.length > 0) { - expect(taskDefinitions[0]).to.be.an.instanceof(ECS.TaskDefinition); - } - - done(); - }); - }); - - describe('Cluster', function() { - it('instance has supported methods', function() { - cluster.supportedMethods().forEach(methodConfig => { - expect(cluster[methodConfig.method]).to.be.a('function'); - }); - }); - - it('should be able to get a list of container instances', function(done) { - cluster.getContainerInstances({ maxResults: 1}, containerInstances => { - expect(containerInstances).to.be.an.instanceof(Array); - - if (containerInstances.length > 0) { - expect(containerInstances[0]).to.be.an.instanceof(ECS.Cluster.ContainerInstance); - } - - done(); - }); - }); - - it('should be able to get a list of services', function(done) { - cluster.getServices({ maxResults: 1}, services => { - expect(services).to.be.an.instanceof(Array); - - if (services.length > 0) { - expect(services[0]).to.be.an.instanceof(ECS.Cluster.Service); - } - - done(); - }); - }); - - it('should be able to get a list of tasks', function(done) { - cluster.getTasks({ maxResults: 1}, tasks => { - expect(tasks).to.be.an.instanceof(Array); - - if (tasks.length > 0) { - expect(tasks[0]).to.be.an.instanceof(ECS.Cluster.Task); - } - - done(); - }); - }); - }); - - describe('TaskDefinition', function() { - const taskDefinitionFamily = 'cmr1-aws-test-' + Date.now().toString(); - let taskDefinition = null; - - before(function(done) { - const params = { - family: taskDefinitionFamily, - containerDefinitions: [ - { - name: taskDefinitionFamily, - image: 'hello-world', - cpu: 128, - memory: 128 - } - ] - }; - - ecs.newTaskDefinition(params, objTaskDefinition => { - if (objTaskDefinition) { - taskDefinition = objTaskDefinition; - done(); - } else { - done('Unable to create/revision task definition: ' + taskDefinitionFamily); - } - }); - }); - - after(function(done) { - taskDefinition.delete(resp => { - done(); - }); - }); - - it('instance has supported methods', function() { - taskDefinition.supportedMethods().forEach(methodConfig => { - expect(taskDefinition[methodConfig.method]).to.be.a('function'); - }); - }); - - - // Wait to simulate until EC2 instances are being spun up for cluster... - - // it('should be able to be run by a cluster', function(done) { - // cluster.runTaskDefinition(taskDefinition, tasks => { - // expect(tasks.length).to.be.greaterThan(0); - - // expect(tasks[0]).to.be.an.instanceof(ECS.Cluster.Task); - // }); - // }); - }); -}); \ No newline at end of file +const { ECS } = require('../../') + +describe('ECS', function () { + const ecs = new ECS() + const clusterName = 'cmr1-aws-test-' + Date.now().toString() + let cluster = null + + before(function (done) { + ecs.newCluster({ clusterName }, objCluster => { + if (objCluster) { + cluster = objCluster + done() + } else { + done('Unable to create/load cluster: ' + clusterName) + } + }) + }) + + after(function (done) { + cluster.delete(resp => { + done() + }) + }) + + it('should exist', function () { + expect(ECS).to.exist + }) + + it('instance has supported methods', function () { + ecs.supportedMethods().forEach(methodConfig => { + expect(ecs[methodConfig.method]).to.be.a('function') + }) + }) + + it('should be able to get clusters', function (done) { + ecs.getClusters(clusters => { + expect(clusters).to.be.an.instanceof(Array) + + if (clusters.length > 0) { + expect(clusters[0]).to.be.an.instanceof(ECS.Cluster) + } + + done() + }) + }) + + it('should be able to get task definitions', function (done) { + ecs.getTaskDefinitions({ maxResults: 1 }, taskDefinitions => { + expect(taskDefinitions).to.be.an.instanceof(Array) + + if (taskDefinitions.length > 0) { + expect(taskDefinitions[0]).to.be.an.instanceof(ECS.TaskDefinition) + } + + done() + }) + }) + + describe('Cluster', function () { + it('instance has supported methods', function () { + cluster.supportedMethods().forEach(methodConfig => { + expect(cluster[methodConfig.method]).to.be.a('function') + }) + }) + + it('should be able to get a list of container instances', function (done) { + cluster.getContainerInstances({ maxResults: 1 }, containerInstances => { + expect(containerInstances).to.be.an.instanceof(Array) + + if (containerInstances.length > 0) { + expect(containerInstances[0]).to.be.an.instanceof(ECS.Cluster.ContainerInstance) + } + + done() + }) + }) + + it('should be able to get a list of services', function (done) { + cluster.getServices({ maxResults: 1 }, services => { + expect(services).to.be.an.instanceof(Array) + + if (services.length > 0) { + expect(services[0]).to.be.an.instanceof(ECS.Cluster.Service) + } + + done() + }) + }) + + it('should be able to get a list of tasks', function (done) { + cluster.getTasks({ maxResults: 1 }, tasks => { + expect(tasks).to.be.an.instanceof(Array) + + if (tasks.length > 0) { + expect(tasks[0]).to.be.an.instanceof(ECS.Cluster.Task) + } + + done() + }) + }) + }) + + describe('TaskDefinition', function () { + const taskDefinitionFamily = 'cmr1-aws-test-' + Date.now().toString() + let taskDefinition = null + + before(function (done) { + const params = { + family: taskDefinitionFamily, + containerDefinitions: [ + { + name: taskDefinitionFamily, + image: 'hello-world', + cpu: 128, + memory: 128 + } + ] + } + + ecs.newTaskDefinition(params, objTaskDefinition => { + if (objTaskDefinition) { + taskDefinition = objTaskDefinition + done() + } else { + done('Unable to create/revision task definition: ' + taskDefinitionFamily) + } + }) + }) + + after(function (done) { + taskDefinition.delete(resp => { + done() + }) + }) + + it('instance has supported methods', function () { + taskDefinition.supportedMethods().forEach(methodConfig => { + expect(taskDefinition[methodConfig.method]).to.be.a('function') + }) + }) + + // Wait to simulate until EC2 instances are being spun up for cluster... + + // it('should be able to be run by a cluster', function(done) { + // cluster.runTaskDefinition(taskDefinition, tasks => { + // expect(tasks.length).to.be.greaterThan(0); + + // expect(tasks[0]).to.be.an.instanceof(ECS.Cluster.Task); + // }); + // }); + }) +}) diff --git a/test/services/Route53.spec.js b/test/services/Route53.spec.js index 536d280..1d17ad1 100644 --- a/test/services/Route53.spec.js +++ b/test/services/Route53.spec.js @@ -1,66 +1,66 @@ -'use strict'; +'use strict' -const uuid = require('uuid'); -const expect = require('chai').expect; +const uuid = require('uuid') +const expect = require('chai').expect // Require Route53 AWSService Class -const { Route53 } = require('../../'); +const { Route53 } = require('../../') -describe('Route53', function() { - const r53 = new Route53(); +describe('Route53', function () { + const r53 = new Route53() - it('should exist', function() { - expect(Route53).to.exist; - }); + it('should exist', function () { + expect(Route53).to.exist + }) - it('instance has supported methods', function() { - r53.supportedMethods().forEach(methodConfig => { - expect(r53[methodConfig.method]).to.be.a('function'); - }); - }); + it('instance has supported methods', function () { + r53.supportedMethods().forEach(methodConfig => { + expect(r53[methodConfig.method]).to.be.a('function') + }) + }) - it('should be able to create and delete zones', function(done) { - this.timeout(10000); + it('should be able to create and delete zones', function (done) { + this.timeout(10000) - r53.getZoneCount(startingCount => { - expect(startingCount).to.be.a('number'); - expect(startingCount).to.be.at.least(0); + r53.getZoneCount(startingCount => { + expect(startingCount).to.be.a('number') + expect(startingCount).to.be.at.least(0) - r53.createZone({ - Name: 'route53.aws.test.cmr1.com', - CallerReference: uuid.v1() - }, zone => { - expect(zone).to.be.an.instanceof(Route53.Zone); + r53.createZone({ + Name: 'route53.aws.test.cmr1.com', + CallerReference: uuid.v1() + }, zone => { + expect(zone).to.be.an.instanceof(Route53.Zone) - zone.delete(resp => { - expect(resp.ChangeInfo).to.exist; + zone.delete(resp => { + expect(resp.ChangeInfo).to.exist - r53.getZoneCount(endingCount => { - expect(endingCount).to.equal(startingCount); - done(); - }); - }); - }) - }); - }); + r53.getZoneCount(endingCount => { + expect(endingCount).to.equal(startingCount) + done() + }) + }) + }) + }) + }) - it('should be able to get zones and verify total count', function(done) { - this.timeout(10000); + it('should be able to get zones and verify total count', function (done) { + this.timeout(10000) - r53.getZoneCount(count => { - expect(count).to.be.a('number'); - expect(count).to.be.at.least(0); + r53.getZoneCount(count => { + expect(count).to.be.a('number') + expect(count).to.be.at.least(0) - r53.getZones(zones => { - expect(zones).to.be.an.instanceof(Array); - expect(zones.length).to.equal(count); + r53.getZones(zones => { + expect(zones).to.be.an.instanceof(Array) + expect(zones.length).to.equal(count) - if (zones.length > 0) { - expect(zones[0]).to.be.an.instanceof(Route53.Zone); - } + if (zones.length > 0) { + expect(zones[0]).to.be.an.instanceof(Route53.Zone) + } - done(); - }); - }); - }); -}); \ No newline at end of file + done() + }) + }) + }) +}) diff --git a/test/services/S3.spec.js b/test/services/S3.spec.js index 8320614..a76c18b 100644 --- a/test/services/S3.spec.js +++ b/test/services/S3.spec.js @@ -1,60 +1,60 @@ -'use strict'; +'use strict' -const expect = require('chai').expect; +const expect = require('chai').expect // Require S3 AWSService Class -const { S3 } = require('../../'); +const { S3 } = require('../../') -describe('S3', function() { - const s3 = new S3(); +describe('S3', function () { + const s3 = new S3() - it('should exist', function() { - expect(S3).to.exist; - }); + it('should exist', function () { + expect(S3).to.exist + }) - it('instance has supported methods', function() { - s3.supportedMethods().forEach(methodConfig => { - expect(s3[methodConfig.method]).to.be.a('function'); - }); - }); + it('instance has supported methods', function () { + s3.supportedMethods().forEach(methodConfig => { + expect(s3[methodConfig.method]).to.be.a('function') + }) + }) - it('should be able to get buckets', function(done) { - s3.getBuckets(buckets => { - expect(buckets).to.be.an.instanceof(Array); + it('should be able to get buckets', function (done) { + s3.getBuckets(buckets => { + expect(buckets).to.be.an.instanceof(Array) - if (buckets.length > 0) { - expect(buckets[0]).to.be.an.instanceof(S3.Bucket); - } + if (buckets.length > 0) { + expect(buckets[0]).to.be.an.instanceof(S3.Bucket) + } - done(); - }); - }); + done() + }) + }) - describe('Bucket', function() { - let bucket = null; + describe('Bucket', function () { + let bucket = null - before(function(done) { - s3.getBuckets(buckets => { - if (buckets.length > 0) { - bucket = buckets[0]; - } + before(function (done) { + s3.getBuckets(buckets => { + if (buckets.length > 0) { + bucket = buckets[0] + } - expect(bucket).to.exist; + expect(bucket).to.exist - done(); - }); - }); + done() + }) + }) - it('instance has supported methods', function() { - bucket.supportedMethods().forEach(methodConfig => { - expect(bucket[methodConfig.method]).to.be.a('function'); - }); - }); + it('instance has supported methods', function () { + bucket.supportedMethods().forEach(methodConfig => { + expect(bucket[methodConfig.method]).to.be.a('function') + }) + }) - it('should be able to get a list of items', function() { - bucket.getItems(items => { + it('should be able to get a list of items', function () { + bucket.getItems(items => { - }) - }) - }); -}); \ No newline at end of file + }) + }) + }) +}) diff --git a/test/services/SES.spec.js b/test/services/SES.spec.js index a65ba07..112169c 100644 --- a/test/services/SES.spec.js +++ b/test/services/SES.spec.js @@ -1,140 +1,139 @@ -'use strict'; +'use strict' -const expect = require('chai').expect; +const expect = require('chai').expect -const { SES } = require('../../'); +const { SES } = require('../../') +describe('SES', function () { + let ses = null -describe('SES', function() { - let ses = null; + before(function (done) { + ses = new SES() - before(function(done) { - ses = new SES(); + expect(ses).to.be.an.instanceof(SES) - expect(ses).to.be.an.instanceof(SES); + done() + }) - done(); - }); + it('should exist', function () { + expect(SES).to.exist + }) - it('should exist', function() { - expect(SES).to.exist; - }); + describe('Email', function () { + let email = null + const to = 'to@example.com' + const cc = 'cc@example.com' + const bcc = 'bcc@example.com' + const from = 'noreply@example.com' + const replyTo = 'replyto@example.com' + const subject = 'Test Email' + const body = 'This is a message. With HTML' + const bodyType = 'html' - describe('Email', function() { - let email = null; - const to = 'to@example.com'; - const cc = 'cc@example.com'; - const bcc = 'bcc@example.com'; - const from = 'noreply@example.com'; - const replyTo = 'replyto@example.com'; - const subject = 'Test Email'; - const body = 'This is a message. With HTML'; - const bodyType = 'html'; + before(function (done) { + email = ses.newEmail() - before(function(done) { - email = ses.newEmail(); + expect(email).to.be.an.instanceof(SES.Email) - expect(email).to.be.an.instanceof(SES.Email); + done() + }) - done(); - }); + it('should be able to set "to"', function (done) { + email.setTo(to) - it('should be able to set "to"', function(done) { - email.setTo(to); + expect(email._to.length).to.equal(1) - expect(email._to.length).to.equal(1); + expect(email._to[0]).to.equal(to) - expect(email._to[0]).to.equal(to); + done() + }) - done(); - }); + it('should be able to set "cc"', function (done) { + email.setCc(cc) - it('should be able to set "cc"', function(done) { - email.setCc(cc); + expect(email._cc.length).to.equal(1) - expect(email._cc.length).to.equal(1); + expect(email._cc[0]).to.equal(cc) - expect(email._cc[0]).to.equal(cc); + done() + }) - done(); - }); + it('should be able to set "bcc"', function (done) { + email.setBcc(bcc) - it('should be able to set "bcc"', function(done) { - email.setBcc(bcc); + expect(email._bcc.length).to.equal(1) - expect(email._bcc.length).to.equal(1); + expect(email._bcc[0]).to.equal(bcc) - expect(email._bcc[0]).to.equal(bcc); + done() + }) - done(); - }); + it('should be able to set "from"', function (done) { + email.setFrom(from) - it('should be able to set "from"', function(done) { - email.setFrom(from); + expect(email._from).to.equal(from) - expect(email._from).to.equal(from); + done() + }) - done(); - }); + it('should be able to set "replyTo"', function (done) { + email.setReplyTo(replyTo) - it('should be able to set "replyTo"', function(done) { - email.setReplyTo(replyTo); + expect(email._replyTo.length).to.equal(1) - expect(email._replyTo.length).to.equal(1); + expect(email._replyTo[0]).to.equal(replyTo) - expect(email._replyTo[0]).to.equal(replyTo); + done() + }) - done(); - }); + it('should be able to set "subject"', function (done) { + email.setSubject(subject) - it('should be able to set "subject"', function(done) { - email.setSubject(subject); + expect(email._subject).to.equal(subject) - expect(email._subject).to.equal(subject); + done() + }) - done(); - }); + it('should be able to set "body"', function (done) { + email.setBody(body) - it('should be able to set "body"', function(done) { - email.setBody(body); + expect(email._body).to.equal(body) - expect(email._body).to.equal(body); + done() + }) - done(); - }); + it('should be able to set "bodyType"', function (done) { + email.setFrom(bodyType) - it('should be able to set "bodyType"', function(done) { - email.setFrom(bodyType); + expect(email._bodyType).to.equal(bodyType) - expect(email._bodyType).to.equal(bodyType); + done() + }) - done(); - }); + after(function (done) { + const data = { + Source: from, + Destination: { + ToAddresses: [ to ], + CcAddresses: [ cc ], + BccAddresses: [ bcc ] + }, + Message: { + Subject: { + Data: subject + }, + Body: { + Html: { + Data: body + } + } + }, + ReplyToAddresses: [ replyTo ] + } - after(function(done) { - const data = { - Source: from, - Destination: { - ToAddresses: [ to ], - CcAddresses: [ cc ], - BccAddresses:[ bcc ] - }, - Message: { - Subject: { - Data: subject - }, - Body: { - Html: { - Data: body - } - } - }, - ReplyToAddresses: [ replyTo ] - }; + expect(email.getMessageData()).to.eql(data) - expect(email.getMessageData()).to.eql(data); - - done(); - }); - }); -}); + done() + }) + }) +}) diff --git a/test/services/SQS.spec.js b/test/services/SQS.spec.js index 71ecc1e..4537aa8 100644 --- a/test/services/SQS.spec.js +++ b/test/services/SQS.spec.js @@ -1,68 +1,67 @@ -'use strict'; +'use strict' -const expect = require('chai').expect; +const expect = require('chai').expect // Require SQS AWSService Class -const { SQS } = require('../../'); - - -describe('SQS', function() { - const sqs = new SQS(); - - const queueParams = { - QueueName: 'cmr1-aws-mocha-test' - }; - - it('should exist', function() { - expect(SQS).to.exist; - }); - - describe('Queue', function() { - const queueName = 'cmr1-aws-test-' + Date.now().toString(); - let queue = null; - - before(function(done) { - sqs.getQueue({ QueueName: queueName }, objQueue => { - if (objQueue) { - queue = objQueue; - done(); - } else { - done('Unable to create/load queue: ' + queueName); - } - }); - }); - - after(function(done) { - queue.delete(resp => { - done(); - }); - }); - - it('should be able to send & receive messages', function(done) { - const msgBody = 'This is a test message'; - - const myMessage = queue.newMessage({ - Body: msgBody - }); - - queue.listen({ MaxNumberOfMessages: 1 }, msgs => { - expect(msgs).to.be.an.instanceof(Array); - - const expected = msgs.filter(msg => { - return msg.Body === msgBody - }); - - expect(expected).to.have.length.above(0); - - expect(expected[0]).to.be.an.instanceof(SQS.Queue.Message); - expect(expected[0].toString()).to.match(/\[[^\]]+\] - '.+'/) - - expected[0].delete(response => { - done(); - }); - }); - - myMessage.send(); - }); - }); -}); +const { SQS } = require('../../') + +describe('SQS', function () { + const sqs = new SQS() + + const queueParams = { + QueueName: 'cmr1-aws-mocha-test' + } + + it('should exist', function () { + expect(SQS).to.exist + }) + + describe('Queue', function () { + const queueName = 'cmr1-aws-test-' + Date.now().toString() + let queue = null + + before(function (done) { + sqs.getQueue({ QueueName: queueName }, objQueue => { + if (objQueue) { + queue = objQueue + done() + } else { + done('Unable to create/load queue: ' + queueName) + } + }) + }) + + after(function (done) { + queue.delete(resp => { + done() + }) + }) + + it('should be able to send & receive messages', function (done) { + const msgBody = 'This is a test message' + + const myMessage = queue.newMessage({ + Body: msgBody + }) + + queue.listen({ MaxNumberOfMessages: 1 }, msgs => { + expect(msgs).to.be.an.instanceof(Array) + + const expected = msgs.filter(msg => { + return msg.Body === msgBody + }) + + expect(expected).to.have.length.above(0) + + expect(expected[0]).to.be.an.instanceof(SQS.Queue.Message) + expect(expected[0].toString()).to.match(/\[[^\]]+\] - '.+'/) + + expected[0].delete(response => { + done() + }) + }) + + myMessage.send() + }) + }) +}) From a737c1d27a4a5a6f452307cb68355a4928007ed9 Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Sat, 29 Sep 2018 16:43:26 -0600 Subject: [PATCH 02/12] WIP - Add poll function for SQS::Queue Use async.queue for built-in concurrency limits on workers --- examples/scratch.js | 33 +++++++++---- lib/primitives/AWSService.js | 90 ++++++++++++++++++++---------------- lib/primitives/Dynamic.js | 2 +- lib/services/sqs/Message.js | 7 ++- lib/services/sqs/Queue.js | 42 +++++++++++++---- lib/services/sqs/SQS.js | 8 ++-- 6 files changed, 118 insertions(+), 64 deletions(-) diff --git a/examples/scratch.js b/examples/scratch.js index 9f07fb6..9fbb2fb 100644 --- a/examples/scratch.js +++ b/examples/scratch.js @@ -5,20 +5,33 @@ const uuid = require('uuid') const { S3, SQS, Route53, ECS, ACM } = require('../lib/services') -const r53 = new Route53() +const sqs = new SQS() -const params = { - Name: 'somethingfancy-bowtie.io', - CallerReference: uuid.v1() +const run = async () => { + const queue = await sqs.getQueue({ QueueName: 'test-queue' }) + console.log('queue', queue) + + const msgs = await queue.listen({}) + + console.log('msgs', msgs) } -r53.createZone(params, zone => { - console.log(zone) +run() + +// const r53 = new Route53() + +// const params = { +// Name: 'somethingfancy-bowtie.io', +// CallerReference: uuid.v1() +// } + +// r53.createZone(params, zone => { +// console.log(zone) - zone.delete(resp => { - console.log(resp) - }) -}) +// zone.delete(resp => { +// console.log(resp) +// }) +// }) // const acm = new ACM({ // region: process.env.AWS_DEFAULT_REGION || 'us-east-1' diff --git a/lib/primitives/AWSService.js b/lib/primitives/AWSService.js index 7a101ef..03d4acf 100644 --- a/lib/primitives/AWSService.js +++ b/lib/primitives/AWSService.js @@ -73,61 +73,73 @@ class AWSService extends Dynamic { } generic () { - const { method, params, callback, required } = AWSService.getArgs(arguments) + return new Promise( + (resolve, reject) => { + const { method, params, callback, required } = AWSService.getArgs(arguments) - if (required) { - AWSService.requireParams(params, required) - } + if (required) { + AWSService.requireParams(params, required) + } - if (typeof callback !== 'function') { - AWSService.warn(`Executing generic method '${method}' without callback!`) - } + if (typeof callback !== 'function') { + AWSService.warn(`Executing generic method '${method}' without callback!`) + } - AWSService.debug('Executing method:', method, 'with params:', params) + AWSService.debug('Executing method:', method, 'with params:', params) - let isFinished = true + let isFinished = true - const responses = [] + const responses = [] - async.doWhilst( - (next) => { - this.exec(method, params).then(data => { - AWSService.debug('Result:', data) + async.doWhilst( + (next) => { + this.exec(method, params).then(data => { + AWSService.debug('Result:', data) - responses.push(data) + responses.push(data) - isFinished = !this.autoPaginate || (this.autoPaginate && !(data.IsTruncated || data.nextToken)) + isFinished = !this.autoPaginate || (this.autoPaginate && !(data.IsTruncated || data.nextToken)) - if (data.IsTruncated) { - AWSService.debug('Result is truncated') + if (data.IsTruncated) { + AWSService.debug('Result is truncated') - let nextMarker = data.NextMarker + let nextMarker = data.NextMarker - if (typeof nextMarker !== 'string') { - nextMarker = data.Contents[data.Contents.length - 1].Key - } + if (typeof nextMarker !== 'string') { + nextMarker = data.Contents[data.Contents.length - 1].Key + } - AWSService.debug('Load nextMarker:', nextMarker) + AWSService.debug('Load nextMarker:', nextMarker) - params.Marker = nextMarker - } else if (data.nextToken) { - AWSService.debug('Result is truncated') + params.Marker = nextMarker + } else if (data.nextToken) { + AWSService.debug('Result is truncated') - AWSService.debug('Load nextToken:', data.nextToken) + AWSService.debug('Load nextToken:', data.nextToken) - params.nextToken = data.nextToken - } + params.nextToken = data.nextToken + } - next() - }).catch(AWSService.error) - }, - () => { - return !isFinished - }, - (err) => { - if (typeof callback === 'function') { - callback(this.reduceResponses(responses)) - } + next() + }).catch(AWSService.error) + }, + () => { + return !isFinished + }, + (err) => { + const response = this.reduceResponses(responses) + + if (typeof callback === 'function') { + callback(response) + } + + if (err) { + reject(err) + } else { + resolve(response) + } + } + ) } ) } diff --git a/lib/primitives/Dynamic.js b/lib/primitives/Dynamic.js index 50f0215..82bc27a 100644 --- a/lib/primitives/Dynamic.js +++ b/lib/primitives/Dynamic.js @@ -46,7 +46,7 @@ class Dynamic extends Utility { Dynamic.debug(`Calling generic execution for method '${method}' with params:`, compiledParams) - service.generic(method, compiledParams, callback, required) + return service.generic(method, compiledParams, callback, required) } } else { Dynamic.warn(`Invalid method '${method}' for this ${this.name}`) diff --git a/lib/services/sqs/Message.js b/lib/services/sqs/Message.js index a211b49..b82b833 100644 --- a/lib/services/sqs/Message.js +++ b/lib/services/sqs/Message.js @@ -34,12 +34,15 @@ class Message extends AWSResource { Message.debug(`Sending message: ${this.Body}`) - this.sendMessage(params, response => { + return this.sendMessage(params, response => { this.setProperties(response) if (typeof callback === 'function') { callback(response) } + }).then((response) => { + this.setProperties(response) + return Promise.resolve(response) }) } @@ -48,7 +51,7 @@ class Message extends AWSResource { Message.debug(`Deleting message: ${this.MessageId}`) - this.deleteMessage(params, callback) + return this.deleteMessage(params, callback) } supportedMethods () { diff --git a/lib/services/sqs/Queue.js b/lib/services/sqs/Queue.js index 679aba0..7e90a5a 100644 --- a/lib/services/sqs/Queue.js +++ b/lib/services/sqs/Queue.js @@ -1,16 +1,21 @@ 'use strict' const path = require('path') +const async = require('async') const primitivesPath = path.join('..', '..', 'primitives') const AWSResource = require(primitivesPath).AWSResource const Message = require('./Message') +const DEFAULT_CONCURRENCY = 1 + class Queue extends AWSResource { constructor () { super(...arguments) + this.concurrency = this.concurrency || DEFAULT_CONCURRENCY + this.setDefaultParams({ QueueUrl: this.name }) @@ -30,7 +35,7 @@ class Queue extends AWSResource { Body: bodyObject ? JSON.stringify(bodyObject) : bodyString }) - newMessage.send(callback) + return newMessage.send(callback) } newMessage () { @@ -42,7 +47,7 @@ class Queue extends AWSResource { delete () { const { params, callback } = Queue.getArgs(arguments) - this.deleteQueue(params, callback) + return this.deleteQueue(params, callback) } listen () { @@ -50,15 +55,34 @@ class Queue extends AWSResource { Queue.debug(`Listening to queue url: `, this.defaultParams) - this.receiveMessage(params, data => { - if (data.Messages) { - callback(data.Messages.map(msg => { - return new Message(msg, this) - })) + return this.receiveMessage(params, data => { + const { Messages = [] } = data + + if (typeof callback === 'function') { + callback(Messages.map(msg => new Message(msg, this))) } + }).then(({ Messages = [] }) => + Promise.resolve( + Messages.map(msg => new Message(msg, this)) + ) + ) + } - this.listen(...arguments) - }) + async poll() { + const { callback } = Queue.getArgs(arguments) + + const workers = async.queue(callback, this.concurrency) + + workers.empty = async () => await this.pol(...arguments) + + const msgs = await this.listen() + + if (msgs.length > 0) { + workers.push(msgs, callback) + + } else { + await this.poll(...arguments) + } } supportedMethods () { diff --git a/lib/services/sqs/SQS.js b/lib/services/sqs/SQS.js index 93ee9a2..eb94601 100644 --- a/lib/services/sqs/SQS.js +++ b/lib/services/sqs/SQS.js @@ -19,9 +19,11 @@ class SQS extends AWSService { getQueue () { const { params, callback } = Queue.getArgs(arguments) - this.createQueue(params, data => { - return callback(new Queue(data.QueueUrl, this)) - }) + return this.createQueue(params, data => { + if (typeof callback === 'function') { + callback(new Queue(data.QueueUrl, this)) + } + }).then(({ QueueUrl }) => Promise.resolve(new Queue(QueueUrl, this))) } supportedMethods () { From 0eec6ad46fa4862767d7aa0762a5e9a5b0d506b8 Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Sat, 29 Sep 2018 16:45:00 -0600 Subject: [PATCH 03/12] Add vscode settings --- .vscode/settings.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9c463cf --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "editor.tabSize": 2, + "editor.renderWhitespace": "all", + "editor.fontSize": 13, + "editor.multiCursorModifier": "ctrlCmd" +} \ No newline at end of file From 2dfbf1dac5cde6fcb68384cdd824f4788b70a242 Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Sat, 29 Sep 2018 18:43:08 -0600 Subject: [PATCH 04/12] Updates with functional sqs polling Using limited concurrency workers --- examples/scratch.js | 21 +- examples/sqs/polling.js | 39 + examples/sqs/sendMessage.js | 31 + examples/test.js | 31 + lib/primitives/AWSService.js | 2 +- lib/services/sqs/Message.js | 9 +- lib/services/sqs/Queue.js | 52 +- package-lock.json | 2473 +++++++++++++++++++++++++++++++++- package.json | 1 + 9 files changed, 2604 insertions(+), 55 deletions(-) create mode 100644 examples/sqs/polling.js create mode 100644 examples/sqs/sendMessage.js create mode 100644 examples/test.js diff --git a/examples/scratch.js b/examples/scratch.js index 9fbb2fb..179ae30 100644 --- a/examples/scratch.js +++ b/examples/scratch.js @@ -11,9 +11,26 @@ const run = async () => { const queue = await sqs.getQueue({ QueueName: 'test-queue' }) console.log('queue', queue) - const msgs = await queue.listen({}) + // const msgs = await queue.listen({}) - console.log('msgs', msgs) + // console.log('msgs', msgs) + + queue.poll((msg, callback) => { + const start = Date.now() + + SQS.warn('Processing message', msg) + + const prefix = `[${msg.MessageId}] - ` + + const sleep = Math.ceil(Math.random() * 10000) + + SQS.warn(prefix, `Sleeping for ${sleep} ms ...`) + + setTimeout(() => { + SQS.log(prefix, 'Done sleeping! Deleting message ...') + msg.delete().then(callback).catch(callback) + }, sleep) + }) } run() diff --git a/examples/sqs/polling.js b/examples/sqs/polling.js new file mode 100644 index 0000000..5ce1a21 --- /dev/null +++ b/examples/sqs/polling.js @@ -0,0 +1,39 @@ +const { SQS } = require('../../lib/services') + +const sqs = new SQS() + +const run = async () => { + const queue = await sqs.getQueue({ QueueName: 'test-queue' }) + + const params = { + MaxNumberOfMessages: 10 + } + + queue.poll(100, params, (msg, next) => { + const start = Date.now() + + SQS.debug('Processing message', msg) + + const prefix = `[${msg.MessageId}]` + + const sleep = msg.parsed.sleep || Math.ceil(Math.random() * 10000) + + // SQS.log(prefix, `Sleeping for ${sleep} ms ...`) + + setTimeout(() => { + // SQS.log(prefix, `Done sleeping for ${sleep} ms! Deleting message ...`) + msg.delete().then(() => { + const end = Date.now() + const dur = (end - start) / 1000 + // SQS.log(prefix, `Finished in ${dur}s`) + SQS.debug('Deleted msg:', msg.parsed) + next() + }).catch(next) + }, sleep) + }) +} + +run().catch(err => { + SQS.warn('Caught error in example run()') + SQS.error(err) +}) diff --git a/examples/sqs/sendMessage.js b/examples/sqs/sendMessage.js new file mode 100644 index 0000000..6d1df6f --- /dev/null +++ b/examples/sqs/sendMessage.js @@ -0,0 +1,31 @@ +const { SQS } = require('../../lib/services') + +const sqs = new SQS() + +const QueueName = 'test-queue' +const MessageCount = 1000 + +const run = async () => { + const queue = await sqs.getQueue({ QueueName }) + // SQS.log('queue', queue) + + // const msgs = await queue.listen({}) + + // console.log('msgs', msgs) + + SQS.log(`Sending ${MessageCount} message(s) to Queue: ${QueueName}`) + + for (let i = 1; i <= MessageCount; i++) { + const msg = await queue.sendMessage({ + sleep: Math.ceil(Math.random() * 2000) + }) + SQS.log(`Sent message #${i} - ${msg.MessageId}`) + } + + SQS.log('Done!') +} + +run().catch(err => { + SQS.warn('Caught error in example run()') + SQS.error(err) +}) diff --git a/examples/test.js b/examples/test.js new file mode 100644 index 0000000..1187027 --- /dev/null +++ b/examples/test.js @@ -0,0 +1,31 @@ +const { SQS, Route53, ECS, ACM } = require('../lib/services') + +const sqs = new SQS() + +const run = async () => { + const queue = await sqs.getQueue({ QueueName: 'test-queue' }) + console.log('queue', queue) + + // const msgs = await queue.listen({}) + + // console.log('msgs', msgs) + + queue.poll((msg, callback) => { + const start = Date.now() + + SQS.warn('Processing message', msg) + + const prefix = `[${msg.MessageId}] - ` + + const sleep = Math.ceil(Math.random() * 10000) + + SQS.warn(prefix, `Sleeping for ${sleep} ms ...`) + + setTimeout(() => { + SQS.log(prefix, 'Done sleeping! Deleting message ...') + msg.delete().then(callback).catch(callback) + }, sleep) + }) +} + +run() \ No newline at end of file diff --git a/lib/primitives/AWSService.js b/lib/primitives/AWSService.js index 03d4acf..604bce9 100644 --- a/lib/primitives/AWSService.js +++ b/lib/primitives/AWSService.js @@ -82,7 +82,7 @@ class AWSService extends Dynamic { } if (typeof callback !== 'function') { - AWSService.warn(`Executing generic method '${method}' without callback!`) + AWSService.debug(`Executing generic method '${method}' without callback!`) } AWSService.debug('Executing method:', method, 'with params:', params) diff --git a/lib/services/sqs/Message.js b/lib/services/sqs/Message.js index b82b833..d5443fa 100644 --- a/lib/services/sqs/Message.js +++ b/lib/services/sqs/Message.js @@ -34,15 +34,14 @@ class Message extends AWSResource { Message.debug(`Sending message: ${this.Body}`) - return this.sendMessage(params, response => { + return this.sendMessage(params).then((response) => { this.setProperties(response) if (typeof callback === 'function') { - callback(response) + callback(this) } - }).then((response) => { - this.setProperties(response) - return Promise.resolve(response) + + return Promise.resolve(this) }) } diff --git a/lib/services/sqs/Queue.js b/lib/services/sqs/Queue.js index 7e90a5a..670a7fe 100644 --- a/lib/services/sqs/Queue.js +++ b/lib/services/sqs/Queue.js @@ -14,8 +14,6 @@ class Queue extends AWSResource { constructor () { super(...arguments) - this.concurrency = this.concurrency || DEFAULT_CONCURRENCY - this.setDefaultParams({ QueueUrl: this.name }) @@ -69,20 +67,54 @@ class Queue extends AWSResource { } async poll() { - const { callback } = Queue.getArgs(arguments) + const { params = {}, callback, concurrency } = Queue.getArgs(arguments, { + 'number': 'concurrency' + }) + + const limit = concurrency || params.MaxNumberOfMessages || DEFAULT_CONCURRENCY + + Queue.log(`Polling for messages on Queue: ${this.name} ...`) - const workers = async.queue(callback, this.concurrency) + const workers = async.queue(callback, limit) - workers.empty = async () => await this.pol(...arguments) + const debugQueueStatus = () => { + const l = workers.length() + const s = workers.started + const r = workers.running() + const i = workers.idle() + const c = workers.concurrency - const msgs = await this.listen() + let state = 'unknown' - if (msgs.length > 0) { - workers.push(msgs, callback) + if (s) state = 'started' + if (i) state = 'idle' - } else { - await this.poll(...arguments) + const msg = `${this.name} Workers: LIMIT=${c} | SIZE=${l} | STATE=${state} | RUNNING=${r}` + + Queue.log(msg) } + + setInterval(debugQueueStatus, 1000) + + const receiveMessages = async () => { + const msgs = await this.listen(params) + + Queue.debug(`${this.name}: Received ${msgs.length} message(s)`) + + if (msgs.length > 0) { + workers.push(msgs, err => { + if (err) { + Queue.warn(err) + } + }) + } else { + receiveMessages() + } + } + + receiveMessages() + + workers.unsaturated = receiveMessages } supportedMethods () { diff --git a/package-lock.json b/package-lock.json index 048027d..cfcceb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,12 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "acorn": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", @@ -33,6 +39,15 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, "ansi-escape-sequences": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz", @@ -57,6 +72,16 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -65,6 +90,24 @@ "sprintf-js": "~1.0.2" } }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "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 + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-back": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", @@ -96,6 +139,12 @@ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -107,6 +156,12 @@ "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "async": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", @@ -115,6 +170,18 @@ "lodash": "^4.14.0" } }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "aws-sdk": { "version": "2.325.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.325.0.tgz", @@ -162,7 +229,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -175,11 +242,87 @@ } } }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, + "binary-extensions": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "dev": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -196,6 +339,35 @@ } } }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "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.0" + } + } + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -217,6 +389,23 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -230,6 +419,18 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, "chai": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", @@ -279,11 +480,67 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -320,6 +577,16 @@ "colors": "^1.1.2" } }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -368,16 +635,57 @@ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -390,6 +698,12 @@ "which": "^1.2.9" } }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -404,6 +718,12 @@ "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=" }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", @@ -422,9 +742,9 @@ } }, "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, "deep-is": { @@ -440,6 +760,47 @@ "object-keys": "^1.0.12" } }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "deglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", @@ -488,6 +849,27 @@ "esutils": "^2.0.2" } }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -849,17 +1231,126 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, + "event-stream": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.6.tgz", + "integrity": "sha512-dGXNg4F/FgVzlApjzItL+7naHutA3fDqbV/zAZqDDlXTjiMnQmZKu+prImWKszeBM5UQeGvAl3u1wBiKeDh61g==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "flatmap-stream": "^0.1.0", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, "events": { "version": "1.1.1", "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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.0" + } + } + } + }, "extend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", "dev": true }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "external-editor": { "version": "2.2.0", "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -870,6 +1361,71 @@ "tmp": "^0.0.33" } }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -911,15 +1467,38 @@ "object-assign": "^4.0.1" } }, - "find-replace": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", - "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "array-back": "^1.0.4", - "test-value": "^2.1.0" - } + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "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.0" + } + } + } + }, + "find-replace": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", + "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=", + "dev": true, + "requires": { + "array-back": "^1.0.4", + "test-value": "^2.1.0" + } }, "find-root": { "version": "1.1.0", @@ -946,11 +1525,567 @@ "write": "^0.2.1" } }, + "flatmap-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/flatmap-stream/-/flatmap-stream-0.1.0.tgz", + "integrity": "sha512-Nlic4ZRYxikqnK5rj3YoxDVKGGtUjcNDUtvQ7XsdGLZmMwdUYnXf10o1zcXtzEZTBgc6GxeRpQxV/Wu3WPIIHA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -966,6 +2101,18 @@ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, "glob": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", @@ -979,6 +2126,36 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, "globals": { "version": "11.7.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", @@ -997,6 +2174,25 @@ "pinkie-promise": "^2.0.0" } }, + "got": { + "version": "6.7.1", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "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", @@ -1041,6 +2237,38 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "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" + } + } + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -1070,6 +2298,18 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -1089,6 +2329,12 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, "inquirer": { "version": "5.2.0", "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", @@ -1109,11 +2355,46 @@ "through": "^2.3.6" } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.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" + } + } + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "is-builtin-module": { "version": "1.0.0", "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", @@ -1122,20 +2403,131 @@ "builtin-modules": "^1.0.0" } }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-date-object": { + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.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" + } + } + } + }, + "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=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "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=" + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "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.0.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" + } + } + } + }, + "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "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=" + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, "is-path-cwd": { "version": "1.0.0", @@ -1158,11 +2550,26 @@ "path-is-inside": "^1.0.1" } }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -1176,6 +2583,18 @@ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" }, + "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=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -1184,6 +2603,12 @@ "has-symbols": "^1.0.0" } }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1194,6 +2619,12 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "jmespath": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", @@ -1236,6 +2667,21 @@ "array-includes": "^3.0.3" } }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -1277,6 +2723,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", @@ -1291,6 +2743,81 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "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=", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -1309,6 +2836,27 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -1372,6 +2920,32 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, + "nan": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -1382,6 +2956,35 @@ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, + "nodemon": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.4.tgz", + "integrity": "sha512-hyK6vl65IPnky/ee+D3IWvVGgJa/m3No2/Xc/3wanS6Ce1MWjCzH6NnhPJ/vZM+6JFym16jtHx51lmCMB9HDtg==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "debug": "^3.1.0", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.0", + "semver": "^5.5.0", + "supports-color": "^5.2.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.3.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, "nomnom": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", @@ -1417,6 +3020,15 @@ } } }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -1428,16 +3040,83 @@ "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=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + } + } + }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "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" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1472,6 +3151,12 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -1493,6 +3178,18 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -1501,6 +3198,18 @@ "error-ex": "^1.2.0" } }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -1537,6 +3246,15 @@ "pify": "^2.0.0" } }, + "pause-stream": { + "version": "0.0.11", + "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" + } + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -1622,11 +3340,29 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "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=" }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, "progress": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", @@ -1641,6 +3377,30 @@ "object-assign": "^4.1.1" } }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "~3.3.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pstree.remy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.0.tgz", + "integrity": "sha512-q5I5vLRMVtdWa8n/3UEzZX7Lfghzrg9eG2IKk2ENLSofKRCXVqMvMUHxCKgXNaqH/8ebhBxrqftHWnyTFweJ5Q==", + "dev": true, + "requires": { + "ps-tree": "^1.1.0" + } + }, "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", @@ -1651,6 +3411,26 @@ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -1680,6 +3460,32 @@ } } }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, "readline-sync": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.6.tgz", @@ -1692,11 +3498,58 @@ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=", "dev": true }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, "regexpp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz", "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==" }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "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=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "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 + }, "replace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace/-/replace-1.0.0.tgz", @@ -1747,6 +3600,12 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -1756,6 +3615,12 @@ "signal-exit": "^3.0.2" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -1785,6 +3650,21 @@ "symbol-observable": "1.0.1" } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -1800,6 +3680,38 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "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.0" + } + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -1826,6 +3738,147 @@ "is-fullwidth-code-point": "^2.0.0" } }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "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" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.1.tgz", @@ -1854,6 +3907,24 @@ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==" }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1893,6 +3964,37 @@ } } }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -1902,6 +4004,15 @@ "strip-ansi": "^4.0.0" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -1922,6 +4033,12 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -1955,16 +4072,42 @@ } }, "table-layout": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.0.tgz", - "integrity": "sha1-xw/wRV2a3WO5H3wVp3kmKVwODn0=", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.4.tgz", + "integrity": "sha512-uNaR3SRMJwfdp9OUr36eyEi6LLsbcTqTO/hfTsNviKsNeyMBPICJCC7QXRF3+07bAP6FRwA8rczJPBqXDc0CkQ==", "dev": true, "requires": { - "array-back": "^1.0.4", - "deep-extend": "~0.4.1", + "array-back": "^2.0.0", + "deep-extend": "~0.6.0", "lodash.padend": "^4.6.1", - "typical": "^2.6.0", - "wordwrapjs": "^2.0.0" + "typical": "^2.6.1", + "wordwrapjs": "^3.0.0" + }, + "dependencies": { + "array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "requires": { + "typical": "^2.6.1" + } + }, + "typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=", + "dev": true + } + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" } }, "test-value": { @@ -1987,6 +4130,12 @@ "resolved": "http://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=", + "dev": true + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -1995,6 +4144,57 @@ "os-tmpdir": "~1.0.2" } }, + "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.0.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" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -2015,17 +4215,151 @@ "integrity": "sha1-idUVVKsTmEimW8wsh3L4+0UMQO0=", "dev": true }, + "undefsafe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", + "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", + "dev": true, + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "underscore": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", "dev": true }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "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.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -2041,6 +4375,12 @@ } } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -2050,6 +4390,27 @@ "querystring": "0.2.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=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -2072,21 +4433,36 @@ "isexe": "^2.0.0" } }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "wordwrapjs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz", - "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", + "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", "dev": true, "requires": { - "array-back": "^1.0.3", - "feature-detect-es6": "^1.3.1", "reduce-flatten": "^1.0.1", - "typical": "^2.6.0" + "typical": "^2.6.1" + }, + "dependencies": { + "typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=", + "dev": true + } } }, "wrappy": { @@ -2102,6 +4478,23 @@ "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==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", @@ -2120,6 +4513,12 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true } } } diff --git a/package.json b/package.json index 90157c1..18039ff 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "chai": "^3.5.0", "cmr1-cli": "^0.1.0", "mocha": "^5.2.0", + "nodemon": "^1.18.4", "replace": "^1.0.0" } } From 8db0661fba82e9a2019736079fd3d488beb44927 Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Sat, 29 Sep 2018 18:48:38 -0600 Subject: [PATCH 05/12] Fix SQS tests for listener --- test/services/SQS.spec.js | 53 ++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/test/services/SQS.spec.js b/test/services/SQS.spec.js index 4537aa8..b5e498f 100644 --- a/test/services/SQS.spec.js +++ b/test/services/SQS.spec.js @@ -37,31 +37,56 @@ describe('SQS', function () { }) }) - it('should be able to send & receive messages', function (done) { + it('should be able to send & receive messages', async function () { const msgBody = 'This is a test message' const myMessage = queue.newMessage({ Body: msgBody }) - queue.listen({ MaxNumberOfMessages: 1 }, msgs => { - expect(msgs).to.be.an.instanceof(Array) + await myMessage.send() - const expected = msgs.filter(msg => { - return msg.Body === msgBody - }) + const msgs = await queue.listen({ MaxNumberOfMessages: 1 }) - expect(expected).to.have.length.above(0) + expect(msgs).to.be.an.instanceof(Array) - expect(expected[0]).to.be.an.instanceof(SQS.Queue.Message) - expect(expected[0].toString()).to.match(/\[[^\]]+\] - '.+'/) - - expected[0].delete(response => { - done() - }) + const expected = msgs.filter(msg => { + return msg.Body === msgBody }) - myMessage.send() + expect(expected).to.have.length.above(0) + + expect(expected[0]).to.be.an.instanceof(SQS.Queue.Message) + expect(expected[0].toString()).to.match(/\[[^\]]+\] - '.+'/) + + await expected[0].delete() }) + + // it('should be able to poll for messages', function (done) { + // const msgBody = 'This is a test message' + + // const myMessage = queue.newMessage({ + // Body: msgBody + // }) + + // queue.listen({ MaxNumberOfMessages: 1 }, msgs => { + // expect(msgs).to.be.an.instanceof(Array) + + // const expected = msgs.filter(msg => { + // return msg.Body === msgBody + // }) + + // expect(expected).to.have.length.above(0) + + // expect(expected[0]).to.be.an.instanceof(SQS.Queue.Message) + // expect(expected[0].toString()).to.match(/\[[^\]]+\] - '.+'/) + + // expected[0].delete(response => { + // done() + // }) + // }) + + // myMessage.send() + // }) }) }) From 7e496093784b93cfec78f2368a981f238e3033c0 Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Sat, 29 Sep 2018 22:41:12 -0600 Subject: [PATCH 06/12] Updates for first pass as promisify --- lib/primitives/AWSService.js | 2 +- lib/services/acm/ACM.js | 32 ++++----- lib/services/acm/Certificate.js | 8 +-- lib/services/ecs/Cluster.js | 68 ++++++------------ lib/services/ecs/ECS.js | 65 ++++++----------- lib/services/ecs/Service.js | 2 +- lib/services/ecs/Task.js | 18 ++--- lib/services/ecs/TaskDefinition.js | 16 +---- lib/services/route53/ChangeBatch.js | 69 +++++++++--------- lib/services/route53/RecordSet.js | 14 ++-- lib/services/route53/Route53.js | 36 +++------- lib/services/route53/Zone.js | 10 +-- lib/services/s3/Bucket.js | 12 +--- lib/services/s3/S3.js | 8 +-- lib/services/sqs/Message.js | 6 +- lib/services/sqs/Queue.js | 14 +--- lib/services/sqs/SQS.js | 8 +-- test/services/ACM.spec.js | 22 +++--- test/services/ECS.spec.js | 104 ++++++++++------------------ test/services/Route53.spec.js | 63 ++++++++--------- test/services/S3.spec.js | 41 ++++++----- test/services/SES.spec.js | 48 +++---------- test/services/SQS.spec.js | 64 ++++++++--------- 23 files changed, 270 insertions(+), 460 deletions(-) diff --git a/lib/primitives/AWSService.js b/lib/primitives/AWSService.js index 604bce9..26daf6f 100644 --- a/lib/primitives/AWSService.js +++ b/lib/primitives/AWSService.js @@ -130,7 +130,7 @@ class AWSService extends Dynamic { const response = this.reduceResponses(responses) if (typeof callback === 'function') { - callback(response) + callback(err, response) } if (err) { diff --git a/lib/services/acm/ACM.js b/lib/services/acm/ACM.js index 21c14ba..9721ff3 100644 --- a/lib/services/acm/ACM.js +++ b/lib/services/acm/ACM.js @@ -16,8 +16,8 @@ class ACM extends AWSService { createCertificate () { const { params, callback } = ACM.getArgs(arguments) - this.importCertificate(params, response => { - return callback(new Certificate(response, this)) + return this.importCertificate(params, callback).then(response => { + return Promise.resolve(new Certificate(response, this)) }) } @@ -27,45 +27,37 @@ class ACM extends AWSService { }) if (typeof domain === 'string' && domain.trim() !== '') { - this.getCertByDomain(domain, cert => { + return this.getCertByDomain(domain).then(cert => { if (cert) { - cert.update(params, callback) + return cert.update(params, callback) } else { - this.createCertificate(params, callback) + return this.createCertificate(params, callback) } }) } else { - this.createCertificate(params, callback) + return this.createCertificate(params, callback) } } getCertByDomain () { - const { domain, callback } = ACM.getArgs(arguments, { + const { domain } = ACM.getArgs(arguments, { 'string': 'domain' }) - this.getCertificates(certs => { - const filtered = certs.filter(c => { return c.DomainName === domain }) + return this.getCertificates().then(certs => { + const filtered = certs.filter(c => c.DomainName === domain) const cert = filtered.length > 0 ? filtered[0] : null - return callback(cert) + return Promise.resolve(cert) }) } getCertificates () { const { params, callback } = ACM.getArgs(arguments) - this.listCertificates(params, response => { - const certificates = [] - - if (response.CertificateSummaryList) { - response.CertificateSummaryList.forEach(cert => { - certificates.push(new Certificate(cert, this)) - }) - } - - return callback(certificates) + return this.listCertificates(params, callback).then(({ CertificateSummaryList = []}) => { + return Promise.resolve(CertificateSummaryList.map(cert => new Certificate(cert, this))) }) } diff --git a/lib/services/acm/Certificate.js b/lib/services/acm/Certificate.js index 4cea5fc..98527bb 100644 --- a/lib/services/acm/Certificate.js +++ b/lib/services/acm/Certificate.js @@ -18,17 +18,17 @@ class Certificate extends AWSResource { delete () { const { params, callback } = Certificate.getArgs(arguments) - this.deleteCertificate(params, callback) + return this.deleteCertificate(params, callback) } update () { const { params, callback } = Certificate.getArgs(arguments) - this.importCertificate(params, response => { + return this.importCertificate(params, callback).then(response => { if (response.CertificateArn === this.CertificateArn) { - return callback(this) + return Promise.resolve(this) } else { - return callback(response) + return Promise.resolve(response) } }) } diff --git a/lib/services/ecs/Cluster.js b/lib/services/ecs/Cluster.js index d40ef1c..e3d85d7 100644 --- a/lib/services/ecs/Cluster.js +++ b/lib/services/ecs/Cluster.js @@ -22,18 +22,14 @@ class Cluster extends AWSResource { delete () { const { params, callback } = Cluster.getArgs(arguments) - this.deleteCluster(params, callback) + return this.deleteCluster(params, callback) } newService () { const { params, callback } = Cluster.getArgs(arguments) - this.createService(params, response => { - if (response.service) { - return callback(new Service(response.service, this)) - } - - return callback() + return this.createService(params, callback).then(({ service }) => { + return Promise.resolve(new Service(response.service, this)) }) } @@ -43,30 +39,22 @@ class Cluster extends AWSResource { }) if (taskDefinition instanceof TaskDefinition) { - taskDefinition.run({ cluster: this.clusterName }, callback) + return taskDefinition.run({ cluster: this.clusterName }) } else { - return callback() + return Promise.reject(new Error('Invalid task definition')) } } getTasks () { const { params, callback } = Cluster.getArgs(arguments) - this.listTasks(params, response => { - if (response.taskArns && response.taskArns.length > 0) { - this.describeTasks({ tasks: response.taskArns }, response => { - const tasks = [] - - if (response.tasks) { - response.tasks.forEach(task => { - tasks.push(new Task(task, this)) - }) - } - - return callback(tasks) + return this.listTasks(params, callback).then(({ taskArns = [] }) => { + if (taskArns.length > 0) { + return this.describeTasks({ tasks: taskArns }).then(({ tasks = [] }) => { + return Promise.resolve(tasks.map(t => new Task(t, this))) }) } else { - return callback([]) + return Promise.resolve([]) } }) } @@ -74,21 +62,13 @@ class Cluster extends AWSResource { getServices () { const { params, callback } = Cluster.getArgs(arguments) - this.listServices(params, response => { - if (response.serviceArns && response.serviceArns.length > 0) { - this.describeServices({ services: response.serviceArns }, response => { - const services = [] - - if (response.services) { - response.services.forEach(service => { - services.push(new Service(service, this)) - }) - } - - return callback(services) + return this.listServices(params, callback).then(({ serviceArns = [] }) => { + if (serviceArns.length > 0) { + return this.describeServices({ services: serviceArns }).then(({ services = [] }) => { + return Promise.resolve(services.map(s => new Service(s, this))) }) } else { - return callback([]) + return Promise.resolve([]) } }) } @@ -96,21 +76,13 @@ class Cluster extends AWSResource { getContainerInstances () { const { params, callback } = Cluster.getArgs(arguments) - this.listContainerInstances(params, response => { - if (response.containerInstanceArns && response.containerInstanceArns.length) { - this.describeContainerInstances({ containerInstances: response.containerInstanceArns }, response => { - const containerInstances = [] - - if (response.containerInstances) { - response.containerInstances.forEach(ci => { - containerInstances.push(new ContainerInstance(ci, this)) - }) - } - - return callback(containerInstances) + return this.listContainerInstances(params, callback).then(({ containerInstanceArns = [] }) => { + if (containerInstanceArns.length > 0) { + return this.describeContainerInstances({ containerInstances: containerInstanceArns }).then(({ containerInstances = [] }) => { + return Promise.resolve(containerInstances.map(ci => new ContainerInstance(ci, this))) }) } else { - return callback([]) + return Promise.resolve([]) } }) } diff --git a/lib/services/ecs/ECS.js b/lib/services/ecs/ECS.js index cad2e05..77c13bd 100644 --- a/lib/services/ecs/ECS.js +++ b/lib/services/ecs/ECS.js @@ -19,70 +19,47 @@ class ECS extends AWSService { newCluster () { const { params, callback } = ECS.getArgs(arguments) - this.createCluster(params, response => { - if (response.cluster) { - return callback(new Cluster(response.cluster, this)) - } else { - return callback() - } + return this.createCluster(params, callback).then(({ cluster }) => { + return Promise.resolve(new Cluster(cluster, this)) }) } newTaskDefinition () { const { params, callback } = ECS.getArgs(arguments) - this.registerTaskDefinition(params, response => { - if (response.taskDefinition) { - return callback(new TaskDefinition(response.taskDefinition, this)) - } else { - return callback() - } + return this.registerTaskDefinition(params, callback).then(({ taskDefinition }) => { + return Promise.resolve(new TaskDefinition(taskDefinition, this)) }) } getClusters () { const { params, callback } = ECS.getArgs(arguments) - this.listClusters(params, response => { - if (response.clusterArns && response.clusterArns.length > 0) { - this.describeClusters({ clusters: response.clusterArns }, response => { - const clusters = [] - - if (response.clusters) { - response.clusters.forEach(cluster => { - clusters.push(new Cluster(cluster, this)) - }) - } - - return callback(clusters) - }) - } else { - return callback([]) - } + return this.listClusters(params, callback).then(({ clusterArns = [] }) => { + return this.describeClusters({ clusters: clusterArns }).then(({ clusters = [] }) => { + return Promise.resolve(clusters.map(c => new Cluster(c, this))) + }) }) } getTaskDefinitions () { const { params, callback } = ECS.getArgs(arguments) - this.listTaskDefinitions(params, response => { - if (response.taskDefinitionArns && response.taskDefinitionArns.length > 0) { - const taskDefinitions = [] - - async.each(response.taskDefinitionArns, (taskDefinitionArn, next) => { - this.describeTaskDefinition({ taskDefinition: taskDefinitionArn }, response => { - if (response.taskDefinition) { - taskDefinitions.push(new TaskDefinition(response.taskDefinition, this)) - } + return this.listTaskDefinitions(params, callback).then(({ taskDefinitionArns = [] }) => { + return new Promise( + (resolve, reject) => { + const taskDefinitions = [] - next() + async.each(taskDefinitionArns, (taskDefinitionArn, next) => { + this.describeTaskDefinition({ taskDefinition: taskDefinitionArn }).then(({ taskDefinition }) => { + taskDefinitions.push(new TaskDefinition(taskDefinition, this)) + next() + }) + }, () => { + return resolve(taskDefinitions) }) - }, (err) => { - return callback(taskDefinitions) - }) - } else { - return callback([]) - } + } + ) }) } diff --git a/lib/services/ecs/Service.js b/lib/services/ecs/Service.js index e1700b4..606e671 100644 --- a/lib/services/ecs/Service.js +++ b/lib/services/ecs/Service.js @@ -19,7 +19,7 @@ class Service extends AWSResource { getTasks () { const { params, callback } = Service.getArgs(arguments) - this.parent.getTasks(Object.assign({}, { serviceName: this.serviceName }, params), callback) + return this.parent.getTasks(Object.assign({}, { serviceName: this.serviceName }, params), callback) } supportedMethods () { diff --git a/lib/services/ecs/Task.js b/lib/services/ecs/Task.js index 572aac2..55b7ed8 100644 --- a/lib/services/ecs/Task.js +++ b/lib/services/ecs/Task.js @@ -17,27 +17,19 @@ class Task extends AWSResource { } getDefinition () { - const { params, callback } = Task.getArgs(arguments) + const { params } = Task.getArgs(arguments) - this.service.describeTaskDefinition(Object.assign({}, { taskDefinition: this.taskDefinitionArn }, params), response => { - if (response.taskDefinition) { - return callback(new TaskDefinition(response.taskDefinition, this)) - } + const describeParams = Object.assign({}, { taskDefinition: this.taskDefinitionArn }, params) - return callback(null) + return this.service.describeTaskDefinition(describeParams).then(({ taskDefinition }) => { + return Promise.resolve(new TaskDefinition(response.taskDefinition, this)) }) } stop () { const { params, callback } = Task.getArgs(arguments) - this.stopTask(params, response => { - if (response.taskArn && response.taskArn === this.taskArn) { - callback() - } else { - Task.error('Oops') - } - }) + return this.stopTask(params, callback) } supportedMethods () { diff --git a/lib/services/ecs/TaskDefinition.js b/lib/services/ecs/TaskDefinition.js index d848acf..6a68da7 100644 --- a/lib/services/ecs/TaskDefinition.js +++ b/lib/services/ecs/TaskDefinition.js @@ -22,25 +22,15 @@ class TaskDefinition extends AWSResource { run () { const { params, callback } = TaskDefinition.getArgs(arguments) - this.runTask(params, response => { - if (response.tasks) { - return callback(response.tasks.map(t => { return new this.constructor.Task(t, this) })) - } else { - return callback() - } + return this.runTask(params, callback).then(({ tasks = [] }) => { + return Promise.resolve(tasks.map(t => new Task(t, this))) }) } delete () { const { params, callback } = TaskDefinition.getArgs(arguments) - this.deregisterTaskDefinition(params, response => { - if (response.taskDefinition) { - return callback(this) - } else { - return callback() - } - }) + return this.deregisterTaskDefinition(params, callback) } supportedMethods () { diff --git a/lib/services/route53/ChangeBatch.js b/lib/services/route53/ChangeBatch.js index af7fe79..154880a 100644 --- a/lib/services/route53/ChangeBatch.js +++ b/lib/services/route53/ChangeBatch.js @@ -7,7 +7,7 @@ const primitivesPath = path.join('..', '..', 'primitives') const AWSResource = require(primitivesPath).AWSResource class ChangeBatch extends AWSResource { - constructor () { + constructor() { super(...arguments) this.setDefaultParams({ @@ -19,47 +19,48 @@ class ChangeBatch extends AWSResource { this.interval = 30000 } - wait () { - const { params, callback } = ChangeBatch.getArgs(arguments) + wait() { + const { + params, + callback + } = ChangeBatch.getArgs(arguments) - this.getChange(params, resp => { - if (!resp.ChangeInfo) { - ChangeBatch.error('Missing ChangeInfo from getChange()!') - } + return this.getChange(params, callback).then(({ ChangeInfo }) => { + if (!ChangeInfo) { + ChangeBatch.error('Missing ChangeInfo from getChange()!') + } - this.setProperties(resp.ChangeInfo, false) + this.setProperties(ChangeInfo, false) - if (this.Status === 'PENDING') { - ChangeBatch.debug('Waiting for pending change:', this.Id) + if (this.Status === 'PENDING') { + ChangeBatch.debug('Waiting for pending change:', this.Id) - if (this.elapsed <= this.timeout) { + if (this.elapsed <= this.timeout) { setTimeout(() => { - this.elapsed += this.interval - this.wait(params, callback) - }, this.interval) - } else { - ChangeBatch.error(`ChangeBatch timed out! timeout = ${this.timeout}ms, interval = ${this.interval}`) - } - } else { - ChangeBatch.debug('Done waiting for change:', this.Id) - ChangeBatch.debug('Status is:', this.Status) + this.elapsed += this.interval + this.wait(params, callback) + }, this.interval) + } else { + ChangeBatch.error(`ChangeBatch timed out! timeout = ${this.timeout}ms, interval = ${this.interval}`) + } + } else { + ChangeBatch.debug('Done waiting for change:', this.Id) + ChangeBatch.debug('Status is:', this.Status) - if (this.Status === 'INSYNC') { - return callback() - } else { - ChangeBatch.error(`Unexpected ChangeBatch status while waiting: "${this.Status}"`) - } - } - }) + if (this.Status === 'INSYNC') { + return callback() + } else { + ChangeBatch.error(`Unexpected ChangeBatch status while waiting: "${this.Status}"`) + } + } + }) } - supportedMethods () { - return [ - { - method: 'getChange' - } - ] + supportedMethods() { + return [{ + method: 'getChange' + }] } } -module.exports = ChangeBatch +module.exports = ChangeBatch \ No newline at end of file diff --git a/lib/services/route53/RecordSet.js b/lib/services/route53/RecordSet.js index 7720d87..56bc318 100644 --- a/lib/services/route53/RecordSet.js +++ b/lib/services/route53/RecordSet.js @@ -26,19 +26,19 @@ class RecordSet extends AWSResource { create () { const { callback } = RecordSet.getArgs(arguments) - this.change('CREATE', callback) + return this.change('CREATE', callback) } upsert () { const { callback } = RecordSet.getArgs(arguments) - this.change('UPSERT', callback) + return this.change('UPSERT', callback) } delete () { const { callback } = RecordSet.getArgs(arguments) - this.change('DELETE', callback) + return this.change('DELETE', callback) } change () { @@ -54,12 +54,10 @@ class RecordSet extends AWSResource { } } - this.changeResourceRecordSets(params, resp => { - if (resp.ChangeInfo) { - const batch = new ChangeBatch(resp.ChangeInfo, this.service) + return this.changeResourceRecordSets(params).then(({ ChangeInfo }) => { + const batch = new ChangeBatch(ChangeInfo, this.service) - batch.wait(callback) - } + return batch.wait(callback) }) } diff --git a/lib/services/route53/Route53.js b/lib/services/route53/Route53.js index c50f275..96ac30a 100644 --- a/lib/services/route53/Route53.js +++ b/lib/services/route53/Route53.js @@ -11,38 +11,30 @@ class Route53 extends AWSService { createZone () { const { params, callback } = Route53.getArgs(arguments) - this.createHostedZone(params, data => { - if (data.HostedZone) { - return callback(new Zone(data.HostedZone, this)) - } - - return callback(null) + return this.createHostedZone(params, callback).then(({ HostedZone }) => { + return Promise.resolve(new Zone(HostedZone, this)) }) } deleteZone () { const { params, callback } = Route53.getArgs(arguments) - this.deleteHostedZone(params, callback) + return this.deleteHostedZone(params, callback) } getZoneCount () { const { params, callback } = Route53.getArgs(arguments) - this.getHostedZoneCount(params, resp => { - callback(resp.HostedZoneCount) + return this.getHostedZoneCount(params, callback).then(({ HostedZoneCount }) => { + return Promise.resolve(HostedZoneCount) }) } getZones () { const { params, callback } = Route53.getArgs(arguments) - this.listHostedZones(params, data => { - const hostedZones = data.HostedZones || [] - - callback(hostedZones.map(zoneData => { - return new Zone(zoneData, this) - })) + return this.listHostedZones(params, callback).then(({ HostedZones = []}) => { + return Promise.resolve(HostedZones.map(z => new Zone(z, this))) }) } @@ -51,18 +43,10 @@ class Route53 extends AWSService { 'string': 'name' }) - this.listHostedZones(params, data => { - const hostedZones = data.HostedZones || [] + return this.listHostedZones(params, callback).then(({ HostedZones = [] }) => { + const filtered = HostedZones.filter(zone => zone.Name.includes(name.trim())) - const filtered = hostedZones.filter(zone => { - return zone.Name === name.trim() || zone.Name === name.trim() + '.' - }) - - if (filtered.length > 0) { - return callback(filtered.map(z => { return new Zone(z, this) })[0]) - } else { - callback() - } + return Promise.resolve(filtered.map(z => new Zone(z, this))) }) } diff --git a/lib/services/route53/Zone.js b/lib/services/route53/Zone.js index f5125bb..1184ec9 100644 --- a/lib/services/route53/Zone.js +++ b/lib/services/route53/Zone.js @@ -19,12 +19,8 @@ class Zone extends AWSResource { getRecordSets () { const { params, callback } = Zone.getArgs(arguments) - this.listResourceRecordSets(params, data => { - const recordSets = data.ResourceRecordSets || [] - - callback(recordSets.map(recordData => { - return new RecordSet(recordData, this) - })) + return this.listResourceRecordSets(params, callback).then(({ ResourceRecordSets = [] }) => { + return Promise.resolve(ResourceRecordSets.map(rs => new RecordSet(rs, this))) }) } @@ -37,7 +33,7 @@ class Zone extends AWSResource { delete () { const { callback } = Zone.getArgs(arguments) - this.service.deleteZone({ + return this.service.deleteZone({ Id: this.Id }, callback) } diff --git a/lib/services/s3/Bucket.js b/lib/services/s3/Bucket.js index 55bf4bb..c59cc0d 100644 --- a/lib/services/s3/Bucket.js +++ b/lib/services/s3/Bucket.js @@ -20,16 +20,8 @@ class Bucket extends AWSResource { const { params, callback } = Bucket.getArgs(arguments) // const { params } = Bucket.getArgs(arguments); - this.listObjects(params, response => { - const items = [] - - if (response.Contents) { - response.Contents.forEach(itemData => { - items.push(new Item(itemData, this)) - }) - } - - callback(items) + return this.listObjects(params, callback).then(({ Contents = [] }) => { + return Promise.resolve(Contents.map(i => new Item(i, this))) }) // return new Promise((resolve, reject) => { diff --git a/lib/services/s3/S3.js b/lib/services/s3/S3.js index f8f7d8f..250e1d9 100644 --- a/lib/services/s3/S3.js +++ b/lib/services/s3/S3.js @@ -15,12 +15,8 @@ class S3 extends AWSService { getBuckets () { const { params, callback } = S3.getArgs(arguments) - this.listBuckets(params, data => { - const bucketList = data.Buckets || [] - - callback(bucketList.map(bucketData => { - return this.getBucket(bucketData.Name) - })) + return this.listBuckets(params, callback).then(({ Buckets = [] }) => { + return Promise.resolve(Buckets.map(bucket => this.getBucket(bucket.Name))) }) } diff --git a/lib/services/sqs/Message.js b/lib/services/sqs/Message.js index d5443fa..7385c34 100644 --- a/lib/services/sqs/Message.js +++ b/lib/services/sqs/Message.js @@ -34,13 +34,9 @@ class Message extends AWSResource { Message.debug(`Sending message: ${this.Body}`) - return this.sendMessage(params).then((response) => { + return this.sendMessage(params, callback).then((response) => { this.setProperties(response) - if (typeof callback === 'function') { - callback(this) - } - return Promise.resolve(this) }) } diff --git a/lib/services/sqs/Queue.js b/lib/services/sqs/Queue.js index 670a7fe..3572b77 100644 --- a/lib/services/sqs/Queue.js +++ b/lib/services/sqs/Queue.js @@ -53,17 +53,9 @@ class Queue extends AWSResource { Queue.debug(`Listening to queue url: `, this.defaultParams) - return this.receiveMessage(params, data => { - const { Messages = [] } = data - - if (typeof callback === 'function') { - callback(Messages.map(msg => new Message(msg, this))) - } - }).then(({ Messages = [] }) => - Promise.resolve( - Messages.map(msg => new Message(msg, this)) - ) - ) + return this.receiveMessage(params, callback).then(({ Messages = [] }) => { + return Promise.resolve(Messages.map(msg => new Message(msg, this))) + }) } async poll() { diff --git a/lib/services/sqs/SQS.js b/lib/services/sqs/SQS.js index eb94601..e3ac9e0 100644 --- a/lib/services/sqs/SQS.js +++ b/lib/services/sqs/SQS.js @@ -19,11 +19,9 @@ class SQS extends AWSService { getQueue () { const { params, callback } = Queue.getArgs(arguments) - return this.createQueue(params, data => { - if (typeof callback === 'function') { - callback(new Queue(data.QueueUrl, this)) - } - }).then(({ QueueUrl }) => Promise.resolve(new Queue(QueueUrl, this))) + return this.createQueue(params, callback).then(data => { + return Promise.resolve(new Queue(data.QueueUrl, this)) + }) } supportedMethods () { diff --git a/test/services/ACM.spec.js b/test/services/ACM.spec.js index 9cddda8..0c234cd 100644 --- a/test/services/ACM.spec.js +++ b/test/services/ACM.spec.js @@ -22,15 +22,13 @@ describe('ACM', function () { }) }) - it('should be able to get certificates', function (done) { - acm.getCertificates(certs => { - expect(certs).to.be.an('array') - expect(certs.length).to.be.at.least(0) + it('should be able to get certificates', async function () { + const certs = await acm.getCertificates() - certCount = certs.length + expect(certs).to.be.an('array') + expect(certs.length).to.be.at.least(0) - done() - }) + certCount = certs.length }) describe('Certificate', function () { @@ -94,12 +92,10 @@ describe('ACM', function () { }) }) - after(function (done) { - acm.getCertificates(certs => { - expect(certs).to.be.an('array') - expect(certs.length).to.equal(certCount) + after(async function () { + const certs = await acm.getCertificates() - done() - }) + expect(certs).to.be.an('array') + expect(certs.length).to.equal(certCount) }) }) diff --git a/test/services/ECS.spec.js b/test/services/ECS.spec.js index 8b04c3e..ac9b8ad 100644 --- a/test/services/ECS.spec.js +++ b/test/services/ECS.spec.js @@ -10,21 +10,12 @@ describe('ECS', function () { const clusterName = 'cmr1-aws-test-' + Date.now().toString() let cluster = null - before(function (done) { - ecs.newCluster({ clusterName }, objCluster => { - if (objCluster) { - cluster = objCluster - done() - } else { - done('Unable to create/load cluster: ' + clusterName) - } - }) + before(async function () { + cluster = await ecs.newCluster({ clusterName }) }) - after(function (done) { - cluster.delete(resp => { - done() - }) + after(async function () { + await cluster.delete() }) it('should exist', function () { @@ -37,28 +28,24 @@ describe('ECS', function () { }) }) - it('should be able to get clusters', function (done) { - ecs.getClusters(clusters => { - expect(clusters).to.be.an.instanceof(Array) + it('should be able to get clusters', async function () { + const clusters = await ecs.getClusters() - if (clusters.length > 0) { - expect(clusters[0]).to.be.an.instanceof(ECS.Cluster) - } + expect(clusters).to.be.an.instanceof(Array) - done() - }) + if (clusters.length > 0) { + expect(clusters[0]).to.be.an.instanceof(ECS.Cluster) + } }) - it('should be able to get task definitions', function (done) { - ecs.getTaskDefinitions({ maxResults: 1 }, taskDefinitions => { - expect(taskDefinitions).to.be.an.instanceof(Array) + it('should be able to get task definitions', async function () { + const taskDefinitions = await ecs.getTaskDefinitions({ maxResults: 1 }) - if (taskDefinitions.length > 0) { - expect(taskDefinitions[0]).to.be.an.instanceof(ECS.TaskDefinition) - } + expect(taskDefinitions).to.be.an.instanceof(Array) - done() - }) + if (taskDefinitions.length > 0) { + expect(taskDefinitions[0]).to.be.an.instanceof(ECS.TaskDefinition) + } }) describe('Cluster', function () { @@ -68,40 +55,34 @@ describe('ECS', function () { }) }) - it('should be able to get a list of container instances', function (done) { - cluster.getContainerInstances({ maxResults: 1 }, containerInstances => { - expect(containerInstances).to.be.an.instanceof(Array) + it('should be able to get a list of container instances', async function () { + const containerInstances = await cluster.getContainerInstances({ maxResults: 1 }) - if (containerInstances.length > 0) { - expect(containerInstances[0]).to.be.an.instanceof(ECS.Cluster.ContainerInstance) - } + expect(containerInstances).to.be.an.instanceof(Array) - done() - }) + if (containerInstances.length > 0) { + expect(containerInstances[0]).to.be.an.instanceof(ECS.Cluster.ContainerInstance) + } }) - it('should be able to get a list of services', function (done) { - cluster.getServices({ maxResults: 1 }, services => { - expect(services).to.be.an.instanceof(Array) + it('should be able to get a list of services', async function () { + const services = await cluster.getServices({ maxResults: 1 }) - if (services.length > 0) { - expect(services[0]).to.be.an.instanceof(ECS.Cluster.Service) - } + expect(services).to.be.an.instanceof(Array) - done() - }) + if (services.length > 0) { + expect(services[0]).to.be.an.instanceof(ECS.Cluster.Service) + } }) - it('should be able to get a list of tasks', function (done) { - cluster.getTasks({ maxResults: 1 }, tasks => { - expect(tasks).to.be.an.instanceof(Array) + it('should be able to get a list of tasks', async function () { + const tasks = await cluster.getTasks({ maxResults: 1 }) - if (tasks.length > 0) { - expect(tasks[0]).to.be.an.instanceof(ECS.Cluster.Task) - } + expect(tasks).to.be.an.instanceof(Array) - done() - }) + if (tasks.length > 0) { + expect(tasks[0]).to.be.an.instanceof(ECS.Cluster.Task) + } }) }) @@ -109,7 +90,7 @@ describe('ECS', function () { const taskDefinitionFamily = 'cmr1-aws-test-' + Date.now().toString() let taskDefinition = null - before(function (done) { + before(async function () { const params = { family: taskDefinitionFamily, containerDefinitions: [ @@ -122,20 +103,11 @@ describe('ECS', function () { ] } - ecs.newTaskDefinition(params, objTaskDefinition => { - if (objTaskDefinition) { - taskDefinition = objTaskDefinition - done() - } else { - done('Unable to create/revision task definition: ' + taskDefinitionFamily) - } - }) + taskDefinition = await ecs.newTaskDefinition(params) }) - after(function (done) { - taskDefinition.delete(resp => { - done() - }) + after(async function () { + await taskDefinition.delete() }) it('instance has supported methods', function () { diff --git a/test/services/Route53.spec.js b/test/services/Route53.spec.js index 1d17ad1..791331b 100644 --- a/test/services/Route53.spec.js +++ b/test/services/Route53.spec.js @@ -19,48 +19,45 @@ describe('Route53', function () { }) }) - it('should be able to create and delete zones', function (done) { + it('should be able to create and delete zones', async function () { this.timeout(10000) - r53.getZoneCount(startingCount => { - expect(startingCount).to.be.a('number') - expect(startingCount).to.be.at.least(0) - - r53.createZone({ - Name: 'route53.aws.test.cmr1.com', - CallerReference: uuid.v1() - }, zone => { - expect(zone).to.be.an.instanceof(Route53.Zone) - - zone.delete(resp => { - expect(resp.ChangeInfo).to.exist - - r53.getZoneCount(endingCount => { - expect(endingCount).to.equal(startingCount) - done() - }) - }) - }) + const startingCount = await r53.getZoneCount() + + expect(startingCount).to.be.a('number') + expect(startingCount).to.be.at.least(0) + + const zone = await r53.createZone({ + Name: 'route53.aws.test.cmr1.com', + CallerReference: uuid.v1() }) + + expect(zone).to.be.an.instanceof(Route53.Zone) + + const resp = await zone.delete() + + expect(resp.ChangeInfo).to.exist + + const endingCount = await r53.getZoneCount() + + expect(endingCount).to.equal(startingCount) }) - it('should be able to get zones and verify total count', function (done) { + it('should be able to get zones and verify total count', async function () { this.timeout(10000) - r53.getZoneCount(count => { - expect(count).to.be.a('number') - expect(count).to.be.at.least(0) + const count = await r53.getZoneCount() - r53.getZones(zones => { - expect(zones).to.be.an.instanceof(Array) - expect(zones.length).to.equal(count) + expect(count).to.be.a('number') + expect(count).to.be.at.least(0) - if (zones.length > 0) { - expect(zones[0]).to.be.an.instanceof(Route53.Zone) - } + const zones = await r53.getZones() - done() - }) - }) + expect(zones).to.be.an.instanceof(Array) + expect(zones.length).to.equal(count) + + if (zones.length > 0) { + expect(zones[0]).to.be.an.instanceof(Route53.Zone) + } }) }) diff --git a/test/services/S3.spec.js b/test/services/S3.spec.js index a76c18b..39b7971 100644 --- a/test/services/S3.spec.js +++ b/test/services/S3.spec.js @@ -18,31 +18,30 @@ describe('S3', function () { }) }) - it('should be able to get buckets', function (done) { - s3.getBuckets(buckets => { - expect(buckets).to.be.an.instanceof(Array) + it('should be able to get buckets', async function () { + const buckets = await s3.getBuckets() - if (buckets.length > 0) { - expect(buckets[0]).to.be.an.instanceof(S3.Bucket) - } + expect(buckets).to.be.an.instanceof(Array) - done() - }) + if (buckets.length > 0) { + expect(buckets[0]).to.be.an.instanceof(S3.Bucket) + } }) describe('Bucket', function () { let bucket = null - before(function (done) { - s3.getBuckets(buckets => { - if (buckets.length > 0) { - bucket = buckets[0] - } + before(async function () { + const buckets = await s3.getBuckets() - expect(bucket).to.exist + expect(buckets).to.be.an.instanceof(Array) - done() - }) + if (buckets.length > 0) { + bucket = buckets[0] + } + + expect(bucket).to.exist + expect(bucket).to.be.an.instanceof(S3.Bucket) }) it('instance has supported methods', function () { @@ -51,10 +50,14 @@ describe('S3', function () { }) }) - it('should be able to get a list of items', function () { - bucket.getItems(items => { + it('should be able to get a list of items', async function () { + const items = await bucket.getItems() - }) + expect(items).to.be.an.instanceof(Array) + + if (items.length > 0) { + expect(items[0]).to.be.an.instanceof(S3.Bucket.Item) + } }) }) }) diff --git a/test/services/SES.spec.js b/test/services/SES.spec.js index 112169c..9579182 100644 --- a/test/services/SES.spec.js +++ b/test/services/SES.spec.js @@ -7,12 +7,10 @@ const { SES } = require('../../') describe('SES', function () { let ses = null - before(function (done) { + before(function () { ses = new SES() expect(ses).to.be.an.instanceof(SES) - - done() }) it('should exist', function () { @@ -30,87 +28,65 @@ describe('SES', function () { const body = 'This is a message. With HTML' const bodyType = 'html' - before(function (done) { + before(function () { email = ses.newEmail() expect(email).to.be.an.instanceof(SES.Email) - - done() }) - it('should be able to set "to"', function (done) { + it('should be able to set "to"', function () { email.setTo(to) expect(email._to.length).to.equal(1) - expect(email._to[0]).to.equal(to) - - done() }) - it('should be able to set "cc"', function (done) { + it('should be able to set "cc"', function () { email.setCc(cc) expect(email._cc.length).to.equal(1) - expect(email._cc[0]).to.equal(cc) - - done() }) - it('should be able to set "bcc"', function (done) { + it('should be able to set "bcc"', function () { email.setBcc(bcc) expect(email._bcc.length).to.equal(1) - expect(email._bcc[0]).to.equal(bcc) - - done() }) - it('should be able to set "from"', function (done) { + it('should be able to set "from"', function () { email.setFrom(from) expect(email._from).to.equal(from) - - done() }) - it('should be able to set "replyTo"', function (done) { + it('should be able to set "replyTo"', function () { email.setReplyTo(replyTo) expect(email._replyTo.length).to.equal(1) - expect(email._replyTo[0]).to.equal(replyTo) - - done() }) - it('should be able to set "subject"', function (done) { + it('should be able to set "subject"', function () { email.setSubject(subject) expect(email._subject).to.equal(subject) - - done() }) - it('should be able to set "body"', function (done) { + it('should be able to set "body"', function () { email.setBody(body) expect(email._body).to.equal(body) - - done() }) - it('should be able to set "bodyType"', function (done) { + it('should be able to set "bodyType"', function () { email.setFrom(bodyType) expect(email._bodyType).to.equal(bodyType) - - done() }) - after(function (done) { + after(function () { const data = { Source: from, Destination: { @@ -132,8 +108,6 @@ describe('SES', function () { } expect(email.getMessageData()).to.eql(data) - - done() }) }) }) diff --git a/test/services/SQS.spec.js b/test/services/SQS.spec.js index b5e498f..14f5dc0 100644 --- a/test/services/SQS.spec.js +++ b/test/services/SQS.spec.js @@ -8,33 +8,20 @@ const { SQS } = require('../../') describe('SQS', function () { const sqs = new SQS() - const queueParams = { - QueueName: 'cmr1-aws-mocha-test' - } - it('should exist', function () { expect(SQS).to.exist }) describe('Queue', function () { - const queueName = 'cmr1-aws-test-' + Date.now().toString() + const QueueName = 'cmr1-aws-test-' + Date.now().toString() let queue = null - before(function (done) { - sqs.getQueue({ QueueName: queueName }, objQueue => { - if (objQueue) { - queue = objQueue - done() - } else { - done('Unable to create/load queue: ' + queueName) - } - }) + before(async function () { + queue = await sqs.getQueue({ QueueName }) }) - after(function (done) { - queue.delete(resp => { - done() - }) + after(async function () { + await queue.delete() }) it('should be able to send & receive messages', async function () { @@ -62,31 +49,36 @@ describe('SQS', function () { await expected[0].delete() }) - // it('should be able to poll for messages', function (done) { - // const msgBody = 'This is a test message' + // it('should be able to poll for messages', async function () { + // const messageCount = Math.ceil(Math.random() * 10) + // let sentCount = 0 + // let receivedCount = 0 - // const myMessage = queue.newMessage({ - // Body: msgBody - // }) + // queue.poll(async (msg, next) => { + // expect(msg).to.be.an.instanceof(SQS.Queue.Message) + // expect(msg.parsed).to.be.an('object') + // expect(msg.parsed.i).to.be.a('number') + // expect(msg.parsed.i).to.be.at.least(0) + // expect(msg.parsed.i).to.be.at.most(messageCount - 1) - // queue.listen({ MaxNumberOfMessages: 1 }, msgs => { - // expect(msgs).to.be.an.instanceof(Array) + // await msg.delete() - // const expected = msgs.filter(msg => { - // return msg.Body === msgBody - // }) + // receivedCount++ - // expect(expected).to.have.length.above(0) + // next() + // }) - // expect(expected[0]).to.be.an.instanceof(SQS.Queue.Message) - // expect(expected[0].toString()).to.match(/\[[^\]]+\] - '.+'/) + // for (let i = 0; i < messageCount; i++) { + // const msg = await queue.sendMessage({ i }) - // expected[0].delete(response => { - // done() - // }) - // }) + // expect(msg).to.be.an.instanceof(SQS.Queue.Message) + // expect(msg.MessageId).to.be.a('string') + + // sentCount++ + // } - // myMessage.send() + // expect(sentCount).to.equal(messageCount) + // expect(receivedCount).to.equal(messageCount) // }) }) }) From 5372f784d6c04913fbe5925ea01654dd5b2a3d65 Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Sat, 29 Sep 2018 22:41:38 -0600 Subject: [PATCH 07/12] Increase travis test NodeJS version to v8 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1e867d8..c4e9ef2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js -node_js: 6 +node_js: 8 env: global: - AWS_DEFAULT_REGION=us-west-2 From ae4317e597b09091c3dfc692757f813a7acf5564 Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Sat, 29 Sep 2018 22:49:02 -0600 Subject: [PATCH 08/12] Fix more linting and add audit to test script chain --- lib/primitives/AWSService.js | 4 ++-- lib/primitives/Utility.js | 4 ++-- lib/services/acm/ACM.js | 7 +------ lib/services/ecs/Cluster.js | 4 ++-- lib/services/ecs/ContainerInstance.js | 8 -------- lib/services/ecs/Task.js | 2 +- lib/services/route53/ChangeBatch.js | 8 ++++---- lib/services/route53/Route53.js | 2 +- lib/services/route53/Zone.js | 2 +- lib/services/ses/Email.js | 2 +- lib/services/sqs/Queue.js | 2 +- package.json | 11 ++++++++++- 12 files changed, 26 insertions(+), 30 deletions(-) diff --git a/lib/primitives/AWSService.js b/lib/primitives/AWSService.js index 26daf6f..917a12a 100644 --- a/lib/primitives/AWSService.js +++ b/lib/primitives/AWSService.js @@ -149,11 +149,11 @@ class AWSService extends Dynamic { return new Promise((resolve, reject) => { if (typeof this.handler[method] !== 'function') { - reject(`Invalid service method: ${this.name}:${method}`) + reject(new Error(`Invalid service method: ${this.name}:${method}`)) } if (typeof params !== 'object') { - reject('Invalid params') + reject(new Error('Invalid params')) } this.handler[method](params, (err, data) => { diff --git a/lib/primitives/Utility.js b/lib/primitives/Utility.js index fdaabf6..d5715e3 100644 --- a/lib/primitives/Utility.js +++ b/lib/primitives/Utility.js @@ -87,11 +87,11 @@ class Utility { } static error () { - const err_msg = (typeof arguments[0] === 'string' ? arguments[0] : 'Unknown error') + const msg = (typeof arguments[0] === 'string' ? arguments[0] : 'Unknown error') console.error(Utility.dateString(), colors.red('ERROR: '), ...Utility.colorize(arguments, 'red')) - throw new Error(err_msg) + throw new Error(msg) } static requireParams (params, requiredKeys = []) { diff --git a/lib/services/acm/ACM.js b/lib/services/acm/ACM.js index 9721ff3..fab3d19 100644 --- a/lib/services/acm/ACM.js +++ b/lib/services/acm/ACM.js @@ -1,7 +1,6 @@ 'use strict' const path = require('path') -const async = require('async') const primitivesPath = path.join('..', '..', 'primitives') @@ -9,10 +8,6 @@ const AWSService = require(primitivesPath).AWSService const Certificate = require('./Certificate') class ACM extends AWSService { - constructor () { - super(...arguments) - } - createCertificate () { const { params, callback } = ACM.getArgs(arguments) @@ -56,7 +51,7 @@ class ACM extends AWSService { getCertificates () { const { params, callback } = ACM.getArgs(arguments) - return this.listCertificates(params, callback).then(({ CertificateSummaryList = []}) => { + return this.listCertificates(params, callback).then(({ CertificateSummaryList = [] }) => { return Promise.resolve(CertificateSummaryList.map(cert => new Certificate(cert, this))) }) } diff --git a/lib/services/ecs/Cluster.js b/lib/services/ecs/Cluster.js index e3d85d7..71f4b07 100644 --- a/lib/services/ecs/Cluster.js +++ b/lib/services/ecs/Cluster.js @@ -29,12 +29,12 @@ class Cluster extends AWSResource { const { params, callback } = Cluster.getArgs(arguments) return this.createService(params, callback).then(({ service }) => { - return Promise.resolve(new Service(response.service, this)) + return Promise.resolve(new Service(service, this)) }) } runTaskDefinition () { - const { taskDefinition, callback } = Cluster.getArgs(arguments, { + const { taskDefinition } = Cluster.getArgs(arguments, { 'object': 'taskDefinition' }) diff --git a/lib/services/ecs/ContainerInstance.js b/lib/services/ecs/ContainerInstance.js index a7375b4..bf0ea63 100644 --- a/lib/services/ecs/ContainerInstance.js +++ b/lib/services/ecs/ContainerInstance.js @@ -7,14 +7,6 @@ const primitivesPath = path.join('..', '..', 'primitives') const AWSResource = require(primitivesPath).AWSResource class ContainerInstance extends AWSResource { - constructor () { - super(...arguments) - - // this.setDefaultParams({ - // cluster: this.clusterName - // }); - } - // getContainerInstances() { // const { params, callback } = Cluster.getArgs(arguments); diff --git a/lib/services/ecs/Task.js b/lib/services/ecs/Task.js index 55b7ed8..385f7bd 100644 --- a/lib/services/ecs/Task.js +++ b/lib/services/ecs/Task.js @@ -22,7 +22,7 @@ class Task extends AWSResource { const describeParams = Object.assign({}, { taskDefinition: this.taskDefinitionArn }, params) return this.service.describeTaskDefinition(describeParams).then(({ taskDefinition }) => { - return Promise.resolve(new TaskDefinition(response.taskDefinition, this)) + return Promise.resolve(new TaskDefinition(taskDefinition, this)) }) } diff --git a/lib/services/route53/ChangeBatch.js b/lib/services/route53/ChangeBatch.js index 154880a..46dacd8 100644 --- a/lib/services/route53/ChangeBatch.js +++ b/lib/services/route53/ChangeBatch.js @@ -7,7 +7,7 @@ const primitivesPath = path.join('..', '..', 'primitives') const AWSResource = require(primitivesPath).AWSResource class ChangeBatch extends AWSResource { - constructor() { + constructor () { super(...arguments) this.setDefaultParams({ @@ -19,7 +19,7 @@ class ChangeBatch extends AWSResource { this.interval = 30000 } - wait() { + wait () { const { params, callback @@ -56,11 +56,11 @@ class ChangeBatch extends AWSResource { }) } - supportedMethods() { + supportedMethods () { return [{ method: 'getChange' }] } } -module.exports = ChangeBatch \ No newline at end of file +module.exports = ChangeBatch diff --git a/lib/services/route53/Route53.js b/lib/services/route53/Route53.js index 96ac30a..9a3a428 100644 --- a/lib/services/route53/Route53.js +++ b/lib/services/route53/Route53.js @@ -33,7 +33,7 @@ class Route53 extends AWSService { getZones () { const { params, callback } = Route53.getArgs(arguments) - return this.listHostedZones(params, callback).then(({ HostedZones = []}) => { + return this.listHostedZones(params, callback).then(({ HostedZones = [] }) => { return Promise.resolve(HostedZones.map(z => new Zone(z, this))) }) } diff --git a/lib/services/route53/Zone.js b/lib/services/route53/Zone.js index 1184ec9..caa031a 100644 --- a/lib/services/route53/Zone.js +++ b/lib/services/route53/Zone.js @@ -53,7 +53,7 @@ class Zone extends AWSResource { } static get RecordSet () { - return Record + return RecordSet } } diff --git a/lib/services/ses/Email.js b/lib/services/ses/Email.js index b3f2b54..111f9ff 100644 --- a/lib/services/ses/Email.js +++ b/lib/services/ses/Email.js @@ -6,7 +6,7 @@ const primitivesPath = path.join('..', '..', 'primitives') const AWSResource = require(primitivesPath).AWSResource -const REGEX_VALID_EMAIL_ADDRESS = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ +const REGEX_VALID_EMAIL_ADDRESS = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ class Email extends AWSResource { constructor () { diff --git a/lib/services/sqs/Queue.js b/lib/services/sqs/Queue.js index 3572b77..88cfb32 100644 --- a/lib/services/sqs/Queue.js +++ b/lib/services/sqs/Queue.js @@ -58,7 +58,7 @@ class Queue extends AWSResource { }) } - async poll() { + async poll () { const { params = {}, callback, concurrency } = Queue.getArgs(arguments, { 'number': 'concurrency' }) diff --git a/package.json b/package.json index 18039ff..c85b9a7 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,10 @@ "test": "test" }, "scripts": { - "pretest": "node hooks/pre-test.js --force", + "pretest": "npm run lint && npm audit && node hooks/pre-test.js --force", "test": "mocha test/**/*.spec.js", + "lint": "standard", + "lint:fix": "standard --fix", "preversion": "npm test && travis lint .travis.yml", "postversion": "git push --follow-tags" }, @@ -34,5 +36,12 @@ "mocha": "^5.2.0", "nodemon": "^1.18.4", "replace": "^1.0.0" + }, + "standard": { + "ignore": [ + "examples/*", + "hooks/", + "test/*" + ] } } From 34a5fec30b0f681dd8de1f7746a2e10111ae784c Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Sat, 29 Sep 2018 23:01:25 -0600 Subject: [PATCH 09/12] Increase required node version in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c85b9a7..2fa10f5 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "postversion": "git push --follow-tags" }, "engines": { - "node": ">=6.x" + "node": ">=8.x" }, "author": "Charlie McClung", "license": "MIT", From a6d318d386f5fc3497ab84ba95abccbd8d4bc452 Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Sat, 29 Sep 2018 23:05:59 -0600 Subject: [PATCH 10/12] Update travis npm token --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c4e9ef2..7948100 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ deploy: provider: npm email: admin@cmr1.com api_key: - secure: QahMPoX+N5e7blguwQCFsinZqpZQydPKIXGNDAaqYD+10W3hzm4CNGl1/FC2J3yorWk8CSKHpcPbQ74Hm100dtEE2ceukkJa7fiTg2YdTu/W8WfmpB5UYDhln7aL6hpT3dB3uzmA7QfjoniUGfOO9MvW1Z7gWmtm6BY6CcYfewoZW7C93yll+jQbFaA1NiSaTCwdaycgH2pd0I3T7pN+7b2J+wZvB7PhOrKUS5SYivHSvsom29rKZF8iBoXf7uwIohtkAUX0DsR1hy8wBXi5JsE7NelAABAdH8gHB6auXpRP0akoK94D8ehwGpHaTzJYg8KDuo6F9L5mWq928XdozgRBdYFhW1DDkBSqstSAueXdc+GJnRFR9wr2w14uE+BIJFZ+IUICrqnnbgHw2As6uXm3TgPtBJJN96h27fxZkn4rbTS5Qil7bYK/JfYjYAdAIbxLGIHms3avgCxaE4DBchOo8vNAw7Wv2cs5SKvk5O2yQ3MPMKcPs5RlLdX1gSQ6K0jdhm4xwciY2x/SY/Tr4zQ5Sk3GvUq8V585/Z7rnTj7myU2xE6xjPknfc6d8k92BDikAo97VGMeEt0qPPhN9tv6wzFGreGvy+9Zvr1n88yjlMuG1hg0S04T4UYgUR91UbXVS4qqugD7lmTfqDfaOrSu3fBmXQKgh0rDquUOmCE= + secure: knvWH+MDExO3CZwZnJBRcMaoeXfLcUo473WKreljMsmwGseueMryufCsMQxNYWUkyhoOeQvCaHdWXKDPUFjLiimjhHYPpcwCmK2Y2E2iNSor/Hwm+uJiPslPkQzY1i+y/iP7A6+x7KS/tFLkngsy59MBVtep780sZhEg54gA47fuRKqj92Cs8KoVmhdbKEr3IMfxjf7SJdKuHTnAGWXflnNJiar6qiBDHcS4uQS59F2Wc3uhatZv+aQ7LHapWODKcqlux+4tfn1jYPCUOBmP+niPVcIw+7z3/xnQNyA+mqdHJ5NrZAbKBMMYquyxsEiCrAtKBocScZrI2vbAHUW6y6e2DmGrRZCbcX81K89RgaH1oYqVc2Dbr6BbjJFP1OXhbzHqx3AW/gO0JpwhayS3NENUZ0rO4ol1JU7+PPxnxzabdB9hsFbyhB0ro4GgDCoreChM5Ev9oJaCqE9oYji+x6dIO11GZ0tjUmY3Ywt6LKsd1RSELRwwZyUIwIHGXV+xTF5wICtfvSmezfdQnWgyQIabdIYHnqiH/yLZU3wXasm3u6NaVpGX7g+XNizduX02xMvIEOIEz9pQaWyjV68ZeRop3645xWKUFUhd3diya9LU9g80kx3nDeWOGy6U4/eBnevmQuGPqcumNNDVYWc5wi36Qkuaw8JfHlZBpLe2KYQ= on: tags: true repo: cmr1/node-aws From 910cda5ce7784931d6a41af6000a0a882b681883 Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Wed, 3 Oct 2018 11:33:21 -0600 Subject: [PATCH 11/12] Update ECS service setup --- examples/ecs/start-task.js | 40 ++++++++++++++++++++++++++++++ lib/services/ecs/ECS.js | 15 +++++++++++ lib/services/ecs/Task.js | 4 ++- lib/services/ecs/TaskDefinition.js | 6 ++--- package-lock.json | 28 +++++++++++++++------ 5 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 examples/ecs/start-task.js diff --git a/examples/ecs/start-task.js b/examples/ecs/start-task.js new file mode 100644 index 0000000..a7f63c9 --- /dev/null +++ b/examples/ecs/start-task.js @@ -0,0 +1,40 @@ +const Cmr1Aws = require('../../') +const ecs = new Cmr1Aws.ECS() + +const family = 'example-task' +const cluster = 'example-cluster' +const container = 'app' + +const run = async () => { + const taskDefinitions = await ecs.getTaskDefinitions({ + maxResults: 1, + familyPrefix: family, + sort: 'DESC' + }) + + if (taskDefinitions.length === 1) { + const task = await taskDefinitions[0].run({ + cluster, + overrides: { + containerOverrides: [ + { + name: container, + environment: [ + { + name: 'ENV_SAMPLE_VAR', + value: 'env-sample-value' + } + ] + } + ] + } + }) + + console.log(task) + } else { + console.log(taskDefinitions) + throw new Error(`def count was ${taskDefinitions.length}, expected 1`) + } +} + +run() diff --git a/lib/services/ecs/ECS.js b/lib/services/ecs/ECS.js index 77c13bd..3cfde85 100644 --- a/lib/services/ecs/ECS.js +++ b/lib/services/ecs/ECS.js @@ -7,6 +7,9 @@ const primitivesPath = path.join('..', '..', 'primitives') const AWSService = require(primitivesPath).AWSService const Cluster = require('./Cluster') +const ContainerInstance = require('./ContainerInstance') +const Service = require('./Service') +const Task = require('./Task') const TaskDefinition = require('./TaskDefinition') class ECS extends AWSService { @@ -102,6 +105,18 @@ class ECS extends AWSService { return Cluster } + static get ContainerInstance () { + return ContainerInstance + } + + static get Service () { + return Service + } + + static get Task () { + return Task + } + static get TaskDefinition () { return TaskDefinition } diff --git a/lib/services/ecs/Task.js b/lib/services/ecs/Task.js index 385f7bd..2420adb 100644 --- a/lib/services/ecs/Task.js +++ b/lib/services/ecs/Task.js @@ -5,7 +5,6 @@ const path = require('path') const primitivesPath = path.join('..', '..', 'primitives') const AWSResource = require(primitivesPath).AWSResource -const TaskDefinition = require('./TaskDefinition') class Task extends AWSResource { constructor () { @@ -21,6 +20,8 @@ class Task extends AWSResource { const describeParams = Object.assign({}, { taskDefinition: this.taskDefinitionArn }, params) + const { TaskDefinition } = this.service.constructor + return this.service.describeTaskDefinition(describeParams).then(({ taskDefinition }) => { return Promise.resolve(new TaskDefinition(taskDefinition, this)) }) @@ -45,6 +46,7 @@ class Task extends AWSResource { } static get TaskDefinition () { + const { TaskDefinition } = this.service.constructor return TaskDefinition } } diff --git a/lib/services/ecs/TaskDefinition.js b/lib/services/ecs/TaskDefinition.js index 6a68da7..05ae87b 100644 --- a/lib/services/ecs/TaskDefinition.js +++ b/lib/services/ecs/TaskDefinition.js @@ -6,8 +6,6 @@ const primitivesPath = path.join('..', '..', 'primitives') const AWSResource = require(primitivesPath).AWSResource -const Task = require('./Task') - class TaskDefinition extends AWSResource { constructor () { super(...arguments) @@ -21,6 +19,7 @@ class TaskDefinition extends AWSResource { run () { const { params, callback } = TaskDefinition.getArgs(arguments) + const { Task } = this.service.constructor return this.runTask(params, callback).then(({ tasks = [] }) => { return Promise.resolve(tasks.map(t => new Task(t, this))) @@ -52,7 +51,8 @@ class TaskDefinition extends AWSResource { } static get Task () { - return require('./Task') + const { Task } = this.service.constructor + return Task } } diff --git a/package-lock.json b/package-lock.json index cfcceb8..ed58003 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1598,12 +1598,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1618,17 +1620,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1745,7 +1750,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1757,6 +1763,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1771,6 +1778,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1778,12 +1786,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -1802,6 +1812,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -1882,7 +1893,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -1894,6 +1906,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2015,6 +2028,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", From 9688b307ec0a1b7ff3b4960c4e3b3cddc226aead Mon Sep 17 00:00:00 2001 From: Charlie McClung Date: Wed, 3 Oct 2018 11:35:46 -0600 Subject: [PATCH 12/12] Bump package version Publish as alpha/next release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2fa10f5..42b6a30 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cmr1-aws", - "version": "0.3.0", + "version": "1.0.3-alpha", "description": "AWS service helper classes", "main": "index.js", "directories": {