├── .gitignore ├── backend ├── src │ ├── _root │ │ ├── package.json │ │ ├── index.js │ │ └── yarn.lock │ └── orders │ │ ├── package.json │ │ ├── index.js │ │ └── yarn.lock ├── resources │ ├── apigateway │ │ └── RestApi.yml │ ├── sqs │ │ └── OrdersQueue.yml │ └── dynamodb │ │ ├── UsersTable.yml │ │ └── OrdersTable.yml ├── package.json ├── Makefile ├── serverless.yml └── yarn.lock ├── sls-microservice.jpg ├── api ├── src │ ├── order │ │ ├── package.json │ │ ├── serverless.yml │ │ └── index.js │ └── user │ │ ├── package.json │ │ ├── order │ │ ├── package.json │ │ ├── serverless.yml │ │ └── index.js │ │ ├── serverless.yml │ │ └── index.js ├── serverless.yml └── Makefile ├── readme.md └── article.md /.gitignore: -------------------------------------------------------------------------------- 1 | **/.serverless/** 2 | **/node_modules/** 3 | -------------------------------------------------------------------------------- /backend/src/_root/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "log4js": "^4.2.0" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /sls-microservice.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trilom/sls-microservice/HEAD/sls-microservice.jpg -------------------------------------------------------------------------------- /backend/src/orders/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "aws-sdk": "^2.456.0", 4 | "log4js": "^4.2.0" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /backend/resources/apigateway/RestApi.yml: -------------------------------------------------------------------------------- 1 | Resources: 2 | ApiGatewayRestApi: 3 | Type: 'AWS::ApiGateway::RestApi' 4 | Properties: 5 | Name: ${self:service}-${self:provider.stage} 6 | -------------------------------------------------------------------------------- /backend/resources/sqs/OrdersQueue.yml: -------------------------------------------------------------------------------- 1 | Resources: 2 | OrdersQueue: 3 | Type: AWS::SQS::Queue 4 | Properties: 5 | DelaySeconds: 0 6 | MaximumMessageSize: 262144 # 256kb in bytes, maximum 7 | MessageRetentionPeriod: 345600 # 4 days in seconds 8 | QueueName: ${self:custom.${self:provider.stage}.Stack}-OrdersQueue-${self:provider.stage} 9 | VisibilityTimeout: 30 10 | -------------------------------------------------------------------------------- /api/src/order/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "serverless": "^1.42.3", 4 | "serverless-iam-roles-per-function": "^2.0.1", 5 | "serverless-plugin-reducer": "^3.2.3", 6 | "serverless-pseudo-parameters": "^2.4.0" 7 | }, 8 | "dependencies": { 9 | "body-parser": "^1.19.0", 10 | "cors": "^2.8.5", 11 | "express": "^4.16.4", 12 | "aws-sdk": "^2.456.0", 13 | "log4js": "^4.2.0", 14 | "moment": "^2.24.0", 15 | "serverless-http": "^2.0.1" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /api/src/user/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "serverless": "^1.42.3", 4 | "serverless-iam-roles-per-function": "^2.0.1", 5 | "serverless-plugin-reducer": "^3.2.3", 6 | "serverless-pseudo-parameters": "^2.4.0" 7 | }, 8 | "dependencies": { 9 | "body-parser": "^1.19.0", 10 | "cors": "^2.8.5", 11 | "express": "^4.16.4", 12 | "aws-sdk": "^2.456.0", 13 | "log4js": "^4.2.0", 14 | "moment": "^2.24.0", 15 | "serverless-http": "^2.0.1" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /api/src/user/order/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "serverless": "^1.42.3", 4 | "serverless-iam-roles-per-function": "^2.0.1", 5 | "serverless-plugin-reducer": "^3.2.3", 6 | "serverless-pseudo-parameters": "^2.4.0" 7 | }, 8 | "dependencies": { 9 | "body-parser": "^1.19.0", 10 | "cors": "^2.8.5", 11 | "express": "^4.16.4", 12 | "aws-sdk": "^2.456.0", 13 | "log4js": "^4.2.0", 14 | "moment": "^2.24.0", 15 | "serverless-http": "^2.0.1" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ExampleMicroService", 3 | "description": "", 4 | "version": "0.1.0", 5 | "scripts": { 6 | "build": "make buildAll", 7 | "deploy": "make deployAll STAGE='dev'", 8 | "start": "make buildAll && make deployAll STAGE='dev'" 9 | }, 10 | "devDependencies": { 11 | "serverless": "^1.41.1", 12 | "serverless-iam-roles-per-function": "^2.0.0", 13 | "serverless-plugin-reducer": "^3.2.1", 14 | "serverless-pseudo-parameters": "^2.4.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /backend/resources/dynamodb/UsersTable.yml: -------------------------------------------------------------------------------- 1 | Resources: 2 | UsersTable: 3 | Type: AWS::DynamoDB::Table 4 | Properties: 5 | AttributeDefinitions: 6 | - 7 | AttributeName: "user_id" 8 | AttributeType: "S" 9 | KeySchema: 10 | - 11 | AttributeName: "user_id" 12 | KeyType: "HASH" 13 | ProvisionedThroughput: 14 | ReadCapacityUnits: ${self:custom.${self:provider.stage}.UsersTableRCU} 15 | WriteCapacityUnits: ${self:custom.${self:provider.stage}.UsersTableWCU} 16 | TableName: ${self:custom.${self:provider.stage}.Stack}-Users-${self:provider.stage} 17 | -------------------------------------------------------------------------------- /backend/resources/dynamodb/OrdersTable.yml: -------------------------------------------------------------------------------- 1 | Resources: 2 | OrdersTable: 3 | Type: AWS::DynamoDB::Table 4 | Properties: 5 | AttributeDefinitions: 6 | - 7 | AttributeName: "order_id" 8 | AttributeType: "S" 9 | KeySchema: 10 | - 11 | AttributeName: "order_id" 12 | KeyType: "HASH" 13 | ProvisionedThroughput: 14 | ReadCapacityUnits: ${self:custom.${self:provider.stage}.OrdersTableRCU} 15 | WriteCapacityUnits: ${self:custom.${self:provider.stage}.OrdersTableWCU} 16 | TableName: ${self:custom.${self:provider.stage}.Stack}-Orders-${self:provider.stage} 17 | -------------------------------------------------------------------------------- /backend/src/_root/index.js: -------------------------------------------------------------------------------- 1 | /*jshint esversion: 8 */ 2 | const log4js = require('log4js'); 3 | var logLevel = process.env.logLevel; 4 | var env = process.env.env; 5 | 6 | const logger = log4js.getLogger('logger'); 7 | 8 | log4js.configure({ 9 | appenders: { 10 | logger: { type: 'console' } 11 | }, 12 | categories: { default: { appenders: ['logger'], level: logLevel}} 13 | }); 14 | 15 | function returnJson(statusCode, body) { 16 | logger.debug('In ReturnJson: '); 17 | const headers = { 18 | 'Content-Type': 'application/json', 19 | 'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key', 20 | 'Access-Control-Allow-Methods': 'POST, GET, PUT, DELETE', 21 | 'Access-Control-Allow-Origin': '*'}; 22 | return { 23 | 'statusCode': statusCode, 24 | 'body': JSON.parse(JSON.stringify(body)), 25 | 'headers': headers}; 26 | } 27 | 28 | exports.handler = async (event, context) => { 29 | return returnJson(200, {body: 'Test', event: event}); 30 | }; 31 | -------------------------------------------------------------------------------- /api/serverless.yml: -------------------------------------------------------------------------------- 1 | service: ExampleMicroService-api-__SERVICE__ 2 | 3 | frameworkVersion: ">=1.0.0 <2.0.0" 4 | 5 | custom: 6 | prod: 7 | Stack: ExampleSite 8 | LogLevel: info 9 | dev: 10 | Stack: ExampleSite 11 | LogLevel: debug 12 | 13 | package: 14 | individually: true 15 | 16 | provider: 17 | name: aws 18 | runtime: nodejs10.x 19 | memorySize: 128 20 | timeout: 10 21 | region: us-east-1 22 | stage: ${opt:stage, 'dev'} 23 | apiGateway: 24 | restApiId: 25 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 26 | restApiRootResourceId: 27 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-rootResourceId-${self:provider.stage} 28 | logRetentionInDays: 14 29 | environment: 30 | logLevel: ${self:custom.${self:provider.stage}.LogLevel} 31 | 32 | functions: 33 | __FUNCTION__: 34 | handler: index.handler 35 | events: 36 | - http: 37 | path: /__PATH__ 38 | method: get 39 | cors: true 40 | 41 | plugins: 42 | - serverless-pseudo-parameters 43 | - serverless-iam-roles-per-function 44 | - serverless-plugin-reducer 45 | -------------------------------------------------------------------------------- /api/src/user/order/serverless.yml: -------------------------------------------------------------------------------- 1 | service: ExampleMicroService-api-user-order 2 | 3 | frameworkVersion: ">=1.0.0 <2.0.0" 4 | 5 | custom: 6 | prod: 7 | Stack: ExampleSite 8 | LogLevel: info 9 | dev: 10 | Stack: ExampleSite 11 | LogLevel: debug 12 | 13 | package: 14 | individually: true 15 | 16 | provider: 17 | name: aws 18 | runtime: nodejs10.x 19 | memorySize: 128 20 | timeout: 10 21 | region: us-east-1 22 | stage: ${opt:stage, 'dev'} 23 | apiGateway: 24 | restApiId: 25 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 26 | restApiResources: 27 | /user/{userid}: 28 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-ApiRootUserUseridVar-${self:provider.stage} 29 | logRetentionInDays: 14 30 | environment: 31 | logLevel: ${self:custom.${self:provider.stage}.LogLevel} 32 | 33 | functions: 34 | UserOrder: 35 | handler: index.handler 36 | iamRoleStatements: 37 | - Effect: Allow 38 | Action: 39 | - dynamodb:Query 40 | Resource: 41 | - arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/${self:custom.${self:provider.stage}.Stack}-Orders-${self:provider.stage} 42 | environment: 43 | ordersTable: ${self:custom.${self:provider.stage}.Stack}-Orders-${self:provider.stage} 44 | events: 45 | - http: 46 | path: /user/{userid}/orders 47 | method: get 48 | cors: true 49 | 50 | plugins: 51 | - serverless-pseudo-parameters 52 | - serverless-iam-roles-per-function 53 | - serverless-plugin-reducer 54 | -------------------------------------------------------------------------------- /backend/src/orders/index.js: -------------------------------------------------------------------------------- 1 | /*jshint esversion: 9 */ 2 | const log4js = require('log4js'); 3 | const AWS = require('aws-sdk'); 4 | const docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'}); 5 | const sqs = new AWS.SQS({apiVersion: '2012-11-05'}); 6 | 7 | const ordersQueue = process.env.ordersQueue; 8 | const ordersTable = process.env.ordersTable; 9 | const logLevel = process.env.logLevel; 10 | 11 | const logger = log4js.getLogger('logger'); 12 | log4js.configure({ 13 | appenders: { logger: { type: 'console' }}, 14 | categories: { default: { appenders: ['logger'], level: logLevel }} 15 | }); 16 | 17 | // table - Table name 18 | // key - key of item 19 | // ue - updateExpression 20 | // eav - ExpressionAttributeValues 21 | async function updateTable({ table, key, ue, eav}) { 22 | try { 23 | return await docClient.update({ TableName: table, Key: key, UpdateExpression: ue, ExpressionAttributeValues: eav}).promise(); 24 | } 25 | catch (err) { 26 | logger.error('Update Table Error: ', err); 27 | throw err; 28 | } 29 | } 30 | 31 | async function deleteMessage(queue, receiptHandle) { 32 | var deleteParams = { 33 | QueueUrl: queue, 34 | ReceiptHandle: receiptHandle}; 35 | try { 36 | const data = await sqs.deleteMessage(deleteParams).promise(); 37 | logger.debug('Message Deleted: ', data); 38 | } 39 | catch(err) { 40 | logger.error("Message Delete Error: ", err); 41 | throw err; 42 | } 43 | } 44 | 45 | exports.handler = async (event, context) => { 46 | if (event.Records) { 47 | return Promise.all(event.Records.map(async (message) => { 48 | let body = JSON.parse(message.body); 49 | // update table 50 | // delete message 51 | })); 52 | } 53 | }; 54 | -------------------------------------------------------------------------------- /api/src/order/serverless.yml: -------------------------------------------------------------------------------- 1 | service: ExampleMicroService-api-order 2 | 3 | frameworkVersion: ">=1.0.0 <2.0.0" 4 | 5 | custom: 6 | prod: 7 | Stack: ExampleSite 8 | LogLevel: info 9 | dev: 10 | Stack: ExampleSite 11 | LogLevel: debug 12 | 13 | package: 14 | individually: true 15 | 16 | provider: 17 | name: aws 18 | runtime: nodejs10.x 19 | memorySize: 128 20 | timeout: 10 21 | region: us-east-1 22 | stage: ${opt:stage, 'dev'} 23 | apiGateway: 24 | restApiId: 25 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 26 | restApiRootResourceId: 27 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-rootResourceId-${self:provider.stage} 28 | logRetentionInDays: 14 29 | environment: 30 | logLevel: ${self:custom.${self:provider.stage}.LogLevel} 31 | 32 | functions: 33 | Order: 34 | handler: index.handler 35 | iamRoleStatements: 36 | - Effect: Allow 37 | Action: 38 | - dynamodb:PutItem 39 | - dynamodb:Query 40 | Resource: 41 | - arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/${self:custom.${self:provider.stage}.Stack}-Orders-${self:provider.stage} 42 | - Effect: Allow 43 | Action: 44 | - sqs:SendMessage 45 | Resource: 46 | - arn:aws:sqs:#{AWS::Region}:#{AWS::AccountId}:${self:custom.${self:provider.stage}.Stack}-OrdersQueue-${self:provider.stage} 47 | environment: 48 | ordersTable: ${self:custom.${self:provider.stage}.Stack}-Orders-${self:provider.stage} 49 | ordersQueue: https://sqs.#{AWS::Region}.amazonaws.com/#{AWS::AccountId}/${self:custom.${self:provider.stage}.Stack}-OrdersQueue-${self:provider.stage} 50 | events: 51 | - http: 52 | path: /order 53 | method: post 54 | cors: true 55 | - http: 56 | path: /order/{orderid} 57 | method: get 58 | cors: true 59 | 60 | plugins: 61 | - serverless-pseudo-parameters 62 | - serverless-iam-roles-per-function 63 | - serverless-plugin-reducer 64 | -------------------------------------------------------------------------------- /api/src/user/serverless.yml: -------------------------------------------------------------------------------- 1 | service: ExampleMicroService-api-user 2 | 3 | frameworkVersion: ">=1.0.0 <2.0.0" 4 | 5 | custom: 6 | prod: 7 | Stack: ExampleSite 8 | LogLevel: info 9 | dev: 10 | Stack: ExampleSite 11 | LogLevel: debug 12 | 13 | package: 14 | individually: true 15 | 16 | provider: 17 | name: aws 18 | runtime: nodejs10.x 19 | memorySize: 128 20 | timeout: 10 21 | region: us-east-1 22 | stage: ${opt:stage, 'dev'} 23 | apiGateway: 24 | restApiId: 25 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 26 | restApiRootResourceId: 27 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-rootResourceId-${self:provider.stage} 28 | logRetentionInDays: 14 29 | environment: 30 | logLevel: ${self:custom.${self:provider.stage}.LogLevel} 31 | 32 | functions: 33 | User: 34 | handler: index.handler 35 | iamRoleStatements: 36 | - Effect: Allow 37 | Action: 38 | - dynamodb:GetItem 39 | - dynamodb:PutItem 40 | - dynamodb:Scan 41 | Resource: 42 | - arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/${self:custom.${self:provider.stage}.Stack}-Users-${self:provider.stage} 43 | environment: 44 | usersTable: ${self:custom.${self:provider.stage}.Stack}-Users-${self:provider.stage} 45 | events: 46 | - http: 47 | path: /user 48 | method: get 49 | cors: true 50 | - http: 51 | path: /user 52 | method: post 53 | cors: true 54 | - http: 55 | path: /user/{userid} 56 | method: get 57 | cors: true 58 | 59 | resources: 60 | Outputs: 61 | ApiRootUser: 62 | Value: 63 | Ref: ApiGatewayResourceUser 64 | Export: 65 | Name: ${self:custom.${self:provider.stage}.Stack}-ApiRootUser-${self:provider.stage} 66 | ApiRootUserUseridVar: 67 | Value: 68 | Ref: ApiGatewayResourceUserUseridVar 69 | Export: 70 | Name: ${self:custom.${self:provider.stage}.Stack}-ApiRootUserUseridVar-${self:provider.stage} 71 | 72 | plugins: 73 | - serverless-pseudo-parameters 74 | - serverless-iam-roles-per-function 75 | - serverless-plugin-reducer 76 | -------------------------------------------------------------------------------- /api/src/user/order/index.js: -------------------------------------------------------------------------------- 1 | /*jshint esversion: 9 */ 2 | const log4js = require('log4js'); 3 | const serverless = require('serverless-http'); 4 | const bodyParser = require('body-parser'); 5 | const cors = require('cors'); 6 | const express = require('express'); 7 | const moment = require('moment'); 8 | const AWS = require('aws-sdk'); 9 | const docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'}); 10 | 11 | const ordersTable = process.env.ordersTable; 12 | const logLevel = process.env.logLevel; 13 | 14 | const app = express(); 15 | 16 | const logger = log4js.getLogger('logger'); 17 | log4js.configure({ 18 | appenders: { logger: { type: 'console' }}, 19 | categories: { default: { appenders: ['logger'], level: logLevel }} 20 | }); 21 | 22 | app.use(cors({ 23 | allowedHeaders: ['Accept', 'Authorization', 'Content-Type', 'X-Amz-Date,', 'X-Amz-Security-Token', 'X-Api-Key'], 24 | maxAge: 600 25 | })); 26 | app.use(bodyParser.json({ strict: false })); 27 | 28 | // table - Table name 29 | // kce - Key Condition Expression 30 | // eav - ExpressionAttributeValues 31 | // ean - ExpressionAttributeNames 32 | // pe - Projection Expression 33 | async function queryTable({ table, kce, fe, eav, ean, pe, sif, limit, esk = true}) { 34 | let response = {}; 35 | let data = []; 36 | let ExclusiveStartKey; 37 | try { 38 | logger.debug(`table:${table} pe:${pe} kce:${kce} fe:${fe} eav:${JSON.stringify(eav)} ean:${JSON.stringify(ean)} sif:${sif} esk:${esk}` ); 39 | do { 40 | response = await docClient.query({ 41 | TableName: table, 42 | ProjectionExpression: pe, 43 | KeyConditionExpression: kce, 44 | FilterExpression: fe, 45 | ExpressionAttributeValues: eav, 46 | ExpressionAttributeNames: ean, 47 | ScanIndexForward: sif, 48 | Limit: limit, 49 | ExclusiveStartKey 50 | }).promise(); 51 | data = data.concat(response.Items); 52 | ExclusiveStartKey = (esk) ? response.LastEvaluatedKey : undefined; 53 | } while (ExclusiveStartKey); 54 | return data; 55 | } 56 | catch (err) { 57 | logger.error('Query Table Error: ', err); 58 | throw err; 59 | } 60 | } 61 | 62 | // ROUTES 63 | app.get('/user/:userid/orders', async (req, res) => { 64 | try { 65 | // query to orders for user 66 | res.status(200).json({body: `User was successfully created`}); 67 | } 68 | catch (err) { 69 | res.status(504).json({body: 'Get orders error.'}); 70 | } 71 | }); 72 | 73 | const handler = serverless(app); 74 | exports.handler = async (event, context) => { 75 | const result = await handler(event, context); 76 | return result; 77 | }; 78 | -------------------------------------------------------------------------------- /api/src/user/index.js: -------------------------------------------------------------------------------- 1 | /*jshint esversion: 9 */ 2 | const log4js = require('log4js'); 3 | const serverless = require('serverless-http'); 4 | const bodyParser = require('body-parser'); 5 | const cors = require('cors'); 6 | const express = require('express'); 7 | const moment = require('moment'); 8 | const AWS = require('aws-sdk'); 9 | const docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'}); 10 | 11 | const usersTable = process.env.usersTable; 12 | const logLevel = process.env.logLevel; 13 | 14 | const app = express(); 15 | 16 | const logger = log4js.getLogger('logger'); 17 | log4js.configure({ 18 | appenders: { logger: { type: 'console' }}, 19 | categories: { default: { appenders: ['logger'], level: logLevel }} 20 | }); 21 | 22 | app.use(cors({ 23 | allowedHeaders: ['Accept', 'Authorization', 'Content-Type', 'X-Amz-Date,', 'X-Amz-Security-Token', 'X-Api-Key'], 24 | maxAge: 600 25 | })); 26 | app.use(bodyParser.json({ strict: false })); 27 | 28 | // table - Table name 29 | // fe - Filter Expression 30 | // eav - ExpressionAttributeValues 31 | // ean - ExpressionAttributeNames 32 | // pe - Projection Expression 33 | async function scanTable({ table, fe, eav, ean, pe}) { 34 | let response = {}; 35 | let data = []; 36 | let ExclusiveStartKey; 37 | try { 38 | do { 39 | response = await docClient.scan({ 40 | TableName: table, 41 | ProjectionExpression: pe, 42 | FilterExpression: fe, 43 | ExpressionAttributeValues: eav, 44 | ExpressionAttributeNames: ean, 45 | ExclusiveStartKey 46 | }).promise(); 47 | data = data.concat(response.Items); 48 | ExclusiveStartKey = response.LastEvaluatedKey; 49 | } while (response.LastEvaluatedKey); 50 | return data; 51 | } 52 | catch (err) { 53 | logger.error('Scan Table Error: ', err); 54 | throw err; 55 | } 56 | } 57 | 58 | // table - Table Namme 59 | // item - Json object being added to table 60 | async function putTable({ table, item}) { 61 | try { 62 | return await docClient.put({ TableName: table, Item: item}).promise(); 63 | } 64 | catch (err) { 65 | logger.error('Put Table Error: ', err); 66 | throw err; 67 | } 68 | } 69 | 70 | // table - Table Namme 71 | // pe - Projection Expression 72 | // key - key of item 73 | async function getTable({ table, pe, key}) { 74 | try { 75 | return await docClient.get({ TableName: table, 76 | ProjectionExpression: pe, 77 | Key: key}).promise(); 78 | } 79 | catch (err) { 80 | logger.error('Get Table Error: ', err); 81 | throw err; 82 | } 83 | } 84 | 85 | // ROUTES 86 | app.post('/user', async (req, res) => { 87 | try { 88 | // put item to create new user 89 | res.status(200).json({body: `User was successfully created`}); 90 | } 91 | catch (err) { 92 | res.status(504).json({body: 'Create User error.'}); 93 | } 94 | }); 95 | 96 | app.get('/user', async (req, res) => { 97 | try { 98 | // scan to get a list of users 99 | res.status(200).json({body: `User was successfully created`}); 100 | } 101 | catch (err) { 102 | res.status(504).json({body: 'List users error.'}); 103 | } 104 | }); 105 | 106 | app.get('/user/:userid', async (req, res) => { 107 | try { 108 | // get to get a user 109 | res.status(200).json({body: `User was successfully created`}); 110 | } 111 | catch (err) { 112 | res.status(504).json({body: 'Get user error.'}); 113 | } 114 | }); 115 | 116 | const handler = serverless(app); 117 | exports.handler = async (event, context) => { 118 | const result = await handler(event, context); 119 | return result; 120 | }; 121 | -------------------------------------------------------------------------------- /backend/Makefile: -------------------------------------------------------------------------------- 1 | MKFILEPATH := $(shell pwd) 2 | SERVICE ?= '' 3 | 4 | remove: 5 | $(info [*] Removing dev env....) 6 | serverless remove --stage dev 7 | 8 | removeAll: 9 | $(info [*] Removing dev env for all....) 10 | @$(MAKE) _removeAll 11 | 12 | clean: _check_service_definition 13 | $(info [*] Who needs all that anyway? Destroying environment....) 14 | ifeq ($(SERVICE), '') 15 | rm -rf node_modules 16 | rm -rf .serverless 17 | else 18 | rm -rf ./src/${SERVICE}/node_modules 19 | rm -rf ./src/${SERVICE}/.serverless 20 | endif 21 | 22 | cleanAll: 23 | $(info [*] Who needs all that anyway? Destroying environment for all paths....) 24 | @rm -rf node_modules 25 | @rm -rf .serverless 26 | @find ./src -depth -type d -not -name 'src' -not -path "*/node_modules/*" -not -name 'node_modules' -not -name '.serverless' > results.txt 27 | @while read line; do \ 28 | echo "Cleaning $$line..."; \ 29 | rm -rf $$line/node_modules; \ 30 | rm -rf $$line/.serverless; \ 31 | done < results.txt 32 | @rm -rf results.txt 33 | @rm -rf ./node_modules 34 | @rm -rf ./.serverless 35 | @cd ../api && $(MAKE) cleanAll 36 | 37 | build: _check_service_definition 38 | ifeq ($(SERVICE), '') 39 | yarn install 40 | else 41 | yarn install --cwd ./src/${SERVICE} 42 | endif 43 | 44 | buildAll: 45 | $(info [*] Building....) 46 | @$(MAKE) _buildAll 47 | 48 | deploy: _check_stage_definition 49 | $(info [*] Deploying to $(STAGE)....) 50 | serverless deploy --stage ${STAGE} 51 | 52 | deployAll: _check_stage_definition 53 | $(info [*] Deploying all infrastructure to $(STAGE)....) 54 | $(MAKE) _deployAll STAGE=${STAGE} 55 | 56 | ############# 57 | # Helpers # 58 | ############# 59 | _removeAll: 60 | cd ../api && $(MAKE) removeAll 61 | cd ${MKFILEPATH} && serverless remove --stage dev 62 | 63 | _buildAll: 64 | yarn install 65 | @find ./src -depth -type d -not -name 'src' -not -path "*/node_modules/*" -not -name 'node_modules' -not -name '.serverless' > results.txt 66 | @while read line; do \ 67 | echo "Building $$line..."; \ 68 | yarn install --cwd $$line; \ 69 | cd ${MKFILEPATH}; \ 70 | done < results.txt 71 | @rm -rf results.txt 72 | cd ../api && $(MAKE) buildAll 73 | 74 | _deployAll: 75 | serverless deploy --stage ${STAGE} 76 | cd ../api && $(MAKE) deployAll 77 | 78 | _check_service_definition: 79 | $(info [*] Checking whether service $(SERVICE) exists...) 80 | ifndef SERVICE 81 | $(info [*] SERVICE env not defined, make sure you define SERVICE='order', assuming root directory.) 82 | endif 83 | 84 | _check_stage_definition: 85 | $(info [*] Checking whether STAGE $(STAGE) exists...) 86 | ifndef STAGE 87 | $(error [!] STAGE env not defined, make sure you define STAGE='dev' for example.) 88 | endif 89 | 90 | define HELP_MESSAGE 91 | Environment variables to be aware of or to hardcode depending on your use case: 92 | 93 | SERVICE 94 | Default: not_defined 95 | Info: The folder in src for the function endpoint being deployed. /src/users is SERVICE='users'. 96 | 97 | STAGE 98 | Default: not_defined 99 | Info: The deployment stage 100 | 101 | Common usage: 102 | 103 | ...::: Cleans up the environment removes node_modules :::... 104 | $ make clean SERVICE="users" 105 | 106 | ...::: Cleans up the environment removes node_modules for all functions :::... 107 | $ make cleanAll 108 | 109 | ...::: Build Function :::... 110 | $ make build SERVICE="vehicles/command" 111 | 112 | ...::: Build All Functions :::... 113 | $ make buildAll 114 | 115 | ...::: Deploy Function to Stage :::... 116 | $ make deploy SERVICE="vehicles" STAGE="prod" 117 | 118 | ...::: Deploy All Functions to Stage :::... 119 | $ make prodAll STAGE="dev" 120 | 121 | endef 122 | -------------------------------------------------------------------------------- /api/src/order/index.js: -------------------------------------------------------------------------------- 1 | /*jshint esversion: 9 */ 2 | const log4js = require('log4js'); 3 | const serverless = require('serverless-http'); 4 | const bodyParser = require('body-parser'); 5 | const cors = require('cors'); 6 | const express = require('express'); 7 | const moment = require('moment'); 8 | const AWS = require('aws-sdk'); 9 | const docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'}); 10 | const sqs = new AWS.SQS({apiVersion: '2012-11-05'}); 11 | 12 | const ordersQueue = process.env.ordersQueue; 13 | const ordersTable = process.env.ordersTable; 14 | const logLevel = process.env.logLevel; 15 | 16 | const app = express(); 17 | 18 | const logger = log4js.getLogger('logger'); 19 | log4js.configure({ 20 | appenders: { logger: { type: 'console' }}, 21 | categories: { default: { appenders: ['logger'], level: logLevel }} 22 | }); 23 | 24 | app.use(cors({ 25 | allowedHeaders: ['Accept', 'Authorization', 'Content-Type', 'X-Amz-Date,', 'X-Amz-Security-Token', 'X-Api-Key'], 26 | maxAge: 600 27 | })); 28 | app.use(bodyParser.json({ strict: false })); 29 | 30 | // table - Table name 31 | // fe - Filter Expression 32 | // eav - ExpressionAttributeValues 33 | // ean - ExpressionAttributeNames 34 | // pe - Projection Expression 35 | async function scanTable({ table, fe, eav, ean, pe}) { 36 | let response = {}; 37 | let data = []; 38 | let ExclusiveStartKey; 39 | try { 40 | do { 41 | response = await docClient.scan({ 42 | TableName: table, 43 | ProjectionExpression: pe, 44 | FilterExpression: fe, 45 | ExpressionAttributeValues: eav, 46 | ExpressionAttributeNames: ean, 47 | ExclusiveStartKey 48 | }).promise(); 49 | data = data.concat(response.Items); 50 | ExclusiveStartKey = response.LastEvaluatedKey; 51 | } while (response.LastEvaluatedKey); 52 | return data; 53 | } 54 | catch (err) { 55 | logger.error('Scan Table Error: ', err); 56 | throw err; 57 | } 58 | } 59 | 60 | // table - Table Namme 61 | // item - Json object being added to table 62 | async function putTable({ table, item}) { 63 | try { 64 | return await docClient.put({ TableName: table, Item: item}).promise(); 65 | } 66 | catch (err) { 67 | logger.error('Put Table Error: ', err); 68 | throw err; 69 | } 70 | } 71 | 72 | // table - Table Namme 73 | // pe - Projection Expression 74 | // key - key of item 75 | async function getTable({ table, pe, key}) { 76 | try { 77 | return await docClient.get({ TableName: table, 78 | ProjectionExpression: pe, 79 | Key: key}).promise(); 80 | } 81 | catch (err) { 82 | logger.error('Get Table Error: ', err); 83 | throw err; 84 | } 85 | } 86 | 87 | async function sendMessage(_queue, _message) { 88 | try { 89 | const data = sqs.sendMessage({ 90 | QueueUrl: _queue, 91 | MessageBody: JSON.stringify(_message), 92 | DelaySeconds: 0 93 | }).promise(); 94 | } 95 | catch (err) { 96 | logger.error('Send Message Error: ', err); 97 | throw err; 98 | } 99 | } 100 | 101 | // ROUTES 102 | app.post('/order', async (req, res) => { 103 | try { 104 | // put item to create new order 105 | // send message to sqs queue 106 | res.status(200).json({body: `User was successfully created`}); 107 | } 108 | catch (err) { 109 | res.status(504).json({body: 'Create order error.'}); 110 | } 111 | }); 112 | 113 | app.get('/order/:orderid', async (req, res) => { 114 | try { 115 | // query to get an order 116 | res.status(200).json({body: `User was successfully created`}); 117 | } 118 | catch (err) { 119 | res.status(504).json({body: 'Get order error.'}); 120 | } 121 | }); 122 | 123 | const handler = serverless(app); 124 | exports.handler = async (event, context) => { 125 | const result = await handler(event, context); 126 | return result; 127 | }; 128 | -------------------------------------------------------------------------------- /backend/serverless.yml: -------------------------------------------------------------------------------- 1 | service: ExampleMicroService 2 | 3 | frameworkVersion: ">=1.0.0 <2.0.0" 4 | 5 | custom: 6 | # You can uncomment this and it will deploy to a custom website. 7 | # Provided you give accurate variables in the custom.prod.ApiHostedZone,ApieSite, and ApiSite. 8 | # customDomain: 9 | # domainName: ${self:custom.${self:provider.stage}.ApiSite} 10 | # stage: ${self:provider.stage} 11 | # basePath: 12 | # certificateArn: ${self:custom.${self:provider.stage}.ApiCert} 13 | # createRoute53Record: true 14 | # endpointType: 'edge' 15 | prod: 16 | Stack: ExampleSite 17 | LogLevel: info 18 | ApiHostedZone: examplesite.us. 19 | ApiSite: "prod.examplesite.us" 20 | ApiCert: "arn:aws:acm:us-east-1:12345678901:certificate/12345678-b123-a123-c123-abcd1234efgh" 21 | OrdersTableRCU: 1 22 | OrdersTableWCU: 1 23 | UsersTableRCU: 1 24 | UsersTableWCU: 1 25 | dev: 26 | Stack: ExampleSite 27 | LogLevel: debug 28 | ApiHostedZone: examplesite.us. 29 | ApiSite: "dev.examplesite.us" 30 | ApiCert: "arn:aws:acm:us-east-1:12345678901:certificate/12345678-b123-a123-c123-abcd1234efgh" 31 | OrdersTableRCU: 1 32 | OrdersTableWCU: 1 33 | UsersTableRCU: 1 34 | UsersTableWCU: 1 35 | provider: 36 | name: aws 37 | runtime: nodejs10.x 38 | memorySize: 128 39 | timeout: 10 40 | region: us-east-1 41 | stage: ${opt:stage, 'dev'} 42 | logRetentionInDays: 14 43 | environment: 44 | logLevel: ${self:custom.${self:provider.stage}.LogLevel} 45 | 46 | # This is to activate serverless-plugin-reducer. 47 | package: 48 | individually: true 49 | 50 | functions: 51 | # API Root Function, for a health check. 52 | Root: 53 | handler: src/_root/index.handler 54 | events: 55 | - http: 56 | path: / 57 | method: get 58 | cors: true 59 | # When an order is created, it will place a message in the OrdersQueue to fulfill the order. 60 | Orders: 61 | handler: src/orders/index.handler 62 | environment: 63 | ordersQueueUrl: !Ref OrdersQueue 64 | ordersTable: !Ref OrdersTable 65 | iamRoleStatements: 66 | - Effect: Allow 67 | Action: 68 | - dynamodb:UpdateItem 69 | Resource: 70 | - arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/${self:custom.${self:provider.stage}.Stack}-Orders-${self:provider.stage} 71 | - Effect: Allow 72 | Action: 73 | - sqs:ReceiveMessage 74 | - sqs:DeleteMessage 75 | - sqs:GetQueueAttributes 76 | Resource: 77 | - arn:aws:sqs:#{AWS::Region}:#{AWS::AccountId}:${self:custom.${self:provider.stage}.Stack}-OrdersQueue-${self:provider.stage} 78 | events: 79 | - sqs: 80 | arn: 81 | Fn::GetAtt: 82 | - OrdersQueue 83 | - Arn 84 | batchSize: 1 85 | resources: 86 | # API GW defined so you can export the restApiId, as well as name it. 87 | - ${file(resources/apigateway/RestApi.yml)} 88 | 89 | # Two DynamoDB tables 90 | - ${file(resources/dynamodb/UsersTable.yml)} 91 | - ${file(resources/dynamodb/OrdersTable.yml)} 92 | 93 | # Platform for our two functions to communicate. 94 | - ${file(resources/sqs/OrdersQueue.yml)} 95 | # Here we are exporting the RestApiID and the RootResourceId to use in other API Endpoints. 96 | - Outputs: 97 | ApiGWRestApiId: 98 | Value: 99 | Ref: ApiGatewayRestApi 100 | Export: 101 | Name: ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 102 | ApiGWRootResourceId: 103 | Value: 104 | Fn::GetAtt: 105 | - ApiGatewayRestApi 106 | - RootResourceId 107 | Export: 108 | Name: ${self:custom.${self:provider.stage}.Stack}-rootResourceId-${self:provider.stage} 109 | plugins: 110 | # This is for support of #{AWS::Region} when developing ARNs 111 | - serverless-pseudo-parameters 112 | # This is to provide a iam role per function. 113 | - serverless-iam-roles-per-function 114 | # Enable this if you want to have a custom domain. Please be sure to ru serverless create_domain prior to serverless deploy 115 | # - serverless-domain-manager 116 | # This plugin helps reduce the dependencies for your lambda, speeding uploads and S3 storage. 117 | - serverless-plugin-reducer 118 | -------------------------------------------------------------------------------- /backend/src/_root/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | async@^2.6.2: 6 | version "2.6.2" 7 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" 8 | integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== 9 | dependencies: 10 | lodash "^4.17.11" 11 | 12 | date-format@^2.0.0: 13 | version "2.0.0" 14 | resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.0.0.tgz#7cf7b172f1ec564f0003b39ea302c5498fb98c8f" 15 | integrity sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA== 16 | 17 | debug@^3.2.6: 18 | version "3.2.6" 19 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 20 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 21 | dependencies: 22 | ms "^2.1.1" 23 | 24 | debug@^4.1.1: 25 | version "4.1.1" 26 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 27 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 28 | dependencies: 29 | ms "^2.1.1" 30 | 31 | flatted@^2.0.0: 32 | version "2.0.0" 33 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" 34 | integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== 35 | 36 | fs-extra@^7.0.1: 37 | version "7.0.1" 38 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 39 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 40 | dependencies: 41 | graceful-fs "^4.1.2" 42 | jsonfile "^4.0.0" 43 | universalify "^0.1.0" 44 | 45 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 46 | version "4.1.15" 47 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 48 | integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 49 | 50 | jsonfile@^4.0.0: 51 | version "4.0.0" 52 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 53 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 54 | optionalDependencies: 55 | graceful-fs "^4.1.6" 56 | 57 | lodash@^4.17.11: 58 | version "4.17.11" 59 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 60 | integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== 61 | 62 | log4js@^4.2.0: 63 | version "4.2.0" 64 | resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.2.0.tgz#659a91d9522053b1e1d0ba89adf81c2005b8a993" 65 | integrity sha512-1dJ2ORJcdqbzxvzKM2ceqPBh4O6bbICJpB4dvSEUoMcb14s8MqQ/54zNPqekuN5yjGtxO3GUDTvZfQOQhwdqnA== 66 | dependencies: 67 | date-format "^2.0.0" 68 | debug "^4.1.1" 69 | flatted "^2.0.0" 70 | rfdc "^1.1.2" 71 | streamroller "^1.0.5" 72 | 73 | ms@^2.1.1: 74 | version "2.1.1" 75 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 76 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 77 | 78 | rfdc@^1.1.2: 79 | version "1.1.4" 80 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" 81 | integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug== 82 | 83 | streamroller@^1.0.5: 84 | version "1.0.5" 85 | resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.5.tgz#71660c20b06b1a7b204d46085731ad13c10a562d" 86 | integrity sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw== 87 | dependencies: 88 | async "^2.6.2" 89 | date-format "^2.0.0" 90 | debug "^3.2.6" 91 | fs-extra "^7.0.1" 92 | lodash "^4.17.11" 93 | 94 | universalify@^0.1.0: 95 | version "0.1.2" 96 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 97 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 98 | -------------------------------------------------------------------------------- /api/Makefile: -------------------------------------------------------------------------------- 1 | 2 | MKFILEPATH := $(shell pwd) 3 | LC_SERVICE := $(shell echo $(SERVICE) | tr A-Z a-z) 4 | SLS_SERVICE := $(subst /,-,$(LC_SERVICE)) 5 | CAMEL_SERVICE := $(shell echo $(SLS_SERVICE) | sed 's/-\([a-z]\)/\U\1/g;s/^\([a-z]\)/\U\1/g') 6 | ESCAPED_SERVICE := $(subst /,\/,$(LC_SERVICE)) 7 | 8 | remove: _check_service_definition 9 | $(info [*] Removing dev env....) 10 | cd ./src/${SERVICE} && serverless remove --stage dev 11 | 12 | removeAll: 13 | $(info [*] Removing dev env for all....) 14 | @$(MAKE) _removeAll 15 | 16 | clean: _check_service_definition 17 | $(info [*] Who needs all that anyway? Destroying environment....) 18 | @rm -rf ./src/${SERVICE}/node_modules 19 | @rm -rf ./src/${SERVICE}/.serverless 20 | 21 | cleanAll: 22 | $(info [*] Who needs all that anyway? Destroying environment for all paths....) 23 | @find ./src -depth -type d -not -name 'src' -not -path "*/node_modules/*" -not -name 'node_modules' -not -name '.serverless' > results.txt 24 | @while read line; do \ 25 | echo "Cleaning $$line..."; \ 26 | rm -rf $$line/node_modules; \ 27 | rm -rf $$line/.serverless; \ 28 | done < results.txt 29 | @rm -rf results.txt 30 | 31 | build: _check_service_definition 32 | yarn install --cwd ./src/${SERVICE} 33 | 34 | buildAll: 35 | @$(MAKE) _buildAll 36 | 37 | deploy: _check_service_definition _check_stage_definition 38 | cd ./src/${SERVICE} && serverless deploy --stage ${STAGE} 39 | 40 | deployAll: _check_stage_definition _deployAll 41 | 42 | endpoint: 43 | $(info [*] Making new endpoint at ./src/$(SERVICE)....) 44 | @$(MAKE) _createEndpoint SERVICE=${SERVICE} 45 | 46 | ############# 47 | # Helpers # 48 | ############# 49 | _createEndpoint: 50 | #make directory 51 | @mkdir -p ./src/${SERVICE} 52 | @touch ./src/${SERVICE}/index.js 53 | @cp serverless.yml ./src/${SERVICE}/serverless.yml 54 | @sed -i "s/__SERVICE__/${SLS_SERVICE}/" ./src/${SERVICE}/serverless.yml 55 | @sed -i "s/__FUNCTION__/${CAMEL_SERVICE}/" ./src/${SERVICE}/serverless.yml 56 | @sed -i "s/__PATH__/${ESCAPED_SERVICE}/" ./src/${SERVICE}/serverless.yml 57 | @yarn add --dev --cwd ./src/${SERVICE} serverless 58 | @yarn add --dev --cwd ./src/${SERVICE} serverless-pseudo-parameters 59 | @yarn add --dev --cwd ./src/${SERVICE} serverless-iam-roles-per-function 60 | @yarn add --dev --cwd ./src/${SERVICE} serverless-plugin-reducer 61 | @yarn add --cwd ./src/${SERVICE} body-parser 62 | @yarn add --cwd ./src/${SERVICE} cors 63 | @yarn add --cwd ./src/${SERVICE} express 64 | @yarn add --cwd ./src/${SERVICE} moment 65 | @yarn add --cwd ./src/${SERVICE} serverless-http 66 | @yarn add --cwd ./src/${SERVICE} log4js 67 | 68 | _removeAll: 69 | @find ./src -depth -type d -not -name 'src' -not -path "*/node_modules/*" -not -name 'node_modules' -not -name '.serverless' > results.txt 70 | @while read line; do \ 71 | echo "Removing $$line..."; \ 72 | cd $$line && serverless remove --stage dev; \ 73 | cd ${MKFILEPATH}; \ 74 | done < results.txt 75 | @rm -rf results.txt 76 | 77 | _buildAll: 78 | @find ./src -depth -type d -not -name 'src' -not -path "*/node_modules/*" -not -name 'node_modules' -not -name '.serverless' > results.txt 79 | @while read line; do \ 80 | echo "Building $$line..."; \ 81 | yarn install --cwd $$line; \ 82 | cd ${MKFILEPATH}; \ 83 | done < results.txt 84 | @rm -rf results.txt 85 | 86 | _deployAll: 87 | @find ./src -type d -not -name 'src' -not -path "*/node_modules/*" -not -name 'node_modules' -not -name '.serverless' > results.txt 88 | @while read line; do \ 89 | echo "Deploying $$line..."; \ 90 | cd $$line && serverless deploy --stage ${STAGE}; \ 91 | cd ${MKFILEPATH}; \ 92 | done < results.txt 93 | @rm -rf results.txt 94 | 95 | _check_service_definition: 96 | $(info [*] Checking whether service $(SERVICE) exists...) 97 | ifndef SERVICE 98 | $(error [!] SERVICE env not defined, make sure you define SERVICE='users' for example.) 99 | endif 100 | 101 | ifeq ($(wildcard ./src/$(SERVICE)),) 102 | $(error [!] '$(SERVICE)' folder doesnt exist) 103 | endif 104 | 105 | _check_stage_definition: 106 | $(info [*] Checking whether STAGE $(STAGE) exists...) 107 | ifndef STAGE 108 | $(error [!] STAGE env not defined, make sure you define STAGE='dev' for example.) 109 | endif 110 | 111 | define HELP_MESSAGE 112 | Environment variables to be aware of or to hardcode depending on your use case: 113 | 114 | SERVICE 115 | Default: not_defined 116 | Info: The folder in src for the function endpoint being deployed. /src/users is SERVICE='users'. 117 | 118 | STAGE 119 | Default: not_defined 120 | Info: The deployment stage 121 | 122 | Common usage: 123 | 124 | ...::: Cleans up the environment removes node_modules :::... 125 | $ make clean SERVICE="users" 126 | 127 | ...::: Cleans up the environment removes node_modules for all functions :::... 128 | $ make cleanAll 129 | 130 | ...::: Build Function :::... 131 | $ make build SERVICE="vehicles/command" 132 | 133 | ...::: Build All Functions :::... 134 | $ make buildAll 135 | 136 | ...::: Deploy Function to Stage :::... 137 | $ make deploy SERVICE="vehicles" STAGE="prod" 138 | 139 | ...::: Deploy All Functions to Stage :::... 140 | $ make prodAll STAGE="dev" 141 | 142 | endef 143 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Serverless Microservice Framework 2 | 3 | ## Diagram: 4 | ![api diagram](https://github.com/trilom/sls-microservice/blob/master/sls-microservice.jpg "API Diagram") 5 | 6 | ## How to use: 7 | Like all infrastructure stacks, there is some soft of backend, and frontend. In this case we have a front end implemented with API Gateway and a simple backend with 2 tables and a SQS queue to trigger a function. 8 | In order to use this stack you simply run the `make buildAll` and `make deployAll` command from within the `./backend` directory. 9 | 10 | ## Why is it designed like this: 11 | In order to gain fine control over each endpoint of your API this allows you to separate your project into distinct directories to lighten global dependencies. 12 | 13 | ### What does this build? 14 | --- 15 | This will define an example Serverless infrastructure stack containing: 16 | 1. an API Gateway 17 | The API has 6 endpoints. One to create a user, one to get a user information, one to get a list of users, one to get a list of orders for a user, one to get order information for that user, and one to create an order. 18 | 2. two DynamoDB tables 19 | One is the user table and one is the order table. 20 | 3. a SQS queue 21 | An SQS queue that looks out for orders and moves them to fulfillment. 22 | 4. one backend lambda function, and three api lambda functions 23 | The backend function will look for messages in the Order queue, then move them to fulfillment. 24 | The API functions are split into 3 endpoints where you can implement different packages scope. 25 | 26 | #### Endpoints 27 | --- 28 | `/user` __GET__ - _List of users._ 29 | `/user` __POST__ - _Create a user._ 30 | `/user/{userid}` __GET__ - _User information._ 31 | `/user/{userid}/orders` __GET__ - _Get order information for user._ 32 | `/order` __POST__ - _Create an order._ 33 | `/order/{orderid}` __GET__ - _Get order information._ 34 | 35 | ### Things to note 36 | #### API Gateway RestApiId Exports and Usage 37 | --- 38 | Take note in the `./backend/serverless.yml` we are exporting two variables from the stack. This is for reuse in our child API endpoint stacks: 39 | ```yaml 40 | #export from ./backend/serverless.yml 41 | - Outputs: 42 | ApiGWRestApiId: 43 | Value: 44 | Ref: ApiGatewayRestApi 45 | Export: 46 | Name: ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 47 | ApiGWRootResourceId: 48 | Value: 49 | Fn::GetAtt: 50 | - ApiGatewayRestApi 51 | - RootResourceId 52 | Export: 53 | Name: ${self:custom.${self:provider.stage}.Stack}-rootResourceId-${self:provider.stage} 54 | ``` 55 | ```yaml 56 | #import from ./api/src/user/serverless.yml 57 | provider: 58 | ... 59 | apiGateway: 60 | restApiId: 61 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 62 | restApiRootResourceId: 63 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-rootResourceId-${self:provider.stage} 64 | ``` 65 | 66 | __Special Consideration:__ When nesting resources within other resources, for example we have the API endpoint of `/user/{userid}/orders`. This endpoint is served separately from our `/user` endpoint, lets say you are using AWS Cognito for authentication, you can keep these dependencies separate from dependencies that access business function, like `/user/{userid}/orders` accesses the Orders table alone. 67 | __How is this accomplished?__ 68 | 1. We first export the shared resources from the parent resource `/user`. 69 | 70 | ```yaml 71 | #export from ./api/src/user/serverless.yml 72 | resources: 73 | Outputs: 74 | ApiRootUser: 75 | Value: 76 | Ref: ApiGatewayResourceUser 77 | Export: 78 | Name: ${self:custom.${self:provider.stage}.Stack}-ApiRootUser-${self:provider.stage} 79 | ApiRootUserUseridVar: 80 | Value: 81 | Ref: ApiGatewayResourceUserUseridVar 82 | Export: 83 | Name: ${self:custom.${self:provider.stage}.Stack}-ApiRootUserUseridVar-${self:provider.stage} 84 | ``` 85 | 2. We then import this shared resources as a `restApiResources` in the child resource `/user/{userid}/orders` 86 | ```yaml 87 | #import from ./api/src/user/order/serverless.yml 88 | provider: 89 | ... 90 | apiGateway: 91 | restApiId: 92 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 93 | restApiResources: 94 | /user/{userid}: 95 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-ApiRootUserUseridVar-${self:provider.stage} 96 | ``` 97 | 98 | ### Commands 99 | --- 100 | #### `make buildAll` 101 | First it will run `yarn install` in the `./backend` directory, then it will look at each directory in the `./backend/src` directory and run `yarn install` for each, then it will run `make buildAll` from the `./api` directory. This will look at each directory in the `./api/src` directory and run `yarn install` for each. 102 | #### `make deployAll --STAGE='dev'` 103 | First it will run `serverless deploy --stage dev` in the `./backend` directory and then it will run `make deployAll --STAGE='dev'` from the `./api` directory. This will look at each directory in the `./api/src` directory and run `serverless deploy --stage dev` for each. 104 | 105 | ### Other commands: 106 | --- 107 | #### `./api/make endpoint --SERVICE='billing'` 108 | This will make a new endpoint in the `./api/src/billing` directory. It will preload it with the serverless packages for the basic framework as well as set a baseline serverless.yml template. 109 | #### `make removeAll --STAGE='dev'` 110 | First it will run `serverless remove --stage dev` in the `./backend` directory and then it will run `make removeAll --STAGE='dev'` from the `./api` directory. This will look at each directory in the `./api/src` directory and run `serverless remove --stage dev` for each. 111 | #### `make cleanAll` 112 | First it will remove `.serverless/` and `node_modules/**` in the `./backend` directory and then it will run `make removeAll --STAGE='dev'` from the `./api` directory. This will look at each directory in the `./api/src` directory and remove `.serverless/` and `node_modules/**` for each. 113 | 114 | #### `./backend/make deploy STAGE='dev'` 115 | This will run `serverless deploy --stage dev` for the `./src/_root` endpoint. 116 | #### `./backend/make build SERVICE='orders'` 117 | This will run `yarn install` for the backend code. If you run this command without a `SERVICE` variable it will build the `serverless.yml` dependencies. 118 | #### `./backend/make remove ` 119 | This will remove the serverless project, deleting the backend infrastructure. 120 | #### `./backend/make clean SERVICE='orders'` 121 | This will remove the `.serverless` and `node_modules/**` directory for the backend. If you run this command without a `SERVICE` variable it will clean the `serverless.yml` dependencies. 122 | 123 | #### `./api/make deploy SERVICE='user' STAGE='dev'` 124 | This will run `serverless deploy --stage dev` for the `./src/user` endpoint. 125 | #### `./api/make build SERVICE='user'` 126 | This will run `yarn install` for the backend code. 127 | #### `./api/make remove SERVICE='user'` 128 | This will remove the serverless project, deleting the backend infrastructure. 129 | #### `./api/make clean SERVICE='orders'` 130 | This will remove the `.serverless` and `node_modules/**` directory for the backend. 131 | 132 | ## What do do from here: 133 | * In more complicated examples you would be able to use AWS Cognito in the `/user` endpoint to set up authentication. This endpoint would be scoped for user functions around Cognito and will likely have similar imports. 134 | * You could also import Stripe in a `/billing` endpoint to facilitate collection of payment information. 135 | * Within the `/orders` endpoint, you can set up your DynamoDB queries for managing your order collection. 136 | * You could set up CI/CD simply by adding a CodePipeline resource, and utilizing CodeBuild to pull down this repository, and run the make files. 137 | * Use the `serverless-domain-manager` plug-in to enable domain functionality. Most of this structure is laid out, you just need to provide a valid `ApiHostedZone`, `ApiSite`, and `ApiCert`. This can be created in the AWS Console for Route53 and ACM and provided here as variables. 138 | -------------------------------------------------------------------------------- /backend/src/orders/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | async@^2.6.2: 6 | version "2.6.2" 7 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" 8 | integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== 9 | dependencies: 10 | lodash "^4.17.11" 11 | 12 | aws-sdk@^2.456.0: 13 | version "2.456.0" 14 | resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.456.0.tgz#1d258997bd859de00a931d81b601765edbeae359" 15 | integrity sha512-ySGGBuzDDmZuW1JbjlKHdt04xdB2hFNmas1Vj7Cg4VMGKU12FTcKc3g8M9Le0RLt21egmzyPwrD0HeXH1ipViw== 16 | dependencies: 17 | buffer "4.9.1" 18 | events "1.1.1" 19 | ieee754 "1.1.8" 20 | jmespath "0.15.0" 21 | querystring "0.2.0" 22 | sax "1.2.1" 23 | url "0.10.3" 24 | uuid "3.3.2" 25 | xml2js "0.4.19" 26 | 27 | base64-js@^1.0.2: 28 | version "1.3.0" 29 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" 30 | integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== 31 | 32 | buffer@4.9.1: 33 | version "4.9.1" 34 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" 35 | integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= 36 | dependencies: 37 | base64-js "^1.0.2" 38 | ieee754 "^1.1.4" 39 | isarray "^1.0.0" 40 | 41 | date-format@^2.0.0: 42 | version "2.0.0" 43 | resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.0.0.tgz#7cf7b172f1ec564f0003b39ea302c5498fb98c8f" 44 | integrity sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA== 45 | 46 | debug@^3.2.6: 47 | version "3.2.6" 48 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 49 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 50 | dependencies: 51 | ms "^2.1.1" 52 | 53 | debug@^4.1.1: 54 | version "4.1.1" 55 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 56 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 57 | dependencies: 58 | ms "^2.1.1" 59 | 60 | events@1.1.1: 61 | version "1.1.1" 62 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 63 | integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= 64 | 65 | flatted@^2.0.0: 66 | version "2.0.0" 67 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" 68 | integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== 69 | 70 | fs-extra@^7.0.1: 71 | version "7.0.1" 72 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 73 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 74 | dependencies: 75 | graceful-fs "^4.1.2" 76 | jsonfile "^4.0.0" 77 | universalify "^0.1.0" 78 | 79 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 80 | version "4.1.15" 81 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 82 | integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 83 | 84 | ieee754@1.1.8: 85 | version "1.1.8" 86 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" 87 | integrity sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q= 88 | 89 | ieee754@^1.1.4: 90 | version "1.1.13" 91 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 92 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 93 | 94 | isarray@^1.0.0: 95 | version "1.0.0" 96 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 97 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 98 | 99 | jmespath@0.15.0: 100 | version "0.15.0" 101 | resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" 102 | integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= 103 | 104 | jsonfile@^4.0.0: 105 | version "4.0.0" 106 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 107 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 108 | optionalDependencies: 109 | graceful-fs "^4.1.6" 110 | 111 | lodash@^4.17.11: 112 | version "4.17.11" 113 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 114 | integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== 115 | 116 | log4js@^4.2.0: 117 | version "4.2.0" 118 | resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.2.0.tgz#659a91d9522053b1e1d0ba89adf81c2005b8a993" 119 | integrity sha512-1dJ2ORJcdqbzxvzKM2ceqPBh4O6bbICJpB4dvSEUoMcb14s8MqQ/54zNPqekuN5yjGtxO3GUDTvZfQOQhwdqnA== 120 | dependencies: 121 | date-format "^2.0.0" 122 | debug "^4.1.1" 123 | flatted "^2.0.0" 124 | rfdc "^1.1.2" 125 | streamroller "^1.0.5" 126 | 127 | ms@^2.1.1: 128 | version "2.1.1" 129 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 130 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 131 | 132 | punycode@1.3.2: 133 | version "1.3.2" 134 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 135 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 136 | 137 | querystring@0.2.0: 138 | version "0.2.0" 139 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 140 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 141 | 142 | rfdc@^1.1.2: 143 | version "1.1.4" 144 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" 145 | integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug== 146 | 147 | sax@1.2.1: 148 | version "1.2.1" 149 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" 150 | integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= 151 | 152 | sax@>=0.6.0: 153 | version "1.2.4" 154 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 155 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 156 | 157 | streamroller@^1.0.5: 158 | version "1.0.5" 159 | resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.5.tgz#71660c20b06b1a7b204d46085731ad13c10a562d" 160 | integrity sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw== 161 | dependencies: 162 | async "^2.6.2" 163 | date-format "^2.0.0" 164 | debug "^3.2.6" 165 | fs-extra "^7.0.1" 166 | lodash "^4.17.11" 167 | 168 | universalify@^0.1.0: 169 | version "0.1.2" 170 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 171 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 172 | 173 | url@0.10.3: 174 | version "0.10.3" 175 | resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" 176 | integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= 177 | dependencies: 178 | punycode "1.3.2" 179 | querystring "0.2.0" 180 | 181 | uuid@3.3.2: 182 | version "3.3.2" 183 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 184 | integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 185 | 186 | xml2js@0.4.19: 187 | version "0.4.19" 188 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" 189 | integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== 190 | dependencies: 191 | sax ">=0.6.0" 192 | xmlbuilder "~9.0.1" 193 | 194 | xmlbuilder@~9.0.1: 195 | version "9.0.7" 196 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" 197 | integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= 198 | -------------------------------------------------------------------------------- /article.md: -------------------------------------------------------------------------------- 1 | ## Intro 2 | As more people begin deploying production web applications with Serverless it comes into question how exactly to structure an application repository that has multiple components with Serverless. Imagine you're building an e-commerce website where you expect users to register, and those users can create an order. These front end transactions can be handled in this example. Lets say as part of that order, you have a backend system for fulfillment of the order such as an API request to another system. In this example, when an order is created it will trigger a message sent to a backend function to process the order. 3 | 4 | In this post, I have come armed with a repository help get you started with your Serverless application development. With this example you get two DynamoDB tables representing a place to store your application's data, an API Gateway that you can hook into a front end, or back end process to interface with your application and 3 separate endpoint Lambda functions, a SQS queue to simulate a message being sent to the acting backend, and the backend which is one Lambda function that is triggered from the previously mentioned SQS queue. 5 | 6 | As well as demonstrating a functioning example, this will also go over some __best practices__ for using multiple environments, custom variables per environment, how to package functions individually, how to use IAM roles per function individually, import yaml template fragments, and exporting API Gateway RestApiId to use in other `serverless.yml` files. 7 | 8 | As well as getting you started with an application template, this design will also help you circumvent around a the well known 200 resource limit with AWS Cloudformation. ***Link to 200 limit article here*** 9 | 10 | Another benefit of this design is you are able to deploy your API endpoints separately from your backend infrastructure, while still having them loosely dependent on each other. Not only can you deploy the infrastructure together, but you can decouple the infrastructure and deploy individual API endpoints for development and deployment agility. 11 | 12 | ## Getting Started 13 | To get started you'll need your environment configured with AWS credentials. 14 | Next, lets pull down the example repository and jump into it: 15 | ``` 16 | git clone https://github.com/trilom/sls-microservice.git 17 | cd sls-microservice/backend 18 | ``` 19 | 20 | ## How to use `make buildAll` and `make deployAll` 21 | Getting started is simple, after cloning the repository all you need to do is build the project with `make buildAll` and then deploy the project with `make deployAll`. `make buildAll` will run `yarn install` in the `./backend` directory, then it will look at each directory in the `./backend/src` directory and run `yarn install` for each, then it will run `make buildAll` from the `./api` directory. This will look at each directory in the `./api/src` directory and run `yarn install` for each. `make deployAll` will run `serverless deploy --stage dev` in the `./backend` directory and then it will run `make deployAll --STAGE='dev'` from the `./api` directory. This will look at each directory in the `./api/src` directory and run `serverless deploy --stage dev` for each. 22 | 23 | ## What does this build 24 | ![api diagram](https://github.com/trilom/sls-microservice/blob/master/sls-microservice.jpg "API Diagram") 25 | This will define an example Serverless infrastructure stack containing: 26 | 1. an API Gateway 27 | The API has 6 endpoints. One to create a user, one to get a user information, one to get a list of users, one to get a list of orders for a user, one to get order information for that user, and one to create an order. 28 | 2. two DynamoDB tables 29 | One is the user table and one is the order table. 30 | 3. a SQS queue 31 | An SQS queue that looks out for orders and moves them to fulfillment. 32 | 4. one backend lambda function, and three api lambda functions 33 | The backend function will look for messages in the Order queue, then move them to fulfillment. 34 | The API functions are split into 3 endpoints where you can implement different packages scope. 35 | 36 | ## Dev Environment 37 | One benefit that Serverless has out of the box is support for multiple stages. This example takes advantage of using multiple stages in order to define __custom stage variables__. In the `./backend/serverless.yml` you can see the following: 38 | ```yaml 39 | custom: 40 | prod: 41 | Stack: ExampleSite 42 | LogLevel: info 43 | OrdersTableRCU: 1 44 | OrdersTableWCU: 1 45 | UsersTableRCU: 1 46 | UsersTableWCU: 1 47 | dev: 48 | Stack: ExampleSite 49 | LogLevel: debug 50 | OrdersTableRCU: 1 51 | OrdersTableWCU: 1 52 | UsersTableRCU: 1 53 | UsersTableWCU: 1 54 | ``` 55 | This allows us to define specific parameters for different environments of our site. In our example, we are setting a specific logging level, as well as specifically defining our table capacity. 56 | To utilize this feature, lets take a look at the `provider` section: 57 | ```yaml 58 | provider: 59 | name: aws 60 | runtime: nodejs10.x 61 | memorySize: 128 62 | timeout: 10 63 | region: us-east-1 64 | stage: ${opt:stage, 'dev'} 65 | logRetentionInDays: 14 66 | environment: 67 | logLevel: ${self:custom.${self:provider.stage}.LogLevel} 68 | ``` 69 | Here we are taking in the option `stage` from the command line, and setting the default to `dev` with the `stage` parameter. In the _environment.logLevel_ parameter, we are importing a __custom stage variable__ from our defined variables previously. 70 | 71 | ## Package functions individually and reducing dependencies 72 | Dependencies are something that might be challenging to manage. I like to keep my functions below [_3 MB_ whenever possible](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) to preserve console editing ability. Some tools I use to accomplish this include packaging my functions individually, and using `serverless-plugin-reducer` to ensure I'm not uploading unnecessary dependencies. This plugin will look at your `requires` from your code, and resolve dependencies from that and ensure only _lambda_ dependencies get packaged. Using this plugin is simple, first include it in your plugin, and ensure package individually is set to true: 73 | ```yaml 74 | package: 75 | individually: true 76 | 77 | plugins: 78 | - serverless-plugin-reducer 79 | ``` 80 | 81 | ## Use IAM Roles individually w/ serverless-iam-roles-per-function 82 | Serverless by default allows you to specify an iam role per `serverless.yml`, we are using the `serverless-iam-roles-per-function` plugin to add the _functions.iamRoleStatements_ parameter. With this we are able to define specific iam statements per function giving you precise security controls. 83 | ```yaml 84 | functions: 85 | Orders: 86 | handler: src/orders/index.handler 87 | iamRoleStatements: 88 | - Effect: Allow 89 | Action: 90 | - dynamodb:UpdateItem 91 | Resource: 92 | - arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/${self:custom.${self:provider.stage}.Stack}-Orders-${self:provider.stage} 93 | - Effect: Allow 94 | Action: 95 | - sqs:ReceiveMessage 96 | - sqs:DeleteMessage 97 | - sqs:GetQueueAttributes 98 | Resource: 99 | - arn:aws:sqs:#{AWS::Region}:#{AWS::AccountId}:${self:custom.${self:provider.stage}.Stack}-OrdersQueue-${self:provider.stage} 100 | plugins: 101 | - serverless-plugin-reducer 102 | ``` 103 | 104 | ## Export API Gateway RestApi 105 | In Serverless, when you define a function with a http event this will create an API Gateway. In this example our `./backend/serverless.yml` defines a `root` endpoint, this endpoint is a simple health check. We then export this API Gateway's _RestApiId_ and _RootResourceId_ in order to reuse in our separate API Gateway endpoints defined in `./api/src`. 106 | 1. To demonstrate, in our `./backend/serverless.yml` we export _RestApiId_ and _RootResourceId_. 107 | ```yaml 108 | resources: 109 | ... 110 | - Outputs: 111 | ApiGWRestApiId: 112 | Value: 113 | Ref: ApiGatewayRestApi 114 | Export: 115 | Name: ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 116 | ApiGWRootResourceId: 117 | Value: 118 | Fn::GetAtt: 119 | - ApiGatewayRestApi 120 | - RootResourceId 121 | Export: 122 | Name: ${self:custom.${self:provider.stage}.Stack}-rootResourceId-${self:provider.stage} 123 | ``` 124 | 2. We then import these __export variables__ into for example `./api/src/order/serverless.yml` into _provider.apiGateway_. 125 | ```yaml 126 | provider: 127 | ... 128 | apiGateway: 129 | restApiId: 130 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 131 | restApiRootResourceId: 132 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-rootResourceId-${self:provider.stage} 133 | ... 134 | ``` 135 | This will tell the API Gateway what _RestApiId_ to use, and what the _RootResourceId_ is so that it can build child endpoints from the Root Resource. 136 | 3. When you are nesting a route within a route, you will need to export the parent route's _ResourceId_. For example, in `./api/src/user/serverless.yml` we export the parent _ResourceId_ that our nested endpoint of `/user/{userid}/order` will use, which is `/user/{userid}`. 137 | ```yaml 138 | resources: 139 | Outputs: 140 | ApiRootUserUseridVar: 141 | Value: 142 | Ref: ApiGatewayResourceUserUseridVar 143 | Export: 144 | Name: ${self:custom.${self:provider.stage}.Stack}-ApiRootUserUseridVar-${self:provider.stage} 145 | ``` 146 | 4. And import the _ResourceId_ into the child route defined in `./api/src/user/order/serverless.yml` as a _provider.apiGateway.restApiResources_ parameter for the route. 147 | ```yaml 148 | provider: 149 | ... 150 | apiGateway: 151 | restApiId: 152 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-restApiId-${self:provider.stage} 153 | restApiResources: 154 | /user/{userid}: 155 | 'Fn::ImportValue': ${self:custom.${self:provider.stage}.Stack}-ApiRootUserUseridVar-${self:provider.stage} 156 | ``` 157 | 158 | ## Reference pseudo parameters w/ serverless-pseudo-parameters 159 | When implementing iam best practices, you need to specify specific __Resource__ statements and this often requires utilizing [Cloudformation Psuedo Parameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html) to reference _AccountId_ or _Region_. Using the plugin `serverless-pseudo-parameters` you are able to use Cloudformation pseudo parameters nearly the same as you would in Cloudformation. Consider the following example: 160 | ```yaml 161 | - Effect: Allow 162 | Action: 163 | - dynamodb:Query 164 | Resource: 165 | - arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/${self:custom.${self:provider.stage}.Stack}-Orders-${self:provider.stage} 166 | ``` 167 | Here we are defining a DynamoDB table and specifying the _Region_ and _AccountId_ using `#{AWS::Region}` and `#{AWS::AccountId}` respectively. 168 | 169 | ## What to do from here? 170 | * In more complicated examples you would be able to use AWS Cognito in the `/user` endpoint to set up authentication. This endpoint would be scoped for user functions around Cognito and will likely have similar imports. 171 | * You could also import Stripe in a `/billing` endpoint to facilitate collection of payment information. 172 | * Within the `/orders` endpoint, you can set up your DynamoDB queries for managing your order collection. 173 | * You could set up CI/CD simply by adding a CodePipeline resource, and utilizing CodeBuild to pull down this repository, and run the make files. 174 | * Use the `serverless-domain-manager` plug-in to enable domain functionality. Most of this structure is laid out, you just need to provide a valid `ApiHostedZone`, `ApiSite`, and `ApiCert`. This can be created in the AWS Console for Route53 and ACM and provided here as variables. 175 | -------------------------------------------------------------------------------- /backend/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@mrmlnc/readdir-enhanced@^2.2.1": 6 | version "2.2.1" 7 | resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" 8 | integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== 9 | dependencies: 10 | call-me-maybe "^1.0.1" 11 | glob-to-regexp "^0.3.0" 12 | 13 | "@nodelib/fs.stat@^1.1.2": 14 | version "1.1.3" 15 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" 16 | integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== 17 | 18 | "@types/events@*": 19 | version "3.0.0" 20 | resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" 21 | integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== 22 | 23 | "@types/glob@^7.1.1": 24 | version "7.1.1" 25 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" 26 | integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== 27 | dependencies: 28 | "@types/events" "*" 29 | "@types/minimatch" "*" 30 | "@types/node" "*" 31 | 32 | "@types/minimatch@*": 33 | version "3.0.3" 34 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" 35 | integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== 36 | 37 | "@types/node@*": 38 | version "12.0.2" 39 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.2.tgz#3452a24edf9fea138b48fad4a0a028a683da1e40" 40 | integrity sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA== 41 | 42 | agent-base@^4.1.0: 43 | version "4.2.1" 44 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" 45 | integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== 46 | dependencies: 47 | es6-promisify "^5.0.0" 48 | 49 | ansi-align@^2.0.0: 50 | version "2.0.0" 51 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" 52 | integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= 53 | dependencies: 54 | string-width "^2.0.0" 55 | 56 | ansi-escapes@^1.1.0: 57 | version "1.4.0" 58 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 59 | integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= 60 | 61 | ansi-regex@^2.0.0: 62 | version "2.1.1" 63 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 64 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 65 | 66 | ansi-regex@^3.0.0: 67 | version "3.0.0" 68 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 69 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 70 | 71 | ansi-styles@^2.2.1: 72 | version "2.2.1" 73 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 74 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 75 | 76 | ansi-styles@^3.2.1: 77 | version "3.2.1" 78 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 79 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 80 | dependencies: 81 | color-convert "^1.9.0" 82 | 83 | ansi@^0.3.0, ansi@~0.3.1: 84 | version "0.3.1" 85 | resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" 86 | integrity sha1-DELU+xcWDVqa8eSEus4cZpIsGyE= 87 | 88 | archiver-utils@^1.3.0: 89 | version "1.3.0" 90 | resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" 91 | integrity sha1-5QtMCccL89aA4y/xt5lOn52JUXQ= 92 | dependencies: 93 | glob "^7.0.0" 94 | graceful-fs "^4.1.0" 95 | lazystream "^1.0.0" 96 | lodash "^4.8.0" 97 | normalize-path "^2.0.0" 98 | readable-stream "^2.0.0" 99 | 100 | archiver@^1.1.0: 101 | version "1.3.0" 102 | resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22" 103 | integrity sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI= 104 | dependencies: 105 | archiver-utils "^1.3.0" 106 | async "^2.0.0" 107 | buffer-crc32 "^0.2.1" 108 | glob "^7.0.0" 109 | lodash "^4.8.0" 110 | readable-stream "^2.0.0" 111 | tar-stream "^1.5.0" 112 | walkdir "^0.0.11" 113 | zip-stream "^1.1.0" 114 | 115 | are-we-there-yet@~1.1.2: 116 | version "1.1.5" 117 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 118 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 119 | dependencies: 120 | delegates "^1.0.0" 121 | readable-stream "^2.0.6" 122 | 123 | argparse@^1.0.7: 124 | version "1.0.10" 125 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 126 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 127 | dependencies: 128 | sprintf-js "~1.0.2" 129 | 130 | arr-diff@^4.0.0: 131 | version "4.0.0" 132 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 133 | integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 134 | 135 | arr-flatten@^1.1.0: 136 | version "1.1.0" 137 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 138 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 139 | 140 | arr-union@^3.1.0: 141 | version "3.1.0" 142 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 143 | integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 144 | 145 | array-differ@^2.0.3: 146 | version "2.1.0" 147 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" 148 | integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w== 149 | 150 | array-union@^1.0.1, array-union@^1.0.2: 151 | version "1.0.2" 152 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 153 | integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= 154 | dependencies: 155 | array-uniq "^1.0.1" 156 | 157 | array-uniq@^1.0.1: 158 | version "1.0.3" 159 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 160 | integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= 161 | 162 | array-unique@^0.3.2: 163 | version "0.3.2" 164 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 165 | integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 166 | 167 | arrify@^1.0.1: 168 | version "1.0.1" 169 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 170 | integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= 171 | 172 | assign-symbols@^1.0.0: 173 | version "1.0.0" 174 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 175 | integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 176 | 177 | async@^1.5.2: 178 | version "1.5.2" 179 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 180 | integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= 181 | 182 | async@^2.0.0: 183 | version "2.6.2" 184 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" 185 | integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== 186 | dependencies: 187 | lodash "^4.17.11" 188 | 189 | asynckit@^0.4.0: 190 | version "0.4.0" 191 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 192 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 193 | 194 | atob@^2.1.1: 195 | version "2.1.2" 196 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 197 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 198 | 199 | aws-sdk@^2.430.0: 200 | version "2.456.0" 201 | resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.456.0.tgz#1d258997bd859de00a931d81b601765edbeae359" 202 | integrity sha512-ySGGBuzDDmZuW1JbjlKHdt04xdB2hFNmas1Vj7Cg4VMGKU12FTcKc3g8M9Le0RLt21egmzyPwrD0HeXH1ipViw== 203 | dependencies: 204 | buffer "4.9.1" 205 | events "1.1.1" 206 | ieee754 "1.1.8" 207 | jmespath "0.15.0" 208 | querystring "0.2.0" 209 | sax "1.2.1" 210 | url "0.10.3" 211 | uuid "3.3.2" 212 | xml2js "0.4.19" 213 | 214 | balanced-match@^1.0.0: 215 | version "1.0.0" 216 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 217 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 218 | 219 | base64-js@^1.0.2: 220 | version "1.3.0" 221 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" 222 | integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== 223 | 224 | base@^0.11.1: 225 | version "0.11.2" 226 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 227 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 228 | dependencies: 229 | cache-base "^1.0.1" 230 | class-utils "^0.3.5" 231 | component-emitter "^1.2.1" 232 | define-property "^1.0.0" 233 | isobject "^3.0.1" 234 | mixin-deep "^1.2.0" 235 | pascalcase "^0.1.1" 236 | 237 | bl@^1.0.0: 238 | version "1.2.2" 239 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" 240 | integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== 241 | dependencies: 242 | readable-stream "^2.3.5" 243 | safe-buffer "^5.1.1" 244 | 245 | bluebird@^3.5.0, bluebird@^3.5.4: 246 | version "3.5.4" 247 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" 248 | integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== 249 | 250 | boxen@^1.2.1: 251 | version "1.3.0" 252 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" 253 | integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== 254 | dependencies: 255 | ansi-align "^2.0.0" 256 | camelcase "^4.0.0" 257 | chalk "^2.0.1" 258 | cli-boxes "^1.0.0" 259 | string-width "^2.0.0" 260 | term-size "^1.2.0" 261 | widest-line "^2.0.0" 262 | 263 | brace-expansion@^1.1.7: 264 | version "1.1.11" 265 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 266 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 267 | dependencies: 268 | balanced-match "^1.0.0" 269 | concat-map "0.0.1" 270 | 271 | braces@^2.3.1: 272 | version "2.3.2" 273 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 274 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 275 | dependencies: 276 | arr-flatten "^1.1.0" 277 | array-unique "^0.3.2" 278 | extend-shallow "^2.0.1" 279 | fill-range "^4.0.0" 280 | isobject "^3.0.1" 281 | repeat-element "^1.1.2" 282 | snapdragon "^0.8.1" 283 | snapdragon-node "^2.0.1" 284 | split-string "^3.0.2" 285 | to-regex "^3.0.1" 286 | 287 | buffer-alloc-unsafe@^1.1.0: 288 | version "1.1.0" 289 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 290 | integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== 291 | 292 | buffer-alloc@^1.2.0: 293 | version "1.2.0" 294 | resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 295 | integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== 296 | dependencies: 297 | buffer-alloc-unsafe "^1.1.0" 298 | buffer-fill "^1.0.0" 299 | 300 | buffer-crc32@^0.2.1, buffer-crc32@~0.2.3: 301 | version "0.2.13" 302 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 303 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 304 | 305 | buffer-fill@^1.0.0: 306 | version "1.0.0" 307 | resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 308 | integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= 309 | 310 | buffer-from@^1.0.0: 311 | version "1.1.1" 312 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 313 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 314 | 315 | buffer@4.9.1: 316 | version "4.9.1" 317 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" 318 | integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= 319 | dependencies: 320 | base64-js "^1.0.2" 321 | ieee754 "^1.1.4" 322 | isarray "^1.0.0" 323 | 324 | buffer@^5.1.0, buffer@^5.2.1: 325 | version "5.2.1" 326 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" 327 | integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== 328 | dependencies: 329 | base64-js "^1.0.2" 330 | ieee754 "^1.1.4" 331 | 332 | builtin-modules@^3.1.0: 333 | version "3.1.0" 334 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" 335 | integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== 336 | 337 | cache-base@^1.0.1: 338 | version "1.0.1" 339 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 340 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 341 | dependencies: 342 | collection-visit "^1.0.0" 343 | component-emitter "^1.2.1" 344 | get-value "^2.0.6" 345 | has-value "^1.0.0" 346 | isobject "^3.0.1" 347 | set-value "^2.0.0" 348 | to-object-path "^0.3.0" 349 | union-value "^1.0.0" 350 | unset-value "^1.0.0" 351 | 352 | cachedir@^2.2.0: 353 | version "2.2.0" 354 | resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.2.0.tgz#19afa4305e05d79e417566882e0c8f960f62ff0e" 355 | integrity sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ== 356 | 357 | call-me-maybe@^1.0.1: 358 | version "1.0.1" 359 | resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" 360 | integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= 361 | 362 | camelcase@^4.0.0: 363 | version "4.1.0" 364 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 365 | integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 366 | 367 | capture-stack-trace@^1.0.0: 368 | version "1.0.1" 369 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" 370 | integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== 371 | 372 | caw@^2.0.0: 373 | version "2.0.1" 374 | resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" 375 | integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA== 376 | dependencies: 377 | get-proxy "^2.0.0" 378 | isurl "^1.0.0-alpha5" 379 | tunnel-agent "^0.6.0" 380 | url-to-options "^1.0.1" 381 | 382 | chalk@^1.0.0: 383 | version "1.1.3" 384 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 385 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 386 | dependencies: 387 | ansi-styles "^2.2.1" 388 | escape-string-regexp "^1.0.2" 389 | has-ansi "^2.0.0" 390 | strip-ansi "^3.0.0" 391 | supports-color "^2.0.0" 392 | 393 | chalk@^2.0.0, chalk@^2.0.1: 394 | version "2.4.2" 395 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 396 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 397 | dependencies: 398 | ansi-styles "^3.2.1" 399 | escape-string-regexp "^1.0.5" 400 | supports-color "^5.3.0" 401 | 402 | ci-info@^1.1.1, ci-info@^1.5.0: 403 | version "1.6.0" 404 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" 405 | integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== 406 | 407 | class-utils@^0.3.5: 408 | version "0.3.6" 409 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 410 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 411 | dependencies: 412 | arr-union "^3.1.0" 413 | define-property "^0.2.5" 414 | isobject "^3.0.0" 415 | static-extend "^0.1.1" 416 | 417 | cli-boxes@^1.0.0: 418 | version "1.0.0" 419 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 420 | integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= 421 | 422 | cli-cursor@^1.0.1: 423 | version "1.0.2" 424 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 425 | integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= 426 | dependencies: 427 | restore-cursor "^1.0.1" 428 | 429 | cli-width@^2.0.0: 430 | version "2.2.0" 431 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 432 | integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= 433 | 434 | code-point-at@^1.0.0: 435 | version "1.1.0" 436 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 437 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 438 | 439 | collection-visit@^1.0.0: 440 | version "1.0.0" 441 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 442 | integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 443 | dependencies: 444 | map-visit "^1.0.0" 445 | object-visit "^1.0.0" 446 | 447 | color-convert@^1.9.0: 448 | version "1.9.3" 449 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 450 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 451 | dependencies: 452 | color-name "1.1.3" 453 | 454 | color-name@1.1.3: 455 | version "1.1.3" 456 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 457 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 458 | 459 | combined-stream@^1.0.6: 460 | version "1.0.8" 461 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 462 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 463 | dependencies: 464 | delayed-stream "~1.0.0" 465 | 466 | commander@^2.9.0: 467 | version "2.20.0" 468 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" 469 | integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== 470 | 471 | commander@~2.8.1: 472 | version "2.8.1" 473 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" 474 | integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= 475 | dependencies: 476 | graceful-readlink ">= 1.0.0" 477 | 478 | component-emitter@^1.2.0, component-emitter@^1.2.1: 479 | version "1.3.0" 480 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 481 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 482 | 483 | compress-commons@^1.2.0: 484 | version "1.2.2" 485 | resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" 486 | integrity sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8= 487 | dependencies: 488 | buffer-crc32 "^0.2.1" 489 | crc32-stream "^2.0.0" 490 | normalize-path "^2.0.0" 491 | readable-stream "^2.0.0" 492 | 493 | concat-map@0.0.1: 494 | version "0.0.1" 495 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 496 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 497 | 498 | concat-stream@^1.4.7: 499 | version "1.6.2" 500 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 501 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 502 | dependencies: 503 | buffer-from "^1.0.0" 504 | inherits "^2.0.3" 505 | readable-stream "^2.2.2" 506 | typedarray "^0.0.6" 507 | 508 | config-chain@^1.1.11: 509 | version "1.1.12" 510 | resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" 511 | integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== 512 | dependencies: 513 | ini "^1.3.4" 514 | proto-list "~1.2.1" 515 | 516 | configstore@^3.0.0: 517 | version "3.1.2" 518 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" 519 | integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== 520 | dependencies: 521 | dot-prop "^4.1.0" 522 | graceful-fs "^4.1.2" 523 | make-dir "^1.0.0" 524 | unique-string "^1.0.0" 525 | write-file-atomic "^2.0.0" 526 | xdg-basedir "^3.0.0" 527 | 528 | cookie@0.3.1: 529 | version "0.3.1" 530 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 531 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 532 | 533 | cookiejar@^2.1.0: 534 | version "2.1.2" 535 | resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" 536 | integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== 537 | 538 | copy-descriptor@^0.1.0: 539 | version "0.1.1" 540 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 541 | integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 542 | 543 | core-util-is@~1.0.0: 544 | version "1.0.2" 545 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 546 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 547 | 548 | crc32-stream@^2.0.0: 549 | version "2.0.0" 550 | resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" 551 | integrity sha1-483TtN8xaN10494/u8t7KX/pCPQ= 552 | dependencies: 553 | crc "^3.4.4" 554 | readable-stream "^2.0.0" 555 | 556 | crc@^3.4.4: 557 | version "3.8.0" 558 | resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" 559 | integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== 560 | dependencies: 561 | buffer "^5.1.0" 562 | 563 | create-error-class@^3.0.0: 564 | version "3.0.2" 565 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 566 | integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= 567 | dependencies: 568 | capture-stack-trace "^1.0.0" 569 | 570 | cross-spawn@^5.0.1: 571 | version "5.1.0" 572 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 573 | integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 574 | dependencies: 575 | lru-cache "^4.0.1" 576 | shebang-command "^1.2.0" 577 | which "^1.2.9" 578 | 579 | crypto-random-string@^1.0.0: 580 | version "1.0.0" 581 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 582 | integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= 583 | 584 | d@1: 585 | version "1.0.0" 586 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" 587 | integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= 588 | dependencies: 589 | es5-ext "^0.10.9" 590 | 591 | debug@^2.2.0, debug@^2.3.3: 592 | version "2.6.9" 593 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 594 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 595 | dependencies: 596 | ms "2.0.0" 597 | 598 | debug@^3.1.0: 599 | version "3.2.6" 600 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 601 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 602 | dependencies: 603 | ms "^2.1.1" 604 | 605 | decode-uri-component@^0.2.0: 606 | version "0.2.0" 607 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 608 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 609 | 610 | decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: 611 | version "4.1.1" 612 | resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" 613 | integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== 614 | dependencies: 615 | file-type "^5.2.0" 616 | is-stream "^1.1.0" 617 | tar-stream "^1.5.2" 618 | 619 | decompress-tarbz2@^4.0.0: 620 | version "4.1.1" 621 | resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" 622 | integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== 623 | dependencies: 624 | decompress-tar "^4.1.0" 625 | file-type "^6.1.0" 626 | is-stream "^1.1.0" 627 | seek-bzip "^1.0.5" 628 | unbzip2-stream "^1.0.9" 629 | 630 | decompress-targz@^4.0.0: 631 | version "4.1.1" 632 | resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" 633 | integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== 634 | dependencies: 635 | decompress-tar "^4.1.1" 636 | file-type "^5.2.0" 637 | is-stream "^1.1.0" 638 | 639 | decompress-unzip@^4.0.1: 640 | version "4.0.1" 641 | resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" 642 | integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= 643 | dependencies: 644 | file-type "^3.8.0" 645 | get-stream "^2.2.0" 646 | pify "^2.3.0" 647 | yauzl "^2.4.2" 648 | 649 | decompress@^4.0.0: 650 | version "4.2.0" 651 | resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" 652 | integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50= 653 | dependencies: 654 | decompress-tar "^4.0.0" 655 | decompress-tarbz2 "^4.0.0" 656 | decompress-targz "^4.0.0" 657 | decompress-unzip "^4.0.1" 658 | graceful-fs "^4.1.10" 659 | make-dir "^1.0.0" 660 | pify "^2.3.0" 661 | strip-dirs "^2.0.0" 662 | 663 | deep-extend@^0.6.0: 664 | version "0.6.0" 665 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 666 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 667 | 668 | deferred@^0.7.10: 669 | version "0.7.10" 670 | resolved "https://registry.yarnpkg.com/deferred/-/deferred-0.7.10.tgz#c87efaddb3132e3432e8f448315d827889cc80c4" 671 | integrity sha512-y7Q77jyKFN8YL1W52ubnNInz7BZqJoIR1BpSj4lP15wMrd2YdLK/F2yIzQgDOOdfqD6UFMdQJVu73i1kfQT6Mw== 672 | dependencies: 673 | d "1" 674 | es5-ext "~0.10.37" 675 | event-emitter "~0.3.5" 676 | next-tick "1" 677 | timers-ext "~0.1.2" 678 | 679 | define-property@^0.2.5: 680 | version "0.2.5" 681 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 682 | integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 683 | dependencies: 684 | is-descriptor "^0.1.0" 685 | 686 | define-property@^1.0.0: 687 | version "1.0.0" 688 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 689 | integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 690 | dependencies: 691 | is-descriptor "^1.0.0" 692 | 693 | define-property@^2.0.2: 694 | version "2.0.2" 695 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 696 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 697 | dependencies: 698 | is-descriptor "^1.0.2" 699 | isobject "^3.0.1" 700 | 701 | delayed-stream@~1.0.0: 702 | version "1.0.0" 703 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 704 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 705 | 706 | delegates@^1.0.0: 707 | version "1.0.0" 708 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 709 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 710 | 711 | dir-glob@^2.2.2: 712 | version "2.2.2" 713 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" 714 | integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== 715 | dependencies: 716 | path-type "^3.0.0" 717 | 718 | dot-prop@^4.1.0: 719 | version "4.2.0" 720 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" 721 | integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== 722 | dependencies: 723 | is-obj "^1.0.0" 724 | 725 | download@^5.0.2: 726 | version "5.0.3" 727 | resolved "https://registry.yarnpkg.com/download/-/download-5.0.3.tgz#63537f977f99266a30eb8a2a2fbd1f20b8000f7a" 728 | integrity sha1-Y1N/l3+ZJmow64oqL70fILgAD3o= 729 | dependencies: 730 | caw "^2.0.0" 731 | decompress "^4.0.0" 732 | filenamify "^2.0.0" 733 | get-stream "^3.0.0" 734 | got "^6.3.0" 735 | mkdirp "^0.5.1" 736 | pify "^2.3.0" 737 | 738 | duplexer3@^0.1.4: 739 | version "0.1.4" 740 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 741 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 742 | 743 | encoding@^0.1.11: 744 | version "0.1.12" 745 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 746 | integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= 747 | dependencies: 748 | iconv-lite "~0.4.13" 749 | 750 | end-of-stream@^1.0.0: 751 | version "1.4.1" 752 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 753 | integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 754 | dependencies: 755 | once "^1.4.0" 756 | 757 | es5-ext@^0.10.12, es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.49, es5-ext@^0.10.50, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.37, es5-ext@~0.10.46: 758 | version "0.10.50" 759 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" 760 | integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== 761 | dependencies: 762 | es6-iterator "~2.0.3" 763 | es6-symbol "~3.1.1" 764 | next-tick "^1.0.0" 765 | 766 | es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: 767 | version "2.0.3" 768 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" 769 | integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= 770 | dependencies: 771 | d "1" 772 | es5-ext "^0.10.35" 773 | es6-symbol "^3.1.1" 774 | 775 | es6-promise@^4.0.3: 776 | version "4.2.6" 777 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" 778 | integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== 779 | 780 | es6-promisify@^5.0.0: 781 | version "5.0.0" 782 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 783 | integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= 784 | dependencies: 785 | es6-promise "^4.0.3" 786 | 787 | es6-set@^0.1.5: 788 | version "0.1.5" 789 | resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" 790 | integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= 791 | dependencies: 792 | d "1" 793 | es5-ext "~0.10.14" 794 | es6-iterator "~2.0.1" 795 | es6-symbol "3.1.1" 796 | event-emitter "~0.3.5" 797 | 798 | es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: 799 | version "3.1.1" 800 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" 801 | integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= 802 | dependencies: 803 | d "1" 804 | es5-ext "~0.10.14" 805 | 806 | es6-weak-map@^2.0.2: 807 | version "2.0.2" 808 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" 809 | integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= 810 | dependencies: 811 | d "1" 812 | es5-ext "^0.10.14" 813 | es6-iterator "^2.0.1" 814 | es6-symbol "^3.1.1" 815 | 816 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 817 | version "1.0.5" 818 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 819 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 820 | 821 | esniff@^1.1.0: 822 | version "1.1.0" 823 | resolved "https://registry.yarnpkg.com/esniff/-/esniff-1.1.0.tgz#c66849229f91464dede2e0d40201ed6abf65f2ac" 824 | integrity sha1-xmhJIp+RRk3t4uDUAgHtar9l8qw= 825 | dependencies: 826 | d "1" 827 | es5-ext "^0.10.12" 828 | 829 | esprima@^4.0.0: 830 | version "4.0.1" 831 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 832 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 833 | 834 | event-emitter@^0.3.5, event-emitter@~0.3.5: 835 | version "0.3.5" 836 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" 837 | integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= 838 | dependencies: 839 | d "1" 840 | es5-ext "~0.10.14" 841 | 842 | events@1.1.1: 843 | version "1.1.1" 844 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 845 | integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= 846 | 847 | execa@^0.7.0: 848 | version "0.7.0" 849 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 850 | integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= 851 | dependencies: 852 | cross-spawn "^5.0.1" 853 | get-stream "^3.0.0" 854 | is-stream "^1.1.0" 855 | npm-run-path "^2.0.0" 856 | p-finally "^1.0.0" 857 | signal-exit "^3.0.0" 858 | strip-eof "^1.0.0" 859 | 860 | exit-hook@^1.0.0: 861 | version "1.1.1" 862 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 863 | integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= 864 | 865 | expand-brackets@^2.1.4: 866 | version "2.1.4" 867 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 868 | integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 869 | dependencies: 870 | debug "^2.3.3" 871 | define-property "^0.2.5" 872 | extend-shallow "^2.0.1" 873 | posix-character-classes "^0.1.0" 874 | regex-not "^1.0.0" 875 | snapdragon "^0.8.1" 876 | to-regex "^3.0.1" 877 | 878 | extend-shallow@^2.0.1: 879 | version "2.0.1" 880 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 881 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 882 | dependencies: 883 | is-extendable "^0.1.0" 884 | 885 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 886 | version "3.0.2" 887 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 888 | integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 889 | dependencies: 890 | assign-symbols "^1.0.0" 891 | is-extendable "^1.0.1" 892 | 893 | extend@^3.0.0: 894 | version "3.0.2" 895 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 896 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 897 | 898 | external-editor@^1.1.0: 899 | version "1.1.1" 900 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" 901 | integrity sha1-Etew24UPf/fnCBuvQAVwAGDEYAs= 902 | dependencies: 903 | extend "^3.0.0" 904 | spawn-sync "^1.0.15" 905 | tmp "^0.0.29" 906 | 907 | extglob@^2.0.4: 908 | version "2.0.4" 909 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 910 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 911 | dependencies: 912 | array-unique "^0.3.2" 913 | define-property "^1.0.0" 914 | expand-brackets "^2.1.4" 915 | extend-shallow "^2.0.1" 916 | fragment-cache "^0.2.1" 917 | regex-not "^1.0.0" 918 | snapdragon "^0.8.1" 919 | to-regex "^3.0.1" 920 | 921 | fast-glob@^2.2.6: 922 | version "2.2.6" 923 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" 924 | integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== 925 | dependencies: 926 | "@mrmlnc/readdir-enhanced" "^2.2.1" 927 | "@nodelib/fs.stat" "^1.1.2" 928 | glob-parent "^3.1.0" 929 | is-glob "^4.0.0" 930 | merge2 "^1.2.3" 931 | micromatch "^3.1.10" 932 | 933 | fast-levenshtein@^2.0.6: 934 | version "2.0.6" 935 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 936 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 937 | 938 | fd-slicer@~1.1.0: 939 | version "1.1.0" 940 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 941 | integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= 942 | dependencies: 943 | pend "~1.2.0" 944 | 945 | figures@^1.3.5: 946 | version "1.7.0" 947 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 948 | integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= 949 | dependencies: 950 | escape-string-regexp "^1.0.5" 951 | object-assign "^4.1.0" 952 | 953 | file-type@^3.8.0: 954 | version "3.9.0" 955 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" 956 | integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= 957 | 958 | file-type@^5.2.0: 959 | version "5.2.0" 960 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" 961 | integrity sha1-LdvqfHP/42No365J3DOMBYwritY= 962 | 963 | file-type@^6.1.0: 964 | version "6.2.0" 965 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" 966 | integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== 967 | 968 | filename-reserved-regex@^2.0.0: 969 | version "2.0.0" 970 | resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" 971 | integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= 972 | 973 | filenamify@^2.0.0: 974 | version "2.1.0" 975 | resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" 976 | integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA== 977 | dependencies: 978 | filename-reserved-regex "^2.0.0" 979 | strip-outer "^1.0.0" 980 | trim-repeated "^1.0.0" 981 | 982 | filesize@^3.3.0: 983 | version "3.6.1" 984 | resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" 985 | integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== 986 | 987 | fill-range@^4.0.0: 988 | version "4.0.0" 989 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 990 | integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 991 | dependencies: 992 | extend-shallow "^2.0.1" 993 | is-number "^3.0.0" 994 | repeat-string "^1.6.1" 995 | to-regex-range "^2.1.0" 996 | 997 | find-requires@^1.0.0: 998 | version "1.0.0" 999 | resolved "https://registry.yarnpkg.com/find-requires/-/find-requires-1.0.0.tgz#a4a750ed37133dee8a9cc8efd2cc56aca01dd96d" 1000 | integrity sha512-UME7hNwBfzeISSFQcBEDemEEskpOjI/shPrpJM5PI4DSdn6hX0dmz+2dL70blZER2z8tSnTRL+2rfzlYgtbBoQ== 1001 | dependencies: 1002 | es5-ext "^0.10.49" 1003 | esniff "^1.1.0" 1004 | 1005 | for-in@^1.0.2: 1006 | version "1.0.2" 1007 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 1008 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 1009 | 1010 | form-data@^2.3.1: 1011 | version "2.3.3" 1012 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 1013 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 1014 | dependencies: 1015 | asynckit "^0.4.0" 1016 | combined-stream "^1.0.6" 1017 | mime-types "^2.1.12" 1018 | 1019 | formidable@^1.2.0: 1020 | version "1.2.1" 1021 | resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" 1022 | integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== 1023 | 1024 | fragment-cache@^0.2.1: 1025 | version "0.2.1" 1026 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 1027 | integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 1028 | dependencies: 1029 | map-cache "^0.2.2" 1030 | 1031 | fs-constants@^1.0.0: 1032 | version "1.0.0" 1033 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 1034 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 1035 | 1036 | fs-extra@^0.26.7: 1037 | version "0.26.7" 1038 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" 1039 | integrity sha1-muH92UiXeY7at20JGM9C0MMYT6k= 1040 | dependencies: 1041 | graceful-fs "^4.1.2" 1042 | jsonfile "^2.1.0" 1043 | klaw "^1.0.0" 1044 | path-is-absolute "^1.0.0" 1045 | rimraf "^2.2.8" 1046 | 1047 | fs.realpath@^1.0.0: 1048 | version "1.0.0" 1049 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1050 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1051 | 1052 | fs2@^0.3.4: 1053 | version "0.3.4" 1054 | resolved "https://registry.yarnpkg.com/fs2/-/fs2-0.3.4.tgz#c2f02bf8ec53e5d1a2776a1b6023377a206441c3" 1055 | integrity sha512-d0SiZYGyBnWg9YY49dWO+y0Yd4YvFCUPLWDO7QYLrEqa+mcTIs3aJdLZlH67wE/30Nrx4cew4oc7pvwnNZAPKQ== 1056 | dependencies: 1057 | d "1" 1058 | deferred "^0.7.10" 1059 | es5-ext "^0.10.46" 1060 | event-emitter "^0.3.5" 1061 | ignore "^5.0.4" 1062 | memoizee "^0.4.14" 1063 | 1064 | gauge@~1.2.5: 1065 | version "1.2.7" 1066 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" 1067 | integrity sha1-6c7FSD09TuDvRLYKfZnkk14TbZM= 1068 | dependencies: 1069 | ansi "^0.3.0" 1070 | has-unicode "^2.0.0" 1071 | lodash.pad "^4.1.0" 1072 | lodash.padend "^4.1.0" 1073 | lodash.padstart "^4.1.0" 1074 | 1075 | get-proxy@^2.0.0: 1076 | version "2.1.0" 1077 | resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" 1078 | integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw== 1079 | dependencies: 1080 | npm-conf "^1.1.0" 1081 | 1082 | get-stdin@^5.0.1: 1083 | version "5.0.1" 1084 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" 1085 | integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= 1086 | 1087 | get-stream@^2.2.0: 1088 | version "2.3.1" 1089 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" 1090 | integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= 1091 | dependencies: 1092 | object-assign "^4.0.1" 1093 | pinkie-promise "^2.0.0" 1094 | 1095 | get-stream@^3.0.0: 1096 | version "3.0.0" 1097 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 1098 | integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= 1099 | 1100 | get-value@^2.0.3, get-value@^2.0.6: 1101 | version "2.0.6" 1102 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 1103 | integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 1104 | 1105 | glob-parent@^3.1.0: 1106 | version "3.1.0" 1107 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 1108 | integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= 1109 | dependencies: 1110 | is-glob "^3.1.0" 1111 | path-dirname "^1.0.0" 1112 | 1113 | glob-to-regexp@^0.3.0: 1114 | version "0.3.0" 1115 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" 1116 | integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= 1117 | 1118 | glob@^7.0.0, glob@^7.0.3, glob@^7.1.3: 1119 | version "7.1.4" 1120 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 1121 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 1122 | dependencies: 1123 | fs.realpath "^1.0.0" 1124 | inflight "^1.0.4" 1125 | inherits "2" 1126 | minimatch "^3.0.4" 1127 | once "^1.3.0" 1128 | path-is-absolute "^1.0.0" 1129 | 1130 | global-dirs@^0.1.0: 1131 | version "0.1.1" 1132 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" 1133 | integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= 1134 | dependencies: 1135 | ini "^1.3.4" 1136 | 1137 | globby@^6.1.0: 1138 | version "6.1.0" 1139 | resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" 1140 | integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= 1141 | dependencies: 1142 | array-union "^1.0.1" 1143 | glob "^7.0.3" 1144 | object-assign "^4.0.1" 1145 | pify "^2.0.0" 1146 | pinkie-promise "^2.0.0" 1147 | 1148 | globby@^9.2.0: 1149 | version "9.2.0" 1150 | resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" 1151 | integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== 1152 | dependencies: 1153 | "@types/glob" "^7.1.1" 1154 | array-union "^1.0.2" 1155 | dir-glob "^2.2.2" 1156 | fast-glob "^2.2.6" 1157 | glob "^7.1.3" 1158 | ignore "^4.0.3" 1159 | pify "^4.0.1" 1160 | slash "^2.0.0" 1161 | 1162 | got@^6.3.0, got@^6.7.1: 1163 | version "6.7.1" 1164 | resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 1165 | integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= 1166 | dependencies: 1167 | create-error-class "^3.0.0" 1168 | duplexer3 "^0.1.4" 1169 | get-stream "^3.0.0" 1170 | is-redirect "^1.0.0" 1171 | is-retry-allowed "^1.0.0" 1172 | is-stream "^1.0.0" 1173 | lowercase-keys "^1.0.0" 1174 | safe-buffer "^5.0.1" 1175 | timed-out "^4.0.0" 1176 | unzip-response "^2.0.1" 1177 | url-parse-lax "^1.0.0" 1178 | 1179 | graceful-fs@^4.1.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: 1180 | version "4.1.15" 1181 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 1182 | integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 1183 | 1184 | "graceful-readlink@>= 1.0.0": 1185 | version "1.0.1" 1186 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 1187 | integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= 1188 | 1189 | graphlib@^2.1.1: 1190 | version "2.1.7" 1191 | resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.7.tgz#b6a69f9f44bd9de3963ce6804a2fc9e73d86aecc" 1192 | integrity sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w== 1193 | dependencies: 1194 | lodash "^4.17.5" 1195 | 1196 | has-ansi@^2.0.0: 1197 | version "2.0.0" 1198 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1199 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 1200 | dependencies: 1201 | ansi-regex "^2.0.0" 1202 | 1203 | has-flag@^3.0.0: 1204 | version "3.0.0" 1205 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1206 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1207 | 1208 | has-symbol-support-x@^1.4.1: 1209 | version "1.4.2" 1210 | resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" 1211 | integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== 1212 | 1213 | has-to-string-tag-x@^1.2.0: 1214 | version "1.4.1" 1215 | resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" 1216 | integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== 1217 | dependencies: 1218 | has-symbol-support-x "^1.4.1" 1219 | 1220 | has-unicode@^2.0.0: 1221 | version "2.0.1" 1222 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1223 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 1224 | 1225 | has-value@^0.3.1: 1226 | version "0.3.1" 1227 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 1228 | integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 1229 | dependencies: 1230 | get-value "^2.0.3" 1231 | has-values "^0.1.4" 1232 | isobject "^2.0.0" 1233 | 1234 | has-value@^1.0.0: 1235 | version "1.0.0" 1236 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 1237 | integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 1238 | dependencies: 1239 | get-value "^2.0.6" 1240 | has-values "^1.0.0" 1241 | isobject "^3.0.0" 1242 | 1243 | has-values@^0.1.4: 1244 | version "0.1.4" 1245 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 1246 | integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= 1247 | 1248 | has-values@^1.0.0: 1249 | version "1.0.0" 1250 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 1251 | integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 1252 | dependencies: 1253 | is-number "^3.0.0" 1254 | kind-of "^4.0.0" 1255 | 1256 | https-proxy-agent@^2.2.1: 1257 | version "2.2.1" 1258 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" 1259 | integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== 1260 | dependencies: 1261 | agent-base "^4.1.0" 1262 | debug "^3.1.0" 1263 | 1264 | iconv-lite@~0.4.13: 1265 | version "0.4.24" 1266 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1267 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1268 | dependencies: 1269 | safer-buffer ">= 2.1.2 < 3" 1270 | 1271 | ieee754@1.1.8: 1272 | version "1.1.8" 1273 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" 1274 | integrity sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q= 1275 | 1276 | ieee754@^1.1.4: 1277 | version "1.1.13" 1278 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 1279 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 1280 | 1281 | ignore@^4.0.3: 1282 | version "4.0.6" 1283 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 1284 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 1285 | 1286 | ignore@^5.0.4: 1287 | version "5.1.1" 1288 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.1.tgz#2fc6b8f518aff48fef65a7f348ed85632448e4a5" 1289 | integrity sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA== 1290 | 1291 | immediate@~3.0.5: 1292 | version "3.0.6" 1293 | resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" 1294 | integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= 1295 | 1296 | import-lazy@^2.1.0: 1297 | version "2.1.0" 1298 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 1299 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 1300 | 1301 | imurmurhash@^0.1.4: 1302 | version "0.1.4" 1303 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1304 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1305 | 1306 | inflight@^1.0.4: 1307 | version "1.0.6" 1308 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1309 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1310 | dependencies: 1311 | once "^1.3.0" 1312 | wrappy "1" 1313 | 1314 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 1315 | version "2.0.3" 1316 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1317 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1318 | 1319 | ini@^1.3.4, ini@~1.3.0: 1320 | version "1.3.5" 1321 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 1322 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 1323 | 1324 | inquirer@^1.0.2: 1325 | version "1.2.3" 1326 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918" 1327 | integrity sha1-TexvMvN+97sLLtPx0aXD9UUHSRg= 1328 | dependencies: 1329 | ansi-escapes "^1.1.0" 1330 | chalk "^1.0.0" 1331 | cli-cursor "^1.0.1" 1332 | cli-width "^2.0.0" 1333 | external-editor "^1.1.0" 1334 | figures "^1.3.5" 1335 | lodash "^4.3.0" 1336 | mute-stream "0.0.6" 1337 | pinkie-promise "^2.0.0" 1338 | run-async "^2.2.0" 1339 | rx "^4.1.0" 1340 | string-width "^1.0.1" 1341 | strip-ansi "^3.0.0" 1342 | through "^2.3.6" 1343 | 1344 | is-accessor-descriptor@^0.1.6: 1345 | version "0.1.6" 1346 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 1347 | integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 1348 | dependencies: 1349 | kind-of "^3.0.2" 1350 | 1351 | is-accessor-descriptor@^1.0.0: 1352 | version "1.0.0" 1353 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 1354 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 1355 | dependencies: 1356 | kind-of "^6.0.0" 1357 | 1358 | is-buffer@^1.1.5: 1359 | version "1.1.6" 1360 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1361 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 1362 | 1363 | is-ci@^1.0.10: 1364 | version "1.2.1" 1365 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" 1366 | integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== 1367 | dependencies: 1368 | ci-info "^1.5.0" 1369 | 1370 | is-data-descriptor@^0.1.4: 1371 | version "0.1.4" 1372 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 1373 | integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 1374 | dependencies: 1375 | kind-of "^3.0.2" 1376 | 1377 | is-data-descriptor@^1.0.0: 1378 | version "1.0.0" 1379 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 1380 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 1381 | dependencies: 1382 | kind-of "^6.0.0" 1383 | 1384 | is-descriptor@^0.1.0: 1385 | version "0.1.6" 1386 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 1387 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 1388 | dependencies: 1389 | is-accessor-descriptor "^0.1.6" 1390 | is-data-descriptor "^0.1.4" 1391 | kind-of "^5.0.0" 1392 | 1393 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 1394 | version "1.0.2" 1395 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 1396 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 1397 | dependencies: 1398 | is-accessor-descriptor "^1.0.0" 1399 | is-data-descriptor "^1.0.0" 1400 | kind-of "^6.0.2" 1401 | 1402 | is-docker@^1.1.0: 1403 | version "1.1.0" 1404 | resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-1.1.0.tgz#f04374d4eee5310e9a8e113bf1495411e46176a1" 1405 | integrity sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE= 1406 | 1407 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1408 | version "0.1.1" 1409 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1410 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 1411 | 1412 | is-extendable@^1.0.1: 1413 | version "1.0.1" 1414 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 1415 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 1416 | dependencies: 1417 | is-plain-object "^2.0.4" 1418 | 1419 | is-extglob@^2.1.0, is-extglob@^2.1.1: 1420 | version "2.1.1" 1421 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1422 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1423 | 1424 | is-fullwidth-code-point@^1.0.0: 1425 | version "1.0.0" 1426 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1427 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 1428 | dependencies: 1429 | number-is-nan "^1.0.0" 1430 | 1431 | is-fullwidth-code-point@^2.0.0: 1432 | version "2.0.0" 1433 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1434 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1435 | 1436 | is-glob@^3.1.0: 1437 | version "3.1.0" 1438 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 1439 | integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= 1440 | dependencies: 1441 | is-extglob "^2.1.0" 1442 | 1443 | is-glob@^4.0.0: 1444 | version "4.0.1" 1445 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1446 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1447 | dependencies: 1448 | is-extglob "^2.1.1" 1449 | 1450 | is-installed-globally@^0.1.0: 1451 | version "0.1.0" 1452 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" 1453 | integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= 1454 | dependencies: 1455 | global-dirs "^0.1.0" 1456 | is-path-inside "^1.0.0" 1457 | 1458 | is-natural-number@^4.0.1: 1459 | version "4.0.1" 1460 | resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" 1461 | integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= 1462 | 1463 | is-npm@^1.0.0: 1464 | version "1.0.0" 1465 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 1466 | integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= 1467 | 1468 | is-number@^3.0.0: 1469 | version "3.0.0" 1470 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1471 | integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 1472 | dependencies: 1473 | kind-of "^3.0.2" 1474 | 1475 | is-obj@^1.0.0: 1476 | version "1.0.1" 1477 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 1478 | integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= 1479 | 1480 | is-object@^1.0.1: 1481 | version "1.0.1" 1482 | resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" 1483 | integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= 1484 | 1485 | is-path-inside@^1.0.0: 1486 | version "1.0.1" 1487 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 1488 | integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= 1489 | dependencies: 1490 | path-is-inside "^1.0.1" 1491 | 1492 | is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1493 | version "2.0.4" 1494 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1495 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 1496 | dependencies: 1497 | isobject "^3.0.1" 1498 | 1499 | is-promise@^2.1, is-promise@^2.1.0: 1500 | version "2.1.0" 1501 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 1502 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 1503 | 1504 | is-redirect@^1.0.0: 1505 | version "1.0.0" 1506 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 1507 | integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= 1508 | 1509 | is-retry-allowed@^1.0.0: 1510 | version "1.1.0" 1511 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 1512 | integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= 1513 | 1514 | is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: 1515 | version "1.1.0" 1516 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1517 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 1518 | 1519 | is-windows@^1.0.2: 1520 | version "1.0.2" 1521 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1522 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1523 | 1524 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 1525 | version "1.0.0" 1526 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1527 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1528 | 1529 | isexe@^2.0.0: 1530 | version "2.0.0" 1531 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1532 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1533 | 1534 | isobject@^2.0.0: 1535 | version "2.1.0" 1536 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1537 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 1538 | dependencies: 1539 | isarray "1.0.0" 1540 | 1541 | isobject@^3.0.0, isobject@^3.0.1: 1542 | version "3.0.1" 1543 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1544 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 1545 | 1546 | isurl@^1.0.0-alpha5: 1547 | version "1.0.0" 1548 | resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" 1549 | integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== 1550 | dependencies: 1551 | has-to-string-tag-x "^1.2.0" 1552 | is-object "^1.0.1" 1553 | 1554 | jmespath@0.15.0: 1555 | version "0.15.0" 1556 | resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" 1557 | integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= 1558 | 1559 | js-yaml@^3.13.0, js-yaml@^3.8.3: 1560 | version "3.13.1" 1561 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1562 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1563 | dependencies: 1564 | argparse "^1.0.7" 1565 | esprima "^4.0.0" 1566 | 1567 | json-cycle@^1.3.0: 1568 | version "1.3.0" 1569 | resolved "https://registry.yarnpkg.com/json-cycle/-/json-cycle-1.3.0.tgz#c4f6f7d926c2979012cba173b06f9cae9e866d3f" 1570 | integrity sha512-FD/SedD78LCdSvJaOUQAXseT8oQBb5z6IVYaQaCrVUlu9zOAr1BDdKyVYQaSD/GDsAMrXpKcOyBD4LIl8nfjHw== 1571 | 1572 | json-refs@^2.1.5: 1573 | version "2.1.7" 1574 | resolved "https://registry.yarnpkg.com/json-refs/-/json-refs-2.1.7.tgz#b9eb01fe29f5ea3e92878f15aea10ad38b5acf89" 1575 | integrity sha1-uesB/in16j6Sh48VrqEK04taz4k= 1576 | dependencies: 1577 | commander "^2.9.0" 1578 | graphlib "^2.1.1" 1579 | js-yaml "^3.8.3" 1580 | native-promise-only "^0.8.1" 1581 | path-loader "^1.0.2" 1582 | slash "^1.0.0" 1583 | uri-js "^3.0.2" 1584 | 1585 | json-stringify-safe@5.0.1: 1586 | version "5.0.1" 1587 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1588 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 1589 | 1590 | jsonfile@^2.1.0: 1591 | version "2.4.0" 1592 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 1593 | integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= 1594 | optionalDependencies: 1595 | graceful-fs "^4.1.6" 1596 | 1597 | jszip@^3.2.1: 1598 | version "3.2.1" 1599 | resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.1.tgz#c5d32df7274042282b157efb16e522b43435e01a" 1600 | integrity sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw== 1601 | dependencies: 1602 | lie "~3.3.0" 1603 | pako "~1.0.2" 1604 | readable-stream "~2.3.6" 1605 | set-immediate-shim "~1.0.1" 1606 | 1607 | jwt-decode@^2.2.0: 1608 | version "2.2.0" 1609 | resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-2.2.0.tgz#7d86bd56679f58ce6a84704a657dd392bba81a79" 1610 | integrity sha1-fYa9VmefWM5qhHBKZX3TkruoGnk= 1611 | 1612 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 1613 | version "3.2.2" 1614 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1615 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 1616 | dependencies: 1617 | is-buffer "^1.1.5" 1618 | 1619 | kind-of@^4.0.0: 1620 | version "4.0.0" 1621 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1622 | integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 1623 | dependencies: 1624 | is-buffer "^1.1.5" 1625 | 1626 | kind-of@^5.0.0: 1627 | version "5.1.0" 1628 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 1629 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 1630 | 1631 | kind-of@^6.0.0, kind-of@^6.0.2: 1632 | version "6.0.2" 1633 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 1634 | integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 1635 | 1636 | klaw@^1.0.0: 1637 | version "1.3.1" 1638 | resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" 1639 | integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= 1640 | optionalDependencies: 1641 | graceful-fs "^4.1.9" 1642 | 1643 | latest-version@^3.0.0: 1644 | version "3.1.0" 1645 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" 1646 | integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= 1647 | dependencies: 1648 | package-json "^4.0.0" 1649 | 1650 | lazystream@^1.0.0: 1651 | version "1.0.0" 1652 | resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" 1653 | integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= 1654 | dependencies: 1655 | readable-stream "^2.0.5" 1656 | 1657 | lie@~3.3.0: 1658 | version "3.3.0" 1659 | resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" 1660 | integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== 1661 | dependencies: 1662 | immediate "~3.0.5" 1663 | 1664 | lodash.difference@^4.5.0: 1665 | version "4.5.0" 1666 | resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" 1667 | integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= 1668 | 1669 | lodash.pad@^4.1.0: 1670 | version "4.5.1" 1671 | resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" 1672 | integrity sha1-QzCUmoM6fI2iLMIPaibE1Z3runA= 1673 | 1674 | lodash.padend@^4.1.0: 1675 | version "4.6.1" 1676 | resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" 1677 | integrity sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4= 1678 | 1679 | lodash.padstart@^4.1.0: 1680 | version "4.6.1" 1681 | resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" 1682 | integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= 1683 | 1684 | lodash.uniq@^4.5.0: 1685 | version "4.5.0" 1686 | resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 1687 | integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= 1688 | 1689 | lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.8.0: 1690 | version "4.17.11" 1691 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 1692 | integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== 1693 | 1694 | lowercase-keys@^1.0.0: 1695 | version "1.0.1" 1696 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 1697 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 1698 | 1699 | lru-cache@^4.0.1: 1700 | version "4.1.5" 1701 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 1702 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 1703 | dependencies: 1704 | pseudomap "^1.0.2" 1705 | yallist "^2.1.2" 1706 | 1707 | lru-queue@0.1: 1708 | version "0.1.0" 1709 | resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" 1710 | integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= 1711 | dependencies: 1712 | es5-ext "~0.10.2" 1713 | 1714 | lsmod@1.0.0: 1715 | version "1.0.0" 1716 | resolved "https://registry.yarnpkg.com/lsmod/-/lsmod-1.0.0.tgz#9a00f76dca36eb23fa05350afe1b585d4299e64b" 1717 | integrity sha1-mgD3bco26yP6BTUK/htYXUKZ5ks= 1718 | 1719 | make-dir@^1.0.0: 1720 | version "1.3.0" 1721 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 1722 | integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== 1723 | dependencies: 1724 | pify "^3.0.0" 1725 | 1726 | map-cache@^0.2.2: 1727 | version "0.2.2" 1728 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1729 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 1730 | 1731 | map-visit@^1.0.0: 1732 | version "1.0.0" 1733 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1734 | integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 1735 | dependencies: 1736 | object-visit "^1.0.0" 1737 | 1738 | memoizee@^0.4.14: 1739 | version "0.4.14" 1740 | resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" 1741 | integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== 1742 | dependencies: 1743 | d "1" 1744 | es5-ext "^0.10.45" 1745 | es6-weak-map "^2.0.2" 1746 | event-emitter "^0.3.5" 1747 | is-promise "^2.1" 1748 | lru-queue "0.1" 1749 | next-tick "1" 1750 | timers-ext "^0.1.5" 1751 | 1752 | merge2@^1.2.3: 1753 | version "1.2.3" 1754 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" 1755 | integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== 1756 | 1757 | methods@^1.1.1: 1758 | version "1.1.2" 1759 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1760 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1761 | 1762 | micromatch@^3.1.10: 1763 | version "3.1.10" 1764 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 1765 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 1766 | dependencies: 1767 | arr-diff "^4.0.0" 1768 | array-unique "^0.3.2" 1769 | braces "^2.3.1" 1770 | define-property "^2.0.2" 1771 | extend-shallow "^3.0.2" 1772 | extglob "^2.0.4" 1773 | fragment-cache "^0.2.1" 1774 | kind-of "^6.0.2" 1775 | nanomatch "^1.2.9" 1776 | object.pick "^1.3.0" 1777 | regex-not "^1.0.0" 1778 | snapdragon "^0.8.1" 1779 | to-regex "^3.0.2" 1780 | 1781 | mime-db@1.40.0: 1782 | version "1.40.0" 1783 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 1784 | integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== 1785 | 1786 | mime-types@^2.1.12: 1787 | version "2.1.24" 1788 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" 1789 | integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== 1790 | dependencies: 1791 | mime-db "1.40.0" 1792 | 1793 | mime@^1.4.1: 1794 | version "1.6.0" 1795 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1796 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1797 | 1798 | minimatch@^3.0.4: 1799 | version "3.0.4" 1800 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1801 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1802 | dependencies: 1803 | brace-expansion "^1.1.7" 1804 | 1805 | minimist@0.0.8: 1806 | version "0.0.8" 1807 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1808 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1809 | 1810 | minimist@^1.2.0: 1811 | version "1.2.0" 1812 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1813 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 1814 | 1815 | mixin-deep@^1.2.0: 1816 | version "1.3.1" 1817 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" 1818 | integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== 1819 | dependencies: 1820 | for-in "^1.0.2" 1821 | is-extendable "^1.0.1" 1822 | 1823 | mkdirp@^0.5.1: 1824 | version "0.5.1" 1825 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1826 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1827 | dependencies: 1828 | minimist "0.0.8" 1829 | 1830 | moment@^2.13.0: 1831 | version "2.24.0" 1832 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" 1833 | integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== 1834 | 1835 | ms@2.0.0: 1836 | version "2.0.0" 1837 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1838 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1839 | 1840 | ms@^2.1.1: 1841 | version "2.1.1" 1842 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1843 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1844 | 1845 | multimatch@^3.0.0: 1846 | version "3.0.0" 1847 | resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" 1848 | integrity sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA== 1849 | dependencies: 1850 | array-differ "^2.0.3" 1851 | array-union "^1.0.2" 1852 | arrify "^1.0.1" 1853 | minimatch "^3.0.4" 1854 | 1855 | mute-stream@0.0.6: 1856 | version "0.0.6" 1857 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" 1858 | integrity sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s= 1859 | 1860 | nanomatch@^1.2.13, nanomatch@^1.2.9: 1861 | version "1.2.13" 1862 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 1863 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 1864 | dependencies: 1865 | arr-diff "^4.0.0" 1866 | array-unique "^0.3.2" 1867 | define-property "^2.0.2" 1868 | extend-shallow "^3.0.2" 1869 | fragment-cache "^0.2.1" 1870 | is-windows "^1.0.2" 1871 | kind-of "^6.0.2" 1872 | object.pick "^1.3.0" 1873 | regex-not "^1.0.0" 1874 | snapdragon "^0.8.1" 1875 | to-regex "^3.0.1" 1876 | 1877 | native-promise-only@^0.8.1: 1878 | version "0.8.1" 1879 | resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" 1880 | integrity sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE= 1881 | 1882 | ncjsm@^2.3.0: 1883 | version "2.3.0" 1884 | resolved "https://registry.yarnpkg.com/ncjsm/-/ncjsm-2.3.0.tgz#64aed8d6ae9e964bbefc6d0f416aaba0927d99d4" 1885 | integrity sha512-VdfQ2cdfzPtdCeccVS1DipEvO2XiIHy61SHhFIHaHbA7KNelzlviDy5MGYANPjBHlJwHfu96DWQTS6P+rrowAA== 1886 | dependencies: 1887 | builtin-modules "^3.1.0" 1888 | deferred "^0.7.10" 1889 | es5-ext "^0.10.49" 1890 | es6-set "^0.1.5" 1891 | find-requires "^1.0.0" 1892 | fs2 "^0.3.4" 1893 | type "^1.0.1" 1894 | 1895 | next-tick@1, next-tick@^1.0.0: 1896 | version "1.0.0" 1897 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 1898 | integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= 1899 | 1900 | node-fetch@^1.6.0: 1901 | version "1.7.3" 1902 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 1903 | integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== 1904 | dependencies: 1905 | encoding "^0.1.11" 1906 | is-stream "^1.0.1" 1907 | 1908 | normalize-path@^2.0.0: 1909 | version "2.1.1" 1910 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1911 | integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= 1912 | dependencies: 1913 | remove-trailing-separator "^1.0.1" 1914 | 1915 | npm-conf@^1.1.0: 1916 | version "1.1.3" 1917 | resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" 1918 | integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== 1919 | dependencies: 1920 | config-chain "^1.1.11" 1921 | pify "^3.0.0" 1922 | 1923 | npm-run-path@^2.0.0: 1924 | version "2.0.2" 1925 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1926 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 1927 | dependencies: 1928 | path-key "^2.0.0" 1929 | 1930 | npmlog@^2.0.3: 1931 | version "2.0.4" 1932 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" 1933 | integrity sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI= 1934 | dependencies: 1935 | ansi "~0.3.1" 1936 | are-we-there-yet "~1.1.2" 1937 | gauge "~1.2.5" 1938 | 1939 | number-is-nan@^1.0.0: 1940 | version "1.0.1" 1941 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1942 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1943 | 1944 | object-assign@^4.0.1, object-assign@^4.1.0: 1945 | version "4.1.1" 1946 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1947 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1948 | 1949 | object-copy@^0.1.0: 1950 | version "0.1.0" 1951 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1952 | integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 1953 | dependencies: 1954 | copy-descriptor "^0.1.0" 1955 | define-property "^0.2.5" 1956 | kind-of "^3.0.3" 1957 | 1958 | object-hash@^1.2.0: 1959 | version "1.3.1" 1960 | resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" 1961 | integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== 1962 | 1963 | object-visit@^1.0.0: 1964 | version "1.0.1" 1965 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1966 | integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 1967 | dependencies: 1968 | isobject "^3.0.0" 1969 | 1970 | object.pick@^1.3.0: 1971 | version "1.3.0" 1972 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1973 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 1974 | dependencies: 1975 | isobject "^3.0.1" 1976 | 1977 | once@^1.3.0, once@^1.4.0: 1978 | version "1.4.0" 1979 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1980 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1981 | dependencies: 1982 | wrappy "1" 1983 | 1984 | onetime@^1.0.0: 1985 | version "1.1.0" 1986 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 1987 | integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= 1988 | 1989 | os-shim@^0.1.2: 1990 | version "0.1.3" 1991 | resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" 1992 | integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= 1993 | 1994 | os-tmpdir@~1.0.1: 1995 | version "1.0.2" 1996 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1997 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1998 | 1999 | p-finally@^1.0.0: 2000 | version "1.0.0" 2001 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 2002 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 2003 | 2004 | package-json@^4.0.0: 2005 | version "4.0.1" 2006 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" 2007 | integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= 2008 | dependencies: 2009 | got "^6.7.1" 2010 | registry-auth-token "^3.0.1" 2011 | registry-url "^3.0.3" 2012 | semver "^5.1.0" 2013 | 2014 | pako@~1.0.2: 2015 | version "1.0.10" 2016 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" 2017 | integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== 2018 | 2019 | pascalcase@^0.1.1: 2020 | version "0.1.1" 2021 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 2022 | integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 2023 | 2024 | path-dirname@^1.0.0: 2025 | version "1.0.2" 2026 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 2027 | integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 2028 | 2029 | path-is-absolute@^1.0.0: 2030 | version "1.0.1" 2031 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2032 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 2033 | 2034 | path-is-inside@^1.0.1: 2035 | version "1.0.2" 2036 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 2037 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 2038 | 2039 | path-key@^2.0.0: 2040 | version "2.0.1" 2041 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 2042 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 2043 | 2044 | path-loader@^1.0.2: 2045 | version "1.0.10" 2046 | resolved "https://registry.yarnpkg.com/path-loader/-/path-loader-1.0.10.tgz#dd3d1bd54cb6f2e6423af2ad334a41cc0bce4cf6" 2047 | integrity sha512-CMP0v6S6z8PHeJ6NFVyVJm6WyJjIwFvyz2b0n2/4bKdS/0uZa/9sKUlYZzubrn3zuDRU0zIuEDX9DZYQ2ZI8TA== 2048 | dependencies: 2049 | native-promise-only "^0.8.1" 2050 | superagent "^3.8.3" 2051 | 2052 | path-type@^3.0.0: 2053 | version "3.0.0" 2054 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" 2055 | integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== 2056 | dependencies: 2057 | pify "^3.0.0" 2058 | 2059 | pend@~1.2.0: 2060 | version "1.2.0" 2061 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 2062 | integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= 2063 | 2064 | pify@^2.0.0, pify@^2.3.0: 2065 | version "2.3.0" 2066 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 2067 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 2068 | 2069 | pify@^3.0.0: 2070 | version "3.0.0" 2071 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 2072 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 2073 | 2074 | pify@^4.0.1: 2075 | version "4.0.1" 2076 | resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" 2077 | integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== 2078 | 2079 | pinkie-promise@^2.0.0: 2080 | version "2.0.1" 2081 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 2082 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 2083 | dependencies: 2084 | pinkie "^2.0.0" 2085 | 2086 | pinkie@^2.0.0: 2087 | version "2.0.4" 2088 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 2089 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 2090 | 2091 | posix-character-classes@^0.1.0: 2092 | version "0.1.1" 2093 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 2094 | integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 2095 | 2096 | prepend-http@^1.0.1: 2097 | version "1.0.4" 2098 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 2099 | integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= 2100 | 2101 | process-nextick-args@~2.0.0: 2102 | version "2.0.0" 2103 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 2104 | integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 2105 | 2106 | promise-queue@^2.2.3: 2107 | version "2.2.5" 2108 | resolved "https://registry.yarnpkg.com/promise-queue/-/promise-queue-2.2.5.tgz#2f6f5f7c0f6d08109e967659c79b88a9ed5e93b4" 2109 | integrity sha1-L29ffA9tCBCelnZZx5uIqe1ek7Q= 2110 | 2111 | proto-list@~1.2.1: 2112 | version "1.2.4" 2113 | resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" 2114 | integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= 2115 | 2116 | pseudomap@^1.0.2: 2117 | version "1.0.2" 2118 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 2119 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 2120 | 2121 | punycode@1.3.2: 2122 | version "1.3.2" 2123 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 2124 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 2125 | 2126 | punycode@^2.1.0: 2127 | version "2.1.1" 2128 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 2129 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 2130 | 2131 | qs@^6.5.1: 2132 | version "6.7.0" 2133 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 2134 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 2135 | 2136 | querystring@0.2.0: 2137 | version "0.2.0" 2138 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 2139 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 2140 | 2141 | raven@^1.2.1: 2142 | version "1.2.1" 2143 | resolved "https://registry.yarnpkg.com/raven/-/raven-1.2.1.tgz#949c134db028a190b7bbf8f790aae541b7c020bd" 2144 | integrity sha1-lJwTTbAooZC3u/j3kKrlQbfAIL0= 2145 | dependencies: 2146 | cookie "0.3.1" 2147 | json-stringify-safe "5.0.1" 2148 | lsmod "1.0.0" 2149 | stack-trace "0.0.9" 2150 | uuid "3.0.0" 2151 | 2152 | rc@^1.0.1, rc@^1.1.6: 2153 | version "1.2.8" 2154 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 2155 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 2156 | dependencies: 2157 | deep-extend "^0.6.0" 2158 | ini "~1.3.0" 2159 | minimist "^1.2.0" 2160 | strip-json-comments "~2.0.1" 2161 | 2162 | readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: 2163 | version "2.3.6" 2164 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 2165 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 2166 | dependencies: 2167 | core-util-is "~1.0.0" 2168 | inherits "~2.0.3" 2169 | isarray "~1.0.0" 2170 | process-nextick-args "~2.0.0" 2171 | safe-buffer "~5.1.1" 2172 | string_decoder "~1.1.1" 2173 | util-deprecate "~1.0.1" 2174 | 2175 | regex-not@^1.0.0, regex-not@^1.0.2: 2176 | version "1.0.2" 2177 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 2178 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 2179 | dependencies: 2180 | extend-shallow "^3.0.2" 2181 | safe-regex "^1.1.0" 2182 | 2183 | registry-auth-token@^3.0.1: 2184 | version "3.4.0" 2185 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" 2186 | integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== 2187 | dependencies: 2188 | rc "^1.1.6" 2189 | safe-buffer "^5.0.1" 2190 | 2191 | registry-url@^3.0.3: 2192 | version "3.1.0" 2193 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 2194 | integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= 2195 | dependencies: 2196 | rc "^1.0.1" 2197 | 2198 | remove-trailing-separator@^1.0.1: 2199 | version "1.1.0" 2200 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 2201 | integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= 2202 | 2203 | repeat-element@^1.1.2: 2204 | version "1.1.3" 2205 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 2206 | integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 2207 | 2208 | repeat-string@^1.6.1: 2209 | version "1.6.1" 2210 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2211 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 2212 | 2213 | replaceall@^0.1.6: 2214 | version "0.1.6" 2215 | resolved "https://registry.yarnpkg.com/replaceall/-/replaceall-0.1.6.tgz#81d81ac7aeb72d7f5c4942adf2697a3220688d8e" 2216 | integrity sha1-gdgax663LX9cSUKt8ml6MiBojY4= 2217 | 2218 | resolve-url@^0.2.1: 2219 | version "0.2.1" 2220 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 2221 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 2222 | 2223 | restore-cursor@^1.0.1: 2224 | version "1.0.1" 2225 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 2226 | integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= 2227 | dependencies: 2228 | exit-hook "^1.0.0" 2229 | onetime "^1.0.0" 2230 | 2231 | ret@~0.1.10: 2232 | version "0.1.15" 2233 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 2234 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 2235 | 2236 | rimraf@^2.2.8: 2237 | version "2.6.3" 2238 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 2239 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 2240 | dependencies: 2241 | glob "^7.1.3" 2242 | 2243 | run-async@^2.2.0: 2244 | version "2.3.0" 2245 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 2246 | integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= 2247 | dependencies: 2248 | is-promise "^2.1.0" 2249 | 2250 | rx@^4.1.0: 2251 | version "4.1.0" 2252 | resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" 2253 | integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= 2254 | 2255 | safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2256 | version "5.1.2" 2257 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 2258 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 2259 | 2260 | safe-regex@^1.1.0: 2261 | version "1.1.0" 2262 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 2263 | integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 2264 | dependencies: 2265 | ret "~0.1.10" 2266 | 2267 | "safer-buffer@>= 2.1.2 < 3": 2268 | version "2.1.2" 2269 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2270 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2271 | 2272 | sax@1.2.1: 2273 | version "1.2.1" 2274 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" 2275 | integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= 2276 | 2277 | sax@>=0.6.0: 2278 | version "1.2.4" 2279 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 2280 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 2281 | 2282 | seek-bzip@^1.0.5: 2283 | version "1.0.5" 2284 | resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" 2285 | integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w= 2286 | dependencies: 2287 | commander "~2.8.1" 2288 | 2289 | semver-diff@^2.0.0: 2290 | version "2.1.0" 2291 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 2292 | integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= 2293 | dependencies: 2294 | semver "^5.0.3" 2295 | 2296 | semver-regex@^1.0.0: 2297 | version "1.0.0" 2298 | resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" 2299 | integrity sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk= 2300 | 2301 | semver@^5.0.3, semver@^5.1.0, semver@^5.7.0: 2302 | version "5.7.0" 2303 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 2304 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 2305 | 2306 | serverless-iam-roles-per-function@^2.0.0: 2307 | version "2.0.1" 2308 | resolved "https://registry.yarnpkg.com/serverless-iam-roles-per-function/-/serverless-iam-roles-per-function-2.0.1.tgz#542ad4e3c1473785b7f66a5f692ddaebf4cc7f67" 2309 | integrity sha512-3t8BsC4CxsXfBtL80xaz5vcRiAe6x4tKfDByGtmMj8fr5q3AvH4PHlhnPPtSYVYgleY02K9Bfh8kf4UrkgshFQ== 2310 | dependencies: 2311 | lodash "^4.17.10" 2312 | 2313 | serverless-plugin-reducer@^3.2.1: 2314 | version "3.2.3" 2315 | resolved "https://registry.yarnpkg.com/serverless-plugin-reducer/-/serverless-plugin-reducer-3.2.3.tgz#8622626c38a99cb9b8cf845db26b5ba11434dae9" 2316 | integrity sha512-J8Pewftygb4A5Desbj7WbYU0zZz+hGpPbYvt4ZwwoBImvKTX6Vsd4DjkSqBH18oXLq1yGDbdbqvOZHfnYEPc9Q== 2317 | dependencies: 2318 | bluebird "^3.5.4" 2319 | es5-ext "^0.10.50" 2320 | globby "^9.2.0" 2321 | graceful-fs "^4.1.15" 2322 | multimatch "^3.0.0" 2323 | ncjsm "^2.3.0" 2324 | 2325 | serverless-pseudo-parameters@^2.4.0: 2326 | version "2.4.0" 2327 | resolved "https://registry.yarnpkg.com/serverless-pseudo-parameters/-/serverless-pseudo-parameters-2.4.0.tgz#bf5ebe6948f60bbf69c7dc2cf4bd2a5ee7dc6761" 2328 | integrity sha512-lb9R62PUFdEAbbYH7pe1wzR7vtIpa8YI8OVcQ5LlLyE0+AxWG4bwEw33X5LE8+5oLwTy57Y/EevnxKnMeyiXxw== 2329 | 2330 | serverless@^1.41.1: 2331 | version "1.42.3" 2332 | resolved "https://registry.yarnpkg.com/serverless/-/serverless-1.42.3.tgz#7f637a5d788b48a7bbd18b0b904fbb2ed27e87a7" 2333 | integrity sha512-lwfLn2N+MSYAnp+5VNfc8wF4iBRX1YvtpYA0BwsEN9CyRnmSV7vCCIW4lze2EnErtjzQlFMNg6UKlhL86GhiPQ== 2334 | dependencies: 2335 | archiver "^1.1.0" 2336 | async "^1.5.2" 2337 | aws-sdk "^2.430.0" 2338 | bluebird "^3.5.0" 2339 | cachedir "^2.2.0" 2340 | chalk "^2.0.0" 2341 | ci-info "^1.1.1" 2342 | download "^5.0.2" 2343 | fast-levenshtein "^2.0.6" 2344 | filesize "^3.3.0" 2345 | fs-extra "^0.26.7" 2346 | get-stdin "^5.0.1" 2347 | globby "^6.1.0" 2348 | graceful-fs "^4.1.11" 2349 | https-proxy-agent "^2.2.1" 2350 | is-docker "^1.1.0" 2351 | js-yaml "^3.13.0" 2352 | json-cycle "^1.3.0" 2353 | json-refs "^2.1.5" 2354 | jszip "^3.2.1" 2355 | jwt-decode "^2.2.0" 2356 | lodash "^4.13.1" 2357 | minimist "^1.2.0" 2358 | mkdirp "^0.5.1" 2359 | moment "^2.13.0" 2360 | nanomatch "^1.2.13" 2361 | node-fetch "^1.6.0" 2362 | object-hash "^1.2.0" 2363 | promise-queue "^2.2.3" 2364 | raven "^1.2.1" 2365 | rc "^1.1.6" 2366 | replaceall "^0.1.6" 2367 | semver "^5.7.0" 2368 | semver-regex "^1.0.0" 2369 | tabtab "^2.2.2" 2370 | untildify "^3.0.3" 2371 | update-notifier "^2.2.0" 2372 | uuid "^2.0.2" 2373 | write-file-atomic "^2.1.0" 2374 | yaml-ast-parser "0.0.34" 2375 | 2376 | set-immediate-shim@~1.0.1: 2377 | version "1.0.1" 2378 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 2379 | integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= 2380 | 2381 | set-value@^0.4.3: 2382 | version "0.4.3" 2383 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 2384 | integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= 2385 | dependencies: 2386 | extend-shallow "^2.0.1" 2387 | is-extendable "^0.1.1" 2388 | is-plain-object "^2.0.1" 2389 | to-object-path "^0.3.0" 2390 | 2391 | set-value@^2.0.0: 2392 | version "2.0.0" 2393 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 2394 | integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== 2395 | dependencies: 2396 | extend-shallow "^2.0.1" 2397 | is-extendable "^0.1.1" 2398 | is-plain-object "^2.0.3" 2399 | split-string "^3.0.1" 2400 | 2401 | shebang-command@^1.2.0: 2402 | version "1.2.0" 2403 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2404 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 2405 | dependencies: 2406 | shebang-regex "^1.0.0" 2407 | 2408 | shebang-regex@^1.0.0: 2409 | version "1.0.0" 2410 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2411 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 2412 | 2413 | signal-exit@^3.0.0, signal-exit@^3.0.2: 2414 | version "3.0.2" 2415 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2416 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 2417 | 2418 | slash@^1.0.0: 2419 | version "1.0.0" 2420 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 2421 | integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= 2422 | 2423 | slash@^2.0.0: 2424 | version "2.0.0" 2425 | resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" 2426 | integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== 2427 | 2428 | snapdragon-node@^2.0.1: 2429 | version "2.1.1" 2430 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 2431 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 2432 | dependencies: 2433 | define-property "^1.0.0" 2434 | isobject "^3.0.0" 2435 | snapdragon-util "^3.0.1" 2436 | 2437 | snapdragon-util@^3.0.1: 2438 | version "3.0.1" 2439 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 2440 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 2441 | dependencies: 2442 | kind-of "^3.2.0" 2443 | 2444 | snapdragon@^0.8.1: 2445 | version "0.8.2" 2446 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 2447 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 2448 | dependencies: 2449 | base "^0.11.1" 2450 | debug "^2.2.0" 2451 | define-property "^0.2.5" 2452 | extend-shallow "^2.0.1" 2453 | map-cache "^0.2.2" 2454 | source-map "^0.5.6" 2455 | source-map-resolve "^0.5.0" 2456 | use "^3.1.0" 2457 | 2458 | source-map-resolve@^0.5.0: 2459 | version "0.5.2" 2460 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 2461 | integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 2462 | dependencies: 2463 | atob "^2.1.1" 2464 | decode-uri-component "^0.2.0" 2465 | resolve-url "^0.2.1" 2466 | source-map-url "^0.4.0" 2467 | urix "^0.1.0" 2468 | 2469 | source-map-url@^0.4.0: 2470 | version "0.4.0" 2471 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 2472 | integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 2473 | 2474 | source-map@^0.5.6: 2475 | version "0.5.7" 2476 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2477 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 2478 | 2479 | spawn-sync@^1.0.15: 2480 | version "1.0.15" 2481 | resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" 2482 | integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= 2483 | dependencies: 2484 | concat-stream "^1.4.7" 2485 | os-shim "^0.1.2" 2486 | 2487 | split-string@^3.0.1, split-string@^3.0.2: 2488 | version "3.1.0" 2489 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 2490 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 2491 | dependencies: 2492 | extend-shallow "^3.0.0" 2493 | 2494 | sprintf-js@~1.0.2: 2495 | version "1.0.3" 2496 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2497 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 2498 | 2499 | stack-trace@0.0.9: 2500 | version "0.0.9" 2501 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" 2502 | integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= 2503 | 2504 | static-extend@^0.1.1: 2505 | version "0.1.2" 2506 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 2507 | integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 2508 | dependencies: 2509 | define-property "^0.2.5" 2510 | object-copy "^0.1.0" 2511 | 2512 | string-width@^1.0.1: 2513 | version "1.0.2" 2514 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2515 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 2516 | dependencies: 2517 | code-point-at "^1.0.0" 2518 | is-fullwidth-code-point "^1.0.0" 2519 | strip-ansi "^3.0.0" 2520 | 2521 | string-width@^2.0.0, string-width@^2.1.1: 2522 | version "2.1.1" 2523 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2524 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 2525 | dependencies: 2526 | is-fullwidth-code-point "^2.0.0" 2527 | strip-ansi "^4.0.0" 2528 | 2529 | string_decoder@~1.1.1: 2530 | version "1.1.1" 2531 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2532 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2533 | dependencies: 2534 | safe-buffer "~5.1.0" 2535 | 2536 | strip-ansi@^3.0.0: 2537 | version "3.0.1" 2538 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2539 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2540 | dependencies: 2541 | ansi-regex "^2.0.0" 2542 | 2543 | strip-ansi@^4.0.0: 2544 | version "4.0.0" 2545 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2546 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2547 | dependencies: 2548 | ansi-regex "^3.0.0" 2549 | 2550 | strip-dirs@^2.0.0: 2551 | version "2.1.0" 2552 | resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" 2553 | integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== 2554 | dependencies: 2555 | is-natural-number "^4.0.1" 2556 | 2557 | strip-eof@^1.0.0: 2558 | version "1.0.0" 2559 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 2560 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 2561 | 2562 | strip-json-comments@~2.0.1: 2563 | version "2.0.1" 2564 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2565 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2566 | 2567 | strip-outer@^1.0.0: 2568 | version "1.0.1" 2569 | resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" 2570 | integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== 2571 | dependencies: 2572 | escape-string-regexp "^1.0.2" 2573 | 2574 | superagent@^3.8.3: 2575 | version "3.8.3" 2576 | resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" 2577 | integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== 2578 | dependencies: 2579 | component-emitter "^1.2.0" 2580 | cookiejar "^2.1.0" 2581 | debug "^3.1.0" 2582 | extend "^3.0.0" 2583 | form-data "^2.3.1" 2584 | formidable "^1.2.0" 2585 | methods "^1.1.1" 2586 | mime "^1.4.1" 2587 | qs "^6.5.1" 2588 | readable-stream "^2.3.5" 2589 | 2590 | supports-color@^2.0.0: 2591 | version "2.0.0" 2592 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2593 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 2594 | 2595 | supports-color@^5.3.0: 2596 | version "5.5.0" 2597 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2598 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2599 | dependencies: 2600 | has-flag "^3.0.0" 2601 | 2602 | tabtab@^2.2.2: 2603 | version "2.2.2" 2604 | resolved "https://registry.yarnpkg.com/tabtab/-/tabtab-2.2.2.tgz#7a047f143b010b4cbd31f857e82961512cbf4e14" 2605 | integrity sha1-egR/FDsBC0y9MfhX6ClhUSy/ThQ= 2606 | dependencies: 2607 | debug "^2.2.0" 2608 | inquirer "^1.0.2" 2609 | lodash.difference "^4.5.0" 2610 | lodash.uniq "^4.5.0" 2611 | minimist "^1.2.0" 2612 | mkdirp "^0.5.1" 2613 | npmlog "^2.0.3" 2614 | object-assign "^4.1.0" 2615 | 2616 | tar-stream@^1.5.0, tar-stream@^1.5.2: 2617 | version "1.6.2" 2618 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" 2619 | integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== 2620 | dependencies: 2621 | bl "^1.0.0" 2622 | buffer-alloc "^1.2.0" 2623 | end-of-stream "^1.0.0" 2624 | fs-constants "^1.0.0" 2625 | readable-stream "^2.3.0" 2626 | to-buffer "^1.1.1" 2627 | xtend "^4.0.0" 2628 | 2629 | term-size@^1.2.0: 2630 | version "1.2.0" 2631 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" 2632 | integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= 2633 | dependencies: 2634 | execa "^0.7.0" 2635 | 2636 | through@^2.3.6, through@^2.3.8: 2637 | version "2.3.8" 2638 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2639 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 2640 | 2641 | timed-out@^4.0.0: 2642 | version "4.0.1" 2643 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 2644 | integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= 2645 | 2646 | timers-ext@^0.1.5, timers-ext@~0.1.2: 2647 | version "0.1.7" 2648 | resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" 2649 | integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== 2650 | dependencies: 2651 | es5-ext "~0.10.46" 2652 | next-tick "1" 2653 | 2654 | tmp@^0.0.29: 2655 | version "0.0.29" 2656 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" 2657 | integrity sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= 2658 | dependencies: 2659 | os-tmpdir "~1.0.1" 2660 | 2661 | to-buffer@^1.1.1: 2662 | version "1.1.1" 2663 | resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" 2664 | integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== 2665 | 2666 | to-object-path@^0.3.0: 2667 | version "0.3.0" 2668 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 2669 | integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 2670 | dependencies: 2671 | kind-of "^3.0.2" 2672 | 2673 | to-regex-range@^2.1.0: 2674 | version "2.1.1" 2675 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 2676 | integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 2677 | dependencies: 2678 | is-number "^3.0.0" 2679 | repeat-string "^1.6.1" 2680 | 2681 | to-regex@^3.0.1, to-regex@^3.0.2: 2682 | version "3.0.2" 2683 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 2684 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 2685 | dependencies: 2686 | define-property "^2.0.2" 2687 | extend-shallow "^3.0.2" 2688 | regex-not "^1.0.2" 2689 | safe-regex "^1.1.0" 2690 | 2691 | trim-repeated@^1.0.0: 2692 | version "1.0.0" 2693 | resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" 2694 | integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= 2695 | dependencies: 2696 | escape-string-regexp "^1.0.2" 2697 | 2698 | tunnel-agent@^0.6.0: 2699 | version "0.6.0" 2700 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2701 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 2702 | dependencies: 2703 | safe-buffer "^5.0.1" 2704 | 2705 | type@^1.0.1: 2706 | version "1.0.1" 2707 | resolved "https://registry.yarnpkg.com/type/-/type-1.0.1.tgz#084c9a17fcc9151a2cdb1459905c2e45e4bb7d61" 2708 | integrity sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw== 2709 | 2710 | typedarray@^0.0.6: 2711 | version "0.0.6" 2712 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2713 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 2714 | 2715 | unbzip2-stream@^1.0.9: 2716 | version "1.3.3" 2717 | resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a" 2718 | integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg== 2719 | dependencies: 2720 | buffer "^5.2.1" 2721 | through "^2.3.8" 2722 | 2723 | union-value@^1.0.0: 2724 | version "1.0.0" 2725 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 2726 | integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= 2727 | dependencies: 2728 | arr-union "^3.1.0" 2729 | get-value "^2.0.6" 2730 | is-extendable "^0.1.1" 2731 | set-value "^0.4.3" 2732 | 2733 | unique-string@^1.0.0: 2734 | version "1.0.0" 2735 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 2736 | integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= 2737 | dependencies: 2738 | crypto-random-string "^1.0.0" 2739 | 2740 | unset-value@^1.0.0: 2741 | version "1.0.0" 2742 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 2743 | integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 2744 | dependencies: 2745 | has-value "^0.3.1" 2746 | isobject "^3.0.0" 2747 | 2748 | untildify@^3.0.3: 2749 | version "3.0.3" 2750 | resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" 2751 | integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== 2752 | 2753 | unzip-response@^2.0.1: 2754 | version "2.0.1" 2755 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 2756 | integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= 2757 | 2758 | update-notifier@^2.2.0: 2759 | version "2.5.0" 2760 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" 2761 | integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== 2762 | dependencies: 2763 | boxen "^1.2.1" 2764 | chalk "^2.0.1" 2765 | configstore "^3.0.0" 2766 | import-lazy "^2.1.0" 2767 | is-ci "^1.0.10" 2768 | is-installed-globally "^0.1.0" 2769 | is-npm "^1.0.0" 2770 | latest-version "^3.0.0" 2771 | semver-diff "^2.0.0" 2772 | xdg-basedir "^3.0.0" 2773 | 2774 | uri-js@^3.0.2: 2775 | version "3.0.2" 2776 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-3.0.2.tgz#f90b858507f81dea4dcfbb3c4c3dbfa2b557faaa" 2777 | integrity sha1-+QuFhQf4HepNz7s8TD2/orVX+qo= 2778 | dependencies: 2779 | punycode "^2.1.0" 2780 | 2781 | urix@^0.1.0: 2782 | version "0.1.0" 2783 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 2784 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 2785 | 2786 | url-parse-lax@^1.0.0: 2787 | version "1.0.0" 2788 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 2789 | integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= 2790 | dependencies: 2791 | prepend-http "^1.0.1" 2792 | 2793 | url-to-options@^1.0.1: 2794 | version "1.0.1" 2795 | resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" 2796 | integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= 2797 | 2798 | url@0.10.3: 2799 | version "0.10.3" 2800 | resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" 2801 | integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= 2802 | dependencies: 2803 | punycode "1.3.2" 2804 | querystring "0.2.0" 2805 | 2806 | use@^3.1.0: 2807 | version "3.1.1" 2808 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 2809 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 2810 | 2811 | util-deprecate@~1.0.1: 2812 | version "1.0.2" 2813 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2814 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2815 | 2816 | uuid@3.0.0: 2817 | version "3.0.0" 2818 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.0.tgz#6728fc0459c450d796a99c31837569bdf672d728" 2819 | integrity sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg= 2820 | 2821 | uuid@3.3.2: 2822 | version "3.3.2" 2823 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 2824 | integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 2825 | 2826 | uuid@^2.0.2: 2827 | version "2.0.3" 2828 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" 2829 | integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= 2830 | 2831 | walkdir@^0.0.11: 2832 | version "0.0.11" 2833 | resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" 2834 | integrity sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI= 2835 | 2836 | which@^1.2.9: 2837 | version "1.3.1" 2838 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2839 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2840 | dependencies: 2841 | isexe "^2.0.0" 2842 | 2843 | widest-line@^2.0.0: 2844 | version "2.0.1" 2845 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" 2846 | integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== 2847 | dependencies: 2848 | string-width "^2.1.1" 2849 | 2850 | wrappy@1: 2851 | version "1.0.2" 2852 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2853 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2854 | 2855 | write-file-atomic@^2.0.0, write-file-atomic@^2.1.0: 2856 | version "2.4.2" 2857 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" 2858 | integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== 2859 | dependencies: 2860 | graceful-fs "^4.1.11" 2861 | imurmurhash "^0.1.4" 2862 | signal-exit "^3.0.2" 2863 | 2864 | xdg-basedir@^3.0.0: 2865 | version "3.0.0" 2866 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 2867 | integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= 2868 | 2869 | xml2js@0.4.19: 2870 | version "0.4.19" 2871 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" 2872 | integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== 2873 | dependencies: 2874 | sax ">=0.6.0" 2875 | xmlbuilder "~9.0.1" 2876 | 2877 | xmlbuilder@~9.0.1: 2878 | version "9.0.7" 2879 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" 2880 | integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= 2881 | 2882 | xtend@^4.0.0: 2883 | version "4.0.1" 2884 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2885 | integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= 2886 | 2887 | yallist@^2.1.2: 2888 | version "2.1.2" 2889 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2890 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 2891 | 2892 | yaml-ast-parser@0.0.34: 2893 | version "0.0.34" 2894 | resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.34.tgz#d00f3cf9d773b7241409ae92a6740d1db19f49e6" 2895 | integrity sha1-0A88+ddztyQUCa6SpnQNHbGfSeY= 2896 | 2897 | yauzl@^2.4.2: 2898 | version "2.10.0" 2899 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 2900 | integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= 2901 | dependencies: 2902 | buffer-crc32 "~0.2.3" 2903 | fd-slicer "~1.1.0" 2904 | 2905 | zip-stream@^1.1.0: 2906 | version "1.2.0" 2907 | resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" 2908 | integrity sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ= 2909 | dependencies: 2910 | archiver-utils "^1.3.0" 2911 | compress-commons "^1.2.0" 2912 | lodash "^4.8.0" 2913 | readable-stream "^2.0.0" 2914 | --------------------------------------------------------------------------------