├── .gitignore ├── .prettierrc.yaml ├── README.md ├── package.json ├── src ├── index.ts ├── libs │ ├── local-storage.ts │ └── progress.ts └── types.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | dist 4 | wow-stocks-db.json 5 | -------------------------------------------------------------------------------- /.prettierrc.yaml: -------------------------------------------------------------------------------- 1 | semi: false # 不添加分号 2 | singleQuote: true # js 内使用单引号 3 | trailingComma: 'all' # 末尾总是添加逗号 4 | arrowParens: 'always' # 参数总是用括号包裹 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wow-stocks 2 | 3 | 实时获取所有 A 股现在 + 过去的行情数据,可基于它来做量化交易的行情服务,也可以用来实时选股。 4 | 5 | ## 示例 6 | 7 | ```javascript 8 | import { update } from 'wow-stocks' 9 | import { ma, cross } from 'wow-stock-calculator' 10 | 11 | update({ length: 90 }).then(({ watch }) => { 12 | watch((stocks) => { 13 | // 获取当前 5 日均线上穿 10 日均线的所有股票 14 | console.log( 15 | stocks.filter((stock) => { 16 | const ma5 = ma(stock.close, 5) 17 | const ma10 = ma(stock.close, 10) 18 | const ma5CrossMa10 = cross(ma5, ma10) 19 | return ma5CrossMa10[ma5CrossMa10.length - 1] 20 | }), 21 | ) 22 | }) 23 | }) 24 | ``` 25 | 26 | ## 文档 27 | 28 | https://aweiu.com/documents/wow-stocks/ 29 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wow-stocks", 3 | "version": "1.0.0", 4 | "description": "实时获取所有 A 股现在 + 过去的行情数据,可基于它来做量化交易的行情服务,也可以用来实时选股", 5 | "keywords": [ 6 | "stock", 7 | "quotation", 8 | "share", 9 | "trade", 10 | "quantization" 11 | ], 12 | "scripts": { 13 | "test": "ts-node-dev src/test.ts" 14 | }, 15 | "main": "dist/index.js", 16 | "typings": "dist/index.d.ts", 17 | "author": "aweiu", 18 | "license": "ISC", 19 | "repository": { 20 | "type": "git", 21 | "url": "git+https://github.com/aweiu/wow-stocks" 22 | }, 23 | "dependencies": { 24 | "cli-progress": "^3.0.0", 25 | "fecha": "^3.0.3", 26 | "set-promise-interval": "^1.0.8", 27 | "wow-stock-quotation": "^0.1.9" 28 | }, 29 | "devDependencies": { 30 | "@types/cli-progress": "^1.8.1", 31 | "@types/node": "^11.13.8", 32 | "prettier": "^1.17.0", 33 | "ts-node-dev": "^1.0.0-pre.42", 34 | "tslint": "^5.16.0", 35 | "tslint-config-prettier": "^1.18.0", 36 | "tslint-plugin-prettier": "^2.0.1", 37 | "typescript": "3.5.3", 38 | "wow-stock-calculator": "^0.1.8" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import setPromiseInterval, { clearPromiseInterval } from 'set-promise-interval' 2 | import { 3 | getHistory, 4 | getRealTimeAll, 5 | getRealTimeCodes, 6 | getTradeDates, 7 | updateAllCodes, 8 | } from 'wow-stock-quotation' 9 | import { Quotation, RealTimeQuotation } from 'wow-stock-quotation/dist/types' 10 | import LocalStorage from './libs/local-storage' 11 | import Progress from './libs/progress' 12 | import { Histories, Option, UpdateType } from './types' 13 | // tslint:disable-next-line:no-var-requires 14 | const fecha = require('fecha') 15 | 16 | type PromiseReturnType any> = ReturnType extends Promise< 17 | infer R 18 | > 19 | ? R 20 | : ReturnType 21 | 22 | let progress!: Progress 23 | const localStorage = new LocalStorage('./wow-stocks-db.json') 24 | const histories = localStorage.getItem('histories') || {} 25 | const FIELDS: Array = [ 26 | 'open', 27 | 'high', 28 | 'low', 29 | 'close', 30 | 'volume', 31 | 'amount', 32 | 'turnover', 33 | ] 34 | 35 | async function getPreviousTradeDate() { 36 | const now = new Date() 37 | const startDate = fecha.format( 38 | now.getTime() - 1000 * 60 * 60 * 24 * 9, // 查询最近 10 天的交易日 39 | 'YYYY-MM-DD', 40 | ) 41 | const endDate = fecha.format(now, 'YYYY-MM-DD') 42 | const tradeDates = await getTradeDates(startDate, endDate) 43 | return tradeDates[tradeDates.length - 2] 44 | } 45 | 46 | async function incrementalUpdate( 47 | realTimeQuotation: RealTimeQuotation, 48 | length: number, 49 | ) { 50 | const historyCodes = Object.keys(histories) 51 | if (historyCodes.length === 0) return 52 | const previousTradeDate = await getPreviousTradeDate() 53 | for (const code of historyCodes) { 54 | const now = realTimeQuotation[code] 55 | const history = histories[code] 56 | if ( 57 | now && 58 | history._length === length && 59 | history._lastDate === previousTradeDate && 60 | previousTradeDate !== now.date // 当天是交易日但是还没有开盘 61 | ) { 62 | history._lastDate = now.date 63 | // 非停牌的数据 64 | if (!now.suspended) { 65 | const slice = history.open.length === length 66 | for (const field of FIELDS) { 67 | const arr = history[field].concat(now[field]) 68 | history[field] = slice ? arr.slice(1) : arr 69 | } 70 | progress.tick(code, UpdateType.Incremental) 71 | } 72 | } 73 | } 74 | } 75 | 76 | function fullUpdate(realTimeQuotation: RealTimeQuotation, length: number) { 77 | const codes = Object.keys(realTimeQuotation) 78 | const lastDate = realTimeQuotation[codes[0]].date 79 | const updateCodes: string[] = [] 80 | for (const code of codes) { 81 | const history = histories[code] 82 | if ( 83 | !history || 84 | history._lastDate !== lastDate || 85 | history._length !== length 86 | ) { 87 | updateCodes.push(code) 88 | } 89 | } 90 | if (updateCodes.length === 0) return Promise.resolve() 91 | return getHistory(updateCodes, (data, code) => { 92 | // @ts-ignore 93 | const history: Histories[''] = { _length: length, _lastDate: lastDate } 94 | for (const field of FIELDS) history[field] = [] 95 | const availableData = data.filter(({ suspended }) => !suspended) 96 | availableData.splice(0, availableData.length - length) 97 | for (const _history of availableData) { 98 | for (const field of FIELDS) { 99 | history[field].push(_history[field]) 100 | } 101 | } 102 | histories[code] = history 103 | progress.tick(code, UpdateType.Full) 104 | }) 105 | } 106 | 107 | export async function update({ 108 | length, 109 | forceSkip, 110 | progressBar = true, 111 | callback, 112 | codes, 113 | }: Option) { 114 | const getRealTimeQuotation = () => 115 | codes ? getRealTimeCodes(codes) : getRealTimeAll() 116 | 117 | if (!forceSkip) { 118 | const updatedCodes = new Set() 119 | const save = () => { 120 | if (updatedCodes.size > 0) localStorage.setItem('histories', histories) 121 | } 122 | const onSigint = () => { 123 | save() 124 | process.exit() 125 | } 126 | 127 | progress = new Progress(progressBar, (info) => { 128 | if (info.type !== UpdateType.Cache) updatedCodes.add(info.code) 129 | if (callback) callback(info) 130 | }) 131 | if (!codes) await updateAllCodes() 132 | const realTimeQuotation = await getRealTimeQuotation() 133 | const updateCodes = Object.keys(realTimeQuotation) 134 | progress.setTotal(updateCodes.length) 135 | process.addListener('SIGINT', onSigint) 136 | try { 137 | await incrementalUpdate(realTimeQuotation, length) // 先尝试增量更新 138 | await fullUpdate(realTimeQuotation, length) // 全量补充 139 | save() 140 | // 剩下的都是未更新的股票,统一做进度提示 141 | const cacheCodes = updateCodes.filter((code) => !updatedCodes.has(code)) 142 | for (const code of cacheCodes) progress.tick(code, UpdateType.Cache) 143 | } catch (e) { 144 | save() 145 | throw e 146 | } finally { 147 | process.removeListener('SIGINT', onSigint) 148 | } 149 | } 150 | 151 | // 可以基于行情搞事情了! 152 | const get = async () => { 153 | const data = [] 154 | const realTimeQuotation = await getRealTimeQuotation() 155 | for (const code of Object.keys(realTimeQuotation)) { 156 | const now = realTimeQuotation[code] 157 | if (now.suspended) continue 158 | const history = histories[code] 159 | for (const field of FIELDS) { 160 | history[field][history[field].length - 1] = now[field] 161 | } 162 | data.push({ code, ...history }) 163 | } 164 | return data 165 | } 166 | 167 | const watch = (callback: (data: PromiseReturnType) => any) => { 168 | const id = setPromiseInterval(async () => { 169 | try { 170 | await callback(await get()) 171 | } catch (e) { 172 | // 忽略 173 | } 174 | }, 1000) 175 | return () => clearPromiseInterval(id) 176 | } 177 | 178 | return { get, watch } 179 | } 180 | -------------------------------------------------------------------------------- /src/libs/local-storage.ts: -------------------------------------------------------------------------------- 1 | import fs = require('fs') 2 | 3 | export default class LocalStorage { 4 | private dbPath: string 5 | private data: any 6 | 7 | constructor(dbPath: string) { 8 | this.dbPath = dbPath 9 | try { 10 | this.data = JSON.parse(fs.readFileSync(this.dbPath, 'utf8')) 11 | } catch (e) { 12 | this.data = {} 13 | } 14 | } 15 | 16 | public getItem(key: string): T { 17 | return this.data[key] 18 | } 19 | 20 | public setItem(key: string, value: any) { 21 | this.data[key] = value 22 | fs.writeFileSync(this.dbPath, JSON.stringify(this.data)) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/libs/progress.ts: -------------------------------------------------------------------------------- 1 | import * as cliProgress from 'cli-progress' 2 | import { Option, UpdateType } from '../types' 3 | 4 | export default class Progress { 5 | private total = 0 6 | private value = 0 7 | private progress?: cliProgress.Bar 8 | private callback?: Option['callback'] 9 | 10 | constructor(print: boolean, callback?: Option['callback']) { 11 | if (print) { 12 | this.progress = new cliProgress.Bar({ 13 | format: 14 | '{prefix} [{bar}] {percentage}% {eta}秒 {value}/{total} {suffix}', 15 | barCompleteChar: '=', 16 | barIncompleteChar: '-', 17 | stopOnComplete: true, 18 | }) 19 | this.progress.start(Infinity, 0, { prefix: '数据准备中', suffix: '' }) 20 | } 21 | this.callback = callback 22 | } 23 | 24 | get isCompleted() { 25 | return this.value >= this.total 26 | } 27 | 28 | tick(code: string, type: UpdateType) { 29 | this.value++ 30 | if (this.progress) { 31 | const typeStr = ['Cache', 'Incremental', 'Full'] 32 | this.progress.increment(1, { 33 | prefix: 34 | // @ts-ignore 35 | this.isCompleted ? '更新完毕' : '数据更新中', 36 | suffix: `${code}(${typeStr[type]})`, 37 | }) 38 | } 39 | if (this.callback) { 40 | this.callback({ 41 | value: this.value, 42 | total: this.total, 43 | code, 44 | type, 45 | }) 46 | } 47 | } 48 | 49 | setTotal(total: number) { 50 | if (this.progress) this.progress.setTotal(total) 51 | this.total = total 52 | } 53 | 54 | stop() { 55 | if (this.progress) this.progress.stop() 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export enum UpdateType { 2 | Cache, 3 | Incremental, 4 | Full, 5 | } 6 | 7 | export interface Histories { 8 | [code: string]: { 9 | _lastDate: string 10 | _length: number 11 | open: number[] 12 | high: number[] 13 | low: number[] 14 | close: number[] 15 | volume: number[] 16 | amount: number[] 17 | turnover: number[] 18 | } 19 | } 20 | 21 | export interface Option { 22 | length: number 23 | forceSkip?: boolean 24 | progressBar?: boolean 25 | codes?: string[] 26 | callback?: (info: { 27 | value: number 28 | total: number 29 | code: string 30 | type: UpdateType 31 | }) => any 32 | } 33 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "moduleResolution": "node", 5 | "module": "commonjs", 6 | "target": "es2017", 7 | "declaration": true, 8 | "outDir": "./dist" 9 | }, 10 | "include": ["src"] 11 | } 12 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["tslint:latest", "tslint-config-prettier"], 3 | "rulesDirectory": ["tslint-plugin-prettier"], 4 | 5 | "rules": { 6 | "prettier": true, 7 | "no-console": false, 8 | "no-shadowed-variable": false, 9 | "object-literal-sort-keys": false, 10 | "interface-name": false, 11 | "member-access": false, 12 | "curly": false, 13 | "ordered-imports": false, 14 | "no-submodule-imports": false, 15 | "no-implicit-dependencies": false, 16 | "variable-name": [false, "allow-pascal-case"] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.5.5" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" 8 | integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.5.0" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" 15 | integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | "@types/cli-progress@^1.8.1": 22 | version "1.8.1" 23 | resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-1.8.1.tgz#f52f2c15ca85acab99617fd91616936faf070bd3" 24 | integrity sha512-W31ZRQPQ1CM42pb5iqs3TzQlMv/RDRsPZ6pTCsl71oLFqFI/TYors3Pukj6tMinlUmXmv+Az5RD/94fZPcxMrw== 25 | dependencies: 26 | "@types/node" "*" 27 | 28 | "@types/node@*": 29 | version "12.7.2" 30 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" 31 | integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== 32 | 33 | "@types/node@^11.13.8": 34 | version "11.13.19" 35 | resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.19.tgz#c7bd7009aa850464775d8a814e18138d633cd676" 36 | integrity sha512-tLRDU1hmcWamtgRT2iVRdraAQVGFQGgtcqracSo9XyMN1VeZLSVGb8RJJxVqab7UGbijoUijGPVFMjmqzyZIUw== 37 | 38 | "@types/strip-bom@^3.0.0": 39 | version "3.0.0" 40 | resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" 41 | integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= 42 | 43 | "@types/strip-json-comments@0.0.30": 44 | version "0.0.30" 45 | resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" 46 | integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== 47 | 48 | ansi-regex@^3.0.0: 49 | version "3.0.0" 50 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 51 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 52 | 53 | ansi-styles@^3.2.1: 54 | version "3.2.1" 55 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 56 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 57 | dependencies: 58 | color-convert "^1.9.0" 59 | 60 | arg@^4.1.0: 61 | version "4.1.1" 62 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.1.tgz#485f8e7c390ce4c5f78257dbea80d4be11feda4c" 63 | integrity sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw== 64 | 65 | argparse@^1.0.7: 66 | version "1.0.10" 67 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 68 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 69 | dependencies: 70 | sprintf-js "~1.0.2" 71 | 72 | array-find-index@^1.0.1: 73 | version "1.0.2" 74 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 75 | integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= 76 | 77 | balanced-match@^1.0.0: 78 | version "1.0.0" 79 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 80 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 81 | 82 | brace-expansion@^1.1.7: 83 | version "1.1.11" 84 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 85 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 86 | dependencies: 87 | balanced-match "^1.0.0" 88 | concat-map "0.0.1" 89 | 90 | buffer-from@^1.0.0: 91 | version "1.1.1" 92 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 93 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 94 | 95 | builtin-modules@^1.1.1: 96 | version "1.1.1" 97 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 98 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 99 | 100 | camelcase-keys@^2.0.0: 101 | version "2.1.0" 102 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 103 | integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= 104 | dependencies: 105 | camelcase "^2.0.0" 106 | map-obj "^1.0.0" 107 | 108 | camelcase@^2.0.0: 109 | version "2.1.1" 110 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 111 | integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= 112 | 113 | chalk@^2.0.0, chalk@^2.3.0: 114 | version "2.4.2" 115 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 116 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 117 | dependencies: 118 | ansi-styles "^3.2.1" 119 | escape-string-regexp "^1.0.5" 120 | supports-color "^5.3.0" 121 | 122 | cli-progress@^3.0.0: 123 | version "3.0.0" 124 | resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.0.0.tgz#c8d6bc876be1aef41c586224917f2ffdccb5a150" 125 | integrity sha512-Aq12tfjpZgnfG3mVluGTdB+hRhRN7QQmSmjgsQftU6bC59RQyMON/x2vpYvSgbc/JKxH/oXKEKvgTrE7pDFYHg== 126 | dependencies: 127 | colors "^1.1.2" 128 | string-width "^2.1.1" 129 | 130 | color-convert@^1.9.0: 131 | version "1.9.3" 132 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 133 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 134 | dependencies: 135 | color-name "1.1.3" 136 | 137 | color-name@1.1.3: 138 | version "1.1.3" 139 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 140 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 141 | 142 | colors@^1.1.2: 143 | version "1.3.3" 144 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" 145 | integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== 146 | 147 | commander@^2.12.1: 148 | version "2.20.0" 149 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" 150 | integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== 151 | 152 | concat-map@0.0.1: 153 | version "0.0.1" 154 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 155 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 156 | 157 | currently-unhandled@^0.4.1: 158 | version "0.4.1" 159 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 160 | integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= 161 | dependencies: 162 | array-find-index "^1.0.1" 163 | 164 | dateformat@~1.0.4-1.2.3: 165 | version "1.0.12" 166 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 167 | integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= 168 | dependencies: 169 | get-stdin "^4.0.1" 170 | meow "^3.3.0" 171 | 172 | debounce@^1.0.0: 173 | version "1.2.0" 174 | resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" 175 | integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== 176 | 177 | decamelize@^1.1.2: 178 | version "1.2.0" 179 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 180 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 181 | 182 | diff@^3.2.0: 183 | version "3.5.0" 184 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 185 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 186 | 187 | diff@^4.0.1: 188 | version "4.0.1" 189 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" 190 | integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== 191 | 192 | dynamic-dedupe@^0.3.0: 193 | version "0.3.0" 194 | resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" 195 | integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= 196 | dependencies: 197 | xtend "^4.0.0" 198 | 199 | error-ex@^1.2.0: 200 | version "1.3.2" 201 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 202 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 203 | dependencies: 204 | is-arrayish "^0.2.1" 205 | 206 | escape-string-regexp@^1.0.5: 207 | version "1.0.5" 208 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 209 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 210 | 211 | eslint-plugin-prettier@^2.2.0: 212 | version "2.7.0" 213 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz#b4312dcf2c1d965379d7f9d5b5f8aaadc6a45904" 214 | integrity sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA== 215 | dependencies: 216 | fast-diff "^1.1.1" 217 | jest-docblock "^21.0.0" 218 | 219 | esprima@^4.0.0: 220 | version "4.0.1" 221 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 222 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 223 | 224 | esutils@^2.0.2: 225 | version "2.0.3" 226 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 227 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 228 | 229 | fast-diff@^1.1.1: 230 | version "1.2.0" 231 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" 232 | integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== 233 | 234 | fecha@^3.0.3: 235 | version "3.0.3" 236 | resolved "https://registry.yarnpkg.com/fecha/-/fecha-3.0.3.tgz#fabbd416497649a42c24d34bfa726b579203a1e2" 237 | integrity sha512-6LQK/1jud/FZnfEEZJ7y81vw7ge81DNd/XEsX0hgMUjhS+QMljkb1C0czBaP7dMNRVrd5mw/J2J7qI2Nw+TWZw== 238 | 239 | filewatcher@~3.0.0: 240 | version "3.0.1" 241 | resolved "https://registry.yarnpkg.com/filewatcher/-/filewatcher-3.0.1.tgz#f4a1957355ddaf443ccd78a895f3d55e23c8a034" 242 | integrity sha1-9KGVc1Xdr0Q8zXiolfPVXiPIoDQ= 243 | dependencies: 244 | debounce "^1.0.0" 245 | 246 | find-up@^1.0.0: 247 | version "1.1.2" 248 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 249 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 250 | dependencies: 251 | path-exists "^2.0.0" 252 | pinkie-promise "^2.0.0" 253 | 254 | fs.realpath@^1.0.0: 255 | version "1.0.0" 256 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 257 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 258 | 259 | get-stdin@^4.0.1: 260 | version "4.0.1" 261 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 262 | integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= 263 | 264 | glob@^7.1.1, glob@^7.1.3: 265 | version "7.1.4" 266 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 267 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 268 | dependencies: 269 | fs.realpath "^1.0.0" 270 | inflight "^1.0.4" 271 | inherits "2" 272 | minimatch "^3.0.4" 273 | once "^1.3.0" 274 | path-is-absolute "^1.0.0" 275 | 276 | graceful-fs@^4.1.2: 277 | version "4.2.2" 278 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" 279 | integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== 280 | 281 | growly@^1.3.0: 282 | version "1.3.0" 283 | resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" 284 | integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= 285 | 286 | has-flag@^3.0.0: 287 | version "3.0.0" 288 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 289 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 290 | 291 | hosted-git-info@^2.1.4: 292 | version "2.8.4" 293 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546" 294 | integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ== 295 | 296 | indent-string@^2.1.0: 297 | version "2.1.0" 298 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 299 | integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= 300 | dependencies: 301 | repeating "^2.0.0" 302 | 303 | inflight@^1.0.4: 304 | version "1.0.6" 305 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 306 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 307 | dependencies: 308 | once "^1.3.0" 309 | wrappy "1" 310 | 311 | inherits@2: 312 | version "2.0.4" 313 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 314 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 315 | 316 | is-arrayish@^0.2.1: 317 | version "0.2.1" 318 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 319 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 320 | 321 | is-finite@^1.0.0: 322 | version "1.0.2" 323 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 324 | integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= 325 | dependencies: 326 | number-is-nan "^1.0.0" 327 | 328 | is-fullwidth-code-point@^2.0.0: 329 | version "2.0.0" 330 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 331 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 332 | 333 | is-utf8@^0.2.0: 334 | version "0.2.1" 335 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 336 | integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 337 | 338 | is-wsl@^1.1.0: 339 | version "1.1.0" 340 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" 341 | integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= 342 | 343 | isexe@^2.0.0: 344 | version "2.0.0" 345 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 346 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 347 | 348 | jest-docblock@^21.0.0: 349 | version "21.2.0" 350 | resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" 351 | integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw== 352 | 353 | js-tokens@^4.0.0: 354 | version "4.0.0" 355 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 356 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 357 | 358 | js-yaml@^3.13.1: 359 | version "3.13.1" 360 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 361 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 362 | dependencies: 363 | argparse "^1.0.7" 364 | esprima "^4.0.0" 365 | 366 | lines-and-columns@^1.1.6: 367 | version "1.1.6" 368 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" 369 | integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= 370 | 371 | load-json-file@^1.0.0: 372 | version "1.1.0" 373 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 374 | integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 375 | dependencies: 376 | graceful-fs "^4.1.2" 377 | parse-json "^2.2.0" 378 | pify "^2.0.0" 379 | pinkie-promise "^2.0.0" 380 | strip-bom "^2.0.0" 381 | 382 | loud-rejection@^1.0.0: 383 | version "1.6.0" 384 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 385 | integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= 386 | dependencies: 387 | currently-unhandled "^0.4.1" 388 | signal-exit "^3.0.0" 389 | 390 | make-error@^1.1.1: 391 | version "1.3.5" 392 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" 393 | integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== 394 | 395 | map-obj@^1.0.0, map-obj@^1.0.1: 396 | version "1.0.1" 397 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 398 | integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= 399 | 400 | meow@^3.3.0: 401 | version "3.7.0" 402 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 403 | integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= 404 | dependencies: 405 | camelcase-keys "^2.0.0" 406 | decamelize "^1.1.2" 407 | loud-rejection "^1.0.0" 408 | map-obj "^1.0.1" 409 | minimist "^1.1.3" 410 | normalize-package-data "^2.3.4" 411 | object-assign "^4.0.1" 412 | read-pkg-up "^1.0.1" 413 | redent "^1.0.0" 414 | trim-newlines "^1.0.0" 415 | 416 | minimatch@^3.0.4: 417 | version "3.0.4" 418 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 419 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 420 | dependencies: 421 | brace-expansion "^1.1.7" 422 | 423 | minimist@0.0.8: 424 | version "0.0.8" 425 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 426 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 427 | 428 | minimist@^1.1.3: 429 | version "1.2.0" 430 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 431 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 432 | 433 | mkdirp@^0.5.1: 434 | version "0.5.1" 435 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 436 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 437 | dependencies: 438 | minimist "0.0.8" 439 | 440 | node-notifier@^5.4.0: 441 | version "5.4.3" 442 | resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" 443 | integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== 444 | dependencies: 445 | growly "^1.3.0" 446 | is-wsl "^1.1.0" 447 | semver "^5.5.0" 448 | shellwords "^0.1.1" 449 | which "^1.3.0" 450 | 451 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 452 | version "2.5.0" 453 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 454 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 455 | dependencies: 456 | hosted-git-info "^2.1.4" 457 | resolve "^1.10.0" 458 | semver "2 || 3 || 4 || 5" 459 | validate-npm-package-license "^3.0.1" 460 | 461 | number-is-nan@^1.0.0: 462 | version "1.0.1" 463 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 464 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 465 | 466 | object-assign@^4.0.1: 467 | version "4.1.1" 468 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 469 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 470 | 471 | once@^1.3.0: 472 | version "1.4.0" 473 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 474 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 475 | dependencies: 476 | wrappy "1" 477 | 478 | parse-json@^2.2.0: 479 | version "2.2.0" 480 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 481 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 482 | dependencies: 483 | error-ex "^1.2.0" 484 | 485 | path-exists@^2.0.0: 486 | version "2.1.0" 487 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 488 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 489 | dependencies: 490 | pinkie-promise "^2.0.0" 491 | 492 | path-is-absolute@^1.0.0: 493 | version "1.0.1" 494 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 495 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 496 | 497 | path-parse@^1.0.6: 498 | version "1.0.6" 499 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 500 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 501 | 502 | path-type@^1.0.0: 503 | version "1.1.0" 504 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 505 | integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= 506 | dependencies: 507 | graceful-fs "^4.1.2" 508 | pify "^2.0.0" 509 | pinkie-promise "^2.0.0" 510 | 511 | pify@^2.0.0: 512 | version "2.3.0" 513 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 514 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 515 | 516 | pinkie-promise@^2.0.0: 517 | version "2.0.1" 518 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 519 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 520 | dependencies: 521 | pinkie "^2.0.0" 522 | 523 | pinkie@^2.0.0: 524 | version "2.0.4" 525 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 526 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 527 | 528 | prettier@^1.17.0: 529 | version "1.18.2" 530 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" 531 | integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== 532 | 533 | python-shell@^1.0.8: 534 | version "1.0.8" 535 | resolved "https://registry.yarnpkg.com/python-shell/-/python-shell-1.0.8.tgz#067bc93d790913efaa4b2a3c9d0e85e02adab510" 536 | integrity sha512-jMKagerg3alm6j+Prq5t/M3dTgEppy5vC6ns+LqAjfuHiT8olfK3PMokpqpeEcWEqvDnUcAOhp6SQzaLBtTzRw== 537 | 538 | read-pkg-up@^1.0.1: 539 | version "1.0.1" 540 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 541 | integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= 542 | dependencies: 543 | find-up "^1.0.0" 544 | read-pkg "^1.0.0" 545 | 546 | read-pkg@^1.0.0: 547 | version "1.1.0" 548 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 549 | integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 550 | dependencies: 551 | load-json-file "^1.0.0" 552 | normalize-package-data "^2.3.2" 553 | path-type "^1.0.0" 554 | 555 | redent@^1.0.0: 556 | version "1.0.0" 557 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 558 | integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= 559 | dependencies: 560 | indent-string "^2.1.0" 561 | strip-indent "^1.0.1" 562 | 563 | repeating@^2.0.0: 564 | version "2.0.1" 565 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 566 | integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= 567 | dependencies: 568 | is-finite "^1.0.0" 569 | 570 | resolve@^1.0.0, resolve@^1.10.0, resolve@^1.3.2: 571 | version "1.12.0" 572 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" 573 | integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== 574 | dependencies: 575 | path-parse "^1.0.6" 576 | 577 | rimraf@^2.6.1: 578 | version "2.7.1" 579 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 580 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 581 | dependencies: 582 | glob "^7.1.3" 583 | 584 | "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0: 585 | version "5.7.1" 586 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 587 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 588 | 589 | set-promise-interval@^1.0.8: 590 | version "1.0.8" 591 | resolved "https://registry.yarnpkg.com/set-promise-interval/-/set-promise-interval-1.0.8.tgz#ecc3095cb2fc728a4ab04995ed68b756169222c0" 592 | integrity sha512-5wo1ft1mOaYCUhxFfbWeqKj7brn95KWaqex/si+4b6N6E/aKpq0dsSm+lAwKBXAMqsAUgcWT7asZeXNq7+fULA== 593 | 594 | shellwords@^0.1.1: 595 | version "0.1.1" 596 | resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" 597 | integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== 598 | 599 | signal-exit@^3.0.0: 600 | version "3.0.2" 601 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 602 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 603 | 604 | source-map-support@^0.5.12, source-map-support@^0.5.6: 605 | version "0.5.13" 606 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" 607 | integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== 608 | dependencies: 609 | buffer-from "^1.0.0" 610 | source-map "^0.6.0" 611 | 612 | source-map@^0.6.0: 613 | version "0.6.1" 614 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 615 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 616 | 617 | spdx-correct@^3.0.0: 618 | version "3.1.0" 619 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 620 | integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== 621 | dependencies: 622 | spdx-expression-parse "^3.0.0" 623 | spdx-license-ids "^3.0.0" 624 | 625 | spdx-exceptions@^2.1.0: 626 | version "2.2.0" 627 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" 628 | integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== 629 | 630 | spdx-expression-parse@^3.0.0: 631 | version "3.0.0" 632 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 633 | integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== 634 | dependencies: 635 | spdx-exceptions "^2.1.0" 636 | spdx-license-ids "^3.0.0" 637 | 638 | spdx-license-ids@^3.0.0: 639 | version "3.0.5" 640 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 641 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 642 | 643 | sprintf-js@~1.0.2: 644 | version "1.0.3" 645 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 646 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 647 | 648 | string-width@^2.1.1: 649 | version "2.1.1" 650 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 651 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 652 | dependencies: 653 | is-fullwidth-code-point "^2.0.0" 654 | strip-ansi "^4.0.0" 655 | 656 | strip-ansi@^4.0.0: 657 | version "4.0.0" 658 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 659 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 660 | dependencies: 661 | ansi-regex "^3.0.0" 662 | 663 | strip-bom@^2.0.0: 664 | version "2.0.0" 665 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 666 | integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 667 | dependencies: 668 | is-utf8 "^0.2.0" 669 | 670 | strip-bom@^3.0.0: 671 | version "3.0.0" 672 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 673 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 674 | 675 | strip-indent@^1.0.1: 676 | version "1.0.1" 677 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 678 | integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= 679 | dependencies: 680 | get-stdin "^4.0.1" 681 | 682 | strip-json-comments@^2.0.0: 683 | version "2.0.1" 684 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 685 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 686 | 687 | supports-color@^5.3.0: 688 | version "5.5.0" 689 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 690 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 691 | dependencies: 692 | has-flag "^3.0.0" 693 | 694 | tree-kill@^1.2.1: 695 | version "1.2.1" 696 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" 697 | integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== 698 | 699 | trim-newlines@^1.0.0: 700 | version "1.0.0" 701 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 702 | integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= 703 | 704 | ts-node-dev@^1.0.0-pre.42: 705 | version "1.0.0-pre.42" 706 | resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.0.0-pre.42.tgz#1370603eaac171d6ed1d38d3f9879429122088ff" 707 | integrity sha512-1jrTjDu6SpBCkRYuBsBIND6hPO3FBP8+XdovchYp7Fi95pIpG0AmpVY+Xk4cmYTogd1sB4g0dQU98U1l0lHPtg== 708 | dependencies: 709 | dateformat "~1.0.4-1.2.3" 710 | dynamic-dedupe "^0.3.0" 711 | filewatcher "~3.0.0" 712 | minimist "^1.1.3" 713 | mkdirp "^0.5.1" 714 | node-notifier "^5.4.0" 715 | resolve "^1.0.0" 716 | rimraf "^2.6.1" 717 | source-map-support "^0.5.12" 718 | tree-kill "^1.2.1" 719 | ts-node "*" 720 | tsconfig "^7.0.0" 721 | 722 | ts-node@*: 723 | version "8.3.0" 724 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" 725 | integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== 726 | dependencies: 727 | arg "^4.1.0" 728 | diff "^4.0.1" 729 | make-error "^1.1.1" 730 | source-map-support "^0.5.6" 731 | yn "^3.0.0" 732 | 733 | tsconfig@^7.0.0: 734 | version "7.0.0" 735 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" 736 | integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== 737 | dependencies: 738 | "@types/strip-bom" "^3.0.0" 739 | "@types/strip-json-comments" "0.0.30" 740 | strip-bom "^3.0.0" 741 | strip-json-comments "^2.0.0" 742 | 743 | tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1: 744 | version "1.10.0" 745 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 746 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 747 | 748 | tslint-config-prettier@^1.18.0: 749 | version "1.18.0" 750 | resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" 751 | integrity sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg== 752 | 753 | tslint-plugin-prettier@^2.0.1: 754 | version "2.0.1" 755 | resolved "https://registry.yarnpkg.com/tslint-plugin-prettier/-/tslint-plugin-prettier-2.0.1.tgz#95b6a3b766622ffc44375825d7760225c50c3680" 756 | integrity sha512-4FX9JIx/1rKHIPJNfMb+ooX1gPk5Vg3vNi7+dyFYpLO+O57F4g+b/fo1+W/G0SUOkBLHB/YKScxjX/P+7ZT/Tw== 757 | dependencies: 758 | eslint-plugin-prettier "^2.2.0" 759 | lines-and-columns "^1.1.6" 760 | tslib "^1.7.1" 761 | 762 | tslint@^5.16.0: 763 | version "5.19.0" 764 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.19.0.tgz#a2cbd4a7699386da823f6b499b8394d6c47bb968" 765 | integrity sha512-1LwwtBxfRJZnUvoS9c0uj8XQtAnyhWr9KlNvDIdB+oXyT+VpsOAaEhEgKi1HrZ8rq0ki/AAnbGSv4KM6/AfVZw== 766 | dependencies: 767 | "@babel/code-frame" "^7.0.0" 768 | builtin-modules "^1.1.1" 769 | chalk "^2.3.0" 770 | commander "^2.12.1" 771 | diff "^3.2.0" 772 | glob "^7.1.1" 773 | js-yaml "^3.13.1" 774 | minimatch "^3.0.4" 775 | mkdirp "^0.5.1" 776 | resolve "^1.3.2" 777 | semver "^5.3.0" 778 | tslib "^1.8.0" 779 | tsutils "^2.29.0" 780 | 781 | tsutils@^2.29.0: 782 | version "2.29.0" 783 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 784 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 785 | dependencies: 786 | tslib "^1.8.1" 787 | 788 | typescript@3.5.3: 789 | version "3.5.3" 790 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" 791 | integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== 792 | 793 | validate-npm-package-license@^3.0.1: 794 | version "3.0.4" 795 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 796 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 797 | dependencies: 798 | spdx-correct "^3.0.0" 799 | spdx-expression-parse "^3.0.0" 800 | 801 | which@^1.3.0: 802 | version "1.3.1" 803 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 804 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 805 | dependencies: 806 | isexe "^2.0.0" 807 | 808 | wow-stock-calculator@^0.1.8: 809 | version "0.1.8" 810 | resolved "https://registry.yarnpkg.com/wow-stock-calculator/-/wow-stock-calculator-0.1.8.tgz#cf7e3447ebc7de90590d2c222a1a4bc6a04af588" 811 | integrity sha512-eyHPrx23ezltmyFBsUu7fastC7cWqPw2h9okZHBTljfEchy0ZvuHz44yURAjx3/Rz47szVmejGBdTStEGoArsA== 812 | 813 | wow-stock-quotation@^0.1.9: 814 | version "0.1.9" 815 | resolved "https://registry.yarnpkg.com/wow-stock-quotation/-/wow-stock-quotation-0.1.9.tgz#ea3e61e6ebee58e89b37fa1878adcfa391aaeb22" 816 | integrity sha512-1kY+kcGogQmGYdhHCqo8cYUzuJdQw9v8qIgLWiIpjRKl8sIh2pbWmX9HVqRXGjSgMYG2mN/xUV3HFKjOPpbTmw== 817 | dependencies: 818 | python-shell "^1.0.8" 819 | 820 | wrappy@1: 821 | version "1.0.2" 822 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 823 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 824 | 825 | xtend@^4.0.0: 826 | version "4.0.2" 827 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 828 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 829 | 830 | yn@^3.0.0: 831 | version "3.1.1" 832 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 833 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 834 | --------------------------------------------------------------------------------