├── .npmignore ├── .prettierignore ├── .gitignore ├── .prettierrc.js ├── .env.example ├── src └── lib │ ├── drivers │ ├── elasticsearch.ts │ ├── datasource.ts │ ├── mysql.ts │ └── mongodb.ts │ ├── cli │ ├── myelastic.ts │ └── cmds │ │ ├── delete.ts │ │ └── lastIndexed.ts │ └── indexer.ts ├── tsconfig.json ├── LICENSE ├── .eslintrc.js ├── postinstall.js ├── package.json ├── README.md └── yarn.lock /.npmignore: -------------------------------------------------------------------------------- 1 | src -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | .DS_Store 4 | /lib/ 5 | /indexers/ 6 | .vscode 7 | yarn-error.log 8 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | semi: true, 3 | trailingComma: 'all', 4 | singleQuote: true, 5 | tabWidth: 2, 6 | }; -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | elasticsearch_url= 2 | mongodb_url= 3 | mongodb_database= 4 | mysql_host= 5 | mysql_user= 6 | mysql_password= 7 | mysql_database= 8 | -------------------------------------------------------------------------------- /src/lib/drivers/elasticsearch.ts: -------------------------------------------------------------------------------- 1 | import { Client } from '@elastic/elasticsearch'; 2 | export default new Client({ node: process.env.elasticsearch_url }); 3 | -------------------------------------------------------------------------------- /src/lib/drivers/datasource.ts: -------------------------------------------------------------------------------- 1 | export interface DataSource { 2 | query: ( 3 | query: any, 4 | callback: (err: any, results: any) => {}, 5 | collectionName?: string, 6 | ) => {}; 7 | end: () => {}; 8 | } 9 | -------------------------------------------------------------------------------- /src/lib/cli/myelastic.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import * as yargs from 'yargs'; 3 | import lastIndexed from "./cmds/lastIndexed"; 4 | import deleteCmd from "./cmds/delete"; 5 | 6 | yargs 7 | .command(lastIndexed) 8 | .command(deleteCmd) 9 | .demandCommand() 10 | .help() 11 | .wrap(72).argv; 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/lib/cli/cmds/delete.ts: -------------------------------------------------------------------------------- 1 | import client from '../../drivers/elasticsearch'; 2 | export default { 3 | command: "delete [index]", 4 | desc: "delete an index", 5 | builder: { 6 | index: { 7 | default: false, 8 | describe: "index to delete" 9 | }, 10 | }, 11 | handler: (yargs) => { 12 | const index = yargs.index; 13 | async function run() { 14 | client.indices.delete({index: index}); 15 | } 16 | run().catch(console.log); 17 | } 18 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 6 | "target": "es2017", 7 | "removeComments": true, 8 | "outDir": "lib", 9 | /* Redirect output structure to the directory. */ 10 | "sourceMap": true, 11 | "moduleResolution": "node", 12 | "baseUrl": "./src", 13 | "paths": { 14 | "@myelastic/*": ["./lib/*"] 15 | } 16 | }, 17 | "include": ["src/**/*"] 18 | } 19 | -------------------------------------------------------------------------------- /src/lib/drivers/mysql.ts: -------------------------------------------------------------------------------- 1 | import { DataSource } from './datasource'; 2 | import mysql = require("mysql") 3 | 4 | export class MySQLDataSource implements DataSource { 5 | public connection: mysql.Connection; 6 | public constructor() { 7 | this.connection = mysql.createConnection({ 8 | host : process.env.mysql_host, 9 | user : process.env.mysql_user, 10 | password : process.env.mysql_password, 11 | database : process.env.mysql_database 12 | }); 13 | return this; 14 | } 15 | public async query( 16 | query: any, 17 | callback: (error: any, results: any) => {}, 18 | ) { 19 | return this.connection.query(query, callback); 20 | } 21 | public async end() { 22 | return this.connection.end(); 23 | } 24 | } 25 | 26 | export default MySQLDataSource; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2019 Anthony Martin 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: '@typescript-eslint/typescript-estree', // Specifies the ESLint parser 3 | extends: [ 4 | 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin 5 | 'prettier/@typescript-eslint', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier 6 | 'plugin:prettier/recommended', // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array. 7 | ], 8 | plugins: ["prettier"], 9 | parserOptions: { 10 | ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features 11 | sourceType: 'module', // Allows for the use of imports 12 | }, 13 | rules: { 14 | // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs 15 | // e.g. "@typescript-eslint/explicit-function-return-type": "off", 16 | "prettier/prettier": "error", 17 | }, 18 | // code: 120 19 | }; -------------------------------------------------------------------------------- /src/lib/cli/cmds/lastIndexed.ts: -------------------------------------------------------------------------------- 1 | import client from '../../drivers/elasticsearch'; 2 | 3 | export default { 4 | command: "last-indexed [index] [field]", 5 | desc: "get last indexed document", 6 | builder: { 7 | index: { 8 | default: "_all", 9 | describe: "index to search" 10 | }, 11 | field: { 12 | default: "id", 13 | describe: "field to sort by and return" 14 | } 15 | }, 16 | handler: async (yargs): Promise => { 17 | 18 | let field = yargs.field; 19 | let index = yargs.index; 20 | 21 | 22 | async function run() { 23 | let id = null; 24 | let sort = [{}]; 25 | sort[0][`${field}`] = { order: "desc" }; 26 | const { body } = await client.search({ 27 | index: index, 28 | body: { 29 | _source: field, 30 | size: 1, 31 | query: { 32 | match_all: {}, 33 | }, 34 | sort 35 | }, 36 | }); 37 | 38 | try { 39 | id = body.hits.hits[0]._source[`${field}`]; 40 | } catch { 41 | console.log(`Last Indexed ID not found. Does ${index} [index] and ${field} [field] exist?`); 42 | } 43 | return id; 44 | } 45 | 46 | return run(); 47 | } 48 | } -------------------------------------------------------------------------------- /src/lib/drivers/mongodb.ts: -------------------------------------------------------------------------------- 1 | import { DataSource } from './datasource'; 2 | import { MongoClient } from 'mongodb'; 3 | 4 | export class MongoDBSource implements DataSource { 5 | public client: MongoClient; 6 | private static _instance: MongoDBSource; 7 | private constructor() { 8 | 9 | } 10 | public async connect(): Promise { 11 | console.log("connecting to mongo"); 12 | this.client = await (new MongoClient(process.env.mongodb_url, { useUnifiedTopology: true })).connect(); 13 | console.log("connected to mongo"); 14 | } 15 | public static getInstance(): MongoDBSource { 16 | if (MongoDBSource._instance) { 17 | return MongoDBSource._instance; 18 | } else { 19 | MongoDBSource._instance = new MongoDBSource; 20 | return MongoDBSource._instance; 21 | } 22 | } 23 | public async query( 24 | query: any, 25 | callback: (error: any, results: any) => {}, 26 | collectionName?: string, 27 | ) { 28 | try { 29 | console.log("querying mongo"); 30 | const db = this.client.db(process.env.mongodb_database); 31 | const collection = db.collection(collectionName); 32 | collection.find(query).toArray((err, docs) => { 33 | if (err) 34 | console.error(err); 35 | if (docs && docs.length) 36 | console.log(`found ${docs.length || 0} docs`); 37 | return callback(err, docs); 38 | }); 39 | } catch(error) { 40 | console.error('whoops', error); 41 | return callback(error, []); 42 | } 43 | 44 | } 45 | public async end() { 46 | MongoDBSource.getInstance().client.close(); 47 | } 48 | } 49 | 50 | export default MongoDBSource; -------------------------------------------------------------------------------- /postinstall.js: -------------------------------------------------------------------------------- 1 | #!/bin/node 2 | const fs = require('fs'); 3 | 4 | const cwd = process.env.INIT_CWD 5 | 6 | const getTemplateEnv = () => { 7 | const envFile = cwd + "/node_modules/@myelastic/indexer/.env.example"; 8 | return envFile; 9 | } 10 | 11 | const getMainFile = () => { 12 | const main = cwd + "/node_modules/@myelastic/indexer/lib/indexer.js"; 13 | return main; 14 | } 15 | const getCliFile = () => { 16 | const cli = cwd + "/node_modules/@myelastic/indexer/lib/cli/myelastic.js"; 17 | return cli; 18 | } 19 | 20 | const copyFile = function (source, target, overwrite=false, executable=false) { 21 | if (fs.existsSync(target) && overwrite) { 22 | fs.copyFileSync(source, target); 23 | if (executable) { 24 | fs.chmodSync(target, "755"); 25 | } 26 | } else { 27 | // do nothing since we don't want to overwrite a file 28 | } 29 | } 30 | 31 | const requireDotEnv = function (file, envReference) { 32 | const source = cwd + '/.env'; 33 | const requireDotEnv = `require('dotenv').config({ path: ${envReference} });`; 34 | if (fs.existsSync(source) && fs.existsSync(file) && !fs.readFileSync(file).toString().match(/require\('dotenv'\)/gm)) { 35 | var fileLineByLine = fs.readFileSync(file).toString().match(/^.+$/gm); 36 | fileLineByLine[1] = fileLineByLine[1].concat(`\n${requireDotEnv}\n`); 37 | fs.writeFileSync(file, fileLineByLine.join("\n")); 38 | } 39 | }; 40 | 41 | const copyEnvAndSetLocationInMain = () => { 42 | const source = getTemplateEnv(); 43 | const target = cwd + "/.env"; 44 | copyFile(source, target, false); 45 | requireDotEnv(getMainFile(), "__dirname + '/../../../../.env'"); 46 | } 47 | 48 | const setCliEnvLocation = () => { 49 | const target = getCliFile(); 50 | requireDotEnv(target, "__dirname + '/../../../../../.env'"); 51 | } 52 | const createBinDir = () => { 53 | if(!fs.existsSync(cwd + '/bin')) { 54 | fs.mkdirSync(cwd + '/bin'); 55 | } 56 | } 57 | 58 | try { 59 | copyEnvAndSetLocationInMain(); 60 | setCliEnvLocation(); 61 | } catch (e) { 62 | console.log(e); 63 | } 64 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@myelastic/indexer", 3 | "version": "1.5.4", 4 | "description": "elasticsearch indexer for mysql", 5 | "main": "lib/indexer.js", 6 | "scripts": { 7 | "watch": "nodemon --watch 'src/**/*' -e ts --exec yarn run build", 8 | "test": "echo \"Error: no test specified\" && exit 1", 9 | "build": "tsc", 10 | "prepare": "npm run build", 11 | "lint": "tslint -p tsconfig.json", 12 | "myelastic": "ts-node src/lib/cli/myelastic.ts", 13 | "postinstall": "node postinstall.js" 14 | }, 15 | "keywords": [ 16 | "mysql", 17 | "mysql to elasticsearch", 18 | "mysql elasticsearch indexer", 19 | "elasticsearch", 20 | "elastic", 21 | "bulk", 22 | "indexing", 23 | "kibana", 24 | "mapping", 25 | "search", 26 | "client", 27 | "index" 28 | ], 29 | "types": "lib/indexer.d.ts", 30 | "dependencies": { 31 | "@elastic/elasticsearch": "^7.3.0", 32 | "dotenv": "^8.2.0", 33 | "find-config": "^1.0.0", 34 | "fs": "0.0.1-security", 35 | "humanize-duration": "^3.20.1", 36 | "lodash": "^4.17.15", 37 | "moment": "^2.24.0", 38 | "mongodb": "^3.5.7", 39 | "mysql": "^2.17.1", 40 | "yargs": "^14.0.0" 41 | }, 42 | "devDependencies": { 43 | "@types/mongodb": "^3.5.16", 44 | "@types/mysql": "^2.15.10", 45 | "@types/node": "^12.7.5", 46 | "@types/yargs": "^13.0.2", 47 | "eslint": "^6.4.0", 48 | "eslint-config-prettier": "^6.3.0", 49 | "eslint-plugin-prettier": "^3.1.0", 50 | "husky": "^3.0.5", 51 | "prettier": "^1.18.2", 52 | "ts-node": "8.1.0", 53 | "tslint": "5.16.0", 54 | "typescript": "3.4.5", 55 | "yarn": "^1.17.3" 56 | }, 57 | "author": "Anthony Martin", 58 | "repository": { 59 | "type": "git", 60 | "url": "https://github.com/anthonymartin/myelastic" 61 | }, 62 | "license": "MIT", 63 | "bin": { 64 | "myelastic": "./lib/cli/myelastic.js" 65 | }, 66 | "husky": { 67 | "hooks": { 68 | "post-commit": "(git-branch-is develop && HUSKY_SKIP_HOOKS=1 yarn version --patch)" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [@myelastic/indexer - ElasticSearch Indexer for MySQL and MongoDB](https://github.com/anthonymartin/myelastic) 2 | 3 | A simple but powerful way to create elasticsearch indexes from your MySQL and MongoDB data. This package will save you the hassle of writing your elasticsearch import scripts from scratch. This indexer offers a declarative configuration and easily extensible interface to make indexing data from MySQL or MongoDB a breeze. 4 | 5 | ## Features: 6 | 7 | - Easy to get started with minimum configuration 8 | - Transform your data before it is indexed using the `addMutator` callback function 9 | - Query variables: use `{lastIndexedId}` variable in your MySQL query to get the last indexed document of your index 10 | - Full typescript and javascript support 11 | 12 | ## Installation 13 | 14 | `npm install @myelastic/indexer` 15 | 16 | or 17 | 18 | `yarn add @myelastic/indexer` 19 | 20 | ## Usage 21 | 22 | ### Set your environment variables in .env 23 | 24 | ```ini 25 | elasticsearch_url= 26 | elasticsearch_api_key= 27 | 28 | // mysql 29 | mysql_host= 30 | mysql_user= 31 | mysql_password= 32 | mysql_database= 33 | 34 | // mongo 35 | mongodb_url= 36 | mongodb_database= 37 | ``` 38 | 39 | ### Quick Start 40 | 41 | Typescript: 42 | 43 | ```typescript 44 | import { Indexer } from '@myelastic/indexer'; 45 | 46 | const config = { 47 | index: 'invoices', 48 | query: 'select * from invoices', 49 | }; 50 | 51 | new Indexer(config).start(); 52 | ``` 53 | 54 | Javascript: 55 | 56 | ```javascript 57 | const { Indexer } = require('@myelastic/indexer'); 58 | 59 | const config = { 60 | index: 'invoices', 61 | query: 'select * from invoices', 62 | }; 63 | 64 | new Indexer(config).start(); 65 | ``` 66 | 67 | ## MongoDB example 68 | 69 | First, make sure your environment variables are set: 70 | ``` 71 | mongodb_url= 72 | mongodb_database= 73 | ``` 74 | 75 | Your indexer may look like this: 76 | 77 | ```typescript 78 | import { Indexer } from '@myelastic/indexer'; 79 | const config = { 80 | index: 'users-index', // this will be the name of the index in elasticsearch 81 | collection: 'users', // this is the name of the mongodb collection we want to index 82 | batchSize: 1000, // how many documents to process at once 83 | query: {}, // the filter for your query: @see https://www.npmjs.com/package/mongodb#find-documents-with-a-query-filter 84 | }; 85 | 86 | new Indexer(config) 87 | .start(); 88 | ``` 89 | 90 | ## Adanced Configuration 91 | 92 | ### Mapping 93 | 94 | You'll sometimes find you need to explicitly define your elasticsearch index mappings. You can define those in your configuration: 95 | 96 | ```javascript 97 | const config = { 98 | // ... 99 | mappings: { 100 | amount: { type: 'float' }, 101 | amount_paid: { type: 'float' }, 102 | date: { type: 'date' }, 103 | }, 104 | }; 105 | ``` 106 | 107 | ### Mutators 108 | 109 | Every row of your query can be passed to a mutator function which allows you to transform the data before it is indexed. 110 | 111 | ```javascript 112 | // our database has an IP, but let's also map the geolocation coordinates for that IP 113 | const mutator = function (row) => { 114 | row.geo_location = getCoordinatesFromIP(row.ip); 115 | }; 116 | 117 | new Indexer(config) 118 | .addMutator(mutator) 119 | .start(); 120 | ``` 121 | 122 | ### Indexing by Date 123 | 124 | Index your data by date and the date in the format you provide will be appended to the index name. e.g. `indexName-2019` 125 | 126 | ```javascript 127 | new Indexer(config) 128 | .indexByDate('date_field', 'YYYY') 129 | .start(); 130 | ``` 131 | 132 | ### Query variables 133 | 134 | Use a `{lastIndexedId}` in your query to get the last indexed record for the id field specified in the configuration. 135 | 136 | ```typescript 137 | const config = { 138 | index: 'invoices', 139 | id: 'invoice_id', 140 | query: 'select * from invoices where invoice_id > {lastIndexedId}', 141 | }; 142 | 143 | new Indexer(config) 144 | .start(); 145 | ``` 146 | 147 | ### Chained Mutators 148 | 149 | Add any number of mutators to transform your data before it is indexed 150 | 151 | ```javascript 152 | // our database has an IP, but let's also map the geolocation coordinates for that IP 153 | const geoLocation = function (row) => { 154 | row.geo_location = getCoordinatesFromIP(row.ip); 155 | }; 156 | 157 | const timestamp = function (row) => { 158 | row.timestamp = new Date(); 159 | }; 160 | 161 | new Indexer(config) 162 | .addMutator(geoLocation) 163 | .addMutator(timestamp) 164 | .start(); 165 | ``` 166 | 167 | 168 | 169 | ### Configuration Options 170 | 171 | ```javascript 172 | const config: IndexerConfig = { 173 | /** 174 | * define the mappings to be used by the index. Usually elastic search will define these mappings automatically 175 | * but you can define your own for advanced usage if the default mappings are not enough 176 | * e.g. 177 | * { 178 | * location: { type: "geo_point" }, 179 | * title: { type: "text" }, 180 | * description: { 181 | * type: "text" 182 | * analyzer: "standard", 183 | * fields: { 184 | * english: { 185 | * type: "text", 186 | * analyzer: "custom_analyzer" 187 | * } 188 | * } 189 | * } 190 | * }, 191 | */ 192 | mappings: { [key: string]: object }; 193 | 194 | /** 195 | * used for index settings such as defining analyzers: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/configuring-analyzers.html 196 | * see also: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/index-modules.html 197 | * this is passed to client.indices.create body property: https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#_indices_create 198 | */ 199 | settings: any, 200 | 201 | /** 202 | * This can be a MySQL query or a mongo filter 203 | */ 204 | query: string | any; 205 | 206 | /** 207 | * The collection used for mongo queries 208 | */ 209 | collection: string; // used for mongo collection queries 210 | 211 | /** 212 | * Alias for indexName 213 | */ 214 | index: string; //alias for indexName 215 | 216 | /** 217 | * This is the name of the elastic search index 218 | */ 219 | indexName: string; 220 | 221 | /** 222 | * This is the number of documents/records to include in each bulk index request 223 | */ 224 | batchSize: number; 225 | 226 | /** 227 | * When using the {lastIndexedId} variable in a query (only for MySQL), this property defines the id column to use in the database 228 | */ 229 | id: string; 230 | 231 | /** 232 | * If set to true, the indexer will only index properties that have been defined in the mappings property of the IndexerConfig 233 | */ 234 | explicitMapping: boolean; 235 | 236 | /** 237 | * If set to true, the indexer will delete the existing index if it exists and create a new one before indexing data 238 | **/ 239 | reindex: boolean; 240 | 241 | /** 242 | * The reducer will receive the results of a query as an input and the output will be subsequently indexed 243 | */ 244 | useReducer: boolean; 245 | } 246 | ``` 247 | 248 | ### Advanced Example 249 | 250 | Below is an example configuration with a custom analyzer that uses a shingle filter which is useful for creating a tag cloud in kibana with 2 to 3-word phrases. 251 | 252 | ```typescript 253 | import { Indexer, IndexerConfig } from '@myelastic/indexer'; 254 | 255 | const config: IndexerConfig = { 256 | index: 'feedback', 257 | reindex: true, 258 | batchSize: 1000, 259 | query: 'select * from tbl_feedback', 260 | settings: { 261 | analysis: { 262 | analyzer: { 263 | shingle_analyzer: { 264 | type: "custom", 265 | tokenizer: "standard", 266 | filter: ["my_shingle_filter"], 267 | } 268 | }, 269 | filter: { 270 | my_shingle_filter: { 271 | type: "shingle", 272 | min_shingle_size: 2, 273 | max_shingle_size: 3, 274 | output_unigrams: false, 275 | output_unigrams_if_no_shingles: true, 276 | } 277 | } 278 | } 279 | }, 280 | mappings: { 281 | feedback: { 282 | type: 'text', 283 | fielddata: true, 284 | analyzer: "shingle_analyzer", 285 | fields: { 286 | raw: { 287 | type: "keyword" 288 | } 289 | }, 290 | } 291 | } 292 | }; 293 | 294 | new Indexer(config).start() 295 | ``` 296 | -------------------------------------------------------------------------------- /src/lib/indexer.ts: -------------------------------------------------------------------------------- 1 | require('dotenv').config({ path: require('find-config')('.env') }); 2 | import { pick, chunk, flatten } from 'lodash'; 3 | import * as moment from 'moment'; 4 | import { Client as ElasticSearchClient } from '@elastic/elasticsearch'; 5 | import lastIndexed from './cli/cmds/lastIndexed'; 6 | import { MySQLDataSource } from './drivers/mysql'; 7 | import { MongoDBSource } from './drivers/mongodb'; 8 | import { DataSource } from './drivers/datasource'; 9 | const humanizeDuration = require('humanize-duration'); 10 | 11 | export class Indexer { 12 | private config: IndexerConfig; 13 | private client: ElasticSearchClient; 14 | private datasource: DataSource; 15 | private groups: GroupSet = new Set(); 16 | private reduce: Function; 17 | private grouperFn: Function; 18 | private mutators: Function[] = []; 19 | private stats = { 20 | batchesIndexed: 0, 21 | recordsIndexed: 0, 22 | indexErrors: 0, 23 | totalBatches: 0, 24 | createdIndices: new Set() as IndicesSet, 25 | deletedIndices: new Set() as IndicesSet, 26 | }; 27 | 28 | public constructor(config: IndexerConfig) { 29 | this.config = { ...defaultConfig, ...config, indexName: config.index }; 30 | this.client = new ElasticSearchClient({ 31 | node: this.config.elasticsearch_url || process.env.elasticsearch_url, 32 | auth: process.env.elasticsearch_api_key 33 | ? { 34 | apiKey: process.env.elasticsearch_api_key, 35 | } 36 | : undefined, 37 | }); 38 | } 39 | public async start() { 40 | const [indexer, startTime, query] = await this.init(); 41 | this.datasource.query( 42 | query, 43 | async function (error, results) { 44 | if (error) throw error; 45 | if (indexer.config.useReducer) { 46 | results = indexer.reduce(results); 47 | } 48 | await indexer.bulkIndex(results); 49 | indexer.displayStats(startTime); 50 | process.exit(0); 51 | }, 52 | this.config.collection, 53 | ); 54 | } 55 | 56 | private async init(): Promise<[this, number, string]> { 57 | await this.connect(); 58 | console.log(`Starting index of ${this.config.indexName}`); 59 | return [this, new Date().getTime(), await this.generateQuery()]; 60 | } 61 | /** 62 | * pass a callback which returns the index group that `row` should belong to. 63 | * @param grouper(row) 64 | */ 65 | public assignGroup(grouper: Function): this { 66 | this.grouperFn = grouper; 67 | return this; 68 | } 69 | 70 | public useCollectionReducer(reducer): this { 71 | this.config.useReducer = true; 72 | this.reduce = reducer; 73 | return this; 74 | } 75 | 76 | /** 77 | * maps group/indices to collection 78 | * @param collection 79 | */ 80 | private applyGroup(collection): GroupedCollection { 81 | const indexer = this; 82 | const getIndexName = (row) => { 83 | return this.grouperFn 84 | ? this.getIndex(this.grouperFn(row)) 85 | : this.getIndex(null); 86 | }; 87 | const groupedCollection = collection.map((row) => { 88 | if (this.config.explicitMapping == true) { 89 | row = pick(row, Object.keys(this.config.mappings)); 90 | } 91 | indexer.groups.add(getIndexName(row)); 92 | return [{ index: { _index: getIndexName(row) } }, row]; 93 | }); 94 | return groupedCollection; 95 | } 96 | public indexByDate(field: string, format: string) { 97 | this.grouperFn = (row) => { 98 | return `${moment(row[field]).format(format)}`; 99 | }; 100 | return this; 101 | } 102 | public async bulkIndex(collection): Promise { 103 | const batches = chunk(collection, this.config.batchSize).reverse(); 104 | while (batches.length > 0) { 105 | const batch = this.getNextBatch(batches); 106 | const [indices, transformedBatch] = this.transform(batch); 107 | await this.createIndices(indices); 108 | await this.doBulkIndex(transformedBatch, batch); 109 | } 110 | return this; 111 | } 112 | private getNextBatch(batches) { 113 | this.stats.totalBatches = !this.stats.totalBatches 114 | ? batches.length 115 | : this.stats.totalBatches; // only set the total count on first iteration 116 | return batches.pop(); 117 | } 118 | private displayStatus(collection) { 119 | console.log( 120 | `Indexing batch ${this.stats.batchesIndexed + 1} | items in batch ${ 121 | collection.length 122 | } | total batches left ${ 123 | this.stats.totalBatches - (this.stats.batchesIndexed + 1) 124 | }`, 125 | ); 126 | } 127 | private async doBulkIndex(collection: GroupedCollection, batch) { 128 | this.displayStatus(collection); 129 | const { body: bulkResponse } = await this.client.bulk({ 130 | refresh: 'true', 131 | body: flatten(collection), 132 | }); 133 | this.handleResponse(bulkResponse, batch); 134 | } 135 | private async createIndices(groups: GroupSet) { 136 | for (const index of groups) { 137 | if (this.config.reindex && !this.stats.deletedIndices.has(index)) { 138 | await this.deleteIndex(index); 139 | } 140 | await this.createIndex(index); 141 | } 142 | } 143 | 144 | private async deleteIndex(index) { 145 | try { 146 | const { body } = await this.client.indices.delete({ index: index }); 147 | if (body.acknowledged == true) { 148 | this.stats.deletedIndices.add(index); 149 | console.log(`Deleted Index ${index}`); 150 | } 151 | } catch (e) { 152 | console.log('Could not delete index. Perhaps it does not exist.', e); 153 | } 154 | } 155 | 156 | /** 157 | * Applies mutations and groups each item in the collection with their associated index group 158 | * @param collection 159 | */ 160 | private transform(collection): [GroupSet, GroupedCollection] { 161 | const mutatedCollection = this.applyMutations(collection); 162 | const groupedCollection = this.applyGroup(mutatedCollection); 163 | return [this.groups, groupedCollection]; 164 | } 165 | private async generateQuery(): Promise { 166 | if (typeof this.config.query !== 'string') { 167 | return this.config.query; 168 | } 169 | if ((this.config.query.match(/{\lastIndexedId\}/) || []).length == 0) { 170 | return this.config.query; 171 | } 172 | return this.config.query.replace( 173 | /{\lastIndexedId\}/, 174 | await this.getESLastIndexedRecord(), 175 | ); 176 | } 177 | private applyMutations(collection) { 178 | if (this.mutators.length == 0) return collection; 179 | const mutatedCollection = collection.map((row) => { 180 | for (const mutate of this.mutators) mutate(row); 181 | return row; 182 | }); 183 | return mutatedCollection; 184 | } 185 | public addMutator(mutator): this { 186 | this.mutators.push(mutator); 187 | return this; 188 | } 189 | private getIndex(group = null): string { 190 | if (!group) return `${this.config.indexName}`; 191 | return `${this.config.indexName}-${group}`; 192 | } 193 | private async getESLastIndexedRecord(): Promise { 194 | const id = 195 | (await lastIndexed.handler({ 196 | field: this.config.id, 197 | index: this.config.indexName + '*', 198 | })) || 0; 199 | console.log(`Querying by last indexed ${this.config.id}: ${id}`); 200 | return `${id}`; 201 | } 202 | private didNotCreateIndex(name) { 203 | return !this.stats.createdIndices.has(name); 204 | } 205 | private async createIndex(indexName: string) { 206 | if (this.didNotCreateIndex(indexName)) { 207 | console.log(`Creating Index: ${indexName}`); 208 | const { body } = await this.client.indices.create( 209 | { 210 | index: indexName, 211 | body: { 212 | mappings: { 213 | properties: this.config.mappings, 214 | }, 215 | settings: this.config.settings, 216 | }, 217 | }, 218 | { ignore: [400] }, 219 | ); 220 | try { 221 | if (body.acknowledged || body.status == 400) 222 | this.stats.createdIndices.add(indexName); 223 | } catch (e) { 224 | console.error(`There was a problem creating index: ${indexName}`); 225 | console.error(e); 226 | process.exit(1); 227 | } 228 | } 229 | } 230 | public getIndexName(): string { 231 | return this.config.indexName; 232 | } 233 | 234 | public setIndexName(indexName: string): this { 235 | this.config.indexName = indexName; 236 | return this; 237 | } 238 | private handleResponse(response, collection) { 239 | if (response.errors) { 240 | const erroredDocuments = []; 241 | // The items array has the same order of the dataset we just indexed. 242 | // The presence of the `error` key indicates that the operation 243 | // that we did for the document has failed. 244 | response.items.forEach((action, i) => { 245 | const operation = Object.keys(action)[0]; 246 | if (action[operation].error) { 247 | erroredDocuments.push({ 248 | // If the status is 429 it means that you can retry the document, 249 | // otherwise it's very likely a mapping error, and you should 250 | // fix the document before to try it again. 251 | status: action[operation].status, 252 | error: action[operation].error, 253 | operation: collection[i * 2], 254 | document: collection[i * 2 + 1], 255 | }); 256 | this.stats.indexErrors += 1; 257 | } else { 258 | this.stats.recordsIndexed += 1; 259 | } 260 | }); 261 | console.log(erroredDocuments); 262 | } else { 263 | this.stats.batchesIndexed += 1; 264 | this.stats.recordsIndexed += collection.length; 265 | } 266 | } 267 | private displayStats(start) { 268 | const end = new Date().getTime(); 269 | console.log(this.stats); 270 | console.log(`✨ Done in: ${humanizeDuration(end - start)}`); 271 | } 272 | private async connect() { 273 | if (this.config.collection) { 274 | const mongo = MongoDBSource.getInstance(); 275 | await mongo.connect(); 276 | this.datasource = mongo; 277 | } else { 278 | this.datasource = new MySQLDataSource(); 279 | } 280 | } 281 | } 282 | 283 | export interface IndexerConfig { 284 | /** 285 | * define the mappings to be used by the index. Usually elastic search will define these mappings automatically 286 | * but you can define your own for advanced usage if the default mappings are not enough 287 | * e.g. 288 | * { 289 | * location: { type: "geo_point" }, 290 | * title: { type: "text" }, 291 | * description: { 292 | * type: "text" 293 | * analyzer: "standard", 294 | * fields: { 295 | * english: { 296 | * type: "text", 297 | * analyzer: "custom_analyzer" 298 | * } 299 | * } 300 | * } 301 | * }, 302 | */ 303 | mappings?: { [key: string]: object }; 304 | 305 | /** 306 | * This can be a MySQL query or a mongo filter 307 | */ 308 | query?: string | any; 309 | 310 | /** 311 | * The collection used for mongo queries 312 | */ 313 | collection?: string; // used for mongo collection queries 314 | 315 | /** 316 | * Alias for indexName 317 | */ 318 | index: string; //alias for indexName 319 | 320 | /** 321 | * This is the name of the elastic search index 322 | */ 323 | indexName?: string; 324 | 325 | /** 326 | * This is the number of documents/records to include in each bulk index request 327 | */ 328 | batchSize?: number; 329 | 330 | /** 331 | * When using the {lastIndexedId} variable in a query (only for MySQL), this property defines the id column to use in the database 332 | */ 333 | id?: string; 334 | 335 | /** 336 | * If set to true, the indexer will only index properties that have been defined in the mappings property of the IndexerConfig 337 | */ 338 | explicitMapping?: boolean; 339 | 340 | /** 341 | * If set to true, the indexer will delete the existing index if it exists and create a new one before indexing data 342 | **/ 343 | reindex?: boolean; 344 | 345 | /** 346 | * The reducer will receive the results of a query as an input and the output will be subsequently indexed 347 | */ 348 | useReducer?: boolean; 349 | 350 | /** 351 | * Elasticsearch url here can override the one defined in the environment variable 352 | */ 353 | elasticsearch_url?: string; 354 | 355 | /** 356 | * used for index settings such as defining analyzers: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/configuring-analyzers.html 357 | * see also: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/index-modules.html 358 | * this is passed to client.indices.create body property: https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#_indices_create 359 | */ 360 | settings?: any; 361 | } 362 | 363 | export const defaultConfig: IndexerConfig = { 364 | batchSize: 100, 365 | id: 'id', 366 | explicitMapping: false, 367 | query: null, 368 | index: 'myelastic-index', 369 | }; 370 | 371 | export interface GroupSet extends Set {} 372 | export interface IndicesSet extends Set {} 373 | export interface GroupedRow { 374 | [index: number]: { index: { _index: string } }; 375 | any; 376 | } 377 | export interface GroupedCollection extends Array {} 378 | -------------------------------------------------------------------------------- /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.8.3" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" 8 | integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== 9 | dependencies: 10 | "@babel/highlight" "^7.8.3" 11 | 12 | "@babel/helper-validator-identifier@^7.9.0": 13 | version "7.9.5" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" 15 | integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== 16 | 17 | "@babel/highlight@^7.8.3": 18 | version "7.9.0" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" 20 | integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.9.0" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@elastic/elasticsearch@^7.3.0": 27 | version "7.6.1" 28 | resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-7.6.1.tgz#f23fb6146deb8053c1acc19bc4a6ddf6f9961a1e" 29 | integrity sha512-TEffCqUM9mK91eScc8pC/7p5+hF3+dXuz1lm40sxsB6495ilcVz7nn31BtOoocRTtmGdHjsCQRZqPpM0caatcQ== 30 | dependencies: 31 | debug "^4.1.1" 32 | decompress-response "^4.2.0" 33 | into-stream "^5.1.0" 34 | ms "^2.1.1" 35 | once "^1.4.0" 36 | pump "^3.0.0" 37 | secure-json-parse "^2.1.0" 38 | 39 | "@types/bson@*": 40 | version "4.0.2" 41 | resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.0.2.tgz#7accb85942fc39bbdb7515d4de437c04f698115f" 42 | integrity sha512-+uWmsejEHfmSjyyM/LkrP0orfE2m5Mx9Xel4tXNeqi1ldK5XMQcDsFkBmLDtuyKUbxj2jGDo0H240fbCRJZo7Q== 43 | dependencies: 44 | "@types/node" "*" 45 | 46 | "@types/color-name@^1.1.1": 47 | version "1.1.1" 48 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 49 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 50 | 51 | "@types/mongodb@^3.5.16": 52 | version "3.5.16" 53 | resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.5.16.tgz#b39b2e4873a5f399aa2a9027baeca542d0d76ebe" 54 | integrity sha512-q12k9vFEGfQTUTC9KiN+Lf1nPpEawuPyTfIHBgGn+lSD/4ICZhePxQqEe/ukRgAjS63vdc+Td758VBr4bUGNjg== 55 | dependencies: 56 | "@types/bson" "*" 57 | "@types/node" "*" 58 | 59 | "@types/mysql@^2.15.10": 60 | version "2.15.10" 61 | resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.10.tgz#225e99e16f6ed3e00091e7cd8821c9fa3cb38149" 62 | integrity sha512-mx8HnU+ob01hT3f4GDW8NSoUqID1CgRfiPh/CgeDgdwvG0DsQtZsPdOXH9LHos/pKv2qkZAA4/ospo0+QoOfUQ== 63 | dependencies: 64 | "@types/node" "*" 65 | 66 | "@types/node@*": 67 | version "13.13.5" 68 | resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.5.tgz#96ec3b0afafd64a4ccea9107b75bf8489f0e5765" 69 | integrity sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g== 70 | 71 | "@types/node@^12.7.5": 72 | version "12.12.38" 73 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.38.tgz#58841a382f231ad005dbb935c36d44aa1118a26b" 74 | integrity sha512-75eLjX0pFuTcUXnnWmALMzzkYorjND0ezNEycaKesbUBg9eGZp4GHPuDmkRc4mQQvIpe29zrzATNRA6hkYqwmA== 75 | 76 | "@types/normalize-package-data@^2.4.0": 77 | version "2.4.0" 78 | resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" 79 | integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== 80 | 81 | "@types/yargs-parser@*": 82 | version "15.0.0" 83 | resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" 84 | integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== 85 | 86 | "@types/yargs@^13.0.2": 87 | version "13.0.8" 88 | resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99" 89 | integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA== 90 | dependencies: 91 | "@types/yargs-parser" "*" 92 | 93 | acorn-jsx@^5.2.0: 94 | version "5.2.0" 95 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" 96 | integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== 97 | 98 | acorn@^7.1.1: 99 | version "7.2.0" 100 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" 101 | integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== 102 | 103 | ajv@^6.10.0, ajv@^6.10.2: 104 | version "6.12.2" 105 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" 106 | integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== 107 | dependencies: 108 | fast-deep-equal "^3.1.1" 109 | fast-json-stable-stringify "^2.0.0" 110 | json-schema-traverse "^0.4.1" 111 | uri-js "^4.2.2" 112 | 113 | ansi-escapes@^4.2.1: 114 | version "4.3.1" 115 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" 116 | integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== 117 | dependencies: 118 | type-fest "^0.11.0" 119 | 120 | ansi-regex@^4.1.0: 121 | version "4.1.0" 122 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 123 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 124 | 125 | ansi-regex@^5.0.0: 126 | version "5.0.0" 127 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 128 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 129 | 130 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 131 | version "3.2.1" 132 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 133 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 134 | dependencies: 135 | color-convert "^1.9.0" 136 | 137 | ansi-styles@^4.1.0: 138 | version "4.2.1" 139 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 140 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 141 | dependencies: 142 | "@types/color-name" "^1.1.1" 143 | color-convert "^2.0.1" 144 | 145 | arg@^4.1.0: 146 | version "4.1.3" 147 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 148 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 149 | 150 | argparse@^1.0.7: 151 | version "1.0.10" 152 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 153 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 154 | dependencies: 155 | sprintf-js "~1.0.2" 156 | 157 | astral-regex@^1.0.0: 158 | version "1.0.0" 159 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 160 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 161 | 162 | balanced-match@^1.0.0: 163 | version "1.0.0" 164 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 165 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 166 | 167 | bignumber.js@9.0.0: 168 | version "9.0.0" 169 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" 170 | integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== 171 | 172 | bl@^2.2.0: 173 | version "2.2.0" 174 | resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493" 175 | integrity sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA== 176 | dependencies: 177 | readable-stream "^2.3.5" 178 | safe-buffer "^5.1.1" 179 | 180 | brace-expansion@^1.1.7: 181 | version "1.1.11" 182 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 183 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 184 | dependencies: 185 | balanced-match "^1.0.0" 186 | concat-map "0.0.1" 187 | 188 | bson@^1.1.4: 189 | version "1.1.4" 190 | resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.4.tgz#f76870d799f15b854dffb7ee32f0a874797f7e89" 191 | integrity sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q== 192 | 193 | buffer-from@^1.0.0: 194 | version "1.1.1" 195 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 196 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 197 | 198 | builtin-modules@^1.1.1: 199 | version "1.1.1" 200 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 201 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 202 | 203 | caller-callsite@^2.0.0: 204 | version "2.0.0" 205 | resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" 206 | integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= 207 | dependencies: 208 | callsites "^2.0.0" 209 | 210 | caller-path@^2.0.0: 211 | version "2.0.0" 212 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" 213 | integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= 214 | dependencies: 215 | caller-callsite "^2.0.0" 216 | 217 | callsites@^2.0.0: 218 | version "2.0.0" 219 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" 220 | integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= 221 | 222 | callsites@^3.0.0: 223 | version "3.1.0" 224 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 225 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 226 | 227 | camelcase@^5.0.0: 228 | version "5.3.1" 229 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 230 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 231 | 232 | chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.2: 233 | version "2.4.2" 234 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 235 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 236 | dependencies: 237 | ansi-styles "^3.2.1" 238 | escape-string-regexp "^1.0.5" 239 | supports-color "^5.3.0" 240 | 241 | chalk@^3.0.0: 242 | version "3.0.0" 243 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 244 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 245 | dependencies: 246 | ansi-styles "^4.1.0" 247 | supports-color "^7.1.0" 248 | 249 | chardet@^0.7.0: 250 | version "0.7.0" 251 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 252 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 253 | 254 | ci-info@^2.0.0: 255 | version "2.0.0" 256 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 257 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 258 | 259 | cli-cursor@^3.1.0: 260 | version "3.1.0" 261 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 262 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 263 | dependencies: 264 | restore-cursor "^3.1.0" 265 | 266 | cli-width@^2.0.0: 267 | version "2.2.1" 268 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" 269 | integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== 270 | 271 | cliui@^5.0.0: 272 | version "5.0.0" 273 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 274 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 275 | dependencies: 276 | string-width "^3.1.0" 277 | strip-ansi "^5.2.0" 278 | wrap-ansi "^5.1.0" 279 | 280 | color-convert@^1.9.0: 281 | version "1.9.3" 282 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 283 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 284 | dependencies: 285 | color-name "1.1.3" 286 | 287 | color-convert@^2.0.1: 288 | version "2.0.1" 289 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 290 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 291 | dependencies: 292 | color-name "~1.1.4" 293 | 294 | color-name@1.1.3: 295 | version "1.1.3" 296 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 297 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 298 | 299 | color-name@~1.1.4: 300 | version "1.1.4" 301 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 302 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 303 | 304 | commander@^2.12.1: 305 | version "2.20.3" 306 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 307 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 308 | 309 | concat-map@0.0.1: 310 | version "0.0.1" 311 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 312 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 313 | 314 | core-util-is@~1.0.0: 315 | version "1.0.2" 316 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 317 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 318 | 319 | cosmiconfig@^5.2.1: 320 | version "5.2.1" 321 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" 322 | integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== 323 | dependencies: 324 | import-fresh "^2.0.0" 325 | is-directory "^0.3.1" 326 | js-yaml "^3.13.1" 327 | parse-json "^4.0.0" 328 | 329 | cross-spawn@^6.0.0, cross-spawn@^6.0.5: 330 | version "6.0.5" 331 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 332 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 333 | dependencies: 334 | nice-try "^1.0.4" 335 | path-key "^2.0.1" 336 | semver "^5.5.0" 337 | shebang-command "^1.2.0" 338 | which "^1.2.9" 339 | 340 | debug@^4.0.1, debug@^4.1.1: 341 | version "4.1.1" 342 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 343 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 344 | dependencies: 345 | ms "^2.1.1" 346 | 347 | decamelize@^1.2.0: 348 | version "1.2.0" 349 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 350 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 351 | 352 | decompress-response@^4.2.0: 353 | version "4.2.1" 354 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" 355 | integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== 356 | dependencies: 357 | mimic-response "^2.0.0" 358 | 359 | deep-is@~0.1.3: 360 | version "0.1.3" 361 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 362 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 363 | 364 | denque@^1.4.1: 365 | version "1.4.1" 366 | resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" 367 | integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== 368 | 369 | diff@^3.1.0, diff@^3.2.0: 370 | version "3.5.0" 371 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 372 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 373 | 374 | doctrine@^3.0.0: 375 | version "3.0.0" 376 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 377 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 378 | dependencies: 379 | esutils "^2.0.2" 380 | 381 | dotenv@^8.2.0: 382 | version "8.2.0" 383 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" 384 | integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== 385 | 386 | emoji-regex@^7.0.1: 387 | version "7.0.3" 388 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 389 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 390 | 391 | emoji-regex@^8.0.0: 392 | version "8.0.0" 393 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 394 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 395 | 396 | end-of-stream@^1.1.0: 397 | version "1.4.4" 398 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 399 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 400 | dependencies: 401 | once "^1.4.0" 402 | 403 | error-ex@^1.3.1: 404 | version "1.3.2" 405 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 406 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 407 | dependencies: 408 | is-arrayish "^0.2.1" 409 | 410 | escape-string-regexp@^1.0.5: 411 | version "1.0.5" 412 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 413 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 414 | 415 | eslint-config-prettier@^6.3.0: 416 | version "6.11.0" 417 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" 418 | integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== 419 | dependencies: 420 | get-stdin "^6.0.0" 421 | 422 | eslint-plugin-prettier@^3.1.0: 423 | version "3.1.3" 424 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz#ae116a0fc0e598fdae48743a4430903de5b4e6ca" 425 | integrity sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ== 426 | dependencies: 427 | prettier-linter-helpers "^1.0.0" 428 | 429 | eslint-scope@^5.0.0: 430 | version "5.0.0" 431 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" 432 | integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== 433 | dependencies: 434 | esrecurse "^4.1.0" 435 | estraverse "^4.1.1" 436 | 437 | eslint-utils@^1.4.3: 438 | version "1.4.3" 439 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" 440 | integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== 441 | dependencies: 442 | eslint-visitor-keys "^1.1.0" 443 | 444 | eslint-visitor-keys@^1.1.0: 445 | version "1.1.0" 446 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" 447 | integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== 448 | 449 | eslint@^6.4.0: 450 | version "6.8.0" 451 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" 452 | integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== 453 | dependencies: 454 | "@babel/code-frame" "^7.0.0" 455 | ajv "^6.10.0" 456 | chalk "^2.1.0" 457 | cross-spawn "^6.0.5" 458 | debug "^4.0.1" 459 | doctrine "^3.0.0" 460 | eslint-scope "^5.0.0" 461 | eslint-utils "^1.4.3" 462 | eslint-visitor-keys "^1.1.0" 463 | espree "^6.1.2" 464 | esquery "^1.0.1" 465 | esutils "^2.0.2" 466 | file-entry-cache "^5.0.1" 467 | functional-red-black-tree "^1.0.1" 468 | glob-parent "^5.0.0" 469 | globals "^12.1.0" 470 | ignore "^4.0.6" 471 | import-fresh "^3.0.0" 472 | imurmurhash "^0.1.4" 473 | inquirer "^7.0.0" 474 | is-glob "^4.0.0" 475 | js-yaml "^3.13.1" 476 | json-stable-stringify-without-jsonify "^1.0.1" 477 | levn "^0.3.0" 478 | lodash "^4.17.14" 479 | minimatch "^3.0.4" 480 | mkdirp "^0.5.1" 481 | natural-compare "^1.4.0" 482 | optionator "^0.8.3" 483 | progress "^2.0.0" 484 | regexpp "^2.0.1" 485 | semver "^6.1.2" 486 | strip-ansi "^5.2.0" 487 | strip-json-comments "^3.0.1" 488 | table "^5.2.3" 489 | text-table "^0.2.0" 490 | v8-compile-cache "^2.0.3" 491 | 492 | espree@^6.1.2: 493 | version "6.2.1" 494 | resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" 495 | integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== 496 | dependencies: 497 | acorn "^7.1.1" 498 | acorn-jsx "^5.2.0" 499 | eslint-visitor-keys "^1.1.0" 500 | 501 | esprima@^4.0.0: 502 | version "4.0.1" 503 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 504 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 505 | 506 | esquery@^1.0.1: 507 | version "1.3.1" 508 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" 509 | integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== 510 | dependencies: 511 | estraverse "^5.1.0" 512 | 513 | esrecurse@^4.1.0: 514 | version "4.2.1" 515 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 516 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 517 | dependencies: 518 | estraverse "^4.1.0" 519 | 520 | estraverse@^4.1.0, estraverse@^4.1.1: 521 | version "4.3.0" 522 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 523 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 524 | 525 | estraverse@^5.1.0: 526 | version "5.1.0" 527 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" 528 | integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== 529 | 530 | esutils@^2.0.2: 531 | version "2.0.3" 532 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 533 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 534 | 535 | execa@^1.0.0: 536 | version "1.0.0" 537 | resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" 538 | integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== 539 | dependencies: 540 | cross-spawn "^6.0.0" 541 | get-stream "^4.0.0" 542 | is-stream "^1.1.0" 543 | npm-run-path "^2.0.0" 544 | p-finally "^1.0.0" 545 | signal-exit "^3.0.0" 546 | strip-eof "^1.0.0" 547 | 548 | external-editor@^3.0.3: 549 | version "3.1.0" 550 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 551 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 552 | dependencies: 553 | chardet "^0.7.0" 554 | iconv-lite "^0.4.24" 555 | tmp "^0.0.33" 556 | 557 | fast-deep-equal@^3.1.1: 558 | version "3.1.1" 559 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" 560 | integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== 561 | 562 | fast-diff@^1.1.2: 563 | version "1.2.0" 564 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" 565 | integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== 566 | 567 | fast-json-stable-stringify@^2.0.0: 568 | version "2.1.0" 569 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 570 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 571 | 572 | fast-levenshtein@~2.0.6: 573 | version "2.0.6" 574 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 575 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 576 | 577 | figures@^3.0.0: 578 | version "3.2.0" 579 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" 580 | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== 581 | dependencies: 582 | escape-string-regexp "^1.0.5" 583 | 584 | file-entry-cache@^5.0.1: 585 | version "5.0.1" 586 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 587 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 588 | dependencies: 589 | flat-cache "^2.0.1" 590 | 591 | find-config@^1.0.0: 592 | version "1.0.0" 593 | resolved "https://registry.yarnpkg.com/find-config/-/find-config-1.0.0.tgz#eafa2b9bc07fa9c90e9a0c3ef9cecf1cc800f530" 594 | integrity sha1-6vorm8B/qckOmgw++c7PHMgA9TA= 595 | dependencies: 596 | user-home "^2.0.0" 597 | 598 | find-up@^3.0.0: 599 | version "3.0.0" 600 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 601 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 602 | dependencies: 603 | locate-path "^3.0.0" 604 | 605 | find-up@^4.0.0: 606 | version "4.1.0" 607 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 608 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 609 | dependencies: 610 | locate-path "^5.0.0" 611 | path-exists "^4.0.0" 612 | 613 | flat-cache@^2.0.1: 614 | version "2.0.1" 615 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 616 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 617 | dependencies: 618 | flatted "^2.0.0" 619 | rimraf "2.6.3" 620 | write "1.0.3" 621 | 622 | flatted@^2.0.0: 623 | version "2.0.2" 624 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" 625 | integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== 626 | 627 | from2@^2.3.0: 628 | version "2.3.0" 629 | resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" 630 | integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= 631 | dependencies: 632 | inherits "^2.0.1" 633 | readable-stream "^2.0.0" 634 | 635 | fs.realpath@^1.0.0: 636 | version "1.0.0" 637 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 638 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 639 | 640 | fs@0.0.1-security: 641 | version "0.0.1-security" 642 | resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" 643 | integrity sha1-invTcYa23d84E/I4WLV+yq9eQdQ= 644 | 645 | functional-red-black-tree@^1.0.1: 646 | version "1.0.1" 647 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 648 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 649 | 650 | get-caller-file@^2.0.1: 651 | version "2.0.5" 652 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 653 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 654 | 655 | get-stdin@^6.0.0: 656 | version "6.0.0" 657 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 658 | integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== 659 | 660 | get-stdin@^7.0.0: 661 | version "7.0.0" 662 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" 663 | integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== 664 | 665 | get-stream@^4.0.0: 666 | version "4.1.0" 667 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 668 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 669 | dependencies: 670 | pump "^3.0.0" 671 | 672 | glob-parent@^5.0.0: 673 | version "5.1.1" 674 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 675 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 676 | dependencies: 677 | is-glob "^4.0.1" 678 | 679 | glob@^7.1.1, glob@^7.1.3: 680 | version "7.1.6" 681 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 682 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 683 | dependencies: 684 | fs.realpath "^1.0.0" 685 | inflight "^1.0.4" 686 | inherits "2" 687 | minimatch "^3.0.4" 688 | once "^1.3.0" 689 | path-is-absolute "^1.0.0" 690 | 691 | globals@^12.1.0: 692 | version "12.4.0" 693 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" 694 | integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== 695 | dependencies: 696 | type-fest "^0.8.1" 697 | 698 | has-flag@^3.0.0: 699 | version "3.0.0" 700 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 701 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 702 | 703 | has-flag@^4.0.0: 704 | version "4.0.0" 705 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 706 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 707 | 708 | hosted-git-info@^2.1.4: 709 | version "2.8.8" 710 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" 711 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== 712 | 713 | humanize-duration@^3.20.1: 714 | version "3.22.0" 715 | resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.22.0.tgz#b0b577e2071f231e69b71bfae25e1bb342ffb915" 716 | integrity sha512-kq2Ncl1E8I7LJtjWhraQS8/LCsdt6fTQ+fwrGJ8dLSNFITW5YQpGWAgPgzjfIErAID7QHv0PA+HZBPfAf6f7IA== 717 | 718 | husky@^3.0.5: 719 | version "3.1.0" 720 | resolved "https://registry.yarnpkg.com/husky/-/husky-3.1.0.tgz#5faad520ab860582ed94f0c1a77f0f04c90b57c0" 721 | integrity sha512-FJkPoHHB+6s4a+jwPqBudBDvYZsoQW5/HBuMSehC8qDiCe50kpcxeqFoDSlow+9I6wg47YxBoT3WxaURlrDIIQ== 722 | dependencies: 723 | chalk "^2.4.2" 724 | ci-info "^2.0.0" 725 | cosmiconfig "^5.2.1" 726 | execa "^1.0.0" 727 | get-stdin "^7.0.0" 728 | opencollective-postinstall "^2.0.2" 729 | pkg-dir "^4.2.0" 730 | please-upgrade-node "^3.2.0" 731 | read-pkg "^5.2.0" 732 | run-node "^1.0.0" 733 | slash "^3.0.0" 734 | 735 | iconv-lite@^0.4.24: 736 | version "0.4.24" 737 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 738 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 739 | dependencies: 740 | safer-buffer ">= 2.1.2 < 3" 741 | 742 | ignore@^4.0.6: 743 | version "4.0.6" 744 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 745 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 746 | 747 | import-fresh@^2.0.0: 748 | version "2.0.0" 749 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" 750 | integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= 751 | dependencies: 752 | caller-path "^2.0.0" 753 | resolve-from "^3.0.0" 754 | 755 | import-fresh@^3.0.0: 756 | version "3.2.1" 757 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" 758 | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== 759 | dependencies: 760 | parent-module "^1.0.0" 761 | resolve-from "^4.0.0" 762 | 763 | imurmurhash@^0.1.4: 764 | version "0.1.4" 765 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 766 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 767 | 768 | inflight@^1.0.4: 769 | version "1.0.6" 770 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 771 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 772 | dependencies: 773 | once "^1.3.0" 774 | wrappy "1" 775 | 776 | inherits@2, inherits@^2.0.1, inherits@~2.0.3: 777 | version "2.0.4" 778 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 779 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 780 | 781 | inquirer@^7.0.0: 782 | version "7.1.0" 783 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" 784 | integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== 785 | dependencies: 786 | ansi-escapes "^4.2.1" 787 | chalk "^3.0.0" 788 | cli-cursor "^3.1.0" 789 | cli-width "^2.0.0" 790 | external-editor "^3.0.3" 791 | figures "^3.0.0" 792 | lodash "^4.17.15" 793 | mute-stream "0.0.8" 794 | run-async "^2.4.0" 795 | rxjs "^6.5.3" 796 | string-width "^4.1.0" 797 | strip-ansi "^6.0.0" 798 | through "^2.3.6" 799 | 800 | into-stream@^5.1.0: 801 | version "5.1.1" 802 | resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-5.1.1.tgz#f9a20a348a11f3c13face22763f2d02e127f4db8" 803 | integrity sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA== 804 | dependencies: 805 | from2 "^2.3.0" 806 | p-is-promise "^3.0.0" 807 | 808 | is-arrayish@^0.2.1: 809 | version "0.2.1" 810 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 811 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 812 | 813 | is-directory@^0.3.1: 814 | version "0.3.1" 815 | resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" 816 | integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= 817 | 818 | is-extglob@^2.1.1: 819 | version "2.1.1" 820 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 821 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 822 | 823 | is-fullwidth-code-point@^2.0.0: 824 | version "2.0.0" 825 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 826 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 827 | 828 | is-fullwidth-code-point@^3.0.0: 829 | version "3.0.0" 830 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 831 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 832 | 833 | is-glob@^4.0.0, is-glob@^4.0.1: 834 | version "4.0.1" 835 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 836 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 837 | dependencies: 838 | is-extglob "^2.1.1" 839 | 840 | is-stream@^1.1.0: 841 | version "1.1.0" 842 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 843 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 844 | 845 | isarray@~1.0.0: 846 | version "1.0.0" 847 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 848 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 849 | 850 | isexe@^2.0.0: 851 | version "2.0.0" 852 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 853 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 854 | 855 | js-tokens@^4.0.0: 856 | version "4.0.0" 857 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 858 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 859 | 860 | js-yaml@^3.13.0, js-yaml@^3.13.1: 861 | version "3.13.1" 862 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 863 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 864 | dependencies: 865 | argparse "^1.0.7" 866 | esprima "^4.0.0" 867 | 868 | json-parse-better-errors@^1.0.1: 869 | version "1.0.2" 870 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 871 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 872 | 873 | json-schema-traverse@^0.4.1: 874 | version "0.4.1" 875 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 876 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 877 | 878 | json-stable-stringify-without-jsonify@^1.0.1: 879 | version "1.0.1" 880 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 881 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 882 | 883 | levn@^0.3.0, levn@~0.3.0: 884 | version "0.3.0" 885 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 886 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 887 | dependencies: 888 | prelude-ls "~1.1.2" 889 | type-check "~0.3.2" 890 | 891 | lines-and-columns@^1.1.6: 892 | version "1.1.6" 893 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" 894 | integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= 895 | 896 | locate-path@^3.0.0: 897 | version "3.0.0" 898 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 899 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 900 | dependencies: 901 | p-locate "^3.0.0" 902 | path-exists "^3.0.0" 903 | 904 | locate-path@^5.0.0: 905 | version "5.0.0" 906 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 907 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 908 | dependencies: 909 | p-locate "^4.1.0" 910 | 911 | lodash@^4.17.14, lodash@^4.17.15: 912 | version "4.17.15" 913 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 914 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 915 | 916 | make-error@^1.1.1: 917 | version "1.3.6" 918 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 919 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 920 | 921 | memory-pager@^1.0.2: 922 | version "1.5.0" 923 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" 924 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== 925 | 926 | mimic-fn@^2.1.0: 927 | version "2.1.0" 928 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 929 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 930 | 931 | mimic-response@^2.0.0: 932 | version "2.1.0" 933 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" 934 | integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== 935 | 936 | minimatch@^3.0.4: 937 | version "3.0.4" 938 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 939 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 940 | dependencies: 941 | brace-expansion "^1.1.7" 942 | 943 | minimist@^1.2.5: 944 | version "1.2.5" 945 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 946 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 947 | 948 | mkdirp@^0.5.1: 949 | version "0.5.5" 950 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 951 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 952 | dependencies: 953 | minimist "^1.2.5" 954 | 955 | moment@^2.24.0: 956 | version "2.25.3" 957 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.25.3.tgz#252ff41319cf41e47761a1a88cab30edfe9808c0" 958 | integrity sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg== 959 | 960 | mongodb@^3.5.7: 961 | version "3.5.7" 962 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.5.7.tgz#6dcfff3bdbf67a53263dcca1647c265eea1d065d" 963 | integrity sha512-lMtleRT+vIgY/JhhTn1nyGwnSMmJkJELp+4ZbrjctrnBxuLbj6rmLuJFz8W2xUzUqWmqoyVxJLYuC58ZKpcTYQ== 964 | dependencies: 965 | bl "^2.2.0" 966 | bson "^1.1.4" 967 | denque "^1.4.1" 968 | require_optional "^1.0.1" 969 | safe-buffer "^5.1.2" 970 | optionalDependencies: 971 | saslprep "^1.0.0" 972 | 973 | ms@^2.1.1: 974 | version "2.1.2" 975 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 976 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 977 | 978 | mute-stream@0.0.8: 979 | version "0.0.8" 980 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 981 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 982 | 983 | mysql@^2.17.1: 984 | version "2.18.1" 985 | resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.18.1.tgz#2254143855c5a8c73825e4522baf2ea021766717" 986 | integrity sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig== 987 | dependencies: 988 | bignumber.js "9.0.0" 989 | readable-stream "2.3.7" 990 | safe-buffer "5.1.2" 991 | sqlstring "2.3.1" 992 | 993 | natural-compare@^1.4.0: 994 | version "1.4.0" 995 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 996 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 997 | 998 | nice-try@^1.0.4: 999 | version "1.0.5" 1000 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1001 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1002 | 1003 | normalize-package-data@^2.5.0: 1004 | version "2.5.0" 1005 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1006 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1007 | dependencies: 1008 | hosted-git-info "^2.1.4" 1009 | resolve "^1.10.0" 1010 | semver "2 || 3 || 4 || 5" 1011 | validate-npm-package-license "^3.0.1" 1012 | 1013 | npm-run-path@^2.0.0: 1014 | version "2.0.2" 1015 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1016 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 1017 | dependencies: 1018 | path-key "^2.0.0" 1019 | 1020 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1021 | version "1.4.0" 1022 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1023 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1024 | dependencies: 1025 | wrappy "1" 1026 | 1027 | onetime@^5.1.0: 1028 | version "5.1.0" 1029 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 1030 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 1031 | dependencies: 1032 | mimic-fn "^2.1.0" 1033 | 1034 | opencollective-postinstall@^2.0.2: 1035 | version "2.0.2" 1036 | resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" 1037 | integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== 1038 | 1039 | optionator@^0.8.3: 1040 | version "0.8.3" 1041 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 1042 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 1043 | dependencies: 1044 | deep-is "~0.1.3" 1045 | fast-levenshtein "~2.0.6" 1046 | levn "~0.3.0" 1047 | prelude-ls "~1.1.2" 1048 | type-check "~0.3.2" 1049 | word-wrap "~1.2.3" 1050 | 1051 | os-homedir@^1.0.0: 1052 | version "1.0.2" 1053 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1054 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1055 | 1056 | os-tmpdir@~1.0.2: 1057 | version "1.0.2" 1058 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1059 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1060 | 1061 | p-finally@^1.0.0: 1062 | version "1.0.0" 1063 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1064 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 1065 | 1066 | p-is-promise@^3.0.0: 1067 | version "3.0.0" 1068 | resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" 1069 | integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ== 1070 | 1071 | p-limit@^2.0.0, p-limit@^2.2.0: 1072 | version "2.3.0" 1073 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1074 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1075 | dependencies: 1076 | p-try "^2.0.0" 1077 | 1078 | p-locate@^3.0.0: 1079 | version "3.0.0" 1080 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1081 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1082 | dependencies: 1083 | p-limit "^2.0.0" 1084 | 1085 | p-locate@^4.1.0: 1086 | version "4.1.0" 1087 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1088 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1089 | dependencies: 1090 | p-limit "^2.2.0" 1091 | 1092 | p-try@^2.0.0: 1093 | version "2.2.0" 1094 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1095 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1096 | 1097 | parent-module@^1.0.0: 1098 | version "1.0.1" 1099 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1100 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1101 | dependencies: 1102 | callsites "^3.0.0" 1103 | 1104 | parse-json@^4.0.0: 1105 | version "4.0.0" 1106 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 1107 | integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= 1108 | dependencies: 1109 | error-ex "^1.3.1" 1110 | json-parse-better-errors "^1.0.1" 1111 | 1112 | parse-json@^5.0.0: 1113 | version "5.0.0" 1114 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" 1115 | integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== 1116 | dependencies: 1117 | "@babel/code-frame" "^7.0.0" 1118 | error-ex "^1.3.1" 1119 | json-parse-better-errors "^1.0.1" 1120 | lines-and-columns "^1.1.6" 1121 | 1122 | path-exists@^3.0.0: 1123 | version "3.0.0" 1124 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1125 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1126 | 1127 | path-exists@^4.0.0: 1128 | version "4.0.0" 1129 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1130 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1131 | 1132 | path-is-absolute@^1.0.0: 1133 | version "1.0.1" 1134 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1135 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1136 | 1137 | path-key@^2.0.0, path-key@^2.0.1: 1138 | version "2.0.1" 1139 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1140 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1141 | 1142 | path-parse@^1.0.6: 1143 | version "1.0.6" 1144 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1145 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1146 | 1147 | pkg-dir@^4.2.0: 1148 | version "4.2.0" 1149 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1150 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1151 | dependencies: 1152 | find-up "^4.0.0" 1153 | 1154 | please-upgrade-node@^3.2.0: 1155 | version "3.2.0" 1156 | resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" 1157 | integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== 1158 | dependencies: 1159 | semver-compare "^1.0.0" 1160 | 1161 | prelude-ls@~1.1.2: 1162 | version "1.1.2" 1163 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1164 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 1165 | 1166 | prettier-linter-helpers@^1.0.0: 1167 | version "1.0.0" 1168 | resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 1169 | integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 1170 | dependencies: 1171 | fast-diff "^1.1.2" 1172 | 1173 | prettier@^1.18.2: 1174 | version "1.19.1" 1175 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" 1176 | integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== 1177 | 1178 | process-nextick-args@~2.0.0: 1179 | version "2.0.1" 1180 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1181 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1182 | 1183 | progress@^2.0.0: 1184 | version "2.0.3" 1185 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1186 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1187 | 1188 | pump@^3.0.0: 1189 | version "3.0.0" 1190 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1191 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1192 | dependencies: 1193 | end-of-stream "^1.1.0" 1194 | once "^1.3.1" 1195 | 1196 | punycode@^2.1.0: 1197 | version "2.1.1" 1198 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1199 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1200 | 1201 | read-pkg@^5.2.0: 1202 | version "5.2.0" 1203 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" 1204 | integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== 1205 | dependencies: 1206 | "@types/normalize-package-data" "^2.4.0" 1207 | normalize-package-data "^2.5.0" 1208 | parse-json "^5.0.0" 1209 | type-fest "^0.6.0" 1210 | 1211 | readable-stream@2.3.7, readable-stream@^2.0.0, readable-stream@^2.3.5: 1212 | version "2.3.7" 1213 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1214 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1215 | dependencies: 1216 | core-util-is "~1.0.0" 1217 | inherits "~2.0.3" 1218 | isarray "~1.0.0" 1219 | process-nextick-args "~2.0.0" 1220 | safe-buffer "~5.1.1" 1221 | string_decoder "~1.1.1" 1222 | util-deprecate "~1.0.1" 1223 | 1224 | regexpp@^2.0.1: 1225 | version "2.0.1" 1226 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 1227 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 1228 | 1229 | require-directory@^2.1.1: 1230 | version "2.1.1" 1231 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1232 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1233 | 1234 | require-main-filename@^2.0.0: 1235 | version "2.0.0" 1236 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1237 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1238 | 1239 | require_optional@^1.0.1: 1240 | version "1.0.1" 1241 | resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" 1242 | integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== 1243 | dependencies: 1244 | resolve-from "^2.0.0" 1245 | semver "^5.1.0" 1246 | 1247 | resolve-from@^2.0.0: 1248 | version "2.0.0" 1249 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 1250 | integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= 1251 | 1252 | resolve-from@^3.0.0: 1253 | version "3.0.0" 1254 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" 1255 | integrity sha1-six699nWiBvItuZTM17rywoYh0g= 1256 | 1257 | resolve-from@^4.0.0: 1258 | version "4.0.0" 1259 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1260 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1261 | 1262 | resolve@^1.10.0, resolve@^1.3.2: 1263 | version "1.17.0" 1264 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 1265 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 1266 | dependencies: 1267 | path-parse "^1.0.6" 1268 | 1269 | restore-cursor@^3.1.0: 1270 | version "3.1.0" 1271 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 1272 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 1273 | dependencies: 1274 | onetime "^5.1.0" 1275 | signal-exit "^3.0.2" 1276 | 1277 | rimraf@2.6.3: 1278 | version "2.6.3" 1279 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1280 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1281 | dependencies: 1282 | glob "^7.1.3" 1283 | 1284 | run-async@^2.4.0: 1285 | version "2.4.1" 1286 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 1287 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== 1288 | 1289 | run-node@^1.0.0: 1290 | version "1.0.0" 1291 | resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" 1292 | integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== 1293 | 1294 | rxjs@^6.5.3: 1295 | version "6.5.5" 1296 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" 1297 | integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== 1298 | dependencies: 1299 | tslib "^1.9.0" 1300 | 1301 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1302 | version "5.1.2" 1303 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1304 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1305 | 1306 | safe-buffer@^5.1.1, safe-buffer@^5.1.2: 1307 | version "5.2.1" 1308 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1309 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1310 | 1311 | "safer-buffer@>= 2.1.2 < 3": 1312 | version "2.1.2" 1313 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1314 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1315 | 1316 | saslprep@^1.0.0: 1317 | version "1.0.3" 1318 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" 1319 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== 1320 | dependencies: 1321 | sparse-bitfield "^3.0.3" 1322 | 1323 | secure-json-parse@^2.1.0: 1324 | version "2.1.0" 1325 | resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.1.0.tgz#ae76f5624256b5c497af887090a5d9e156c9fb20" 1326 | integrity sha512-GckO+MS/wT4UogDyoI/H/S1L0MCcKS1XX/vp48wfmU7Nw4woBmb8mIpu4zPBQjKlRT88/bt9xdoV4111jPpNJA== 1327 | 1328 | semver-compare@^1.0.0: 1329 | version "1.0.0" 1330 | resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" 1331 | integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= 1332 | 1333 | "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: 1334 | version "5.7.1" 1335 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1336 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1337 | 1338 | semver@^6.1.2: 1339 | version "6.3.0" 1340 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1341 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1342 | 1343 | set-blocking@^2.0.0: 1344 | version "2.0.0" 1345 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1346 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1347 | 1348 | shebang-command@^1.2.0: 1349 | version "1.2.0" 1350 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1351 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1352 | dependencies: 1353 | shebang-regex "^1.0.0" 1354 | 1355 | shebang-regex@^1.0.0: 1356 | version "1.0.0" 1357 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1358 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1359 | 1360 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1361 | version "3.0.3" 1362 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1363 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1364 | 1365 | slash@^3.0.0: 1366 | version "3.0.0" 1367 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1368 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1369 | 1370 | slice-ansi@^2.1.0: 1371 | version "2.1.0" 1372 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 1373 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 1374 | dependencies: 1375 | ansi-styles "^3.2.0" 1376 | astral-regex "^1.0.0" 1377 | is-fullwidth-code-point "^2.0.0" 1378 | 1379 | source-map-support@^0.5.6: 1380 | version "0.5.19" 1381 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 1382 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 1383 | dependencies: 1384 | buffer-from "^1.0.0" 1385 | source-map "^0.6.0" 1386 | 1387 | source-map@^0.6.0: 1388 | version "0.6.1" 1389 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1390 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1391 | 1392 | sparse-bitfield@^3.0.3: 1393 | version "3.0.3" 1394 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 1395 | integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= 1396 | dependencies: 1397 | memory-pager "^1.0.2" 1398 | 1399 | spdx-correct@^3.0.0: 1400 | version "3.1.0" 1401 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 1402 | integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== 1403 | dependencies: 1404 | spdx-expression-parse "^3.0.0" 1405 | spdx-license-ids "^3.0.0" 1406 | 1407 | spdx-exceptions@^2.1.0: 1408 | version "2.3.0" 1409 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1410 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 1411 | 1412 | spdx-expression-parse@^3.0.0: 1413 | version "3.0.0" 1414 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1415 | integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== 1416 | dependencies: 1417 | spdx-exceptions "^2.1.0" 1418 | spdx-license-ids "^3.0.0" 1419 | 1420 | spdx-license-ids@^3.0.0: 1421 | version "3.0.5" 1422 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 1423 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 1424 | 1425 | sprintf-js@~1.0.2: 1426 | version "1.0.3" 1427 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1428 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1429 | 1430 | sqlstring@2.3.1: 1431 | version "2.3.1" 1432 | resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" 1433 | integrity sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A= 1434 | 1435 | string-width@^3.0.0, string-width@^3.1.0: 1436 | version "3.1.0" 1437 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1438 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1439 | dependencies: 1440 | emoji-regex "^7.0.1" 1441 | is-fullwidth-code-point "^2.0.0" 1442 | strip-ansi "^5.1.0" 1443 | 1444 | string-width@^4.1.0: 1445 | version "4.2.0" 1446 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1447 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1448 | dependencies: 1449 | emoji-regex "^8.0.0" 1450 | is-fullwidth-code-point "^3.0.0" 1451 | strip-ansi "^6.0.0" 1452 | 1453 | string_decoder@~1.1.1: 1454 | version "1.1.1" 1455 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1456 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1457 | dependencies: 1458 | safe-buffer "~5.1.0" 1459 | 1460 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1461 | version "5.2.0" 1462 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1463 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1464 | dependencies: 1465 | ansi-regex "^4.1.0" 1466 | 1467 | strip-ansi@^6.0.0: 1468 | version "6.0.0" 1469 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1470 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1471 | dependencies: 1472 | ansi-regex "^5.0.0" 1473 | 1474 | strip-eof@^1.0.0: 1475 | version "1.0.0" 1476 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1477 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 1478 | 1479 | strip-json-comments@^3.0.1: 1480 | version "3.1.0" 1481 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" 1482 | integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== 1483 | 1484 | supports-color@^5.3.0: 1485 | version "5.5.0" 1486 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1487 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1488 | dependencies: 1489 | has-flag "^3.0.0" 1490 | 1491 | supports-color@^7.1.0: 1492 | version "7.1.0" 1493 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1494 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1495 | dependencies: 1496 | has-flag "^4.0.0" 1497 | 1498 | table@^5.2.3: 1499 | version "5.4.6" 1500 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" 1501 | integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== 1502 | dependencies: 1503 | ajv "^6.10.2" 1504 | lodash "^4.17.14" 1505 | slice-ansi "^2.1.0" 1506 | string-width "^3.0.0" 1507 | 1508 | text-table@^0.2.0: 1509 | version "0.2.0" 1510 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1511 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1512 | 1513 | through@^2.3.6: 1514 | version "2.3.8" 1515 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1516 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1517 | 1518 | tmp@^0.0.33: 1519 | version "0.0.33" 1520 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1521 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 1522 | dependencies: 1523 | os-tmpdir "~1.0.2" 1524 | 1525 | ts-node@8.1.0: 1526 | version "8.1.0" 1527 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.1.0.tgz#8c4b37036abd448577db22a061fd7a67d47e658e" 1528 | integrity sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A== 1529 | dependencies: 1530 | arg "^4.1.0" 1531 | diff "^3.1.0" 1532 | make-error "^1.1.1" 1533 | source-map-support "^0.5.6" 1534 | yn "^3.0.0" 1535 | 1536 | tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: 1537 | version "1.11.2" 1538 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.2.tgz#9c79d83272c9a7aaf166f73915c9667ecdde3cc9" 1539 | integrity sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg== 1540 | 1541 | tslint@5.16.0: 1542 | version "5.16.0" 1543 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.16.0.tgz#ae61f9c5a98d295b9a4f4553b1b1e831c1984d67" 1544 | integrity sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA== 1545 | dependencies: 1546 | "@babel/code-frame" "^7.0.0" 1547 | builtin-modules "^1.1.1" 1548 | chalk "^2.3.0" 1549 | commander "^2.12.1" 1550 | diff "^3.2.0" 1551 | glob "^7.1.1" 1552 | js-yaml "^3.13.0" 1553 | minimatch "^3.0.4" 1554 | mkdirp "^0.5.1" 1555 | resolve "^1.3.2" 1556 | semver "^5.3.0" 1557 | tslib "^1.8.0" 1558 | tsutils "^2.29.0" 1559 | 1560 | tsutils@^2.29.0: 1561 | version "2.29.0" 1562 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 1563 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 1564 | dependencies: 1565 | tslib "^1.8.1" 1566 | 1567 | type-check@~0.3.2: 1568 | version "0.3.2" 1569 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1570 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 1571 | dependencies: 1572 | prelude-ls "~1.1.2" 1573 | 1574 | type-fest@^0.11.0: 1575 | version "0.11.0" 1576 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" 1577 | integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== 1578 | 1579 | type-fest@^0.6.0: 1580 | version "0.6.0" 1581 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" 1582 | integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== 1583 | 1584 | type-fest@^0.8.1: 1585 | version "0.8.1" 1586 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1587 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1588 | 1589 | typescript@3.4.5: 1590 | version "3.4.5" 1591 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" 1592 | integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== 1593 | 1594 | uri-js@^4.2.2: 1595 | version "4.2.2" 1596 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1597 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1598 | dependencies: 1599 | punycode "^2.1.0" 1600 | 1601 | user-home@^2.0.0: 1602 | version "2.0.0" 1603 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 1604 | integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8= 1605 | dependencies: 1606 | os-homedir "^1.0.0" 1607 | 1608 | util-deprecate@~1.0.1: 1609 | version "1.0.2" 1610 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1611 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1612 | 1613 | v8-compile-cache@^2.0.3: 1614 | version "2.1.0" 1615 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" 1616 | integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== 1617 | 1618 | validate-npm-package-license@^3.0.1: 1619 | version "3.0.4" 1620 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1621 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 1622 | dependencies: 1623 | spdx-correct "^3.0.0" 1624 | spdx-expression-parse "^3.0.0" 1625 | 1626 | which-module@^2.0.0: 1627 | version "2.0.0" 1628 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1629 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1630 | 1631 | which@^1.2.9: 1632 | version "1.3.1" 1633 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1634 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1635 | dependencies: 1636 | isexe "^2.0.0" 1637 | 1638 | word-wrap@~1.2.3: 1639 | version "1.2.3" 1640 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1641 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1642 | 1643 | wrap-ansi@^5.1.0: 1644 | version "5.1.0" 1645 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 1646 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 1647 | dependencies: 1648 | ansi-styles "^3.2.0" 1649 | string-width "^3.0.0" 1650 | strip-ansi "^5.0.0" 1651 | 1652 | wrappy@1: 1653 | version "1.0.2" 1654 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1655 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1656 | 1657 | write@1.0.3: 1658 | version "1.0.3" 1659 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 1660 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 1661 | dependencies: 1662 | mkdirp "^0.5.1" 1663 | 1664 | y18n@^4.0.0: 1665 | version "4.0.0" 1666 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 1667 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 1668 | 1669 | yargs-parser@^15.0.1: 1670 | version "15.0.1" 1671 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" 1672 | integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== 1673 | dependencies: 1674 | camelcase "^5.0.0" 1675 | decamelize "^1.2.0" 1676 | 1677 | yargs@^14.0.0: 1678 | version "14.2.3" 1679 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" 1680 | integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== 1681 | dependencies: 1682 | cliui "^5.0.0" 1683 | decamelize "^1.2.0" 1684 | find-up "^3.0.0" 1685 | get-caller-file "^2.0.1" 1686 | require-directory "^2.1.1" 1687 | require-main-filename "^2.0.0" 1688 | set-blocking "^2.0.0" 1689 | string-width "^3.0.0" 1690 | which-module "^2.0.0" 1691 | y18n "^4.0.0" 1692 | yargs-parser "^15.0.1" 1693 | 1694 | yarn@^1.17.3: 1695 | version "1.22.4" 1696 | resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.4.tgz#01c1197ca5b27f21edc8bc472cd4c8ce0e5a470e" 1697 | integrity sha512-oYM7hi/lIWm9bCoDMEWgffW8aiNZXCWeZ1/tGy0DWrN6vmzjCXIKu2Y21o8DYVBUtiktwKcNoxyGl/2iKLUNGA== 1698 | 1699 | yn@^3.0.0: 1700 | version "3.1.1" 1701 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1702 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1703 | --------------------------------------------------------------------------------