diff --git a/.babelrc b/.babelrc deleted file mode 100644 index ae551d8..0000000 --- a/.babelrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "presets": [ - "env", - // "stage-0" - ], - "plugins": [ - ["transform-runtime",{ - "polyfill": false, - "regenerator": true - }], - "add-module-exports", - "transform-decorators-legacy", - "transform-class-properties", - "babel-plugin-transform-object-rest-spread" - ] -} \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7e3649a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab diff --git a/.env.tpl.js b/.env.tpl.js deleted file mode 100644 index 5076316..0000000 --- a/.env.tpl.js +++ /dev/null @@ -1,11 +0,0 @@ -export default { - log: { - writeFile: true, - logFolder: '', - stdout: false, - }, - key: '[Your api key]', - secret: '[Your api secret]', - passphrase: '[Your api passphrase]', - keyVersion: 2 -} \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..1affdaa --- /dev/null +++ b/.eslintignore @@ -0,0 +1,7 @@ +_tests_/*.js +lib/*.js + +env.js +src/dataTypes/** + +test/* \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..1a99a07 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,63 @@ +{ + "env": { + "browser": true, + "es6": true, + "node": true, + "jest": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "plugins": ["@typescript-eslint"], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly", + "require": false, + "export": false, + "import": false + }, + "rules": { + "generator-star-spacing": [0], + "camelcase": [0], + "consistent-return": [0], + "global-require": [0], + "import/prefer-default-export": [0], + "no-underscore-dangle": [0], + "no-else-return": [0], + "no-restricted-syntax": [0], + "no-use-before-define": [0], + "no-nested-ternary": [0], + "arrow-body-style": [0], + "import/extensions": [0], + "max-len": [ + 2, + { + "code": 200, + "tabWidth": 2, + "ignorePattern": "^\\s*[", + "ignoreUrls": true, + "ignoreTemplateLiterals": true, + "ignoreRegExpLiterals": true, + "ignoreComments": true + } + ], + "no-bitwise": [0], + "no-cond-assign": [0], + "import/no-unresolved": [0], + "require-yield": [0], + "no-constant-condition": [0], + "no-console": [0], + "no-script-url": [0], + "no-param-reassign": [0], + "no-restricted-properties": [0], + "no-plusplus": [2, { "allowForLoopAfterthoughts": true }], + "object-curly-newline": [0], + "@typescript-eslint/no-unused-vars": 1 + } +} diff --git a/.gitignore b/.gitignore index d667068..93ffe12 100644 --- a/.gitignore +++ b/.gitignore @@ -1,75 +1,64 @@ -# File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig +# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so -# Created by https://www.gitignore.io/api/macos,visualstudiocode,git -# Edit at https://www.gitignore.io/?templates=macos,visualstudiocode,git +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip -### Git ### -# Created by git for backups. To disable backups in Git: -# $ git config --global mergetool.keepBackup false -*.orig +# Logs and databases # +###################### +*.log +*.sql +*.sqlite -# Created by git when using merge tools for conflicts -*.BACKUP.* -*.BASE.* -*.LOCAL.* -*.REMOTE.* -*_BACKUP_*.txt -*_BASE_*.txt -*_LOCAL_*.txt -*_REMOTE_*.txt - -### macOS ### -# General +# OS generated files # +###################### .DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails +.DS_Store? ._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd .Spotlight-V100 -.TemporaryItems .Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent +ehthumbs.db +Thumbs.db +~/Desktop + +# Secrets # +########### +.secret -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk +# Node # +######## +node_modules -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json +# Yarn # +######## +*.lock -### VisualStudioCode Patch ### -# Ignore all local history of files -.history +# VSCode # +########## +.vscode -# End of https://www.gitignore.io/api/macos,visualstudiocode,git +# IntelliJ # +########## +.idea -# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option) +# code coverage" +coverage -*-error.log -node_modules/ -.env.js -pm2.json -/app/* -!app/.gitkeep -!app/template.js -!app/level3-full.js -!app/level3-merge.js -!app/level2-book.js -/logs -/sdk \ No newline at end of file +./*.js +env.local.js \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..8617c22 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,18 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": true, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "trailingComma": "none", + "bracketSpacing": true, + "jsxBracketSameLine": false, + "arrowParens": "always", + "requirePragma": false, + "insertPragma": false, + "proseWrap": "preserve", + "htmlWhitespaceSensitivity": "css", + "endOfLine": "lf" +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..029d7f4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +The current SDK has aligned documents to 2023.04.02 + +## [2.0.0](https://github.com/Kucoin/kucoin-futures-node-sdk/compare/v2.0.0...v1.0.3) (2023-06-20) + +### ⚠ BREAKING CHANGES +- Changes in usage +- Method name changes \ No newline at end of file diff --git a/README.md b/README.md index c67755d..f8808ed 100644 --- a/README.md +++ b/README.md @@ -1,94 +1,509 @@ -# Node Helper for KuCoin Futures Strategy -## Usage As Framework Helper: +# KuCoin Futures Node SDK -### Clone and Dep +[![KuCoin Futures Node SDK](https://docs.kucoin.com/futures/images/logo_en.svg)](https://docs.kucoin.com/futures/#introduction) +[![Latest Version](https://img.shields.io/github/release/Kucoin/kucoin-futures-node-sdk.svg?style=flat-square)](https://github.com/Kucoin/kucoin-futures-node-sdk/releases) -1. git clone -2. yarn install +- [KuCoin Futures Node SDK](#kucoin-futures-node-sdk) + - [Installation:](#installation) + - [Usage](#usage) + - [REST API](#rest-api) + - [User](#user) + - [Get Account Overview](#get-account-overview) + - [Get Transaction History](#get-transaction-history) + - [Get Sub-Account Futures API List](#get-sub-account-futures-api-list) + - [Create Futures APIs for Sub-Account](#create-futures-apis-for-sub-account) + - [Modify Sub-Account Futures APIs](#modify-sub-account-futures-apis) + - [Delete Sub-Account Futures APIs](#delete-sub-account-futures-apis) + - [Transfer](#transfer) + - [Transfer to Main or TRADE Account](#transfer-to-main-or-trade-account) + - [Transfer to Futures Account](#transfer-to-futures-account) + - [Get Transfer-Out Request Records](#get-transfer-out-request-records) + - [Trade](#trade) + - [Orders](#orders) + - [Fills](#fills) + - [Positions](#positions) + - [Risk Limit Level](#risk-limit-level) + - [Funding Fees](#funding-fees) + - [Market Data](#market-data) + - [Get Open Contract List](#get-open-contract-list) + - [Get Order Info of the Contract](#get-order-info-of-the-contract) + - [Get Ticker](#get-ticker) + - [Get Full Order Book - Level 2](#get-full-order-book---level-2) + - [Get Part Order Book - Level 2](#get-part-order-book---level-2) + - [Transaction History](#transaction-history) + - [Index](#index) + - [Server Time](#server-time) + - [Server Status](#server-status) + - [Get K Line Data of Contract](#get-k-line-data-of-contract) + - [WebSocket](#websocket) + - [Public Channels](#public-channels) + - [Private Channels](#private-channels) + - [License](#license) -### Env Config -1. Run Command -```sh -# create auth config -copy .env.tpl.js .env.js + +## Installation: + +```js +// Install by npm +npm install kucoin-futures-node-sdk + + +// Install by yarn +yarn add kucoin-futures-node-sdk ``` -2. edit -```javascript -export default { - key: '[Your api key]', - secret: '[Your api secret]', - passphrase: '[Your api passphrase]', - keyVersion: '[Api key version]', // For v2 API-KEY, not required for v1 version -} + +## Usage + +```js +/** Require SDK */ +const KuCoinFutures = require('kucoin-futures-node-sdk'); +const futuresSDK = new KuCoinFutures({ + key: '', // KC-API-KEY + secret: '', // API-Secret + passphrase: '', // KC-API-PASSPHRASE + axiosProps: { // optional + env: 'prod', // default prod + version: '2' // default version 2 + } +}); ``` -### How to run +## REST API + +### User -1. Base Command -```sh -#Sandbox -yarn run dev +#### Get Account Overview -#Online -yarn run prod +```js +futuresSDK.futuresAccount('XBT', console.log); ``` -2. Strategy +#### Get Transaction History -Create [appName].js in /app folder, so it won't be tracked by GIT. And `tempate.js` was already created in /app. +```js +futuresSDK.futuresTransactionHistory( + { + startTime: new Date().getTime() - 7 * 24 * 60 * 60 * 1000, + endTime: new Date().getTime(), + type: 'RealisedPNL', + maxCount: 100, + currency: 'XBT' + }, + console.log +); +``` -3. Run +#### Get Sub-Account Futures API List -```sh -# [appName] is your strategy file name -# default is: template -yarn run dev -- [appName] +```js +futuresSDK.futuresSubApi({ subName: '' }, console.log); ``` +#### Create Futures APIs for Sub-Account -## Usage As SDK: +```js +futuresSDK.futuresCreateSubApi( + { + subName: '[subName]', + passphrase: '[passphrase]', + remark: '[remark]' + }, + console.log +); +``` -### build by self -1. Clone; +#### Modify Sub-Account Futures APIs -2. Build; +```js +futuresSDK.futuresUpdateSubApi( + { + subName: '[subName]', + passphrase: '[passphrase]', + apiKey: '[apiKey]' + }, + console.log +); ``` -# install deps -yarn install -# build -yarn run build +#### Delete Sub-Account Futures APIs -# link sdk folder -yarn link +```js +futuresSDK.futureDeleteSubApi( + { + subName: '[subName]', + passphrase: '[passphrase]', + apiKey: '[apiKey]' + }, + console.log +); ``` -### use package +--- + +### Transfer + +#### Transfer to Main or TRADE Account + +```js +futuresSDK.futureTransferOut( + { amount: 0.01, currency: 'USDT', recAccountType: 'MAIN' }, + console.log +); ``` -# use yarn -yarn add kucoin-futures-node-sdk -# or use npm -npm install kucoin-futures-node-sdk +#### Transfer to Futures Account + +```js +futuresSDK.futureTransferIn( + { amount: 0.01, currency: 'USDT', payAccountType: 'MAIN' }, + console.log +); +``` + +#### Get Transfer-Out Request Records + +```js +futuresSDK.futureTransfers( + { + startAt: new Date().getTime() - 7 * 24 * 60 * 60 * 1000, + endAt: new Date().getTime(), + status: 'SUCCESS', + currentPage: 1, + pageSize: 100, + currency: 'USDT' + }, + console.log +); +``` + +--- + +### Trade + +#### Orders + +```js +// Place an Order +// symbol, price, size, leverage = 1, clientOid = uuidV4(), optional + +// Buy Limit Order +futuresSDK.futuresBuy( + { + symbol: 'ETHUSDTM', + price: 10000, + leverage: 5, + size: 1 + // clientOid: uuidV4(), + }, + console.log +); + +// Buy Market Order +futuresSDK.futuresBuy( + { + symbol: 'ETHUSDTM', + leverage: 5, + size: 1 + // clientOid: uuidV4(), + }, + console.log +); + +// Buy Stop Order +futuresSDK.futuresBuy( + { + symbol: 'ETHUSDTM', + price: 10000, + leverage: 5, + size: 1, + // clientOid: uuidV4(), + optional: { + stop: 'up', + stopPriceType: 'TP', + stopPrice: '10000' + // ... + } + }, + console.log +); + +// Sell Order +// futuresSDK.futuresBuy -> futuresSDK.futuresSell +futuresSDK.futuresSell( + { + symbol: 'ETHUSDTM', + price: 20000, + leverage: 5, + size: 1 + // clientOid: uuidV4(), + }, + console.log +); + +// Cancel an Order +futuresSDK.futuresCancel('orderId', console.log); + +// Cancel All Order for Symbol +// limit order +futuresSDK.futuresCancelAllOpenOrders('ETHUSDTM', console.log); +// stop order +futuresSDK.futuresCancelAllStopOrders('ETHUSDTM', console.log); +// or cancelAll limit/stop order for symbol +futuresSDK.futuresCancelAll('ETHUSDTM', console.log); + +// Get Order List +futuresSDK.futuresOpenOrders({ status: 'active' }, console.log); + +// Get Untriggered Stop Order List +futuresSDK.futuresStopOrders({ type: 'limit' }, console.log); + +// Get List of Orders Completed in 24h +futuresSDK.futuresRecentDoneOrders('ETHUSDTM', console.log); +// Or Search All +futuresSDK.futuresRecentDoneOrders('', console.log); + +// Get Details of a Single Order +futuresSDK.futuresOrderDetail({ clientOid: 'clientOid' }, console.log); +// Or By OrderId +futuresSDK.futuresOrderDetail('orderId', console.log); +``` + +#### Fills + +```js +// Get Fills +futuresSDK.futuresFills({ pageSize: 100 }, console.log); + +// Recent Fills +futuresSDK.futuresRecentFills('ETHUSDTM', console.log); +// Or Search All +futuresSDK.futuresRecentFills('', console.log); + +// Active Order Value Calculation +futuresSDK.futuresMarginOpenOrders('ETHUSDTM', console.log); +``` + +#### Positions + +```js +// Get Position Details +futuresSDK.futuresPositionDetail('ETHUSDTM', console.log); + +// Get Position List +futuresSDK.futuresPositions('USDT', console.log); +// Or Search All +futuresSDK.futuresPositions('', console.log); + +// Enable of Auto-Deposit Margin +futuresSDK.futuresPositionAutoDeposit( + { symbol: 'ETHUSDTM', status: true }, + console.log +); +// Disable of Auto-Deposit Margin +futuresSDK.futuresPositionAutoDeposit( + { symbol: 'ETHUSDTM', status: false }, + console.log +); + +// Add Margin Manually +// bizNo default uuidV4() +futuresSDK.futuresPositionMargin( + { + symbol: 'ETHUSDTM', + margin: 0.01 + // bizNo: uuidV4(), + }, + console.log +); +``` + +#### Risk Limit Level + +```js +// Obtain Futures Risk Limit Level +futuresSDK.futuresRiskLimit('ETHUSDTM', console.log); + +// Adjust Risk Limit Level +futuresSDK.futuresChangeRiskLimit( + { symbol: 'ETHUSDTM', level: 2 }, + console.log +); +``` + +#### Funding Fees + +```js +futuresSDK.futuresFundingHistory({ symbol: 'ETHUSDTM' }, console.log); +``` + +--- + +### Market Data + +#### Get Open Contract List + +```js +futuresSDK.futuresContractsActive(console.log); +``` + +#### Get Order Info of the Contract + +```js +futuresSDK.futuresContractDetail('XBTUSDTM', console.log); +``` + +#### Get Ticker + +```js +futuresSDK.futuresTicker('XBTUSDTM', console.log); +``` + +#### Get Full Order Book - Level 2 + +```js +futuresSDK.futuresLevel2('XBTUSDTM', console.log); +``` + +#### Get Part Order Book - Level 2 + +```js +// Get Level2 depth20 +futuresSDK.futuresLevel2Depth20('XBTUSDTM', console.log); + +// Get Level2 depth100 +futuresSDK.futuresLevel2Depth100('XBTUSDTM', console.log); +``` + +#### Transaction History + +```js +futuresSDK.futuresTradeHistory('XBTUSDTM', console.log); +``` + +#### Index + +```js +// Get Interest Rate List +futuresSDK.futuresInterests({ symbol: '.XBTINT' }, console.log); + +// Get Index List +futuresSDK.futuresIndexList({ symbol: '.KXBT' }, console.log); + +// Get Current Mark Price +futuresSDK.futuresMarkPrice('XBTUSDM', console.log); + +// Get Premium Index +futuresSDK.futuresPremiums({ symbol: '.XBTUSDMPI' }, console.log); + +// Get Current Funding Rate +futuresSDK.futuresFundingRate('XBTUSDM', console.log); ``` -### use SDK -There's an example in the /sdk_example folder. +#### Server Time -## TODO +```js +futuresSDK.futuresTimestamp(console.log); +``` + +#### Server Status + +```js +futuresSDK.futuresStatus(console.log); +``` + +#### Get K Line Data of Contract + +```js +futuresSDK.futuresKline( + { + symbol: 'XBTUSDTM', + granularity: 480, + from: new Date().getTime() - 24 * 60 * 60 * 1000, + to: new Date().getTime() + }, + console.log +); +``` + +--- + +## WebSocket + +- Socket implements 59s heartbeat, disconnection retry mechanism +- When calling the provided websocket.x method, the system will create a corresponding socket connection channel based on public or private, and only one connection will be created for each type +- Parameters pass symbols, support passing arrays, and push symbol messages in the arrays +- When the parameter is an array, the length of the array will be automatically cut according to the length of 90 + +> All methods that pass symbols support array format +> The first parameter is symbol and the second parameter is callback. When the parameter does not exist, the first parameter is callback + +### Public Channels + +```js +// +// Get Real-Time Symbol Ticker v2 +futuresSDK.websocket.tickerV2(['ETHUSDTM', 'XBTUSDTM'], console.log); +// Or +futuresSDK.websocket.tickerV2('ETHUSDTM', console.log); + +// Get Real-Time Symbol Ticker +futuresSDK.websocket.ticker(['ETHUSDTM', 'XBTUSDTM']); -- [x] Datafeed -- [x] Logger -- [x] Ticker -- [x] Level2 -- [x] Order -- [x] Orders -- [x] Position -- [x] Account Overview -- [x] Funding Fees -- [x] Time -- [x] Level3 -- [x] Build As SDK +// Level 2 Market Data +futuresSDK.websocket.level2(['ETHUSDTM', 'XBTUSDTM']); + +// Execution data +futuresSDK.websocket.execution(['ETHUSDTM', 'XBTUSDTM']); + +// Message channel for the 5 best ask/bid full data of Level 2 +futuresSDK.websocket.level2Depth5(['ETHUSDTM', 'XBTUSDTM']); + +// Message channel for the 50 best ask/bid full data of Level 2 +futuresSDK.websocket.level2Depth50(['ETHUSDTM', 'XBTUSDTM']); + +// Contract Market Data +// subject --> "mark.index.price" return Mark Price & Index Price +// subject --> "funding.rate" return Funding Rate +futuresSDK.websocket.instrument(['ETHUSDTM', 'XBTUSDTM']); + +// Funding Fee Settlement +// subject --> "funding.begin" return Start Funding Fee Settlement +// subject --> "funding.end" return End Funding Fee Settlement +futuresSDK.websocket.announcement(console.log); + +// Transaction Statistics Timer Event +futuresSDK.websocket.snapshot(['ETHUSDTM', 'XBTUSDTM']); +``` + +### Private Channels + +```js +// Trade Orders - According To The Market +futuresSDK.websocket.tradeOrders(['ETHUSDTM', 'XBTUSDTM'], console.log); +// Or +futuresSDK.websocket.tradeOrders(console.log); + +// Stop Order Lifecycle Event +futuresSDK.websocket.advancedOrders(console.log); + +// Account Balance Events +// subject --> "orderMargin.change" return Order Margin Event +// subject --> "availableBalance.change" return Available Balance Event +// subject --> "withdrawHold.change" return Withdrawal Amount & Transfer-Out Amount Event +futuresSDK.websocket.wallet(console.log); + +// Position Change Events +// subject --> "position.change" return Position Changes Caused Operations +// Position Changes Caused Operations +// -- “marginChange”: margin change; +// -- “positionChange”: position change; +// -- “liquidation”: liquidation; +// -- “autoAppendMarginStatusChange”: auto-deposit-status change; +// -- “adl”: adl; +// Position Changes Caused by Mark Price +// subject --> "position.settlement" return Funding Settlement +futuresSDK.websocket.position(['ETHUSDTM', 'XBTUSDTM']); +``` ## License diff --git a/app/.gitkeep b/app/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/app/level2-book.js b/app/level2-book.js deleted file mode 100644 index e4decf2..0000000 --- a/app/level2-book.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * An example level2 test - */ -import _ from 'lodash'; -import logUpdate from 'log-update'; -import http from '../src/lib/http'; -import Level2 from '../src/com/level2'; -import { getEnv } from '../src/lib/env'; - -const SYMBOL = 'XBTUSDM'; - -async function main() { - // set account api keys - http.setSignatureConfig(getEnv()); - - const l2 = new Level2(SYMBOL); - l2.listen(); - - l2.handleMessageEvent(() => { - // read orderbook - const orderbook = l2.getOrderBook(5); - - // show Level2 - let asksStr = ''; - _.eachRight(orderbook.asks, ([price, size]) => { - asksStr += `${price} -> ${size}\n`; - }); - - let bidsStr = ''; - _.each(orderbook.bids, ([price, size]) => { - bidsStr += `${price} -> ${size}\n`; - }); - - logUpdate.clear(); - logUpdate(`------------------------\n` + - `l2 ${orderbook.dirty ? 'Dirty Data' : 'Trust Data'}\n` + - `l2 seq: ${orderbook.sequence}\n` + - `ping: ${orderbook.ping} (ms)\n` + - `------------------------\n` + - `${asksStr}----------sep-----------\n` + - `${bidsStr}------------------------` - ); - }); -} - -main(); diff --git a/app/level3-full.js b/app/level3-full.js deleted file mode 100644 index 31b536a..0000000 --- a/app/level3-full.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * An example level3 test - */ -import _ from 'lodash'; -import logUpdate from 'log-update'; -import http from '../src/lib/http'; -import Level3 from '../src/com/level3'; -import { getEnv } from '../src/lib/env'; - -const SYMBOL = 'XBTUSDM'; - -async function main() { - // set account api keys - http.setSignatureConfig(getEnv()); - - const l3 = new Level3(SYMBOL); - l3.listen(); - - const interval = setInterval(async () => { - // read orderbook - const orderbook = l3.getDetailOrderBook(10); - - // show Level3 - let asksStr = ''; - _.eachRight(orderbook.asks, ([price, size, ts, orderId]) => { - asksStr += `${price} -> ${size} ${ts} ${orderId}\n`; - }); - - let bidsStr = ''; - _.each(orderbook.bids, ([price, size, ts, orderId]) => { - bidsStr += `${price} -> ${size} ${ts} ${orderId}\n`; - }); - - logUpdate.clear(); - logUpdate(`------------------------\n` + - `l3 ${orderbook.dirty ? 'Dirty Data' : 'Trust Data'}\n` + - `l3 seq: ${orderbook.sequence}\n` + - `ping: ${orderbook.ping} (ms)\n` + - `------------------------\n` + - `${asksStr}----------sep-----------\n` + - `${bidsStr}------------------------` - ); - }, 200); -} - -main(); diff --git a/app/level3-merge.js b/app/level3-merge.js deleted file mode 100644 index 1f1a8c7..0000000 --- a/app/level3-merge.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * An example level3 test - */ -import _ from 'lodash'; -import logUpdate from 'log-update'; -import http from '../src/lib/http'; -import Level3 from '../src/com/level3'; -import { getEnv } from '../src/lib/env'; - -const SYMBOL = 'XBTUSDM'; - -async function main() { - // set account api keys - http.setSignatureConfig(getEnv()); - - const l3 = new Level3(SYMBOL); - l3.listen(); - - const interval = setInterval(async () => { - // read orderbook - const orderbook = l3.getOrderBook(5); - - // show Level3 - let asksStr = ''; - _.eachRight(orderbook.asks, ([price, [size, orderIdMp]]) => { - asksStr += `${price} -> ${size} -> ${JSON.stringify(Object.keys(orderIdMp))}\n`; - }); - - let bidsStr = ''; - _.each(orderbook.bids, ([price, [size, orderIdMp]]) => { - bidsStr += `${price} -> ${size} -> ${JSON.stringify(Object.keys(orderIdMp))}\n`; - }); - - logUpdate.clear(); - logUpdate(`------------------------\n` + - `l3 ${orderbook.dirty ? 'Dirty Data' : 'Trust Data'}\n` + - `l3 seq: ${orderbook.sequence}\n` + - `ping: ${orderbook.ping} (ms)\n` + - `------------------------\n` + - `${asksStr}----------sep-----------\n` + - `${bidsStr}------------------------` - ); - }, 200); -} - -main(); diff --git a/app/template.js b/app/template.js deleted file mode 100644 index 905e6c0..0000000 --- a/app/template.js +++ /dev/null @@ -1,166 +0,0 @@ -/** - * An example strategy template - */ -import _ from 'lodash'; -// import Koa from 'koa'; -// import bodyParser from 'koa-bodyparser'; -import logUpdate from 'log-update'; -import http from '../src/lib/http'; -import Datafeed from '../src/lib/datafeed'; -import { mergeDepth, targetTypesMap } from '../src/lib/utils'; -import log from '../src/lib/log'; -// import Ticker from '../src/com/ticker'; -import Level2 from '../src/com/level2'; -import Order from '../src/com/order'; -// import Position from '../src/com/position'; -// import Account from '../src/com/account'; -// import Fee from '../src/com/fee'; -// import Time from '../src/com/time'; -// import Contract from '../src/com/contract'; -// import Level3 from '../src/com/level3'; -import { getEnv } from '../src/lib/env'; - -const env = getEnv(); -const SYMBOL = 'XBTUSDM'; - -async function main() { - // const app = new Koa(); - // app.use(bodyParser); - // app.listen(8090); - - // set account api keys - http.setSignatureConfig(env); - - // const account = new Account(); - // const position = new Position(SYMBOL); - - // const acc = await account.getOverview(); - // log('acc', acc); - // const pos = await position.getPosition(); - // log('pos', pos); - // return; - - // const time = new Time(); - // const fee = new Fee(SYMBOL); - - // const ts = await time.getTimestamp(); - // log('ts', ts); - // const fees = await fee.getFundingHistory(); - // log('fees', fees); - // return; - - // const ct = new Contract(SYMBOL); - // const ctd = await ct.getOverview(); - // log('ctd', ctd); - // return; - - // const l3 = new Level3(SYMBOL); - // l3.listen(); - // return; - - // use single private datafeed - const datafeed = new Datafeed(true); - - // const ticker = new Ticker(SYMBOL, datafeed); - // ticker.listen(); - - const l2 = new Level2(SYMBOL, datafeed); - l2.listen(); - - const order = new Order(SYMBOL, 5); - let orderCommitting = false; - const orderTransaction = async (priceSell, priceBuy) => { - if (orderCommitting) { - log('orderTransaction orderCommitting'); - return; - } - orderCommitting = true; - - log(`orderTransaction`, priceSell, priceBuy); - const size = 10; - const sellOrderSuccess = await order.limitOrder(priceSell, size, 'sell', { postOnly: true }); - const buyOrderSuccess = await order.limitOrder(priceBuy, size, 'buy', { postOnly: true }); - - if (!sellOrderSuccess || !buyOrderSuccess) { - const r = await order.cancleAllOrders(); - log('cancel all orders', sellOrderSuccess, buyOrderSuccess, r); - } - - orderCommitting = false; - }; - - const interval = setInterval(async () => { - // read orderbook - const orderbook = l2.getOrderBook(5); - // get active orders - const orderData = await order.getActiveOrders(); - - // Ticker - // const tickerWS = ticker.getSnapshot(); - // const currentTicker = tickerWS.data; - // ticker ${tickerWS.dirty ? 'Dirty Data' : 'Trust Data'} - // ticker: ${currentTicker.price} -> ${currentTicker.size} - // bestBid: ${currentTicker.bestBidPrice},${currentTicker.bestBidSize} - // bestAsk: ${currentTicker.bestAskPrice},${currentTicker.bestAskSize} - - // template strategy - const mapOrderToL2 = { asks: {}, bids: {} }; - if (orderbook.dirty === false) { - if (orderData.totalNum > 0) { - _.each(orderData.items, ({ symbol, price, side, size, type }) => { - if (symbol === SYMBOL) { - const targetSide = targetTypesMap[side]; - if (_.indexOf(['asks', 'bids'], targetSide) > -1) { - mapOrderToL2[targetSide][mergeDepth(price, targetSide)] = [size, type]; - } - } - }); - } else - if (orderData.totalNum === 0) { - const asksFirst = orderbook.asks[0]; - const bidsFirst = orderbook.bids[0]; - if (asksFirst && bidsFirst) { - if (asksFirst[0] - bidsFirst[0] > 5) { - orderTransaction(asksFirst[0], bidsFirst[0]); - } - } - } - } - - // show Level2 - let asksStr = ''; - _.eachRight(orderbook.asks, ([price, size]) => { - const orderFind = mapOrderToL2.asks[price]; - let str = ''; - if (orderFind) { - const [size, type] = orderFind; - str = `@${size}, ${type}`; - } - asksStr += `${price} -> ${size} ${str}\n`; - }); - - let bidsStr = ''; - _.each(orderbook.bids, ([price, size]) => { - const orderFind = mapOrderToL2.bids[price]; - let str = ''; - if (orderFind) { - const [size, type] = orderFind; - str = `@${size}, ${type}`; - } - bidsStr += `${price} -> ${size} ${str}\n`; - }); - - logUpdate.clear(); - logUpdate(`------------------------\n` + - `l2 ${orderbook.dirty ? 'Dirty Data' : 'Trust Data'}\n` + - `l2 seq: ${orderbook.sequence}\n` + - `ping: ${orderbook.ping} (ms)\n` + - `order: ${orderData.totalNum} (count)\n` + - `------------------------\n` + - `${asksStr}----------sep-----------\n` + - `${bidsStr}------------------------` - ); - }, 400); -} - -main(); diff --git a/env.js b/env.js new file mode 100644 index 0000000..71e5229 --- /dev/null +++ b/env.js @@ -0,0 +1,7 @@ +const env = { + key: '', + secret: '', + passphrase: '', +}; + +module.exports = env; diff --git a/example/index.js b/example/index.js new file mode 100644 index 0000000..56e9745 --- /dev/null +++ b/example/index.js @@ -0,0 +1,198 @@ +const KuCoinFutures = require('../lib/index').default; + +const futuresSDK = new KuCoinFutures({ + key: '[Your key]', + secret: '[Your secret]', + passphrase: '[Your passphrase]' +}); + +futuresSDK.futuresTimestamp(console.log); + +futuresSDK.futuresStatus(console.log); + +// futuresSDK.futuresAccount('USDT', console.log); + +// futuresSDK.futuresBuy( +// { +// symbol: 'ETHUSDTM', +// price: 10000, +// leverage: 5, +// size: 1, +// optional: { +// stop: 'up', +// stopPriceType: 'TP', +// stopPrice: '10000' +// } +// }, +// console.log +// ); + +// futuresSDK.futuresSell( +// { +// symbol: 'ETHUSDTM', +// price: 20000, +// leverage: 5, +// size: 1, +// // clientOid: uuidV4(), +// optional: { +// remark: 'test', +// stop: 'up', +// stopPriceType: 'TP', +// stopPrice: '20000', +// // ... +// } +// }, +// console.log +// ); + +// futuresSDK.futuresCancel('orderId', console.log); + +// futuresSDK.futuresCancelAllOpenOrders('ETHUSDTM', console.log); + +// futuresSDK.futuresCancelAllStopOrders('ETHUSDTM', console.log); + +// futuresSDK.futuresCancelAll('ETHUSDTM', console.log); + +// futuresSDK.futuresOpenOrders({ status: 'done' }, console.log); + +// futuresSDK.futuresStopOrders({ type: 'market' }, console.log); + +// futuresSDK.futuresRecentDoneOrders('', console.log); + +// futuresSDK.futuresOrderDetail({ clientOid: 'clientOid' }, console.log); + +// futuresSDK.futuresOrderDetail('orderId', console.log); + +// futuresSDK.futuresTransactionHistory( +// { +// startTime: new Date().getTime() - 7 * 24 * 60 * 60 * 1000, +// endTime: new Date().getTime(), +// type: 'RealisedPNL', +// maxCount: 100, +// currency: 'USDT' +// }, +// console.log +// ); + +// futuresSDK.futuresSubApi({ subName: '' }, console.log); + +// futuresSDK.futuresCreateSubApi( +// { +// subName: '', +// passphrase: '', +// remark: '', +// }, +// console.log +// ); + +// futuresSDK.futureTransferOut( +// { amount: 0.01, currency: 'USDT', recAccountType: 'MAIN' }, +// console.log +// ); + +// futuresSDK.futureTransferIn( +// { amount: 0.01, currency: 'USDT', payAccountType: 'MAIN' }, +// console.log +// ); + +// futuresSDK.futureTransfers( +// { +// startAt: new Date().getTime() - 7 * 24 * 60 * 60 * 1000, +// endAt: new Date().getTime(), +// status: 'SUCCESS', +// currentPage: 1, +// pageSize: 100, +// currency: 'USDT' +// }, +// console.log +// ); + +// futuresSDK.futuresFills({ pageSize: 100 }, console.log); + +// futuresSDK.futuresRecentFills('ETHUSDTM', console.log); + +// futuresSDK.futuresRecentFills('', console.log); + +// futuresSDK.futuresMarginOpenOrders('ETHUSDTM', console.log); + +// futuresSDK.futuresPositionDetail('ETHUSDTM', console.log); + +// futuresSDK.futuresPositions('', console.log); + +// futuresSDK.futuresPositionAutoDeposit({ symbol: 'ETHUSDTM', status: true }, console.log); + +// futuresSDK.futuresPositionAutoDeposit({ symbol: 'ETHUSDTM', status: false }, console.log); + +// futuresSDK.futuresPositionMargin( +// { +// symbol: 'ETHUSDTM', +// margin: 0.01 +// // bizNo: uuidV4(), +// }, +// console.log +// ); + +// futuresSDK.futuresRiskLimit('ETHUSDTM', console.log); + +// futuresSDK.futuresChangeRiskLimit( +// { symbol: 'ETHUSDTM', level: 2 }, +// console.log +// ); + +// futuresSDK.futuresFundingHistory({ symbol: 'ETHUSDTM' }, console.log); + +// futuresSDK.futuresMarkPrice('XBTUSDTM', console.log); + +// futuresSDK.futuresContractsActive(console.log); + +// futuresSDK.futuresContractDetail('XBTUSDTM', console.log); + +// futuresSDK.futuresTicker('XBTUSDTM', console.log); + +// futuresSDK.futuresLevel2('XBTUSDTM', console.log); + +// futuresSDK.futuresLevel2Depth20('XBTUSDTM', console.log); + +// futuresSDK.futuresLevel2Depth100('XBTUSDTM', console.log); + +// futuresSDK.futuresTradeHistory('XBTUSDTM', console.log); + +// futuresSDK.futuresInterests({ symbol: '.XBTINT' }, console.log); + +// futuresSDK.futuresIndexList({ symbol: '.KXBT' }, console.log); + +// futuresSDK.futuresMarkPrice('XBTUSDM', console.log); + +// futuresSDK.futuresPremiums({ symbol: '.XBTUSDMPI' }, console.log); + +// futuresSDK.futuresFundingRate('XBTUSDM', console.log); + +// futuresSDK.futuresKline( +// { +// symbol: 'XBTUSDTM', +// granularity: 480, +// from: new Date().getTime() - 24 * 60 * 60 * 1000, +// to: new Date().getTime() +// }, +// console.log +// ); + +// === websocket === // + +// futuresSDK.websocket.ticker(['ETHUSDTM', 'XBTUSDTM']); + +// futuresSDK.websocket.level2(['ETHUSDTM', 'XBTUSDTM']); + +// futuresSDK.websocket.execution(['ETHUSDTM', 'XBTUSDTM']); + +// futuresSDK.websocket.announcement(); + +// futuresSDK.websocket.snapshot('ETHUSDTM'); + +// futuresSDK.websocket.tradeOrders(); + +// futuresSDK.websocket.advancedOrders(); + +// futuresSDK.websocket.wallet(); + +// futuresSDK.websocket.position(['ETHUSDTM', 'LINAUSDTM']); diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..0a8c081 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,14 @@ +module.exports = { + verbose: true, + preset: 'ts-jest', + testEnvironment: 'node', + globals: { + window: true, + 'ts-jest': { + isolatedModules: true, + }, + }, + testPathIgnorePatterns: ['/node_modules/', '/lib/'], + testRegex: '^.+\\.test\\.(js|ts)$', + moduleFileExtensions: ['js', 'ts'], +}; diff --git a/lib/dataType/account.d.ts b/lib/dataType/account.d.ts new file mode 100644 index 0000000..e5084e6 --- /dev/null +++ b/lib/dataType/account.d.ts @@ -0,0 +1,25 @@ +import { PageOffsetParams, PageSizeParams } from './common'; +export type TransactionType = 'RealisedPNL' | 'Deposit' | 'Withdrawal' | 'TransferIn' | 'TransferOut'; +export interface TransactionHistoryParams extends PageOffsetParams { + type?: TransactionType; + currency?: string; +} +export interface SubApiParams { + subName: string; + passphrase: string; + permission?: string; + ipWhitelist?: string; + expire?: string; +} +export interface CreateSubApiParams extends SubApiParams { + remark: string; +} +export interface UpdateSubApiParams extends SubApiParams { + apiKey: string; +} +export type TransferStatusType = 'PROCESSING' | 'SUCCESS' | 'FAILURE'; +export interface TransferListParams extends PageSizeParams { + status?: TransferStatusType; + queryStatus?: TransferStatusType; + currency?: string; +} diff --git a/lib/dataType/account.js b/lib/dataType/account.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/lib/dataType/account.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/dataType/common.d.ts b/lib/dataType/common.d.ts new file mode 100644 index 0000000..1abef57 --- /dev/null +++ b/lib/dataType/common.d.ts @@ -0,0 +1,20 @@ +export interface MakeRequestParams { + body?: object | string; + method: string; + endpoint: string; + callback?: Function; + isPrivate?: boolean; +} +export interface PageOffsetParams { + startAt?: string; + endAt?: string; + offset?: number; + forward?: boolean | true; + maxCount?: number; +} +export interface PageSizeParams { + startAt?: string; + endAt?: string; + pageSize?: number; + currentPage?: number; +} diff --git a/lib/dataType/common.js b/lib/dataType/common.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/lib/dataType/common.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/dataType/futuresOrder.d.ts b/lib/dataType/futuresOrder.d.ts new file mode 100644 index 0000000..60f709d --- /dev/null +++ b/lib/dataType/futuresOrder.d.ts @@ -0,0 +1,36 @@ +import { PageSizeParams } from './common'; +export type BaseOrderType = 'limit' | 'market'; +export type OrderType = 'limit' | 'market' | 'limit_stop' | 'market_stop'; +export type OrderOptionalParamsType = 'type' | 'remark' | 'stop' | 'stopPriceType' | 'stopPrice' | 'reduceOnly' | 'closeOrder' | 'forceHold' | 'timeInForce' | 'postOnly' | 'hidden' | 'iceberg' | 'visibleSize'; +export type OptionalParamsObject = { + [P in T]?: any; +}; +export interface BaseOrderBody { + symbol: string; + size: number; + leverage?: number; + clientOid?: string; + optional?: OptionalParamsObject; +} +export interface OrderBody extends BaseOrderBody { + side: string; + price?: number | string; +} +export type OpenOrderStatusType = 'active' | 'done'; +export interface OpenOrderListParams extends PageSizeParams { + status?: OpenOrderStatusType; + symbol?: string; + side?: string; + type?: OrderType; +} +export interface StopOrderListParams extends PageSizeParams { + symbol?: string; + side?: string; + type?: BaseOrderType; +} +export interface FillsParams extends PageSizeParams { + orderId?: string; + symbol?: string; + side?: string; + type?: OrderType; +} diff --git a/lib/dataType/futuresOrder.js b/lib/dataType/futuresOrder.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/lib/dataType/futuresOrder.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/dataType/market.d.ts b/lib/dataType/market.d.ts new file mode 100644 index 0000000..d181e82 --- /dev/null +++ b/lib/dataType/market.d.ts @@ -0,0 +1,11 @@ +import { PageOffsetParams } from './common'; +export interface klineParams { + symbol: string; + granularity: number; + from?: string; + to?: string; +} +export interface IndexListParams extends PageOffsetParams { + symbol: string; + reverse?: boolean | true; +} diff --git a/lib/dataType/market.js b/lib/dataType/market.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/lib/dataType/market.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/dataType/order.d.ts b/lib/dataType/order.d.ts new file mode 100644 index 0000000..60f709d --- /dev/null +++ b/lib/dataType/order.d.ts @@ -0,0 +1,36 @@ +import { PageSizeParams } from './common'; +export type BaseOrderType = 'limit' | 'market'; +export type OrderType = 'limit' | 'market' | 'limit_stop' | 'market_stop'; +export type OrderOptionalParamsType = 'type' | 'remark' | 'stop' | 'stopPriceType' | 'stopPrice' | 'reduceOnly' | 'closeOrder' | 'forceHold' | 'timeInForce' | 'postOnly' | 'hidden' | 'iceberg' | 'visibleSize'; +export type OptionalParamsObject = { + [P in T]?: any; +}; +export interface BaseOrderBody { + symbol: string; + size: number; + leverage?: number; + clientOid?: string; + optional?: OptionalParamsObject; +} +export interface OrderBody extends BaseOrderBody { + side: string; + price?: number | string; +} +export type OpenOrderStatusType = 'active' | 'done'; +export interface OpenOrderListParams extends PageSizeParams { + status?: OpenOrderStatusType; + symbol?: string; + side?: string; + type?: OrderType; +} +export interface StopOrderListParams extends PageSizeParams { + symbol?: string; + side?: string; + type?: BaseOrderType; +} +export interface FillsParams extends PageSizeParams { + orderId?: string; + symbol?: string; + side?: string; + type?: OrderType; +} diff --git a/lib/dataType/order.js b/lib/dataType/order.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/lib/dataType/order.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/dataType/other.d.ts b/lib/dataType/other.d.ts new file mode 100644 index 0000000..fd3c291 --- /dev/null +++ b/lib/dataType/other.d.ts @@ -0,0 +1,5 @@ +import { PageOffsetParams } from './common'; +export interface FundingHistoryParams extends PageOffsetParams { + symbol: string; + reverse?: boolean | true; +} diff --git a/lib/dataType/other.js b/lib/dataType/other.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/lib/dataType/other.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/dataType/socket.d.ts b/lib/dataType/socket.d.ts new file mode 100644 index 0000000..5bdcc45 --- /dev/null +++ b/lib/dataType/socket.d.ts @@ -0,0 +1,8 @@ +export type Callback = (data: any) => void; +export interface Subscription { + id: string; + callback: Callback; + topic: string; + privateChannel: boolean; + strict?: boolean; +} diff --git a/lib/dataType/socket.js b/lib/dataType/socket.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/lib/dataType/socket.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/index.d.ts b/lib/index.d.ts new file mode 100644 index 0000000..eef364d --- /dev/null +++ b/lib/index.d.ts @@ -0,0 +1,229 @@ +import { CreateSubApiParams, FillsParams, FundingHistoryParams, OpenOrderListParams, StopOrderListParams, TransactionHistoryParams, TransferListParams, UpdateSubApiParams, IndexListParams, klineParams, Callback } from './dataType'; +import { WebSocketClient } from './websocket'; +export default class KuCoinFutures { + private request; + private socketInstanceCache; + constructor(props: { + key: string | number; + secret: string | number; + passphrase: string | number; + axiosProps: object; + }); + private makeRequest; + futuresAccount: (currency?: string, callback?: Function) => Promise; + /** + * search to transaction history + * @param params.type string -- 'RealisedPNL' | 'Deposit' | 'Withdrawal' | 'TransferIn' | 'TransferOut' + * @param params.currency -- string + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.offset -- long + * @param params.maxCount -- default 50 + * @param params.forward -- default true + * @param callback -- callback function + */ + futuresTransactionHistory: (params?: TransactionHistoryParams, callback?: Function) => Promise; + futuresSubApi: (params: { + subName: string; + apiKey?: string; + }, callback?: Function) => Promise; + futuresCreateSubApi: (params: CreateSubApiParams, callback?: Function) => Promise; + futuresUpdateSubApi: (params: UpdateSubApiParams, callback?: Function) => Promise; + futureDeleteSubApi: (params: { + subName: string; + apiKey: string; + passphrase: string; + }, callback?: Function) => Promise; + futureTransferOut: (params: { + amount: number; + currency: string; + recAccountType: string; + }, callback?: Function) => Promise; + futureTransferIn: (params: { + amount: number; + currency: string; + payAccountType: string; + }, callback?: Function) => Promise; + /** + * search to transfer list + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.status -- string -- 'PROCESSING' | 'SUCCESS' | 'FAILURE' + * @param params.queryStatus -- array -- 'PROCESSING' | 'SUCCESS' | 'FAILURE' + * @param params.currency -- string + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 100 + * @param callback -- callback function + */ + futureTransfers: (params?: TransferListParams, callback?: Function) => Promise; + private order; + private stopOrder; + futuresBuy: (params: { + symbol: string; + size: string | number; + price: string | number; + leverage?: number | undefined; + clientOid?: string | undefined; + optional?: object | undefined; + }, callback?: Function) => Promise; + futuresSell: (params: { + symbol: string; + size: string | number; + price: string | number; + leverage?: number | undefined; + clientOid?: string | undefined; + optional?: object | undefined; + }, callback?: Function) => Promise; + futuresCancel: (orderId: string, callback?: Function) => Promise; + futuresCancelAllOpenOrders: (symbol?: string, callback?: Function) => Promise; + futuresCancelAllStopOrders: (symbol?: string, callback?: Function) => Promise; + futuresCancelAll: (symbol?: string, callback?: Function) => Promise<[any, any]>; + /** + * search to open orders list + * @param params.status --'active'|'done' default 'active' + * @param params.symbol -- string symbol + * @param params.side --'buy'|'sell' + * @param params.type -- 'limit'|'market'|'limit_stop'|'market_stop' + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 1000 + * @param callback -- callback function + */ + futuresOpenOrders: (params: OpenOrderListParams, callback?: Function) => Promise; + /** + * search to stop orders list + * @param params.symbol -- string symbol + * @param params.side --'buy'|'sell' + * @param params.type -- 'limit'|'market' + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 1000 + * @param callback -- callback function + */ + futuresStopOrders: (params: StopOrderListParams, callback?: Function) => Promise; + futuresRecentDoneOrders: (symbol?: string, callback?: Function) => Promise; + /** + * search to order detail + * @param params -- string orderId || object { clientOid } + * @param callback -- callback function + */ + futuresOrderDetail: (params: string | object, callback?: Function) => Promise; + /** + * search to stop orders list + * @param params.orderId -- string + * @param params.symbol -- string symbol + * @param params.side --'buy'|'sell' + * @param params.type -- 'limit'|'market'|'limit_stop'|'market_stop' + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 100 + * @param callback -- callback function + */ + futuresFills: (params?: FillsParams, callback?: Function) => Promise; + futuresRecentFills: (symbol?: string, callback?: Function) => Promise; + futuresMarginOpenOrders: (symbol: string, callback?: Function) => Promise; + futuresPositionDetail: (symbol?: string, callback?: Function) => Promise; + futuresPositions: (currency?: string, callback?: Function) => Promise; + futuresPositionAutoDeposit: (params: { + symbol: string; + status: boolean; + }, callback?: Function) => Promise; + futuresPositionMargin: (params: { + symbol: string; + margin: number; + bizNo?: string | undefined; + }, callback?: Function) => Promise; + futuresRiskLimit: (symbol?: string, callback?: Function) => Promise; + futuresChangeRiskLimit: (params: { + symbol: string; + level: number; + }, callback?: Function) => Promise; + /** + * search to stop orders list + * @param params.symbol -- string symbol + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.reverse -- boolean + * @param params.offset -- long + * @param params.forward -- default true + * @param params.maxCount -- default 10 + * @param callback -- callback function + */ + futuresFundingHistory: (params?: FundingHistoryParams, callback?: Function) => Promise; + futuresContractsActive: (callback?: Function) => Promise; + futuresContractDetail: (symbol: string, callback?: Function) => Promise; + futuresTicker: (symbol: string, callback?: Function) => Promise; + futuresLevel2: (symbol: string, callback?: Function) => Promise; + futuresLevel2Depth20: (symbol: string, callback?: Function) => Promise; + futuresLevel2Depth100: (symbol: string, callback?: Function) => Promise; + futuresTradeHistory: (symbol: string, callback?: Function) => Promise; + futuresTimestamp: (callback?: Function) => Promise; + futuresStatus: (callback?: Function) => Promise; + /** + * search to kline + * @param params.symbol -- string symbol + * @param params.granularity -- number + * @param params.form -- timestamp + * @param params.to -- boolean + */ + futuresKline: (params: klineParams, callback?: Function) => Promise; + /** + * search to interest list + * @param params.symbol -- string symbol + * @param params.reverse -- boolean default true + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.offset -- long + * @param params.forward -- boolean default true + * @param params.maxCount -- number default 10 | max 100 + * @param callback -- callback function + */ + futuresInterests: (params?: IndexListParams, callback?: Function) => Promise; + /** + * search to index list + * @param params.symbol -- string symbol + * @param params.reverse -- boolean default true + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.offset -- long + * @param params.forward -- boolean default true + * @param params.maxCount -- number default 10 | max 100 + * @param callback -- callback function + */ + futuresIndexList: (params?: IndexListParams, callback?: Function) => Promise; + futuresMarkPrice: (symbol: string, callback?: Function) => Promise; + /** + * search to premium list + * @param params.symbol -- string symbol + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.reverse -- boolean default true + * @param params.offset -- long + * @param params.forward -- boolean default true + * @param params.maxCount -- number default 10 | max 100 + * @param callback -- callback function + */ + futuresPremiums: (params?: IndexListParams, callback?: Function) => Promise; + futuresFundingRate: (symbol: string, callback?: Function) => Promise; + futuresGetSocketInstance: (isPrivate: boolean) => Promise; + futuresGetCacheSocketInstance: (isPrivate: boolean) => Promise; + futuresSocketSubscribe: (topic: string, callback?: Callback, isPrivate?: boolean, strict?: boolean) => Promise; + get websocket(): { + tickerV2: (symbols: string | [], callback?: (d: any) => void) => Promise; + ticker: (symbols: string | [], callback?: (d: any) => void) => Promise; + level2: (symbols: string | [], callback?: (d: any) => void) => Promise; + execution: (symbols: string | [], callback?: (d: any) => void) => Promise; + level2Depth5: (symbols: string | [], callback?: (d: any) => void) => Promise; + level2Depth50: (symbols: string | [], callback?: (d: any) => void) => Promise; + instrument: (symbols: string | [], callback?: (d: any) => void) => Promise; + announcement: (callback?: (d: any) => void) => Promise; + snapshot: (symbols: string | [], callback?: (d: any) => void) => Promise; + tradeOrders: (symbols: string | [], callback?: (d: any) => void) => Promise; + advancedOrders: (callback?: (d: any) => void) => Promise; + wallet: (callback?: (d: any) => void) => Promise; + position: (symbols: string | [], callback?: (d: any) => void) => Promise; + }; +} diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..3be4934 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,919 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var uuid_1 = require("uuid"); +var lodash_1 = require("lodash"); +var ws_1 = __importDefault(require("ws")); +var request_1 = __importDefault(require("./tools/request")); +var tools_1 = require("./tools/tools"); +var resetAPI_1 = require("./resetAPI"); +var websocket_1 = require("./websocket"); +var constants_1 = require("./tools/constants"); +var tools_2 = require("./tools/tools"); +var websocket_2 = require("./websocket"); +var KuCoinFutures = /** @class */ (function () { + function KuCoinFutures(props) { + var _this_1 = this; + this.socketInstanceCache = new Map(); + this.makeRequest = function (_a) { + var _b = _a.body, body = _b === void 0 ? '' : _b, method = _a.method, endpoint = _a.endpoint, callback = _a.callback, _c = _a.isPrivate, isPrivate = _c === void 0 ? true : _c; + return __awaiter(_this_1, void 0, void 0, function () { + var params, data, _d, err_1; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + _e.trys.push([0, 5, , 6]); + params = (0, tools_2.filterEmptyValues)(body); + if (!isPrivate) return [3 /*break*/, 2]; + return [4 /*yield*/, this.request.signatureRequest(endpoint, params, method)]; + case 1: + _d = _e.sent(); + return [3 /*break*/, 4]; + case 2: return [4 /*yield*/, this.request.requestPublic(endpoint, params, method)]; + case 3: + _d = _e.sent(); + _e.label = 4; + case 4: + data = _d; + if (callback) { + return [2 /*return*/, callback(data)]; + } + else { + return [2 /*return*/, data]; + } + return [3 /*break*/, 6]; + case 5: + err_1 = _e.sent(); + console.log(err_1); + return [2 /*return*/, err_1]; + case 6: return [2 /*return*/]; + } + }); + }); + }; + this.futuresAccount = function (currency, callback) { + if (currency === void 0) { currency = 'XBT'; } + return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: { currency: currency }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_ACCOUNT_OVERVIEW_EP, + callback: callback + })]; + }); + }); + }; + /** + * search to transaction history + * @param params.type string -- 'RealisedPNL' | 'Deposit' | 'Withdrawal' | 'TransferIn' | 'TransferOut' + * @param params.currency -- string + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.offset -- long + * @param params.maxCount -- default 50 + * @param params.forward -- default true + * @param callback -- callback function + */ + this.futuresTransactionHistory = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_TRANSACTION_HISTORY_EP, + callback: callback + })]; + }); + }); }; + this.futuresSubApi = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_SUB_API_EP, + callback: callback + })]; + }); + }); }; + this.futuresCreateSubApi = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.POST, + endpoint: resetAPI_1.FUTURES_SUB_API_EP, + callback: callback + })]; + }); + }); }; + this.futuresUpdateSubApi = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.POST, + endpoint: resetAPI_1.FUTURES_UPDATE_SUB_API_EP, + callback: callback + })]; + }); + }); }; + this.futureDeleteSubApi = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.DELETE, + endpoint: resetAPI_1.FUTURES_UPDATE_SUB_API_EP, + callback: callback + })]; + }); + }); }; + this.futureTransferOut = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.POST, + endpoint: resetAPI_1.FUTURES_TRANSFER_OUT_EP, + callback: callback + })]; + }); + }); }; + this.futureTransferIn = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.POST, + endpoint: resetAPI_1.FUTURES_TRANSFER_IN_EP, + callback: callback + })]; + }); + }); }; + /** + * search to transfer list + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.status -- string -- 'PROCESSING' | 'SUCCESS' | 'FAILURE' + * @param params.queryStatus -- array -- 'PROCESSING' | 'SUCCESS' | 'FAILURE' + * @param params.currency -- string + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 100 + * @param callback -- callback function + */ + this.futureTransfers = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.POST, + endpoint: resetAPI_1.FUTURES_TRANSFER_LIST_EP, + callback: callback + })]; + }); + }); }; + this.order = function (params, method, callback) { + if (method === void 0) { method = constants_1.GET; } + return __awaiter(_this_1, void 0, void 0, function () { + var _a, body, endpoint; + return __generator(this, function (_b) { + _a = (0, resetAPI_1.returnBodyAndEndpoint)(params, method), body = _a.body, endpoint = _a.endpoint; + return [2 /*return*/, this.makeRequest({ body: body, method: method, endpoint: endpoint, callback: callback })]; + }); + }); + }; + this.stopOrder = function (params, method, callback) { + if (method === void 0) { method = constants_1.GET; } + return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: method, + endpoint: resetAPI_1.FUTURES_STOP_ORDER_EP, + callback: callback + })]; + }); + }); + }; + this.futuresBuy = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + var price, symbol, size, _a, leverage, _b, clientOid, optional; + return __generator(this, function (_c) { + price = params.price, symbol = params.symbol, size = params.size, _a = params.leverage, leverage = _a === void 0 ? 1 : _a, _b = params.clientOid, clientOid = _b === void 0 ? (0, uuid_1.v4)() : _b, optional = params.optional; + if (!symbol) { + throw new TypeError('Order buy symbol must be set!'); + } + return [2 /*return*/, this.order({ side: 'buy', price: price, symbol: symbol, size: size, leverage: leverage, clientOid: clientOid, optional: optional }, constants_1.POST, callback)]; + }); + }); }; + this.futuresSell = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + var price, symbol, size, _a, leverage, _b, clientOid, optional; + return __generator(this, function (_c) { + price = params.price, symbol = params.symbol, size = params.size, _a = params.leverage, leverage = _a === void 0 ? 1 : _a, _b = params.clientOid, clientOid = _b === void 0 ? (0, uuid_1.v4)() : _b, optional = params.optional; + if (!symbol) { + throw new TypeError('Order sell symbol must be set!'); + } + return [2 /*return*/, this.order({ side: 'sell', price: price, symbol: symbol, size: size, leverage: leverage, clientOid: clientOid, optional: optional }, constants_1.POST, callback)]; + }); + }); }; + this.futuresCancel = function (orderId, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.order(orderId, constants_1.DELETE, callback)]; + }); + }); }; + this.futuresCancelAllOpenOrders = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.order({ symbol: symbol }, constants_1.DELETE, callback)]; + }); + }); }; + this.futuresCancelAllStopOrders = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.stopOrder({ symbol: symbol }, constants_1.DELETE, callback)]; + }); + }); }; + this.futuresCancelAll = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + var cancelAllOpenOrders, cancelAllStopOrders; + return __generator(this, function (_a) { + cancelAllOpenOrders = this.futuresCancelAllOpenOrders(symbol, callback); + cancelAllStopOrders = this.futuresCancelAllStopOrders(symbol, callback); + return [2 /*return*/, Promise.all([cancelAllOpenOrders, cancelAllStopOrders])]; + }); + }); }; + /** + * search to open orders list + * @param params.status --'active'|'done' default 'active' + * @param params.symbol -- string symbol + * @param params.side --'buy'|'sell' + * @param params.type -- 'limit'|'market'|'limit_stop'|'market_stop' + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 1000 + * @param callback -- callback function + */ + this.futuresOpenOrders = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.order(params, constants_1.GET, callback)]; + }); + }); }; + /** + * search to stop orders list + * @param params.symbol -- string symbol + * @param params.side --'buy'|'sell' + * @param params.type -- 'limit'|'market' + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 1000 + * @param callback -- callback function + */ + this.futuresStopOrders = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.stopOrder(params, constants_1.GET, callback)]; + }); + }); }; + this.futuresRecentDoneOrders = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: { symbol: symbol }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_RECENT_DONE_ORDERS_EP, + callback: callback + })]; + }); + }); }; + /** + * search to order detail + * @param params -- string orderId || object { clientOid } + * @param callback -- callback function + */ + this.futuresOrderDetail = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.order(params, constants_1.GET, callback)]; + }); + }); }; + /** + * search to stop orders list + * @param params.orderId -- string + * @param params.symbol -- string symbol + * @param params.side --'buy'|'sell' + * @param params.type -- 'limit'|'market'|'limit_stop'|'market_stop' + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 100 + * @param callback -- callback function + */ + this.futuresFills = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_FILLS_EP, + callback: callback + })]; + }); + }); }; + this.futuresRecentFills = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: { symbol: symbol }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_RECENT_FILLS_EP, + callback: callback + })]; + }); + }); }; + this.futuresMarginOpenOrders = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + if (!symbol) { + console.error('Required String parameter symbol'); + return [2 /*return*/]; + } + return [2 /*return*/, this.makeRequest({ + body: { symbol: symbol }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_TOTAL_OPEN_ORDERS_MARGIN_EP, + callback: callback + })]; + }); + }); }; + this.futuresPositionDetail = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: { symbol: symbol }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_POSITION_EP, + callback: callback + })]; + }); + }); }; + this.futuresPositions = function (currency, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: { currency: currency }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_POSITIONS_EP, + callback: callback + })]; + }); + }); }; + this.futuresPositionAutoDeposit = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.POST, + endpoint: resetAPI_1.FUTURES_POSITION_AUTO_DEPOSIT_STATUS_EP, + callback: callback + })]; + }); + }); }; + this.futuresPositionMargin = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + var symbol, margin, bizNo, makeBizNo; + return __generator(this, function (_a) { + symbol = params.symbol, margin = params.margin, bizNo = params.bizNo; + makeBizNo = bizNo || (0, uuid_1.v4)(); + return [2 /*return*/, this.makeRequest({ + body: { symbol: symbol, margin: margin, bizNo: makeBizNo }, + method: constants_1.POST, + endpoint: resetAPI_1.FUTURES_POSITION_MARGIN_EP, + callback: callback + })]; + }); + }); }; + this.futuresRiskLimit = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: symbol, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_RISK_LIMIT_EP, + callback: callback + })]; + }); + }); }; + this.futuresChangeRiskLimit = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.POST, + endpoint: resetAPI_1.FUTURES_CHANGE_RISK_LIMIT_EP, + callback: callback + })]; + }); + }); }; + /** + * search to stop orders list + * @param params.symbol -- string symbol + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.reverse -- boolean + * @param params.offset -- long + * @param params.forward -- default true + * @param params.maxCount -- default 10 + * @param callback -- callback function + */ + this.futuresFundingHistory = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_FUNDING_HISTORY_EP, + callback: callback + })]; + }); + }); }; + this.futuresContractsActive = function (callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_CONTRACTS_ACTIVE_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + this.futuresContractDetail = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + if (!symbol) { + console.log('Required Parameter. Symbol of the contract'); + return [2 /*return*/, false]; + } + return [2 /*return*/, this.makeRequest({ + body: symbol, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_CONTRACTS_DETAIL_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + this.futuresTicker = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: { symbol: symbol }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_TICKER_EP, + callback: callback + })]; + }); + }); }; + this.futuresLevel2 = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: { symbol: symbol }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_LEVEL2_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + this.futuresLevel2Depth20 = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: { symbol: symbol }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_LEVEL2_20_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + this.futuresLevel2Depth100 = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: { symbol: symbol }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_LEVEL2_100_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + this.futuresTradeHistory = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: { symbol: symbol }, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_TRADE_HISTORY_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + this.futuresTimestamp = function (callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_TIMESTAMP_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + this.futuresStatus = function (callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_SERVICE_STATUS_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + /** + * search to kline + * @param params.symbol -- string symbol + * @param params.granularity -- number + * @param params.form -- timestamp + * @param params.to -- boolean + */ + this.futuresKline = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_KLINE_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + /** + * search to interest list + * @param params.symbol -- string symbol + * @param params.reverse -- boolean default true + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.offset -- long + * @param params.forward -- boolean default true + * @param params.maxCount -- number default 10 | max 100 + * @param callback -- callback function + */ + this.futuresInterests = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_INTEREST_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + /** + * search to index list + * @param params.symbol -- string symbol + * @param params.reverse -- boolean default true + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.offset -- long + * @param params.forward -- boolean default true + * @param params.maxCount -- number default 10 | max 100 + * @param callback -- callback function + */ + this.futuresIndexList = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_INDEX_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + this.futuresMarkPrice = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + method: constants_1.GET, + endpoint: "".concat(resetAPI_1.FUTURES_MARK_PRICE_EP, "/").concat(symbol, "/current"), + callback: callback, + isPrivate: false + })]; + }); + }); }; + /** + * search to premium list + * @param params.symbol -- string symbol + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.reverse -- boolean default true + * @param params.offset -- long + * @param params.forward -- boolean default true + * @param params.maxCount -- number default 10 | max 100 + * @param callback -- callback function + */ + this.futuresPremiums = function (params, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + body: params, + method: constants_1.GET, + endpoint: resetAPI_1.FUTURES_PREMIUM_EP, + callback: callback, + isPrivate: false + })]; + }); + }); }; + this.futuresFundingRate = function (symbol, callback) { return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.makeRequest({ + method: constants_1.GET, + endpoint: "".concat(resetAPI_1.FUTURES_FUNDING_RATE_EP, "/").concat(symbol, "/current"), + callback: callback, + isPrivate: false + })]; + }); + }); }; + this.futuresGetSocketInstance = function (isPrivate) { return __awaiter(_this_1, void 0, void 0, function () { + var _a, instanceServers, token, wssUri, websocket, socketInstance; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, this.makeRequest({ + method: constants_1.POST, + endpoint: isPrivate ? websocket_1.PRIVATE_BULLET_EP : websocket_1.PUBLIC_BULLET_EP, + isPrivate: isPrivate + })]; + case 1: + _a = (_b.sent()).data, instanceServers = _a.instanceServers, token = _a.token; + wssUri = "".concat(instanceServers[0].endpoint, "?token=").concat(token, "&acceptUserMessage=true&connectId=").concat(websocket_2.CONNECT_ID); + websocket = new ws_1.default(wssUri); + socketInstance = new websocket_2.WebSocketClient(wssUri, websocket); + return [2 /*return*/, socketInstance]; + } + }); + }); }; + this.futuresGetCacheSocketInstance = function (isPrivate) { return __awaiter(_this_1, void 0, void 0, function () { + var key; + return __generator(this, function (_a) { + key = "futures_".concat(isPrivate); + if (!this.socketInstanceCache.has(key)) { + this.socketInstanceCache.set(key, this.futuresGetSocketInstance(isPrivate)); + } + return [2 /*return*/, this.socketInstanceCache.get(key)]; + }); + }); }; + this.futuresSocketSubscribe = function (topic, callback, isPrivate, strict) { + if (callback === void 0) { callback = tools_2.log; } + if (isPrivate === void 0) { isPrivate = false; } + if (strict === void 0) { strict = true; } + return __awaiter(_this_1, void 0, void 0, function () { + return __generator(this, function (_a) { + if (!topic) { + console.log('Required parameter topic'); + return [2 /*return*/, false]; + } + this.futuresGetCacheSocketInstance(isPrivate) + .then(function (socketInstance) { + return socketInstance.subscribe(topic, callback, isPrivate, strict); + }) + .catch(function (err) { + console.log("execute ".concat(topic, " error: ").concat(JSON.stringify(err))); + return false; + }); + return [2 /*return*/]; + }); + }); + }; + var _a = props || {}, key = _a.key, secret = _a.secret, passphrase = _a.passphrase, _b = _a.axiosProps, axiosProps = _b === void 0 ? {} : _b; + this.request = new request_1.default(__assign({ key: key, secret: secret, passphrase: passphrase }, axiosProps)); + } + Object.defineProperty(KuCoinFutures.prototype, "websocket", { + get: function () { + var _this = this; + function makeSubscribe(symbols, topic, callback, privateChannel) { + if (callback === void 0) { callback = tools_2.log; } + if (privateChannel === void 0) { privateChannel = false; } + return __awaiter(this, void 0, void 0, function () { + var symbolSplit, subscribeList; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!Array.isArray(symbols)) return [3 /*break*/, 2]; + symbolSplit = (0, tools_1.splitArray)(symbols); + subscribeList = (0, lodash_1.map)(symbolSplit, function (symbolStr) { + if (symbolStr) { + return _this.futuresSocketSubscribe("".concat(topic, ":").concat(symbolStr), callback, privateChannel, false); + } + }); + return [4 /*yield*/, Promise.all(subscribeList)]; + case 1: return [2 /*return*/, _a.sent()]; + case 2: + if (!symbols) return [3 /*break*/, 4]; + return [4 /*yield*/, _this.futuresSocketSubscribe("".concat(topic, ":").concat(symbols), callback, privateChannel)]; + case 3: return [2 /*return*/, _a.sent()]; + case 4: return [4 /*yield*/, _this.futuresSocketSubscribe(topic, callback, privateChannel)]; + case 5: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + /* === public socket === */ + function tickerV2(symbols, callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, makeSubscribe(symbols, websocket_2.TICKER_V2, callback)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function ticker(symbols, callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, makeSubscribe(symbols, websocket_1.TICKER, callback)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function level2(symbols, callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, makeSubscribe(symbols, websocket_1.LEVEL2, callback)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function execution(symbols, callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, makeSubscribe(symbols, websocket_1.EXECUTION, callback)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function level2Depth5(symbols, callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, makeSubscribe(symbols, websocket_1.LEVEL2_DEPTH5, callback)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function level2Depth50(symbols, callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, makeSubscribe(symbols, websocket_1.LEVEL2_DEPTH50, callback)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function instrument(symbols, callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, makeSubscribe(symbols, websocket_1.INSTRUMENT, callback)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function announcement(callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, _this.futuresSocketSubscribe(websocket_1.ANNOUNCEMENT, callback, false)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function snapshot(symbols, callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, makeSubscribe(symbols, websocket_1.SNAPSHOT, callback)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + /* === private socket === */ + function tradeOrders(symbols, callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, makeSubscribe(symbols, websocket_1.TRADE_ORDERS, callback, true)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function advancedOrders(callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, _this.futuresSocketSubscribe(websocket_1.ADVANCE_ORDERS, callback, true)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function wallet(callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, _this.futuresSocketSubscribe(websocket_1.WALLET, callback, true)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + function position(symbols, callback) { + if (callback === void 0) { callback = tools_2.log; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, makeSubscribe(symbols, websocket_1.POSITION, callback, true)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + } + return { + tickerV2: tickerV2, + ticker: ticker, + level2: level2, + execution: execution, + level2Depth5: level2Depth5, + level2Depth50: level2Depth50, + instrument: instrument, + announcement: announcement, + snapshot: snapshot, + tradeOrders: tradeOrders, + advancedOrders: advancedOrders, + wallet: wallet, + position: position + }; + }, + enumerable: false, + configurable: true + }); + return KuCoinFutures; +}()); +exports.default = KuCoinFutures; diff --git a/lib/resetAPI/constants.d.ts b/lib/resetAPI/constants.d.ts new file mode 100644 index 0000000..c765806 --- /dev/null +++ b/lib/resetAPI/constants.d.ts @@ -0,0 +1,35 @@ +export declare const FUTURES_ACCOUNT_OVERVIEW_EP = "/api/v1/account-overview"; +export declare const FUTURES_TRANSACTION_HISTORY_EP = "/api/v1/transaction-history"; +export declare const FUTURES_SUB_API_EP = "/api/v1/sub/api-key"; +export declare const FUTURES_UPDATE_SUB_API_EP = "/api/v1/sub/api-key/update"; +export declare const FUTURES_TRANSFER_OUT_EP = "/api/v3/transfer-out"; +export declare const FUTURES_TRANSFER_IN_EP = "/api/v1/transfer-in"; +export declare const FUTURES_TRANSFER_LIST_EP = "/api/v1/transfer-list"; +export declare const FUTURES_ORDER_EP = "/api/v1/orders"; +export declare const FUTURES_STOP_ORDER_EP = "/api/v1/stopOrders"; +export declare const FUTURES_RECENT_DONE_ORDERS_EP = "/api/v1/recentDoneOrders"; +export declare const FUTURES_FILLS_EP = "/api/v1/fills"; +export declare const FUTURES_RECENT_FILLS_EP = "/api/v1/recentFills"; +export declare const FUTURES_TOTAL_OPEN_ORDERS_MARGIN_EP = "/api/v1/openOrderStatistics"; +export declare const FUTURES_POSITION_EP = "/api/v1/position"; +export declare const FUTURES_POSITIONS_EP = "/api/v1/positions"; +export declare const FUTURES_POSITION_AUTO_DEPOSIT_STATUS_EP = "/api/v1/position/margin/auto-deposit-status"; +export declare const FUTURES_POSITION_MARGIN_EP = "/api/v1/position/margin/deposit-margin"; +export declare const FUTURES_RISK_LIMIT_EP = "/api/v1/contracts/risk-limit"; +export declare const FUTURES_CHANGE_RISK_LIMIT_EP = "/api/v1/position/risk-limit-level/change"; +export declare const FUTURES_FUNDING_HISTORY_EP = "/api/v1/funding-history"; +export declare const FUTURES_CONTRACTS_ACTIVE_EP = "/api/v1/contracts/active"; +export declare const FUTURES_CONTRACTS_DETAIL_EP = "api/v1/contracts"; +export declare const FUTURES_TICKER_EP = "/api/v1/ticker"; +export declare const FUTURES_LEVEL2_EP = "/api/v1/level2/snapshot"; +export declare const FUTURES_LEVEL2_20_EP = "/api/v1/level2/depth20"; +export declare const FUTURES_LEVEL2_100_EP = "/api/v1/level2/depth100"; +export declare const FUTURES_TRADE_HISTORY_EP = "/api/v1/trade/history"; +export declare const FUTURES_INTEREST_EP = "/api/v1/interest/query"; +export declare const FUTURES_INDEX_EP = "/api/v1/index/query"; +export declare const FUTURES_MARK_PRICE_EP = "/api/v1/mark-price"; +export declare const FUTURES_PREMIUM_EP = "/api/v1/premium/query"; +export declare const FUTURES_FUNDING_RATE_EP = "/api/v1/funding-rate"; +export declare const FUTURES_TIMESTAMP_EP = "/api/v1/timestamp"; +export declare const FUTURES_SERVICE_STATUS_EP = "/api/v1/status"; +export declare const FUTURES_KLINE_EP = "/api/v1/kline/query"; diff --git a/lib/resetAPI/constants.js b/lib/resetAPI/constants.js new file mode 100644 index 0000000..632cab7 --- /dev/null +++ b/lib/resetAPI/constants.js @@ -0,0 +1,45 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FUTURES_KLINE_EP = exports.FUTURES_SERVICE_STATUS_EP = exports.FUTURES_TIMESTAMP_EP = exports.FUTURES_FUNDING_RATE_EP = exports.FUTURES_PREMIUM_EP = exports.FUTURES_MARK_PRICE_EP = exports.FUTURES_INDEX_EP = exports.FUTURES_INTEREST_EP = exports.FUTURES_TRADE_HISTORY_EP = exports.FUTURES_LEVEL2_100_EP = exports.FUTURES_LEVEL2_20_EP = exports.FUTURES_LEVEL2_EP = exports.FUTURES_TICKER_EP = exports.FUTURES_CONTRACTS_DETAIL_EP = exports.FUTURES_CONTRACTS_ACTIVE_EP = exports.FUTURES_FUNDING_HISTORY_EP = exports.FUTURES_CHANGE_RISK_LIMIT_EP = exports.FUTURES_RISK_LIMIT_EP = exports.FUTURES_POSITION_MARGIN_EP = exports.FUTURES_POSITION_AUTO_DEPOSIT_STATUS_EP = exports.FUTURES_POSITIONS_EP = exports.FUTURES_POSITION_EP = exports.FUTURES_TOTAL_OPEN_ORDERS_MARGIN_EP = exports.FUTURES_RECENT_FILLS_EP = exports.FUTURES_FILLS_EP = exports.FUTURES_RECENT_DONE_ORDERS_EP = exports.FUTURES_STOP_ORDER_EP = exports.FUTURES_ORDER_EP = exports.FUTURES_TRANSFER_LIST_EP = exports.FUTURES_TRANSFER_IN_EP = exports.FUTURES_TRANSFER_OUT_EP = exports.FUTURES_UPDATE_SUB_API_EP = exports.FUTURES_SUB_API_EP = exports.FUTURES_TRANSACTION_HISTORY_EP = exports.FUTURES_ACCOUNT_OVERVIEW_EP = void 0; +// account endpoint +exports.FUTURES_ACCOUNT_OVERVIEW_EP = '/api/v1/account-overview'; +exports.FUTURES_TRANSACTION_HISTORY_EP = '/api/v1/transaction-history'; +exports.FUTURES_SUB_API_EP = '/api/v1/sub/api-key'; +exports.FUTURES_UPDATE_SUB_API_EP = '/api/v1/sub/api-key/update'; +// transfer endpoint +exports.FUTURES_TRANSFER_OUT_EP = '/api/v3/transfer-out'; +exports.FUTURES_TRANSFER_IN_EP = '/api/v1/transfer-in'; +exports.FUTURES_TRANSFER_LIST_EP = '/api/v1/transfer-list'; +// order endpoint +exports.FUTURES_ORDER_EP = '/api/v1/orders'; +exports.FUTURES_STOP_ORDER_EP = '/api/v1/stopOrders'; +exports.FUTURES_RECENT_DONE_ORDERS_EP = '/api/v1/recentDoneOrders'; +// fills endpoint +exports.FUTURES_FILLS_EP = '/api/v1/fills'; +exports.FUTURES_RECENT_FILLS_EP = '/api/v1/recentFills'; +exports.FUTURES_TOTAL_OPEN_ORDERS_MARGIN_EP = '/api/v1/openOrderStatistics'; +// position endpoint +exports.FUTURES_POSITION_EP = '/api/v1/position'; +exports.FUTURES_POSITIONS_EP = '/api/v1/positions'; +exports.FUTURES_POSITION_AUTO_DEPOSIT_STATUS_EP = '/api/v1/position/margin/auto-deposit-status'; +exports.FUTURES_POSITION_MARGIN_EP = '/api/v1/position/margin/deposit-margin'; +// other endpoint +exports.FUTURES_RISK_LIMIT_EP = '/api/v1/contracts/risk-limit'; +exports.FUTURES_CHANGE_RISK_LIMIT_EP = '/api/v1/position/risk-limit-level/change'; +exports.FUTURES_FUNDING_HISTORY_EP = '/api/v1/funding-history'; +// market endpoint +exports.FUTURES_CONTRACTS_ACTIVE_EP = '/api/v1/contracts/active'; +exports.FUTURES_CONTRACTS_DETAIL_EP = 'api/v1/contracts'; +exports.FUTURES_TICKER_EP = '/api/v1/ticker'; +exports.FUTURES_LEVEL2_EP = '/api/v1/level2/snapshot'; +exports.FUTURES_LEVEL2_20_EP = '/api/v1/level2/depth20'; +exports.FUTURES_LEVEL2_100_EP = '/api/v1/level2/depth100'; +exports.FUTURES_TRADE_HISTORY_EP = '/api/v1/trade/history'; +exports.FUTURES_INTEREST_EP = '/api/v1/interest/query'; +exports.FUTURES_INDEX_EP = '/api/v1/index/query'; +exports.FUTURES_MARK_PRICE_EP = '/api/v1/mark-price'; +exports.FUTURES_PREMIUM_EP = '/api/v1/premium/query'; +exports.FUTURES_FUNDING_RATE_EP = '/api/v1/funding-rate'; +exports.FUTURES_TIMESTAMP_EP = '/api/v1/timestamp'; +exports.FUTURES_SERVICE_STATUS_EP = '/api/v1/status'; +exports.FUTURES_KLINE_EP = '/api/v1/kline/query'; diff --git a/lib/resetAPI/futuresOrder.d.ts b/lib/resetAPI/futuresOrder.d.ts new file mode 100644 index 0000000..20587cd --- /dev/null +++ b/lib/resetAPI/futuresOrder.d.ts @@ -0,0 +1,26 @@ +import { OrderOptionalParamsType, OrderBody } from '../dataType'; +export declare const STOP_TYPES: string[]; +export declare const STOP_PRICE_TYPES: string[]; +export declare const TIME_IN_FORCE_TYPES: string[]; +export declare const OPTIONAL_PARAMS: OrderOptionalParamsType[]; +/** + * create order-(buy|sell) body + * @param side + * @param symbol + * @param size + * @param price + * @param leverage + * @param optional + */ +export declare const makeFuturesOrderBody: ({ side, symbol, size, price, leverage, clientOid, optional }: OrderBody) => object; +/** + * return futures order make body and endpoint + * @param {any} params。 + * @param {string} method - DEFAULT 'GET'。 + * @returns {Object} return { body, endpoint }。 + */ +declare const returnBodyAndEndpoint: (params: any, method?: string) => { + body: any; + endpoint: string; +}; +export default returnBodyAndEndpoint; diff --git a/lib/resetAPI/futuresOrder.js b/lib/resetAPI/futuresOrder.js new file mode 100644 index 0000000..4b33af4 --- /dev/null +++ b/lib/resetAPI/futuresOrder.js @@ -0,0 +1,139 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.makeFuturesOrderBody = exports.OPTIONAL_PARAMS = exports.TIME_IN_FORCE_TYPES = exports.STOP_PRICE_TYPES = exports.STOP_TYPES = void 0; +var pick_1 = __importDefault(require("lodash/pick")); +var constants_1 = require("./constants"); +exports.STOP_TYPES = ['down', 'up']; +exports.STOP_PRICE_TYPES = ['TP', 'IP', 'MP']; +exports.TIME_IN_FORCE_TYPES = ['GTC', 'IOC']; +exports.OPTIONAL_PARAMS = [ + 'type', + 'remark', + 'stop', + 'stopPriceType', + 'stopPrice', + 'reduceOnly', + 'closeOrder', + 'forceHold', + 'timeInForce', + 'postOnly', + 'hidden', + 'iceberg', + 'visibleSize' +]; +var LIMIT = 'limit'; +var MARKET = 'market'; +/** + * create order-(buy|sell) body + * @param side + * @param symbol + * @param size + * @param price + * @param leverage + * @param optional + */ +var makeFuturesOrderBody = function (_a) { + var side = _a.side, symbol = _a.symbol, size = _a.size, price = _a.price, _b = _a.leverage, leverage = _b === void 0 ? 1 : _b, clientOid = _a.clientOid, _c = _a.optional, optional = _c === void 0 ? {} : _c; + if (!size || !(size % 1 === 0)) { + throw new TypeError('The order size must be an integer!'); + } + var type = LIMIT; + if (!price) { + type = MARKET; + } + var stop = optional.stop, stopPriceType = optional.stopPriceType, stopPrice = optional.stopPrice, _d = optional.timeInForce, timeInForce = _d === void 0 ? 'GTC' : _d, postOnly = optional.postOnly, _e = optional.hidden, hidden = _e === void 0 ? false : _e, _f = optional.iceberg, iceberg = _f === void 0 ? false : _f, other = __rest(optional, ["stop", "stopPriceType", "stopPrice", "timeInForce", "postOnly", "hidden", "iceberg"]); + var body = __assign({ side: side, symbol: symbol, type: type, size: size, leverage: leverage, clientOid: clientOid }, (0, pick_1.default)(other, exports.OPTIONAL_PARAMS)); + if (stop) { + if (!exports.STOP_TYPES.includes(stop)) { + throw new RangeError('The value of stop is not accepted, must be (down | up).'); + } + if (!stopPriceType || !stopPrice) { + throw new TypeError('To set the stop attribute, you must set the stopPrice and stopPriceType parameters.'); + } + if (!exports.STOP_PRICE_TYPES.includes(stopPriceType)) { + throw new RangeError('The value of stopPriceType is not accepted, must be (TP | IP | MP).'); + } + body = __assign(__assign({}, body), { stop: stop, stopPriceType: stopPriceType, stopPrice: stopPrice }); + } + if (type === LIMIT || optional.type === LIMIT) { + if (!exports.TIME_IN_FORCE_TYPES.includes(timeInForce)) { + throw new RangeError('The value of timeInForce is not accepted, must be (GTC | IOC).'); + } + if (timeInForce === 'IOC' || hidden || iceberg) { + body = __assign(__assign({}, body), { timeInForce: timeInForce, hidden: hidden, iceberg: iceberg }); + } + else { + body = __assign(__assign({ price: price }, body), { timeInForce: timeInForce, postOnly: postOnly }); + } + } + return body; +}; +exports.makeFuturesOrderBody = makeFuturesOrderBody; +/** + * return futures order make body and endpoint + * @param {any} params。 + * @param {string} method - DEFAULT 'GET'。 + * @returns {Object} return { body, endpoint }。 + */ +var returnBodyAndEndpoint = function (params, method) { + if (method === void 0) { method = 'GET'; } + var endpoint = constants_1.FUTURES_ORDER_EP; + var body = params; + switch (method) { + case 'POST': { + if (typeof params === 'object') { + var side = params.side, symbol = params.symbol, size = params.size, price = params.price, leverage = params.leverage, clientOid = params.clientOid, optional = params.optional; + body = (0, exports.makeFuturesOrderBody)({ + side: side, + symbol: symbol, + size: size, + price: price, + leverage: leverage, + clientOid: clientOid, + optional: optional + }); + } + break; + } + case 'DELETE': { + if (params && typeof params === 'string') { + endpoint = "".concat(endpoint, "/").concat(params); + body = ''; + } + break; + } + case 'GET': { + if (typeof params === 'object' && params.clientOid) { + endpoint = "".concat(endpoint, "/byClientOid"); + } + break; + } + } + return { body: body, endpoint: endpoint }; +}; +exports.default = returnBodyAndEndpoint; diff --git a/lib/resetAPI/index.d.ts b/lib/resetAPI/index.d.ts new file mode 100644 index 0000000..113caa4 --- /dev/null +++ b/lib/resetAPI/index.d.ts @@ -0,0 +1,3 @@ +import returnBodyAndEndpoint from "./futuresOrder"; +export * from './constants'; +export { returnBodyAndEndpoint }; diff --git a/lib/resetAPI/index.js b/lib/resetAPI/index.js new file mode 100644 index 0000000..5355bb5 --- /dev/null +++ b/lib/resetAPI/index.js @@ -0,0 +1,23 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.returnBodyAndEndpoint = void 0; +var futuresOrder_1 = __importDefault(require("./futuresOrder")); +exports.returnBodyAndEndpoint = futuresOrder_1.default; +__exportStar(require("./constants"), exports); diff --git a/lib/resetAPI/trade/index.d.ts b/lib/resetAPI/trade/index.d.ts new file mode 100644 index 0000000..f36bc75 --- /dev/null +++ b/lib/resetAPI/trade/index.d.ts @@ -0,0 +1,2 @@ +import order from "./order"; +export { order }; diff --git a/lib/resetAPI/trade/index.js b/lib/resetAPI/trade/index.js new file mode 100644 index 0000000..b733496 --- /dev/null +++ b/lib/resetAPI/trade/index.js @@ -0,0 +1,8 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.order = void 0; +var order_1 = __importDefault(require("./order")); +exports.order = order_1.default; diff --git a/lib/resetAPI/trade/order.d.ts b/lib/resetAPI/trade/order.d.ts new file mode 100644 index 0000000..26c074d --- /dev/null +++ b/lib/resetAPI/trade/order.d.ts @@ -0,0 +1,15 @@ +export declare const STOP_TYPES: string[]; +export declare const STOP_PRICE_TYPES: string[]; +export declare const TIME_IN_FORCE_TYPES: string[]; +export declare const OPTIONAL_PARAMS: string[]; +/** + * create order-(buy|sell) body + * @param side + * @param symbol + * @param size + * @param price + * @param leverage + * @param optional + */ +declare const Order: (side: string, symbol: string, size: number, price: number | string, leverage?: number | string, optional?: any) => object; +export default Order; diff --git a/lib/resetAPI/trade/order.js b/lib/resetAPI/trade/order.js new file mode 100644 index 0000000..9550d61 --- /dev/null +++ b/lib/resetAPI/trade/order.js @@ -0,0 +1,105 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OPTIONAL_PARAMS = exports.TIME_IN_FORCE_TYPES = exports.STOP_PRICE_TYPES = exports.STOP_TYPES = void 0; +var lodash_1 = __importDefault(require("lodash")); +exports.STOP_TYPES = ["down", "up"]; +exports.STOP_PRICE_TYPES = ["TP", "IP", "MP"]; +exports.TIME_IN_FORCE_TYPES = ["GTC", "IOC"]; +exports.OPTIONAL_PARAMS = [ + "type", + "remark", + "stop", + "stopPriceType", + "stopPrice", + "reduceOnly", + "closeOrder", + "forceHold", + "timeInForce", + "postOnly", + "hidden", + "iceberg", + "visibleSize" +]; +var LIMIT = "limit"; +var MARKET = "market"; +/** + * create order-(buy|sell) body + * @param side + * @param symbol + * @param size + * @param price + * @param leverage + * @param optional + */ +var Order = function (side, symbol, size, price, leverage, optional) { + if (leverage === void 0) { leverage = 1; } + if (optional === void 0) { optional = {}; } + if (!size || !(size % 1 === 0)) { + throw new TypeError("The order size must be an integer!"); + } + var type = LIMIT; + if (!price) { + type = MARKET; + } + var stop = optional.stop, stopPriceType = optional.stopPriceType, stopPrice = optional.stopPrice, _a = optional.timeInForce, timeInForce = _a === void 0 ? "GTC" : _a, postOnly = optional.postOnly, _b = optional.hidden, hidden = _b === void 0 ? false : _b, _c = optional.iceberg, iceberg = _c === void 0 ? false : _c, other = __rest(optional, ["stop", "stopPriceType", "stopPrice", "timeInForce", "postOnly", "hidden", "iceberg"]); + var body = __assign({ side: side, + symbol: symbol, + type: type, + size: size, + leverage: leverage }, lodash_1.default.pick(other, exports.OPTIONAL_PARAMS)); + if (stop) { + if (!exports.STOP_TYPES.includes(stop)) { + throw new RangeError("The value of stop is not accepted, must be (down | up)."); + } + if (!stopPriceType || !stopPrice) { + throw new TypeError("To set the stop attribute, you must set the stopPrice and stopPriceType parameters."); + } + if (!exports.STOP_PRICE_TYPES.includes(stopPriceType)) { + throw new RangeError("The value of stopPriceType is not accepted, must be (TP | IP | MP)."); + } + body = __assign(__assign({}, body), { stop: stop, + stopPriceType: stopPriceType, + stopPrice: stopPrice }); + } + if (type === LIMIT || optional.type === LIMIT) { + if (!exports.TIME_IN_FORCE_TYPES.includes(timeInForce)) { + throw new RangeError("The value of timeInForce is not accepted, must be (GTC | IOC)."); + } + if (timeInForce === "IOC" || hidden || iceberg) { + body = __assign(__assign({}, body), { timeInForce: timeInForce, + hidden: hidden, + iceberg: iceberg }); + } + else { + body = __assign(__assign({}, body), { timeInForce: timeInForce, + postOnly: postOnly }); + } + } + return body; +}; +exports.default = Order; diff --git a/lib/tools/constants.d.ts b/lib/tools/constants.d.ts new file mode 100644 index 0000000..c88c8a4 --- /dev/null +++ b/lib/tools/constants.d.ts @@ -0,0 +1,6 @@ +export declare const TIME_OUT = 10000; +export declare const GET = "GET"; +export declare const POST = "POST"; +export declare const DELETE = "DELETE"; +export declare const SANDBOX_ADDR_EP = "https://api-sandbox-futures.kucoin.com"; +export declare const PROD_ADDR_EP = "https://api-futures.kucoin.com"; diff --git a/lib/tools/constants.js b/lib/tools/constants.js new file mode 100644 index 0000000..d035713 --- /dev/null +++ b/lib/tools/constants.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PROD_ADDR_EP = exports.SANDBOX_ADDR_EP = exports.DELETE = exports.POST = exports.GET = exports.TIME_OUT = void 0; +exports.TIME_OUT = 10000; +exports.GET = 'GET'; +exports.POST = 'POST'; +exports.DELETE = 'DELETE'; +exports.SANDBOX_ADDR_EP = 'https://api-sandbox-futures.kucoin.com'; +exports.PROD_ADDR_EP = 'https://api-futures.kucoin.com'; diff --git a/lib/tools/request.d.ts b/lib/tools/request.d.ts new file mode 100644 index 0000000..cd63fe8 --- /dev/null +++ b/lib/tools/request.d.ts @@ -0,0 +1,41 @@ +/** + * return api signature header + * @param {object} configs + * @param {string | object} data + */ +export declare const apiAuth: (configs: any, data?: string) => { + 'KC-API-KEY': any; + 'KC-API-SIGN': string; + 'KC-API-TIMESTAMP': string; + 'KC-API-PASSPHRASE': any; + 'KC-API-KEY-VERSION': any; + 'Content-Type': string; + 'User-Agent': string; +}; +/** + * create axios request + * @param {string} env -- set baseURL + * @param {string} key -- set KC-API-KEY + * @param {string} passphrase -- KC-API-PASSPHRASE + * @param {string} secret -- set Secret + * @param {object} other -- set axios instance + * @function setSignatureConfig -- set {key,passphrase,secret} + * @function request -- axios request return promise + */ +export default class Request { + private axiosInstance; + private key; + private secret; + private passphrase; + private version; + constructor(props: { + key: string | number; + secret: string | number; + passphrase: string | number; + env?: string; + version?: string | number; + }); + setSignatureConfig(config?: any): void; + signatureRequest(url: string, data: any, method?: string, config?: {}): Promise; + requestPublic(url: string, data: any, method?: string, config?: {}): Promise; +} diff --git a/lib/tools/request.js b/lib/tools/request.js new file mode 100644 index 0000000..84d9e86 --- /dev/null +++ b/lib/tools/request.js @@ -0,0 +1,174 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.apiAuth = void 0; +var axios_1 = __importDefault(require("axios")); +var https_1 = __importDefault(require("https")); +var tools_1 = require("./tools"); +var constants_1 = require("./constants"); +var httpsAgent = new https_1.default.Agent({ rejectUnauthorized: false }); +/** + * return api signature header + * @param {object} configs + * @param {string | object} data + */ +var apiAuth = function (configs, data) { + if (data === void 0) { data = ''; } + var _a = configs.key, key = _a === void 0 ? '' : _a, _b = configs.passphrase, passphrase = _b === void 0 ? '' : _b, secret = configs.secret, method = configs.method, endpoint = configs.url, _c = configs.version, version = _c === void 0 ? '2' : _c; + if (!key) { + console.log('KC-API-KEY is not specified more information see here https://docs.kucoin.com/futures/#general'); + } + if (!passphrase) { + console.log('KC-API-PASSPHRASE is not specified more information see here https://docs.kucoin.com/futures/#general'); + } + var timestamp = Date.now(); + var signature = (0, tools_1.cryptoHmac)(timestamp + (method || '').toUpperCase() + endpoint + data, secret); + var authParams = { + 'KC-API-KEY': key, + 'KC-API-SIGN': signature, + 'KC-API-TIMESTAMP': timestamp.toString(), + 'KC-API-PASSPHRASE': passphrase, + 'KC-API-KEY-VERSION': version, + 'Content-Type': 'application/json', + 'User-Agent': "KuCoin-Futures-Node-SDK/".concat(version) + }; + if (version && version == 2) { + authParams['KC-API-PASSPHRASE'] = (0, tools_1.cryptoHmac)(passphrase, secret); + } + return authParams; +}; +exports.apiAuth = apiAuth; +/** + * create axios request + * @param {string} env -- set baseURL + * @param {string} key -- set KC-API-KEY + * @param {string} passphrase -- KC-API-PASSPHRASE + * @param {string} secret -- set Secret + * @param {object} other -- set axios instance + * @function setSignatureConfig -- set {key,passphrase,secret} + * @function request -- axios request return promise + */ +var Request = /** @class */ (function () { + function Request(props) { + var _a = props || {}, _b = _a.env, env = _b === void 0 ? 'prod' : _b, _c = _a.key, key = _c === void 0 ? '' : _c, secret = _a.secret, _d = _a.passphrase, passphrase = _d === void 0 ? '' : _d, _e = _a.version, version = _e === void 0 ? 2 : _e, other = __rest(_a, ["env", "key", "secret", "passphrase", "version"]); + var baseURL = env === 'prod' ? constants_1.PROD_ADDR_EP : constants_1.SANDBOX_ADDR_EP; + this.axiosInstance = axios_1.default.create(__assign({ baseURL: baseURL, timeout: constants_1.TIME_OUT, httpsAgent: httpsAgent }, other)); + this.key = key; + this.secret = secret; + this.passphrase = passphrase; + this.version = version; + } + Request.prototype.setSignatureConfig = function (config) { + if (config === void 0) { config = {}; } + var key = config.key, secret = config.secret, passphrase = config.passphrase; + if (key) { + this.key = key; + } + if (secret) { + this.secret = secret; + } + if (passphrase) { + this.passphrase = passphrase; + } + }; + Request.prototype.signatureRequest = function (url, data, method, config) { + var _this = this; + if (method === void 0) { method = 'GET'; } + if (config === void 0) { config = {}; } + var authUrl = url; + var body = data; + var axiosConfig = __assign({ method: method, url: authUrl }, config); + if (method === 'GET') { + authUrl = + typeof data === 'object' + ? "".concat(url, "?").concat((0, tools_1.makeQueryString)(data)) + : data + ? "".concat(url, "/").concat(data) + : url; + axiosConfig.url = authUrl; + body = ''; + } + else { + if (data) { + axiosConfig.data = data; + body = JSON.stringify(data); + } + } + var headerAuth = (0, exports.apiAuth)({ + method: method, + secret: this.secret, + key: this.key, + passphrase: this.passphrase, + url: authUrl, + version: this.version + }, body); + axiosConfig.headers = headerAuth; + return new Promise(function (resolve, reject) { + _this.axiosInstance(axiosConfig) + .then(function (response) { + resolve(response.data); + }) + .catch(function (err) { + reject(err); + console.log(JSON.stringify(err)); + }); + }); + }; + Request.prototype.requestPublic = function (url, data, method, config) { + var _this = this; + if (method === void 0) { method = 'GET'; } + if (config === void 0) { config = {}; } + var authUrl = url; + var axiosConfig = __assign({ method: method, url: authUrl }, config); + if (method === 'GET') { + authUrl = + typeof data === 'object' + ? "".concat(url, "?").concat((0, tools_1.makeQueryString)(data)) + : data + ? "".concat(url, "/").concat(data) + : url; + axiosConfig.url = authUrl; + } + else { + if (data) { + axiosConfig.data = data; + } + } + return new Promise(function (resolve, reject) { + _this.axiosInstance(axiosConfig) + .then(function (response) { + resolve(response.data); + }) + .catch(function (err) { + reject(err); + console.log(JSON.stringify(err)); + }); + }); + }; + return Request; +}()); +exports.default = Request; diff --git a/lib/tools/tools.d.ts b/lib/tools/tools.d.ts new file mode 100644 index 0000000..c0e66ac --- /dev/null +++ b/lib/tools/tools.d.ts @@ -0,0 +1,32 @@ +/** + * make object query to string + * @param {object} query + */ +export declare const makeQueryString: (query: any) => string; +/** + * filter empty values + * @param obj + * @returns filterObj + */ +export declare const filterEmptyValues: (obj: any) => any; +/** + * make symbol + * @param symbols + * @returns string + */ +export declare const joinSymbol: (symbols: string | any[]) => string | false | any[]; +/** + * Currently there is a limit of 100 parameters, too many parameters need to be divided + * @param arr array + * @param chunkSize number default 90 + * @returns array + */ +export declare const splitArray: (arr: any[], chunkSize?: number) => (string | boolean | any[])[]; +/** + * make sha256 + * @param text string + * @param secret string + * @returns sha256 - base64 + */ +export declare const cryptoHmac: (text?: string, secret?: string) => string; +export declare const log: (d: any) => void; diff --git a/lib/tools/tools.js b/lib/tools/tools.js new file mode 100644 index 0000000..753cca5 --- /dev/null +++ b/lib/tools/tools.js @@ -0,0 +1,83 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.log = exports.cryptoHmac = exports.splitArray = exports.joinSymbol = exports.filterEmptyValues = exports.makeQueryString = void 0; +var omitBy_1 = __importDefault(require("lodash/omitBy")); +var crypto_1 = __importDefault(require("crypto")); +/** + * make object query to string + * @param {object} query + */ +var makeQueryString = function (query) { + return Object.keys(query) + .reduce(function (acc, key) { + if (query[key] !== undefined) { + acc.push("".concat(key, "=").concat(encodeURIComponent(query[key]))); + } + return acc; + }, []) + .join('&'); +}; +exports.makeQueryString = makeQueryString; +/** + * filter empty values + * @param obj + * @returns filterObj + */ +var filterEmptyValues = function (obj) { + if (typeof obj !== 'object') + return obj; + var omitValue = (0, omitBy_1.default)(obj, function (value) { return value === null || value === undefined || value === ''; }); + if (!omitValue || !Object.keys(omitValue).length) + return ''; + return omitValue; +}; +exports.filterEmptyValues = filterEmptyValues; +/** + * make symbol + * @param symbols + * @returns string + */ +var joinSymbol = function (symbols) { + if (!symbols) { + console.log('Required parameter symbol'); + return false; + } + var symbolStr = symbols; + if (Array.isArray(symbols)) { + symbolStr = symbols.join(','); + } + return symbolStr; +}; +exports.joinSymbol = joinSymbol; +/** + * Currently there is a limit of 100 parameters, too many parameters need to be divided + * @param arr array + * @param chunkSize number default 90 + * @returns array + */ +var splitArray = function (arr, chunkSize) { + if (chunkSize === void 0) { chunkSize = 90; } + var result = []; + for (var i = 0; i < arr.length; i += chunkSize) { + result.push((0, exports.joinSymbol)(arr.slice(i, i + chunkSize))); + } + return result; +}; +exports.splitArray = splitArray; +/** + * make sha256 + * @param text string + * @param secret string + * @returns sha256 - base64 + */ +var cryptoHmac = function (text, secret) { + if (text === void 0) { text = ''; } + if (secret === void 0) { secret = ''; } + return crypto_1.default.createHmac('sha256', secret).update(text).digest('base64'); +}; +exports.cryptoHmac = cryptoHmac; +var log = function (d) { return console.log(d); }; +exports.log = log; diff --git a/lib/websocket/constants.d.ts b/lib/websocket/constants.d.ts new file mode 100644 index 0000000..5f60408 --- /dev/null +++ b/lib/websocket/constants.d.ts @@ -0,0 +1,16 @@ +export declare const PUBLIC_BULLET_EP = "/api/v1/bullet-public"; +export declare const PRIVATE_BULLET_EP = "/api/v1/bullet-private"; +export declare const CONNECT_ID = "_futures_socket_welcome"; +export declare const TICKER_V2 = "/contractMarket/tickerV2"; +export declare const TICKER = "/contractMarket/ticker"; +export declare const LEVEL2 = "/contractMarket/level2"; +export declare const LEVEL2_DEPTH5 = "/contractMarket/level2Depth5"; +export declare const LEVEL2_DEPTH50 = "/contractMarket/level2Depth50"; +export declare const INSTRUMENT = "/contract/instrument"; +export declare const ANNOUNCEMENT = "/contract/announcement"; +export declare const SNAPSHOT = "/contractMarket/snapshot"; +export declare const EXECUTION = "/contractMarket/execution"; +export declare const TRADE_ORDERS = "/contractMarket/tradeOrders"; +export declare const ADVANCE_ORDERS = "/contractMarket/advancedOrders"; +export declare const WALLET = "/contractAccount/wallet"; +export declare const POSITION = "/contract/position"; diff --git a/lib/websocket/constants.js b/lib/websocket/constants.js new file mode 100644 index 0000000..1e25c65 --- /dev/null +++ b/lib/websocket/constants.js @@ -0,0 +1,22 @@ +"use strict"; +// Apply for Connection Token +Object.defineProperty(exports, "__esModule", { value: true }); +exports.POSITION = exports.WALLET = exports.ADVANCE_ORDERS = exports.TRADE_ORDERS = exports.EXECUTION = exports.SNAPSHOT = exports.ANNOUNCEMENT = exports.INSTRUMENT = exports.LEVEL2_DEPTH50 = exports.LEVEL2_DEPTH5 = exports.LEVEL2 = exports.TICKER = exports.TICKER_V2 = exports.CONNECT_ID = exports.PRIVATE_BULLET_EP = exports.PUBLIC_BULLET_EP = void 0; +exports.PUBLIC_BULLET_EP = '/api/v1/bullet-public'; +exports.PRIVATE_BULLET_EP = '/api/v1/bullet-private'; +exports.CONNECT_ID = '_futures_socket_welcome'; +// public socket topic +exports.TICKER_V2 = '/contractMarket/tickerV2'; +exports.TICKER = '/contractMarket/ticker'; +exports.LEVEL2 = '/contractMarket/level2'; +exports.LEVEL2_DEPTH5 = '/contractMarket/level2Depth5'; +exports.LEVEL2_DEPTH50 = '/contractMarket/level2Depth50'; +exports.INSTRUMENT = '/contract/instrument'; +exports.ANNOUNCEMENT = '/contract/announcement'; +exports.SNAPSHOT = '/contractMarket/snapshot'; +exports.EXECUTION = '/contractMarket/execution'; +// private socket topic +exports.TRADE_ORDERS = '/contractMarket/tradeOrders'; +exports.ADVANCE_ORDERS = '/contractMarket/advancedOrders'; +exports.WALLET = '/contractAccount/wallet'; +exports.POSITION = '/contract/position'; diff --git a/lib/websocket/index.d.ts b/lib/websocket/index.d.ts new file mode 100644 index 0000000..a04c662 --- /dev/null +++ b/lib/websocket/index.d.ts @@ -0,0 +1,3 @@ +import WebSocketClient from './socket'; +export * from './constants'; +export { WebSocketClient }; diff --git a/lib/websocket/index.js b/lib/websocket/index.js new file mode 100644 index 0000000..f375248 --- /dev/null +++ b/lib/websocket/index.js @@ -0,0 +1,23 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WebSocketClient = void 0; +var socket_1 = __importDefault(require("./socket")); +exports.WebSocketClient = socket_1.default; +__exportStar(require("./constants"), exports); diff --git a/lib/websocket/socket.d.ts b/lib/websocket/socket.d.ts new file mode 100644 index 0000000..e5681f2 --- /dev/null +++ b/lib/websocket/socket.d.ts @@ -0,0 +1,28 @@ +import WebSocket from 'ws'; +import { Subscription, Callback } from '../dataType/socket'; +export default class WebSocketClient { + private ws; + private _url; + private alive; + private messageHandler; + private heartbeatInterval; + private pingTimeout; + subscriptions: Subscription[]; + constructor(url: string, websocket: WebSocket); + generateId(): string; + getPrefixTopic(topic: string): string; + socketSend(data: object): void; + setupWebSocket(): void; + startHeartbeat(): void; + stopHeartbeat(): void; + startPing(): void; + stopPing(): void; + resetPingTimeout(): void; + resubscribe(): void; + handleMessage(message: any): void; + patchAllMessage(): void; + getConnectionState(): number; + subscribe(topic: string, callback: Callback, privateChannel?: boolean, strict?: boolean): Function; + unsubscribe(topic: string, id: string): void; + reconnect(): void; +} diff --git a/lib/websocket/socket.js b/lib/websocket/socket.js new file mode 100644 index 0000000..603a870 --- /dev/null +++ b/lib/websocket/socket.js @@ -0,0 +1,209 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ws_1 = __importDefault(require("ws")); +var lodash_1 = require("lodash"); +var WebSocketClient = /** @class */ (function () { + function WebSocketClient(url, websocket) { + this.alive = false; + this.messageHandler = []; + this.heartbeatInterval = null; + this.pingTimeout = null; + this.subscriptions = []; + this.ws = websocket; + this._url = url; + this.setupWebSocket(); + } + WebSocketClient.prototype.generateId = function () { + return ('_futures_' + Date.now() + (Math.random() * 365).toString(16).slice(4, 14)); + }; + WebSocketClient.prototype.getPrefixTopic = function (topic) { + if (!topic) + return ''; + return topic.split(':')[0]; + }; + WebSocketClient.prototype.socketSend = function (data) { + var params = JSON.stringify(data); + console.log('socket send --->', params); + this.ws.send(params); + }; + WebSocketClient.prototype.setupWebSocket = function () { + var _this = this; + this.ws.on('open', function () { + console.log('WebSocket connected'); + _this.alive = true; + _this.startHeartbeat(); + _this.startPing(); + _this.resubscribe(); + _this.patchAllMessage(); + }); + this.ws.on('message', function (data) { + var message = JSON.parse(data.toString()); + if (message) { + switch (message.type) { + case 'welcome': + case 'ack': + console.log('socket message --->', message); + break; + case 'pong': + console.log('socket message --->', message); + _this.stopPing(); + break; + default: + _this.handleMessage(message); + } + } + }); + this.ws.on('close', function () { + console.log('WebSocket disconnected'); + _this.alive = false; + _this.stopHeartbeat(); + _this.stopPing(); + _this.reconnect(); + }); + this.ws.on('error', function (error) { + _this.alive = false; + console.error('WebSocket error:', error); + }); + }; + // Send ping messages every 59s + WebSocketClient.prototype.startHeartbeat = function () { + var _this = this; + if (this.heartbeatInterval) { + clearInterval(this.heartbeatInterval); + } + this.heartbeatInterval = setInterval(function () { + _this.resetPingTimeout(); + _this.socketSend({ id: _this.generateId(), type: 'ping' }); + }, 59000); + }; + // Stop ping message + WebSocketClient.prototype.stopHeartbeat = function () { + if (this.heartbeatInterval) { + clearInterval(this.heartbeatInterval); + this.heartbeatInterval = null; + } + }; + // Init Send ping message + WebSocketClient.prototype.startPing = function () { + this.resetPingTimeout(); + this.socketSend({ id: this.generateId(), type: 'ping' }); + }; + // Clear ping timeout + WebSocketClient.prototype.stopPing = function () { + if (this.pingTimeout) { + clearTimeout(this.pingTimeout); + this.pingTimeout = null; + } + }; + // Reset Ping timeout + WebSocketClient.prototype.resetPingTimeout = function () { + var _this = this; + if (this.pingTimeout) { + clearTimeout(this.pingTimeout); + } + this.pingTimeout = setTimeout(function () { + console.log('No pong received within 10 seconds, disconnecting...'); + _this.ws.terminate(); + }, 10000); + }; + // resubscribe + WebSocketClient.prototype.resubscribe = function () { + var _this = this; + this.subscriptions.forEach(function (_a) { + var id = _a.id, topic = _a.topic, privateChannel = _a.privateChannel; + _this.socketSend({ + id: id, + type: 'subscribe', + topic: topic, + privateChannel: privateChannel, + response: true + }); + }); + }; + WebSocketClient.prototype.handleMessage = function (message) { + var _this = this; + this.subscriptions.forEach(function (_a) { + var topic = _a.topic, callback = _a.callback, strict = _a.strict; + if (strict) { + if (topic === message.topic) { + callback(message); + } + } + else { + if (_this.getPrefixTopic(topic) === _this.getPrefixTopic(message.topic)) { + callback(message); + } + } + }); + }; + // When sending a message to the socket channel, + // the socket may not be connected at this time, + // it needs to be saved, wait for the connection to be established, + // and trigger the message in messageHandler + WebSocketClient.prototype.patchAllMessage = function () { + var _this = this; + var sendMessages = (0, lodash_1.uniqWith)(this.messageHandler, lodash_1.isEqual); + (0, lodash_1.forEach)(sendMessages, function (sendMessage) { + _this.socketSend(sendMessage); + _this.messageHandler = _this.messageHandler.filter(function (item) { return !(0, lodash_1.isEqual)(sendMessage, item); }); + }); + }; + WebSocketClient.prototype.getConnectionState = function () { + return this.ws.readyState; + }; + WebSocketClient.prototype.subscribe = function (topic, callback, privateChannel, strict) { + var _this = this; + if (privateChannel === void 0) { privateChannel = false; } + if (strict === void 0) { strict = true; } + var _id = this.generateId(); + this.subscriptions.push({ + id: _id, + topic: topic, + privateChannel: privateChannel, + callback: callback, + strict: strict + }); + return function () { return _this.unsubscribe(topic, _id); }; + }; + WebSocketClient.prototype.unsubscribe = function (topic, id) { + var currentTopic = this.subscriptions.find(function (subscription) { + if (id) + return subscription.topic === topic && subscription.id === id; + return subscription.topic === topic; + }); + if (currentTopic) { + var sendMessage = { + id: this.generateId(), + type: 'unsubscribe', + topic: topic, + privateChannel: currentTopic.privateChannel, + response: true + }; + if (this.alive) { + this.socketSend(sendMessage); + } + else { + this.messageHandler.push(sendMessage); + } + } + this.subscriptions = this.subscriptions.filter(function (subscription) { + if (id) + return !(subscription.topic === topic && subscription.id === id); + return subscription.topic !== topic; + }); + }; + // reconnect WebSocket + WebSocketClient.prototype.reconnect = function () { + var _this = this; + console.log('Attempting to reconnect...'); + setTimeout(function () { + _this.ws = new ws_1.default(_this._url); + _this.setupWebSocket(); + }, 5000); + }; + return WebSocketClient; +}()); +exports.default = WebSocketClient; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..abba6bd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3532 @@ +{ + "name": "kucoin-futures-node-sdk", + "version": "2.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject%2fremapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fcode-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.5" + } + }, + "@babel/compat-data": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fcompat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "dev": true + }, + "@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fcore/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fgenerator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhelpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fhighlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fparser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha1-TJpvZp9dDN8bkKFnHpoUa+UwDOo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha1-7mATSMNw+jNNIge+FYd3SWUh/VE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2fplugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2ftemplate/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/traverse": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2ftraverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel%2ftypes/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe%2fv8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha1-daLotRy3WKdVPWgEpZMteqznXDk=", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs%2fload-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha1-/T2x1Z7PfPEh6AZQu4ZxL5tV7O0=", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs%2fschema/-/schema-0.1.3.tgz", + "integrity": "sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg=", + "dev": true + }, + "@jest/console": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2fconsole/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2fcore/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "dev": true, + "requires": { + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2fenvironment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + } + }, + "@jest/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2fexpect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "dev": true, + "requires": { + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + } + }, + "@jest/expect-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2fexpect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "dev": true, + "requires": { + "jest-get-type": "^29.4.3" + } + }, + "@jest/fake-timers": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2ffake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + } + }, + "@jest/globals": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2fglobals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" + } + }, + "@jest/reporters": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2freporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + } + }, + "@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest%2fschemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.25.16" + } + }, + "@jest/source-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest%2fsource-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2ftest-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "dev": true, + "requires": { + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2ftest-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "dev": true, + "requires": { + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2ftransform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + } + }, + "@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest%2ftypes/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dev": true, + "requires": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell%2fgen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell%2fresolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell%2fset-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell%2fsourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell%2ftrace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell%2fsourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair%2ftypebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "dev": true + }, + "@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs%2fcommons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs%2ffake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.0" + } + }, + "@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types%2fbabel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types%2fbabel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types%2fbabel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha1-PRpI/Z1sDt/Vby/1eNrtSPNsiWk=", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types%2fbabel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types%2feslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha1-HuMNeVRMqE1o1LPNsK9PIFZj3S0=", + "dev": true + }, + "@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types%2fgraceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types%2fistanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types%2fistanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha1-wUwk8Y6oGQwRjudWK3/5mjZVJoY=", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types%2fistanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha1-kVP+mLuivVZaY63ZQ21vDX+EaP8=", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.5.2", + "resolved": "https://registry.npmjs.org/@types%2fjest/-/jest-29.5.2.tgz", + "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types%2fjson-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.155", + "resolved": "https://registry.npmjs.org/@types%2flodash/-/lodash-4.14.155.tgz", + "integrity": "sha1-4rRRT0aiYf0RVC5HUZwg6857wjo=", + "dev": true + }, + "@types/node": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@types%2fnode/-/node-14.0.4.tgz", + "integrity": "sha1-Q6Y/xe3OImvtEGsxuHUWUlYnEQc=", + "dev": true + }, + "@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types%2fprettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types%2fstack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha1-IPGClPeX8iCbX2XI47XI6CYdEnw=", + "dev": true + }, + "@types/uuid": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types%2fuuid/-/uuid-9.0.2.tgz", + "integrity": "sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ==", + "dev": true + }, + "@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types%2fws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types%2fyargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types%2fyargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint%2feslint-plugin/-/eslint-plugin-3.3.0.tgz", + "integrity": "sha1-iVGOXFIJo0m94WHDSJsOwYeuXTc=", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "3.3.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint%2fexperimental-utils/-/experimental-utils-3.3.0.tgz", + "integrity": "sha1-1yqUbgVqg9Tt+X80EczrY5sLjIc=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "3.3.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint%2fparser/-/parser-3.3.0.tgz", + "integrity": "sha1-/K5AAS3tgiqosnOaGgOk48W7t7s=", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.3.0", + "@typescript-eslint/typescript-estree": "3.3.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint%2ftypescript-estree/-/typescript-estree-3.3.0.tgz", + "integrity": "sha1-hB/+0lwpsASev/tMIHEmijRViio=", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "babel-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "dev": true, + "requires": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001507", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz", + "integrity": "sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "electron-to-chromium": { + "version": "1.4.440", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", + "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==", + "dev": true + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.2.0.tgz", + "integrity": "sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.0.0", + "eslint-visitor-keys": "^1.2.0", + "espree": "^7.1.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "dev": true, + "requires": { + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, + "dependencies": { + "jest-cli": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "dev": true, + "requires": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + } + } + }, + "jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, + "jest-circus": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "dev": true, + "requires": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, + "jest-config": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + } + }, + "jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" + } + }, + "jest-environment-node": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "dev": true, + "requires": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + } + }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + }, + "jest-haste-map": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "dev": true, + "requires": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + } + }, + "jest-matcher-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + } + }, + "jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true + }, + "jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true + }, + "jest-resolve": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "dev": true, + "requires": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + } + }, + "jest-runner": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "dev": true, + "requires": { + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, + "jest-runtime": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "dev": true, + "requires": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + } + }, + "jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "dev": true, + "requires": { + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-releases": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "resolve": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", + "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", + "dev": true, + "requires": { + "is-core-module": "^2.12.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-jest": { + "version": "29.1.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", + "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + } + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json index fe1fcae..30b2c08 100644 --- a/package.json +++ b/package.json @@ -1,54 +1,34 @@ { "name": "kucoin-futures-node-sdk", - "version": "1.0.3", + "version": "2.0.0", "description": "KuCoin Futures API SDK for Node.js language", - "repository": { - "type": "git", - "url": "git@github.com:Kucoin/kucoin-futures-node-sdk.git" - }, - "main": "sdk/index.js", - "files": [ - "sdk", - "README.md" - ], + "main": "lib/index.js", + "license": "MIT", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "dev": "PRODUCTION=false nodemon src/start.js", - "prod": "PRODUCTION=true node src/start.js", - "build": "./node_modules/.bin/babel src --out-dir sdk && rm -f sdk/start.js" + "start": "./node_modules/typescript/bin/tsc --watch", + "build": "./node_modules/typescript/bin/tsc", + "example": "node example/index.js", + "eslint": "eslint ./src/*.ts --ext .tsx", + "test": "jest --coverage" }, - "author": "", - "license": "ISC", "dependencies": { - "babel-preset-es2015": "^6.24.1", - "decimal.js": "^10.2.0", - "dot-prop": "^4.2.1", - "event-emitter": "^0.3.5", - "koa": "^2.8.1", - "koa-bodyparser": "^4.2.1", - "lodash": "^4.17.19", - "log-update": "^3.3.0", - "log4js": "^5.1.0", - "moment": "^2.24.0", - "qs": "^6.9.0", - "querystring": "^0.2.0", - "request": "^2.88.0", - "socket.io": "^2.2.0", - "socket.io-client": "^2.2.0", - "socket.io-msgpack-parser": "^2.2.0", - "uuid": "^3.3.3", - "ws": "^7.1.2" + "axios": "1.4.0", + "lodash": "4.17.21", + "uuid": "9.0.0", + "ws": "8.13.0" }, "devDependencies": { - "babel-cli": "^6.26.0", - "babel-core": "^6.26.3", - "babel-plugin-add-module-exports": "^1.0.2", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators-legacy": "^1.3.5", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-preset-env": "^1.7.0", - "babel-register": "^6.26.0", - "nodemon": "^1.19.2" + "@types/jest": "^29.5.2", + "@types/lodash": "^4.14.152", + "@types/node": "^14.0.4", + "@types/uuid": "^9.0.1", + "@types/ws": "^8.5.5", + "@typescript-eslint/eslint-plugin": "^3.0.0", + "@typescript-eslint/parser": "^3.0.0", + "eslint": "^7.0.0", + "jest": "^29.5.0", + "prettier": "^2.0.5", + "ts-jest": "^29.1.0", + "typescript": "^5.1.3" } } diff --git a/pm2.tpl.json b/pm2.tpl.json deleted file mode 100644 index 0633564..0000000 --- a/pm2.tpl.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "strategy", - "script": "/usr/bin/node", - "args": [ - "src/start.js", - "template" - ], - "env": { - "PRODUCTION": true - }, - "exec_interpreter": "", - "exec_mode": "fork" -} \ No newline at end of file diff --git a/sdk_example/level2-book.js b/sdk_example/level2-book.js deleted file mode 100644 index 3fa027d..0000000 --- a/sdk_example/level2-book.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * An example sdk level2 test - */ -// default is sandbox if _USE_KUMEX_ONLINE_ is false or not set -global._USE_KUMEX_ONLINE_ = true; - -// set env configure -const { setEnv, getEnv } = require('../sdk/lib/env'); -console.log('set env', setEnv); -setEnv({ - log: { - writeFile: true, - stdout: false, - test: 123, - }, -}); -console.log('get env', getEnv()); - -// require deps -const _ = require('lodash'); -const logUpdate = require('log-update'); -const http = require('../sdk/lib/http'); -const Level2 = require('../sdk/com/level2'); - -const SYMBOL = 'XBTUSDM'; - -async function main() { - // set account api keys - http.setSignatureConfig(getEnv()); - - const l2 = new Level2(SYMBOL); - l2.listen(); - - const interval = setInterval(async () => { - // read orderbook - const orderbook = l2.getOrderBook(5); - - // show Level2 - let asksStr = ''; - _.eachRight(orderbook.asks, ([price, size]) => { - asksStr += `${price} -> ${size}\n`; - }); - - let bidsStr = ''; - _.each(orderbook.bids, ([price, size]) => { - bidsStr += `${price} -> ${size}\n`; - }); - - logUpdate.clear(); - logUpdate(`------------------------\n` + - `l2 ${orderbook.dirty ? 'Dirty Data' : 'Trust Data'}\n` + - `l2 seq: ${orderbook.sequence}\n` + - `ping: ${orderbook.ping} (ms)\n` + - `------------------------\n` + - `${asksStr}----------sep-----------\n` + - `${bidsStr}------------------------` - ); - }, 200); -} - -main(); diff --git a/src/com/account.js b/src/com/account.js deleted file mode 100644 index 272e9e6..0000000 --- a/src/com/account.js +++ /dev/null @@ -1,37 +0,0 @@ - -import http from '../lib/http'; -import log from '../lib/log'; - -class Account { - - // TODO update by websocket - - getOverview = async () => { - // GET /api/v1/account-overview - let result = false; - - try { - /* - { - "code": "200000", - "data": { - "accountEquity": 99.8999305281, //账户权益 - "unrealisedPNL": 0, //未实现盈亏 - "marginBalance": 99.8999305281, //保证金余额 - "positionMargin": 0, //仓位保证金 - "orderMargin": 0, //委托保证金 - "frozenFunds": 0, //转出提现冻结 - "availableBalance": 99.8999305281 //可用余额 - } - } - */ - const { data } = await http.get('/api/v1/account-overview'); - result = data; - } catch (e) { - log('get account overview error', e); - } - return result; - } -} - -export default Account; \ No newline at end of file diff --git a/src/com/contract.js b/src/com/contract.js deleted file mode 100644 index 9bc86df..0000000 --- a/src/com/contract.js +++ /dev/null @@ -1,86 +0,0 @@ -// https://kitchen.kumex.top/web-front/contracts/XBTUSDM - - -import http from '../lib/http'; -import log from '../lib/log'; - -const IS_PRODUCT = global._USE_KUMEX_ONLINE_ || process.env.PRODUCTION === 'true'; -const baseUrl = IS_PRODUCT ? 'https://kitchen.kumex.top' : 'https://kitchen-sdb.kumex.com'; - -class Contract { - symbol; - - constructor(symbol) { - this.symbol = symbol; - } - - getOverview = async () => { - let result = false; - - try { - /* - { - "success": true, - "code": "200", - "msg": "success", - "retry": false, - "data": { - "symbol": "XBTUSDM", - "rootSymbol": "XBT", - "type": "FFWCSX", - "firstOpenDate": 1552638575000, - "expireDate": null, - "settleDate": null, - "baseCurrency": "XBT", - "quoteCurrency": "USD", - "settleCurrency": "XBT", - "maxOrderQty": 1000000, - "maxPrice": 1000000.0000000000, - "lotSize": 1, - "tickSize": 1.0, - "multiplier": -1.0, - "initialMargin": 0.01, - "maintainMargin": 0.005, - "maxRiskLimit": 200, - "minRiskLimit": 200, - "riskStep": 100, - "makerFeeRate": -2.5E-4, - "takerFeeRate": 6.0E-4, - "takerFixFee": 0.0000000000, - "makerFixFee": 0.0000000000, - "settlementFee": 0.0, - "isDeleverage": true, - "isQuanto": false, - "isInverse": true, - "markMethod": "FairPrice", - "fairMethod": "FundingRate", - "fundingBaseSymbol": ".XBTINT8H", - "fundingQuoteSymbol": ".USDINT8H", - "fundingRateSymbol": ".XBTUSDMFPI8H", - "indexSymbol": ".BXBT", - "status": "Open", - "fundingFeeRate": 0.000100, // 资金费率 - "predictedFundingFeeRate": 0.000100, // 预测资金费率 - "openInterest": "2747590", - "turnoverOf24h": 570.10756506, - "volumeOf24h": 4651337.00000000, - "markPrice": 8112.62, - "indexPrice": 8111.96, - "lastTradePrice": 8102.0000000000, - "nextFundingRateTime": 23531767 // 距离下一个资金费用结算时间点的剩余时间 - } - } - */ - const { data } = await http._request({ - url: `${baseUrl}/web-front/contracts/${this.symbol}`, - method: 'GET', - }); - result = data; - } catch (e) { - log('get contract overview error', e); - } - return result; - } -} - -export default Contract; \ No newline at end of file diff --git a/src/com/fee.js b/src/com/fee.js deleted file mode 100644 index 3e9782e..0000000 --- a/src/com/fee.js +++ /dev/null @@ -1,75 +0,0 @@ - -import http from '../lib/http'; -import log from '../lib/log'; - -class Fee { - symbol; - - constructor(symbol) { - this.symbol = symbol; - } - - getFundingHistory = async (params = {}) => { - // GET /api/v1/funding-history - let result = false; - - try { - /* - data: { - "dataList": [ - { - "id": 36275152660006, //id - "symbol": "XBTUSDM", //合约symbol - "timePoint": 1557918000000, //时间点(毫秒) - "fundingRate": 0.000013, //资金费率 - "markPrice": 8058.27, //标记价格 - "positionQty": 10, //结算时的仓位数 - "positionCost": -0.001241, //结算时的仓位价值 - "funding": -0.00000464 //结算的资金费用,正数表示收入;负数表示支出 - }, - { - "id": 36275152660004, - "symbol": "XBTUSDM", - "timePoint": 1557914400000, - "fundingRate": 0.00375, - "markPrice": 8079.65, - "positionQty": 10, - "positionCost": -0.0012377, - "funding": -0.00000465 - }, - { - "id": 36275152660002, - "symbol": "XBTUSDM", - "timePoint": 1557910800000, - "fundingRate": 0.00375, - "markPrice": 7889.03, - "positionQty": 10, - "positionCost": -0.0012676, - "funding": -0.00000476 - } - ], - "hasMore": true // 是否还有下一页 - } - 参数 数据类型 含义 - symbol String 合约symbol - - startAt long [可选] 开始时间(毫秒) - endAt long [可选] 截止时间(毫秒) - reverse boolean [可选] 是否逆序查询, true 或者 false,默认为true - offset long [可选] 起始偏移量,一般使用上个请求最后一条返回结果的唯一属性,默认返回第一页 - forward boolean [可选] 是否前向查询,true或者false,默认为true - maxCount int [可选] 最大记录条数,默认为10 - */ - const { data } = await http.get('/api/v1/funding-history', { - ...params, - symbol: this.symbol, - }); - result = data; - } catch (e) { - log('get funding-history error', e); - } - return result; - } -} - -export default Fee; \ No newline at end of file diff --git a/src/com/level2.js b/src/com/level2.js deleted file mode 100644 index 90f35ee..0000000 --- a/src/com/level2.js +++ /dev/null @@ -1,205 +0,0 @@ -import _ from 'lodash'; -import Datafeed from '../lib/datafeed'; -import http from '../lib/http'; -import log from '../lib/log'; -import delay from '../lib/delay'; -import { - mergeDepth, - checkContinue, - mapArr, - arrMap, - targetTypesMap, -} from '../lib/utils'; - -const changeTypes = ['asks', 'bids']; - -class Level2 { - datafeed; - symbol; - buffer = []; - fullSnapshot = { - dirty: true, - sequence: 0, - asks: {}, - bids: {}, - }; - messageEventCallback; - - constructor(symbol, datafeed) { - this.symbol = symbol; - - if (datafeed instanceof Datafeed) { - this.datafeed = datafeed; - } else { - this.datafeed = new Datafeed(); - } - } - - bufferMessage = (message) => { - const { sequence, change } = message || {}; - if (sequence && change) { - const [price, type, size] = change.split(','); - const seq = this.fullSnapshot.sequence; - // log('check', sequence, seq); - const messageFormat = [sequence, price, type, size]; - if (this.fullSnapshot.dirty === false && sequence === seq + 1) { - // update - this.updateFullByMessage(messageFormat); - } else - if (sequence > seq) { - this.buffer.push(messageFormat); - // rebuild - this.rebuild(); - } - } - } - - getFilteredBuffer = (seq) => { - return this.buffer.filter((item) => { - return item[0] > seq; - }); - } - - _rebuilding = false; - rebuild = async () => { - if (this._rebuilding) { - log('rebuilding dirty level2, return', - this.fullSnapshot.sequence, - this.buffer.length && this.buffer[this.buffer.length - 1][0], - ); - return; - } - log('build dirty level2'); - this._rebuilding = true; - this.fullSnapshot.dirty = true; - - await delay(6100); - const fetchSuccess = await this.fetch(); - const seq = this.fullSnapshot.sequence; - - if (fetchSuccess && this.datafeed.trustConnected) { - const bufferArr = this.getFilteredBuffer(seq); - - // if (bufferArr.length === 0 && this.buffer.length > 0) { - // console.log('snapshot before', seq, this.buffer[this.buffer.length - 1][0]); - // } - - if (bufferArr.length > 0 || - (bufferArr.length === 0 && this.buffer.length === 0) || - (bufferArr.length === 0 && (seq === this.buffer[this.buffer.length - 1][0])) - ) { - const continu = checkContinue(bufferArr, seq); - if (continu) { - log('seq & len', this.fullSnapshot.sequence, bufferArr.length, this.buffer.length); - _.each(bufferArr, (item) => { - // update - this.updateFullByMessage(item); - }); - this.fullSnapshot.dirty = false; - this.buffer = []; - log('level2 checked'); - } else { - log('level2 buffer is not continue with snapshot'); - } - } - } - this._rebuilding = false; - } - - fetch = async () => { - /* - { - code: '200000', - data: { - symbol: 'XBTUSDM', - sequence: 75017803, - asks: [], - bids: [], - } - } - */ - let fetchSuccess = false; - try { - const result = await http.get(`/api/v1/level2/snapshot?symbol=${this.symbol}`); - if (result.code === '200000' && - result.data && - result.data.symbol === this.symbol - ) { - const { sequence, asks, bids } = result.data; - - this.fullSnapshot.dirty = true; - this.fullSnapshot.sequence = sequence; - this.fullSnapshot.asks = mapArr(asks, (str) => mergeDepth(str, 'asks')); - this.fullSnapshot.bids = mapArr(bids, (str) => mergeDepth(str, 'bids')); - fetchSuccess = true; - } - } catch (e) { - log('fetch level2 error', e); - } - return fetchSuccess; - } - - updateFullByMessage = (message) => { - const [sequence, price, type, size] = message; - const targetType = targetTypesMap[type]; - if (_.indexOf(changeTypes, targetType) > -1) { - const targetPrice = mergeDepth(price, targetType); - if (size == 0) { - delete this.fullSnapshot[targetType][targetPrice]; - } else { - this.fullSnapshot[targetType][targetPrice] = size; - } - this.fullSnapshot.sequence = sequence; - - // callback message - if (typeof this.messageEventCallback === 'function') { - this.messageEventCallback(message); - } - } else { - log('invalid change type', type); - } - } - - /** public */ - listen = () => { - this.datafeed.connectSocket(); - this.datafeed.onClose(() => { - log('ws closed, status ', this.datafeed.trustConnected); - this.rebuild(); - }); - - const topic = `/contractMarket/level2:${this.symbol}`; - this.datafeed.subscribe(topic, (message) => { - if (message.topic === topic) { - // log(message.data); - this.bufferMessage(message.data); - } - }); - this.rebuild(); - } - - // message event handler - handleMessageEvent = (callback) => { - if (typeof callback === 'function') { - this.messageEventCallback = callback; - } - } - - getOrderBook = (limit = 10) => { - const dirty = this.fullSnapshot.dirty; - const sequence = this.fullSnapshot.sequence; - const asks = arrMap(this.fullSnapshot.asks, 'asc').slice(0, limit); - const bids = arrMap(this.fullSnapshot.bids, 'desc').slice(0, limit); - const ping = this.datafeed.ping; - - return { - dirty, - sequence, - asks, - bids, - ping, - }; - } -} - -export default Level2; \ No newline at end of file diff --git a/src/com/level3.js b/src/com/level3.js deleted file mode 100644 index 20d9884..0000000 --- a/src/com/level3.js +++ /dev/null @@ -1,365 +0,0 @@ -import _ from 'lodash'; -import Datafeed from '../lib/datafeed'; -import http from '../lib/http'; -import log from '../lib/log'; -import delay from '../lib/delay'; -import { - mergeDepth, - checkContinue, - mapl3Arr, - arrMap, - arrl3Map, - targetTypesMap, -} from '../lib/utils'; - -const changeTypes = ['asks', 'bids']; - -class Level3 { - datafeed; - symbol; - buffer = []; - fullSnapshot = { - dirty: true, - sequence: 0, - asks: {}, // price => orderId => item - bids: {}, - }; - messageEventCallback; - - constructor(symbol, datafeed) { - this.symbol = symbol; - - if (datafeed instanceof Datafeed) { - this.datafeed = datafeed; - } else { - this.datafeed = new Datafeed(); - } - } - - bufferMessage = (message) => { - const { sequence, type } = message || {}; - if (sequence && type) { - const seq = this.fullSnapshot.sequence; - // log('check', sequence, seq); - if (this.fullSnapshot.dirty === false && sequence === seq + 1) { - // update - this.updateFullByMessage(message); - } else - if (sequence > seq) { - this.buffer.push(message); - // rebuild - this.rebuild(); - } - } - } - - getFilteredBuffer = (seq) => { - return this.buffer.filter((item) => { - return item.sequence > seq; - }); - } - - _rebuilding = false; - rebuild = async () => { - if (this._rebuilding) { - log('rebuilding dirty level3, return', - this.fullSnapshot.sequence, - this.buffer.length && this.buffer[this.buffer.length - 1].sequence, - ); - return; - } - log('build dirty level3'); - this._rebuilding = true; - this.fullSnapshot.dirty = true; - - await delay(6100); - const fetchSuccess = await this.fetch(); - const seq = this.fullSnapshot.sequence; - - if (fetchSuccess && this.datafeed.trustConnected) { - const bufferArr = this.getFilteredBuffer(seq); - - // if (bufferArr.length === 0 && this.buffer.length > 0) { - // console.log('snapshot before', seq, this.buffer[this.buffer.length - 1].sequence); - // } - - if (bufferArr.length > 0 || - (bufferArr.length === 0 && this.buffer.length === 0) || - (bufferArr.length === 0 && (seq === this.buffer[this.buffer.length - 1].sequence)) - ) { - const continu = checkContinue(bufferArr, seq, 'sequence'); - if (continu) { - log('seq & len', this.fullSnapshot.sequence, bufferArr.length, this.buffer.length); - _.each(bufferArr, (message) => { - // update - this.updateFullByMessage(message); - }); - this.fullSnapshot.dirty = false; - this.buffer = []; - log('level3 checked'); - } else { - log('level3 buffer is not continue with snapshot'); - } - } - } - this._rebuilding = false; - } - - fetch = async () => { - /* - { - code: '200000', - data: { - symbol: 'XBTUSDM', - sequence: 75017803, - asks: [], - bids: [], - } - } - */ - let fetchSuccess = false; - try { - const result = await http.get(`/api/v1/level3/snapshot?symbol=${this.symbol}`); - if (result.code === '200000' && - result.data && - result.data.symbol === this.symbol - ) { - const { sequence, asks, bids } = result.data; - - this.fullSnapshot.dirty = true; - this.fullSnapshot.sequence = sequence; - // [下单时间 - 纳秒, 订单号, 价格, 数量, 进入买卖盘时间 - 纳秒] - this.fullSnapshot.asks = mapl3Arr(asks); - this.fullSnapshot.bids = mapl3Arr(bids); - fetchSuccess = true; - } - } catch (e) { - log('fetch level3 error', e); - } - return fetchSuccess; - } - - updateFullByMessage = (message) => { - const { sequence, type } = message; - - let updated = true; - switch (type) { - case 'received': - /* - "symbol": "XBTUSDM", // 合约 - "sequence": 3262786900, // 顺序号 - "type": "received", - "orderId": "5c0b520032eba53a888fd02x", // 订单号 - "clientOid": "ad123ad" // 可选,用于用户鉴别自己的订单 - */ - { - // received event - } - break; - case 'open': - /* - "symbol": "XBTUSDM", // 合约 - "sequence": 3262786900, // 顺序号 - "type": "open", - "orderId": "5c0b520032eba53a888fd02x", // 订单号 - "price": 3634.5, // 委托价格 - "size": 10, // 委托数量 - "side": "buy", // 委托方向 - "orderTime": 1547697294838004923, // 下单时间 - "ts": 1547697294838004923, // 进入买卖盘时间 - "clientOid": "ad123ad" // 可选,用于用户鉴别自己的订单 - */ - { - // open event - const { side, orderId, price, size, orderTime, ts } = message; - const targetType = targetTypesMap[side]; - if (_.indexOf(changeTypes, targetType) > -1) { - this.fullSnapshot[targetType][orderId] = [ - // [0 , 1 , 2 , 3 , 4] - // [下单时间, 订单号, 价格, 数量, 进入买卖盘时间] - orderTime, orderId, price, size, ts - ]; - } - } - break; - case 'match': - /* - "symbol": "XBTUSDM", // 合约 - "sequence": 3262786901, // 顺序号 - "type": "match", - "tradeId": "6c23b5454353a8882d023b3o", // 交易号 - "takerOrderId": "5c0b520032eba53a888fd01f", // taker订单号 - "makerOrderId": "5c0b520032eba53a888fd01e", // maker订单号 - "price": 3634, // 成交价格 - "matchSize": 20, // 成交数量 - "size": 10, // 订单剩余数量 - "side": "buy", // taker的方向 - "ts": 1547697294838004923 // 成交时间 - 纳秒 - */ - { - // match event - const { side, makerOrderId, size } = message; - const targetType = targetTypesMap[side]; - if (_.indexOf(changeTypes, targetType) > -1) { - if (this.fullSnapshot[targetType][makerOrderId]) { - if (size <= 0) { - delete this.fullSnapshot[targetType][makerOrderId]; - } else { - this.fullSnapshot[targetType][makerOrderId][3] = size; - } - } - } - } - break; - case 'update': - /* - "symbol": "XBTUSDM", // 合约 - "sequence": 3262786897, // 顺序号 - "type": "update", - "orderId": "5c0b520032eba53a888fd01f", // 订单号 - "price": 3634, // 委托价格 - "size": 100, // 改变后数量 - "oldSize": 20, // 改变前大小 - "ts": 1547697294838004923 // 更新时间 - 纳秒 - */ - { - // update event - const { orderId, size } = message; - if (this.fullSnapshot.asks[orderId]) { - if (size <= 0) { - delete this.fullSnapshot.asks[orderId]; - } else { - this.fullSnapshot.asks[orderId][3] = size; - } - } - if (this.fullSnapshot.bids[orderId]) { - if (size <= 0) { - delete this.fullSnapshot.bids[orderId]; - } else { - this.fullSnapshot.bids[orderId][3] = size; - } - } - } - break; - case 'done': - /* - "symbol": "XBTUSDM", // 合约 - "sequence": 3262786901, // 顺序号 - "type": "done", - "orderId": "5c0b520032eba53a888fd02x", // 订单号 - "reason": "filled", // filled or canceled - "ts": 1547697294838004923, // 完成时间 - "clientOid": "ad123ad" // 可选,用于用户鉴别自己的订单 - */ - { - // done event - const { orderId } = message; - if (this.fullSnapshot.asks[orderId]) { - delete this.fullSnapshot.asks[orderId]; - } - if (this.fullSnapshot.bids[orderId]) { - delete this.fullSnapshot.bids[orderId]; - } - } - break; - default: - { - log('invalid l3 type', type); - updated = false; - } - break; - } - - if (updated) { - this.fullSnapshot.sequence = sequence; - - // callback message - if (typeof this.messageEventCallback === 'function') { - this.messageEventCallback(message); - } - } - } - - /** public */ - listen = () => { - this.datafeed.connectSocket(); - this.datafeed.onClose(() => { - log('ws closed, status ', this.datafeed.trustConnected); - this.rebuild(); - }); - - const topic = `/contractMarket/level3:${this.symbol}`; - this.datafeed.subscribe(topic, (message) => { - if (message.topic === topic) { - // log(message); - this.bufferMessage(message.data); - } - }); - this.rebuild(); - } - - // message event handler - handleMessageEvent = (callback) => { - if (typeof callback === 'function') { - this.messageEventCallback = callback; - } - } - - // get detail order book - getDetailOrderBook = (limit = 10) => { - const dirty = this.fullSnapshot.dirty; - const sequence = this.fullSnapshot.sequence; - const asks = arrl3Map(this.fullSnapshot.asks, 'asks', 'asc').slice(0, limit); - const bids = arrl3Map(this.fullSnapshot.bids, 'bids', 'desc').slice(0, limit); - const ping = this.datafeed.ping; - - return { - dirty, - sequence, - asks, - bids, - ping, - }; - } - - // get merged order book - getOrderBook = (limit = 10) => { - const dirty = this.fullSnapshot.dirty; - const sequence = this.fullSnapshot.sequence; - const ping = this.datafeed.ping; - - const asks = arrl3Map(this.fullSnapshot.asks, 'asks', 'asc'); - const asksTmp = {}; - _.each(asks, ([price, size, ts, orderId]) => { - if (asksTmp[price]) { - asksTmp[price][0] += (+size); - asksTmp[price][1][orderId] = true; - } else { - asksTmp[price] = [(+size), { [orderId]: true }]; - } - }); - const finalAsks = arrMap(asksTmp, 'asc').slice(0, limit); - - const bids = arrl3Map(this.fullSnapshot.bids, 'bids', 'desc'); - const bidsTmp = {}; - _.each(bids, ([price, size, ts, orderId]) => { - if (bidsTmp[price]) { - bidsTmp[price][0] += (+size); - bidsTmp[price][1][orderId] = true; - } else { - bidsTmp[price] = [(+size), { [orderId]: true }]; - } - }); - const finalBids = arrMap(bidsTmp, 'desc').slice(0, limit); - - return { - dirty, - sequence, - asks: finalAsks, - bids: finalBids, - ping, - }; - } -} - -export default Level3; \ No newline at end of file diff --git a/src/com/order.js b/src/com/order.js deleted file mode 100644 index 234aaed..0000000 --- a/src/com/order.js +++ /dev/null @@ -1,257 +0,0 @@ - -import http from '../lib/http'; -import log from '../lib/log'; -import { genUUID } from '../lib/utils'; - -class Order { - symbol; - leverage; - - constructor(symbol, leverage) { - this.symbol = symbol; - this.leverage = leverage; - } - - static LIMIT_SELECT = { - timeInForce: { GTC: 'GTC', IOC: 'IOC' }, - postOnly: { YES: true, NO: false }, - hidden: { YES: true, NO: false }, - iceberg: { YES: true, NO: false }, - } - - // limit order ---> success ---> clOid - limitOrder = async (price, size, side, extraProps = {}) => { - /* - price String 限价单的价格 - size Integer 订单数量。必须是一个正数。 - - extraProps (include typeProps): - timeInForce String [可选] 订单时效策略,包括GTC、IOC(默认为GTC)。 - postOnly boolean [可选] 只挂单的标识。选择postOnly,不允许选择hidden和iceberg。当订单时效为IOC策略时,该参数无效。 - hidden boolean [可选] 订单不会在买卖盘中展示。选择hidden,不允许选择postOnly。 - iceberg boolean [可选] 仅设置可见的部分会显示在买卖盘中。选择iceberg,不允许选择postOnly。 - visibleSize Integer [可选] 冰山单最大可展示的数量。 - typeProps: - remark String [可选] 下单备注,字符长度不能超过100 个字符(UTF-8)。 - stop String [可选] 触发价格的两种类型。下跌至某个价格(down),或上涨至某个价格(up)。设置后,就必须设置stopPrice和stopPriceType 参数。 - stopPriceType String [可选] 止损单触发价类型,包括TP、IP和MP, 只要设置stop参数,就必须设置此属性。 - stopPrice String [可选] 只要设置stop参数,就必须设置此属性。 - stp String [可选] 自成交保护,分为 CN、CO、CB和 DC 四种策略 - reduceOnly boolean [可选] 只减仓标记, 默认值是 false - closeOrder boolean [可选] 平仓单标记, 默认值是 false - forceHold boolean [可选] 强制冻结标记(减仓同样适用),可将订单留在买卖盘中而不受仓位变化的影响。默认值是 false - */ - if (typeof price !== 'string' || - typeof size !== 'number' || - !(size > 0) - ) { - log('Invalid price or size', price, size); - return false; - } - - return await this._order('limit', side, { - ...extraProps, - price, - size, - }); - } - - // market order ---> success ---> clOid - marketOrder = async (size, side, extraProps = {}) => { - /* - size Integer [可选] 下单数量 - extraProps (include typeProps): - typeProps: - remark String [可选] 下单备注,字符长度不能超过100 个字符(UTF-8)。 - stop String [可选] 触发价格的两种类型。下跌至某个价格(down),或上涨至某个价格(up)。设置后,就必须设置stopPrice和stopPriceType 参数。 - stopPriceType String [可选] 止损单触发价类型,包括TP、IP和MP, 只要设置stop参数,就必须设置此属性。 - stopPrice String [可选] 只要设置stop参数,就必须设置此属性。 - stp String [可选] 自成交保护,分为 CN、CO、CB和 DC 四种策略 - reduceOnly boolean [可选] 只减仓标记, 默认值是 false - closeOrder boolean [可选] 平仓单标记, 默认值是 false - forceHold boolean [可选] 强制冻结标记(减仓同样适用),可将订单留在买卖盘中而不受仓位变化的影响。默认值是 false - */ - if (typeof size !== 'number' || - !(size > 0) - ) { - log('Invalid size', size); - return false; - } - - return await this._order('market', side, { - ...extraProps, - size, - }); - } - - // cancle single order by id - cancleOrderById = async (orderServId) => { - let result = false; - - if (!orderServId) { - log('Invalid orderId to cancle', orderServId); - return result; - } - try { - // { - // "code": "200000", - // "data": { - // "cancelledOrderIds": [ - // "5bd6e9286d99522a52e458de" - // ] - // } - // } - const { data: { cancelledOrderIds } } = await http.del(`/api/v1/orders/${orderServId}`); - result = cancelledOrderIds; - } catch (e) { - log('cancle order error', e); - } - return result; - } - - cancleAllOrders = async () => { - // DELETE /api/v1/orders?symbol=XBTUSDM - let result = false; - - try { - // { - // "code": "200000", - // "data": { - // "cancelledOrderIds": [ - // "5bd6e9286d99522a52e458de" - // ] - // } - // } - const { data: { cancelledOrderIds } } = await http.del('/api/v1/orders', { symbol: this.symbol }); - result = cancelledOrderIds; - } catch (e) { - log('cancle all order error', e); - } - return result; - } - - cancleAllStopOrders = async () => { - // DELETE /api/v1/stopOrders?symbol=XBTUSDM - let result = false; - - try { - // { - // "code": "200000", - // "data": { - // "cancelledOrderIds": [ - // "5bd6e9286d99522a52e458de" - // ] - // } - // } - const { data: { cancelledOrderIds } } = await http.del('/api/v1/stopOrders', { symbol: this.symbol }); - result = cancelledOrderIds; - } catch (e) { - log('cancle all stop order error', e); - } - return result; - } - - getActiveOrders = async () => { - // GET /api/v1/orders?status=active - let result = false; - - try { - /* - { - "code": "200000", - "data": { - "currentPage": 1, - "pageSize": 100, - "totalNum": 1000, - "totalPage": 10, - "items": [ - { - "id": "5cdfc138b21023a909e5ad55", //订单编号 - "symbol": "XBTUSDM", //合约编号 - "type": "limit", //类型, 市价单或限价单 - "side": "buy", //买卖方向 - "price": "3600", //下单价格 - "size": 20000, //数量 - "value": "56.1167227833", //订单价值 - "dealValue": "0", //已经成交订单价值 - "dealSize": 0, //已经成交订单数量 - "stp": "", //stp 类型 - "stop": "", //止损订单类型 - "stopPriceType": "", //止损订单触发价格类型 - "stopTriggered": false, //止损订单是否触发标志 - "stopPrice": null, //止损订单触发价格 - "timeInForce": "GTC", //timeInForce类型 - "postOnly": false, //postOnly标志 - "hidden": false, //隐藏单标志 - "iceberg": false, //冰山单标志 - "visibleSize": null, //冰山单可见数量 - "leverage": "20", //杠杆倍数 - "forceHold": false, //强制冻结单标志 - "closeOrder": false, //平仓单标志 - "closeOnly": false, //只减仓单标志 - "clientOid": "5ce24c16b210233c36ee321d", //客户订单编号 - "remark": null, //注解 - "isActive": true, //未完成订单标志 - "cancelExist": false, //订单存在取消数量标志 - "createdAt": 1558167872000 //创建时间 - } - ] - } - } - */ - const { data } = await http.get('/api/v1/orders', { - symbol: this.symbol, - status: 'active', - }); - result = data; - } catch (e) { - log('get active orders error', e); - } - return result; - } - - // -----> private - _order = async (type, side, typeProps = {}) => { - /* - clientOid String 唯一的订单ID,可用于识别订单。如:UUID 只能包含数字、字母、下划线(_)或 分隔线(-) - side String buy 或 sell - symbol String 有效合约代码。如:XBTUSDM - leverage String 下单杠杆倍数 - type String [可选] 订单类型,包括limit或market,默认limit。 - - typeProps: - remark String [可选] 下单备注,字符长度不能超过100 个字符(UTF-8)。 - stop String [可选] 触发价格的两种类型。下跌至某个价格(down),或上涨至某个价格(up)。设置后,就必须设置stopPrice和stopPriceType 参数。 - stopPriceType String [可选] 止损单触发价类型,包括TP、IP和MP, 只要设置stop参数,就必须设置此属性。 - stopPrice String [可选] 只要设置stop参数,就必须设置此属性。 - stp String [可选] 自成交保护,分为 CN、CO、CB和 DC 四种策略 - reduceOnly boolean [可选] 只减仓标记, 默认值是 false - closeOrder boolean [可选] 平仓单标记, 默认值是 false - forceHold boolean [可选] 强制冻结标记(减仓同样适用),可将订单留在买卖盘中而不受仓位变化的影响。默认值是 false - */ - let result = false; - try { - const clientOid = genUUID(); - - const { data: { orderId } } = await http.post('/api/v1/orders', { - ...typeProps, - clientOid, - side, - symbol: this.symbol, - leverage: this.leverage, - type, - }); - - result = { - srOid: orderId, - clOid: clientOid, - }; - } catch (e) { - log('order error', e); - } - return result; - } - -} - -export default Order; \ No newline at end of file diff --git a/src/com/position.js b/src/com/position.js deleted file mode 100644 index fdd4f3a..0000000 --- a/src/com/position.js +++ /dev/null @@ -1,73 +0,0 @@ - -import http from '../lib/http'; -import log from '../lib/log'; - -class Position { - symbol; - - constructor(symbol) { - this.symbol = symbol; - } - - // TODO update by websocket - - - getPosition = async () => { - // GET /api/v1/position?symbol=XBTUSDM - let result = false; - - try { - /* - { - "code": "200000", - "data": { - "id": "5ce3cda60c19fc0d4e9ae7cd", //仓位id - "symbol": "XBTUSDM", //合约symbol - "autoDeposit": true, //是否自动追加保证金 - "maintMarginReq": 0.005, //维持保证金比例 - "riskLimit": 200, //风险限额 - "realLeverage": 1.06, //杠杆倍数 - "crossMode": false, //是否全仓 - "delevPercentage": 0.1, //ADL分位数 - "openingTimestamp": 1558433191000, //开仓时间 - "currentTimestamp": 1558507727807, //当前时间戳 - "currentQty": -20, //当前仓位 - "currentCost": 0.00266375, //当前总仓位价值 - "currentComm": 0.00000271, //当前总费用 - "unrealisedCost": 0.00266375, //未实现价值 - "realisedGrossCost": 0, //累加已实现毛利价值 - "realisedCost": 0.00000271, //当前累计已实现仓位价值 - "isOpen": true, //是否开仓 - "markPrice": 7933.01, //标记价格 - "markValue": 0.00252111, //标记价值 - "posCost": 0.00266375, //仓位价值 - "posCross": 1.2e-7, //手动追加的保证金 - "posInit": 0.00266375, //杠杆保证金 - "posComm": 0.00000392, //破产费用 - "posLoss": 0, //资金费用减少的资金 - "posMargin": 0.00266779, //仓位保证金 - "posMaint": 0.00001724, //维持保证金 - "maintMargin": 0.00252516, //仓位保证金 - "realisedGrossPnl": 0, //累加已实现毛利 - "realisedPnl": -0.00000253, //已实现盈亏 - "unrealisedPnl": -0.00014264, //未实现盈亏 - "unrealisedPnlPcnt": -0.0535, //仓位盈亏率 - "unrealisedRoePcnt": -0.0535, //投资回报率 - "avgEntryPrice": 7508.22, //平均开仓价格 - "liquidationPrice": 1000000, //强平价格 - "bankruptPrice": 1000000 //破产价格 - } - } - */ - const { data } = await http.get('/api/v1/position', { - symbol: this.symbol, - }); - result = data; - } catch (e) { - log('get position error', this.symbol, e); - } - return result; - } -} - -export default Position; \ No newline at end of file diff --git a/src/com/ticker.js b/src/com/ticker.js deleted file mode 100644 index a7cae39..0000000 --- a/src/com/ticker.js +++ /dev/null @@ -1,60 +0,0 @@ -import _ from 'lodash'; -import Datafeed from '../lib/datafeed'; -import log from '../lib/log'; - -class Ticker { - datafeed; - symbol; - snapshot = { - dirty: true, - data: {}, - }; - - constructor(symbol, datafeed) { - this.symbol = symbol; - - if (datafeed instanceof Datafeed) { - this.datafeed = datafeed; - } else { - this.datafeed = new Datafeed(); - } - } - - getSnapshot = () => { - return _.cloneDeep(this.snapshot); - }; - - updateSnapshot = (data) => { - // { symbol: 'XBTUSDM', - // side: 'buy', - // size: 100, - // price: 10000, - // bestBidSize: 9371, - // bestBidPrice: '9996.0', - // bestAskPrice: '10000.0', - // tradeId: '5d8743653c7feb4209084ffa', - // ts: 1569145701444522200, - // bestAskSize: 32422 } - - this.snapshot = { - dirty: false, - data, - }; - } - - listen = () => { - this.datafeed.connectSocket(); - this.datafeed.onClose(() => { - log('ticker ws closed, status ', this.datafeed.trustConnected); - this.snapshot.dirty = true; - }); - - this.datafeed.subscribe(`/contractMarket/ticker:${this.symbol}`, (message) => { - if (message.data) { - this.updateSnapshot(message.data); - } - }); - } -} - -export default Ticker; \ No newline at end of file diff --git a/src/com/time.js b/src/com/time.js deleted file mode 100644 index 06e1b9d..0000000 --- a/src/com/time.js +++ /dev/null @@ -1,28 +0,0 @@ - -import http from '../lib/http'; -import log from '../lib/log'; - -class Time { - - getTimestamp = async () => { - // GET /api/v1/timestamp - let result = false; - - try { - /* - { - "code":"200000", - "msg":"success", - "data":1546837113087 - } - */ - const { data } = await http.get('/api/v1/timestamp'); - result = data; - } catch (e) { - log('get timestamp error', e); - } - return result; - } -} - -export default Time; \ No newline at end of file diff --git a/src/dataType/account.ts b/src/dataType/account.ts new file mode 100644 index 0000000..f345057 --- /dev/null +++ b/src/dataType/account.ts @@ -0,0 +1,37 @@ +import { PageOffsetParams, PageSizeParams } from './common'; + +export type TransactionType = + | 'RealisedPNL' + | 'Deposit' + | 'Withdrawal' + | 'TransferIn' + | 'TransferOut'; + +export interface TransactionHistoryParams extends PageOffsetParams { + type?: TransactionType; + currency?: string; +} + +export interface SubApiParams { + subName: string; // Sub-account name, create sub account name of API Key + passphrase: string; // Password(Must contain 7-32 characters. Cannot contain any spaces.) + permission?: string; // Permissions(Only "General" and "Trade" permissions can be set, such as "General, Trade". The default is "General") + ipWhitelist?: string; // IP whitelist(You may add up to 20 IPs. Use a halfWidth comma to each IP) + expire?: string; // API expiration time; Never expire(default)-1, 30Day30, 90Day90, 180Day180, 360Day360 +} + +export interface CreateSubApiParams extends SubApiParams { + remark: string; // Remarks(1~24 characters) +} + +export interface UpdateSubApiParams extends SubApiParams { + apiKey: string; // API-Key(Sub-account APIKey) +} + +export type TransferStatusType = 'PROCESSING' | 'SUCCESS' | 'FAILURE'; + +export interface TransferListParams extends PageSizeParams { + status?: TransferStatusType; + queryStatus?: TransferStatusType; + currency?: string; +} diff --git a/src/dataType/common.ts b/src/dataType/common.ts new file mode 100644 index 0000000..bb0135e --- /dev/null +++ b/src/dataType/common.ts @@ -0,0 +1,22 @@ +export interface MakeRequestParams { + body?: object | string; + method: string; + endpoint: string; + callback?: Function; + isPrivate?: boolean; + } + + export interface PageOffsetParams { + startAt?: string; + endAt?: string; + offset?: number; + forward?: boolean | true; + maxCount?: number; + } + + export interface PageSizeParams { + startAt?: string; + endAt?: string; + pageSize?: number; + currentPage?: number; + } \ No newline at end of file diff --git a/src/dataType/index.d.ts b/src/dataType/index.d.ts new file mode 100644 index 0000000..2eba702 --- /dev/null +++ b/src/dataType/index.d.ts @@ -0,0 +1,7 @@ + +export * from './common'; +export * from './account'; +export * from './other'; +export * from './order'; +export * from './market'; +export * from './socket'; \ No newline at end of file diff --git a/src/dataType/market.ts b/src/dataType/market.ts new file mode 100644 index 0000000..67cb08e --- /dev/null +++ b/src/dataType/market.ts @@ -0,0 +1,13 @@ +import { PageOffsetParams } from './common'; + +export interface klineParams { + symbol: string; + granularity: number; + from?: string; + to?: string; +} + +export interface IndexListParams extends PageOffsetParams { + symbol: string; + reverse?: boolean | true; +} \ No newline at end of file diff --git a/src/dataType/order.ts b/src/dataType/order.ts new file mode 100644 index 0000000..67788d4 --- /dev/null +++ b/src/dataType/order.ts @@ -0,0 +1,57 @@ +import { PageSizeParams } from './common'; + +export type BaseOrderType = 'limit' | 'market'; +export type OrderType = 'limit' | 'market' | 'limit_stop' | 'market_stop'; + +export type OrderOptionalParamsType = + | 'type' + | 'remark' + | 'stop' + | 'stopPriceType' + | 'stopPrice' + | 'reduceOnly' + | 'closeOrder' + | 'forceHold' + | 'timeInForce' + | 'postOnly' + | 'hidden' + | 'iceberg' + | 'visibleSize'; + +export type OptionalParamsObject = { + [P in T]?: any; +}; + +export interface BaseOrderBody { + symbol: string; + size: number; + leverage?: number; + clientOid?: string; + optional?: OptionalParamsObject; +} + +export interface OrderBody extends BaseOrderBody { + side: string; + price?: number | string; +} + +export type OpenOrderStatusType = 'active' | 'done'; +export interface OpenOrderListParams extends PageSizeParams { + status?: OpenOrderStatusType; + symbol?: string; + side?: string; + type?: OrderType; +} + +export interface StopOrderListParams extends PageSizeParams { + symbol?: string; + side?: string; + type?: BaseOrderType; +} + +export interface FillsParams extends PageSizeParams { + orderId?: string; // List fills for a specific order only (If you specify orderId, other parameters can be ignored) + symbol?:string; + side?: string; + type?: OrderType; +} diff --git a/src/dataType/other.ts b/src/dataType/other.ts new file mode 100644 index 0000000..18c624d --- /dev/null +++ b/src/dataType/other.ts @@ -0,0 +1,6 @@ +import { PageOffsetParams } from './common'; + +export interface FundingHistoryParams extends PageOffsetParams { + symbol: string; + reverse?: boolean | true; // This parameter functions to judge whether the lookup is forward or not. True means “yes” and False means “no”. This parameter is set as true by default +} diff --git a/src/dataType/socket.ts b/src/dataType/socket.ts new file mode 100644 index 0000000..20c94fb --- /dev/null +++ b/src/dataType/socket.ts @@ -0,0 +1,9 @@ +export type Callback = (data: any) => void; + +export interface Subscription { + id: string; + callback: Callback; + topic: string; + privateChannel: boolean; + strict?: boolean; +} diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 1f3b509..0000000 --- a/src/index.js +++ /dev/null @@ -1,5 +0,0 @@ -import { setEnv } from './lib/env'; - -export default { - setEnv, -} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..9fb3e67 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,897 @@ +import { v4 as uuidV4 } from 'uuid'; +import { map } from 'lodash'; +import WebSocket from 'ws'; + +import Request from './tools/request'; +import { splitArray } from './tools/tools'; + +import { + returnBodyAndEndpoint, + FUTURES_STOP_ORDER_EP, + FUTURES_RECENT_DONE_ORDERS_EP, + FUTURES_FILLS_EP, + FUTURES_RECENT_FILLS_EP, + FUTURES_TOTAL_OPEN_ORDERS_MARGIN_EP, + FUTURES_POSITION_EP, + FUTURES_POSITIONS_EP, + FUTURES_POSITION_AUTO_DEPOSIT_STATUS_EP, + FUTURES_POSITION_MARGIN_EP, + FUTURES_RISK_LIMIT_EP, + FUTURES_CHANGE_RISK_LIMIT_EP, + FUTURES_FUNDING_HISTORY_EP, + FUTURES_CONTRACTS_ACTIVE_EP, + FUTURES_CONTRACTS_DETAIL_EP, + FUTURES_TICKER_EP, + FUTURES_LEVEL2_EP, + FUTURES_LEVEL2_20_EP, + FUTURES_LEVEL2_100_EP, + FUTURES_TRADE_HISTORY_EP, + FUTURES_TIMESTAMP_EP, + FUTURES_SERVICE_STATUS_EP, + FUTURES_KLINE_EP, + FUTURES_INTEREST_EP, + FUTURES_INDEX_EP, + FUTURES_MARK_PRICE_EP, + FUTURES_PREMIUM_EP, + FUTURES_FUNDING_RATE_EP, + FUTURES_ACCOUNT_OVERVIEW_EP, + FUTURES_TRANSACTION_HISTORY_EP, + FUTURES_SUB_API_EP, + FUTURES_UPDATE_SUB_API_EP, + FUTURES_TRANSFER_OUT_EP, + FUTURES_TRANSFER_IN_EP, + FUTURES_TRANSFER_LIST_EP +} from './resetAPI'; +import { + PUBLIC_BULLET_EP, + PRIVATE_BULLET_EP, + TICKER, + TRADE_ORDERS, + LEVEL2, + LEVEL2_DEPTH5, + LEVEL2_DEPTH50, + EXECUTION, + INSTRUMENT, + ANNOUNCEMENT, + SNAPSHOT, + ADVANCE_ORDERS, + WALLET, + POSITION +} from './websocket'; + +import { GET, POST, DELETE } from './tools/constants'; +import { filterEmptyValues, log } from './tools/tools'; +import { + CreateSubApiParams, + FillsParams, + FundingHistoryParams, + MakeRequestParams, + OpenOrderListParams, + StopOrderListParams, + TransactionHistoryParams, + TransferListParams, + UpdateSubApiParams, + IndexListParams, + klineParams, + Callback +} from './dataType'; +import { WebSocketClient, CONNECT_ID, TICKER_V2 } from './websocket'; + +export default class KuCoinFutures { + private request: Request; + private socketInstanceCache: any = new Map(); + constructor(props: { + key: string | number; + secret: string | number; + passphrase: string | number; + axiosProps: object; + }) { + const { key, secret, passphrase, axiosProps = {} } = props || {}; + this.request = new Request({ + key, + secret, + passphrase, + ...axiosProps + }); + } + + private makeRequest = async ({ + body = '', + method, + endpoint, + callback, + isPrivate = true + }: MakeRequestParams): Promise => { + try { + const params = filterEmptyValues(body); + const data = isPrivate + ? await this.request.signatureRequest(endpoint, params, method) + : await this.request.requestPublic(endpoint, params, method); + if (callback) { + return callback(data); + } else { + return data; + } + } catch (err) { + console.log(err); + return err; + } + }; + + futuresAccount = async (currency: string = 'XBT', callback?: Function) => { + return this.makeRequest({ + body: { currency }, + method: GET, + endpoint: FUTURES_ACCOUNT_OVERVIEW_EP, + callback + }); + }; + + /** + * search to transaction history + * @param params.type string -- 'RealisedPNL' | 'Deposit' | 'Withdrawal' | 'TransferIn' | 'TransferOut' + * @param params.currency -- string + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.offset -- long + * @param params.maxCount -- default 50 + * @param params.forward -- default true + * @param callback -- callback function + */ + futuresTransactionHistory = async ( + params?: TransactionHistoryParams, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: GET, + endpoint: FUTURES_TRANSACTION_HISTORY_EP, + callback + }); + }; + + futuresSubApi = async ( + params: { + subName: string; + apiKey?: string; + }, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: GET, + endpoint: FUTURES_SUB_API_EP, + callback + }); + }; + + futuresCreateSubApi = async ( + params: CreateSubApiParams, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: POST, + endpoint: FUTURES_SUB_API_EP, + callback + }); + }; + + futuresUpdateSubApi = async ( + params: UpdateSubApiParams, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: POST, + endpoint: FUTURES_UPDATE_SUB_API_EP, + callback + }); + }; + + futureDeleteSubApi = async ( + params: { + subName: string; + apiKey: string; + passphrase: string; + }, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: DELETE, + endpoint: FUTURES_UPDATE_SUB_API_EP, + callback + }); + }; + + futureTransferOut = async ( + params: { + amount: number; + currency: string; + recAccountType: string; + }, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: POST, + endpoint: FUTURES_TRANSFER_OUT_EP, + callback + }); + }; + + futureTransferIn = async ( + params: { + amount: number; + currency: string; + payAccountType: string; + }, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: POST, + endpoint: FUTURES_TRANSFER_IN_EP, + callback + }); + }; + + /** + * search to transfer list + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.status -- string -- 'PROCESSING' | 'SUCCESS' | 'FAILURE' + * @param params.queryStatus -- array -- 'PROCESSING' | 'SUCCESS' | 'FAILURE' + * @param params.currency -- string + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 100 + * @param callback -- callback function + */ + futureTransfers = async ( + params?: TransferListParams, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: POST, + endpoint: FUTURES_TRANSFER_LIST_EP, + callback + }); + }; + + private order = async (params: any, method = GET, callback?: Function) => { + const { body, endpoint } = returnBodyAndEndpoint(params, method); + return this.makeRequest({ body, method, endpoint, callback }); + }; + + private stopOrder = async ( + params: any, + method = GET, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method, + endpoint: FUTURES_STOP_ORDER_EP, + callback + }); + }; + + futuresBuy = async ( + params: { + symbol: string; + size: string | number; + price: string | number; + leverage?: number; + clientOid?: string; + optional?: object; + }, + callback?: Function + ) => { + const { + price, + symbol, + size, + leverage = 1, + clientOid = uuidV4(), + optional + } = params; + if (!symbol) { + throw new TypeError('Order buy symbol must be set!'); + } + return this.order( + { side: 'buy', price, symbol, size, leverage, clientOid, optional }, + POST, + callback + ); + }; + + futuresSell = async ( + params: { + symbol: string; + size: string | number; + price: string | number; + leverage?: number; + clientOid?: string; + optional?: object; + }, + callback?: Function + ) => { + const { + price, + symbol, + size, + leverage = 1, + clientOid = uuidV4(), + optional + } = params; + if (!symbol) { + throw new TypeError('Order sell symbol must be set!'); + } + return this.order( + { side: 'sell', price, symbol, size, leverage, clientOid, optional }, + POST, + callback + ); + }; + + futuresCancel = async (orderId: string, callback?: Function) => { + return this.order(orderId, DELETE, callback); + }; + + futuresCancelAllOpenOrders = async (symbol?: string, callback?: Function) => { + return this.order({ symbol }, DELETE, callback); + }; + + futuresCancelAllStopOrders = async (symbol?: string, callback?: Function) => { + return this.stopOrder({ symbol }, DELETE, callback); + }; + + futuresCancelAll = async (symbol?: string, callback?: Function) => { + const cancelAllOpenOrders = this.futuresCancelAllOpenOrders( + symbol, + callback + ); + const cancelAllStopOrders = this.futuresCancelAllStopOrders( + symbol, + callback + ); + return Promise.all([cancelAllOpenOrders, cancelAllStopOrders]); + }; + + /** + * search to open orders list + * @param params.status --'active'|'done' default 'active' + * @param params.symbol -- string symbol + * @param params.side --'buy'|'sell' + * @param params.type -- 'limit'|'market'|'limit_stop'|'market_stop' + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 1000 + * @param callback -- callback function + */ + futuresOpenOrders = async ( + params: OpenOrderListParams, + callback?: Function + ) => { + return this.order(params, GET, callback); + }; + + /** + * search to stop orders list + * @param params.symbol -- string symbol + * @param params.side --'buy'|'sell' + * @param params.type -- 'limit'|'market' + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 1000 + * @param callback -- callback function + */ + futuresStopOrders = async ( + params: StopOrderListParams, + callback?: Function + ) => { + return this.stopOrder(params, GET, callback); + }; + + futuresRecentDoneOrders = async (symbol?: string, callback?: Function) => { + return this.makeRequest({ + body: { symbol }, + method: GET, + endpoint: FUTURES_RECENT_DONE_ORDERS_EP, + callback + }); + }; + + /** + * search to order detail + * @param params -- string orderId || object { clientOid } + * @param callback -- callback function + */ + futuresOrderDetail = async (params: string | object, callback?: Function) => { + return this.order(params, GET, callback); + }; + + /** + * search to stop orders list + * @param params.orderId -- string + * @param params.symbol -- string symbol + * @param params.side --'buy'|'sell' + * @param params.type -- 'limit'|'market'|'limit_stop'|'market_stop' + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.currentPage -- default 1 + * @param params.pageSize -- default 50 | max 100 + * @param callback -- callback function + */ + futuresFills = async (params?: FillsParams, callback?: Function) => { + return this.makeRequest({ + body: params, + method: GET, + endpoint: FUTURES_FILLS_EP, + callback + }); + }; + + futuresRecentFills = async (symbol?: string, callback?: Function) => { + return this.makeRequest({ + body: { symbol }, + method: GET, + endpoint: FUTURES_RECENT_FILLS_EP, + callback + }); + }; + + futuresMarginOpenOrders = async (symbol: string, callback?: Function) => { + if (!symbol) { + console.error('Required String parameter symbol'); + return; + } + return this.makeRequest({ + body: { symbol }, + method: GET, + endpoint: FUTURES_TOTAL_OPEN_ORDERS_MARGIN_EP, + callback + }); + }; + + futuresPositionDetail = async (symbol?: string, callback?: Function) => { + return this.makeRequest({ + body: { symbol }, + method: GET, + endpoint: FUTURES_POSITION_EP, + callback + }); + }; + + futuresPositions = async (currency?: string, callback?: Function) => { + return this.makeRequest({ + body: { currency }, + method: GET, + endpoint: FUTURES_POSITIONS_EP, + callback + }); + }; + + futuresPositionAutoDeposit = async ( + params: { symbol: string; status: boolean }, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: POST, + endpoint: FUTURES_POSITION_AUTO_DEPOSIT_STATUS_EP, + callback + }); + }; + + futuresPositionMargin = async ( + params: { + symbol: string; + margin: number; + bizNo?: string; + }, + callback?: Function + ) => { + const { symbol, margin, bizNo } = params; + const makeBizNo = bizNo || uuidV4(); + return this.makeRequest({ + body: { symbol, margin, bizNo: makeBizNo }, + method: POST, + endpoint: FUTURES_POSITION_MARGIN_EP, + callback + }); + }; + + futuresRiskLimit = async (symbol?: string, callback?: Function) => { + return this.makeRequest({ + body: symbol, + method: GET, + endpoint: FUTURES_RISK_LIMIT_EP, + callback + }); + }; + + futuresChangeRiskLimit = async ( + params: { + symbol: string; + level: number; + }, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: POST, + endpoint: FUTURES_CHANGE_RISK_LIMIT_EP, + callback + }); + }; + + /** + * search to stop orders list + * @param params.symbol -- string symbol + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.reverse -- boolean + * @param params.offset -- long + * @param params.forward -- default true + * @param params.maxCount -- default 10 + * @param callback -- callback function + */ + futuresFundingHistory = async ( + params?: FundingHistoryParams, + callback?: Function + ) => { + return this.makeRequest({ + body: params, + method: GET, + endpoint: FUTURES_FUNDING_HISTORY_EP, + callback + }); + }; + + futuresContractsActive = async (callback?: Function) => { + return this.makeRequest({ + method: GET, + endpoint: FUTURES_CONTRACTS_ACTIVE_EP, + callback, + isPrivate: false + }); + }; + + futuresContractDetail = async (symbol: string, callback?: Function) => { + if (!symbol) { + console.log('Required Parameter. Symbol of the contract'); + return false; + } + return this.makeRequest({ + body: symbol, + method: GET, + endpoint: FUTURES_CONTRACTS_DETAIL_EP, + callback, + isPrivate: false + }); + }; + + futuresTicker = async (symbol: string, callback?: Function) => { + return this.makeRequest({ + body: { symbol }, + method: GET, + endpoint: FUTURES_TICKER_EP, + callback + }); + }; + + futuresLevel2 = async (symbol: string, callback?: Function) => { + return this.makeRequest({ + body: { symbol }, + method: GET, + endpoint: FUTURES_LEVEL2_EP, + callback, + isPrivate: false + }); + }; + + futuresLevel2Depth20 = async (symbol: string, callback?: Function) => { + return this.makeRequest({ + body: { symbol }, + method: GET, + endpoint: FUTURES_LEVEL2_20_EP, + callback, + isPrivate: false + }); + }; + + futuresLevel2Depth100 = async (symbol: string, callback?: Function) => { + return this.makeRequest({ + body: { symbol }, + method: GET, + endpoint: FUTURES_LEVEL2_100_EP, + callback, + isPrivate: false + }); + }; + + futuresTradeHistory = async (symbol: string, callback?: Function) => { + return this.makeRequest({ + body: { symbol }, + method: GET, + endpoint: FUTURES_TRADE_HISTORY_EP, + callback, + isPrivate: false + }); + }; + + futuresTimestamp = async (callback?: Function) => { + return this.makeRequest({ + method: GET, + endpoint: FUTURES_TIMESTAMP_EP, + callback, + isPrivate: false + }); + }; + + futuresStatus = async (callback?: Function) => { + return this.makeRequest({ + method: GET, + endpoint: FUTURES_SERVICE_STATUS_EP, + callback, + isPrivate: false + }); + }; + + /** + * search to kline + * @param params.symbol -- string symbol + * @param params.granularity -- number + * @param params.form -- timestamp + * @param params.to -- boolean + */ + futuresKline = async (params: klineParams, callback?: Function) => { + return this.makeRequest({ + body: params, + method: GET, + endpoint: FUTURES_KLINE_EP, + callback, + isPrivate: false + }); + }; + + /** + * search to interest list + * @param params.symbol -- string symbol + * @param params.reverse -- boolean default true + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.offset -- long + * @param params.forward -- boolean default true + * @param params.maxCount -- number default 10 | max 100 + * @param callback -- callback function + */ + futuresInterests = async (params?: IndexListParams, callback?: Function) => { + return this.makeRequest({ + body: params, + method: GET, + endpoint: FUTURES_INTEREST_EP, + callback, + isPrivate: false + }); + }; + + /** + * search to index list + * @param params.symbol -- string symbol + * @param params.reverse -- boolean default true + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.offset -- long + * @param params.forward -- boolean default true + * @param params.maxCount -- number default 10 | max 100 + * @param callback -- callback function + */ + futuresIndexList = async (params?: IndexListParams, callback?: Function) => { + return this.makeRequest({ + body: params, + method: GET, + endpoint: FUTURES_INDEX_EP, + callback, + isPrivate: false + }); + }; + + futuresMarkPrice = async (symbol: string, callback?: Function) => { + return this.makeRequest({ + method: GET, + endpoint: `${FUTURES_MARK_PRICE_EP}/${symbol}/current`, + callback, + isPrivate: false + }); + }; + + /** + * search to premium list + * @param params.symbol -- string symbol + * @param params.startAt -- timestamp + * @param params.endAt -- timestamp + * @param params.reverse -- boolean default true + * @param params.offset -- long + * @param params.forward -- boolean default true + * @param params.maxCount -- number default 10 | max 100 + * @param callback -- callback function + */ + futuresPremiums = async (params?: IndexListParams, callback?: Function) => { + return this.makeRequest({ + body: params, + method: GET, + endpoint: FUTURES_PREMIUM_EP, + callback, + isPrivate: false + }); + }; + + futuresFundingRate = async (symbol: string, callback?: Function) => { + return this.makeRequest({ + method: GET, + endpoint: `${FUTURES_FUNDING_RATE_EP}/${symbol}/current`, + callback, + isPrivate: false + }); + }; + + futuresGetSocketInstance = async (isPrivate: boolean) => { + const { + data: { instanceServers, token } + } = await this.makeRequest({ + method: POST, + endpoint: isPrivate ? PRIVATE_BULLET_EP : PUBLIC_BULLET_EP, + isPrivate + }); + const wssUri = `${instanceServers[0].endpoint}?token=${token}&acceptUserMessage=true&connectId=${CONNECT_ID}`; + const websocket = new WebSocket(wssUri); + const socketInstance = new WebSocketClient(wssUri, websocket); + return socketInstance; + }; + + futuresGetCacheSocketInstance = async ( + isPrivate: boolean + ): Promise => { + const key = `futures_${isPrivate}`; + if (!this.socketInstanceCache.has(key)) { + this.socketInstanceCache.set( + key, + this.futuresGetSocketInstance(isPrivate) + ); + } + return this.socketInstanceCache.get(key); + }; + + futuresSocketSubscribe = async ( + topic: string, + callback: Callback = log, + isPrivate: boolean = false, + strict: boolean = true + ) => { + if (!topic) { + console.log('Required parameter topic'); + return false; + } + this.futuresGetCacheSocketInstance(isPrivate) + .then((socketInstance) => { + return socketInstance.subscribe(topic, callback, isPrivate, strict); + }) + .catch((err) => { + console.log(`execute ${topic} error: ${JSON.stringify(err)}`); + return false; + }); + }; + + get websocket() { + const _this = this; + + async function makeSubscribe( + symbols: string | [], + topic: string, + callback = log, + privateChannel = false + ) { + if (Array.isArray(symbols)) { + const symbolSplit = splitArray(symbols); + const subscribeList = map(symbolSplit, (symbolStr) => { + if (symbolStr) { + return _this.futuresSocketSubscribe( + `${topic}:${symbolStr}`, + callback, + privateChannel, + false + ); + } + }); + return await Promise.all(subscribeList); + } else if (symbols) { + return await _this.futuresSocketSubscribe( + `${topic}:${symbols}`, + callback, + privateChannel + ); + } + return await _this.futuresSocketSubscribe( + topic, + callback, + privateChannel + ); + } + + /* === public socket === */ + async function tickerV2(symbols: string | [], callback = log) { + return await makeSubscribe(symbols, TICKER_V2, callback); + } + + async function ticker(symbols: string | [], callback = log) { + return await makeSubscribe(symbols, TICKER, callback); + } + + async function level2(symbols: string | [], callback = log) { + return await makeSubscribe(symbols, LEVEL2, callback); + } + + async function execution(symbols: string | [], callback = log) { + return await makeSubscribe(symbols, EXECUTION, callback); + } + + async function level2Depth5(symbols: string | [], callback = log) { + return await makeSubscribe(symbols, LEVEL2_DEPTH5, callback); + } + + async function level2Depth50(symbols: string | [], callback = log) { + return await makeSubscribe(symbols, LEVEL2_DEPTH50, callback); + } + + async function instrument(symbols: string | [], callback = log) { + return await makeSubscribe(symbols, INSTRUMENT, callback); + } + + async function announcement(callback = log) { + return await _this.futuresSocketSubscribe(ANNOUNCEMENT, callback, false); + } + + async function snapshot(symbols: string | [], callback = log) { + return await makeSubscribe(symbols, SNAPSHOT, callback); + } + + /* === private socket === */ + async function tradeOrders(symbols: string | [], callback = log) { + return await makeSubscribe(symbols, TRADE_ORDERS, callback, true); + } + + async function advancedOrders(callback = log) { + return await _this.futuresSocketSubscribe(ADVANCE_ORDERS, callback, true); + } + + async function wallet(callback = log) { + return await _this.futuresSocketSubscribe(WALLET, callback, true); + } + + async function position(symbols: string | [], callback = log) { + return await makeSubscribe(symbols, POSITION, callback, true); + } + + return { + tickerV2, + ticker, + level2, + execution, + level2Depth5, + level2Depth50, + instrument, + announcement, + snapshot, + tradeOrders, + advancedOrders, + wallet, + position + }; + } +} diff --git a/src/lib/codes.js b/src/lib/codes.js deleted file mode 100644 index 1421de6..0000000 --- a/src/lib/codes.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - // Success - SUCCESS: 200000, - SHORT_SUCCESS: 200, - // Account - ACCOUNT_EXISTS: 230005, -}; \ No newline at end of file diff --git a/src/lib/datafeed.js b/src/lib/datafeed.js deleted file mode 100644 index eb6f840..0000000 --- a/src/lib/datafeed.js +++ /dev/null @@ -1,351 +0,0 @@ -import _ from 'lodash'; -import http from './http'; -import log from './log'; -import WebSocket from 'ws'; -import EventEmitter from 'event-emitter'; -import EventAllOff from 'event-emitter/all-off'; -import { clearInterval } from 'timers'; -// import io from 'socket.io-client'; -// import parser from 'socket.io-msgpack-parser'; - -const generateId = () => '_e_' + Date.now() + (Math.random() * 365).toString(16).slice(4,14) + 'yl'; -const loop = () => {}; -const getTopicPrefix = topic => topic.split(':')[0]; - -export default class Datafeed { - - trustConnected = false; - privateBullet = false; - client = null; - emitter = new EventEmitter(); - topicState = []; - topicListener = { - // topicPrefix => [...hooks], - }; - incrementSubscribeId = 0; - ping = 0; - - constructor(privateBullet = false) { - this.privateBullet = privateBullet; - } - - _connecting = false; - connectSocket = async () => { - if (this.trustConnected) { - log('ws conn status: ', this.trustConnected); - return; - } - if (this._connecting) { - log('ws is connecting, return'); - return; - } - this._connecting = true; - this._clearPing(); - - // clear all event - EventAllOff(this.emitter); - - const config = await this._getBulletToken(); - if (!config) { - log('getPubToken config invalid'); - - // try to reconnect - _.delay(() => { - this._connecting = false; - this.connectSocket(); - }, 3000); - return; - } - // log('getPubToken config: ', config); - log('getPubToken config'); - - const connectId = generateId(); - log('generate connectId: ', connectId); - - this.emitter.on(`welcome_${connectId}`, this._handleAfterConnect); - log('waiting welcome ack...'); - - const cl = await this._connect({ - server: config.data, - connectId, - }); - - cl.onopen = () => { - // ws.send('foo'); - log('socket connect opend', this._maxId, cl._maxId); - this.client = cl; - }; - - cl.onmessage = (evt) => { - if (!evt.data) { - log('invalid message'); - return; - } - let message = null; - try { - log('parse: ', evt.data, this._maxId, cl._maxId); - message = JSON.parse(evt.data); - } catch (e) { - log('parse message error'); - console.error(e); - } - if (!message) { - return; - } - - const { id, type } = message; - switch(type) { - case 'welcome': - case 'ack': - case 'pong': - // log(`emit: welcome_${id}`); - this.emitter.emit(`${type}_${id}`); - break; - case 'message': - // message recieve - this._distribute(message); - break; - case 'ping': - default: - log('unhandle message', evt.data); - break; - } - }; - - cl.onerror = (e) => { - log('socket connect onerror', this._maxId, cl._maxId, e.message); - } - - cl.onclose = () => { - log('socket connect closed', this._maxId, cl._maxId); - this._handleClose(); - - // try to reconnect - _.delay(() => { - this._connecting = false; - this.connectSocket(); - }, 3000); - }; - } - - _onClose = []; - _handleClose = () => { - this.trustConnected = false; - this.ping = 0; - - // on close - _.each(this._onClose, (fn) => { - if (typeof fn === 'function') { - fn(); - } - }); - } - - onClose = (callback) => { - if (typeof callback === 'function') { - this._onClose.push(callback); - } - return this; - }; - - subscribe = (topic, hook = loop, _private = false) => { - this.incrementSubscribeId += 1; - - const hookId = this.incrementSubscribeId; - const listener = { hook, id: hookId }; - const prefix = getTopicPrefix(topic); - if (this.topicListener[prefix]) { - this.topicListener[prefix].push(listener); - } else { - this.topicListener[prefix] = [listener]; - } - log('subscribed listener'); - - const find = this.topicState.filter(item => item[0] === topic); - if (find.length === 0) { - log(`topic new subscribe: ${topic}`); - this.topicState.push([topic, _private]); - this._sub(topic, _private); - } else { - log(`topic already subscribed: ${topic}`); - } - - log('subscribed listener id ', hookId); - return hookId; - } - - unsubscribe = (topic, hookId) => { - const prefix = getTopicPrefix(topic); - if (this.topicListener[prefix]) { - const deleted = this.topicListener[prefix].filter(item => item.id !== hookId); - if (deleted.length === 0) { - delete this.topicListener[prefix]; - } else { - this.topicListener[prefix] = deleted; - } - } - log('unsubscribed listener id ', hookId); - - this.topicState = this.topicState.filter(record => record[0] !== topic); - this._unsub(topic); - } - - _distribute = (message) => { - // { data: - // { symbol: 'XBTUSDM', - // side: 'sell', - // size: 82, - // price: 10055, - // bestBidSize: 598, - // bestBidPrice: '10055.0', - // bestAskPrice: '10056.0', - // tradeId: '5d8645143c7feb4209f368e7', - // ts: 1569080596312353500, - // bestAskSize: 33882 }, - // subject: 'ticker', - // topic: '/contractMarket/ticker:XBTUSDM', - // type: 'message' } - const { topic } = message; - if (topic) { - const prefix = getTopicPrefix(topic); - const listeners = this.topicListener[prefix]; - if (listeners) { - _.each(listeners, ({ hook }) => { - if (typeof hook === 'function') { - hook(message); - } - }); - } - } - } - - _handleAfterConnect = () => { - log('recieved connect welcome ack'); - this.trustConnected = true; - this._connecting = false; - - // resub - _.each(this.topicState, ([topic, _private]) => { - this._sub(topic, _private); - }); - - // restart ping - this._ping(); - } - - _maxId = 0; - _connect = async (config) => { - const server = config.server; - const connectId = config.connectId; - const { - instanceServers, - token, - } = server; - const url = `${instanceServers[0].endpoint}?token=${token}&acceptUserMessage=true&connectId=${connectId}`; - this._maxId += 1; - const client = new WebSocket(url, { - handshakeTimeout: 30, - }); - client._maxId = this._maxId; - return client; - } - - _getBulletToken = async () => { - let res = false; - try { - res = await http.post( - this.privateBullet ? - '/api/v1/bullet-private' : - '/api/v1/bullet-public' - ); - } catch (e) { - log('get bullet error', e); - } - return res; - } - - _sub = (topic, _private = false) => { - if (!this.trustConnected) { - log('client not connected'); - return; - } - - const id = generateId(); - this.emitter.once(`ack_${id}`, () => { - log(`topic: ${topic} subscribed`, id); - }); - - this.client.send(JSON.stringify({ - id, - type: 'subscribe', - topic, - private: _private, - response: true - })); - log(`topic subscribe: ${topic}, send`, id); - } - - _unsub = (topic) => { - if (!this.trustConnected) { - log('client not connected'); - return; - } - - const id = generateId(); - this.emitter.once(`ack_${id}`, () => { - log(`topic: ${topic} unsubscribed`, id); - }); - - this.client.send(JSON.stringify({ - id, - type: 'unsubscribe', - topic, - })); - log(`topic unsubscribe: ${topic}, send`, id); - } - - _pingTs = null; - _clearPing = () => { - if (this._pingTs) { - clearInterval(this._pingTs); - this._pingTs = null; - } - } - - _ping = () => { - this._clearPing(); - - this._pingTs = setInterval(() => { - if (!this.trustConnected) { - log('client not connected'); - return; - } - const id = generateId(); - - // ping timeout - const timer = setTimeout(() => { - log('ping wait pong timeout'); - this._clearPing(); - - if (this.client) { - this.client.terminate(); - this.client = null; - } - }, 5000); - - // calc ping ms - const pingPerform = Date.now(); - this.emitter.once(`pong_${id}`, () => { - this.ping = Date.now() - pingPerform; - log('ping get pong'); - clearTimeout(timer); - }); - - this.client.send(JSON.stringify({ - id, - type: 'ping', - })); - log('ping, send'); - }, 10000); - } -} \ No newline at end of file diff --git a/src/lib/delay.js b/src/lib/delay.js deleted file mode 100644 index 7ad074c..0000000 --- a/src/lib/delay.js +++ /dev/null @@ -1,11 +0,0 @@ -import _ from 'lodash'; - -const delay = (ms = 1000) => { - return new Promise((resolve) => { - _.delay(() => { - resolve(); - }, ms); - }); -}; - -export default delay; \ No newline at end of file diff --git a/src/lib/env.js b/src/lib/env.js deleted file mode 100644 index 2d55ee2..0000000 --- a/src/lib/env.js +++ /dev/null @@ -1,34 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -let env = { - log: { - writeFile: false, - stdout: false, - }, - key: '', - secret: '', - passphrase: '', -}; - -if (global._RUN_AS_FRAMEWORK_HELPER_) { - const envFile = path.resolve(__dirname, '../../.env.js'); - if (fs.existsSync(envFile)) { - const r = require(envFile); - const c = r.default || r; - if (c) { - env = c; - } - } -} - -export const setEnv = (conf = {}) => { - env = { - ...env, - ...conf, - }; -}; - -export const getEnv = () => { - return env; -}; diff --git a/src/lib/http.js b/src/lib/http.js deleted file mode 100644 index adf2105..0000000 --- a/src/lib/http.js +++ /dev/null @@ -1,172 +0,0 @@ - -import querystring from 'querystring'; -import request from 'request'; -import CryptoJS from 'crypto'; -import codes from './codes'; -import log from './log'; -import { keyVersion2 } from './utils'; - -const IS_PRODUCT = global._USE_KUMEX_ONLINE_ || process.env.PRODUCTION === 'true'; -const baseUrl = IS_PRODUCT ? 'https://api.kumex.com' : 'https://sandbox-api.kumex.com'; - -log(`http use baseUrl: (${baseUrl})`); - -let HttpConfig = { - signatureConfig: { - - }, - baseUrl, -}; - -class Http { - - setSignatureConfig(config) { - HttpConfig.signatureConfig = config; - } - - static sign(text = '', secret = '') { - return CryptoJS - .createHmac('sha256', secret) - .update(text) - .digest('base64'); - } - - - // - static auth(configs, data = '', secret = '') { - - const isKeyVersion2 = keyVersion2(HttpConfig.signatureConfig.keyVersion); - - const timestamp = Date.now(); - - const signature = Http.sign(timestamp + configs.method.toUpperCase() + configs.url + data, secret); - - if (!HttpConfig.signatureConfig.key) { - log('KC-API-KEY is not specified'); - } - if (!HttpConfig.signatureConfig.passphrase) { - log('KC-API-PASSPHRASE is not specified'); - } - const headers = { - // ...(configs.headers || {}), - 'KC-API-KEY': HttpConfig.signatureConfig.key || '', - 'KC-API-SIGN': signature, - 'KC-API-TIMESTAMP': timestamp, - 'KC-API-PASSPHRASE': HttpConfig.signatureConfig.passphrase || '', - 'Content-Type': 'application/json', - }; - - if (isKeyVersion2) { - headers['KC-API-PASSPHRASE'] = Http.sign(HttpConfig.signatureConfig.passphrase || '', secret); - headers['KC-API-KEY-VERSION'] = HttpConfig.signatureConfig.keyVersion; - }; - - return headers; - } - - - post(url = '', params = {}) { - const _url = HttpConfig.baseUrl + url; - const body = JSON.stringify(params || '{}'); - const _config = Http.auth({ - method: 'POST', - url, - }, body, HttpConfig.signatureConfig.secret) - return this._request({ - url: _url, - method: 'POST', - headers: _config, - body, - }); - } - - paramsStr (params = {}) { - return Object.keys(params).join('&') - } - - - /** - * 处理get/delete 的参数 - */ - resolveQueryParams(url, params = {}) { - const [ urlStr, urlParamsStr ] = url.split('?'); - const _p = Object.assign({}, querystring.parse(urlParamsStr || ''), params); - const _hasParams = Object.keys(_p || {}).length > 0 - const _params = _hasParams ? ('?' + querystring.stringify(_p)) : '' - const uri =urlStr + _params; - return { - url: HttpConfig.baseUrl + uri, //最终请求地址 - params: _params, // 参数字符串 - uri, // uri - } - } - - - get(url = '', params = {}) { - - const resolvedConfig = this.resolveQueryParams(url, params); - - const _config = Http.auth({ - method: 'GET', - url: resolvedConfig.uri, - }, '', HttpConfig.signatureConfig.secret) - - return this._request({ - url: resolvedConfig.url, - method: 'GET', - headers: _config, - }); - } - - del(url = '', params = {}) { - - const resolvedConfig = this.resolveQueryParams(url, params); - - const _config = Http.auth({ - method: 'DELETE', - url: resolvedConfig.uri, - }, '', HttpConfig.signatureConfig.secret) - - return this._request({ - url: resolvedConfig.url, - method: 'DELETE', - headers: _config, - }); - } - - _request(config) { - return new Promise((resolve, reject) => { - request(Object.assign({}, config, { - agentOptions: { - securityOptions: 'SSL_OP_NO_SSLv3', - }, - rejectUnauthorized : false, - }), (error, response, body) => { - try { - log('res:', error, config.url, response.statusCode, response.statusMessage, body); - } catch (e) { - log(e); - } - - if (error) { - reject(error); - } else { - try { - const res = JSON.parse(body); - if (res.code == codes.SUCCESS || res.code == codes.SHORT_SUCCESS) { - resolve(res); - } else { - reject(res); - } - } catch (e) { - reject(e); - } - } - }); - }).catch((e) => { - log('HTTP ERROR',JSON.stringify(config), e); - }); - } -} - -export default new Http(); \ No newline at end of file diff --git a/src/lib/log.js b/src/lib/log.js deleted file mode 100644 index 7386569..0000000 --- a/src/lib/log.js +++ /dev/null @@ -1,81 +0,0 @@ -const process = require('process'); - -import log4js from 'log4js'; -import path from 'path'; -import moment from 'moment'; -import { getEnv } from './env'; - -const configure = getEnv(); -const LOG_TYPES = ['warn', 'info', 'debug', 'error']; - -class Log { - constructor() { - const { writeFile, stdout, logFolder } = configure.log || {}; - this.writeFile = writeFile; - this.logFolder = logFolder; - this.stdout = stdout; - } - - init = () => { - if (!this.writeFile && !this.stdout) { - return; - } - - const nowTime = moment().format('YYYY-MM-DD_HH:mm:ss'); - let logFile; - if (this.logFolder) { - logFile = path.resolve(this.logFolder, `./${nowTime}.log`); - } else { - const cwd = process.cwd(); - logFile = path.resolve(cwd, `./logs/${nowTime}.log`); - } - console.log('log file', logFile); - log4js.configure({ - appenders: { - out: { type: 'stdout' }, - writeFile: { type: 'file', filename: logFile } - }, - categories: { - default: { - appenders: this.writeFile ? ['writeFile'] : ['out'], - level: 'debug', - }, - }, - }); - // 注入常用方法,不用再次获取实例 - LOG_TYPES.forEach((method)=> { - this[method] = (msg, logger) => { - this.log(msg, method, logger); - } - }) - } - - getLogger = (logger) => { - return log4js.getLogger(logger); - } - - log = (msg, type = 'info', logger) => { - if (!this.writeFile && !this.stdout) { - return; - } - - const _logger = this.getLogger(logger); - _logger[type](msg) - } -} - -const log4 = new Log(); -log4.init(); - -const log = (...props) => { - const lastP = props[props.length - 1]; - const isDefinedMethod = LOG_TYPES.indexOf(lastP) > -1; - const _type = isDefinedMethod ? lastP : 'info'; - const _str = props.slice(0, isDefinedMethod ? -1 : undefined).reduce((sum, cur) => { - return sum + ' ' + JSON.stringify(cur) + ' ' - }, '') - const logger = log4.getLogger(); - logger[_type](`${_str}`); -} - -export default log; \ No newline at end of file diff --git a/src/lib/utils.js b/src/lib/utils.js deleted file mode 100644 index 38864da..0000000 --- a/src/lib/utils.js +++ /dev/null @@ -1,99 +0,0 @@ -import _ from 'lodash'; -import uuid from 'uuid/v4'; - -export const targetTypesMap = { - sell: 'asks', - buy: 'bids', -}; - -export const keyVersion2 = (version) => { - return version && version === 2; -}; - -export const genUUID = (prefix = '')=> { - return prefix + '__' +uuid(); -}; - -export const mergeDepth = (price, type, depth = 1) => { - if (type === 'asks') { - price = Math.ceil(price / depth) * depth; - } else { - price = Math.floor(price / depth) * depth; - } - return price; -}; - -export const checkContinue = (arrBuffer = [], seq, seqIndex = 0) => { - if (arrBuffer.length) { - if (arrBuffer[0][seqIndex] !== seq +1) { - return false; - } - - for (let i = 0; i < arrBuffer.length; i++) { - if (arrBuffer[i + 1] && arrBuffer[i + 1][seqIndex] !== arrBuffer[i][seqIndex] + 1) { - return false; - } - } - } - return true; -}; - -// ----> for level2 -export const mapArr = (arr = [], parseKey = (str) => str) => { - const res = {}; - for (let i = 0; i< arr.length; i++) { - const item = arr[i]; - res[parseKey(item[0])] = item[1]; - } - return res; -}; - -// ----> for level2 -export const arrMap = (map = {}, order = 'asc') => { - const res = []; - _.each(map, (value, key) => { - res.push([key, value]); - }); - res.sort((a, b) => { - if (order === 'desc') { - return b[0] - a[0]; - } else { - return a[0] - b[0]; - } - }); - return res; -}; - -// ----> for level3 -export const mapl3Arr = (arr = []) => { - const res = {}; - for (let i = 0; i< arr.length; i++) { - const item = arr[i]; - res[item[1]] = item; // orderId - } - return res; -}; - -// ----> for level3 -export const arrl3Map = (map = {}, side, order = 'asc') => { - const res = []; - _.each(map, (item) => { - // [下单时间, 订单号, 价格, 数量, 进入买卖盘时间] - const [orderTime, orderId, price, size, ts] = item; - res.push([mergeDepth(price, side), size, ts, orderId]); - }); - res.sort((a, b) => { - if (a[0] === b[0]) { - // 价格相同的订单以进入买卖盘的时间从低到高排序 - return a[2] - b[2]; - } else { - // 价格排序 - if (order === 'desc') { - return b[0] - a[0]; - } else { - return a[0] - b[0]; - } - } - }); - return res; -}; diff --git a/src/resetAPI/constants.ts b/src/resetAPI/constants.ts new file mode 100644 index 0000000..88387d6 --- /dev/null +++ b/src/resetAPI/constants.ts @@ -0,0 +1,52 @@ +// account endpoint +export const FUTURES_ACCOUNT_OVERVIEW_EP = '/api/v1/account-overview'; +export const FUTURES_TRANSACTION_HISTORY_EP = '/api/v1/transaction-history'; +export const FUTURES_SUB_API_EP = '/api/v1/sub/api-key'; +export const FUTURES_UPDATE_SUB_API_EP = '/api/v1/sub/api-key/update'; + +// transfer endpoint +export const FUTURES_TRANSFER_OUT_EP = '/api/v3/transfer-out'; +export const FUTURES_TRANSFER_IN_EP = '/api/v1/transfer-in'; +export const FUTURES_TRANSFER_LIST_EP = '/api/v1/transfer-list'; + + +// order endpoint +export const FUTURES_ORDER_EP = '/api/v1/orders'; +export const FUTURES_STOP_ORDER_EP = '/api/v1/stopOrders'; +export const FUTURES_RECENT_DONE_ORDERS_EP = '/api/v1/recentDoneOrders'; + +// fills endpoint +export const FUTURES_FILLS_EP = '/api/v1/fills'; +export const FUTURES_RECENT_FILLS_EP = '/api/v1/recentFills'; +export const FUTURES_TOTAL_OPEN_ORDERS_MARGIN_EP = + '/api/v1/openOrderStatistics'; + +// position endpoint +export const FUTURES_POSITION_EP = '/api/v1/position'; +export const FUTURES_POSITIONS_EP = '/api/v1/positions'; +export const FUTURES_POSITION_AUTO_DEPOSIT_STATUS_EP = + '/api/v1/position/margin/auto-deposit-status'; +export const FUTURES_POSITION_MARGIN_EP = + '/api/v1/position/margin/deposit-margin'; + +// other endpoint +export const FUTURES_RISK_LIMIT_EP = '/api/v1/contracts/risk-limit'; +export const FUTURES_CHANGE_RISK_LIMIT_EP = '/api/v1/position/risk-limit-level/change'; +export const FUTURES_FUNDING_HISTORY_EP = '/api/v1/funding-history'; + +// market endpoint +export const FUTURES_CONTRACTS_ACTIVE_EP = '/api/v1/contracts/active'; +export const FUTURES_CONTRACTS_DETAIL_EP = 'api/v1/contracts'; +export const FUTURES_TICKER_EP = '/api/v1/ticker'; +export const FUTURES_LEVEL2_EP = '/api/v1/level2/snapshot'; +export const FUTURES_LEVEL2_20_EP = '/api/v1/level2/depth20'; +export const FUTURES_LEVEL2_100_EP = '/api/v1/level2/depth100'; +export const FUTURES_TRADE_HISTORY_EP = '/api/v1/trade/history'; +export const FUTURES_INTEREST_EP = '/api/v1/interest/query'; +export const FUTURES_INDEX_EP = '/api/v1/index/query'; +export const FUTURES_MARK_PRICE_EP = '/api/v1/mark-price'; +export const FUTURES_PREMIUM_EP = '/api/v1/premium/query'; +export const FUTURES_FUNDING_RATE_EP = '/api/v1/funding-rate'; +export const FUTURES_TIMESTAMP_EP = '/api/v1/timestamp'; +export const FUTURES_SERVICE_STATUS_EP = '/api/v1/status'; +export const FUTURES_KLINE_EP = '/api/v1/kline/query'; \ No newline at end of file diff --git a/src/resetAPI/futuresOrder.ts b/src/resetAPI/futuresOrder.ts new file mode 100644 index 0000000..15cc133 --- /dev/null +++ b/src/resetAPI/futuresOrder.ts @@ -0,0 +1,174 @@ +import pick from 'lodash/pick'; + +import { FUTURES_ORDER_EP } from './constants'; + +import { OrderOptionalParamsType, OrderBody } from '../dataType'; + +export const STOP_TYPES = ['down', 'up']; +export const STOP_PRICE_TYPES = ['TP', 'IP', 'MP']; +export const TIME_IN_FORCE_TYPES = ['GTC', 'IOC']; +export const OPTIONAL_PARAMS: OrderOptionalParamsType[] = [ + 'type', + 'remark', + 'stop', + 'stopPriceType', + 'stopPrice', + 'reduceOnly', + 'closeOrder', + 'forceHold', + 'timeInForce', + 'postOnly', + 'hidden', + 'iceberg', + 'visibleSize' +]; + +const LIMIT = 'limit'; +const MARKET = 'market'; + +/** + * create order-(buy|sell) body + * @param side + * @param symbol + * @param size + * @param price + * @param leverage + * @param optional + */ +export const makeFuturesOrderBody = ({ + side, + symbol, + size, + price, + leverage = 1, + clientOid, + optional = {} +}: OrderBody) => { + if (!size || !(size % 1 === 0)) { + throw new TypeError('The order size must be an integer!'); + } + + let type = LIMIT; + if (!price) { + type = MARKET; + } + + const { + stop, + stopPriceType, + stopPrice, + timeInForce = 'GTC', + postOnly, + hidden = false, + iceberg = false, + ...other + } = optional; + + let body: object = { + side, + symbol, + type, + size, + leverage, + clientOid, + ...pick(other, OPTIONAL_PARAMS) + }; + if (stop) { + if (!STOP_TYPES.includes(stop)) { + throw new RangeError( + 'The value of stop is not accepted, must be (down | up).' + ); + } + if (!stopPriceType || !stopPrice) { + throw new TypeError( + 'To set the stop attribute, you must set the stopPrice and stopPriceType parameters.' + ); + } + if (!STOP_PRICE_TYPES.includes(stopPriceType)) { + throw new RangeError( + 'The value of stopPriceType is not accepted, must be (TP | IP | MP).' + ); + } + body = { + ...body, + stop, + stopPriceType, + stopPrice + }; + } + if (type === LIMIT || optional.type === LIMIT) { + if (!TIME_IN_FORCE_TYPES.includes(timeInForce)) { + throw new RangeError( + 'The value of timeInForce is not accepted, must be (GTC | IOC).' + ); + } + if (timeInForce === 'IOC' || hidden || iceberg) { + body = { + ...body, + timeInForce, + hidden, + iceberg + }; + } else { + body = { + price, + ...body, + timeInForce, + postOnly + }; + } + } + return body; +}; + +/** + * return futures order make body and endpoint + * @param {any} params。 + * @param {string} method - DEFAULT 'GET'。 + * @returns {Object} return { body, endpoint }。 + */ +const returnBodyAndEndpoint = (params: any, method = 'GET') => { + let endpoint = FUTURES_ORDER_EP; + let body = params; + switch (method) { + case 'POST': { + if (typeof params === 'object') { + const { + side, + symbol, + size, + price, + leverage, + clientOid, + optional + } = params; + body = makeFuturesOrderBody({ + side, + symbol, + size, + price, + leverage, + clientOid, + optional + }); + } + break; + } + case 'DELETE': { + if (params && typeof params === 'string') { + endpoint = `${endpoint}/${params}`; + body = ''; + } + break; + } + case 'GET': { + if (typeof params === 'object' && params.clientOid) { + endpoint = `${endpoint}/byClientOid`; + } + break; + } + } + return { body, endpoint }; +}; + +export default returnBodyAndEndpoint; diff --git a/src/resetAPI/index.ts b/src/resetAPI/index.ts new file mode 100644 index 0000000..08ce0a9 --- /dev/null +++ b/src/resetAPI/index.ts @@ -0,0 +1,8 @@ +import returnBodyAndEndpoint from "./futuresOrder"; + +export * from './constants'; + +export { + returnBodyAndEndpoint +}; + diff --git a/src/start.js b/src/start.js deleted file mode 100644 index 9f410c8..0000000 --- a/src/start.js +++ /dev/null @@ -1,21 +0,0 @@ -require('babel-register'); - -global._RUN_AS_FRAMEWORK_HELPER_ = true; - -const path = require('path'); -// const fs = require('fs'); - -process.on('unhandledRejection', error => { - console.error('unhandledRejection', error); - process.exit(1) // To exit with a 'failure' code -}); - -const [$node, $start, $appName] = process.argv; -const appName = $appName || 'template'; -const modulePath = path.resolve( - __dirname, - '../app/', - `${appName}.js` -); - -require(modulePath); \ No newline at end of file diff --git a/src/tools/constants.ts b/src/tools/constants.ts new file mode 100644 index 0000000..4e29329 --- /dev/null +++ b/src/tools/constants.ts @@ -0,0 +1,8 @@ +export const TIME_OUT = 10000; + +export const GET = 'GET'; +export const POST = 'POST'; +export const DELETE = 'DELETE'; + +export const SANDBOX_ADDR_EP = 'https://api-sandbox-futures.kucoin.com'; +export const PROD_ADDR_EP = 'https://api-futures.kucoin.com'; diff --git a/src/tools/request.ts b/src/tools/request.ts new file mode 100644 index 0000000..48346d7 --- /dev/null +++ b/src/tools/request.ts @@ -0,0 +1,206 @@ +import axios, { AxiosRequestConfig } from 'axios'; + +import https from 'https'; + +import { makeQueryString, cryptoHmac } from './tools'; +import { TIME_OUT, PROD_ADDR_EP, SANDBOX_ADDR_EP } from './constants'; + +const httpsAgent = new https.Agent({ rejectUnauthorized: false }); + + + +/** + * return api signature header + * @param {object} configs + * @param {string | object} data + */ +export const apiAuth = (configs: any, data = '') => { + const { + key = '', + passphrase = '', + secret, + method, + url: endpoint, + version = '2' + } = configs; + + if (!key) { + console.log( + 'KC-API-KEY is not specified more information see here https://docs.kucoin.com/futures/#general' + ); + } + if (!passphrase) { + console.log( + 'KC-API-PASSPHRASE is not specified more information see here https://docs.kucoin.com/futures/#general' + ); + } + + const timestamp = Date.now(); + + const signature = cryptoHmac( + timestamp + (method || '').toUpperCase() + endpoint + data, + secret + ); + + const authParams = { + 'KC-API-KEY': key, + 'KC-API-SIGN': signature, + 'KC-API-TIMESTAMP': timestamp.toString(), + 'KC-API-PASSPHRASE': passphrase, + 'KC-API-KEY-VERSION': version, + 'Content-Type': 'application/json', + 'User-Agent': `KuCoin-Futures-Node-SDK/${version}` + }; + + if (version && version == 2) { + authParams['KC-API-PASSPHRASE'] = cryptoHmac(passphrase, secret); + } + + return authParams; +}; + +/** + * create axios request + * @param {string} env -- set baseURL + * @param {string} key -- set KC-API-KEY + * @param {string} passphrase -- KC-API-PASSPHRASE + * @param {string} secret -- set Secret + * @param {object} other -- set axios instance + * @function setSignatureConfig -- set {key,passphrase,secret} + * @function request -- axios request return promise + */ +export default class Request { + private axiosInstance: any; + private key: string | number; + private secret: string | number; + private passphrase: string | number; + private version: string | number; + constructor(props: { + key: string | number; + secret: string | number; + passphrase: string | number; + env?: string; + version?: string | number; + }) { + const { + env = 'prod', + key = '', + secret, + passphrase = '', + version = 2, + ...other + } = props || {}; + const baseURL = env === 'prod' ? PROD_ADDR_EP : SANDBOX_ADDR_EP; + + this.axiosInstance = axios.create({ + baseURL, + timeout: TIME_OUT, + httpsAgent, + ...other + }); + this.key = key; + this.secret = secret; + this.passphrase = passphrase; + this.version = version; + } + + setSignatureConfig(config: any = {}) { + const { key, secret, passphrase } = config; + if (key) { + this.key = key; + } + if (secret) { + this.secret = secret; + } + if (passphrase) { + this.passphrase = passphrase; + } + } + + signatureRequest(url: string, data: any, method = 'GET', config = {}) { + let authUrl = url; + let body = data; + + const axiosConfig: AxiosRequestConfig = { + method, + url: authUrl, + ...config + }; + + if (method === 'GET') { + authUrl = + typeof data === 'object' + ? `${url}?${makeQueryString(data)}` + : data + ? `${url}/${data}` + : url; + axiosConfig.url = authUrl; + body = ''; + } else { + if (data) { + axiosConfig.data = data; + body = JSON.stringify(data); + } + } + + const headerAuth = apiAuth( + { + method, + secret: this.secret, + key: this.key, + passphrase: this.passphrase, + url: authUrl, + version: this.version + }, + body + ); + + axiosConfig.headers = headerAuth; + + return new Promise((resolve, reject) => { + this.axiosInstance(axiosConfig) + .then((response: any) => { + resolve(response.data); + }) + .catch((err: any) => { + reject(err); + console.log(JSON.stringify(err)); + }); + }); + } + + requestPublic(url: string, data: any, method = 'GET', config = {}) { + let authUrl = url; + + const axiosConfig: AxiosRequestConfig = { + method, + url: authUrl, + ...config + }; + + if (method === 'GET') { + authUrl = + typeof data === 'object' + ? `${url}?${makeQueryString(data)}` + : data + ? `${url}/${data}` + : url; + axiosConfig.url = authUrl; + } else { + if (data) { + axiosConfig.data = data; + } + } + + return new Promise((resolve, reject) => { + this.axiosInstance(axiosConfig) + .then((response: any) => { + resolve(response.data); + }) + .catch((err: any) => { + reject(err); + console.log(JSON.stringify(err)); + }); + }); + } +} diff --git a/src/tools/tools.ts b/src/tools/tools.ts new file mode 100644 index 0000000..d4c2e46 --- /dev/null +++ b/src/tools/tools.ts @@ -0,0 +1,74 @@ +import omitBy from 'lodash/omitBy'; +import crypto from 'crypto'; + +/** + * make object query to string + * @param {object} query + */ +export const makeQueryString = (query: any): string => { + return Object.keys(query) + .reduce((acc: Array, key) => { + if (query[key] !== undefined) { + acc.push(`${key}=${encodeURIComponent(query[key])}`); + } + return acc; + }, []) + .join('&'); +}; + +/** + * filter empty values + * @param obj + * @returns filterObj + */ +export const filterEmptyValues = (obj: any) => { + if (typeof obj !== 'object') return obj; + const omitValue = omitBy( + obj, + (value) => value === null || value === undefined || value === '' + ); + if (!omitValue || !Object.keys(omitValue).length) return ''; + return omitValue; +}; + +/** + * make symbol + * @param symbols + * @returns string + */ +export const joinSymbol = (symbols: string | any[]) => { + if (!symbols) { + console.log('Required parameter symbol'); + return false; + } + let symbolStr = symbols; + if (Array.isArray(symbols)) { + symbolStr = symbols.join(','); + } + return symbolStr; +}; +/** + * Currently there is a limit of 100 parameters, too many parameters need to be divided + * @param arr array + * @param chunkSize number default 90 + * @returns array + */ +export const splitArray = (arr: any[], chunkSize: number = 90) => { + const result = []; + for (let i = 0; i < arr.length; i += chunkSize) { + result.push(joinSymbol(arr.slice(i, i + chunkSize))); + } + return result; +}; + +/** + * make sha256 + * @param text string + * @param secret string + * @returns sha256 - base64 + */ +export const cryptoHmac = (text = '', secret = '') => { + return crypto.createHmac('sha256', secret).update(text).digest('base64'); +}; + +export const log = (d: any) => console.log(d); \ No newline at end of file diff --git a/src/websocket/constants.ts b/src/websocket/constants.ts new file mode 100644 index 0000000..15a15ba --- /dev/null +++ b/src/websocket/constants.ts @@ -0,0 +1,24 @@ +// Apply for Connection Token + +export const PUBLIC_BULLET_EP = '/api/v1/bullet-public'; +export const PRIVATE_BULLET_EP = '/api/v1/bullet-private'; + +export const CONNECT_ID = '_futures_socket_welcome'; + +// public socket topic +export const TICKER_V2 = '/contractMarket/tickerV2'; +export const TICKER = '/contractMarket/ticker'; +export const LEVEL2 = '/contractMarket/level2'; +export const LEVEL2_DEPTH5 = '/contractMarket/level2Depth5'; +export const LEVEL2_DEPTH50 = '/contractMarket/level2Depth50'; +export const INSTRUMENT = '/contract/instrument'; +export const ANNOUNCEMENT = '/contract/announcement'; +export const SNAPSHOT = '/contractMarket/snapshot'; +export const EXECUTION = '/contractMarket/execution'; + + +// private socket topic +export const TRADE_ORDERS = '/contractMarket/tradeOrders'; +export const ADVANCE_ORDERS = '/contractMarket/advancedOrders'; +export const WALLET = '/contractAccount/wallet'; +export const POSITION = '/contract/position'; \ No newline at end of file diff --git a/src/websocket/index.ts b/src/websocket/index.ts new file mode 100644 index 0000000..3e7d549 --- /dev/null +++ b/src/websocket/index.ts @@ -0,0 +1,4 @@ +import WebSocketClient from './socket'; + +export * from './constants'; +export { WebSocketClient }; diff --git a/src/websocket/socket.ts b/src/websocket/socket.ts new file mode 100644 index 0000000..1bd323c --- /dev/null +++ b/src/websocket/socket.ts @@ -0,0 +1,229 @@ +import WebSocket from 'ws'; +import { uniqWith, isEqual, forEach } from 'lodash'; +import { Subscription, Callback } from '../dataType/socket'; + +export default class WebSocketClient { + private ws: WebSocket; + private _url: string; + private alive: boolean = false; + private messageHandler: any[] = []; + private heartbeatInterval: NodeJS.Timeout | null = null; + private pingTimeout: NodeJS.Timeout | null = null; + public subscriptions: Subscription[] = []; + + constructor(url: string, websocket: WebSocket) { + this.ws = websocket; + this._url = url; + + this.setupWebSocket(); + } + + generateId(): string { + return ( + '_futures_' + Date.now() + (Math.random() * 365).toString(16).slice(4, 14) + ); + } + + getPrefixTopic(topic: string): string { + if (!topic) return ''; + return topic.split(':')[0]; + } + + socketSend(data: object): void { + const params = JSON.stringify(data); + console.log('socket send --->', params); + this.ws.send(params); + } + + setupWebSocket(): void { + this.ws.on('open', () => { + console.log('WebSocket connected'); + this.alive = true; + this.startHeartbeat(); + this.startPing(); + this.resubscribe(); + this.patchAllMessage(); + }); + + this.ws.on('message', (data) => { + const message = JSON.parse(data.toString()); + + if (message) { + switch (message.type) { + case 'welcome': + case 'ack': + console.log('socket message --->', message); + break; + case 'pong': + console.log('socket message --->', message); + this.stopPing(); + break; + default: + this.handleMessage(message); + } + } + }); + + this.ws.on('close', () => { + console.log('WebSocket disconnected'); + this.alive = false; + + this.stopHeartbeat(); + this.stopPing(); + this.reconnect(); + }); + + this.ws.on('error', (error) => { + this.alive = false; + console.error('WebSocket error:', error); + }); + } + + // Send ping messages every 59s + startHeartbeat(): void { + if (this.heartbeatInterval) { + clearInterval(this.heartbeatInterval); + } + this.heartbeatInterval = setInterval(() => { + this.resetPingTimeout(); + this.socketSend({ id: this.generateId(), type: 'ping' }); + }, 59000); + } + + // Stop ping message + stopHeartbeat(): void { + if (this.heartbeatInterval) { + clearInterval(this.heartbeatInterval); + + this.heartbeatInterval = null; + } + } + + // Init Send ping message + startPing(): void { + this.resetPingTimeout(); + this.socketSend({ id: this.generateId(), type: 'ping' }); + } + + // Clear ping timeout + stopPing(): void { + if (this.pingTimeout) { + clearTimeout(this.pingTimeout); + + this.pingTimeout = null; + } + } + + // Reset Ping timeout + resetPingTimeout(): void { + if (this.pingTimeout) { + clearTimeout(this.pingTimeout); + } + + this.pingTimeout = setTimeout(() => { + console.log('No pong received within 10 seconds, disconnecting...'); + + this.ws.terminate(); + }, 10000); + } + + // resubscribe + resubscribe(): void { + this.subscriptions.forEach(({ id, topic, privateChannel }) => { + this.socketSend({ + id, + type: 'subscribe', + topic, + privateChannel, + response: true + }); + }); + } + + handleMessage(message: any): void { + this.subscriptions.forEach(({ topic, callback, strict }) => { + if (strict) { + if (topic === message.topic) { + callback(message); + } + } else { + if (this.getPrefixTopic(topic) === this.getPrefixTopic(message.topic)) { + callback(message); + } + } + }); + } + + // When sending a message to the socket channel, + // the socket may not be connected at this time, + // it needs to be saved, wait for the connection to be established, + // and trigger the message in messageHandler + patchAllMessage(): void { + const sendMessages = uniqWith(this.messageHandler, isEqual); + forEach(sendMessages, (sendMessage) => { + this.socketSend(sendMessage); + this.messageHandler = this.messageHandler.filter( + (item) => !isEqual(sendMessage, item) + ); + }); + } + + getConnectionState(): number { + return this.ws.readyState; + } + + subscribe( + topic: string, + callback: Callback, + privateChannel: boolean = false, + strict = true + ): Function { + const _id = this.generateId(); + this.subscriptions.push({ + id: _id, + topic, + privateChannel, + callback, + strict + }); + + return () => this.unsubscribe(topic, _id); + } + + unsubscribe(topic: string, id: string): void { + const currentTopic = this.subscriptions.find((subscription) => { + if (id) return subscription.topic === topic && subscription.id === id; + return subscription.topic === topic; + }); + + if (currentTopic) { + const sendMessage = { + id: this.generateId(), + type: 'unsubscribe', + topic, + privateChannel: currentTopic.privateChannel, + response: true + }; + + if (this.alive) { + this.socketSend(sendMessage); + } else { + this.messageHandler.push(sendMessage); + } + } + + this.subscriptions = this.subscriptions.filter((subscription) => { + if (id) return !(subscription.topic === topic && subscription.id === id); + return subscription.topic !== topic; + }); + } + + // reconnect WebSocket + reconnect(): void { + console.log('Attempting to reconnect...'); + setTimeout(() => { + this.ws = new WebSocket(this._url); + this.setupWebSocket(); + }, 5000); + } +} diff --git a/test/__mocks__/ws.ts b/test/__mocks__/ws.ts new file mode 100644 index 0000000..8407510 --- /dev/null +++ b/test/__mocks__/ws.ts @@ -0,0 +1,49 @@ +// Mock Event emitter +export default class Socket { + events: any; + readyState: string; + constructor() { + this.events = {}; + this.readyState = 'init'; + } + + // on + on(eventName, callback) { + if (!this.events[eventName]) { + this.events[eventName] = []; + } + + this.events[eventName].push(callback); + } + + // off + off(eventName, callback) { + if (!this.events[eventName]) { + return; + } + + this.events[eventName] = this.events[eventName].filter( + (cb) => cb !== callback + ); + } + + // emit + emit(eventName, ...args) { + if (!this.events[eventName]) { + return; + } + + this.events[eventName].forEach((callback) => { + callback.apply(null, args); + }); + } + + send(eventName, ...args){ + this.emit(eventName, ...args); + } + + terminate(){ + this.emit('close'); + this.readyState = 'close'; + } +} diff --git a/test/futuresOrder.test.ts b/test/futuresOrder.test.ts new file mode 100644 index 0000000..df7bdf4 --- /dev/null +++ b/test/futuresOrder.test.ts @@ -0,0 +1,149 @@ +import returnBodyAndEndpoint, { + makeFuturesOrderBody +} from '../src/resetAPI/futuresOrder'; + +describe('makeFuturesOrderBody', () => { + it('should throw an error if size is not an integer', () => { + const orderBody = { + side: 'buy', + symbol: 'BTCUSD', + size: 1.5, + price: 10000 + }; + + expect(() => makeFuturesOrderBody(orderBody)).toThrow( + 'The order size must be an integer!' + ); + }); + + it('should create a market order if price is not provided', () => { + const orderBody = { + side: 'buy', + symbol: 'BTCUSD', + size: 1 + }; + + const result = makeFuturesOrderBody(orderBody); + expect(result).toHaveProperty('type', 'market'); + }); + + it('should create a limit order if price is provided', () => { + const orderBody = { + side: 'buy', + symbol: 'BTCUSD', + size: 1, + price: 10000 + }; + + const result = makeFuturesOrderBody(orderBody); + expect(result).toHaveProperty('type', 'limit'); + }); + + it('should throw an error if stop is not accepted', () => { + const orderBody = { + side: 'buy', + symbol: 'BTCUSD', + size: 1, + price: 10000, + optional: { + stop: 'invalid' + } + }; + + expect(() => makeFuturesOrderBody(orderBody)).toThrow( + 'The value of stop is not accepted, must be (down | up).' + ); + }); + + it('should throw an error if stopPrice is not accepted', () => { + const orderBody = { + side: 'buy', + symbol: 'BTCUSD', + size: 1, + price: 10000, + optional: { + stop: 'up', + stopPriceType: 'WP', + } + }; + + expect(() => makeFuturesOrderBody(orderBody)).toThrow( + 'To set the stop attribute, you must set the stopPrice and stopPriceType parameters.' + ); + }); + + it('should throw an error if stopPriceType is not accepted', () => { + const orderBody = { + side: 'buy', + symbol: 'BTCUSD', + size: 1, + price: 10000, + optional: { + stop: 'up', + stopPrice: 100, + stopPriceType: 'WP', + } + }; + + expect(() => makeFuturesOrderBody(orderBody)).toThrow( + 'The value of stopPriceType is not accepted, must be (TP | IP | MP).' + ); + }); +}); + +describe('futuresOrder', () => { + it('should return the correct body and endpoint for POST method', () => { + const params = { + side: 'buy', + symbol: 'BTC', + size: 1, + price: 10000, + leverage: 10, + optional: {} + }; + + const result = returnBodyAndEndpoint(params, 'POST'); + expect(result.body).toBeDefined(); + expect(result.endpoint).toBe('/api/v1/orders'); + }); + + it('should return the correct endpoint and body for POST method', () => { + const params = { + side: 'buy', + symbol: 'BTCUSD', + size: 1, + price: 10000 + }; + const result = returnBodyAndEndpoint(params, 'POST'); + expect(result.endpoint).toBe('/api/v1/orders'); + expect(result.body).toMatchObject({ + side: 'buy', + symbol: 'BTCUSD', + type: 'limit', + size: 1, + leverage: 1, + timeInForce: 'GTC', + postOnly: undefined + }); + }); + + it('should return the correct endpoint for DELETE method with string parameter', () => { + const params = 'order123'; + const result = returnBodyAndEndpoint(params, 'DELETE'); + expect(result.body).toBe(''); + expect(result.endpoint).toBe('/api/v1/orders/order123'); + }); + + it('should return the correct endpoint for GET method with object parameter containing clientOid', () => { + const params = { clientOid: 'client123' }; + const result = returnBodyAndEndpoint(params, 'GET'); + expect(result.body).toBe(params); + expect(result.endpoint).toBe('/api/v1/orders/byClientOid'); + }); + + it('should return the default endpoint for GET method with no parameters', () => { + const result = returnBodyAndEndpoint(undefined, 'GET'); + expect(result.body).toBeUndefined(); + expect(result.endpoint).toBe('/api/v1/orders'); + }); +}); diff --git a/test/request.test.ts b/test/request.test.ts new file mode 100644 index 0000000..d87ed08 --- /dev/null +++ b/test/request.test.ts @@ -0,0 +1,158 @@ +import axios from 'axios'; + +import Request, { apiAuth } from '../src/tools/request'; + +jest.mock('axios'); +const mockedAxios = jest.mocked(axios); + +describe('Request', () => { + const mockKey = 'mockKey'; + + const mockSecret = 'mockSecret'; + + const mockPassphrase = 'mockPassphrase'; + + beforeEach(() => { + mockedAxios.create.mockImplementation((): any => () => + Promise.resolve({ data: { success: true } }) + ); + }); + + test.each([ + { + desc: 'apiAuth key is undefined', + config: {} + }, + { + desc: 'apiAuth passphrase is undefined', + config: { key: 'test' } + } + ])('%o', ({ config }) => { + jest.spyOn(global.console, 'log'); + apiAuth(config); + expect(console.log).toBeCalled(); + }); + + test('apiAuth config', () => { + const configs = { + key: mockKey, + passphrase: mockPassphrase, + secret: mockSecret, + method: 'GET', + url: '/api/v1/symbols', + version: '2' + }; + + const headers = apiAuth(configs); + + expect(headers['KC-API-KEY']).toBe(mockKey); + + expect(headers['KC-API-PASSPHRASE']).toBeDefined(); + + expect(headers['KC-API-TIMESTAMP']).toBeDefined(); + + expect(headers['KC-API-KEY-VERSION']).toBe('2'); + }); + + test('constructor', () => { + const request = new Request({ + key: mockKey, + secret: mockSecret, + passphrase: mockPassphrase, + env: 'prod' + }); + + expect(request).toBeDefined(); + }); + + test('setSignatureConfig', () => { + const request = new Request({ + key: mockKey, + secret: mockSecret, + passphrase: mockPassphrase, + env: 'prod' + }); + + request.setSignatureConfig({ + key: 'newKey', + secret: 'newSecret', + passphrase: 'newPassphrase' + }); + + expect(request).toBeDefined(); + }); + + test('signatureRequest', async () => { + const request = new Request({ + key: mockKey, + secret: mockSecret, + passphrase: mockPassphrase, + env: 'prod' + }); + + const response = await request.signatureRequest( + '/api/v1/symbols', + 'BTC', + ); + + expect(response).toEqual({ success: true }); + }); + + test('signatureRequest post', async () => { + mockedAxios.create.mockImplementationOnce((): any => () => + Promise.reject({ err: 'test' }) + ); + jest.spyOn(global.console, 'log'); + const request = new Request({ + key: '', + secret: '', + passphrase: '', + env: 'sand' + }); + + try { + await request.signatureRequest( + '/api/v1/symbols', + { symbol: 'BTC' }, + 'POST' + ); + + expect(console.log).toBeCalled(); + } catch (err) { + expect(err).toEqual({ err: 'test' }); + } + }); + + test('requestPublic', async () => { + // @ts-ignore: test Request empty + const request = new Request(); + + const response = await request.requestPublic( + '/api/v1/symbols', + 'BTC', + ); + + expect(response).toEqual({ success: true }); + }); + + test('requestPublic post', async () => { + mockedAxios.create.mockImplementationOnce((): any => () => + Promise.reject({ err: 'test' }) + ); + jest.spyOn(global.console, 'log'); + const request = new Request({ + key: mockKey, + secret: mockSecret, + passphrase: mockPassphrase, + env: 'prod' + }); + + try { + await request.requestPublic('/api/v1/symbols', { symbol: 'BTC' }, 'POST'); + + expect(console.log).toBeCalled(); + } catch (err) { + expect(err).toEqual({ err: 'test' }); + } + }); +}); diff --git a/test/socket.test.ts b/test/socket.test.ts new file mode 100644 index 0000000..6b1f141 --- /dev/null +++ b/test/socket.test.ts @@ -0,0 +1,190 @@ +import WebSocket from 'ws'; +import WebSocketClient from '../src/websocket/socket'; + +// mock ws +jest.mock('ws'); + +jest.useFakeTimers(); + +describe('WebSocketClient', () => { + const mockSocket = new WebSocket('mock'); + const client = new WebSocketClient('ws://example.com', mockSocket); + + beforeEach(() => { + jest.spyOn(global.console, 'log'); + jest.spyOn(global.console, 'error'); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('should generate to match _futures_', () => { + expect(client.generateId()).toMatch('_futures_'); + }); + + it('should generate a unique ID', () => { + const id1 = client.generateId(); + const id2 = client.generateId(); + expect(id1).not.toEqual(id2); + }); + + it.each([ + { + desc: 'should get the prefix topic empty string', + topic: '', + expected: '' + }, + { + desc: 'should get the prefix topic', + topic: 'topic:ETH', + expected: 'topic' + } + ])('%o', ({ topic, expected }) => { + expect(client.getPrefixTopic(topic)).toBe(expected); + }); + + it('should socketSend data be JSON.stringify', () => { + const mockSend = jest.spyOn(WebSocket.prototype, 'send'); + const mockData = { data: 'test' }; + client.socketSend(mockData); + expect(console.log).toBeCalled(); + expect(mockSend).toBeCalled(); + expect(mockSend.mock.calls[0][0]).toBe(JSON.stringify(mockData)); + }); + + it('setupWebSocket ws on times', () => { + const mockSocket2 = new WebSocket('mock'); + const mockOn2 = jest.spyOn(WebSocket.prototype, 'on'); + new WebSocketClient('ws://example.com', mockSocket2); + expect(mockOn2).toHaveBeenCalledTimes(4); + }); + + it('setupWebSocket ws on open', () => { + const mockStartPing = jest.spyOn(WebSocketClient.prototype, 'startPing'); + const mockStartHeartbeat = jest.spyOn( + WebSocketClient.prototype, + 'startHeartbeat' + ); + const mockResubscribe = jest.spyOn( + WebSocketClient.prototype, + 'resubscribe' + ); + const mockPatchAllMessage = jest.spyOn( + WebSocketClient.prototype, + 'patchAllMessage' + ); + + const mockSocket2 = new WebSocket('mock'); + new WebSocketClient('ws://example.com', mockSocket2); + // emit open + mockSocket2.emit('open'); + expect(console.log).toBeCalled(); + expect(mockStartPing).toBeCalled(); + expect(mockStartHeartbeat).toBeCalled(); + expect(mockResubscribe).toBeCalled(); + expect(mockPatchAllMessage).toBeCalled(); + + // emit error + mockSocket2.emit('error', 'test socket error'); + expect(console.error).toBeCalled(); + + // emit close + mockSocket2.emit('close'); + expect(console.log).toBeCalled(); + }); + + it('should setupWebSocket on message', () => { + const mockStopPing = jest.spyOn(WebSocketClient.prototype, 'stopPing'); + const mockHandleMessage = jest.spyOn( + WebSocketClient.prototype, + 'handleMessage' + ); + const mockSocket2 = new WebSocket('mock'); + new WebSocketClient('ws://example.com', mockSocket2); + // emit message welcome + const welcomeMsg = { type: 'welcome' }; + mockSocket2.emit('message', JSON.stringify(welcomeMsg)); + + // @ts-ignore: spyOn global.console + expect(console.log.mock.calls[0][1]).toEqual(welcomeMsg); + + // emit message pong + const pongMsg = { type: 'pong' }; + mockSocket2.emit('message', JSON.stringify(pongMsg)); + expect(console.log).toBeCalled(); + expect(mockStopPing).toBeCalled(); + + // emit message other + const otherMsg = { type: 'other' }; + mockSocket2.emit('message', JSON.stringify(otherMsg)); + expect(mockHandleMessage).toBeCalledWith(otherMsg); + }); + + it('should startHeartbeat ping timeout', () => { + jest + .spyOn(WebSocketClient.prototype, 'startPing') + .mockImplementation(() => {}); + const mockTerminate = jest.spyOn(WebSocket.prototype, 'terminate'); + const mockSocket2 = new WebSocket('mock'); + new WebSocketClient('ws://example.com', mockSocket2); + // emit open + mockSocket2.emit('open'); + jest.runAllTimers(); + expect(mockTerminate).toBeCalled(); + }); + + it('should handleMessage strict callback', () => { + const mockSocket2 = new WebSocket('mock'); + const client2 = new WebSocketClient('ws://example.com', mockSocket2); + + const mockCallback1 = jest.fn(); + const mockCallback2 = jest.fn(); + + // strict true + client2.subscribe('handleMessage:ETH', mockCallback1, false, true); + // strict false + client2.subscribe('handleMessage:ETH', mockCallback2, false, false); + + // emit message other + const otherMsg = { type: 'other', topic: 'handleMessage' }; + mockSocket2.emit('message', JSON.stringify(otherMsg)); + + expect(mockCallback1).not.toBeCalled(); + expect(mockCallback2).toBeCalled(); + + const otherMsg2 = { type: 'other', topic: 'handleMessage:ETH' }; + mockSocket2.emit('message', JSON.stringify(otherMsg2)); + + expect(mockCallback1).toBeCalled(); + expect(mockCallback2).toHaveBeenCalledTimes(2); + }); + + it('should subscribe to a topic', () => { + const topic = 'test-topic'; + const callback = jest.fn(); + const privateChannel = false; + const strict = true; + + const unsubscribe = client.subscribe( + topic, + callback, + privateChannel, + strict + ); + + // subscriptions + expect(client.subscriptions).toHaveLength(1); + expect(client.subscriptions[0]).toMatchObject({ + topic, + callback, + privateChannel, + strict + }); + + // unsubscribe + unsubscribe(); + expect(client.subscriptions).toHaveLength(0); + }); +}); diff --git a/test/tools.test.ts b/test/tools.test.ts new file mode 100644 index 0000000..6c00736 --- /dev/null +++ b/test/tools.test.ts @@ -0,0 +1,64 @@ +import { + makeQueryString, + filterEmptyValues, + joinSymbol, + splitArray, + cryptoHmac +} from '../src/tools/tools'; + +describe('Utils', () => { + test('makeQueryString', () => { + const query = { + key1: 'value1', + key2: 'value2', + key3: undefined + }; + + expect(makeQueryString(query)).toBe('key1=value1&key2=value2'); + }); + + test('filterEmptyValues', () => { + const obj = { + key1: 'value1', + key2: null, + key3: '', + key4: undefined + }; + + expect(filterEmptyValues(obj)).toEqual({ key1: 'value1' }); + + const obj2 = ''; + expect(filterEmptyValues(obj2)).toEqual(''); + }); + + test('joinSymbol', () => { + const symbols = ['AAPL', 'GOOGL', 'TSLA']; + + expect(joinSymbol(symbols)).toBe('AAPL,GOOGL,TSLA'); + + expect(joinSymbol('AAPL')).toBe('AAPL'); + + expect(joinSymbol('')).toBe(false); + }); + + test('splitArray', () => { + const arr = Array.from({ length: 200 }, (_, i) => i + 1); + + const result: any[] = splitArray(arr); + + expect(result.length).toBe(3); + + expect(result[0].split(',').length).toBe(90); + expect(result[1].split(',').length).toBe(90); + expect(result[2].split(',').length).toBe(20); + }); + + test('cryptoHmac', () => { + const text = 'Hello, world!'; + const secret = 'mysecretkey'; + + const expected = 'k0jiDQEBW3xYgc/dh0c+RBQp5tcWug4rEZUeX35Awx0='; + + expect(cryptoHmac(text, secret)).toBe(expected); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5245f94 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,71 @@ +{ + "exclude": ["/node_modules/", "./lib/", "./node_modules/*", "**/*.test.ts"], + "include": ["src"], + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "lib" /* Redirect output structure to the directory. */, + "rootDir": "src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + "types": ["axios", "lodash", "ws", "uuid"], /* Type declaration files to be included in compilation. */ + "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/yarn.lock b/yarn.lock index 2c07e13..52ebdf4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,1755 +2,1494 @@ # yarn lockfile v1 -abbrev@1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg= +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject%2fremapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel%2fcode-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" + integrity sha1-1UgcUJXaocV+FuVMb5GYRDr7Sf8= + dependencies: + "@babel/highlight" "^7.10.1" + +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fcode-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fcompat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" + integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fcore/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" + integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.22.5", "@babel/generator@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fgenerator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" + integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" + integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" + integrity sha1-V3CwwagmxPU/Xt5eFTFj4DGOlLU= + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helpers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhelpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" + integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel%2fhighlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" + integrity sha1-hB0Ji6YTuhpCeis4PXnjVVLDiuA= + dependencies: + "@babel/helper-validator-identifier" "^7.10.1" + chalk "^2.0.0" + js-tokens "^4.0.0" -accepts@^1.3.5, accepts@~1.3.4: - version "1.3.7" - resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80= +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fhighlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" -after@0.8.2: - version "0.8.2" - resolved "https://registry.npm.taobao.org/after/download/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fparser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" + integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== -ajv@^6.5.5: - version "6.10.2" - resolved "https://registry.npm.taobao.org/ajv/download/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha1-086gTWsBeyiUrWkED+yLYj60vVI= +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha1-qYP7Gusuw/btBCohD2QOkOeG/g0= dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + "@babel/helper-plugin-utils" "^7.8.0" -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/ansi-align/download/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha1-TJpvZp9dDN8bkKFnHpoUa+UwDOo= dependencies: - string-width "^2.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s= +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA= + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha1-7mATSMNw+jNNIge+FYd3SWUh/VE= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1570188570027&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz?cache=0&sync_timestamp=1570188570027&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha1-ypHvRjA1MESLkGZSusLp/plB9pk= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1570188570027&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz?cache=0&sync_timestamp=1566431369422&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&sync_timestamp=1566431369422&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha1-YRGiZbz7Ag6579D9/X0mQCue1sE= dependencies: - color-convert "^1.9.0" + "@babel/helper-plugin-utils" "^7.8.0" -any-promise@^1.1.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo= +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw= dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + "@babel/helper-plugin-utils" "^7.14.5" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha1-vLJLTzeTTZqnrBe0ra+J58du8us= +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2fplugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" + "@babel/helper-plugin-utils" "^7.22.5" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha1-aALmJk79GMeQobDVF/DyYnvyyUo= +"@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2ftemplate/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha1-SzXClE8GKov82mZBB2A1D+nd/CE= +"@babel/traverse@^7.22.5", "@babel/traverse@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2ftraverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" + integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel%2ftypes/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== dependencies: - arr-flatten "^1.0.1" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe%2fv8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha1-daLotRy3WKdVPWgEpZMteqznXDk= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +"@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= + resolved "https://registry.yarnpkg.com/@istanbuljs%2fload-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha1-/T2x1Z7PfPEh6AZQu4ZxL5tV7O0= + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" -arr-union@^3.1.0: +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs%2fschema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg= + +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2fconsole/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2fcore/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2fenvironment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== + dependencies: + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2fexpect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2fexpect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== + dependencies: + expect "^29.5.0" + jest-snapshot "^29.5.0" + +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2ffake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== + dependencies: + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2fglobals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" + +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2freporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest%2fschemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest%2fsource-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2ftest-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2ftest-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== + dependencies: + "@jest/test-result" "^29.5.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + slash "^3.0.0" + +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2ftransform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest%2ftypes/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell%2fgen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": version "3.1.0" - resolved "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + resolved "https://registry.yarnpkg.com/@jridgewell%2fresolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell%2fset-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell%2fsourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.npm.taobao.org/arraybuffer.slice/download/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - integrity sha1-O7xCdd1YTMGxCAm4nU6LY6aednU= +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell%2fsourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY= +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell%2ftrace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" -async-each@^1.0.0, async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8= +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair%2ftypebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== -async-limiter@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha1-3TeelPDbgxCwgpH51kwyCXZmF/0= +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs%2fcommons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +"@sinonjs/fake-timers@^10.0.2": + version "10.2.0" + resolved "https://registry.yarnpkg.com/@sinonjs%2ffake-timers/-/fake-timers-10.2.0.tgz#b3e322a34c5f26e3184e7f6115695f299c1b1194" + integrity sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg== + dependencies: + "@sinonjs/commons" "^3.0.0" -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= +"@types/babel__core@^7.1.14": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types%2fbabel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8= - -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-cli/download/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types%2fbabel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types%2fbabel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha1-PRpI/Z1sDt/Vby/1eNrtSPNsiWk= dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0, babel-core@^6.26.3: - version "6.26.3" - resolved "https://registry.npm.taobao.org/babel-core/download/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha1-suLwnjQtDwyI4vAuBneUEl51wgc= - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.npm.taobao.org/babel-generator/download/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA= - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-helper-builder-binary-assignment-operator-visitor/download/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-helper-call-delegate/download/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-helper-define-map/download/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-helper-explode-assignable-expression/download/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-helper-function-name/download/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-helper-get-function-arity/download/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-helper-hoist-variables/download/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-helper-optimise-call-expression/download/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-helper-regex/download/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-helper-remap-async-to-generator/download/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-helper-replace-supers/download/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-helpers/download/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.npm.taobao.org/babel-messages/download/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-add-module-exports@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/babel-plugin-add-module-exports/download/babel-plugin-add-module-exports-1.0.2.tgz#96cd610d089af664f016467fc4567c099cce2d9c" - integrity sha1-ls1hDQia9mTwFkZ/xFZ8CZzOLZw= - optionalDependencies: - chokidar "^2.0.4" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.npm.taobao.org/babel-plugin-check-es2015-constants/download/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.npm.taobao.org/babel-plugin-syntax-async-functions/download/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.npm.taobao.org/babel-plugin-syntax-class-properties/download/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= - -babel-plugin-syntax-decorators@^6.1.18: - version "6.13.0" - resolved "https://registry.npm.taobao.org/babel-plugin-syntax-decorators/download/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - integrity sha1-MSVjtNvePMgGzuPkFszurd0RrAs= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.npm.taobao.org/babel-plugin-syntax-exponentiation-operator/download/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.npm.taobao.org/babel-plugin-syntax-object-rest-spread/download/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.npm.taobao.org/babel-plugin-syntax-trailing-function-commas/download/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-async-to-generator/download/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-class-properties/download/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-decorators-legacy@^1.3.5: - version "1.3.5" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-decorators-legacy/download/babel-plugin-transform-decorators-legacy-1.3.5.tgz#0e492dffa0edd70529072887f8aa86d4dd8b40a1" - integrity sha1-Dkkt/6Dt1wUpByiH+KqG1N2LQKE= - dependencies: - babel-plugin-syntax-decorators "^6.1.18" - babel-runtime "^6.2.0" - babel-template "^6.3.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-arrow-functions/download/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoped-functions/download/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoping/download/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-classes/download/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-computed-properties/download/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-destructuring/download/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-duplicate-keys/download/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-for-of/download/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-function-name/download/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-literals/download/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-amd/download/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-commonjs/download/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha1-WKeThjqefKhwvcWogRF/+sJ9tvM= - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-systemjs/download/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-umd/download/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-object-super/download/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-parameters/download/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-shorthand-properties/download/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-spread/download/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-sticky-regex/download/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-template-literals/download/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-typeof-symbol/download/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-es2015-unicode-regex/download/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-exponentiation-operator/download/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-object-rest-spread/download/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-regenerator/download/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-runtime@^6.23.0: - version "6.23.0" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-runtime/download/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" - integrity sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-plugin-transform-strict-mode/download/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.npm.taobao.org/babel-preset-env/download/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha1-3qefpOvriDzTXasH4mDBycBN93o= - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-es2015@^6.24.1: - version "6.24.1" - resolved "https://registry.npm.taobao.org/babel-preset-es2015/download/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" - integrity sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk= - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.24.1" - babel-plugin-transform-es2015-classes "^6.24.1" - babel-plugin-transform-es2015-computed-properties "^6.24.1" - babel-plugin-transform-es2015-destructuring "^6.22.0" - babel-plugin-transform-es2015-duplicate-keys "^6.24.1" - babel-plugin-transform-es2015-for-of "^6.22.0" - babel-plugin-transform-es2015-function-name "^6.24.1" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-plugin-transform-es2015-modules-systemjs "^6.24.1" - babel-plugin-transform-es2015-modules-umd "^6.24.1" - babel-plugin-transform-es2015-object-super "^6.24.1" - babel-plugin-transform-es2015-parameters "^6.24.1" - babel-plugin-transform-es2015-shorthand-properties "^6.24.1" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.24.1" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.22.0" - babel-plugin-transform-es2015-unicode-regex "^6.24.1" - babel-plugin-transform-regenerator "^6.24.1" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-register/download/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-template/download/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-traverse/download/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-types/download/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.npm.taobao.org/babylon/download/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha1-ry87iPpvXB5MY00aD46sT1WzleM= +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types%2fbabel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + dependencies: + "@babel/types" "^7.20.7" -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/backo2/download/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types%2fcolor-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA= -balanced-match@^1.0.0: +"@types/eslint-visitor-keys@^1.0.0": version "1.0.0" - resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + resolved "https://registry.yarnpkg.com/@types%2feslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha1-HuMNeVRMqE1o1LPNsK9PIFZj3S0= -base64-arraybuffer@0.1.5: - version "0.1.5" - resolved "https://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types%2fgraceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" -base64id@2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/base64id/download/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha1-J3Csa8R9MSr5eov5pjQ0LgzSXLY= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha1-e95c7RRbbVUakNuH+DxVi060io8= - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U= - -blob@0.0.5: - version "0.0.5" - resolved "https://registry.npm.taobao.org/blob/download/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - integrity sha1-1oDu7yX4zZGtUz9bAe7UjmTK9oM= - -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.npm.taobao.org/boxen/download/boxen-1.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fboxen%2Fdownload%2Fboxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha1-VcbDmouljZxhrSLNh3Uy3rZlogs= - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types%2fistanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types%2fistanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha1-wUwk8Y6oGQwRjudWK3/5mjZVJoY= dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" + "@types/istanbul-lib-coverage" "*" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types%2fistanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha1-kVP+mLuivVZaY63ZQ21vDX+EaP8= dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.npm.taobao.org/browserslist/download/browserslist-3.2.8.tgz?cache=0&sync_timestamp=1567245449635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserslist%2Fdownload%2Fbrowserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha1-sABTYdZHHw9ZUnl6dvyYXx+Xj8Y= - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbytes%2Fdownload%2Fbytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY= + "@types/istanbul-lib-report" "*" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cache-content-type@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/cache-content-type/download/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" - integrity sha1-A1zeKwjuISn0qDFeqPAKANuhRTw= +"@types/jest@^29.5.2": + version "29.5.2" + resolved "https://registry.yarnpkg.com/@types%2fjest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" + integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== dependencies: - mime-types "^2.1.18" - ylru "^1.2.0" + expect "^29.0.0" + pretty-format "^29.0.0" -camelcase@^4.0.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +"@types/json-schema@^7.0.3": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types%2fjson-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" + integrity sha1-3M5EMOZLRDuolF8CkPtWStW6xt0= -caniuse-lite@^1.0.30000844: - version "1.0.30000999" - resolved "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000999.tgz#427253a69ad7bea4aa8d8345687b8eec51ca0e43" - integrity sha1-QnJTpprXvqSqjYNFaHuO7FHKDkM= +"@types/lodash@^4.14.152": + version "4.14.155" + resolved "https://registry.yarnpkg.com/@types%2flodash/-/lodash-4.14.155.tgz#e2b4514f46a261fd11542e47519c20ebce7bc23a" + integrity sha1-4rRRT0aiYf0RVC5HUZwg6857wjo= -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/capture-stack-trace/download/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha1-psC74fOPOqC5Ijjstv9Cw0TUE10= +"@types/node@*": + version "20.3.1" + resolved "https://registry.yarnpkg.com/@types%2fnode/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" + integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +"@types/node@^14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@types%2fnode/-/node-14.0.4.tgz#43a63fc5edce226bed106b31b875165256271107" + integrity sha1-Q6Y/xe3OImvtEGsxuHUWUlYnEQc= -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1570527275600&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= +"@types/prettier@^2.1.5": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types%2fprettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types%2fstack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha1-IPGClPeX8iCbX2XI47XI6CYdEnw= + +"@types/uuid@^9.0.1": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@types%2fuuid/-/uuid-9.0.2.tgz#ede1d1b1e451548d44919dc226253e32a6952c4b" + integrity sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ== + +"@types/ws@^8.5.5": + version "8.5.5" + resolved "https://registry.yarnpkg.com/@types%2fws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" + "@types/node" "*" -chalk@^2.0.1: - version "2.4.2" - resolved "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1570527275600&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types%2fyargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types%2fyargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + "@types/yargs-parser" "*" -chokidar@^1.6.1: - version "1.7.0" - resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -chokidar@^2.0.4, chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc= - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" +"@typescript-eslint/eslint-plugin@^3.0.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint%2feslint-plugin/-/eslint-plugin-3.3.0.tgz#89518e5c5209a349bde161c3489b0ec187ae5d37" + integrity sha1-iVGOXFIJo0m94WHDSJsOwYeuXTc= + dependencies: + "@typescript-eslint/experimental-utils" "3.3.0" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.npm.taobao.org/chownr/download/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha1-Qtg31SOWiNVfMDADpQgjD6ZycUI= +"@typescript-eslint/experimental-utils@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint%2fexperimental-utils/-/experimental-utils-3.3.0.tgz#d72a946e056a83d4edf97f3411cceb639b0b8c87" + integrity sha1-1yqUbgVqg9Tt+X80EczrY5sLjIc= + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "3.3.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.npm.taobao.org/ci-info/download/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc= +"@typescript-eslint/parser@^3.0.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint%2fparser/-/parser-3.3.0.tgz#fcae40012ded822aa8b2739a1a03a4e3c5bbb7bb" + integrity sha1-/K5AAS3tgiqosnOaGgOk48W7t7s= + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "3.3.0" + "@typescript-eslint/typescript-estree" "3.3.0" + eslint-visitor-keys "^1.1.0" -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM= +"@typescript-eslint/typescript-estree@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint%2ftypescript-estree/-/typescript-estree-3.3.0.tgz#841ffed25c29b0049ebffb4c2071268a34558a2a" + integrity sha1-hB/+0lwpsASev/tMIHEmijRViio= dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/cli-boxes/download/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= +acorn@^7.2.0: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-cursor%2Fdownload%2Fcli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= +ajv@^6.10.0, ajv@^6.10.2: + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== dependencies: - restore-cursor "^2.0.0" + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -co-body@^6.0.0: - version "6.0.0" - resolved "https://registry.npm.taobao.org/co-body/download/co-body-6.0.0.tgz#965b9337d7f5655480787471f4237664820827e3" - integrity sha1-lluTN9f1ZVSAeHRx9CN2ZIIIJ+M= +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== dependencies: - inflation "^2.0.0" - qs "^6.5.2" - raw-body "^2.3.3" - type-is "^1.6.16" + type-fest "^0.11.0" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" + color-convert "^1.9.0" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - color-name "1.1.3" + color-convert "^2.0.1" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: - delayed-stream "~1.0.0" + normalize-path "^3.0.0" + picomatch "^2.0.4" -commander@^2.11.0: - version "2.20.3" - resolved "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" -component-bind@1.0.0: +astral-regex@^1.0.0: version "1.0.0" - resolved "https://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -component-emitter@1.2.1: - version "1.2.1" - resolved "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - -component-emitter@^1.2.1, component-emitter@~1.3.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.npm.taobao.org/component-inherit/download/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= +axios@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== + dependencies: + "@jest/transform" "^29.5.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -configstore@^3.0.0: - version "3.1.2" - resolved "https://registry.npm.taobao.org/configstore/download/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha1-xvJd767vJt8S3TNBSwAf6BpUP48= +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/console-control-strings/download/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + balanced-match "^1.0.0" + concat-map "0.0.1" -content-disposition@~0.5.2: - version "0.5.3" - resolved "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70= +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - safe-buffer "5.1.2" - -content-type@^1.0.4: - version "1.0.4" - resolved "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js= + fill-range "^7.0.1" -convert-source-map@^1.5.0, convert-source-map@^1.5.1: - version "1.6.0" - resolved "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA= +browserslist@^4.21.3: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: - safe-buffer "~5.1.1" + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" -cookie@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" -cookies@~0.8.0: - version "0.8.0" - resolved "https://registry.npm.taobao.org/cookies/download/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" - integrity sha1-EpPOSzkXQKhAbjyYcOgoxLVPP5A= +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: - depd "~2.0.0" - keygrip "~1.1.0" + node-int64 "^0.4.0" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -copy-to@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/copy-to/download/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" - integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU= +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.10" - resolved "https://registry.npm.taobao.org/core-js/download/core-js-2.6.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" - integrity sha1-iluDkfjMcBPacDQRzltYVwYwDX8= +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.npm.taobao.org/create-error-class/download/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" +caniuse-lite@^1.0.30001503: + version "1.0.30001504" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001504.tgz#eaf77e5c852dfa5f82c4924468c30602ac53744a" + integrity sha512-5uo7eoOp2mKbWyfMXnGO9rJWOGU8duvzEiYITW+wivukL7yHH4gX9yuRaobu6El4jPxo6jKZfG+N6fB621GD/Q== -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/crypto-random-string/download/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/d/download/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o= +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: - es5-ext "^0.10.50" - type "^1.0.1" + ansi-styles "^4.1.0" + supports-color "^7.1.0" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== dependencies: - assert-plus "^1.0.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" -date-format@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/date-format/download/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" - integrity sha1-MdW16iEc9f12TNOLr50DPffhJc8= +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= - dependencies: - ms "2.0.0" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha1-6D0X3hbYp++3cX7b5fsQE17uYps= - dependencies: - ms "^2.1.1" +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== -debug@^4.1.1, debug@~4.1.0: - version "4.1.1" - resolved "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E= - dependencies: - ms "^2.1.1" +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== -debug@~3.1.0: +cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE= + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: - ms "2.0.0" + restore-cursor "^3.1.0" -decimal.js@^10.2.0: - version "10.2.0" - resolved "https://registry.npm.taobao.org/decimal.js/download/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" - integrity sha1-OUZhE6ngNhEdAvgkibX9awte0jE= +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw= +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - is-descriptor "^0.1.0" + color-name "1.1.3" -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: - is-descriptor "^1.0.0" + color-name "~1.1.4" -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0= - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" -depd@^1.1.2, depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -depd@~2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/depd/download/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8= +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -destroy@^1.0.4: - version "1.0.4" - resolved "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/detect-indent/download/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - repeating "^2.0.0" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.npm.taobao.org/detect-libc/download/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc= +debug@^4.0.1, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: - is-obj "^1.0.0" + ms "^2.1.1" -dot-prop@^4.2.1: - version "4.2.1" - resolved "https://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.1.tgz?cache=0&sync_timestamp=1605778259603&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" - integrity sha1-RYhBlKcfws2nHLtLzrOk3S9DO6Q= +debug@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - is-obj "^1.0.0" + ms "2.1.2" -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.npm.taobao.org/duplexer3/download/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= +deep-is@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" + esutils "^2.0.2" -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.4.431: + version "1.4.433" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.433.tgz#305ef5f8ea5fe65d252aae4b0e1088f9e4842533" + integrity sha512-MGO1k0w1RgrfdbLVwmXcDhHHuxCn2qRgR7dYsJvWFKDttvYPx6FNzCGG0c/fBBvzK2LDh3UV7Tt9awnHnvAAUQ== -electron-to-chromium@^1.3.47: - version "1.3.284" - resolved "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.284.tgz#b24359fa4f49b3a7c52afc005d59ec3aa9f6796e" - integrity sha1-skNZ+k9Js6fFKvwAXVnsOqn2eW4= +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^7.0.1: version "7.0.3" - resolved "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== -encodeurl@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -engine.io-client@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.0.tgz#fc1b4d9616288ce4f2daf06dcf612413dec941c7" - integrity sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA== - dependencies: - component-emitter "~1.3.0" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.2.0" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - ws "~7.4.2" - xmlhttprequest-ssl "~1.5.4" - yeast "0.1.2" - -engine.io-parser@~2.2.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/engine.io-parser/download/engine.io-parser-2.2.0.tgz?cache=0&sync_timestamp=1568365944963&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fengine.io-parser%2Fdownload%2Fengine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed" - integrity sha1-MSxIlPV9UqArQgho2ntcHISvgO0= - dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.5" - blob "0.0.5" - has-binary2 "~1.0.2" - -engine.io@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" - integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== - dependencies: - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - debug "~4.1.0" - engine.io-parser "~2.2.0" - ws "~7.4.2" - -error-inject@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/error-inject/download/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" - integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.51, es5-ext@~0.10.14: - version "0.10.51" - resolved "https://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.51.tgz#ed2d7d9d48a12df86e0299287e93a09ff478842f" - integrity sha1-7S19nUihLfhuApkofpOgn/R4hC8= +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "^1.0.0" + is-arrayish "^0.2.1" -es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.2" - resolved "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes6-symbol%2Fdownload%2Fes6-symbol-3.1.2.tgz#859fdd34f32e905ff06d752e7171ddd4444a7ed1" - integrity sha1-hZ/dNPMukF/wbXUucXHd1ERKftE= - dependencies: - d "^1.0.1" - es5-ext "^0.10.51" - -escape-html@^1.0.3: - version "1.0.3" - resolved "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= - -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.npm.taobao.org/event-emitter/download/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.npm.taobao.org/execa/download/execa-0.7.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= +eslint-scope@^5.0.0, eslint-scope@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== dependencies: - is-extendable "^0.1.0" + esrecurse "^4.1.0" + estraverse "^4.1.1" -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" + eslint-visitor-keys "^1.1.0" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz#74415ac884874495f78ec2a97349525344c981fa" + integrity sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ== + +eslint@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.2.0.tgz#d41b2e47804b30dbabb093a967fb283d560082e6" + integrity sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.1.0" + eslint-utils "^2.0.0" + eslint-visitor-keys "^1.2.0" + espree "^7.1.0" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.14" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" + integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw== + dependencies: + acorn "^7.2.0" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.2.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= +esquery@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - is-extglob "^1.0.0" + estraverse "^5.1.0" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha1-6x53OrsFbc2N8r/favWbizqTZWU= +expect@^29.0.0, expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" -flatted@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/flatted/download/flatted-2.0.1.tgz?cache=0&sync_timestamp=1561466276595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fflatted%2Fdownload%2Fflatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha1-aeV8qo8OrLwoHS4stFjUb9tEngg= +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz?cache=0&sync_timestamp=1567061363656&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fform-data%2Fdownload%2Fform-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" + escape-string-regexp "^1.0.5" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: - map-cache "^0.2.2" + flat-cache "^2.0.1" -fresh@~0.5.2: - version "0.5.2" - resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-extra%2Fdownload%2Ffs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA= +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" + locate-path "^5.0.0" + path-exists "^4.0.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha1-zP+FcIQef+QmVpPaiJNsVa7X98c= +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: - minipass "^2.6.0" + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" -fs-readdir-recursive@^1.0.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/fs-readdir-recursive/download/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha1-4y/AMKLM7kSmtTcTCNpUvgs5fSc= +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0, fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha1-P17WZYPM1vQAtaANtvfoYTY+OI8= - dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.npm.taobao.org/gauge/download/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz?cache=0&sync_timestamp=1569108917227&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob-parent%2Fdownload%2Fglob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz?cache=0&sync_timestamp=1569108917227&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob-parent%2Fdownload%2Fglob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" + is-glob "^4.0.1" -glob@^7.1.2, glob@^7.1.3: - version "7.1.4" - resolved "https://registry.npm.taobao.org/glob/download/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha1-qmCKL2xXetNX4a5aXCbZqNGWklU= +glob@^7.1.3, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1759,2057 +1498,1453 @@ glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/global-dirs/download/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - dependencies: - ini "^1.3.4" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz?cache=0&sync_timestamp=1570510824235&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo= - -got@^6.7.1: - version "6.7.1" - resolved "https://registry.npm.taobao.org/got/download/got-6.7.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgot%2Fdownload%2Fgot-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.2" - resolved "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha1-bwlSYF0BQMHP2xOO0AV3W5LWewI= - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha1-HvievT5JllV2de7ZiTEQ3DUPoIA= +glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz?cache=0&sync_timestamp=1568144153016&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-ansi%2Fdownload%2Fhas-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -has-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.npm.taobao.org/has-binary2/download/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - integrity sha1-d3asYn8+p3JQz8My2rfd9eT10R0= +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== dependencies: - isarray "2.0.1" + type-fest "^0.8.1" -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/has-cors/download/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= +graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/has-unicode/download/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/home-or-tmp/download/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -http-assert@^1.3.0: - version "1.4.1" - resolved "https://registry.npm.taobao.org/http-assert/download/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878" - integrity sha1-xfcl1neqfoc+9zYZm4lobM6zeHg= +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - deep-equal "~1.0.1" - http-errors "~1.7.2" + function-bind "^1.1.1" -http-errors@1.7.3, http-errors@^1.6.3, http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24, iconv-lite@^0.4.4: +iconv-lite@^0.4.24: version "0.4.24" - resolved "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/ignore-by-default/download/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.npm.taobao.org/ignore-walk/download/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha1-AX4kRxhL/q3nwjjkrv3R6PlbHjc= +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== dependencies: - minimatch "^3.0.4" + parent-module "^1.0.0" + resolve-from "^4.0.0" -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/import-lazy/download/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - -inflation@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/inflation/download/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" - integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8= - inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2: version "2.0.4" - resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= - -ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY= - dependencies: - loose-envify "^1.0.0" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= - dependencies: - kind-of "^6.0.0" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha1-76ouqdqg16suoTqXsritUf776L4= - -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw= - dependencies: - ci-info "^1.5.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.2.0.tgz#63ce99d823090de7eb420e4bb05e6f3449aa389a" + integrity sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= +is-core-module@^2.12.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: - is-plain-object "^2.0.4" + has "^1.0.3" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-generator-function@^1.0.7: - version "1.0.7" - resolved "https://registry.npm.taobao.org/is-generator-function/download/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" - integrity sha1-0hMuUpuwAAp/gHlNS99c1eWBNSI= - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" - resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw= + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.npm.taobao.org/is-installed-globally/download/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-npm/download/is-npm-1.0.0.tgz?cache=0&sync_timestamp=1571056400909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-npm%2Fdownload%2Fis-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8= - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/is-path-inside/download/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= - dependencies: - isobject "^3.0.1" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-redirect/download/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/is-retry-allowed/download/is-retry-allowed-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-retry-allowed%2Fdownload%2Fis-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha1-13hIi9CkZmo76KFIK58rqv7eqLQ= - -is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz?cache=0&sync_timestamp=1562592096220&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisarray%2Fdownload%2Fisarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isarray@2.0.1: +is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npm.taobao.org/isarray/download/isarray-2.0.1.tgz?cache=0&sync_timestamp=1562592096220&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisarray%2Fdownload%2Fisarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= - -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/jsesc/download/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -keygrip@~1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/keygrip/download/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" - integrity sha1-hxsWgdXhWcYqRFsMdLYV4JF+ciY= - dependencies: - tsscmp "1.0.6" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha1-ARRrNqYhjmTljzqNZt5df8b20FE= +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -koa-bodyparser@^4.2.1: - version "4.2.1" - resolved "https://registry.npm.taobao.org/koa-bodyparser/download/koa-bodyparser-4.2.1.tgz#4d7dacb5e6db1106649b595d9e5ccb158b6f3b29" - integrity sha1-TX2stebbEQZkm1ldnlzLFYtvOyk= +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: - co-body "^6.0.0" - copy-to "^2.0.1" + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" -koa-compose@^3.0.0: - version "3.2.1" - resolved "https://registry.npm.taobao.org/koa-compose/download/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" - integrity sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec= +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: - any-promise "^1.1.0" - -koa-compose@^4.1.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/koa-compose/download/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" - integrity sha1-UHMGuTcZAdtBEhyBLpI9DWfT6Hc= + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" -koa-convert@^1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/koa-convert/download/koa-convert-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkoa-convert%2Fdownload%2Fkoa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" - integrity sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA= +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" co "^4.6.0" - koa-compose "^3.0.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + p-limit "^3.1.0" + pretty-format "^29.5.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== + dependencies: + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== + dependencies: + "@jest/types" "^29.5.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== + dependencies: + "@jest/types" "^29.5.0" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== + dependencies: + chalk "^4.0.0" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-util "^29.5.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" + +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.5.0" + jest-validate "^29.5.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.5.0" + graceful-fs "^4.2.9" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + natural-compare "^1.4.0" + pretty-format "^29.5.0" + semver "^7.3.5" + +jest-util@^29.0.0, jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== + dependencies: + "@jest/types" "^29.5.0" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.5.0" + +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== + dependencies: + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.5.0" + string-length "^4.0.1" + +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== + dependencies: + "@types/node" "*" + jest-util "^29.5.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" + integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== + dependencies: + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" + import-local "^3.0.2" + jest-cli "^29.5.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -koa-is-json@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/koa-is-json/download/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" - integrity sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ= - -koa@^2.8.1: - version "2.10.0" - resolved "https://registry.npm.taobao.org/koa/download/koa-2.10.0.tgz#86a583ff280896dce3a36b0b6dae80f9559240d3" - integrity sha1-hqWD/ygIltzjo2sLba6A+VWSQNM= - dependencies: - accepts "^1.3.5" - cache-content-type "^1.0.0" - content-disposition "~0.5.2" - content-type "^1.0.4" - cookies "~0.8.0" - debug "~3.1.0" - delegates "^1.0.0" - depd "^1.1.2" - destroy "^1.0.4" - encodeurl "^1.0.2" - error-inject "^1.0.0" - escape-html "^1.0.3" - fresh "~0.5.2" - http-assert "^1.3.0" - http-errors "^1.6.3" - is-generator-function "^1.0.7" - koa-compose "^4.1.0" - koa-convert "^1.2.0" - koa-is-json "^1.0.0" - on-finished "^2.3.0" - only "~0.0.2" - parseurl "^1.3.2" - statuses "^1.5.0" - type-is "^1.6.16" - vary "^1.1.2" - -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/latest-version/download/latest-version-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flatest-version%2Fdownload%2Flatest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= +js-yaml@^3.13.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== dependencies: - package-json "^4.0.0" + argparse "^1.0.7" + esprima "^4.0.0" -lodash@^4.17.19: - version "4.17.20" - resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI= - -lodash@^4.17.4: - version "4.17.15" - resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg= +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -log-update@^3.3.0: - version "3.3.0" - resolved "https://registry.npm.taobao.org/log-update/download/log-update-3.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flog-update%2Fdownload%2Flog-update-3.3.0.tgz#3b0501815123f66cb33f300e3dac2a2b6ad3fdf5" - integrity sha1-OwUBgVEj9myzPzAOPawqK2rT/fU= - dependencies: - ansi-escapes "^3.2.0" - cli-cursor "^2.1.0" - wrap-ansi "^5.0.0" - -log4js@^5.1.0: - version "5.2.2" - resolved "https://registry.npm.taobao.org/log4js/download/log4js-5.2.2.tgz#35b750416f22913dd6905d49335752d9b240f47c" - integrity sha1-NbdQQW8ikT3WkF1JM1dS2bJA9Hw= - dependencies: - date-format "^2.1.0" - debug "^4.1.1" - flatted "^2.0.1" - rfdc "^1.1.4" - streamroller "^2.2.2" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8= - dependencies: - js-tokens "^3.0.0 || ^4.0.0" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -lowercase-keys@^1.0.0: +json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha1-b54wtHCE2XGnyCD/FabFFnt0wm8= - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80= - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha1-ecEDO4BRW9bSTsmTPoYMp17ifww= - dependencies: - pify "^3.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.npm.taobao.org/math-random/download/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw= - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha1-cIWbyVyYQJUvNZoGij/En57PrCM= - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@1.40.0: - version "1.40.0" - resolved "https://registry.npm.taobao.org/mime-db/download/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI= - -mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.24" - resolved "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.24.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha1-tvjQs+lR77d97eyhlM/20W9nb4E= - dependencies: - mime-db "1.40.0" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.npm.taobao.org/minipass/download/minipass-2.9.0.tgz?cache=0&sync_timestamp=1571165916166&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminipass%2Fdownload%2Fminipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha1-5xN2Ln0+Mv7YAxFc+T4EvKn8yaY= - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.npm.taobao.org/minizlib/download/minizlib-1.3.3.tgz?cache=0&sync_timestamp=1570255638980&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminizlib%2Fdownload%2Fminizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha1-IpDeloGKNMKVUcio0wEha9Zahh0= +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - minipass "^2.9.0" + prelude-ls "^1.2.1" + type-check "~0.4.0" -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY= - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: - minimist "0.0.8" + p-locate "^4.1.0" -moment@^2.24.0: - version "2.24.0" - resolved "https://registry.npm.taobao.org/moment/download/moment-2.24.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha1-DQVdU/UFKqZTyfbraLtdEr9cK1s= +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +lodash@4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk= - -nan@^2.12.1: - version "2.14.0" - resolved "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw= - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.npm.taobao.org/needle/download/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha1-aDPnSXXERGQlkOFadQKIxfk5tXw= - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs= - -next-tick@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= +lodash@^4.17.14, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.npm.taobao.org/node-pre-gyp/download/node-pre-gyp-0.12.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-pre-gyp%2Fdownload%2Fnode-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha1-ObpLsUOdoDApX4meO1ILd4V2YUk= +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -nodemon@^1.19.2: - version "1.19.4" - resolved "https://registry.npm.taobao.org/nodemon/download/nodemon-1.19.4.tgz#56db5c607408e0fdf8920d2b444819af1aae0971" - integrity sha1-VttcYHQI4P34kg0rREgZrxquCXE= - dependencies: - chokidar "^2.1.8" - debug "^3.2.6" - ignore-by-default "^1.0.1" - minimatch "^3.0.4" - pstree.remy "^1.1.7" - semver "^5.7.1" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.2" - update-notifier "^2.5.0" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.npm.taobao.org/nopt/download/nopt-4.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnopt%2Fdownload%2Fnopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: - abbrev "1" - osenv "^0.1.4" + yallist "^4.0.0" -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnopt%2Fdownload%2Fnopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: - abbrev "1" + semver "^6.0.0" -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - remove-trailing-separator "^1.0.1" + tmpl "1.0.5" -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -notepack.io@~2.1.0: - version "2.1.3" - resolved "https://registry.npm.taobao.org/notepack.io/download/notepack.io-2.1.3.tgz#cc904045c751b1a27b2dcfd838d81d0bf3ced923" - integrity sha1-zJBARcdRsaJ7Lc/YONgdC/PO2SM= +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.npm.taobao.org/npm-bundled/download/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha1-57qarc75YrthJI+RchzZMrP+a90= +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -npm-packlist@^1.1.6: - version "1.4.6" - resolved "https://registry.npm.taobao.org/npm-packlist/download/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" - integrity sha1-U7o+0R+FIwefFFc3bdN57k6kL/Q= +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" + mime-db "1.52.0" -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnpm-run-path%2Fdownload%2Fnpm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: - path-key "^2.0.0" + brace-expansion "^1.1.7" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha1-CKfyqL9zRgR3mp76StXMcXq7lUs= +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" + brace-expansion "^1.1.7" -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== -on-finished@^2.3.0: - version "2.3.0" - resolved "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: - ee-first "1.1.1" + path-key "^3.0.0" once@^1.3.0: version "1.4.0" - resolved "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== dependencies: - mimic-fn "^1.0.0" + mimic-fn "^2.1.0" -only@~0.0.2: - version "0.0.2" - resolved "https://registry.npm.taobao.org/only/download/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" - integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fosenv%2Fdownload%2Fosenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha1-hc36+uso6Gd/QW4odZK18/SepBA= +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" + p-try "^2.0.0" -output-file-sync@^1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/output-file-sync/download/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= +p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - graceful-fs "^4.1.4" - mkdirp "^0.5.1" - object-assign "^4.1.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + yocto-queue "^0.1.0" -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.npm.taobao.org/package-json/download/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" + p-limit "^2.2.0" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parseqs@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" - integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== - -parseuri@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" - integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== - -parseurl@^1.3.2: - version "1.3.3" - resolved "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.npm.taobao.org/private/download/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprocess-nextick-args%2Fdownload%2Fprocess-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I= + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" -psl@^1.1.24: - version "1.4.0" - resolved "https://registry.npm.taobao.org/psl/download/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" - integrity sha1-XdJhVs22n6H9uKsZkWZ9P4DO18I= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -pstree.remy@^1.1.7: - version "1.1.7" - resolved "https://registry.npm.taobao.org/pstree.remy/download/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" - integrity sha1-x2ljooBH7WFULcNhqibuVaf6FfM= +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -qs@^6.5.2, qs@^6.9.0: - version "6.9.0" - resolved "https://registry.npm.taobao.org/qs/download/qs-6.9.0.tgz?cache=0&sync_timestamp=1569207136481&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.9.0.tgz#d1297e2a049c53119cb49cca366adbbacc80b409" - integrity sha1-0Sl+KgScUxGctJzKNmrbusyAtAk= +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&sync_timestamp=1569207136481&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -querystring@^0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.npm.taobao.org/randomatic/download/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha1-t3bvxZN1mE42xTey9RofCv8Noe0= +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" + find-up "^4.0.0" -raw-body@^2.3.3: - version "2.4.1" - resolved "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha1-MKyC+Yu1rowVLmcUnayNVRU7Fow= - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: - version "1.2.8" - resolved "https://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0= - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@^2.0.2, readable-stream@^2.0.6: - version "2.3.6" - resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.0.0, readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha1-DodiKjMlqjPokihcr4tOhGUppSU= - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -regenerate@^1.2.1: - version "1.4.0" - resolved "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha1-SoVuxLVuQHfFV1icroXnpMiGmhE= +prettier@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" + integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= +pretty-format@^29.0.0, pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk= +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0= +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" + kleur "^3.0.3" + sisteransi "^1.0.5" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha1-db3FiioUls7EihKDW8VMjVYjNt0= - dependencies: - is-equal-shallow "^0.1.3" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-2.0.0.tgz?cache=0&sync_timestamp=1568402850982&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpu-core%2Fdownload%2Fregexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== -registry-auth-token@^3.0.1: - version "3.4.0" - resolved "https://registry.npm.taobao.org/registry-auth-token/download/registry-auth-token-3.4.0.tgz?cache=0&sync_timestamp=1560785240550&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregistry-auth-token%2Fdownload%2Fregistry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha1-10RoFUM/XV7WQxzV3KIQSPZrOX4= - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -registry-url@^3.0.3: +regexpp@^3.0.0, regexpp@^3.1.0: version "3.1.0" - resolved "https://registry.npm.taobao.org/registry-url/download/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= - dependencies: - rc "^1.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: - jsesc "~0.5.0" + resolve-from "^5.0.0" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4= +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -request@^2.88.0: - version "2.88.0" - resolved "https://registry.npm.taobao.org/request/download/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha1-nC/KT301tZLv5Xx/ClXoEFIST+8= - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@^1.20.0: + version "1.22.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.3.tgz#4b4055349ffb962600972da1fdc33c46a4eb3283" + integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw== + dependencies: + is-core-module "^2.12.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: - onetime "^2.0.0" + onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= - -rfdc@^1.1.4: - version "1.1.4" - resolved "https://registry.npm.taobao.org/rfdc/download/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" - integrity sha1-unLME2egzNnPgahws7WL060H+MI= - -rimraf@^2.6.1: - version "2.7.1" - resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w= +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= - -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.0" - resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk= +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= +rxjs@^6.5.3: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== dependencies: - ret "~0.1.10" + tslib "^1.9.0" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk= + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/semver-diff/download/semver-diff-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver-diff%2Fdownload%2Fsemver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= +semver@7.x, semver@^7.3.5: + version "7.5.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb" + integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== dependencies: - semver "^5.0.3" + lru-cache "^6.0.0" -semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1565627362346&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +semver@^7.2.1, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha1-oY1AUw5vB95CKMfe/kInr4ytAFs= +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= + shebang-regex "^3.0.0" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fshebang-command%2Fdownload%2Fshebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -socket.io-adapter@~1.1.0: - version "1.1.1" - resolved "https://registry.npm.taobao.org/socket.io-adapter/download/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" - integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= - -socket.io-client@2.4.0, socket.io-client@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" - integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "~1.3.0" - debug "~3.1.0" - engine.io-client "~3.5.0" - has-binary2 "~1.0.2" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - socket.io-parser "~3.3.0" - to-array "0.1.4" - -socket.io-msgpack-parser@^2.2.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/socket.io-msgpack-parser/download/socket.io-msgpack-parser-2.2.0.tgz#90084168d00f15dddf674bcd88263edee868cd55" - integrity sha1-kAhBaNAPFd3fZ0vNiCY+3uhozVU= +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: - component-emitter "1.2.1" - notepack.io "~2.1.0" - -socket.io-parser@~3.3.0: - version "3.3.0" - resolved "https://registry.npm.taobao.org/socket.io-parser/download/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" - integrity sha1-K1KpalCf3zFEC6QP7WCUx9TxJi8= - dependencies: - component-emitter "1.2.1" - debug "~3.1.0" - isarray "2.0.1" - -socket.io-parser@~3.4.0: - version "3.4.0" - resolved "https://registry.npm.taobao.org/socket.io-parser/download/socket.io-parser-3.4.0.tgz#370bb4a151df2f77ce3345ff55a7072cc6e9565a" - integrity sha1-Nwu0oVHfL3fOM0X/VacHLMbpVlo= - dependencies: - component-emitter "1.2.1" - debug "~4.1.0" - isarray "2.0.1" - -socket.io@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.0.tgz#01030a2727bd8eb2e85ea96d69f03692ee53d47e" - integrity sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ== - dependencies: - debug "~4.1.0" - engine.io "~3.5.0" - has-binary2 "~1.0.2" - socket.io-adapter "~1.1.0" - socket.io-client "2.4.0" - socket.io-parser "~3.4.0" - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk= - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8= - dependencies: - source-map "^0.5.6" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= - dependencies: - extend-shallow "^3.0.0" - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha1-+2YcC+8ps520B2nuOfpwCT1vaHc= - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" + buffer-from "^1.0.0" + source-map "^0.6.0" -"statuses@>= 1.5.0 < 2", statuses@^1.5.0: - version "1.5.0" - resolved "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -streamroller@^2.2.2: - version "2.2.2" - resolved "https://registry.npm.taobao.org/streamroller/download/streamroller-2.2.2.tgz#26bea90567f80d8438d251e5603643fe617b7090" - integrity sha1-Jr6pBWf4DYQ40lHlYDZD/mF7cJA= - dependencies: - date-format "^2.1.0" - debug "^4.1.1" - fs-extra "^8.1.0" +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" + escape-string-regexp "^2.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + char-regex "^1.0.2" + strip-ansi "^6.0.0" string-width@^3.0.0: version "3.1.0" - resolved "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE= + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz?cache=0&sync_timestamp=1565170823020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring_decoder%2Fdownload%2Fstring_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== dependencies: - ansi-regex "^2.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= +string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - ansi-regex "^3.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -strip-ansi@^5.0.0, strip-ansi@^5.1.0: +strip-ansi@^5.1.0: version "5.2.0" - resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1569557271992&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1569557271992&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== dependencies: - has-flag "^3.0.0" + ansi-regex "^5.0.0" -tar@^4: - version "4.4.13" - resolved "https://registry.npm.taobao.org/tar/download/tar-4.4.13.tgz?cache=0&sync_timestamp=1570258601713&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftar%2Fdownload%2Ftar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha1-Q7NkvFKIjVVSmGN7ENYHkCVKtSU= +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" + ansi-regex "^5.0.1" -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/term-size/download/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.npm.taobao.org/timed-out/download/timed-out-4.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftimed-out%2Fdownload%2Ftimed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.npm.taobao.org/to-array/download/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= +strip-json-comments@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - kind-of "^3.0.2" + has-flag "^3.0.0" -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" + has-flag "^4.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" + has-flag "^4.0.0" -toidentifier@1.0.0: +supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/touch/download/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds= +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: - nopt "~1.0.10" + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha1-U/Nto/R3g7CSWvoG/587FlKA94E= +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: - psl "^1.1.24" - punycode "^1.4.1" + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -tsscmp@1.0.6: - version "1.0.6" - resolved "https://registry.npm.taobao.org/tsscmp/download/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" - integrity sha1-hbmVg6w1iexL/vgltQAKqRHWBes= +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + os-tmpdir "~1.0.2" -type-is@^1.6.16: - version "1.6.18" - resolved "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha1-TlUs0F3wlGfcvE73Od6J8s83wTE= - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -type@^1.0.1: - version "1.2.0" - resolved "https://registry.npm.taobao.org/type/download/type-1.2.0.tgz?cache=0&sync_timestamp=1570722772335&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype%2Fdownload%2Ftype-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -undefsafe@^2.0.2: - version "2.0.2" - resolved "https://registry.npm.taobao.org/undefsafe/download/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" - integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-jest@^29.1.0: + version "29.1.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.0.tgz#4a9db4104a49b76d2b368ea775b6c9535c603891" + integrity sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - debug "^2.2.0" + prelude-ls "^1.2.1" -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funion-value%2Fdownload%2Funion-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc= - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/unique-string/download/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - dependencies: - crypto-random-string "^1.0.0" +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY= +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +typescript@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" + integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/unzip-response/download/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ= - -update-notifier@^2.5.0: - version "2.5.0" - resolved "https://registry.npm.taobao.org/update-notifier/download/update-notifier-2.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupdate-notifier%2Fdownload%2Fupdate-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha1-0HRFk+E/Fh5AassdlAi3LK0Ir/Y= - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" + escalade "^3.1.1" + picocolors "^1.0.0" uri-js@^4.2.2: version "4.2.2" - resolved "https://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha1-lMVA4f93KVbiKZUHwBCupsiDjrA= + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/url-parse-lax/download/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^3.3.2, uuid@^3.3.3: - version "3.3.3" - resolved "https://registry.npm.taobao.org/uuid/download/uuid-3.3.3.tgz?cache=0&sync_timestamp=1566221202613&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - integrity sha1-RWjwIW54dg7h2/Ok0s9T4iQRKGY= +uuid@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== -v8flags@^2.1.1: +v8-compile-cache@^2.0.3: version "2.1.1" - resolved "https://registry.npm.taobao.org/v8flags/download/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= - dependencies: - user-home "^1.1.1" - -vary@^1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fverror%2Fdownload%2Fverror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" -which@^1.2.9: - version "1.3.1" - resolved "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz?cache=0&sync_timestamp=1570146293742&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: - isexe "^2.0.0" + makeerror "1.0.12" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha1-rgdOa9wMFKQx6ATmJFScYzsABFc= +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/widest-line/download/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha1-dDh2RzDsfvQ4HOTfgvuYpTFCo/w= - dependencies: - string-width "^2.1.1" +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wrap-ansi@^5.0.0: - version "5.1.0" - resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha1-H9H2cjXVttD+54EFYAG/tpTAOwk= +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" - resolved "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^2.0.0: - version "2.4.3" - resolved "https://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha1-H9Lprh3z51uNjDZ0Q8aS1MqB9IE= +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: - graceful-fs "^4.1.11" imurmurhash "^0.1.4" - signal-exit "^3.0.2" + signal-exit "^3.0.7" -ws@^7.1.2: - version "7.1.2" - resolved "https://registry.npm.taobao.org/ws/download/ws-7.1.2.tgz#c672d1629de8bb27a9699eb599be47aeeedd8f73" - integrity sha1-xnLRYp3ouyepaZ61mb5Hru7dj3M= +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: - async-limiter "^1.0.0" - -ws@~7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" - integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/xdg-basedir/download/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + mkdirp "^0.5.1" -xmlhttprequest-ssl@~1.5.4: - version "1.5.5" - resolved "https://registry.npm.taobao.org/xmlhttprequest-ssl/download/xmlhttprequest-ssl-1.5.5.tgz?cache=0&sync_timestamp=1564594466893&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxmlhttprequest-ssl%2Fdownload%2Fxmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" - integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= +ws@8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyallist%2Fdownload%2Fyallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.0, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" - resolved "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyallist%2Fdownload%2Fyallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha1-27fa+b/YusmrRev2ArjLrQ1dCP0= - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.npm.taobao.org/yeast/download/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -ylru@^1.2.0: - version "1.2.1" - resolved "https://registry.npm.taobao.org/ylru/download/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" - integrity sha1-9Xa2M0FUeYnB3nuiiHYJI7J/6E8= +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==