├── .eslintignore ├── .env.template ├── .gitignore ├── src ├── modules │ ├── api │ │ ├── index.ts │ │ ├── types.ts │ │ └── BittrexApi.ts │ ├── utils.ts │ ├── bot │ │ ├── types.ts │ │ └── index.ts │ ├── configuration │ │ ├── index.ts │ │ ├── types.ts │ │ ├── Configuration.ts │ │ └── Configuration.validator.ts │ └── evaluation │ │ ├── types.ts │ │ └── EMAEvaluation.ts └── index.ts ├── paypal.gif ├── ema-crossing.png ├── tslint.json ├── .github ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md └── workflows │ └── codeql-analysis.yml ├── LICENSE ├── config.json ├── .eslintrc.js ├── README.md ├── package.json ├── tsconfig.json └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | .eslintrc.js -------------------------------------------------------------------------------- /.env.template: -------------------------------------------------------------------------------- 1 | BITTREX_API_KEY= 2 | BITTREX_API_SECRET= 3 | SENTRY_DSN= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .idea 4 | 5 | .env 6 | 7 | yarn-error.log -------------------------------------------------------------------------------- /src/modules/api/index.ts: -------------------------------------------------------------------------------- 1 | export { default as BittrexApi } from './BittrexApi'; 2 | -------------------------------------------------------------------------------- /paypal.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamWertarbyte/crypto-trading-bot/HEAD/paypal.gif -------------------------------------------------------------------------------- /ema-crossing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamWertarbyte/crypto-trading-bot/HEAD/ema-crossing.png -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": { 8 | "no-console": false 9 | }, 10 | "rulesDirectory": [] 11 | } 12 | -------------------------------------------------------------------------------- /src/modules/utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Awaitable sleep to keep API requests/min limit 3 | * @param ms - duration in milliseconds 4 | */ 5 | export const sleep = (ms: number): Promise => { 6 | return new Promise((resolve) => { 7 | setTimeout(resolve, ms); 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /src/modules/bot/types.ts: -------------------------------------------------------------------------------- 1 | import { Candle } from '../api/types'; 2 | 3 | /** 4 | * Only used for internal calculations for the react-stockcharts library 5 | * e.g. for ema 6 | */ 7 | export interface CandleReactStockCharts 8 | extends Omit { 9 | date: Date; 10 | emaS: number; 11 | emaL: number; 12 | } 13 | -------------------------------------------------------------------------------- /src/modules/configuration/index.ts: -------------------------------------------------------------------------------- 1 | import Configuration from './Configuration'; 2 | import validate from './Configuration.validator'; 3 | import * as config from '../../../config.json'; 4 | 5 | export const getConfig = (): Configuration => { 6 | // this will through a clear error if `value` is not of the 7 | // correct type. It will also fill in any default values 8 | return validate(config); 9 | }; 10 | -------------------------------------------------------------------------------- /src/modules/evaluation/types.ts: -------------------------------------------------------------------------------- 1 | import { BittrexApi } from '../api'; 2 | import Configuration from '../configuration/Configuration'; 3 | import { Balance, MarketDecision } from '../api/types'; 4 | 5 | export interface EvaluationInterface { 6 | api: BittrexApi; 7 | config: Configuration; 8 | evaluate: ( 9 | marketSymbol: string, 10 | balance?: Balance 11 | ) => Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/modules/configuration/types.ts: -------------------------------------------------------------------------------- 1 | export interface EMAShortLong { 2 | s: number; 3 | l: number; 4 | } 5 | 6 | export interface EMAShortLongOverride extends EMAShortLong { 7 | coins: string[]; 8 | } 9 | 10 | export type EMAConfiguration = { 11 | default: EMAShortLong; 12 | override?: EMAShortLongOverride[]; 13 | }; 14 | 15 | export type StableCoinsConfiguration = { 16 | coins: string[]; 17 | ignore: boolean; 18 | }; 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Version [e.g. 22] 29 | 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Wertarbyte 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import log from 'fancy-log'; 2 | import * as Sentry from '@sentry/node'; 3 | import { BittrexApi } from './modules/api'; 4 | import Bot from './modules/bot'; 5 | import { getConfig } from './modules/configuration'; 6 | 7 | require('dotenv').config(); 8 | 9 | log.info('This bot trades with the ichimoku trading system'); 10 | 11 | if (!process.env.BITTREX_API_KEY || !process.env.BITTREX_API_SECRET) { 12 | throw new Error( 13 | 'No BITTREX_API_KEY and or BITTREX_API_SECRET found. Check your environment variables' 14 | ); 15 | } 16 | 17 | log.info('Loading configuration…'); 18 | const config = getConfig(); 19 | log.info('Successfully loaded configuration', config); 20 | 21 | Sentry.init({ 22 | dsn: process.env.SENTRY_DSN, 23 | tracesSampleRate: 1.0, 24 | debug: config.debug 25 | }); 26 | 27 | const api = new BittrexApi( 28 | process.env.BITTREX_API_KEY, 29 | process.env.BITTREX_API_SECRET 30 | ); 31 | const bot = new Bot(api, config); 32 | 33 | const loop = async () => { 34 | try { 35 | await bot.start(); 36 | } catch (e) { 37 | log.warn(e); 38 | Sentry.captureException(e); 39 | } 40 | setTimeout(() => loop(), config.refreshTimeout); 41 | }; 42 | 43 | loop(); 44 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "HODL": ["BTC", "ETH"], 3 | "amountPerInvest": 50.0, 4 | "blacklist": ["DASH", "GRIN", "XMR", "ZEC"], 5 | "debug": false, 6 | "exactPositiveTicks": 2, 7 | "enableReporting": false, 8 | "ignoreTokenizedStocks": false, 9 | "mainMarket": "USDT", 10 | "minNegativeTicks": 2, 11 | "refreshTimeout": 180000, 12 | "tickInterval": "DAY_1", 13 | "emaConfiguration": { 14 | "default": { 15 | "s": 9, 16 | "l": 26 17 | } 18 | }, 19 | "stableCoins": { 20 | "coins": [ 21 | "ANCT", 22 | "BGBP", 23 | "BITCNY", 24 | "BITEUR", 25 | "BITUSD", 26 | "BUSD", 27 | "CONST", 28 | "CUSD", 29 | "DAI", 30 | "EBASE", 31 | "EURS", 32 | "EUSD", 33 | "EOSDT", 34 | "GUSD", 35 | "HUSD", 36 | "IDRT", 37 | "KRT", 38 | "PAX", 39 | "NIRX", 40 | "QC", 41 | "SBD", 42 | "SDUSD", 43 | "TUSD", 44 | "UPUSD", 45 | "USDC", 46 | "USDK", 47 | "USDQ", 48 | "USDN", 49 | "USDS", 50 | "USDT", 51 | "USDX", 52 | "USC", 53 | "USNBT", 54 | "UST", 55 | "VNDC", 56 | "WSD", 57 | "XAUT", 58 | "XEUR", 59 | "ZUSD" 60 | ], 61 | "ignore": true 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: '@typescript-eslint/parser', 3 | parserOptions: { 4 | project: 'tsconfig.json', 5 | sourceType: 'module' 6 | }, 7 | root: true, 8 | plugins: ['jest', '@typescript-eslint', 'promise'], 9 | extends: [ 10 | 'semistandard', 11 | 'plugin:@typescript-eslint/recommended', 12 | 'plugin:promise/recommended', 13 | 'plugin:prettier/recommended', 14 | 'prettier/@typescript-eslint' 15 | ], 16 | env: { 17 | node: true, 18 | jest: true 19 | }, 20 | rules: { 21 | '@typescript-eslint/no-unused-vars': 'error', 22 | '@typescript-eslint/no-unused-expressions': [ 23 | 'error', 24 | { 25 | allowShortCircuit: true, 26 | allowTernary: true, 27 | allowTaggedTemplates: true 28 | } 29 | ], 30 | 'import/order': [ 31 | 'error', 32 | { 33 | 'newlines-between': 'always', 34 | alphabetize: { 35 | order: 'asc', 36 | caseInsensitive: true 37 | }, 38 | groups: [ 39 | 'builtin', 40 | 'external', 41 | 'internal', 42 | 'parent', 43 | 'sibling', 44 | 'index' 45 | ], 46 | pathGroups: [ 47 | { 48 | pattern: '#**/*', 49 | group: 'external' 50 | } 51 | ] 52 | } 53 | ], 54 | 'no-unused-expressions': 'off', 55 | 'no-useless-constructor': 'off' 56 | } 57 | }; 58 | -------------------------------------------------------------------------------- /src/modules/configuration/Configuration.ts: -------------------------------------------------------------------------------- 1 | import { CandleInterval, MainMarket } from '../api/types'; 2 | import { EMAConfiguration, StableCoinsConfiguration } from './types'; 3 | 4 | export default interface Configuration { 5 | /** 6 | * Amount for every invest 7 | */ 8 | amountPerInvest: number; 9 | /** 10 | * Coins to sell as soon as possible and never buy 11 | */ 12 | blacklist: string[]; 13 | /** 14 | * If true, all buy and sell api requests get skipped 15 | */ 16 | debug: boolean; 17 | /** 18 | * If true, the bot will call the report function at every end of round 19 | */ 20 | enableReporting: boolean; 21 | /** 22 | * Will invest when positive ticks are exactly this number 23 | */ 24 | exactPositiveTicks: number; 25 | /** 26 | * If true, it will not try to buy tokenized stocks. E.g. prohibited in your country 27 | */ 28 | ignoreTokenizedStocks: boolean; 29 | /** 30 | * Coins to hodl 31 | */ 32 | HODL: string[]; 33 | /** 34 | * Market to trade all coins on. E.g. BTC or USDT 35 | * Only tested USDT so far 36 | */ 37 | mainMarket: MainMarket; 38 | /** 39 | * Will reject when negative ticks are equal or below this number 40 | */ 41 | minNegativeTicks: number; 42 | /** 43 | * Amount in milliseconds to wait before next round 44 | */ 45 | refreshTimeout: number; 46 | /** 47 | * Section for ignoring a set of listed stable coins 48 | */ 49 | stableCoins: StableCoinsConfiguration; 50 | /** 51 | * Defines the interval used for candles 52 | */ 53 | tickInterval: CandleInterval; 54 | /** 55 | * Defines ema short and long 56 | */ 57 | emaConfiguration: EMAConfiguration; 58 | } 59 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ master ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ master ] 20 | schedule: 21 | - cron: '19 3 * * 1' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | 28 | strategy: 29 | fail-fast: false 30 | matrix: 31 | language: [ 'javascript' ] 32 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] 33 | # Learn more: 34 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed 35 | 36 | steps: 37 | - name: Checkout repository 38 | uses: actions/checkout@v2 39 | 40 | # Initializes the CodeQL tools for scanning. 41 | - name: Initialize CodeQL 42 | uses: github/codeql-action/init@v1 43 | with: 44 | languages: ${{ matrix.language }} 45 | # If you wish to specify custom queries, you can do so here or in a config file. 46 | # By default, queries listed here will override any specified in a config file. 47 | # Prefix the list here with "+" to use these queries and those in the config file. 48 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 49 | 50 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 51 | # If this step fails, then you should remove it and run the build manually (see below) 52 | - name: Autobuild 53 | uses: github/codeql-action/autobuild@v1 54 | 55 | # ℹ️ Command-line programs to run using the OS shell. 56 | # 📚 https://git.io/JvXDl 57 | 58 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 59 | # and modify them (or add more) to build your code if your project 60 | # uses a compiled language 61 | 62 | #- run: | 63 | # make bootstrap 64 | # make release 65 | 66 | - name: Perform CodeQL Analysis 67 | uses: github/codeql-action/analyze@v1 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cryptocurrency Trading Bot ![version](https://img.shields.io/badge/Version-2021.3.1-blue) 2 | I'm using this bot for a long time now and wanted to share it. 3 | 4 | Feel free to make it your own. PRs are welcome! 5 | 6 | ## USE AT YOUR OWN RISK 7 | A trading bot that does what you order him to do (use at your own risk) I'm not responsible for anything 8 | 9 | ## EMA crossover strategy 10 | It's using the ema crossover strategy 11 | 12 | https://www.theforexchronicles.com/the-ema-5-and-ema-20-crossover-trading-strategy/ 13 | 14 | ![EMA crossing strategy](ema-crossing.png) 15 | 16 | ## Donations 17 | 18 | To support this project, you can make a donation to its current maintainer: 19 | 20 | [![paypal](paypal.gif)](https://paypal.me/Saschb2b) 21 | 22 | ## Requirements 23 | Node.js 24 | 25 | As package manager install yarn https://classic.yarnpkg.com/en/docs/install 26 | 27 | ## Configuration 28 | 29 | ### Bittrex API key and API secret 30 | How to get: https://support.coinigy.com/hc/en-us/articles/360001123973-How-do-I-find-my-API-key-on-Bittrex-com- 31 | 32 | Set `BITTREX_API_KEY` and `BITTREX_API_SECRET` as environment variables. 33 | 34 | Easiest way is to add an `.env` file into the root project folder `./.env` wit the content 35 | ``` 36 | BITTREX_API_KEY=YOUR_BITTREX_API_KEY 37 | BITTREX_API_SECRET=YOUR_BITTREX_API_SECRET 38 | ``` 39 | otherwise see the provided `.env.template` file. 40 | 41 | If no keys were found you'll get an error message `No BITTREX_API_KEY and or BITTREX_API_SECRET found. Check your environment variables` 42 | 43 | ### Adapt the config 44 | Change the configuration parameters to your liking `config.json` 45 | 46 | For more details see the documentation in `./modules/configuration/Configuration.ts` 47 | 48 | ### (optional) Setup crash reporting with sentry 49 | Create a free monitoring project https://sentry.io/ 50 | 51 | Set `SENTRY_DSN` as environment variable. 52 | 53 | ## Run and development 54 | 55 | ### Build and start 56 | ``` 57 | yarn 58 | yarn start 59 | ``` 60 | 61 | This will create a `/dist` folder and start the containing `/dist/index.js` file 62 | 63 | ### Build bundle 64 | ``` 65 | yarn 66 | yarn build 67 | ``` 68 | 69 | This will create a `/dist` folder containing the created `.js` files. You could now deploy it on any server you like 70 | 71 | ### Development 72 | ``` 73 | yarn 74 | yarn start:dev 75 | ``` 76 | 77 | This will start the bot in a watch mode. On every code change it will recompile and restart 78 | 79 | ## Discussion and wiki 80 | 81 | Feel free to join the [discussion](https://github.com/TeamWertarbyte/crypto-trading-bot/discussions) and [wiki](https://github.com/TeamWertarbyte/crypto-trading-bot/wiki) here on github 82 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "crypto-trading-bot", 3 | "version": "2021.3.1", 4 | "scripts": { 5 | "build": "tsc", 6 | "lint": "eslint \"src/**/*.ts\"", 7 | "lint:fix": "eslint \"src/**/*.ts\" --fix", 8 | "start": "tsc && node dist/src/index.js", 9 | "start:dev": "ts-node-dev --respawn --transpile-only src/index.ts", 10 | "ts:config-generate": "typescript-json-validator ./src/modules/configuration/Configuration.ts Configuration" 11 | }, 12 | "dependencies": { 13 | "@sentry/node": "^6.0.3", 14 | "@sentry/tracing": "^6.0.3", 15 | "cli-progress": "^3.9.0", 16 | "crypto-js": "^4.0.0", 17 | "debug": "^3.0.1", 18 | "dotenv": "^8.2.0", 19 | "fancy-log": "^1.3.0", 20 | "jsonic": "^0.3.0", 21 | "node-fetch": "^2.6.1", 22 | "performance-now": "^2.1.0", 23 | "react": "^15.6.1", 24 | "react-stockcharts": "^0.7.0-beta.13", 25 | "signalr-client": "0.0.17" 26 | }, 27 | "devDependencies": { 28 | "@types/cli-progress": "^3.9.1", 29 | "@types/crypto-js": "^4.0.0", 30 | "@types/fancy-log": "^1.3.1", 31 | "@types/node": "^14.14.16", 32 | "@types/node-fetch": "^2.5.7", 33 | "@typescript-eslint/eslint-plugin": "^4.0.1", 34 | "@typescript-eslint/parser": "^4.0.1", 35 | "eslint": ">=6.0.1", 36 | "eslint-config-prettier": "^6.11.0", 37 | "eslint-config-semistandard": "15.0.1", 38 | "eslint-config-standard": ">=14.1.0", 39 | "eslint-plugin-import": "^2.22.0", 40 | "eslint-plugin-jest": "^24.0.0", 41 | "eslint-plugin-node": ">=9.1.0", 42 | "eslint-plugin-prettier": "^3.1.4", 43 | "eslint-plugin-promise": ">=4.2.1", 44 | "lint-staged": "^10.0.8", 45 | "node-notifier": "^9.0.0", 46 | "prettier": "^1.19.1", 47 | "ts-node-dev": "^1.1.1", 48 | "tslint": "^6.1.3", 49 | "typescript": "^4.1.3", 50 | "typescript-json-validator": "^2.4.2" 51 | }, 52 | "lint-staged": { 53 | "*.{md,json}": "prettier --write", 54 | "src/**/*.{ts,tsx}": "eslint --fix" 55 | }, 56 | "repository": { 57 | "type": "git", 58 | "url": "git@github.com:TeamWertarbyte/crypto-trading-bot.git" 59 | }, 60 | "prettier": { 61 | "$schema": "http://json.schemastore.org/prettierrc", 62 | "printWidth": 80, 63 | "tabWidth": 2, 64 | "useTabs": false, 65 | "semi": true, 66 | "singleQuote": true, 67 | "jsxSingleQuote": false, 68 | "jsxBracketSameLine": false, 69 | "trailingComma": "none", 70 | "bracketSpacing": true, 71 | "arrowParens": "always", 72 | "requirePragma": false, 73 | "insertPragma": false, 74 | "endOfLine": "auto" 75 | }, 76 | "author": "wertarbyte", 77 | "homepage": "https://github.com/TeamWertarbyte/crypto-trading-bot#readme" 78 | } 79 | -------------------------------------------------------------------------------- /src/modules/api/types.ts: -------------------------------------------------------------------------------- 1 | export type Status = 'ONLINE' | 'OFFLINE'; 2 | export type CandleInterval = 'MINUTE_1' | 'MINUTE_5' | 'HOUR_1' | 'DAY_1'; 3 | 4 | export interface Balance { 5 | currencySymbol: string; 6 | total: number; 7 | available: number; 8 | updatedAt: Date; 9 | } 10 | 11 | export interface BalanceResponse 12 | extends Omit { 13 | total: string; 14 | available: string; 15 | updatedAt: string; 16 | } 17 | 18 | export interface Candle { 19 | startsAt: Date; 20 | open: number; 21 | high: number; 22 | low: number; 23 | close: number; 24 | volume: number; 25 | quoteVolume: number; 26 | } 27 | 28 | export interface CandleResponse 29 | extends Omit< 30 | Candle, 31 | 'open' | 'high' | 'low' | 'close' | 'volume' | 'quoteVolume' 32 | > { 33 | open: string; 34 | high: string; 35 | low: string; 36 | close: string; 37 | volume?: string; 38 | quoteVolume?: string; 39 | } 40 | 41 | export type MainMarket = 'BTC' | 'ETH' | 'EUR' | 'USD' | 'USDT'; 42 | 43 | export interface Market { 44 | symbol: string; 45 | baseCurrencySymbol: string; 46 | quoteCurrencySymbol: string; 47 | minTradeSize: number; 48 | precision: number; 49 | status: Status; 50 | createdAt: string; 51 | notice: string; 52 | prohibitedIn: string[]; 53 | associatedTermsOfService: string[]; 54 | tags: string[]; 55 | } 56 | 57 | export type MarketDecision = 'HODL' | 'INVEST' | 'REJECT' | 'NONE'; 58 | 59 | export interface MarketSummary { 60 | symbol: string; 61 | high: number; 62 | low: number; 63 | volume: number; 64 | quoteVolume: number; 65 | percentChange?: number; 66 | updatedAt: string; 67 | } 68 | 69 | export interface MarketTicker { 70 | symbol: string; 71 | lastTradeRate: number; 72 | bidRate: number; 73 | askRate: number; 74 | } 75 | 76 | export interface MarketTickerResponse 77 | extends Omit { 78 | lastTradeRate: string; 79 | bidRate: string; 80 | askRate: string; 81 | } 82 | 83 | export type OrderDirection = 'BUY' | 'SELL'; 84 | 85 | export type OrderType = 'LIMIT' | 'MARKET' | 'CEILING_LIMIT' | 'CEILING_MARKET'; 86 | 87 | /** 88 | * https://bittrex.github.io/api/v3#topic-Placing-Orders 89 | */ 90 | export type TimeInForce = 91 | | 'GOOD_TIL_CANCELLED' 92 | | 'IMMEDIATE_OR_CANCEL' 93 | | 'FILL_OR_KILL' 94 | | 'POST_ONLY_GOOD_TIL_CANCELLED' 95 | | 'BUY_NOW' 96 | | 'INSTANT'; 97 | 98 | export interface NewOrder { 99 | marketSymbol: string; 100 | direction: OrderDirection; 101 | type: OrderType; 102 | /** 103 | * Optional, must be included for non-ceiling orders and excluded for ceiling orders 104 | */ 105 | quantity?: number; 106 | /** 107 | * Optional, must be included for ceiling orders and excluded for non-ceiling orders 108 | */ 109 | ceiling?: number; 110 | /** 111 | * Optional, must be included for LIMIT orders and excluded for MARKET orders 112 | */ 113 | limit?: number; 114 | timeInForce: TimeInForce; 115 | /** 116 | * client-provided identifier for advanced order tracking (optional) 117 | */ 118 | clientOrderId?: string; 119 | /** 120 | * option to use Bittrex credits for the order (optional) 121 | */ 122 | useAwards?: boolean; 123 | } 124 | 125 | export interface CreatedOrder { 126 | id: string; 127 | marketSymbol: string; 128 | direction: string; 129 | type: string; 130 | quantity: number; 131 | limit: number; 132 | ceiling: number; 133 | timeInForce: string; 134 | clientOrderId: string; 135 | fillQuantity: number; 136 | commission: number; 137 | proceeds: number; 138 | status: string; 139 | createdAt: string; 140 | updatedAt: string; 141 | closedAt: string; 142 | orderToCancel: { 143 | type: string; 144 | id: string; 145 | }; 146 | } 147 | -------------------------------------------------------------------------------- /src/modules/evaluation/EMAEvaluation.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import log from 'fancy-log'; 3 | // @ts-ignore 4 | import { ema } from 'react-stockcharts/lib/indicator'; 5 | import { EvaluationInterface } from './types'; 6 | import { BittrexApi } from '../api'; 7 | import Configuration from '../configuration/Configuration'; 8 | import { Balance, Candle, MarketDecision } from '../api/types'; 9 | import { CandleReactStockCharts } from '../bot/types'; 10 | import { sleep } from '../utils'; 11 | import { EMAShortLong } from '../configuration/types'; 12 | 13 | /** 14 | * https://www.investopedia.com/terms/e/ema.asp 15 | */ 16 | export class EMAEvaluation implements EvaluationInterface { 17 | api: BittrexApi; 18 | config: Configuration; 19 | 20 | constructor(api: BittrexApi, config: Configuration) { 21 | this.api = api; 22 | this.config = config; 23 | } 24 | 25 | private getEMAConfiguration = (currencySymbol: string): EMAShortLong => { 26 | let configuration = this.config.emaConfiguration.default; 27 | 28 | if (this.config.emaConfiguration.override?.length) { 29 | for (const override of this.config.emaConfiguration.override) { 30 | if (override.coins.includes(currencySymbol)) { 31 | configuration = { 32 | l: override.l, 33 | s: override.s 34 | }; 35 | break; 36 | } 37 | } 38 | } 39 | 40 | return configuration; 41 | }; 42 | 43 | private calculateEMA = ( 44 | candles: Candle[], 45 | emaConfiguration: EMAShortLong 46 | ): CandleReactStockCharts[] => { 47 | const parsedCandles: CandleReactStockCharts[] = candles.map((candle) => ({ 48 | ...candle, 49 | date: candle.startsAt, 50 | emaS: 0, 51 | emaL: 0 52 | })); 53 | 54 | const emaL = ema() 55 | .id(0) 56 | .options({ windowSize: emaConfiguration.l }) 57 | .merge((d: CandleReactStockCharts, c: number) => { 58 | d.emaL = c; 59 | }) 60 | .accessor((d: CandleReactStockCharts) => d.emaL); 61 | 62 | const emaS = ema() 63 | .id(1) 64 | .options({ windowSize: emaConfiguration.s }) 65 | .merge((d: CandleReactStockCharts, c: number) => { 66 | d.emaS = c; 67 | }) 68 | .accessor((d: CandleReactStockCharts) => d.emaS); 69 | 70 | emaL(emaS(parsedCandles)); 71 | return parsedCandles; 72 | }; 73 | 74 | private countTicks = ( 75 | data: CandleReactStockCharts[] 76 | ): { positiveTicks: number; negativeTicks: number } => { 77 | const latestKeyFigure = data[data.length - 1]; 78 | const latestEmaDifference = latestKeyFigure.emaL - latestKeyFigure.emaS; 79 | 80 | let positiveTicks = 0; 81 | let negativeTicks = 0; 82 | 83 | for (let i = data.length - 1; i > 0; i--) { 84 | const { emaL, emaS } = data[i]; 85 | const emaDifference = emaL - emaS; 86 | 87 | if (latestEmaDifference > 0 && emaDifference > 0) { 88 | negativeTicks += 1; 89 | } else if (latestEmaDifference < 0 && emaDifference < 0) { 90 | positiveTicks += 1; 91 | } else { 92 | break; 93 | } 94 | } 95 | return { 96 | negativeTicks, 97 | positiveTicks 98 | }; 99 | }; 100 | 101 | evaluate = async ( 102 | marketSymbol: string, 103 | balance?: Balance 104 | ): Promise => { 105 | let marketDecision: MarketDecision = 'NONE'; 106 | const currencySymbol = marketSymbol.split('-')[0]; 107 | 108 | const candles: Candle[] = await this.api.getCandles( 109 | marketSymbol, 110 | this.config.tickInterval 111 | ); 112 | await sleep(1500); 113 | 114 | if (!candles?.length) { 115 | log.info(`Got empty candles for ${marketSymbol}`); 116 | return 'NONE'; 117 | } 118 | 119 | const { negativeTicks, positiveTicks } = this.countTicks( 120 | this.calculateEMA(candles, this.getEMAConfiguration(currencySymbol)) 121 | ); 122 | 123 | if (balance && balance.available > 0) { 124 | if (this.config.blacklist.includes(currencySymbol)) { 125 | log.info(`Will reject ${marketSymbol} due to blacklist`); 126 | marketDecision = 'REJECT'; 127 | } else if (negativeTicks >= this.config.minNegativeTicks) { 128 | log.info( 129 | `Will reject ${marketSymbol} due to ${negativeTicks} negative ema ticks` 130 | ); 131 | marketDecision = 'REJECT'; 132 | } 133 | } else if (!balance || (balance && balance.available === 0)) { 134 | if ( 135 | !this.config.blacklist.includes(currencySymbol) && 136 | positiveTicks === this.config.exactPositiveTicks 137 | ) { 138 | log.info( 139 | `Should invest in ${marketSymbol} due to ${positiveTicks} positive ema ticks` 140 | ); 141 | marketDecision = 'INVEST'; 142 | } 143 | } 144 | 145 | return marketDecision; 146 | }; 147 | } 148 | -------------------------------------------------------------------------------- /src/modules/configuration/Configuration.validator.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable */ 2 | // generated by typescript-json-validator 3 | import { inspect } from 'util'; 4 | import Ajv = require('ajv'); 5 | import Configuration from './Configuration'; 6 | export const ajv = new Ajv({ 7 | allErrors: true, 8 | coerceTypes: false, 9 | format: 'fast', 10 | nullable: true, 11 | unicode: true, 12 | uniqueItems: true, 13 | useDefaults: true 14 | }); 15 | 16 | ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json')); 17 | 18 | export { Configuration }; 19 | export const ConfigurationSchema = { 20 | $schema: 'http://json-schema.org/draft-07/schema#', 21 | defaultProperties: [], 22 | definitions: { 23 | CandleInterval: { 24 | enum: ['DAY_1', 'HOUR_1', 'MINUTE_1', 'MINUTE_5'], 25 | type: 'string' 26 | }, 27 | EMAShortLong: { 28 | defaultProperties: [], 29 | properties: { 30 | l: { 31 | type: 'number' 32 | }, 33 | s: { 34 | type: 'number' 35 | } 36 | }, 37 | required: ['l', 's'], 38 | type: 'object' 39 | }, 40 | EMAShortLongOverride: { 41 | defaultProperties: [], 42 | properties: { 43 | coins: { 44 | items: { 45 | type: 'string' 46 | }, 47 | type: 'array' 48 | }, 49 | l: { 50 | type: 'number' 51 | }, 52 | s: { 53 | type: 'number' 54 | } 55 | }, 56 | required: ['coins', 'l', 's'], 57 | type: 'object' 58 | }, 59 | MainMarket: { 60 | enum: ['BTC', 'ETH', 'EUR', 'USD', 'USDT'], 61 | type: 'string' 62 | } 63 | }, 64 | properties: { 65 | HODL: { 66 | description: 'Coins to hodl', 67 | items: { 68 | type: 'string' 69 | }, 70 | type: 'array' 71 | }, 72 | amountPerInvest: { 73 | description: 'Amount for every invest', 74 | type: 'number' 75 | }, 76 | blacklist: { 77 | description: 'Coins to sell as soon as possible and never buy', 78 | items: { 79 | type: 'string' 80 | }, 81 | type: 'array' 82 | }, 83 | debug: { 84 | description: 'If true, all buy and sell api requests get skipped', 85 | type: 'boolean' 86 | }, 87 | emaConfiguration: { 88 | defaultProperties: [], 89 | description: 'Defines ema short and long', 90 | properties: { 91 | default: { 92 | $ref: '#/definitions/EMAShortLong' 93 | }, 94 | override: { 95 | items: { 96 | $ref: '#/definitions/EMAShortLongOverride' 97 | }, 98 | type: 'array' 99 | } 100 | }, 101 | required: ['default'], 102 | type: 'object' 103 | }, 104 | enableReporting: { 105 | description: 106 | 'If true, the bot will call the report function at every end of round', 107 | type: 'boolean' 108 | }, 109 | exactPositiveTicks: { 110 | description: 'Will invest when positive ticks are exactly this number', 111 | type: 'number' 112 | }, 113 | ignoreTokenizedStocks: { 114 | description: 115 | 'If true, it will not try to buy tokenized stocks. E.g. prohibited in your country', 116 | type: 'boolean' 117 | }, 118 | mainMarket: { 119 | $ref: '#/definitions/MainMarket', 120 | description: 121 | 'Market to trade all coins on. E.g. BTC or USDT\nOnly tested USDT so far' 122 | }, 123 | minNegativeTicks: { 124 | description: 125 | 'Will reject when negative ticks are equal or below this number', 126 | type: 'number' 127 | }, 128 | refreshTimeout: { 129 | description: 'Amount in milliseconds to wait before next round', 130 | type: 'number' 131 | }, 132 | stableCoins: { 133 | defaultProperties: [], 134 | description: 'Section for ignoring a set of listed stable coins', 135 | properties: { 136 | coins: { 137 | items: { 138 | type: 'string' 139 | }, 140 | type: 'array' 141 | }, 142 | ignore: { 143 | type: 'boolean' 144 | } 145 | }, 146 | required: ['coins', 'ignore'], 147 | type: 'object' 148 | }, 149 | tickInterval: { 150 | $ref: '#/definitions/CandleInterval', 151 | description: 'Defines the interval used for candles' 152 | } 153 | }, 154 | required: [ 155 | 'HODL', 156 | 'amountPerInvest', 157 | 'blacklist', 158 | 'debug', 159 | 'emaConfiguration', 160 | 'enableReporting', 161 | 'exactPositiveTicks', 162 | 'ignoreTokenizedStocks', 163 | 'mainMarket', 164 | 'minNegativeTicks', 165 | 'refreshTimeout', 166 | 'stableCoins', 167 | 'tickInterval' 168 | ], 169 | type: 'object' 170 | }; 171 | export type ValidateFunction = ((data: unknown) => data is T) & 172 | Pick; 173 | export const isConfiguration = ajv.compile( 174 | ConfigurationSchema 175 | ) as ValidateFunction; 176 | export default function validate(value: unknown): Configuration { 177 | if (isConfiguration(value)) { 178 | return value; 179 | } else { 180 | throw new Error( 181 | ajv.errorsText( 182 | isConfiguration.errors!.filter((e: any) => e.keyword !== 'if'), 183 | { dataVar: 'Configuration' } 184 | ) + 185 | '\n\n' + 186 | inspect(value) 187 | ); 188 | } 189 | } 190 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, 8 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, 9 | "lib": [ 10 | "es2015", 11 | "dom" 12 | ] /* Specify library files to be included in the compilation. */, 13 | "resolveJsonModule": true, 14 | // "allowJs": true, /* Allow javascript files to be compiled. */ 15 | // "checkJs": true, /* Report errors in .js files. */ 16 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 17 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 18 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 19 | "sourceMap": true /* Generates corresponding '.map' file. */, 20 | // "outFile": "./", /* Concatenate and emit output to single file. */ 21 | "outDir": "./dist" /* Redirect output structure to the directory. */, 22 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 23 | // "composite": true, /* Enable project compilation */ 24 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 25 | // "removeComments": true, /* Do not emit comments to output. */ 26 | // "noEmit": true, /* Do not emit outputs. */ 27 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 28 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 29 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 30 | 31 | /* Strict Type-Checking Options */ 32 | "strict": true /* Enable all strict type-checking options. */, 33 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 34 | // "strictNullChecks": true, /* Enable strict null checks. */ 35 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 36 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 37 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 38 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 39 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 40 | 41 | /* Additional Checks */ 42 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 43 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 44 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 45 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 46 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 47 | 48 | /* Module Resolution Options */ 49 | "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, 50 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 51 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 52 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 53 | // "typeRoots": [], /* List of folders to include type definitions from. */ 54 | // "types": [], /* Type declaration files to be included in compilation. */ 55 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 56 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 57 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 58 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 59 | 60 | /* Source Map Options */ 61 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 62 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 63 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 64 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 65 | 66 | /* Experimental Options */ 67 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 68 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 69 | 70 | /* Advanced Options */ 71 | "skipLibCheck": true /* Skip type checking of declaration files. */, 72 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/modules/api/BittrexApi.ts: -------------------------------------------------------------------------------- 1 | import CryptoJS from 'crypto-js'; 2 | import fetch, { Headers, Response } from 'node-fetch'; 3 | 4 | import { 5 | Balance, 6 | BalanceResponse, 7 | Candle, 8 | CandleInterval, 9 | CandleResponse, 10 | CreatedOrder, 11 | Market, 12 | MarketSummary, 13 | MarketTicker, 14 | MarketTickerResponse, 15 | NewOrder 16 | } from './types'; 17 | 18 | interface BittrexClientOptions { 19 | baseUrl: string; 20 | /** 21 | * Option to use Bittrex credits for the order 22 | * Orders with insufficient credits will fail 23 | */ 24 | useAwards: boolean; 25 | } 26 | 27 | /** 28 | * https://bittrex.github.io/api/v3 29 | */ 30 | export default class BittrexApi { 31 | apiKey: string; 32 | apiSecret: string; 33 | options: BittrexClientOptions; 34 | 35 | constructor(apiKey: string, apiSecret: string) { 36 | this.apiKey = apiKey; 37 | this.apiSecret = apiSecret; 38 | this.options = { 39 | baseUrl: 'https://api.bittrex.com/v3', 40 | useAwards: false 41 | }; 42 | } 43 | 44 | /** 45 | * https://bittrex.github.io/api/v3#topic-Authentication 46 | * @param uri 47 | * @param method 48 | * @param body 49 | */ 50 | fetchAuthenticated = async ( 51 | uri: string, 52 | method: 'GET' | 'POST' | 'DELETE', 53 | body?: {} 54 | ): Promise => { 55 | const timestamp = new Date().getTime(); 56 | const content = body ? JSON.stringify(body) : ''; 57 | const contentHash = CryptoJS.SHA512(content).toString(CryptoJS.enc.Hex); 58 | const preSign = [timestamp, uri, method, contentHash].join(''); 59 | const signature = CryptoJS.HmacSHA512(preSign, this.apiSecret).toString( 60 | CryptoJS.enc.Hex 61 | ); 62 | 63 | const headers = new Headers({ 64 | 'Api-Key': this.apiKey, 65 | 'Api-Timestamp': `${timestamp}`, 66 | 'Api-Content-Hash': contentHash, 67 | 'Api-Signature': signature, 68 | 'Content-Type': 'application/json' 69 | }); 70 | 71 | if (method === 'POST') { 72 | return fetch(uri, { 73 | headers, 74 | method, 75 | body: content 76 | }); 77 | } 78 | 79 | return fetch(uri, { 80 | headers, 81 | method 82 | }); 83 | }; 84 | 85 | getBalance = async (currencySymbol: string): Promise => { 86 | const response = await this.fetchAuthenticated( 87 | `${this.options.baseUrl}/balances/${currencySymbol}`, 88 | 'GET' 89 | ); 90 | const data: BalanceResponse = await response.json(); 91 | 92 | return { 93 | available: parseFloat(data.available), 94 | currencySymbol: data.currencySymbol, 95 | total: parseFloat(data.total), 96 | updatedAt: new Date(data.updatedAt) 97 | }; 98 | }; 99 | 100 | getBalances = async (): Promise => { 101 | const response = await this.fetchAuthenticated( 102 | `${this.options.baseUrl}/balances`, 103 | 'GET' 104 | ); 105 | const data: BalanceResponse[] = await response.json(); 106 | 107 | return data.map((d) => ({ 108 | available: parseFloat(d.available), 109 | currencySymbol: d.currencySymbol, 110 | total: parseFloat(d.total), 111 | updatedAt: new Date(d.updatedAt) 112 | })); 113 | }; 114 | 115 | getMarket = async (marketSymbol: string): Promise => { 116 | const response = await fetch( 117 | `${this.options.baseUrl}/markets/${marketSymbol}` 118 | ); 119 | return response.json(); 120 | }; 121 | 122 | getMarkets = async (): Promise => { 123 | const response = await fetch(`${this.options.baseUrl}/markets`); 124 | return response.json(); 125 | }; 126 | 127 | getMarketSummaries = async (): Promise => { 128 | const response = await fetch(`${this.options.baseUrl}/markets/summaries`); 129 | return response.json(); 130 | }; 131 | 132 | getMarketTicker = async (marketSymbol: string): Promise => { 133 | const response = await fetch( 134 | `${this.options.baseUrl}/markets/${marketSymbol}/ticker` 135 | ); 136 | const data: MarketTickerResponse = await response.json(); 137 | 138 | return { 139 | symbol: data.symbol, 140 | askRate: parseFloat(data.askRate), 141 | bidRate: parseFloat(data.bidRate), 142 | lastTradeRate: parseFloat(data.lastTradeRate) 143 | }; 144 | }; 145 | 146 | getCandles = async ( 147 | marketSymbol: string, 148 | candleInterval: CandleInterval 149 | ): Promise => { 150 | const response = await fetch( 151 | `${this.options.baseUrl}/markets/${marketSymbol}/candles/${candleInterval}/recent` 152 | ); 153 | const data: CandleResponse[] = await response.json(); 154 | 155 | return data.map((d) => ({ 156 | close: parseFloat(d.close), 157 | high: parseFloat(d.high), 158 | low: parseFloat(d.low), 159 | open: parseFloat(d.open), 160 | quoteVolume: parseFloat(d.quoteVolume || '0'), 161 | startsAt: new Date(d.startsAt), 162 | volume: parseFloat(d.volume || '0') 163 | })); 164 | }; 165 | 166 | /** 167 | * https://bittrex.github.io/api/v3#topic-Placing-Orders 168 | * @param marketSymbol 169 | * @param quantity 170 | * @param limit 171 | */ 172 | buyLimit = async ( 173 | marketSymbol: string, 174 | quantity: number, 175 | limit: number 176 | ): Promise => { 177 | const body: NewOrder = { 178 | direction: 'BUY', 179 | marketSymbol, 180 | quantity, 181 | timeInForce: 'GOOD_TIL_CANCELLED', 182 | type: 'LIMIT', 183 | limit 184 | }; 185 | 186 | const response = await this.fetchAuthenticated( 187 | `${this.options.baseUrl}/orders`, 188 | 'POST', 189 | body 190 | ); 191 | 192 | return response.json(); 193 | }; 194 | 195 | /** 196 | * https://bittrex.github.io/api/v3#topic-Placing-Orders 197 | * @param marketSymbol 198 | * @param quantity 199 | * @param limit 200 | */ 201 | sellLimit = async ( 202 | marketSymbol: string, 203 | quantity: number, 204 | limit: number 205 | ): Promise => { 206 | const body: NewOrder = { 207 | direction: 'SELL', 208 | marketSymbol, 209 | quantity, 210 | timeInForce: 'FILL_OR_KILL', 211 | type: 'LIMIT', 212 | limit 213 | }; 214 | 215 | const response = await this.fetchAuthenticated( 216 | `${this.options.baseUrl}/orders`, 217 | 'POST', 218 | body 219 | ); 220 | 221 | return response.json(); 222 | }; 223 | 224 | /** 225 | * Use this for reporting history 226 | * @param USDT - total amount of USDT when you would sell all your assets now for LATEST price 227 | * @param BTC - current market USDT price of BTC 228 | */ 229 | report = async (USDT: number, BTC: number) => { 230 | await fetch('https://YOUR_URL_HERE', { 231 | headers: { 232 | 'Content-Type': 'application/json' 233 | }, 234 | method: 'POST', 235 | body: JSON.stringify({ 236 | totalBalance: Math.floor(USDT), 237 | currentMarketBTC: Math.floor(BTC) 238 | }) 239 | }); 240 | }; 241 | } 242 | -------------------------------------------------------------------------------- /src/modules/bot/index.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import log from 'fancy-log'; 3 | import now from 'performance-now'; 4 | import cliProgress from 'cli-progress'; 5 | 6 | import { BittrexApi } from '../api'; 7 | import { 8 | Balance, 9 | Market, 10 | MarketDecision, 11 | MarketSummary, 12 | MarketTicker 13 | } from '../api/types'; 14 | import Configuration from '../configuration/Configuration'; 15 | 16 | import { sleep } from '../utils'; 17 | import { EMAEvaluation } from '../evaluation/EMAEvaluation'; 18 | 19 | const multiProgressBar = new cliProgress.MultiBar( 20 | { 21 | clearOnComplete: false, 22 | hideCursor: true, 23 | format: 24 | '[{bar}] {process} {percentage}% | {name} | ETA: {eta}s | {value}/{total}' 25 | }, 26 | cliProgress.Presets.shades_grey 27 | ); 28 | 29 | export default class Bot { 30 | api: BittrexApi; 31 | config: Configuration; 32 | 33 | constructor(api: BittrexApi, config: Configuration) { 34 | if (config.debug) { 35 | log.info( 36 | 'Debug mode is activated. All buy and sell api requests will get skipped. Will skip reporting' 37 | ); 38 | } 39 | 40 | this.api = api; 41 | this.config = config; 42 | } 43 | 44 | start = async () => { 45 | const start = now(); 46 | log.info(`########## Started ichimoku ##########`); 47 | 48 | await this.collectRevenue(); 49 | 50 | const markets: Market[] = await this.getMarkets(); 51 | const marketSummaries: MarketSummary[] = await this.getMarketSummaries( 52 | markets 53 | ); 54 | 55 | await this.evaluateMarkets(marketSummaries.map(({ symbol }) => symbol)); 56 | 57 | if (this.config.enableReporting && !this.config.debug) { 58 | await this.report(); 59 | } 60 | 61 | log.info(`########## Finished ${(now() - start).toFixed(5)} ms ##########`); 62 | multiProgressBar.stop(); 63 | }; 64 | 65 | getMarkets = async (): Promise => { 66 | const progressBar = multiProgressBar.create(4, 0, { 67 | process: 'Fetching markets', 68 | name: '' 69 | }); 70 | 71 | const markets: Market[] = await this.api.getMarkets(); 72 | progressBar?.increment(1); 73 | 74 | let filtered: Market[] = markets 75 | .filter( 76 | ({ quoteCurrencySymbol }) => 77 | quoteCurrencySymbol === this.config.mainMarket 78 | ) 79 | .filter(({ status }) => status === 'ONLINE'); 80 | progressBar?.increment(1); 81 | 82 | if (this.config.ignoreTokenizedStocks) { 83 | filtered = filtered.filter( 84 | ({ tags }) => !tags.includes('TOKENIZED_SECURITY') 85 | ); 86 | } 87 | progressBar?.increment(1); 88 | 89 | if (this.config.stableCoins.ignore) { 90 | filtered = filtered.filter( 91 | ({ baseCurrencySymbol }) => 92 | !this.config.stableCoins.coins.includes(baseCurrencySymbol) 93 | ); 94 | } 95 | progressBar?.increment(1); 96 | 97 | return filtered; 98 | }; 99 | 100 | getMarketSummaries = async (markets: Market[]): Promise => { 101 | const progressBar = multiProgressBar.create(markets.length, 0, { 102 | process: 'Fetching market summaries' 103 | }); 104 | 105 | const marketSummaries: MarketSummary[] = await this.api.getMarketSummaries(); 106 | 107 | const filtered: MarketSummary[] = []; 108 | markets.forEach((market) => { 109 | progressBar?.increment(1, { name: market.symbol }); 110 | const matchedSummary = marketSummaries.find( 111 | ({ symbol }) => market.symbol === symbol 112 | ); 113 | if (matchedSummary && matchedSummary.quoteVolume > 0) { 114 | filtered.push(matchedSummary); 115 | } 116 | }); 117 | 118 | return filtered; 119 | }; 120 | 121 | /** 122 | * Sell value above the invested amount 123 | * Ignore HODL coins 124 | */ 125 | collectRevenue = async (): Promise => { 126 | const balances: Balance[] = (await this.api.getBalances()) 127 | .filter(({ available }) => available > 0) 128 | .filter(({ currencySymbol }) => 129 | this.config.stableCoins.ignore 130 | ? !this.config.stableCoins.coins.includes(currencySymbol) 131 | : true 132 | ) 133 | .filter( 134 | ({ currencySymbol }) => !this.config.HODL.includes(currencySymbol) 135 | ); 136 | 137 | await sleep(1500); 138 | 139 | const progressBar = multiProgressBar.create(balances.length, 0, { 140 | process: 'Collecting revenue' 141 | }); 142 | for (const balance of balances) { 143 | progressBar?.increment(1, { name: balance.currencySymbol }); 144 | 145 | const ticker: MarketTicker = await this.api.getMarketTicker( 146 | `${balance.currencySymbol}-${this.config.mainMarket}` 147 | ); 148 | const revenue = 149 | balance.available * ticker.bidRate - this.config.amountPerInvest; 150 | 151 | if (revenue > 0) { 152 | const market: Market = await this.api.getMarket( 153 | `${balance.currencySymbol}-${this.config.mainMarket}` 154 | ); 155 | const quantity = revenue / ticker.bidRate; 156 | 157 | if (!this.config.debug && quantity > market.minTradeSize) { 158 | log.info( 159 | `${balance.currencySymbol} placed REVENUE SELL order ${quantity} for a total of ${revenue} ${this.config.mainMarket}` 160 | ); 161 | const response = await this.api.sellLimit( 162 | market.symbol, 163 | quantity, 164 | ticker.bidRate 165 | ); 166 | log.info(response); 167 | await sleep(1500); 168 | } 169 | await sleep(1500); 170 | } 171 | await sleep(1500); 172 | } 173 | }; 174 | 175 | evaluateMarkets = async (marketSymbols: string[]) => { 176 | const emaEvaluation = new EMAEvaluation(this.api, this.config); 177 | 178 | const balances: Balance[] = await this.api.getBalances(); 179 | await sleep(1000); 180 | 181 | const progressBar = multiProgressBar.create(marketSymbols.length, 0, { 182 | process: 'Evaluating markets' 183 | }); 184 | 185 | for (const marketSymbol of marketSymbols) { 186 | progressBar?.increment(1, { name: marketSymbol }); 187 | 188 | let decision: MarketDecision = 'NONE'; 189 | const currencySymbol = marketSymbol.split('-')[0]; 190 | 191 | if (this.config.HODL.includes(currencySymbol)) { 192 | decision = 'HODL'; 193 | } else { 194 | const balance = balances.find( 195 | (balance) => balance.currencySymbol === currencySymbol 196 | ); 197 | 198 | decision = await emaEvaluation.evaluate(marketSymbol, balance); 199 | 200 | if (decision === 'INVEST') { 201 | const mainMarket = await this.api.getBalance(this.config.mainMarket); 202 | if (mainMarket.available > this.config.amountPerInvest) { 203 | const ticker = await this.api.getMarketTicker(marketSymbol); 204 | const quantity = this.config.amountPerInvest / ticker.askRate; 205 | if (!this.config.debug) { 206 | const response = await this.api.buyLimit( 207 | marketSymbol, 208 | quantity, 209 | ticker.askRate 210 | ); 211 | log.info(response); 212 | } 213 | log.info( 214 | `Invested ${this.config.amountPerInvest} ${mainMarket.currencySymbol} to buy ${quantity} of ${marketSymbol}` 215 | ); 216 | await sleep(2500); 217 | } else { 218 | log.info( 219 | `${mainMarket.available} ${this.config.mainMarket} is not enough for further investments ` 220 | ); 221 | } 222 | await sleep(1000); 223 | } else if (balance && decision === 'REJECT') { 224 | const ticker = await this.api.getMarketTicker(marketSymbol); 225 | const market = await this.api.getMarket(marketSymbol); 226 | if (balance.available > market.minTradeSize) { 227 | if (!this.config.debug) { 228 | const response = await this.api.sellLimit( 229 | market.symbol, 230 | balance.available, 231 | ticker.bidRate 232 | ); 233 | log.info(response); 234 | } 235 | log.info( 236 | `Rejected ${balance.available} of ${marketSymbol} for ${ticker.bidRate} each` 237 | ); 238 | await sleep(2500); 239 | } 240 | } 241 | } 242 | } 243 | }; 244 | 245 | report = async () => { 246 | const balances = (await this.api.getBalances()).filter( 247 | ({ available }) => available > 0 248 | ); 249 | let total = (await this.api.getBalance(this.config.mainMarket)).available; 250 | const btcTicker = await this.api.getMarketTicker( 251 | `BTC-${this.config.mainMarket}` 252 | ); 253 | await sleep(3500); 254 | 255 | for (const balance of balances) { 256 | const ticker = await this.api.getMarketTicker( 257 | `${balance.currencySymbol}-${this.config.mainMarket}` 258 | ); 259 | const worth = balance.available * ticker.lastTradeRate; 260 | if (worth) { 261 | total += worth; 262 | } 263 | await sleep(1000); 264 | } 265 | 266 | await this.api.report(total, btcTicker.lastTradeRate); 267 | log.info(`Called report webhook`); 268 | }; 269 | } 270 | -------------------------------------------------------------------------------- /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.12.11" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" 8 | dependencies: 9 | "@babel/highlight" "^7.10.4" 10 | 11 | "@babel/helper-validator-identifier@^7.10.4": 12 | version "7.12.11" 13 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" 14 | 15 | "@babel/highlight@^7.10.4": 16 | version "7.10.4" 17 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" 18 | dependencies: 19 | "@babel/helper-validator-identifier" "^7.10.4" 20 | chalk "^2.0.0" 21 | js-tokens "^4.0.0" 22 | 23 | "@eslint/eslintrc@^0.2.2": 24 | version "0.2.2" 25 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" 26 | dependencies: 27 | ajv "^6.12.4" 28 | debug "^4.1.1" 29 | espree "^7.3.0" 30 | globals "^12.1.0" 31 | ignore "^4.0.6" 32 | import-fresh "^3.2.1" 33 | js-yaml "^3.13.1" 34 | lodash "^4.17.19" 35 | minimatch "^3.0.4" 36 | strip-json-comments "^3.1.1" 37 | 38 | "@nodelib/fs.scandir@2.1.4": 39 | version "2.1.4" 40 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" 41 | dependencies: 42 | "@nodelib/fs.stat" "2.0.4" 43 | run-parallel "^1.1.9" 44 | 45 | "@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": 46 | version "2.0.4" 47 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" 48 | 49 | "@nodelib/fs.walk@^1.2.3": 50 | version "1.2.6" 51 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" 52 | dependencies: 53 | "@nodelib/fs.scandir" "2.1.4" 54 | fastq "^1.6.0" 55 | 56 | "@sentry/core@6.0.3": 57 | version "6.0.3" 58 | resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.0.3.tgz#620cb32365a11eac75497bed281bd52b9f0bb359" 59 | dependencies: 60 | "@sentry/hub" "6.0.3" 61 | "@sentry/minimal" "6.0.3" 62 | "@sentry/types" "6.0.3" 63 | "@sentry/utils" "6.0.3" 64 | tslib "^1.9.3" 65 | 66 | "@sentry/hub@6.0.3": 67 | version "6.0.3" 68 | resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.0.3.tgz#097f7b1e775a4c6c20c9bec60d7507d5ad2e8db0" 69 | dependencies: 70 | "@sentry/types" "6.0.3" 71 | "@sentry/utils" "6.0.3" 72 | tslib "^1.9.3" 73 | 74 | "@sentry/minimal@6.0.3": 75 | version "6.0.3" 76 | resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.0.3.tgz#6eaaf78c479c49720df3e712d41518e7f4f0ffdf" 77 | dependencies: 78 | "@sentry/hub" "6.0.3" 79 | "@sentry/types" "6.0.3" 80 | tslib "^1.9.3" 81 | 82 | "@sentry/node@^6.0.3": 83 | version "6.0.3" 84 | resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.0.3.tgz#f41e707db710fd7c48e3bffdf05c8edeec95cbe9" 85 | dependencies: 86 | "@sentry/core" "6.0.3" 87 | "@sentry/hub" "6.0.3" 88 | "@sentry/tracing" "6.0.3" 89 | "@sentry/types" "6.0.3" 90 | "@sentry/utils" "6.0.3" 91 | cookie "^0.4.1" 92 | https-proxy-agent "^5.0.0" 93 | lru_map "^0.3.3" 94 | tslib "^1.9.3" 95 | 96 | "@sentry/tracing@6.0.3", "@sentry/tracing@^6.0.3": 97 | version "6.0.3" 98 | resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.0.3.tgz#103f4942ddd546321e22ba20c011adf52b25b3f2" 99 | dependencies: 100 | "@sentry/hub" "6.0.3" 101 | "@sentry/minimal" "6.0.3" 102 | "@sentry/types" "6.0.3" 103 | "@sentry/utils" "6.0.3" 104 | tslib "^1.9.3" 105 | 106 | "@sentry/types@6.0.3": 107 | version "6.0.3" 108 | resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.0.3.tgz#a1ef6d6b2ac2a9201e3e4a894db6ecf7ceb5b27c" 109 | 110 | "@sentry/utils@6.0.3": 111 | version "6.0.3" 112 | resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.0.3.tgz#114d9faa47f76416c3e140711465e76d2129dba8" 113 | dependencies: 114 | "@sentry/types" "6.0.3" 115 | tslib "^1.9.3" 116 | 117 | "@types/ajv@^1.0.0": 118 | version "1.0.0" 119 | resolved "https://registry.yarnpkg.com/@types/ajv/-/ajv-1.0.0.tgz#4fb2440742f2f6c30e7fb0797b839fc6f696682a" 120 | dependencies: 121 | ajv "*" 122 | 123 | "@types/cli-progress@^3.9.1": 124 | version "3.9.1" 125 | resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.9.1.tgz#285e7fbdad6e7baf072d163ae1c3b23b7b219130" 126 | integrity sha512-X/tKJv/GoYlCBS9wwJTLrVSxzIOI/Cj1cCatYOAAoQne3aT1QbHBptBS5+zLe2ToSljAijHU1N/ouBNFvZ2H/g== 127 | dependencies: 128 | "@types/node" "*" 129 | 130 | "@types/cross-spawn@^6.0.0": 131 | version "6.0.2" 132 | resolved "https://registry.yarnpkg.com/@types/cross-spawn/-/cross-spawn-6.0.2.tgz#168309de311cd30a2b8ae720de6475c2fbf33ac7" 133 | dependencies: 134 | "@types/node" "*" 135 | 136 | "@types/crypto-js@^4.0.0": 137 | version "4.0.1" 138 | resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.0.1.tgz#3a4bd24518b0e6c5940da4e2659eeb2ef0806963" 139 | 140 | "@types/fancy-log@^1.3.1": 141 | version "1.3.1" 142 | resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.1.tgz#dd94fbc8c2e2ab8ab402ca8d04bb8c34965f0696" 143 | 144 | "@types/glob@^7.1.1": 145 | version "7.1.3" 146 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" 147 | dependencies: 148 | "@types/minimatch" "*" 149 | "@types/node" "*" 150 | 151 | "@types/json-schema@^7.0.3": 152 | version "7.0.6" 153 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" 154 | 155 | "@types/json-stable-stringify@^1.0.32": 156 | version "1.0.32" 157 | resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.32.tgz#121f6917c4389db3923640b2e68de5fa64dda88e" 158 | 159 | "@types/json5@^0.0.29": 160 | version "0.0.29" 161 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 162 | 163 | "@types/minimatch@*", "@types/minimatch@^3.0.3": 164 | version "3.0.3" 165 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" 166 | 167 | "@types/node-fetch@^2.5.7": 168 | version "2.5.7" 169 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" 170 | dependencies: 171 | "@types/node" "*" 172 | form-data "^3.0.0" 173 | 174 | "@types/node@*": 175 | version "14.14.17" 176 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.17.tgz#29fab92f3986c0e379968ad3c2043683d8020dbb" 177 | 178 | "@types/node@^14.14.16": 179 | version "14.14.16" 180 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.16.tgz#3cc351f8d48101deadfed4c9e4f116048d437b4b" 181 | 182 | "@types/parse-json@^4.0.0": 183 | version "4.0.0" 184 | resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" 185 | 186 | "@types/strip-bom@^3.0.0": 187 | version "3.0.0" 188 | resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" 189 | 190 | "@types/strip-json-comments@0.0.30": 191 | version "0.0.30" 192 | resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" 193 | 194 | "@typescript-eslint/eslint-plugin@^4.0.1": 195 | version "4.11.1" 196 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.11.1.tgz#7579c6d17ad862154c10bc14b40e5427b729e209" 197 | dependencies: 198 | "@typescript-eslint/experimental-utils" "4.11.1" 199 | "@typescript-eslint/scope-manager" "4.11.1" 200 | debug "^4.1.1" 201 | functional-red-black-tree "^1.0.1" 202 | regexpp "^3.0.0" 203 | semver "^7.3.2" 204 | tsutils "^3.17.1" 205 | 206 | "@typescript-eslint/experimental-utils@4.11.1", "@typescript-eslint/experimental-utils@^4.0.1": 207 | version "4.11.1" 208 | resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.11.1.tgz#2dad3535b878c25c7424e40bfa79d899f3f485bc" 209 | dependencies: 210 | "@types/json-schema" "^7.0.3" 211 | "@typescript-eslint/scope-manager" "4.11.1" 212 | "@typescript-eslint/types" "4.11.1" 213 | "@typescript-eslint/typescript-estree" "4.11.1" 214 | eslint-scope "^5.0.0" 215 | eslint-utils "^2.0.0" 216 | 217 | "@typescript-eslint/parser@^4.0.1": 218 | version "4.11.1" 219 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.11.1.tgz#981e18de2e019d6ca312596615f92e8f6f6598ed" 220 | dependencies: 221 | "@typescript-eslint/scope-manager" "4.11.1" 222 | "@typescript-eslint/types" "4.11.1" 223 | "@typescript-eslint/typescript-estree" "4.11.1" 224 | debug "^4.1.1" 225 | 226 | "@typescript-eslint/scope-manager@4.11.1": 227 | version "4.11.1" 228 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.11.1.tgz#72dc2b60b0029ab0888479b12bf83034920b4b69" 229 | dependencies: 230 | "@typescript-eslint/types" "4.11.1" 231 | "@typescript-eslint/visitor-keys" "4.11.1" 232 | 233 | "@typescript-eslint/types@4.11.1": 234 | version "4.11.1" 235 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.11.1.tgz#3ba30c965963ef9f8ced5a29938dd0c465bd3e05" 236 | 237 | "@typescript-eslint/typescript-estree@4.11.1": 238 | version "4.11.1" 239 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.11.1.tgz#a4416b4a65872a48773b9e47afabdf7519eb10bc" 240 | dependencies: 241 | "@typescript-eslint/types" "4.11.1" 242 | "@typescript-eslint/visitor-keys" "4.11.1" 243 | debug "^4.1.1" 244 | globby "^11.0.1" 245 | is-glob "^4.0.1" 246 | lodash "^4.17.15" 247 | semver "^7.3.2" 248 | tsutils "^3.17.1" 249 | 250 | "@typescript-eslint/visitor-keys@4.11.1": 251 | version "4.11.1" 252 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.11.1.tgz#4c050a4c1f7239786e2dd4e69691436143024e05" 253 | dependencies: 254 | "@typescript-eslint/types" "4.11.1" 255 | eslint-visitor-keys "^2.0.0" 256 | 257 | acorn-jsx@^5.3.1: 258 | version "5.3.1" 259 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" 260 | 261 | acorn@^7.4.0: 262 | version "7.4.1" 263 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 264 | 265 | agent-base@6: 266 | version "6.0.2" 267 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 268 | dependencies: 269 | debug "4" 270 | 271 | aggregate-error@^3.0.0: 272 | version "3.1.0" 273 | resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" 274 | dependencies: 275 | clean-stack "^2.0.0" 276 | indent-string "^4.0.0" 277 | 278 | ajv@*: 279 | version "7.0.3" 280 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" 281 | dependencies: 282 | fast-deep-equal "^3.1.1" 283 | json-schema-traverse "^1.0.0" 284 | require-from-string "^2.0.2" 285 | uri-js "^4.2.2" 286 | 287 | ajv@^6.10.0, ajv@^6.12.4: 288 | version "6.12.6" 289 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 290 | dependencies: 291 | fast-deep-equal "^3.1.1" 292 | fast-json-stable-stringify "^2.0.0" 293 | json-schema-traverse "^0.4.1" 294 | uri-js "^4.2.2" 295 | 296 | ansi-colors@^4.1.1: 297 | version "4.1.1" 298 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 299 | 300 | ansi-escapes@^4.3.0: 301 | version "4.3.1" 302 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" 303 | dependencies: 304 | type-fest "^0.11.0" 305 | 306 | ansi-gray@^0.1.1: 307 | version "0.1.1" 308 | resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" 309 | dependencies: 310 | ansi-wrap "0.1.0" 311 | 312 | ansi-regex@^4.1.0: 313 | version "4.1.0" 314 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 315 | 316 | ansi-regex@^5.0.0: 317 | version "5.0.0" 318 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 319 | 320 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 321 | version "3.2.1" 322 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 323 | dependencies: 324 | color-convert "^1.9.0" 325 | 326 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 327 | version "4.3.0" 328 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 329 | dependencies: 330 | color-convert "^2.0.1" 331 | 332 | ansi-wrap@0.1.0: 333 | version "0.1.0" 334 | resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" 335 | 336 | anymatch@~3.1.1: 337 | version "3.1.1" 338 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 339 | dependencies: 340 | normalize-path "^3.0.0" 341 | picomatch "^2.0.4" 342 | 343 | arg@^4.1.0: 344 | version "4.1.3" 345 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 346 | 347 | argparse@^1.0.7: 348 | version "1.0.10" 349 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 350 | dependencies: 351 | sprintf-js "~1.0.2" 352 | 353 | array-find-index@^1.0.1: 354 | version "1.0.2" 355 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 356 | 357 | array-includes@^3.1.1: 358 | version "3.1.2" 359 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" 360 | dependencies: 361 | call-bind "^1.0.0" 362 | define-properties "^1.1.3" 363 | es-abstract "^1.18.0-next.1" 364 | get-intrinsic "^1.0.1" 365 | is-string "^1.0.5" 366 | 367 | array-union@^2.1.0: 368 | version "2.1.0" 369 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 370 | 371 | array.prototype.flat@^1.2.3: 372 | version "1.2.4" 373 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" 374 | dependencies: 375 | call-bind "^1.0.0" 376 | define-properties "^1.1.3" 377 | es-abstract "^1.18.0-next.1" 378 | 379 | asap@~2.0.3: 380 | version "2.0.6" 381 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 382 | 383 | astral-regex@^2.0.0: 384 | version "2.0.0" 385 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" 386 | 387 | asynckit@^0.4.0: 388 | version "0.4.0" 389 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 390 | 391 | balanced-match@^1.0.0: 392 | version "1.0.0" 393 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 394 | 395 | binary-extensions@^2.0.0: 396 | version "2.1.0" 397 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" 398 | 399 | brace-expansion@^1.1.7: 400 | version "1.1.11" 401 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 402 | dependencies: 403 | balanced-match "^1.0.0" 404 | concat-map "0.0.1" 405 | 406 | braces@^3.0.1, braces@~3.0.2: 407 | version "3.0.2" 408 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 409 | dependencies: 410 | fill-range "^7.0.1" 411 | 412 | buffer-from@^1.0.0: 413 | version "1.1.1" 414 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 415 | 416 | bufferutil@^4.0.1: 417 | version "4.0.2" 418 | resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.2.tgz#79f68631910f6b993d870fc77dc0a2894eb96cd5" 419 | dependencies: 420 | node-gyp-build "^4.2.0" 421 | 422 | builtin-modules@^1.1.1: 423 | version "1.1.1" 424 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 425 | 426 | call-bind@^1.0.0: 427 | version "1.0.0" 428 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" 429 | dependencies: 430 | function-bind "^1.1.1" 431 | get-intrinsic "^1.0.0" 432 | 433 | callsites@^3.0.0: 434 | version "3.1.0" 435 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 436 | 437 | camelcase-keys@^2.0.0: 438 | version "2.1.0" 439 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 440 | dependencies: 441 | camelcase "^2.0.0" 442 | map-obj "^1.0.0" 443 | 444 | camelcase@^2.0.0: 445 | version "2.1.1" 446 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 447 | 448 | camelcase@^5.0.0: 449 | version "5.3.1" 450 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 451 | 452 | chalk@^2.0.0, chalk@^2.3.0: 453 | version "2.4.2" 454 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 455 | dependencies: 456 | ansi-styles "^3.2.1" 457 | escape-string-regexp "^1.0.5" 458 | supports-color "^5.3.0" 459 | 460 | chalk@^4.0.0, chalk@^4.1.0: 461 | version "4.1.0" 462 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 463 | dependencies: 464 | ansi-styles "^4.1.0" 465 | supports-color "^7.1.0" 466 | 467 | chokidar@^3.4.0: 468 | version "3.4.3" 469 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" 470 | dependencies: 471 | anymatch "~3.1.1" 472 | braces "~3.0.2" 473 | glob-parent "~5.1.0" 474 | is-binary-path "~2.1.0" 475 | is-glob "~4.0.1" 476 | normalize-path "~3.0.0" 477 | readdirp "~3.5.0" 478 | optionalDependencies: 479 | fsevents "~2.1.2" 480 | 481 | clean-stack@^2.0.0: 482 | version "2.2.0" 483 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 484 | 485 | cli-cursor@^3.1.0: 486 | version "3.1.0" 487 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 488 | dependencies: 489 | restore-cursor "^3.1.0" 490 | 491 | cli-progress@^3.9.0: 492 | version "3.9.0" 493 | resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.9.0.tgz#25db83447deb812e62d05bac1af9aec5387ef3d4" 494 | integrity sha512-g7rLWfhAo/7pF+a/STFH/xPyosaL1zgADhI0OM83hl3c7S43iGvJWEAV2QuDOnQ8i6EMBj/u4+NTd0d5L+4JfA== 495 | dependencies: 496 | colors "^1.1.2" 497 | string-width "^4.2.0" 498 | 499 | cli-truncate@^2.1.0: 500 | version "2.1.0" 501 | resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" 502 | dependencies: 503 | slice-ansi "^3.0.0" 504 | string-width "^4.2.0" 505 | 506 | cliui@^5.0.0: 507 | version "5.0.0" 508 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 509 | dependencies: 510 | string-width "^3.1.0" 511 | strip-ansi "^5.2.0" 512 | wrap-ansi "^5.1.0" 513 | 514 | color-convert@^1.9.0: 515 | version "1.9.3" 516 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 517 | dependencies: 518 | color-name "1.1.3" 519 | 520 | color-convert@^2.0.1: 521 | version "2.0.1" 522 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 523 | dependencies: 524 | color-name "~1.1.4" 525 | 526 | color-name@1.1.3: 527 | version "1.1.3" 528 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 529 | 530 | color-name@~1.1.4: 531 | version "1.1.4" 532 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 533 | 534 | color-support@^1.1.3: 535 | version "1.1.3" 536 | resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" 537 | 538 | colors@^1.1.2: 539 | version "1.4.0" 540 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" 541 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 542 | 543 | combined-stream@^1.0.8: 544 | version "1.0.8" 545 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 546 | dependencies: 547 | delayed-stream "~1.0.0" 548 | 549 | commander@^2.12.1: 550 | version "2.20.3" 551 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 552 | 553 | commander@^6.2.0: 554 | version "6.2.1" 555 | resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" 556 | 557 | concat-map@0.0.1: 558 | version "0.0.1" 559 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 560 | 561 | contains-path@^0.1.0: 562 | version "0.1.0" 563 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 564 | 565 | cookie@^0.4.1: 566 | version "0.4.1" 567 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" 568 | 569 | core-js@^1.0.0: 570 | version "1.2.7" 571 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 572 | 573 | cosmiconfig@^7.0.0: 574 | version "7.0.0" 575 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" 576 | dependencies: 577 | "@types/parse-json" "^4.0.0" 578 | import-fresh "^3.2.1" 579 | parse-json "^5.0.0" 580 | path-type "^4.0.0" 581 | yaml "^1.10.0" 582 | 583 | create-react-class@^15.6.0: 584 | version "15.7.0" 585 | resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.7.0.tgz#7499d7ca2e69bb51d13faf59bd04f0c65a1d6c1e" 586 | dependencies: 587 | loose-envify "^1.3.1" 588 | object-assign "^4.1.1" 589 | 590 | create-require@^1.1.0: 591 | version "1.1.1" 592 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 593 | 594 | cross-spawn@^6.0.5: 595 | version "6.0.5" 596 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 597 | dependencies: 598 | nice-try "^1.0.4" 599 | path-key "^2.0.1" 600 | semver "^5.5.0" 601 | shebang-command "^1.2.0" 602 | which "^1.2.9" 603 | 604 | cross-spawn@^7.0.0, cross-spawn@^7.0.2: 605 | version "7.0.3" 606 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 607 | dependencies: 608 | path-key "^3.1.0" 609 | shebang-command "^2.0.0" 610 | which "^2.0.1" 611 | 612 | crypto-js@^4.0.0: 613 | version "4.0.0" 614 | resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.0.0.tgz#2904ab2677a9d042856a2ea2ef80de92e4a36dcc" 615 | 616 | currently-unhandled@^0.4.1: 617 | version "0.4.1" 618 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 619 | dependencies: 620 | array-find-index "^1.0.1" 621 | 622 | d3-array@^1.2.0, d3-array@^1.2.1: 623 | version "1.2.4" 624 | resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" 625 | 626 | d3-collection@1, d3-collection@^1.0.4: 627 | version "1.0.7" 628 | resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" 629 | 630 | d3-color@1: 631 | version "1.4.1" 632 | resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" 633 | 634 | d3-dispatch@1: 635 | version "1.0.6" 636 | resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" 637 | 638 | d3-force@^1.1.0: 639 | version "1.2.1" 640 | resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" 641 | dependencies: 642 | d3-collection "1" 643 | d3-dispatch "1" 644 | d3-quadtree "1" 645 | d3-timer "1" 646 | 647 | d3-format@1, d3-format@^1.2.1: 648 | version "1.4.5" 649 | resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" 650 | 651 | d3-interpolate@1, d3-interpolate@^1.1.6: 652 | version "1.4.0" 653 | resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" 654 | dependencies: 655 | d3-color "1" 656 | 657 | d3-path@1, d3-path@^1.0.5: 658 | version "1.0.9" 659 | resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" 660 | 661 | d3-quadtree@1: 662 | version "1.0.7" 663 | resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" 664 | 665 | d3-scale@^1.0.7: 666 | version "1.0.7" 667 | resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d" 668 | dependencies: 669 | d3-array "^1.2.0" 670 | d3-collection "1" 671 | d3-color "1" 672 | d3-format "1" 673 | d3-interpolate "1" 674 | d3-time "1" 675 | d3-time-format "2" 676 | 677 | d3-selection@^1.2.0: 678 | version "1.4.2" 679 | resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" 680 | 681 | d3-shape@^1.2.0: 682 | version "1.3.7" 683 | resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" 684 | dependencies: 685 | d3-path "1" 686 | 687 | d3-time-format@2, d3-time-format@^2.1.1: 688 | version "2.3.0" 689 | resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" 690 | dependencies: 691 | d3-time "1" 692 | 693 | d3-time@1, d3-time@^1.0.8: 694 | version "1.1.0" 695 | resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" 696 | 697 | d3-timer@1: 698 | version "1.0.10" 699 | resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" 700 | 701 | d@1, d@^1.0.1: 702 | version "1.0.1" 703 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" 704 | dependencies: 705 | es5-ext "^0.10.50" 706 | type "^1.0.1" 707 | 708 | dateformat@~1.0.4-1.2.3: 709 | version "1.0.12" 710 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 711 | dependencies: 712 | get-stdin "^4.0.1" 713 | meow "^3.3.0" 714 | 715 | debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.2.0: 716 | version "4.3.1" 717 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 718 | dependencies: 719 | ms "2.1.2" 720 | 721 | debug@^2.2.0, debug@^2.6.9: 722 | version "2.6.9" 723 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 724 | dependencies: 725 | ms "2.0.0" 726 | 727 | debug@^3.0.1, debug@^3.1.0: 728 | version "3.2.7" 729 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 730 | dependencies: 731 | ms "^2.1.1" 732 | 733 | decamelize@^1.1.2, decamelize@^1.2.0: 734 | version "1.2.0" 735 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 736 | 737 | dedent@^0.7.0: 738 | version "0.7.0" 739 | resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" 740 | 741 | deep-is@^0.1.3: 742 | version "0.1.3" 743 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 744 | 745 | deepmerge@^4.2.2: 746 | version "4.2.2" 747 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" 748 | 749 | define-properties@^1.1.3: 750 | version "1.1.3" 751 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 752 | dependencies: 753 | object-keys "^1.0.12" 754 | 755 | delayed-stream@~1.0.0: 756 | version "1.0.0" 757 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 758 | 759 | diff@^4.0.1: 760 | version "4.0.2" 761 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 762 | 763 | dir-glob@^3.0.1: 764 | version "3.0.1" 765 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 766 | dependencies: 767 | path-type "^4.0.0" 768 | 769 | doctrine@1.5.0: 770 | version "1.5.0" 771 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 772 | dependencies: 773 | esutils "^2.0.2" 774 | isarray "^1.0.0" 775 | 776 | doctrine@^3.0.0: 777 | version "3.0.0" 778 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 779 | dependencies: 780 | esutils "^2.0.2" 781 | 782 | dotenv@^8.2.0: 783 | version "8.2.0" 784 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" 785 | 786 | dynamic-dedupe@^0.3.0: 787 | version "0.3.0" 788 | resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" 789 | dependencies: 790 | xtend "^4.0.0" 791 | 792 | emoji-regex@^7.0.1: 793 | version "7.0.3" 794 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 795 | 796 | emoji-regex@^8.0.0: 797 | version "8.0.0" 798 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 799 | 800 | encoding@^0.1.11: 801 | version "0.1.13" 802 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" 803 | dependencies: 804 | iconv-lite "^0.6.2" 805 | 806 | end-of-stream@^1.1.0: 807 | version "1.4.4" 808 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 809 | dependencies: 810 | once "^1.4.0" 811 | 812 | enquirer@^2.3.5, enquirer@^2.3.6: 813 | version "2.3.6" 814 | resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" 815 | dependencies: 816 | ansi-colors "^4.1.1" 817 | 818 | error-ex@^1.2.0, error-ex@^1.3.1: 819 | version "1.3.2" 820 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 821 | dependencies: 822 | is-arrayish "^0.2.1" 823 | 824 | es-abstract@^1.18.0-next.1: 825 | version "1.18.0-next.1" 826 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" 827 | dependencies: 828 | es-to-primitive "^1.2.1" 829 | function-bind "^1.1.1" 830 | has "^1.0.3" 831 | has-symbols "^1.0.1" 832 | is-callable "^1.2.2" 833 | is-negative-zero "^2.0.0" 834 | is-regex "^1.1.1" 835 | object-inspect "^1.8.0" 836 | object-keys "^1.1.1" 837 | object.assign "^4.1.1" 838 | string.prototype.trimend "^1.0.1" 839 | string.prototype.trimstart "^1.0.1" 840 | 841 | es-to-primitive@^1.2.1: 842 | version "1.2.1" 843 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 844 | dependencies: 845 | is-callable "^1.1.4" 846 | is-date-object "^1.0.1" 847 | is-symbol "^1.0.2" 848 | 849 | es5-ext@^0.10.35, es5-ext@^0.10.50: 850 | version "0.10.53" 851 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" 852 | dependencies: 853 | es6-iterator "~2.0.3" 854 | es6-symbol "~3.1.3" 855 | next-tick "~1.0.0" 856 | 857 | es6-iterator@~2.0.3: 858 | version "2.0.3" 859 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" 860 | dependencies: 861 | d "1" 862 | es5-ext "^0.10.35" 863 | es6-symbol "^3.1.1" 864 | 865 | es6-symbol@^3.1.1, es6-symbol@~3.1.3: 866 | version "3.1.3" 867 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" 868 | dependencies: 869 | d "^1.0.1" 870 | ext "^1.1.2" 871 | 872 | escape-string-regexp@^1.0.5: 873 | version "1.0.5" 874 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 875 | 876 | eslint-config-prettier@^6.11.0: 877 | version "6.15.0" 878 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" 879 | dependencies: 880 | get-stdin "^6.0.0" 881 | 882 | eslint-config-semistandard@15.0.1: 883 | version "15.0.1" 884 | resolved "https://registry.yarnpkg.com/eslint-config-semistandard/-/eslint-config-semistandard-15.0.1.tgz#a868397af8fb26d1bb6b907aa9d575d385581099" 885 | 886 | eslint-config-standard@>=14.1.0: 887 | version "16.0.2" 888 | resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.2.tgz#71e91727ac7a203782d0a5ca4d1c462d14e234f6" 889 | 890 | eslint-import-resolver-node@^0.3.4: 891 | version "0.3.4" 892 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" 893 | dependencies: 894 | debug "^2.6.9" 895 | resolve "^1.13.1" 896 | 897 | eslint-module-utils@^2.6.0: 898 | version "2.6.0" 899 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" 900 | dependencies: 901 | debug "^2.6.9" 902 | pkg-dir "^2.0.0" 903 | 904 | eslint-plugin-es@^3.0.0: 905 | version "3.0.1" 906 | resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" 907 | dependencies: 908 | eslint-utils "^2.0.0" 909 | regexpp "^3.0.0" 910 | 911 | eslint-plugin-import@^2.22.0: 912 | version "2.22.1" 913 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" 914 | dependencies: 915 | array-includes "^3.1.1" 916 | array.prototype.flat "^1.2.3" 917 | contains-path "^0.1.0" 918 | debug "^2.6.9" 919 | doctrine "1.5.0" 920 | eslint-import-resolver-node "^0.3.4" 921 | eslint-module-utils "^2.6.0" 922 | has "^1.0.3" 923 | minimatch "^3.0.4" 924 | object.values "^1.1.1" 925 | read-pkg-up "^2.0.0" 926 | resolve "^1.17.0" 927 | tsconfig-paths "^3.9.0" 928 | 929 | eslint-plugin-jest@^24.0.0: 930 | version "24.1.3" 931 | resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.3.tgz#fa3db864f06c5623ff43485ca6c0e8fc5fe8ba0c" 932 | dependencies: 933 | "@typescript-eslint/experimental-utils" "^4.0.1" 934 | 935 | eslint-plugin-node@>=9.1.0: 936 | version "11.1.0" 937 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" 938 | dependencies: 939 | eslint-plugin-es "^3.0.0" 940 | eslint-utils "^2.0.0" 941 | ignore "^5.1.1" 942 | minimatch "^3.0.4" 943 | resolve "^1.10.1" 944 | semver "^6.1.0" 945 | 946 | eslint-plugin-prettier@^3.1.4: 947 | version "3.3.0" 948 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz#61e295349a65688ffac0b7808ef0a8244bdd8d40" 949 | dependencies: 950 | prettier-linter-helpers "^1.0.0" 951 | 952 | eslint-plugin-promise@>=4.2.1: 953 | version "4.2.1" 954 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" 955 | 956 | eslint-scope@^5.0.0, eslint-scope@^5.1.1: 957 | version "5.1.1" 958 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 959 | dependencies: 960 | esrecurse "^4.3.0" 961 | estraverse "^4.1.1" 962 | 963 | eslint-utils@^2.0.0, eslint-utils@^2.1.0: 964 | version "2.1.0" 965 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" 966 | dependencies: 967 | eslint-visitor-keys "^1.1.0" 968 | 969 | eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: 970 | version "1.3.0" 971 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 972 | 973 | eslint-visitor-keys@^2.0.0: 974 | version "2.0.0" 975 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" 976 | 977 | eslint@>=6.0.1: 978 | version "7.16.0" 979 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.16.0.tgz#a761605bf9a7b32d24bb7cde59aeb0fd76f06092" 980 | dependencies: 981 | "@babel/code-frame" "^7.0.0" 982 | "@eslint/eslintrc" "^0.2.2" 983 | ajv "^6.10.0" 984 | chalk "^4.0.0" 985 | cross-spawn "^7.0.2" 986 | debug "^4.0.1" 987 | doctrine "^3.0.0" 988 | enquirer "^2.3.5" 989 | eslint-scope "^5.1.1" 990 | eslint-utils "^2.1.0" 991 | eslint-visitor-keys "^2.0.0" 992 | espree "^7.3.1" 993 | esquery "^1.2.0" 994 | esutils "^2.0.2" 995 | file-entry-cache "^6.0.0" 996 | functional-red-black-tree "^1.0.1" 997 | glob-parent "^5.0.0" 998 | globals "^12.1.0" 999 | ignore "^4.0.6" 1000 | import-fresh "^3.0.0" 1001 | imurmurhash "^0.1.4" 1002 | is-glob "^4.0.0" 1003 | js-yaml "^3.13.1" 1004 | json-stable-stringify-without-jsonify "^1.0.1" 1005 | levn "^0.4.1" 1006 | lodash "^4.17.19" 1007 | minimatch "^3.0.4" 1008 | natural-compare "^1.4.0" 1009 | optionator "^0.9.1" 1010 | progress "^2.0.0" 1011 | regexpp "^3.1.0" 1012 | semver "^7.2.1" 1013 | strip-ansi "^6.0.0" 1014 | strip-json-comments "^3.1.0" 1015 | table "^6.0.4" 1016 | text-table "^0.2.0" 1017 | v8-compile-cache "^2.0.3" 1018 | 1019 | espree@^7.3.0, espree@^7.3.1: 1020 | version "7.3.1" 1021 | resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" 1022 | dependencies: 1023 | acorn "^7.4.0" 1024 | acorn-jsx "^5.3.1" 1025 | eslint-visitor-keys "^1.3.0" 1026 | 1027 | esprima@^4.0.0: 1028 | version "4.0.1" 1029 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 1030 | 1031 | esquery@^1.2.0: 1032 | version "1.3.1" 1033 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" 1034 | dependencies: 1035 | estraverse "^5.1.0" 1036 | 1037 | esrecurse@^4.3.0: 1038 | version "4.3.0" 1039 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 1040 | dependencies: 1041 | estraverse "^5.2.0" 1042 | 1043 | estraverse@^4.1.1: 1044 | version "4.3.0" 1045 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 1046 | 1047 | estraverse@^5.1.0, estraverse@^5.2.0: 1048 | version "5.2.0" 1049 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" 1050 | 1051 | esutils@^2.0.2: 1052 | version "2.0.3" 1053 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 1054 | 1055 | execa@^4.1.0: 1056 | version "4.1.0" 1057 | resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" 1058 | dependencies: 1059 | cross-spawn "^7.0.0" 1060 | get-stream "^5.0.0" 1061 | human-signals "^1.1.1" 1062 | is-stream "^2.0.0" 1063 | merge-stream "^2.0.0" 1064 | npm-run-path "^4.0.0" 1065 | onetime "^5.1.0" 1066 | signal-exit "^3.0.2" 1067 | strip-final-newline "^2.0.0" 1068 | 1069 | ext@^1.1.2: 1070 | version "1.4.0" 1071 | resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" 1072 | dependencies: 1073 | type "^2.0.0" 1074 | 1075 | fancy-log@^1.3.0: 1076 | version "1.3.3" 1077 | resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" 1078 | dependencies: 1079 | ansi-gray "^0.1.1" 1080 | color-support "^1.1.3" 1081 | parse-node-version "^1.0.0" 1082 | time-stamp "^1.0.0" 1083 | 1084 | fast-deep-equal@^3.1.1: 1085 | version "3.1.3" 1086 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1087 | 1088 | fast-diff@^1.1.2: 1089 | version "1.2.0" 1090 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" 1091 | 1092 | fast-glob@^3.1.1: 1093 | version "3.2.4" 1094 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" 1095 | dependencies: 1096 | "@nodelib/fs.stat" "^2.0.2" 1097 | "@nodelib/fs.walk" "^1.2.3" 1098 | glob-parent "^5.1.0" 1099 | merge2 "^1.3.0" 1100 | micromatch "^4.0.2" 1101 | picomatch "^2.2.1" 1102 | 1103 | fast-json-stable-stringify@^2.0.0: 1104 | version "2.1.0" 1105 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1106 | 1107 | fast-levenshtein@^2.0.6: 1108 | version "2.0.6" 1109 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1110 | 1111 | fastq@^1.6.0: 1112 | version "1.10.0" 1113 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" 1114 | dependencies: 1115 | reusify "^1.0.4" 1116 | 1117 | fbjs@^0.8.9: 1118 | version "0.8.17" 1119 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" 1120 | dependencies: 1121 | core-js "^1.0.0" 1122 | isomorphic-fetch "^2.1.1" 1123 | loose-envify "^1.0.0" 1124 | object-assign "^4.1.0" 1125 | promise "^7.1.1" 1126 | setimmediate "^1.0.5" 1127 | ua-parser-js "^0.7.18" 1128 | 1129 | figures@^3.2.0: 1130 | version "3.2.0" 1131 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" 1132 | dependencies: 1133 | escape-string-regexp "^1.0.5" 1134 | 1135 | file-entry-cache@^6.0.0: 1136 | version "6.0.0" 1137 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" 1138 | dependencies: 1139 | flat-cache "^3.0.4" 1140 | 1141 | fill-range@^7.0.1: 1142 | version "7.0.1" 1143 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1144 | dependencies: 1145 | to-regex-range "^5.0.1" 1146 | 1147 | find-up@^1.0.0: 1148 | version "1.1.2" 1149 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 1150 | dependencies: 1151 | path-exists "^2.0.0" 1152 | pinkie-promise "^2.0.0" 1153 | 1154 | find-up@^2.0.0, find-up@^2.1.0: 1155 | version "2.1.0" 1156 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 1157 | dependencies: 1158 | locate-path "^2.0.0" 1159 | 1160 | find-up@^3.0.0: 1161 | version "3.0.0" 1162 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 1163 | dependencies: 1164 | locate-path "^3.0.0" 1165 | 1166 | flat-cache@^3.0.4: 1167 | version "3.0.4" 1168 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 1169 | dependencies: 1170 | flatted "^3.1.0" 1171 | rimraf "^3.0.2" 1172 | 1173 | flatted@^3.1.0: 1174 | version "3.1.0" 1175 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" 1176 | 1177 | form-data@^3.0.0: 1178 | version "3.0.0" 1179 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" 1180 | dependencies: 1181 | asynckit "^0.4.0" 1182 | combined-stream "^1.0.8" 1183 | mime-types "^2.1.12" 1184 | 1185 | fs.realpath@^1.0.0: 1186 | version "1.0.0" 1187 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1188 | 1189 | fsevents@~2.1.2: 1190 | version "2.1.3" 1191 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 1192 | 1193 | function-bind@^1.1.1: 1194 | version "1.1.1" 1195 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1196 | 1197 | functional-red-black-tree@^1.0.1: 1198 | version "1.0.1" 1199 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 1200 | 1201 | get-caller-file@^2.0.1: 1202 | version "2.0.5" 1203 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1204 | 1205 | get-intrinsic@^1.0.0, get-intrinsic@^1.0.1: 1206 | version "1.0.2" 1207 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" 1208 | dependencies: 1209 | function-bind "^1.1.1" 1210 | has "^1.0.3" 1211 | has-symbols "^1.0.1" 1212 | 1213 | get-own-enumerable-property-symbols@^3.0.0: 1214 | version "3.0.2" 1215 | resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" 1216 | 1217 | get-stdin@^4.0.1: 1218 | version "4.0.1" 1219 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 1220 | 1221 | get-stdin@^6.0.0: 1222 | version "6.0.0" 1223 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 1224 | 1225 | get-stream@^5.0.0: 1226 | version "5.2.0" 1227 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 1228 | dependencies: 1229 | pump "^3.0.0" 1230 | 1231 | glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: 1232 | version "5.1.2" 1233 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1234 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1235 | dependencies: 1236 | is-glob "^4.0.1" 1237 | 1238 | glob@^7.1.1, glob@^7.1.3, glob@~7.1.4: 1239 | version "7.1.6" 1240 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 1241 | dependencies: 1242 | fs.realpath "^1.0.0" 1243 | inflight "^1.0.4" 1244 | inherits "2" 1245 | minimatch "^3.0.4" 1246 | once "^1.3.0" 1247 | path-is-absolute "^1.0.0" 1248 | 1249 | globals@^12.1.0: 1250 | version "12.4.0" 1251 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" 1252 | dependencies: 1253 | type-fest "^0.8.1" 1254 | 1255 | globby@^11.0.1: 1256 | version "11.0.1" 1257 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" 1258 | dependencies: 1259 | array-union "^2.1.0" 1260 | dir-glob "^3.0.1" 1261 | fast-glob "^3.1.1" 1262 | ignore "^5.1.4" 1263 | merge2 "^1.3.0" 1264 | slash "^3.0.0" 1265 | 1266 | graceful-fs@^4.1.2: 1267 | version "4.2.4" 1268 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 1269 | 1270 | growly@^1.3.0: 1271 | version "1.3.0" 1272 | resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" 1273 | 1274 | has-flag@^3.0.0: 1275 | version "3.0.0" 1276 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1277 | 1278 | has-flag@^4.0.0: 1279 | version "4.0.0" 1280 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1281 | 1282 | has-symbols@^1.0.1: 1283 | version "1.0.1" 1284 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 1285 | 1286 | has@^1.0.3: 1287 | version "1.0.3" 1288 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1289 | dependencies: 1290 | function-bind "^1.1.1" 1291 | 1292 | hosted-git-info@^2.1.4: 1293 | version "2.8.9" 1294 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" 1295 | integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== 1296 | 1297 | https-proxy-agent@^5.0.0: 1298 | version "5.0.0" 1299 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" 1300 | dependencies: 1301 | agent-base "6" 1302 | debug "4" 1303 | 1304 | human-signals@^1.1.1: 1305 | version "1.1.1" 1306 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" 1307 | 1308 | iconv-lite@^0.6.2: 1309 | version "0.6.2" 1310 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" 1311 | dependencies: 1312 | safer-buffer ">= 2.1.2 < 3.0.0" 1313 | 1314 | ignore@^4.0.6: 1315 | version "4.0.6" 1316 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 1317 | 1318 | ignore@^5.1.1, ignore@^5.1.4: 1319 | version "5.1.8" 1320 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" 1321 | 1322 | import-fresh@^3.0.0, import-fresh@^3.2.1: 1323 | version "3.3.0" 1324 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1325 | dependencies: 1326 | parent-module "^1.0.0" 1327 | resolve-from "^4.0.0" 1328 | 1329 | imurmurhash@^0.1.4: 1330 | version "0.1.4" 1331 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1332 | 1333 | indent-string@^2.1.0: 1334 | version "2.1.0" 1335 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 1336 | dependencies: 1337 | repeating "^2.0.0" 1338 | 1339 | indent-string@^4.0.0: 1340 | version "4.0.0" 1341 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 1342 | 1343 | inflight@^1.0.4: 1344 | version "1.0.6" 1345 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1346 | dependencies: 1347 | once "^1.3.0" 1348 | wrappy "1" 1349 | 1350 | inherits@2: 1351 | version "2.0.4" 1352 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1353 | 1354 | is-arrayish@^0.2.1: 1355 | version "0.2.1" 1356 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1357 | 1358 | is-binary-path@~2.1.0: 1359 | version "2.1.0" 1360 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1361 | dependencies: 1362 | binary-extensions "^2.0.0" 1363 | 1364 | is-callable@^1.1.4, is-callable@^1.2.2: 1365 | version "1.2.2" 1366 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" 1367 | 1368 | is-core-module@^2.1.0: 1369 | version "2.2.0" 1370 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" 1371 | dependencies: 1372 | has "^1.0.3" 1373 | 1374 | is-date-object@^1.0.1: 1375 | version "1.0.2" 1376 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 1377 | 1378 | is-docker@^2.0.0: 1379 | version "2.1.1" 1380 | resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" 1381 | 1382 | is-extglob@^2.1.1: 1383 | version "2.1.1" 1384 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1385 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1386 | 1387 | is-finite@^1.0.0: 1388 | version "1.1.0" 1389 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" 1390 | 1391 | is-fullwidth-code-point@^2.0.0: 1392 | version "2.0.0" 1393 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1394 | 1395 | is-fullwidth-code-point@^3.0.0: 1396 | version "3.0.0" 1397 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1398 | 1399 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: 1400 | version "4.0.1" 1401 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1402 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1403 | dependencies: 1404 | is-extglob "^2.1.1" 1405 | 1406 | is-negative-zero@^2.0.0: 1407 | version "2.0.1" 1408 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" 1409 | 1410 | is-number@^7.0.0: 1411 | version "7.0.0" 1412 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1413 | 1414 | is-obj@^1.0.1: 1415 | version "1.0.1" 1416 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 1417 | 1418 | is-regex@^1.1.1: 1419 | version "1.1.1" 1420 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" 1421 | dependencies: 1422 | has-symbols "^1.0.1" 1423 | 1424 | is-regexp@^1.0.0: 1425 | version "1.0.0" 1426 | resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" 1427 | 1428 | is-stream@^1.0.1: 1429 | version "1.1.0" 1430 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1431 | 1432 | is-stream@^2.0.0: 1433 | version "2.0.0" 1434 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 1435 | 1436 | is-string@^1.0.5: 1437 | version "1.0.5" 1438 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 1439 | 1440 | is-symbol@^1.0.2: 1441 | version "1.0.3" 1442 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 1443 | dependencies: 1444 | has-symbols "^1.0.1" 1445 | 1446 | is-typedarray@^1.0.0: 1447 | version "1.0.0" 1448 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1449 | 1450 | is-utf8@^0.2.0: 1451 | version "0.2.1" 1452 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1453 | 1454 | is-wsl@^2.2.0: 1455 | version "2.2.0" 1456 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" 1457 | dependencies: 1458 | is-docker "^2.0.0" 1459 | 1460 | isarray@^1.0.0: 1461 | version "1.0.0" 1462 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1463 | 1464 | isexe@^2.0.0: 1465 | version "2.0.0" 1466 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1467 | 1468 | isomorphic-fetch@^2.1.1: 1469 | version "2.2.1" 1470 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1471 | dependencies: 1472 | node-fetch "^1.0.1" 1473 | whatwg-fetch ">=0.10.0" 1474 | 1475 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1476 | version "4.0.0" 1477 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1478 | 1479 | js-yaml@^3.13.1: 1480 | version "3.14.1" 1481 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 1482 | dependencies: 1483 | argparse "^1.0.7" 1484 | esprima "^4.0.0" 1485 | 1486 | json-parse-even-better-errors@^2.3.0: 1487 | version "2.3.1" 1488 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 1489 | 1490 | json-schema-traverse@^0.4.1: 1491 | version "0.4.1" 1492 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1493 | 1494 | json-schema-traverse@^1.0.0: 1495 | version "1.0.0" 1496 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 1497 | 1498 | json-stable-stringify-without-jsonify@^1.0.1: 1499 | version "1.0.1" 1500 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1501 | 1502 | json-stable-stringify@^1.0.1: 1503 | version "1.0.1" 1504 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1505 | dependencies: 1506 | jsonify "~0.0.0" 1507 | 1508 | json5@^1.0.1: 1509 | version "1.0.1" 1510 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 1511 | dependencies: 1512 | minimist "^1.2.0" 1513 | 1514 | json5@^2.1.1: 1515 | version "2.1.3" 1516 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" 1517 | dependencies: 1518 | minimist "^1.2.5" 1519 | 1520 | jsonic@^0.3.0: 1521 | version "0.3.1" 1522 | resolved "https://registry.yarnpkg.com/jsonic/-/jsonic-0.3.1.tgz#da306185dc635b649ad934e3f6826188cad73bdb" 1523 | 1524 | jsonify@~0.0.0: 1525 | version "0.0.0" 1526 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1527 | 1528 | levn@^0.4.1: 1529 | version "0.4.1" 1530 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1531 | dependencies: 1532 | prelude-ls "^1.2.1" 1533 | type-check "~0.4.0" 1534 | 1535 | lines-and-columns@^1.1.6: 1536 | version "1.1.6" 1537 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" 1538 | 1539 | lint-staged@^10.0.8: 1540 | version "10.5.3" 1541 | resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.3.tgz#c682838b3eadd4c864d1022da05daa0912fb1da5" 1542 | dependencies: 1543 | chalk "^4.1.0" 1544 | cli-truncate "^2.1.0" 1545 | commander "^6.2.0" 1546 | cosmiconfig "^7.0.0" 1547 | debug "^4.2.0" 1548 | dedent "^0.7.0" 1549 | enquirer "^2.3.6" 1550 | execa "^4.1.0" 1551 | listr2 "^3.2.2" 1552 | log-symbols "^4.0.0" 1553 | micromatch "^4.0.2" 1554 | normalize-path "^3.0.0" 1555 | please-upgrade-node "^3.2.0" 1556 | string-argv "0.3.1" 1557 | stringify-object "^3.3.0" 1558 | 1559 | listr2@^3.2.2: 1560 | version "3.2.3" 1561 | resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.2.3.tgz#ef9e0d790862f038dde8a9837be552b1adfd1c07" 1562 | dependencies: 1563 | chalk "^4.1.0" 1564 | cli-truncate "^2.1.0" 1565 | figures "^3.2.0" 1566 | indent-string "^4.0.0" 1567 | log-update "^4.0.0" 1568 | p-map "^4.0.0" 1569 | rxjs "^6.6.3" 1570 | through "^2.3.8" 1571 | 1572 | load-json-file@^1.0.0: 1573 | version "1.1.0" 1574 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1575 | dependencies: 1576 | graceful-fs "^4.1.2" 1577 | parse-json "^2.2.0" 1578 | pify "^2.0.0" 1579 | pinkie-promise "^2.0.0" 1580 | strip-bom "^2.0.0" 1581 | 1582 | load-json-file@^2.0.0: 1583 | version "2.0.0" 1584 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1585 | dependencies: 1586 | graceful-fs "^4.1.2" 1587 | parse-json "^2.2.0" 1588 | pify "^2.0.0" 1589 | strip-bom "^3.0.0" 1590 | 1591 | locate-path@^2.0.0: 1592 | version "2.0.0" 1593 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1594 | dependencies: 1595 | p-locate "^2.0.0" 1596 | path-exists "^3.0.0" 1597 | 1598 | locate-path@^3.0.0: 1599 | version "3.0.0" 1600 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1601 | dependencies: 1602 | p-locate "^3.0.0" 1603 | path-exists "^3.0.0" 1604 | 1605 | lodash.flattendeep@^4.4.0: 1606 | version "4.4.0" 1607 | resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" 1608 | 1609 | lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: 1610 | version "4.17.21" 1611 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1612 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1613 | 1614 | log-symbols@^4.0.0: 1615 | version "4.0.0" 1616 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" 1617 | dependencies: 1618 | chalk "^4.0.0" 1619 | 1620 | log-update@^4.0.0: 1621 | version "4.0.0" 1622 | resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" 1623 | dependencies: 1624 | ansi-escapes "^4.3.0" 1625 | cli-cursor "^3.1.0" 1626 | slice-ansi "^4.0.0" 1627 | wrap-ansi "^6.2.0" 1628 | 1629 | loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: 1630 | version "1.4.0" 1631 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1632 | dependencies: 1633 | js-tokens "^3.0.0 || ^4.0.0" 1634 | 1635 | loud-rejection@^1.0.0: 1636 | version "1.6.0" 1637 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1638 | dependencies: 1639 | currently-unhandled "^0.4.1" 1640 | signal-exit "^3.0.0" 1641 | 1642 | lru-cache@^6.0.0: 1643 | version "6.0.0" 1644 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1645 | dependencies: 1646 | yallist "^4.0.0" 1647 | 1648 | lru_map@^0.3.3: 1649 | version "0.3.3" 1650 | resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" 1651 | 1652 | make-error@^1.1.1: 1653 | version "1.3.6" 1654 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1655 | 1656 | map-obj@^1.0.0, map-obj@^1.0.1: 1657 | version "1.0.1" 1658 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1659 | 1660 | meow@^3.3.0: 1661 | version "3.7.0" 1662 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1663 | dependencies: 1664 | camelcase-keys "^2.0.0" 1665 | decamelize "^1.1.2" 1666 | loud-rejection "^1.0.0" 1667 | map-obj "^1.0.1" 1668 | minimist "^1.1.3" 1669 | normalize-package-data "^2.3.4" 1670 | object-assign "^4.0.1" 1671 | read-pkg-up "^1.0.1" 1672 | redent "^1.0.0" 1673 | trim-newlines "^1.0.0" 1674 | 1675 | merge-stream@^2.0.0: 1676 | version "2.0.0" 1677 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1678 | 1679 | merge2@^1.3.0: 1680 | version "1.4.1" 1681 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1682 | 1683 | micromatch@^4.0.2: 1684 | version "4.0.2" 1685 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" 1686 | dependencies: 1687 | braces "^3.0.1" 1688 | picomatch "^2.0.5" 1689 | 1690 | mime-db@1.44.0: 1691 | version "1.44.0" 1692 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 1693 | 1694 | mime-types@^2.1.12: 1695 | version "2.1.27" 1696 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 1697 | dependencies: 1698 | mime-db "1.44.0" 1699 | 1700 | mimic-fn@^2.1.0: 1701 | version "2.1.0" 1702 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1703 | 1704 | minimatch@^3.0.4: 1705 | version "3.0.4" 1706 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1707 | dependencies: 1708 | brace-expansion "^1.1.7" 1709 | 1710 | minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: 1711 | version "1.2.5" 1712 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1713 | 1714 | mkdirp@^0.5.3: 1715 | version "0.5.5" 1716 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1717 | dependencies: 1718 | minimist "^1.2.5" 1719 | 1720 | mkdirp@^1.0.4: 1721 | version "1.0.4" 1722 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 1723 | 1724 | ms@2.0.0: 1725 | version "2.0.0" 1726 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1727 | 1728 | ms@2.1.2: 1729 | version "2.1.2" 1730 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1731 | 1732 | ms@^2.1.1: 1733 | version "2.1.3" 1734 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1735 | 1736 | natural-compare@^1.4.0: 1737 | version "1.4.0" 1738 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1739 | 1740 | next-tick@~1.0.0: 1741 | version "1.0.0" 1742 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 1743 | 1744 | nice-try@^1.0.4: 1745 | version "1.0.5" 1746 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1747 | 1748 | node-fetch@^1.0.1: 1749 | version "1.7.3" 1750 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 1751 | dependencies: 1752 | encoding "^0.1.11" 1753 | is-stream "^1.0.1" 1754 | 1755 | node-fetch@^2.6.1: 1756 | version "2.6.1" 1757 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 1758 | 1759 | node-gyp-build@^4.2.0: 1760 | version "4.2.3" 1761 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" 1762 | 1763 | node-notifier@^9.0.0: 1764 | version "9.0.0" 1765 | resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-9.0.0.tgz#46c5bbecbb796d4a803f646cea5bc91403f2ff38" 1766 | dependencies: 1767 | growly "^1.3.0" 1768 | is-wsl "^2.2.0" 1769 | semver "^7.3.2" 1770 | shellwords "^0.1.1" 1771 | uuid "^8.3.0" 1772 | which "^2.0.2" 1773 | 1774 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 1775 | version "2.5.0" 1776 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1777 | dependencies: 1778 | hosted-git-info "^2.1.4" 1779 | resolve "^1.10.0" 1780 | semver "2 || 3 || 4 || 5" 1781 | validate-npm-package-license "^3.0.1" 1782 | 1783 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1784 | version "3.0.0" 1785 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1786 | 1787 | npm-run-path@^4.0.0: 1788 | version "4.0.1" 1789 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 1790 | dependencies: 1791 | path-key "^3.0.0" 1792 | 1793 | object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 1794 | version "4.1.1" 1795 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1796 | 1797 | object-inspect@^1.8.0: 1798 | version "1.9.0" 1799 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" 1800 | 1801 | object-keys@^1.0.12, object-keys@^1.1.1: 1802 | version "1.1.1" 1803 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1804 | 1805 | object.assign@^4.1.1: 1806 | version "4.1.2" 1807 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" 1808 | dependencies: 1809 | call-bind "^1.0.0" 1810 | define-properties "^1.1.3" 1811 | has-symbols "^1.0.1" 1812 | object-keys "^1.1.1" 1813 | 1814 | object.values@^1.1.1: 1815 | version "1.1.2" 1816 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" 1817 | dependencies: 1818 | call-bind "^1.0.0" 1819 | define-properties "^1.1.3" 1820 | es-abstract "^1.18.0-next.1" 1821 | has "^1.0.3" 1822 | 1823 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1824 | version "1.4.0" 1825 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1826 | dependencies: 1827 | wrappy "1" 1828 | 1829 | onetime@^5.1.0: 1830 | version "5.1.2" 1831 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1832 | dependencies: 1833 | mimic-fn "^2.1.0" 1834 | 1835 | optionator@^0.9.1: 1836 | version "0.9.1" 1837 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1838 | dependencies: 1839 | deep-is "^0.1.3" 1840 | fast-levenshtein "^2.0.6" 1841 | levn "^0.4.1" 1842 | prelude-ls "^1.2.1" 1843 | type-check "^0.4.0" 1844 | word-wrap "^1.2.3" 1845 | 1846 | p-limit@^1.1.0: 1847 | version "1.3.0" 1848 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 1849 | dependencies: 1850 | p-try "^1.0.0" 1851 | 1852 | p-limit@^2.0.0: 1853 | version "2.3.0" 1854 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1855 | dependencies: 1856 | p-try "^2.0.0" 1857 | 1858 | p-locate@^2.0.0: 1859 | version "2.0.0" 1860 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1861 | dependencies: 1862 | p-limit "^1.1.0" 1863 | 1864 | p-locate@^3.0.0: 1865 | version "3.0.0" 1866 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1867 | dependencies: 1868 | p-limit "^2.0.0" 1869 | 1870 | p-map@^4.0.0: 1871 | version "4.0.0" 1872 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" 1873 | dependencies: 1874 | aggregate-error "^3.0.0" 1875 | 1876 | p-try@^1.0.0: 1877 | version "1.0.0" 1878 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1879 | 1880 | p-try@^2.0.0: 1881 | version "2.2.0" 1882 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1883 | 1884 | parent-module@^1.0.0: 1885 | version "1.0.1" 1886 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1887 | dependencies: 1888 | callsites "^3.0.0" 1889 | 1890 | parse-json@^2.2.0: 1891 | version "2.2.0" 1892 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1893 | dependencies: 1894 | error-ex "^1.2.0" 1895 | 1896 | parse-json@^5.0.0: 1897 | version "5.1.0" 1898 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" 1899 | dependencies: 1900 | "@babel/code-frame" "^7.0.0" 1901 | error-ex "^1.3.1" 1902 | json-parse-even-better-errors "^2.3.0" 1903 | lines-and-columns "^1.1.6" 1904 | 1905 | parse-node-version@^1.0.0: 1906 | version "1.0.1" 1907 | resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" 1908 | 1909 | path-exists@^2.0.0: 1910 | version "2.1.0" 1911 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1912 | dependencies: 1913 | pinkie-promise "^2.0.0" 1914 | 1915 | path-exists@^3.0.0: 1916 | version "3.0.0" 1917 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1918 | 1919 | path-is-absolute@^1.0.0: 1920 | version "1.0.1" 1921 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1922 | 1923 | path-key@^2.0.1: 1924 | version "2.0.1" 1925 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1926 | 1927 | path-key@^3.0.0, path-key@^3.1.0: 1928 | version "3.1.1" 1929 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1930 | 1931 | path-parse@^1.0.6: 1932 | version "1.0.6" 1933 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1934 | 1935 | path-type@^1.0.0: 1936 | version "1.1.0" 1937 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1938 | dependencies: 1939 | graceful-fs "^4.1.2" 1940 | pify "^2.0.0" 1941 | pinkie-promise "^2.0.0" 1942 | 1943 | path-type@^2.0.0: 1944 | version "2.0.0" 1945 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1946 | dependencies: 1947 | pify "^2.0.0" 1948 | 1949 | path-type@^4.0.0: 1950 | version "4.0.0" 1951 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1952 | 1953 | performance-now@^2.1.0: 1954 | version "2.1.0" 1955 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1956 | 1957 | picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: 1958 | version "2.2.2" 1959 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1960 | 1961 | pify@^2.0.0: 1962 | version "2.3.0" 1963 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1964 | 1965 | pinkie-promise@^2.0.0: 1966 | version "2.0.1" 1967 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1968 | dependencies: 1969 | pinkie "^2.0.0" 1970 | 1971 | pinkie@^2.0.0: 1972 | version "2.0.4" 1973 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1974 | 1975 | pkg-dir@^2.0.0: 1976 | version "2.0.0" 1977 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 1978 | dependencies: 1979 | find-up "^2.1.0" 1980 | 1981 | please-upgrade-node@^3.2.0: 1982 | version "3.2.0" 1983 | resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" 1984 | dependencies: 1985 | semver-compare "^1.0.0" 1986 | 1987 | prelude-ls@^1.2.1: 1988 | version "1.2.1" 1989 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1990 | 1991 | prettier-linter-helpers@^1.0.0: 1992 | version "1.0.0" 1993 | resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 1994 | dependencies: 1995 | fast-diff "^1.1.2" 1996 | 1997 | prettier@^1.19.1: 1998 | version "1.19.1" 1999 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" 2000 | 2001 | progress@^2.0.0: 2002 | version "2.0.3" 2003 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 2004 | 2005 | promise@^7.1.1: 2006 | version "7.3.1" 2007 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 2008 | dependencies: 2009 | asap "~2.0.3" 2010 | 2011 | prop-types@^15.5.10, prop-types@^15.6.0: 2012 | version "15.7.2" 2013 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" 2014 | dependencies: 2015 | loose-envify "^1.4.0" 2016 | object-assign "^4.1.1" 2017 | react-is "^16.8.1" 2018 | 2019 | pump@^3.0.0: 2020 | version "3.0.0" 2021 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 2022 | dependencies: 2023 | end-of-stream "^1.1.0" 2024 | once "^1.3.1" 2025 | 2026 | punycode@^2.1.0: 2027 | version "2.1.1" 2028 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 2029 | 2030 | react-is@^16.8.1: 2031 | version "16.13.1" 2032 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 2033 | 2034 | react-stockcharts@^0.7.0-beta.13: 2035 | version "0.7.8" 2036 | resolved "https://registry.yarnpkg.com/react-stockcharts/-/react-stockcharts-0.7.8.tgz#d127a113479835be1a0ef7c37e5b5808740b9803" 2037 | dependencies: 2038 | d3-array "^1.2.1" 2039 | d3-collection "^1.0.4" 2040 | d3-force "^1.1.0" 2041 | d3-format "^1.2.1" 2042 | d3-interpolate "^1.1.6" 2043 | d3-path "^1.0.5" 2044 | d3-scale "^1.0.7" 2045 | d3-selection "^1.2.0" 2046 | d3-shape "^1.2.0" 2047 | d3-time "^1.0.8" 2048 | d3-time-format "^2.1.1" 2049 | debug "^3.1.0" 2050 | lodash.flattendeep "^4.4.0" 2051 | prop-types "^15.6.0" 2052 | save-svg-as-png "^1.4.5" 2053 | 2054 | react@^15.6.1: 2055 | version "15.7.0" 2056 | resolved "https://registry.yarnpkg.com/react/-/react-15.7.0.tgz#10308fd42ac6912a250bf00380751abc41ac7106" 2057 | dependencies: 2058 | create-react-class "^15.6.0" 2059 | fbjs "^0.8.9" 2060 | loose-envify "^1.1.0" 2061 | object-assign "^4.1.0" 2062 | prop-types "^15.5.10" 2063 | 2064 | read-pkg-up@^1.0.1: 2065 | version "1.0.1" 2066 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 2067 | dependencies: 2068 | find-up "^1.0.0" 2069 | read-pkg "^1.0.0" 2070 | 2071 | read-pkg-up@^2.0.0: 2072 | version "2.0.0" 2073 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 2074 | dependencies: 2075 | find-up "^2.0.0" 2076 | read-pkg "^2.0.0" 2077 | 2078 | read-pkg@^1.0.0: 2079 | version "1.1.0" 2080 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 2081 | dependencies: 2082 | load-json-file "^1.0.0" 2083 | normalize-package-data "^2.3.2" 2084 | path-type "^1.0.0" 2085 | 2086 | read-pkg@^2.0.0: 2087 | version "2.0.0" 2088 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 2089 | dependencies: 2090 | load-json-file "^2.0.0" 2091 | normalize-package-data "^2.3.2" 2092 | path-type "^2.0.0" 2093 | 2094 | readdirp@~3.5.0: 2095 | version "3.5.0" 2096 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" 2097 | dependencies: 2098 | picomatch "^2.2.1" 2099 | 2100 | redent@^1.0.0: 2101 | version "1.0.0" 2102 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 2103 | dependencies: 2104 | indent-string "^2.1.0" 2105 | strip-indent "^1.0.1" 2106 | 2107 | regexpp@^3.0.0, regexpp@^3.1.0: 2108 | version "3.1.0" 2109 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" 2110 | 2111 | repeating@^2.0.0: 2112 | version "2.0.1" 2113 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 2114 | dependencies: 2115 | is-finite "^1.0.0" 2116 | 2117 | require-directory@^2.1.1: 2118 | version "2.1.1" 2119 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2120 | 2121 | require-from-string@^2.0.2: 2122 | version "2.0.2" 2123 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 2124 | 2125 | require-main-filename@^2.0.0: 2126 | version "2.0.0" 2127 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 2128 | 2129 | resolve-from@^4.0.0: 2130 | version "4.0.0" 2131 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 2132 | 2133 | resolve@^1.0.0, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.3.2: 2134 | version "1.19.0" 2135 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" 2136 | dependencies: 2137 | is-core-module "^2.1.0" 2138 | path-parse "^1.0.6" 2139 | 2140 | restore-cursor@^3.1.0: 2141 | version "3.1.0" 2142 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 2143 | dependencies: 2144 | onetime "^5.1.0" 2145 | signal-exit "^3.0.2" 2146 | 2147 | reusify@^1.0.4: 2148 | version "1.0.4" 2149 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 2150 | 2151 | rimraf@^2.6.1: 2152 | version "2.7.1" 2153 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 2154 | dependencies: 2155 | glob "^7.1.3" 2156 | 2157 | rimraf@^3.0.2: 2158 | version "3.0.2" 2159 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 2160 | dependencies: 2161 | glob "^7.1.3" 2162 | 2163 | run-parallel@^1.1.9: 2164 | version "1.1.10" 2165 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" 2166 | 2167 | rxjs@^6.6.3: 2168 | version "6.6.3" 2169 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" 2170 | dependencies: 2171 | tslib "^1.9.0" 2172 | 2173 | "safer-buffer@>= 2.1.2 < 3.0.0": 2174 | version "2.1.2" 2175 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2176 | 2177 | save-svg-as-png@^1.4.5: 2178 | version "1.4.17" 2179 | resolved "https://registry.yarnpkg.com/save-svg-as-png/-/save-svg-as-png-1.4.17.tgz#294442002772a24f1db1bf8a2aaf7df4ab0cdc55" 2180 | 2181 | semver-compare@^1.0.0: 2182 | version "1.0.0" 2183 | resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" 2184 | 2185 | "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0: 2186 | version "5.7.1" 2187 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 2188 | 2189 | semver@^6.1.0: 2190 | version "6.3.0" 2191 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 2192 | 2193 | semver@^7.2.1, semver@^7.3.2: 2194 | version "7.3.4" 2195 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" 2196 | dependencies: 2197 | lru-cache "^6.0.0" 2198 | 2199 | set-blocking@^2.0.0: 2200 | version "2.0.0" 2201 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2202 | 2203 | setimmediate@^1.0.5: 2204 | version "1.0.5" 2205 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 2206 | 2207 | shebang-command@^1.2.0: 2208 | version "1.2.0" 2209 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2210 | dependencies: 2211 | shebang-regex "^1.0.0" 2212 | 2213 | shebang-command@^2.0.0: 2214 | version "2.0.0" 2215 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 2216 | dependencies: 2217 | shebang-regex "^3.0.0" 2218 | 2219 | shebang-regex@^1.0.0: 2220 | version "1.0.0" 2221 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2222 | 2223 | shebang-regex@^3.0.0: 2224 | version "3.0.0" 2225 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 2226 | 2227 | shellwords@^0.1.1: 2228 | version "0.1.1" 2229 | resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" 2230 | 2231 | signal-exit@^3.0.0, signal-exit@^3.0.2: 2232 | version "3.0.3" 2233 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 2234 | 2235 | signalr-client@0.0.17: 2236 | version "0.0.17" 2237 | resolved "https://registry.yarnpkg.com/signalr-client/-/signalr-client-0.0.17.tgz#a52177f37ce248ecc87226dd103c41ff70c829b1" 2238 | dependencies: 2239 | websocket "^1.0.17" 2240 | 2241 | slash@^3.0.0: 2242 | version "3.0.0" 2243 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2244 | 2245 | slice-ansi@^3.0.0: 2246 | version "3.0.0" 2247 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" 2248 | dependencies: 2249 | ansi-styles "^4.0.0" 2250 | astral-regex "^2.0.0" 2251 | is-fullwidth-code-point "^3.0.0" 2252 | 2253 | slice-ansi@^4.0.0: 2254 | version "4.0.0" 2255 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" 2256 | dependencies: 2257 | ansi-styles "^4.0.0" 2258 | astral-regex "^2.0.0" 2259 | is-fullwidth-code-point "^3.0.0" 2260 | 2261 | source-map-support@^0.5.12, source-map-support@^0.5.17: 2262 | version "0.5.19" 2263 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 2264 | dependencies: 2265 | buffer-from "^1.0.0" 2266 | source-map "^0.6.0" 2267 | 2268 | source-map@^0.6.0: 2269 | version "0.6.1" 2270 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2271 | 2272 | spdx-correct@^3.0.0: 2273 | version "3.1.1" 2274 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 2275 | dependencies: 2276 | spdx-expression-parse "^3.0.0" 2277 | spdx-license-ids "^3.0.0" 2278 | 2279 | spdx-exceptions@^2.1.0: 2280 | version "2.3.0" 2281 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 2282 | 2283 | spdx-expression-parse@^3.0.0: 2284 | version "3.0.1" 2285 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 2286 | dependencies: 2287 | spdx-exceptions "^2.1.0" 2288 | spdx-license-ids "^3.0.0" 2289 | 2290 | spdx-license-ids@^3.0.0: 2291 | version "3.0.7" 2292 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" 2293 | 2294 | sprintf-js@~1.0.2: 2295 | version "1.0.3" 2296 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2297 | 2298 | string-argv@0.3.1: 2299 | version "0.3.1" 2300 | resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" 2301 | 2302 | string-width@^3.0.0, string-width@^3.1.0: 2303 | version "3.1.0" 2304 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 2305 | dependencies: 2306 | emoji-regex "^7.0.1" 2307 | is-fullwidth-code-point "^2.0.0" 2308 | strip-ansi "^5.1.0" 2309 | 2310 | string-width@^4.1.0, string-width@^4.2.0: 2311 | version "4.2.0" 2312 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 2313 | dependencies: 2314 | emoji-regex "^8.0.0" 2315 | is-fullwidth-code-point "^3.0.0" 2316 | strip-ansi "^6.0.0" 2317 | 2318 | string.prototype.trimend@^1.0.1: 2319 | version "1.0.3" 2320 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" 2321 | dependencies: 2322 | call-bind "^1.0.0" 2323 | define-properties "^1.1.3" 2324 | 2325 | string.prototype.trimstart@^1.0.1: 2326 | version "1.0.3" 2327 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" 2328 | dependencies: 2329 | call-bind "^1.0.0" 2330 | define-properties "^1.1.3" 2331 | 2332 | stringify-object@^3.3.0: 2333 | version "3.3.0" 2334 | resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" 2335 | dependencies: 2336 | get-own-enumerable-property-symbols "^3.0.0" 2337 | is-obj "^1.0.1" 2338 | is-regexp "^1.0.0" 2339 | 2340 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 2341 | version "5.2.0" 2342 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 2343 | dependencies: 2344 | ansi-regex "^4.1.0" 2345 | 2346 | strip-ansi@^6.0.0: 2347 | version "6.0.0" 2348 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 2349 | dependencies: 2350 | ansi-regex "^5.0.0" 2351 | 2352 | strip-bom@^2.0.0: 2353 | version "2.0.0" 2354 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2355 | dependencies: 2356 | is-utf8 "^0.2.0" 2357 | 2358 | strip-bom@^3.0.0: 2359 | version "3.0.0" 2360 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2361 | 2362 | strip-bom@^4.0.0: 2363 | version "4.0.0" 2364 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" 2365 | 2366 | strip-final-newline@^2.0.0: 2367 | version "2.0.0" 2368 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 2369 | 2370 | strip-indent@^1.0.1: 2371 | version "1.0.1" 2372 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 2373 | dependencies: 2374 | get-stdin "^4.0.1" 2375 | 2376 | strip-json-comments@^2.0.0: 2377 | version "2.0.1" 2378 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2379 | 2380 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 2381 | version "3.1.1" 2382 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 2383 | 2384 | supports-color@^5.3.0: 2385 | version "5.5.0" 2386 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2387 | dependencies: 2388 | has-flag "^3.0.0" 2389 | 2390 | supports-color@^7.1.0: 2391 | version "7.2.0" 2392 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2393 | dependencies: 2394 | has-flag "^4.0.0" 2395 | 2396 | table@^6.0.4: 2397 | version "6.0.4" 2398 | resolved "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d" 2399 | dependencies: 2400 | ajv "^6.12.4" 2401 | lodash "^4.17.20" 2402 | slice-ansi "^4.0.0" 2403 | string-width "^4.2.0" 2404 | 2405 | text-table@^0.2.0: 2406 | version "0.2.0" 2407 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2408 | 2409 | through@^2.3.8: 2410 | version "2.3.8" 2411 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2412 | 2413 | time-stamp@^1.0.0: 2414 | version "1.1.0" 2415 | resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" 2416 | 2417 | to-regex-range@^5.0.1: 2418 | version "5.0.1" 2419 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2420 | dependencies: 2421 | is-number "^7.0.0" 2422 | 2423 | tree-kill@^1.2.2: 2424 | version "1.2.2" 2425 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 2426 | 2427 | trim-newlines@^1.0.0: 2428 | version "1.0.0" 2429 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 2430 | 2431 | ts-node-dev@^1.1.1: 2432 | version "1.1.1" 2433 | resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.1.1.tgz#b7602929395b1616b4aa99a3be0a4e121742283d" 2434 | dependencies: 2435 | chokidar "^3.4.0" 2436 | dateformat "~1.0.4-1.2.3" 2437 | dynamic-dedupe "^0.3.0" 2438 | minimist "^1.2.5" 2439 | mkdirp "^1.0.4" 2440 | resolve "^1.0.0" 2441 | rimraf "^2.6.1" 2442 | source-map-support "^0.5.12" 2443 | tree-kill "^1.2.2" 2444 | ts-node "^9.0.0" 2445 | tsconfig "^7.0.0" 2446 | 2447 | ts-node@^9.0.0: 2448 | version "9.1.1" 2449 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" 2450 | dependencies: 2451 | arg "^4.1.0" 2452 | create-require "^1.1.0" 2453 | diff "^4.0.1" 2454 | make-error "^1.1.1" 2455 | source-map-support "^0.5.17" 2456 | yn "3.1.1" 2457 | 2458 | tsconfig-loader@^1.1.0: 2459 | version "1.1.0" 2460 | resolved "https://registry.yarnpkg.com/tsconfig-loader/-/tsconfig-loader-1.1.0.tgz#90f60a569a65569c1096719c112b48b3f13f9fc1" 2461 | dependencies: 2462 | deepmerge "^4.2.2" 2463 | json5 "^2.1.1" 2464 | resolve "^1.15.1" 2465 | strip-bom "^4.0.0" 2466 | 2467 | tsconfig-paths@^3.9.0: 2468 | version "3.9.0" 2469 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" 2470 | dependencies: 2471 | "@types/json5" "^0.0.29" 2472 | json5 "^1.0.1" 2473 | minimist "^1.2.0" 2474 | strip-bom "^3.0.0" 2475 | 2476 | tsconfig@^7.0.0: 2477 | version "7.0.0" 2478 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" 2479 | dependencies: 2480 | "@types/strip-bom" "^3.0.0" 2481 | "@types/strip-json-comments" "0.0.30" 2482 | strip-bom "^3.0.0" 2483 | strip-json-comments "^2.0.0" 2484 | 2485 | tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: 2486 | version "1.14.1" 2487 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 2488 | 2489 | tslint@^6.1.3: 2490 | version "6.1.3" 2491 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" 2492 | dependencies: 2493 | "@babel/code-frame" "^7.0.0" 2494 | builtin-modules "^1.1.1" 2495 | chalk "^2.3.0" 2496 | commander "^2.12.1" 2497 | diff "^4.0.1" 2498 | glob "^7.1.1" 2499 | js-yaml "^3.13.1" 2500 | minimatch "^3.0.4" 2501 | mkdirp "^0.5.3" 2502 | resolve "^1.3.2" 2503 | semver "^5.3.0" 2504 | tslib "^1.13.0" 2505 | tsutils "^2.29.0" 2506 | 2507 | tsutils@^2.29.0: 2508 | version "2.29.0" 2509 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 2510 | dependencies: 2511 | tslib "^1.8.1" 2512 | 2513 | tsutils@^3.17.1: 2514 | version "3.17.1" 2515 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" 2516 | dependencies: 2517 | tslib "^1.8.1" 2518 | 2519 | type-check@^0.4.0, type-check@~0.4.0: 2520 | version "0.4.0" 2521 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2522 | dependencies: 2523 | prelude-ls "^1.2.1" 2524 | 2525 | type-fest@^0.11.0: 2526 | version "0.11.0" 2527 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" 2528 | 2529 | type-fest@^0.8.1: 2530 | version "0.8.1" 2531 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 2532 | 2533 | type@^1.0.1: 2534 | version "1.2.0" 2535 | resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" 2536 | 2537 | type@^2.0.0: 2538 | version "2.1.0" 2539 | resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" 2540 | 2541 | typedarray-to-buffer@^3.1.5: 2542 | version "3.1.5" 2543 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 2544 | dependencies: 2545 | is-typedarray "^1.0.0" 2546 | 2547 | typescript-json-schema@^0.38.3: 2548 | version "0.38.3" 2549 | resolved "https://registry.yarnpkg.com/typescript-json-schema/-/typescript-json-schema-0.38.3.tgz#90faca22860a656680ebcde102c8510b6b349c65" 2550 | dependencies: 2551 | glob "~7.1.4" 2552 | json-stable-stringify "^1.0.1" 2553 | typescript "^3.5.1" 2554 | yargs "^13.2.4" 2555 | 2556 | typescript-json-validator@^2.4.2: 2557 | version "2.4.2" 2558 | resolved "https://registry.yarnpkg.com/typescript-json-validator/-/typescript-json-validator-2.4.2.tgz#8056746eaf77f364b5ca4b0dabdfcfd51e3e8af4" 2559 | dependencies: 2560 | "@types/ajv" "^1.0.0" 2561 | "@types/cross-spawn" "^6.0.0" 2562 | "@types/glob" "^7.1.1" 2563 | "@types/json-stable-stringify" "^1.0.32" 2564 | "@types/minimatch" "^3.0.3" 2565 | cross-spawn "^6.0.5" 2566 | glob "^7.1.3" 2567 | json-stable-stringify "^1.0.1" 2568 | minimatch "^3.0.4" 2569 | tsconfig-loader "^1.1.0" 2570 | typescript-json-schema "^0.38.3" 2571 | yargs "^13.2.4" 2572 | 2573 | typescript@^3.5.1: 2574 | version "3.9.7" 2575 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" 2576 | 2577 | typescript@^4.1.3: 2578 | version "4.1.3" 2579 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" 2580 | 2581 | ua-parser-js@^0.7.18: 2582 | version "0.7.28" 2583 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" 2584 | integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== 2585 | 2586 | uri-js@^4.2.2: 2587 | version "4.4.0" 2588 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" 2589 | dependencies: 2590 | punycode "^2.1.0" 2591 | 2592 | utf-8-validate@^5.0.2: 2593 | version "5.0.3" 2594 | resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.3.tgz#3b64e418ad2ff829809025fdfef595eab2f03a27" 2595 | dependencies: 2596 | node-gyp-build "^4.2.0" 2597 | 2598 | uuid@^8.3.0: 2599 | version "8.3.2" 2600 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 2601 | 2602 | v8-compile-cache@^2.0.3: 2603 | version "2.2.0" 2604 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" 2605 | 2606 | validate-npm-package-license@^3.0.1: 2607 | version "3.0.4" 2608 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2609 | dependencies: 2610 | spdx-correct "^3.0.0" 2611 | spdx-expression-parse "^3.0.0" 2612 | 2613 | websocket@^1.0.17: 2614 | version "1.0.33" 2615 | resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.33.tgz#407f763fc58e74a3fa41ca3ae5d78d3f5e3b82a5" 2616 | dependencies: 2617 | bufferutil "^4.0.1" 2618 | debug "^2.2.0" 2619 | es5-ext "^0.10.50" 2620 | typedarray-to-buffer "^3.1.5" 2621 | utf-8-validate "^5.0.2" 2622 | yaeti "^0.0.6" 2623 | 2624 | whatwg-fetch@>=0.10.0: 2625 | version "3.5.0" 2626 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" 2627 | 2628 | which-module@^2.0.0: 2629 | version "2.0.0" 2630 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 2631 | 2632 | which@^1.2.9: 2633 | version "1.3.1" 2634 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2635 | dependencies: 2636 | isexe "^2.0.0" 2637 | 2638 | which@^2.0.1, which@^2.0.2: 2639 | version "2.0.2" 2640 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2641 | dependencies: 2642 | isexe "^2.0.0" 2643 | 2644 | word-wrap@^1.2.3: 2645 | version "1.2.3" 2646 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 2647 | 2648 | wrap-ansi@^5.1.0: 2649 | version "5.1.0" 2650 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 2651 | dependencies: 2652 | ansi-styles "^3.2.0" 2653 | string-width "^3.0.0" 2654 | strip-ansi "^5.0.0" 2655 | 2656 | wrap-ansi@^6.2.0: 2657 | version "6.2.0" 2658 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 2659 | dependencies: 2660 | ansi-styles "^4.0.0" 2661 | string-width "^4.1.0" 2662 | strip-ansi "^6.0.0" 2663 | 2664 | wrappy@1: 2665 | version "1.0.2" 2666 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2667 | 2668 | xtend@^4.0.0: 2669 | version "4.0.2" 2670 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2671 | 2672 | y18n@^4.0.0: 2673 | version "4.0.1" 2674 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" 2675 | 2676 | yaeti@^0.0.6: 2677 | version "0.0.6" 2678 | resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" 2679 | 2680 | yallist@^4.0.0: 2681 | version "4.0.0" 2682 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2683 | 2684 | yaml@^1.10.0: 2685 | version "1.10.0" 2686 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" 2687 | 2688 | yargs-parser@^13.1.2: 2689 | version "13.1.2" 2690 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 2691 | dependencies: 2692 | camelcase "^5.0.0" 2693 | decamelize "^1.2.0" 2694 | 2695 | yargs@^13.2.4: 2696 | version "13.3.2" 2697 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 2698 | dependencies: 2699 | cliui "^5.0.0" 2700 | find-up "^3.0.0" 2701 | get-caller-file "^2.0.1" 2702 | require-directory "^2.1.1" 2703 | require-main-filename "^2.0.0" 2704 | set-blocking "^2.0.0" 2705 | string-width "^3.0.0" 2706 | which-module "^2.0.0" 2707 | y18n "^4.0.0" 2708 | yargs-parser "^13.1.2" 2709 | 2710 | yn@3.1.1: 2711 | version "3.1.1" 2712 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 2713 | --------------------------------------------------------------------------------