├── .npmignore ├── .idea └── serverless-cognito-add-custom-attributes.iml ├── .gitignore ├── .eslintrc ├── LICENSE ├── package.json ├── helperMethods.js ├── README.md ├── tests ├── loadCustomTest.js └── CognitoAddCustomAttributesPluginTest.js ├── index.js └── yarn.lock /.npmignore: -------------------------------------------------------------------------------- 1 | package-lock.json -------------------------------------------------------------------------------- /.idea/serverless-cognito-add-custom-attributes.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | 39 | #serverless 40 | .serverless 41 | .vscode/* 42 | !.vscode/extensions.json 43 | 44 | # Webstorm IDE 45 | .idea/ 46 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es6": true 6 | }, 7 | "parserOptions": { 8 | "ecmaVersion": 2017, 9 | "sourceType": "module" 10 | }, 11 | "rules": { 12 | "linebreak-style": [ "error", "unix" ], 13 | "quotes": [ "error", "single" ], 14 | "semi": [ "error", "always" ], 15 | "indent": [ "error", 2, { "SwitchCase": 1 } ], 16 | "lines-between-class-members": [ "error", "always" ], 17 | "no-unused-vars": ["warn", { "args": "none", "ignoreRestSiblings": true }], 18 | "no-undef": 1, 19 | "no-dupe-keys": "error", 20 | "no-const-assign": "warn", 21 | "no-this-before-super": "warn", 22 | "no-unreachable": "warn", 23 | "constructor-super": "warn", 24 | "valid-typeof": "warn", 25 | "space-before-blocks": "warn", 26 | "spaced-comment": "warn" 27 | }, 28 | "globals": { 29 | "describe": true, 30 | "test": true, 31 | "expect": true, 32 | "afterEach": true, 33 | "beforeEach": true, 34 | "afterAll": true, 35 | "beforeAll": true 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Wala 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "serverless-cognito-add-custom-attributes", 3 | "version": "0.3.0", 4 | "description": "Add custom attributes to an existing CloudFormation-managed CognitoUserPool and CognitoUserPoolClient without losing all your users.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha --recursive \"./tests/*.js\"", 8 | "lint": "eslint index.js helperMethods.js" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/michaelduminy/serverless-cognito-add-custom-attributes.git" 13 | }, 14 | "files": [ 15 | ".eslintrc", 16 | "helperMethods.js", 17 | "index.js", 18 | "LICENSE", 19 | "package.json", 20 | "README.md" 21 | ], 22 | "keywords": [ 23 | "serverless", 24 | "cognito" 25 | ], 26 | "author": "Michael Duminy (https://github.com/michaelduminy)", 27 | "license": "MIT", 28 | "maintainers": ["Jared Leonard (https://github.com/jmaleonard)"], 29 | "bugs": { 30 | "url": "https://github.com/michaelduminy/serverless-cognito-add-custom-attributes/issues" 31 | }, 32 | "homepage": "https://github.com/michaelduminy/serverless-cognito-add-custom-attributes#readme", 33 | "dependencies": { 34 | "lodash": "^4.17.10" 35 | }, 36 | "devDependencies": { 37 | "chai": "^4.1.2", 38 | "eslint": "^5.6.0", 39 | "eslint-config-standard": "^11.0.0", 40 | "eslint-plugin-import": "^2.12.0", 41 | "eslint-plugin-node": "^6.0.1", 42 | "eslint-plugin-promise": "^3.8.0", 43 | "eslint-plugin-standard": "^3.1.0", 44 | "mocha": "^5.2.0", 45 | "proxyquire": "^2.1.0", 46 | "sinon": "^6.3.3" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /helperMethods.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | 3 | const Params = { 4 | CognitoUserPoolIdOutputKey: 'CognitoUserPoolIdOutputKey', 5 | CustomAttributes: 'CustomAttributes', 6 | CognitoUserPoolClientIdOutputKey: 'CognitoUserPoolClientIdOutputKey', 7 | }; 8 | 9 | const describeStack = async (AWS) => { 10 | const response = await AWS.request('CloudFormation', 'describeStacks', { StackName: AWS.naming.getStackName() }); 11 | return _.first(response.Stacks); 12 | }; 13 | 14 | const loadCustom = (log, custom) => { 15 | let result = []; 16 | if (custom && custom.CognitoAddCustomAttributes) { 17 | 18 | if(Array.isArray(custom.CognitoAddCustomAttributes)) { 19 | custom.CognitoAddCustomAttributes.forEach(cognitoCustomAttributeMappingItem => { 20 | result.push(parseCustomItem(log, cognitoCustomAttributeMappingItem)); 21 | }); 22 | } else { 23 | result.push(parseCustomItem(log, custom.CognitoAddCustomAttributes)); 24 | } 25 | } 26 | 27 | return result; 28 | }; 29 | 30 | const parseCustomItem = (log, item) => { 31 | const result = {}; 32 | let skippingItem = false; 33 | 34 | const CognitoUserPoolIdOutputKey = _.get(item, Params.CognitoUserPoolIdOutputKey); 35 | const CustomAttributes = _.get(item, Params.CustomAttributes); 36 | const CognitoUserPoolClientIdOutputKey = _.get(item, Params.CognitoUserPoolClientIdOutputKey); 37 | 38 | if (!CognitoUserPoolIdOutputKey || !(typeof(CognitoUserPoolIdOutputKey) === 'string')) { 39 | log('CognitoUserPoolIdOutputKey is required.'); 40 | skippingItem = true; 41 | } else if (!CustomAttributes || !Array.isArray(CustomAttributes)) { 42 | log('CustomAttributes array is required.'); 43 | skippingItem = true; 44 | } else { 45 | result.CognitoUserPoolIdOutputKey = CognitoUserPoolIdOutputKey; 46 | result.CustomAttributes = CustomAttributes; 47 | result.CognitoUserPoolClientIdOutputKey = CognitoUserPoolClientIdOutputKey; 48 | } 49 | 50 | if(skippingItem) { 51 | log(`Custom Attribute is being skipped due to missing information. [CognitoUserPoolIdOutputKey: ${CognitoUserPoolIdOutputKey}] [CognitoUserPoolClientIdOutputKey: ${CognitoUserPoolClientIdOutputKey}]`); 52 | } 53 | 54 | return result; 55 | }; 56 | 57 | module.exports = { 58 | Params, 59 | loadCustom, 60 | describeStack 61 | }; 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![npm version](https://badge.fury.io/js/serverless-cognito-add-custom-attributes.svg)](https://badge.fury.io/js/serverless-cognito-add-custom-attributes) 2 | 3 | # serverless-cognito-add-custom-attributes 4 | 5 | This plugin allows you to add custom attributes to an existing CloudFormation-managed Cognito User Pool from serverless without losing all your users. At the time of writing (June 2018) CloudFormation doesn't know how to add custom attributes to a user pool without dropping and re-creating it, thus losing all your users. 6 | 7 | This plugin also adds the specified attributes to a User Pool Client, giving that client read and write permissions for the new attribute. 8 | 9 | # Requirements 10 | - Node 8+ 11 | - serverless 1+ 12 | 13 | # Usage 14 | 15 | Install `npm i serverless-cognito-add-custom-attributes`, then add `serverless-cognito-add-custom-attributes` to your serverless.yml `plugins` list. 16 | 17 | ```yml 18 | plugins: 19 | - serverless-cognito-add-custom-attributes 20 | 21 | custom: 22 | CognitoAddCustomAttributes: 23 | CognitoUserPoolIdOutputKey: "CognitoUserPoolApplicationUserPoolId" # The key of the outputted UserPool Ref 24 | CognitoUserPoolClientIdOutputKey: "CognitoUserPoolApplicationUserPoolClientId" # The key of the outputted UserPoolClient Ref 25 | CustomAttributes: 26 | - 27 | AttributeDataType: String 28 | DeveloperOnlyAttribute: False 29 | Mutable: True 30 | Name: "another" # this will end up being custom:another 31 | Required: False 32 | 33 | # Only add this if not already outputting the Cognito User Pool and Client IDs, otherwise, refer to the existing outputs in the custom:CognitoAddCustomAttributes section 34 | resources: 35 | Outputs: 36 | CognitoUserPoolApplicationUserPoolId: 37 | Value: 38 | Ref: CognitoUserPoolApplicationUserPool 39 | CognitoUserPoolApplicationUserPoolClientId: 40 | Value: 41 | Ref: CognitoUserPoolApplicationUserPoolClient 42 | ``` 43 | 44 | # Details 45 | 46 | 1. Output your UserPoolId via `resources.Outputs` 47 | 2. Output your UserPoolClientId via `resources.Outputs` 48 | 3. Add `CognitoAddCustomAttributes` to `custom` with the following structure: 49 | ```yml 50 | CognitoUserPoolIdOutputKey: "UserPool Output Key as a String" 51 | CognitoUserPoolClientIdOutputKey: "UserPoolClient Output Key as a String" 52 | CustomAttributes: 53 | - 54 | AttributeDataType: String 55 | DeveloperOnlyAttribute: False 56 | Mutable: True 57 | Name: "another" 58 | Required: False 59 | ``` 60 | 61 | Note: If you have multiple userPool-userPoolClients you can specify them as an array as well 62 | 63 | Example: 64 | ```yml 65 | plugins: 66 | - serverless-cognito-add-custom-attributes 67 | 68 | custom: 69 | CognitoAddCustomAttributes: 70 | - 71 | CognitoUserPoolIdOutputKey: "CognitoUserPoolApplicationUserPoolId" 72 | CognitoUserPoolClientIdOutputKey: "CognitoUserPoolApplicationUserPoolClientId" 73 | CustomAttributes: 74 | - 75 | AttributeDataType: String 76 | DeveloperOnlyAttribute: False 77 | Mutable: True 78 | Name: "another" # this will end up being custom:another 79 | Required: False 80 | - 81 | CognitoUserPoolIdOutputKey: "CognitoUserPoolApplicationUserPoolId" 82 | CognitoUserPoolClientIdOutputKey: "CognitoUserPoolApplicationUserPoolClientId2" 83 | CustomAttributes: 84 | - 85 | AttributeDataType: String 86 | DeveloperOnlyAttribute: False 87 | Mutable: True 88 | Name: "another" # this will end up being custom:another 89 | Required: False 90 | 91 | resources: 92 | Outputs: 93 | CognitoUserPoolApplicationUserPoolId: 94 | Value: 95 | Ref: CognitoUserPoolApplicationUserPool 96 | CognitoUserPoolApplicationUserPoolClientId: 97 | Value: 98 | Ref: CognitoUserPoolApplicationUserPoolClient 99 | CognitoUserPoolApplicationUserPoolClientId2: 100 | Value: 101 | Ref: CognitoUserPoolApplicationUserPoolClient2 102 | ``` 103 | 104 | 105 | 106 | The names of your attributes supplied here will appear as `custom:{name}` when deployed. 107 | 108 | For more information on the schema of attributes see: 109 | https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SchemaAttributeType.html 110 | -------------------------------------------------------------------------------- /tests/loadCustomTest.js: -------------------------------------------------------------------------------- 1 | const chai = require('chai'); 2 | const loadCustom = require('../helperMethods').loadCustom; 3 | 4 | const expect = chai.expect; 5 | 6 | describe('loadCustom', () => { 7 | 8 | it('should return empty array if CognitoAddCustomAttributes attribute is blank', () => { 9 | 10 | //Act 11 | const result = loadCustom(() => {}, null); 12 | 13 | //Assert 14 | expect(result).to.be.deep.equal([]); 15 | }); 16 | 17 | it('should return array with 1 entry if object is passed in', () => { 18 | //Arrange 19 | const custom = { 20 | CognitoAddCustomAttributes: { 21 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 22 | CustomAttributes: [ 23 | { 24 | AttributeDataType: 'String', 25 | DeveloperOnlyAttribute: false, 26 | Mutable: true, 27 | Name: "another", 28 | Required: false 29 | } 30 | ], 31 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 32 | } 33 | }; 34 | 35 | //Act 36 | const result = loadCustom(() => {}, custom); 37 | 38 | //Assert 39 | expect(result).to.be.deep.equal([ 40 | { 41 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 42 | CustomAttributes: [ 43 | { 44 | 'AttributeDataType': 'String', 45 | DeveloperOnlyAttribute: false, 46 | Mutable: true, 47 | Name: "another", 48 | Required: false 49 | } 50 | ], 51 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 52 | } 53 | ]); 54 | }); 55 | 56 | it('should return array with 1 entry if an array with one object is passed in', () => { 57 | //Arrange 58 | const custom = { 59 | CognitoAddCustomAttributes: [{ 60 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 61 | CustomAttributes: [ 62 | { 63 | AttributeDataType: 'String', 64 | DeveloperOnlyAttribute: false, 65 | Mutable: true, 66 | Name: "another", 67 | Required: false 68 | } 69 | ], 70 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 71 | }] 72 | }; 73 | 74 | //Act 75 | const result = loadCustom(() => {}, custom); 76 | 77 | //Assert 78 | expect(result).to.be.deep.equal([ 79 | { 80 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 81 | CustomAttributes: [ 82 | { 83 | AttributeDataType: 'String', 84 | DeveloperOnlyAttribute: false, 85 | Mutable: true, 86 | Name: "another", 87 | Required: false 88 | } 89 | ], 90 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 91 | } 92 | ]); 93 | }); 94 | 95 | it('should return array with 2 entries if an array with two objects is passed in', () => { 96 | //Arrange 97 | const custom = { 98 | CognitoAddCustomAttributes: [ 99 | { 100 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 101 | CustomAttributes: [ 102 | { 103 | AttributeDataType: 'String', 104 | DeveloperOnlyAttribute: false, 105 | Mutable: true, 106 | Name: "another", 107 | Required: false 108 | } 109 | ], 110 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 111 | }, 112 | { 113 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 114 | CustomAttributes: [ 115 | { 116 | AttributeDataType: 'String', 117 | DeveloperOnlyAttribute: false, 118 | Mutable: true, 119 | Name: "another", 120 | Required: false 121 | } 122 | ], 123 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_abcdsfadf' 124 | } 125 | ] 126 | }; 127 | 128 | //Act 129 | const result = loadCustom(() => {}, custom); 130 | 131 | //Assert 132 | expect(result).to.be.deep.equal([ 133 | { 134 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 135 | CustomAttributes: [ 136 | { 137 | AttributeDataType: 'String', 138 | DeveloperOnlyAttribute: false, 139 | Mutable: true, 140 | Name: "another", 141 | Required: false 142 | } 143 | ], 144 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 145 | }, 146 | { 147 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 148 | CustomAttributes: [ 149 | { 150 | AttributeDataType: 'String', 151 | DeveloperOnlyAttribute: false, 152 | Mutable: true, 153 | Name: "another", 154 | Required: false 155 | } 156 | ], 157 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_abcdsfadf' 158 | } 159 | ]); 160 | }); 161 | }); 162 | -------------------------------------------------------------------------------- /tests/CognitoAddCustomAttributesPluginTest.js: -------------------------------------------------------------------------------- 1 | const chai = require('chai'); 2 | const sinon = require('sinon'); 3 | const proxyquire = require('proxyquire'); 4 | 5 | const expect = chai.expect; 6 | 7 | 8 | describe('CognitoAddCustomAttributesPlugin', () => { 9 | let sandbox; 10 | let mocks; 11 | 12 | beforeEach(() => { 13 | sandbox = sinon.createSandbox(); 14 | 15 | mocks = { 16 | './helperMethods': { 17 | describeStack: sandbox.stub().resolves({}) 18 | } 19 | } 20 | }); 21 | 22 | afterEach(() => { 23 | sandbox.restore(); 24 | }); 25 | 26 | describe('run', () => { 27 | let CognitoAddCustomAttributesPlugin; 28 | beforeEach(() => { 29 | CognitoAddCustomAttributesPlugin = proxyquire.noCallThru()('../index.js', mocks); 30 | }); 31 | 32 | it('should call processCognitoCustomAttributeMapping once if custom is object', async () => { 33 | //Arrange 34 | const serverlessObject = { 35 | getProvider: () => {}, 36 | service: { 37 | custom: { 38 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 39 | CustomAttributes: [ 40 | { 41 | AttributeDataType: 'String', 42 | DeveloperOnlyAttribute: false, 43 | Mutable: true, 44 | Name: "another", 45 | Required: false 46 | } 47 | ], 48 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 49 | } 50 | } 51 | }; 52 | const instance = new CognitoAddCustomAttributesPlugin(serverlessObject, {}); 53 | instance.custom = { 54 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 55 | CustomAttributes: [ 56 | { 57 | AttributeDataType: 'String', 58 | DeveloperOnlyAttribute: false, 59 | Mutable: true, 60 | Name: "another", 61 | Required: false 62 | } 63 | ], 64 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 65 | }; 66 | instance.log = console.log; 67 | instance.processCognitoCustomAttributeMapping = sandbox.stub().resolves({}); 68 | 69 | //Act 70 | await instance.run(); 71 | 72 | //Assert 73 | expect(instance.processCognitoCustomAttributeMapping.calledOnce).to.be.true; 74 | }); 75 | 76 | it('should call processCognitoCustomAttributeMapping once if custom is array with 1 object', async () => { 77 | //Arrange 78 | const serverlessObject = { 79 | getProvider: () => {}, 80 | service: { 81 | custom: [{ 82 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 83 | CustomAttributes: [ 84 | { 85 | AttributeDataType: 'String', 86 | DeveloperOnlyAttribute: false, 87 | Mutable: true, 88 | Name: "another", 89 | Required: false 90 | } 91 | ], 92 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 93 | }] 94 | } 95 | }; 96 | const instance = new CognitoAddCustomAttributesPlugin(serverlessObject, {}); 97 | instance.custom = [{ 98 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 99 | CustomAttributes: [ 100 | { 101 | AttributeDataType: 'String', 102 | DeveloperOnlyAttribute: false, 103 | Mutable: true, 104 | Name: "another", 105 | Required: false 106 | } 107 | ], 108 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 109 | }]; 110 | instance.log = console.log; 111 | instance.processCognitoCustomAttributeMapping = sandbox.stub().resolves({}); 112 | 113 | //Act 114 | await instance.run(); 115 | 116 | //Assert 117 | expect(instance.processCognitoCustomAttributeMapping.calledOnce).to.be.true; 118 | }); 119 | 120 | it('should call processCognitoCustomAttributeMapping twice if custom is array with 2 object', async () => { 121 | //Arrange 122 | const serverlessObject = { 123 | getProvider: () => {}, 124 | service: { 125 | custom: [ 126 | { 127 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 128 | CustomAttributes: [ 129 | { 130 | AttributeDataType: 'String', 131 | DeveloperOnlyAttribute: false, 132 | Mutable: true, 133 | Name: "another", 134 | Required: false 135 | } 136 | ], 137 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 138 | }, 139 | { 140 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 141 | CustomAttributes: [ 142 | { 143 | AttributeDataType: 'String', 144 | DeveloperOnlyAttribute: false, 145 | Mutable: true, 146 | Name: "another", 147 | Required: false 148 | } 149 | ], 150 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_abafdsfdsa' 151 | } 152 | ] 153 | } 154 | }; 155 | const instance = new CognitoAddCustomAttributesPlugin(serverlessObject, {}); 156 | instance.custom = [ 157 | { 158 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 159 | CustomAttributes: [ 160 | { 161 | AttributeDataType: 'String', 162 | DeveloperOnlyAttribute: false, 163 | Mutable: true, 164 | Name: "another", 165 | Required: false 166 | } 167 | ], 168 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 169 | }, 170 | { 171 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 172 | CustomAttributes: [ 173 | { 174 | AttributeDataType: 'String', 175 | DeveloperOnlyAttribute: false, 176 | Mutable: true, 177 | Name: "another", 178 | Required: false 179 | } 180 | ], 181 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_abafdsfdsa' 182 | } 183 | ]; 184 | instance.log = console.log; 185 | instance.processCognitoCustomAttributeMapping = sandbox.stub().resolves({}); 186 | 187 | //Act 188 | await instance.run(); 189 | 190 | //Assert 191 | expect(instance.processCognitoCustomAttributeMapping.callCount).to.be.equal(2); 192 | }); 193 | 194 | it('should call processCognitoCustomAttributeMapping once if custom is array with 2 object with empty object ', async () => { 195 | //Arrange 196 | const serverlessObject = { 197 | getProvider: () => {}, 198 | service: { 199 | custom: [ 200 | { 201 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 202 | CustomAttributes: [ 203 | { 204 | AttributeDataType: 'String', 205 | DeveloperOnlyAttribute: false, 206 | Mutable: true, 207 | Name: "another", 208 | Required: false 209 | } 210 | ], 211 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 212 | }, 213 | { 214 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 215 | CustomAttributes: [ 216 | { 217 | AttributeDataType: 'String', 218 | DeveloperOnlyAttribute: false, 219 | Mutable: true, 220 | Name: "another", 221 | Required: false 222 | } 223 | ], 224 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_abafdsfdsa' 225 | } 226 | ] 227 | } 228 | }; 229 | const instance = new CognitoAddCustomAttributesPlugin(serverlessObject, {}); 230 | instance.custom = [ 231 | { 232 | CognitoUserPoolIdOutputKey: 'userPoolId_12312321321', 233 | CustomAttributes: [ 234 | { 235 | AttributeDataType: 'String', 236 | DeveloperOnlyAttribute: false, 237 | Mutable: true, 238 | Name: "another", 239 | Required: false 240 | } 241 | ], 242 | CognitoUserPoolClientIdOutputKey: 'userPoolClient_12312321312' 243 | }, 244 | {} 245 | ]; 246 | instance.log = console.log; 247 | instance.processCognitoCustomAttributeMapping = sandbox.stub().resolves({}); 248 | 249 | //Act 250 | await instance.run(); 251 | 252 | //Assert 253 | expect(instance.processCognitoCustomAttributeMapping.callCount).to.be.equal(1); 254 | }); 255 | }); 256 | }); 257 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const helperMethods = require('./helperMethods'); 3 | 4 | const Name = 'CognitoAddCustomAttributesPlugin'; 5 | 6 | const loadCustom = helperMethods.loadCustom; 7 | const Params = helperMethods.Params; 8 | const describeStack = helperMethods.describeStack; 9 | 10 | class CognitoAddCustomAttributesPluginError extends Error { 11 | constructor(error, innerMessage) { 12 | super(error.message); 13 | this.name = 'CognitoAddCustomAttributesPluginError'; 14 | 15 | this.innerMessage = innerMessage; 16 | Error.captureStackTrace(error, CognitoAddCustomAttributesPluginError); 17 | } 18 | } 19 | 20 | const findOutputId = (custom, stack, outputKey) => { 21 | if (stack) { 22 | const output = _.find( 23 | stack.Outputs, 24 | (output) => output.OutputKey === custom[outputKey] 25 | ); 26 | if (output) { 27 | const outputId = _.get(output, 'OutputValue'); 28 | return outputId; 29 | } else { 30 | throw new Error(`Could not find ${outputKey} in Outputs for stack.`); 31 | } 32 | } 33 | }; 34 | 35 | const describeCognitoUserPool = async (AWS, userPoolId) => { 36 | try { 37 | const describeParams = { 38 | UserPoolId: userPoolId 39 | }; 40 | 41 | const response = await AWS.request( 42 | 'CognitoIdentityServiceProvider', 43 | 'describeUserPool', 44 | describeParams 45 | ); 46 | return response.UserPool; 47 | } catch (error) { 48 | throw new CognitoAddCustomAttributesPluginError( 49 | error, 50 | 'Error occurred when fetching UserPool' 51 | ); 52 | } 53 | }; 54 | 55 | const describeCognitoUserPoolClient = async ( 56 | AWS, 57 | userPoolId, 58 | userPoolClientId 59 | ) => { 60 | try { 61 | const describeParams = { 62 | ClientId: userPoolClientId, 63 | UserPoolId: userPoolId 64 | }; 65 | 66 | const response = await AWS.request( 67 | 'CognitoIdentityServiceProvider', 68 | 'describeUserPoolClient', 69 | describeParams 70 | ); 71 | return response.UserPoolClient; 72 | } catch (error) { 73 | throw new CognitoAddCustomAttributesPluginError( 74 | error, 75 | 'Error occurred when fetching UserPoolClient' 76 | ); 77 | } 78 | }; 79 | 80 | const transformAttributeName = (name) => { 81 | let customName = name; 82 | if (!_.startsWith(customName, 'custom:')) { 83 | customName = `custom:${customName}`; 84 | } 85 | return customName; 86 | }; 87 | 88 | const getMissingAttributes = (newAttributes, existingAttributeNames) => { 89 | return _.filter(newAttributes, (newAttribute) => { 90 | let customName = transformAttributeName(newAttribute.Name); 91 | 92 | const exists = _.some( 93 | existingAttributeNames, 94 | (existingName) => existingName == customName 95 | ); 96 | return !exists; 97 | }); 98 | }; 99 | 100 | const addNewCustomAttributesToUserPool = async ( 101 | AWS, 102 | log, 103 | userPoolId, 104 | newAttributes 105 | ) => { 106 | if (!_.isEmpty(newAttributes)) { 107 | try { 108 | const addCustomAttributesParams = { 109 | UserPoolId: userPoolId, 110 | CustomAttributes: newAttributes 111 | }; 112 | 113 | log( 114 | `Adding ${newAttributes.length} attribute(s) to pool: ${_.join( 115 | _.map(newAttributes, (x) => x.Name) 116 | )}` 117 | ); 118 | 119 | await AWS.request( 120 | 'CognitoIdentityServiceProvider', 121 | 'addCustomAttributes', 122 | addCustomAttributesParams 123 | ); 124 | log('Successfully added attributes to pool'); 125 | } catch (error) { 126 | throw new CognitoAddCustomAttributesPluginError( 127 | error, 128 | 'Error occurred when adding attributes to pool' 129 | ); 130 | } 131 | } else { 132 | return log('Supplied attributes already exist in pool'); 133 | } 134 | }; 135 | 136 | const updateUserPoolClient = async ( 137 | AWS, 138 | log, 139 | userPoolClient, 140 | readAttributes, 141 | writeAttributes 142 | ) => { 143 | if (readAttributes.length + writeAttributes.length > 0) { 144 | const readAttributeNames = _.map(readAttributes, (x) => 145 | transformAttributeName(x.Name) 146 | ); 147 | const writeAttributeNames = _.map(writeAttributes, (x) => 148 | transformAttributeName(x.Name) 149 | ); 150 | 151 | try { 152 | let sanitisedUserPoolClient = _.omit(userPoolClient, ['ClientSecret', 'CreationDate', 'LastModifiedDate']); 153 | 154 | let params = Object.assign({}, sanitisedUserPoolClient, { 155 | ReadAttributes: _.concat( 156 | userPoolClient.ReadAttributes, 157 | readAttributeNames 158 | ), 159 | WriteAttributes: _.concat( 160 | userPoolClient.WriteAttributes, 161 | writeAttributeNames 162 | ) 163 | }) 164 | 165 | if (readAttributeNames.length > 0) { 166 | log( 167 | `Enabling client to read from ${ 168 | readAttributeNames.length 169 | } new attribute(s): ${_.join(readAttributeNames)}` 170 | ); 171 | } 172 | if (writeAttributeNames.length > 0) { 173 | log( 174 | `Enabling client to write to ${ 175 | writeAttributeNames.length 176 | } new attribute(s): ${_.join(writeAttributeNames)}` 177 | ); 178 | } 179 | 180 | await AWS.request( 181 | 'CognitoIdentityServiceProvider', 182 | 'updateUserPoolClient', 183 | params 184 | ); 185 | log('Successfully updated client'); 186 | } catch (error) { 187 | throw new CognitoAddCustomAttributesPluginError( 188 | error, 189 | 'Error occurred when updating client' 190 | ); 191 | } 192 | } else { 193 | return log('No update required to UserPoolClient'); 194 | } 195 | }; 196 | 197 | class CognitoAddCustomAttributesPlugin { 198 | constructor(serverless, options) { 199 | this.serverless = serverless; 200 | this.options = options; 201 | this.provider = serverless.getProvider('aws'); 202 | 203 | this.hooks = { 204 | 'after:deploy:deploy': this.postDeploy.bind(this) 205 | }; 206 | 207 | this.log = this.log.bind(this); 208 | this.run = this.run.bind(this); 209 | } 210 | 211 | async postDeploy() { 212 | this.custom = loadCustom(this.log, this.serverless.service.custom); 213 | 214 | await this.run(); 215 | } 216 | 217 | async run() { 218 | const { provider: AWS, custom, log } = this; 219 | 220 | try { 221 | log('Start'); 222 | 223 | const stack = await describeStack(AWS); 224 | 225 | if (Array.isArray(custom)) { 226 | await Promise.all( 227 | custom.map((mappingItem) => 228 | (async () => { 229 | // skip empty mapping items 230 | if (_.isEmpty(mappingItem)) { 231 | return; 232 | } 233 | 234 | // if we run more than one at a time, there is a chance for a race condition on creating 235 | // the customAttribute on the userPool the first time 236 | await this.processCognitoCustomAttributeMapping( 237 | stack, 238 | mappingItem 239 | ); 240 | })() 241 | ) 242 | ); 243 | } else { 244 | await this.processCognitoCustomAttributeMapping(stack, custom); 245 | } 246 | 247 | log('End'); 248 | } catch (error) { 249 | log(`run Error [Message: ${error.message}]`); 250 | if (error.innerMessage) log(`${error.innerMessage}. ${error}`); 251 | throw error; 252 | } 253 | } 254 | 255 | async processCognitoCustomAttributeMapping(stack, mappingItem) { 256 | const { log, provider: AWS } = this; 257 | 258 | const userPoolId = findOutputId( 259 | mappingItem, 260 | stack, 261 | Params.CognitoUserPoolIdOutputKey 262 | ); 263 | log(`Found userPoolId: ${userPoolId}`); 264 | 265 | const userPool = await describeCognitoUserPool(AWS, userPoolId); 266 | 267 | const newAttributes = getMissingAttributes( 268 | mappingItem.CustomAttributes, 269 | _.map(userPool.SchemaAttributes, 'Name') 270 | ); 271 | await addNewCustomAttributesToUserPool(AWS, log, userPoolId, newAttributes); 272 | 273 | if ( typeof _.get(mappingItem, Params.CognitoUserPoolClientIdOutputKey) !== 'undefined' ) { 274 | const userPoolClientId = await findOutputId( 275 | mappingItem, 276 | stack, 277 | Params.CognitoUserPoolClientIdOutputKey 278 | ); 279 | 280 | log(`Found userPoolClientId: ${userPoolClientId}`); 281 | 282 | const userPoolClient = await describeCognitoUserPoolClient( 283 | AWS, 284 | userPoolId, 285 | userPoolClientId 286 | ); 287 | 288 | const newReadAttributes = getMissingAttributes( 289 | mappingItem.CustomAttributes, 290 | userPoolClient.ReadAttributes 291 | ); 292 | const newWriteAttributes = getMissingAttributes( 293 | mappingItem.CustomAttributes, 294 | userPoolClient.WriteAttributes 295 | ); 296 | await updateUserPoolClient( 297 | AWS, 298 | log, 299 | userPoolClient, 300 | newReadAttributes, 301 | newWriteAttributes 302 | ); 303 | } 304 | else { 305 | log('No param for UserPoolClient found. Will not update any UserPoolClient permissions!'); 306 | } 307 | } 308 | 309 | log(message) { 310 | this.serverless.cli.log(`${Name}: ${message}`); 311 | } 312 | } 313 | 314 | module.exports = CognitoAddCustomAttributesPlugin; 315 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.10.4" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" 8 | integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/helper-validator-identifier@^7.10.4": 13 | version "7.10.4" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" 15 | integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== 16 | 17 | "@babel/highlight@^7.10.4": 18 | version "7.10.4" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" 20 | integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.10.4" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@sinonjs/commons@^1", "@sinonjs/commons@^1.0.2", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.7.0": 27 | version "1.8.0" 28 | resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" 29 | integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== 30 | dependencies: 31 | type-detect "4.0.8" 32 | 33 | "@sinonjs/formatio@^3.0.0", "@sinonjs/formatio@^3.2.1": 34 | version "3.2.2" 35 | resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" 36 | integrity sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== 37 | dependencies: 38 | "@sinonjs/commons" "^1" 39 | "@sinonjs/samsam" "^3.1.0" 40 | 41 | "@sinonjs/samsam@^2.1.2": 42 | version "2.1.3" 43 | resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-2.1.3.tgz#62cf2a9b624edc795134135fe37fc2ae8ea36be3" 44 | integrity sha512-8zNeBkSKhU9a5cRNbpCKau2WWPfan+Q2zDlcXvXyhn9EsMqgYs4qzo0XHNVlXC6ABQL8fT6nV+zzo5RTHJzyXw== 45 | 46 | "@sinonjs/samsam@^3.1.0": 47 | version "3.3.3" 48 | resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" 49 | integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== 50 | dependencies: 51 | "@sinonjs/commons" "^1.3.0" 52 | array-from "^2.1.1" 53 | lodash "^4.17.15" 54 | 55 | "@sinonjs/text-encoding@^0.7.1": 56 | version "0.7.1" 57 | resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" 58 | integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== 59 | 60 | "@types/json5@^0.0.29": 61 | version "0.0.29" 62 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 63 | integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= 64 | 65 | acorn-jsx@^5.0.0: 66 | version "5.2.0" 67 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" 68 | integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== 69 | 70 | acorn@^6.0.7: 71 | version "6.4.1" 72 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" 73 | integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== 74 | 75 | ajv@^6.10.2, ajv@^6.9.1: 76 | version "6.12.2" 77 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" 78 | integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== 79 | dependencies: 80 | fast-deep-equal "^3.1.1" 81 | fast-json-stable-stringify "^2.0.0" 82 | json-schema-traverse "^0.4.1" 83 | uri-js "^4.2.2" 84 | 85 | ansi-escapes@^3.2.0: 86 | version "3.2.0" 87 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" 88 | integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== 89 | 90 | ansi-regex@^3.0.0: 91 | version "3.0.0" 92 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 93 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 94 | 95 | ansi-regex@^4.1.0: 96 | version "4.1.0" 97 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 98 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 99 | 100 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 101 | version "3.2.1" 102 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 103 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 104 | dependencies: 105 | color-convert "^1.9.0" 106 | 107 | argparse@^1.0.7: 108 | version "1.0.10" 109 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 110 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 111 | dependencies: 112 | sprintf-js "~1.0.2" 113 | 114 | array-from@^2.1.1: 115 | version "2.1.1" 116 | resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" 117 | integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= 118 | 119 | array-includes@^3.1.1: 120 | version "3.1.1" 121 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" 122 | integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== 123 | dependencies: 124 | define-properties "^1.1.3" 125 | es-abstract "^1.17.0" 126 | is-string "^1.0.5" 127 | 128 | array.prototype.flat@^1.2.3: 129 | version "1.2.3" 130 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" 131 | integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== 132 | dependencies: 133 | define-properties "^1.1.3" 134 | es-abstract "^1.17.0-next.1" 135 | 136 | assertion-error@^1.1.0: 137 | version "1.1.0" 138 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 139 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 140 | 141 | astral-regex@^1.0.0: 142 | version "1.0.0" 143 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 144 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 145 | 146 | balanced-match@^1.0.0: 147 | version "1.0.0" 148 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 149 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 150 | 151 | brace-expansion@^1.1.7: 152 | version "1.1.11" 153 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 154 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 155 | dependencies: 156 | balanced-match "^1.0.0" 157 | concat-map "0.0.1" 158 | 159 | browser-stdout@1.3.1: 160 | version "1.3.1" 161 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 162 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 163 | 164 | callsites@^3.0.0: 165 | version "3.1.0" 166 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 167 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 168 | 169 | chai@^4.1.2: 170 | version "4.2.0" 171 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" 172 | integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== 173 | dependencies: 174 | assertion-error "^1.1.0" 175 | check-error "^1.0.2" 176 | deep-eql "^3.0.1" 177 | get-func-name "^2.0.0" 178 | pathval "^1.1.0" 179 | type-detect "^4.0.5" 180 | 181 | chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: 182 | version "2.4.2" 183 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 184 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 185 | dependencies: 186 | ansi-styles "^3.2.1" 187 | escape-string-regexp "^1.0.5" 188 | supports-color "^5.3.0" 189 | 190 | chardet@^0.7.0: 191 | version "0.7.0" 192 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 193 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 194 | 195 | check-error@^1.0.2: 196 | version "1.0.2" 197 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 198 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 199 | 200 | cli-cursor@^2.1.0: 201 | version "2.1.0" 202 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 203 | integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= 204 | dependencies: 205 | restore-cursor "^2.0.0" 206 | 207 | cli-width@^2.0.0: 208 | version "2.2.1" 209 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" 210 | integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== 211 | 212 | color-convert@^1.9.0: 213 | version "1.9.3" 214 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 215 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 216 | dependencies: 217 | color-name "1.1.3" 218 | 219 | color-name@1.1.3: 220 | version "1.1.3" 221 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 222 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 223 | 224 | commander@2.15.1: 225 | version "2.15.1" 226 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" 227 | integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== 228 | 229 | concat-map@0.0.1: 230 | version "0.0.1" 231 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 232 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 233 | 234 | contains-path@^0.1.0: 235 | version "0.1.0" 236 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 237 | integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= 238 | 239 | cross-spawn@^6.0.5: 240 | version "6.0.5" 241 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 242 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 243 | dependencies: 244 | nice-try "^1.0.4" 245 | path-key "^2.0.1" 246 | semver "^5.5.0" 247 | shebang-command "^1.2.0" 248 | which "^1.2.9" 249 | 250 | debug@3.1.0: 251 | version "3.1.0" 252 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 253 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 254 | dependencies: 255 | ms "2.0.0" 256 | 257 | debug@^2.6.9: 258 | version "2.6.9" 259 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 260 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 261 | dependencies: 262 | ms "2.0.0" 263 | 264 | debug@^4.0.1: 265 | version "4.1.1" 266 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 267 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 268 | dependencies: 269 | ms "^2.1.1" 270 | 271 | deep-eql@^3.0.1: 272 | version "3.0.1" 273 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 274 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 275 | dependencies: 276 | type-detect "^4.0.0" 277 | 278 | deep-is@~0.1.3: 279 | version "0.1.3" 280 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 281 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 282 | 283 | define-properties@^1.1.2, define-properties@^1.1.3: 284 | version "1.1.3" 285 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 286 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 287 | dependencies: 288 | object-keys "^1.0.12" 289 | 290 | diff@3.5.0, diff@^3.5.0: 291 | version "3.5.0" 292 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 293 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 294 | 295 | doctrine@1.5.0: 296 | version "1.5.0" 297 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 298 | integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= 299 | dependencies: 300 | esutils "^2.0.2" 301 | isarray "^1.0.0" 302 | 303 | doctrine@^3.0.0: 304 | version "3.0.0" 305 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 306 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 307 | dependencies: 308 | esutils "^2.0.2" 309 | 310 | emoji-regex@^7.0.1: 311 | version "7.0.3" 312 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 313 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 314 | 315 | error-ex@^1.2.0: 316 | version "1.3.2" 317 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 318 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 319 | dependencies: 320 | is-arrayish "^0.2.1" 321 | 322 | es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: 323 | version "1.17.6" 324 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" 325 | integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== 326 | dependencies: 327 | es-to-primitive "^1.2.1" 328 | function-bind "^1.1.1" 329 | has "^1.0.3" 330 | has-symbols "^1.0.1" 331 | is-callable "^1.2.0" 332 | is-regex "^1.1.0" 333 | object-inspect "^1.7.0" 334 | object-keys "^1.1.1" 335 | object.assign "^4.1.0" 336 | string.prototype.trimend "^1.0.1" 337 | string.prototype.trimstart "^1.0.1" 338 | 339 | es-to-primitive@^1.2.1: 340 | version "1.2.1" 341 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 342 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 343 | dependencies: 344 | is-callable "^1.1.4" 345 | is-date-object "^1.0.1" 346 | is-symbol "^1.0.2" 347 | 348 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 349 | version "1.0.5" 350 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 351 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 352 | 353 | eslint-config-standard@^11.0.0: 354 | version "11.0.0" 355 | resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz#87ee0d3c9d95382dc761958cbb23da9eea31e0ba" 356 | integrity sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw== 357 | 358 | eslint-import-resolver-node@^0.3.3: 359 | version "0.3.4" 360 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" 361 | integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== 362 | dependencies: 363 | debug "^2.6.9" 364 | resolve "^1.13.1" 365 | 366 | eslint-module-utils@^2.6.0: 367 | version "2.6.0" 368 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" 369 | integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== 370 | dependencies: 371 | debug "^2.6.9" 372 | pkg-dir "^2.0.0" 373 | 374 | eslint-plugin-import@^2.12.0: 375 | version "2.22.0" 376 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" 377 | integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== 378 | dependencies: 379 | array-includes "^3.1.1" 380 | array.prototype.flat "^1.2.3" 381 | contains-path "^0.1.0" 382 | debug "^2.6.9" 383 | doctrine "1.5.0" 384 | eslint-import-resolver-node "^0.3.3" 385 | eslint-module-utils "^2.6.0" 386 | has "^1.0.3" 387 | minimatch "^3.0.4" 388 | object.values "^1.1.1" 389 | read-pkg-up "^2.0.0" 390 | resolve "^1.17.0" 391 | tsconfig-paths "^3.9.0" 392 | 393 | eslint-plugin-node@^6.0.1: 394 | version "6.0.1" 395 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" 396 | integrity sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw== 397 | dependencies: 398 | ignore "^3.3.6" 399 | minimatch "^3.0.4" 400 | resolve "^1.3.3" 401 | semver "^5.4.1" 402 | 403 | eslint-plugin-promise@^3.8.0: 404 | version "3.8.0" 405 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz#65ebf27a845e3c1e9d6f6a5622ddd3801694b621" 406 | integrity sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ== 407 | 408 | eslint-plugin-standard@^3.1.0: 409 | version "3.1.0" 410 | resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz#2a9e21259ba4c47c02d53b2d0c9135d4b1022d47" 411 | integrity sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w== 412 | 413 | eslint-scope@^4.0.3: 414 | version "4.0.3" 415 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" 416 | integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== 417 | dependencies: 418 | esrecurse "^4.1.0" 419 | estraverse "^4.1.1" 420 | 421 | eslint-utils@^1.3.1: 422 | version "1.4.3" 423 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" 424 | integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== 425 | dependencies: 426 | eslint-visitor-keys "^1.1.0" 427 | 428 | eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: 429 | version "1.3.0" 430 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 431 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 432 | 433 | eslint@^5.6.0: 434 | version "5.16.0" 435 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" 436 | integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== 437 | dependencies: 438 | "@babel/code-frame" "^7.0.0" 439 | ajv "^6.9.1" 440 | chalk "^2.1.0" 441 | cross-spawn "^6.0.5" 442 | debug "^4.0.1" 443 | doctrine "^3.0.0" 444 | eslint-scope "^4.0.3" 445 | eslint-utils "^1.3.1" 446 | eslint-visitor-keys "^1.0.0" 447 | espree "^5.0.1" 448 | esquery "^1.0.1" 449 | esutils "^2.0.2" 450 | file-entry-cache "^5.0.1" 451 | functional-red-black-tree "^1.0.1" 452 | glob "^7.1.2" 453 | globals "^11.7.0" 454 | ignore "^4.0.6" 455 | import-fresh "^3.0.0" 456 | imurmurhash "^0.1.4" 457 | inquirer "^6.2.2" 458 | js-yaml "^3.13.0" 459 | json-stable-stringify-without-jsonify "^1.0.1" 460 | levn "^0.3.0" 461 | lodash "^4.17.11" 462 | minimatch "^3.0.4" 463 | mkdirp "^0.5.1" 464 | natural-compare "^1.4.0" 465 | optionator "^0.8.2" 466 | path-is-inside "^1.0.2" 467 | progress "^2.0.0" 468 | regexpp "^2.0.1" 469 | semver "^5.5.1" 470 | strip-ansi "^4.0.0" 471 | strip-json-comments "^2.0.1" 472 | table "^5.2.3" 473 | text-table "^0.2.0" 474 | 475 | espree@^5.0.1: 476 | version "5.0.1" 477 | resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" 478 | integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== 479 | dependencies: 480 | acorn "^6.0.7" 481 | acorn-jsx "^5.0.0" 482 | eslint-visitor-keys "^1.0.0" 483 | 484 | esprima@^4.0.0: 485 | version "4.0.1" 486 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 487 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 488 | 489 | esquery@^1.0.1: 490 | version "1.3.1" 491 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" 492 | integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== 493 | dependencies: 494 | estraverse "^5.1.0" 495 | 496 | esrecurse@^4.1.0: 497 | version "4.2.1" 498 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 499 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 500 | dependencies: 501 | estraverse "^4.1.0" 502 | 503 | estraverse@^4.1.0, estraverse@^4.1.1: 504 | version "4.3.0" 505 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 506 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 507 | 508 | estraverse@^5.1.0: 509 | version "5.1.0" 510 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" 511 | integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== 512 | 513 | esutils@^2.0.2: 514 | version "2.0.3" 515 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 516 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 517 | 518 | external-editor@^3.0.3: 519 | version "3.1.0" 520 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 521 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 522 | dependencies: 523 | chardet "^0.7.0" 524 | iconv-lite "^0.4.24" 525 | tmp "^0.0.33" 526 | 527 | fast-deep-equal@^3.1.1: 528 | version "3.1.3" 529 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 530 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 531 | 532 | fast-json-stable-stringify@^2.0.0: 533 | version "2.1.0" 534 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 535 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 536 | 537 | fast-levenshtein@~2.0.6: 538 | version "2.0.6" 539 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 540 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 541 | 542 | figures@^2.0.0: 543 | version "2.0.0" 544 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 545 | integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= 546 | dependencies: 547 | escape-string-regexp "^1.0.5" 548 | 549 | file-entry-cache@^5.0.1: 550 | version "5.0.1" 551 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 552 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 553 | dependencies: 554 | flat-cache "^2.0.1" 555 | 556 | fill-keys@^1.0.2: 557 | version "1.0.2" 558 | resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" 559 | integrity sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA= 560 | dependencies: 561 | is-object "~1.0.1" 562 | merge-descriptors "~1.0.0" 563 | 564 | find-up@^2.0.0, find-up@^2.1.0: 565 | version "2.1.0" 566 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 567 | integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= 568 | dependencies: 569 | locate-path "^2.0.0" 570 | 571 | flat-cache@^2.0.1: 572 | version "2.0.1" 573 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 574 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 575 | dependencies: 576 | flatted "^2.0.0" 577 | rimraf "2.6.3" 578 | write "1.0.3" 579 | 580 | flatted@^2.0.0: 581 | version "2.0.2" 582 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" 583 | integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== 584 | 585 | fs.realpath@^1.0.0: 586 | version "1.0.0" 587 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 588 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 589 | 590 | function-bind@^1.1.1: 591 | version "1.1.1" 592 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 593 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 594 | 595 | functional-red-black-tree@^1.0.1: 596 | version "1.0.1" 597 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 598 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 599 | 600 | get-func-name@^2.0.0: 601 | version "2.0.0" 602 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 603 | integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 604 | 605 | glob@7.1.2: 606 | version "7.1.2" 607 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 608 | integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== 609 | dependencies: 610 | fs.realpath "^1.0.0" 611 | inflight "^1.0.4" 612 | inherits "2" 613 | minimatch "^3.0.4" 614 | once "^1.3.0" 615 | path-is-absolute "^1.0.0" 616 | 617 | glob@^7.1.2, glob@^7.1.3: 618 | version "7.1.6" 619 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 620 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 621 | dependencies: 622 | fs.realpath "^1.0.0" 623 | inflight "^1.0.4" 624 | inherits "2" 625 | minimatch "^3.0.4" 626 | once "^1.3.0" 627 | path-is-absolute "^1.0.0" 628 | 629 | globals@^11.7.0: 630 | version "11.12.0" 631 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 632 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 633 | 634 | graceful-fs@^4.1.2: 635 | version "4.2.4" 636 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 637 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 638 | 639 | growl@1.10.5: 640 | version "1.10.5" 641 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 642 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 643 | 644 | has-flag@^3.0.0: 645 | version "3.0.0" 646 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 647 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 648 | 649 | has-symbols@^1.0.0, has-symbols@^1.0.1: 650 | version "1.0.1" 651 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 652 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 653 | 654 | has@^1.0.3: 655 | version "1.0.3" 656 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 657 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 658 | dependencies: 659 | function-bind "^1.1.1" 660 | 661 | he@1.1.1: 662 | version "1.1.1" 663 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 664 | integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= 665 | 666 | hosted-git-info@^2.1.4: 667 | version "2.8.8" 668 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" 669 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== 670 | 671 | iconv-lite@^0.4.24: 672 | version "0.4.24" 673 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 674 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 675 | dependencies: 676 | safer-buffer ">= 2.1.2 < 3" 677 | 678 | ignore@^3.3.6: 679 | version "3.3.10" 680 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" 681 | integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== 682 | 683 | ignore@^4.0.6: 684 | version "4.0.6" 685 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 686 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 687 | 688 | import-fresh@^3.0.0: 689 | version "3.2.1" 690 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" 691 | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== 692 | dependencies: 693 | parent-module "^1.0.0" 694 | resolve-from "^4.0.0" 695 | 696 | imurmurhash@^0.1.4: 697 | version "0.1.4" 698 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 699 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 700 | 701 | inflight@^1.0.4: 702 | version "1.0.6" 703 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 704 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 705 | dependencies: 706 | once "^1.3.0" 707 | wrappy "1" 708 | 709 | inherits@2: 710 | version "2.0.4" 711 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 712 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 713 | 714 | inquirer@^6.2.2: 715 | version "6.5.2" 716 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" 717 | integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== 718 | dependencies: 719 | ansi-escapes "^3.2.0" 720 | chalk "^2.4.2" 721 | cli-cursor "^2.1.0" 722 | cli-width "^2.0.0" 723 | external-editor "^3.0.3" 724 | figures "^2.0.0" 725 | lodash "^4.17.12" 726 | mute-stream "0.0.7" 727 | run-async "^2.2.0" 728 | rxjs "^6.4.0" 729 | string-width "^2.1.0" 730 | strip-ansi "^5.1.0" 731 | through "^2.3.6" 732 | 733 | is-arrayish@^0.2.1: 734 | version "0.2.1" 735 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 736 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 737 | 738 | is-callable@^1.1.4, is-callable@^1.2.0: 739 | version "1.2.0" 740 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" 741 | integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== 742 | 743 | is-date-object@^1.0.1: 744 | version "1.0.2" 745 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 746 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 747 | 748 | is-fullwidth-code-point@^2.0.0: 749 | version "2.0.0" 750 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 751 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 752 | 753 | is-object@~1.0.1: 754 | version "1.0.1" 755 | resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" 756 | integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= 757 | 758 | is-regex@^1.1.0: 759 | version "1.1.0" 760 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" 761 | integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== 762 | dependencies: 763 | has-symbols "^1.0.1" 764 | 765 | is-string@^1.0.5: 766 | version "1.0.5" 767 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 768 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== 769 | 770 | is-symbol@^1.0.2: 771 | version "1.0.3" 772 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 773 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 774 | dependencies: 775 | has-symbols "^1.0.1" 776 | 777 | isarray@0.0.1: 778 | version "0.0.1" 779 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 780 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 781 | 782 | isarray@^1.0.0: 783 | version "1.0.0" 784 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 785 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 786 | 787 | isexe@^2.0.0: 788 | version "2.0.0" 789 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 790 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 791 | 792 | js-tokens@^4.0.0: 793 | version "4.0.0" 794 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 795 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 796 | 797 | js-yaml@^3.13.0: 798 | version "3.14.0" 799 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" 800 | integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== 801 | dependencies: 802 | argparse "^1.0.7" 803 | esprima "^4.0.0" 804 | 805 | json-schema-traverse@^0.4.1: 806 | version "0.4.1" 807 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 808 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 809 | 810 | json-stable-stringify-without-jsonify@^1.0.1: 811 | version "1.0.1" 812 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 813 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 814 | 815 | json5@^1.0.1: 816 | version "1.0.1" 817 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 818 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 819 | dependencies: 820 | minimist "^1.2.0" 821 | 822 | just-extend@^4.0.2: 823 | version "4.1.0" 824 | resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.0.tgz#7278a4027d889601640ee0ce0e5a00b992467da4" 825 | integrity sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA== 826 | 827 | levn@^0.3.0, levn@~0.3.0: 828 | version "0.3.0" 829 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 830 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 831 | dependencies: 832 | prelude-ls "~1.1.2" 833 | type-check "~0.3.2" 834 | 835 | load-json-file@^2.0.0: 836 | version "2.0.0" 837 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 838 | integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= 839 | dependencies: 840 | graceful-fs "^4.1.2" 841 | parse-json "^2.2.0" 842 | pify "^2.0.0" 843 | strip-bom "^3.0.0" 844 | 845 | locate-path@^2.0.0: 846 | version "2.0.0" 847 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 848 | integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= 849 | dependencies: 850 | p-locate "^2.0.0" 851 | path-exists "^3.0.0" 852 | 853 | lodash.get@^4.4.2: 854 | version "4.4.2" 855 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 856 | integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= 857 | 858 | lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15: 859 | version "4.17.15" 860 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 861 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 862 | 863 | lolex@^2.7.5: 864 | version "2.7.5" 865 | resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" 866 | integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== 867 | 868 | lolex@^5.0.1: 869 | version "5.1.2" 870 | resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" 871 | integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== 872 | dependencies: 873 | "@sinonjs/commons" "^1.7.0" 874 | 875 | merge-descriptors@~1.0.0: 876 | version "1.0.1" 877 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 878 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 879 | 880 | mimic-fn@^1.0.0: 881 | version "1.2.0" 882 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 883 | integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== 884 | 885 | minimatch@3.0.4, minimatch@^3.0.4: 886 | version "3.0.4" 887 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 888 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 889 | dependencies: 890 | brace-expansion "^1.1.7" 891 | 892 | minimist@0.0.8: 893 | version "0.0.8" 894 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 895 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 896 | 897 | minimist@^1.2.0, minimist@^1.2.5: 898 | version "1.2.5" 899 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 900 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 901 | 902 | mkdirp@0.5.1: 903 | version "0.5.1" 904 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 905 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 906 | dependencies: 907 | minimist "0.0.8" 908 | 909 | mkdirp@^0.5.1: 910 | version "0.5.5" 911 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 912 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 913 | dependencies: 914 | minimist "^1.2.5" 915 | 916 | mocha@^5.2.0: 917 | version "5.2.0" 918 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" 919 | integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== 920 | dependencies: 921 | browser-stdout "1.3.1" 922 | commander "2.15.1" 923 | debug "3.1.0" 924 | diff "3.5.0" 925 | escape-string-regexp "1.0.5" 926 | glob "7.1.2" 927 | growl "1.10.5" 928 | he "1.1.1" 929 | minimatch "3.0.4" 930 | mkdirp "0.5.1" 931 | supports-color "5.4.0" 932 | 933 | module-not-found-error@^1.0.1: 934 | version "1.0.1" 935 | resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" 936 | integrity sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA= 937 | 938 | ms@2.0.0: 939 | version "2.0.0" 940 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 941 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 942 | 943 | ms@^2.1.1: 944 | version "2.1.2" 945 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 946 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 947 | 948 | mute-stream@0.0.7: 949 | version "0.0.7" 950 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 951 | integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= 952 | 953 | natural-compare@^1.4.0: 954 | version "1.4.0" 955 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 956 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 957 | 958 | nice-try@^1.0.4: 959 | version "1.0.5" 960 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 961 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 962 | 963 | nise@^1.4.5: 964 | version "1.5.3" 965 | resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" 966 | integrity sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ== 967 | dependencies: 968 | "@sinonjs/formatio" "^3.2.1" 969 | "@sinonjs/text-encoding" "^0.7.1" 970 | just-extend "^4.0.2" 971 | lolex "^5.0.1" 972 | path-to-regexp "^1.7.0" 973 | 974 | normalize-package-data@^2.3.2: 975 | version "2.5.0" 976 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 977 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 978 | dependencies: 979 | hosted-git-info "^2.1.4" 980 | resolve "^1.10.0" 981 | semver "2 || 3 || 4 || 5" 982 | validate-npm-package-license "^3.0.1" 983 | 984 | object-inspect@^1.7.0: 985 | version "1.8.0" 986 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" 987 | integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== 988 | 989 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 990 | version "1.1.1" 991 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 992 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 993 | 994 | object.assign@^4.1.0: 995 | version "4.1.0" 996 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 997 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 998 | dependencies: 999 | define-properties "^1.1.2" 1000 | function-bind "^1.1.1" 1001 | has-symbols "^1.0.0" 1002 | object-keys "^1.0.11" 1003 | 1004 | object.values@^1.1.1: 1005 | version "1.1.1" 1006 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" 1007 | integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== 1008 | dependencies: 1009 | define-properties "^1.1.3" 1010 | es-abstract "^1.17.0-next.1" 1011 | function-bind "^1.1.1" 1012 | has "^1.0.3" 1013 | 1014 | once@^1.3.0: 1015 | version "1.4.0" 1016 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1017 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1018 | dependencies: 1019 | wrappy "1" 1020 | 1021 | onetime@^2.0.0: 1022 | version "2.0.1" 1023 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1024 | integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= 1025 | dependencies: 1026 | mimic-fn "^1.0.0" 1027 | 1028 | optionator@^0.8.2: 1029 | version "0.8.3" 1030 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 1031 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 1032 | dependencies: 1033 | deep-is "~0.1.3" 1034 | fast-levenshtein "~2.0.6" 1035 | levn "~0.3.0" 1036 | prelude-ls "~1.1.2" 1037 | type-check "~0.3.2" 1038 | word-wrap "~1.2.3" 1039 | 1040 | os-tmpdir@~1.0.2: 1041 | version "1.0.2" 1042 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1043 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1044 | 1045 | p-limit@^1.1.0: 1046 | version "1.3.0" 1047 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 1048 | integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== 1049 | dependencies: 1050 | p-try "^1.0.0" 1051 | 1052 | p-locate@^2.0.0: 1053 | version "2.0.0" 1054 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1055 | integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= 1056 | dependencies: 1057 | p-limit "^1.1.0" 1058 | 1059 | p-try@^1.0.0: 1060 | version "1.0.0" 1061 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1062 | integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= 1063 | 1064 | parent-module@^1.0.0: 1065 | version "1.0.1" 1066 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1067 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1068 | dependencies: 1069 | callsites "^3.0.0" 1070 | 1071 | parse-json@^2.2.0: 1072 | version "2.2.0" 1073 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1074 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 1075 | dependencies: 1076 | error-ex "^1.2.0" 1077 | 1078 | path-exists@^3.0.0: 1079 | version "3.0.0" 1080 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1081 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1082 | 1083 | path-is-absolute@^1.0.0: 1084 | version "1.0.1" 1085 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1086 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1087 | 1088 | path-is-inside@^1.0.2: 1089 | version "1.0.2" 1090 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1091 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 1092 | 1093 | path-key@^2.0.1: 1094 | version "2.0.1" 1095 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1096 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1097 | 1098 | path-parse@^1.0.6: 1099 | version "1.0.6" 1100 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1101 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1102 | 1103 | path-to-regexp@^1.7.0: 1104 | version "1.8.0" 1105 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" 1106 | integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== 1107 | dependencies: 1108 | isarray "0.0.1" 1109 | 1110 | path-type@^2.0.0: 1111 | version "2.0.0" 1112 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1113 | integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= 1114 | dependencies: 1115 | pify "^2.0.0" 1116 | 1117 | pathval@^1.1.0: 1118 | version "1.1.0" 1119 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 1120 | integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= 1121 | 1122 | pify@^2.0.0: 1123 | version "2.3.0" 1124 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1125 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1126 | 1127 | pkg-dir@^2.0.0: 1128 | version "2.0.0" 1129 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 1130 | integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= 1131 | dependencies: 1132 | find-up "^2.1.0" 1133 | 1134 | prelude-ls@~1.1.2: 1135 | version "1.1.2" 1136 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1137 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 1138 | 1139 | progress@^2.0.0: 1140 | version "2.0.3" 1141 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1142 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1143 | 1144 | proxyquire@^2.1.0: 1145 | version "2.1.3" 1146 | resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-2.1.3.tgz#2049a7eefa10a9a953346a18e54aab2b4268df39" 1147 | integrity sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg== 1148 | dependencies: 1149 | fill-keys "^1.0.2" 1150 | module-not-found-error "^1.0.1" 1151 | resolve "^1.11.1" 1152 | 1153 | punycode@^2.1.0: 1154 | version "2.1.1" 1155 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1156 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1157 | 1158 | read-pkg-up@^2.0.0: 1159 | version "2.0.0" 1160 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1161 | integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= 1162 | dependencies: 1163 | find-up "^2.0.0" 1164 | read-pkg "^2.0.0" 1165 | 1166 | read-pkg@^2.0.0: 1167 | version "2.0.0" 1168 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1169 | integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= 1170 | dependencies: 1171 | load-json-file "^2.0.0" 1172 | normalize-package-data "^2.3.2" 1173 | path-type "^2.0.0" 1174 | 1175 | regexpp@^2.0.1: 1176 | version "2.0.1" 1177 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 1178 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 1179 | 1180 | resolve-from@^4.0.0: 1181 | version "4.0.0" 1182 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1183 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1184 | 1185 | resolve@^1.10.0, resolve@^1.11.1, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.3: 1186 | version "1.17.0" 1187 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 1188 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 1189 | dependencies: 1190 | path-parse "^1.0.6" 1191 | 1192 | restore-cursor@^2.0.0: 1193 | version "2.0.0" 1194 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1195 | integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= 1196 | dependencies: 1197 | onetime "^2.0.0" 1198 | signal-exit "^3.0.2" 1199 | 1200 | rimraf@2.6.3: 1201 | version "2.6.3" 1202 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1203 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1204 | dependencies: 1205 | glob "^7.1.3" 1206 | 1207 | run-async@^2.2.0: 1208 | version "2.4.1" 1209 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 1210 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== 1211 | 1212 | rxjs@^6.4.0: 1213 | version "6.6.0" 1214 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" 1215 | integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== 1216 | dependencies: 1217 | tslib "^1.9.0" 1218 | 1219 | "safer-buffer@>= 2.1.2 < 3": 1220 | version "2.1.2" 1221 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1222 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1223 | 1224 | "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: 1225 | version "5.7.1" 1226 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1227 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1228 | 1229 | shebang-command@^1.2.0: 1230 | version "1.2.0" 1231 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1232 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1233 | dependencies: 1234 | shebang-regex "^1.0.0" 1235 | 1236 | shebang-regex@^1.0.0: 1237 | version "1.0.0" 1238 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1239 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1240 | 1241 | signal-exit@^3.0.2: 1242 | version "3.0.3" 1243 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1244 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1245 | 1246 | sinon@^6.3.3: 1247 | version "6.3.5" 1248 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-6.3.5.tgz#0f6d6a5b4ebaad1f6e8e019395542d1d02c144a0" 1249 | integrity sha512-xgoZ2gKjyVRcF08RrIQc+srnSyY1JDJtxu3Nsz07j1ffjgXoY6uPLf/qja6nDBZgzYYEovVkFryw2+KiZz11xQ== 1250 | dependencies: 1251 | "@sinonjs/commons" "^1.0.2" 1252 | "@sinonjs/formatio" "^3.0.0" 1253 | "@sinonjs/samsam" "^2.1.2" 1254 | diff "^3.5.0" 1255 | lodash.get "^4.4.2" 1256 | lolex "^2.7.5" 1257 | nise "^1.4.5" 1258 | supports-color "^5.5.0" 1259 | type-detect "^4.0.8" 1260 | 1261 | slice-ansi@^2.1.0: 1262 | version "2.1.0" 1263 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 1264 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 1265 | dependencies: 1266 | ansi-styles "^3.2.0" 1267 | astral-regex "^1.0.0" 1268 | is-fullwidth-code-point "^2.0.0" 1269 | 1270 | spdx-correct@^3.0.0: 1271 | version "3.1.1" 1272 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 1273 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 1274 | dependencies: 1275 | spdx-expression-parse "^3.0.0" 1276 | spdx-license-ids "^3.0.0" 1277 | 1278 | spdx-exceptions@^2.1.0: 1279 | version "2.3.0" 1280 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1281 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 1282 | 1283 | spdx-expression-parse@^3.0.0: 1284 | version "3.0.1" 1285 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 1286 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 1287 | dependencies: 1288 | spdx-exceptions "^2.1.0" 1289 | spdx-license-ids "^3.0.0" 1290 | 1291 | spdx-license-ids@^3.0.0: 1292 | version "3.0.5" 1293 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 1294 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 1295 | 1296 | sprintf-js@~1.0.2: 1297 | version "1.0.3" 1298 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1299 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1300 | 1301 | string-width@^2.1.0: 1302 | version "2.1.1" 1303 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1304 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1305 | dependencies: 1306 | is-fullwidth-code-point "^2.0.0" 1307 | strip-ansi "^4.0.0" 1308 | 1309 | string-width@^3.0.0: 1310 | version "3.1.0" 1311 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1312 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1313 | dependencies: 1314 | emoji-regex "^7.0.1" 1315 | is-fullwidth-code-point "^2.0.0" 1316 | strip-ansi "^5.1.0" 1317 | 1318 | string.prototype.trimend@^1.0.1: 1319 | version "1.0.1" 1320 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 1321 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 1322 | dependencies: 1323 | define-properties "^1.1.3" 1324 | es-abstract "^1.17.5" 1325 | 1326 | string.prototype.trimstart@^1.0.1: 1327 | version "1.0.1" 1328 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 1329 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 1330 | dependencies: 1331 | define-properties "^1.1.3" 1332 | es-abstract "^1.17.5" 1333 | 1334 | strip-ansi@^4.0.0: 1335 | version "4.0.0" 1336 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1337 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1338 | dependencies: 1339 | ansi-regex "^3.0.0" 1340 | 1341 | strip-ansi@^5.1.0: 1342 | version "5.2.0" 1343 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1344 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1345 | dependencies: 1346 | ansi-regex "^4.1.0" 1347 | 1348 | strip-bom@^3.0.0: 1349 | version "3.0.0" 1350 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1351 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1352 | 1353 | strip-json-comments@^2.0.1: 1354 | version "2.0.1" 1355 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1356 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1357 | 1358 | supports-color@5.4.0: 1359 | version "5.4.0" 1360 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 1361 | integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== 1362 | dependencies: 1363 | has-flag "^3.0.0" 1364 | 1365 | supports-color@^5.3.0, supports-color@^5.5.0: 1366 | version "5.5.0" 1367 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1368 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1369 | dependencies: 1370 | has-flag "^3.0.0" 1371 | 1372 | table@^5.2.3: 1373 | version "5.4.6" 1374 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" 1375 | integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== 1376 | dependencies: 1377 | ajv "^6.10.2" 1378 | lodash "^4.17.14" 1379 | slice-ansi "^2.1.0" 1380 | string-width "^3.0.0" 1381 | 1382 | text-table@^0.2.0: 1383 | version "0.2.0" 1384 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1385 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1386 | 1387 | through@^2.3.6: 1388 | version "2.3.8" 1389 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1390 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1391 | 1392 | tmp@^0.0.33: 1393 | version "0.0.33" 1394 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1395 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 1396 | dependencies: 1397 | os-tmpdir "~1.0.2" 1398 | 1399 | tsconfig-paths@^3.9.0: 1400 | version "3.9.0" 1401 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" 1402 | integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== 1403 | dependencies: 1404 | "@types/json5" "^0.0.29" 1405 | json5 "^1.0.1" 1406 | minimist "^1.2.0" 1407 | strip-bom "^3.0.0" 1408 | 1409 | tslib@^1.9.0: 1410 | version "1.13.0" 1411 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 1412 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 1413 | 1414 | type-check@~0.3.2: 1415 | version "0.3.2" 1416 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1417 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 1418 | dependencies: 1419 | prelude-ls "~1.1.2" 1420 | 1421 | type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: 1422 | version "4.0.8" 1423 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1424 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1425 | 1426 | uri-js@^4.2.2: 1427 | version "4.2.2" 1428 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1429 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1430 | dependencies: 1431 | punycode "^2.1.0" 1432 | 1433 | validate-npm-package-license@^3.0.1: 1434 | version "3.0.4" 1435 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1436 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 1437 | dependencies: 1438 | spdx-correct "^3.0.0" 1439 | spdx-expression-parse "^3.0.0" 1440 | 1441 | which@^1.2.9: 1442 | version "1.3.1" 1443 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1444 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1445 | dependencies: 1446 | isexe "^2.0.0" 1447 | 1448 | word-wrap@~1.2.3: 1449 | version "1.2.3" 1450 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1451 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1452 | 1453 | wrappy@1: 1454 | version "1.0.2" 1455 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1456 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1457 | 1458 | write@1.0.3: 1459 | version "1.0.3" 1460 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 1461 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 1462 | dependencies: 1463 | mkdirp "^0.5.1" 1464 | --------------------------------------------------------------------------------