weechatRN

Weechat relay client for iOS using websockets https://github.com/mhoran/weechatRN
git clone http://git.hanabi.in/repos/weechatRN.git
Log | Files | Refs | README | LICENSE

commit 22b4b85f1daf22286ab74079ee77c8eadc4be23a
parent 6e8503581806d42fe3e92023d7d6d12d185b7347
Author: Matthew Horan <matt@matthoran.com>
Date:   Fri, 25 Sep 2020 20:44:45 -0400

Add ESLint and Prettier and address some issues

Diffstat:
A.eslintignore | 1+
A.eslintrc | 11+++++++++++
A.prettierrc | 6++++++
Mpackage.json | 10++++++++--
Msrc/lib/helpers/date-formatter.ts | 6+++---
Msrc/lib/helpers/push-notifications.ts | 14+++++++++-----
Msrc/lib/helpers/url-formatter.ts | 14++++++++------
Msrc/lib/weechat/action_transformer.ts | 83+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/lib/weechat/connection.ts | 48++++++++++++++++++++++++------------------------
Rsrc/lib/weechat/types.ts -> src/lib/weechat/types.d.ts | 0
Msrc/usecase/Root.tsx | 60+++++++++++++++++++++++++++++++-----------------------------
Msrc/usecase/buffers/ui/Buffer.tsx | 44++++++++++----------------------------------
Msrc/usecase/buffers/ui/BufferContainer.tsx | 96++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/usecase/buffers/ui/BufferLine.tsx | 8++++----
Msrc/usecase/buffers/ui/BufferList.tsx | 31++++++++++++++-----------------
Msrc/usecase/buffers/ui/BufferListItem.tsx | 41+++++++++++++++++++++--------------------
Msrc/usecase/buffers/ui/themes/Default.tsx | 49++++++++++++++++++++-----------------------------
Msrc/usecase/login/LoginForm.tsx | 42+++++++++++++++++++++---------------------
Myarn.lock | 561+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
19 files changed, 830 insertions(+), 295 deletions(-)

diff --git a/.eslintignore b/.eslintignore @@ -0,0 +1 @@ +node_modules diff --git a/.eslintrc b/.eslintrc @@ -0,0 +1,11 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint", "prettier"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ] +} diff --git a/.prettierrc b/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "trailingComma": "none", + "singleQuote": true, + "printWidth": 80 +} diff --git a/package.json b/package.json @@ -5,7 +5,8 @@ "scripts": { "start": "expo start", "eject": "expo eject", - "test": "jest" + "test": "jest", + "lint": "eslint . --ext .ts --ext .tsx" }, "dependencies": { "@types/lodash": "^4.14.106", @@ -28,11 +29,16 @@ "@types/jest": "^25.2.1", "@types/react": "~16.9.35", "@types/react-native": "~0.63.2", + "@typescript-eslint/eslint-plugin": "^4.2.0", + "@typescript-eslint/parser": "^4.2.0", "babel-jest": "^25.3.0", "babel-preset-expo": "^8.3.0", + "eslint": "^7.9.0", + "eslint-config-prettier": "^6.12.0", + "eslint-plugin-prettier": "^3.1.4", "jest": "^25.3.0", "jest-expo": "^39.0.0", - "prettier": "^1.11.1", + "prettier": "^2.1.2", "react-test-renderer": "~16.9.0", "ts-jest": "^25.3.1", "tslib": "^1.9.0", diff --git a/src/lib/helpers/date-formatter.ts b/src/lib/helpers/date-formatter.ts @@ -1,4 +1,4 @@ -import { format } from "date-fns"; +import { format } from 'date-fns'; -export const formatDate = (date: string | number | Date) => - format(date, "ddd HH:mm:ss"); +export const formatDate = (date: string | number | Date): string => + format(date, 'ddd HH:mm:ss'); diff --git a/src/lib/helpers/push-notifications.ts b/src/lib/helpers/push-notifications.ts @@ -2,7 +2,7 @@ import Constants from 'expo-constants'; import * as Notifications from 'expo-notifications'; import * as Permissions from 'expo-permissions'; -export const registerForPushNotificationsAsync = async () => { +export const registerForPushNotificationsAsync = async (): Promise<void> => { const { status: existingStatus } = await Permissions.getAsync( Permissions.NOTIFICATIONS ); @@ -14,12 +14,16 @@ export const registerForPushNotificationsAsync = async () => { // install, so this will only ask on iOS await Permissions.askAsync(Permissions.NOTIFICATIONS); } -} +}; -export const getPushNotificationStatusAsync = async () => { +export const getPushNotificationStatusAsync = async (): Promise< + string | undefined +> => { let token; if (Constants.isDevice) { - const { status: existingStatus } = await Permissions.getAsync(Permissions.NOTIFICATIONS); + const { status: existingStatus } = await Permissions.getAsync( + Permissions.NOTIFICATIONS + ); let finalStatus = existingStatus; if (existingStatus !== 'granted') { const { status } = await Permissions.askAsync(Permissions.NOTIFICATIONS); @@ -32,4 +36,4 @@ export const getPushNotificationStatusAsync = async () => { } return token; -} +}; diff --git a/src/lib/helpers/url-formatter.ts b/src/lib/helpers/url-formatter.ts @@ -1,10 +1,12 @@ -export const formatUrl = (type, text) => { +export const formatUrl = (type: string, text: string): string => { switch (type) { - case "url": + case 'url': + return text; + case 'email': + return 'mailto:' + text; + case 'phone': + return 'tel:' + text; + default: return text; - case "email": - return "mailto:" + text; - case "phone": - return "tel:" + text; } }; diff --git a/src/lib/weechat/action_transformer.ts b/src/lib/weechat/action_transformer.ts @@ -1,4 +1,4 @@ -import { StoreState } from "../../store"; +import { StoreState } from '../../store'; export type WeechatReduxAction = { type: string; @@ -11,41 +11,40 @@ type MapFn<A, B> = (a: A) => A | B; const reduceToObjectByKey = <T, U>( array: T[], keyFn: KeyFn<T>, - mapFn: MapFn<T, U> = a => a -): object => - array.reduce((acc, elem) => ({ ...acc, [keyFn(elem)]: mapFn(elem) }), {}); + mapFn: MapFn<T, U> = (a) => a +) => array.reduce((acc, elem) => ({ ...acc, [keyFn(elem)]: mapFn(elem) }), {}); export const transformToReduxAction = (data: WeechatResponse<any>) => { switch (data.id) { // Weechat internal events starts with "_" - case "_nicklist_diff": { + case '_nicklist_diff': { const object = data.objects[0] as WeechatObject<WeechatNicklist[]>; const nicklistDiffs = object.content; - const nick = nicklistDiffs.filter(diff => diff.group === 0)[0]; + const nick = nicklistDiffs.filter((diff) => diff.group === 0)[0]; if (nick) { const bufferId = nick.pointers[0]; const payload = nick; switch (String.fromCharCode(nick._diff)) { - case "+": { + case '+': { return { - type: "NICK_ADDED", + type: 'NICK_ADDED', bufferId, payload }; } - case "-": { + case '-': { return { - type: "NICK_REMOVED", + type: 'NICK_REMOVED', bufferId, payload }; } - case "*": { + case '*': { return { - type: "NICK_UPDATED", + type: 'NICK_UPDATED', bufferId, payload }; @@ -55,7 +54,7 @@ export const transformToReduxAction = (data: WeechatResponse<any>) => { return null; } - case "_buffer_line_added": { + case '_buffer_line_added': { const object = data.objects[0] as WeechatObject<WeechatLine[]>; const line = object.content[0]; @@ -63,80 +62,80 @@ export const transformToReduxAction = (data: WeechatResponse<any>) => { const state: StoreState = getState(); dispatch({ - type: "BUFFER_LINE_ADDED", + type: 'BUFFER_LINE_ADDED', bufferId: line.buffer, currentBufferId: state.app.currentBufferId, payload: line }); }; } - case "_buffer_closing": { + case '_buffer_closing': { const object = data.objects[0] as WeechatObject<WeechatBuffer[]>; const buffer = object.content[0]; return { - type: "BUFFER_CLOSED", + type: 'BUFFER_CLOSED', bufferId: buffer.pointers[0] }; } - case "_buffer_opened": { + case '_buffer_opened': { const object = data.objects[0] as WeechatObject<WeechatBuffer[]>; const buffer = object.content[0]; buffer.id = buffer.pointers[0]; return { - type: "BUFFER_OPENED", + type: 'BUFFER_OPENED', payload: buffer, bufferId: buffer.id }; } - case "_buffer_renamed": { + case '_buffer_renamed': { const object = data.objects[0] as WeechatObject<WeechatBuffer[]>; const buffer = object.content[0]; buffer.id = buffer.pointers[0]; return { - type: "BUFFER_RENAMED", + type: 'BUFFER_RENAMED', payload: buffer, bufferId: buffer.id }; } - case "_buffer_localvar_removed": { + case '_buffer_localvar_removed': { const object = data.objects[0] as WeechatObject<WeechatBuffer[]>; const buffer = object.content[0]; buffer.id = buffer.pointers[0]; return { - type: "BUFFER_LOCALVAR_REMOVE", + type: 'BUFFER_LOCALVAR_REMOVE', payload: buffer, bufferId: buffer.id }; } - case "_buffer_title_changed": - case "_buffer_localvar_added": { + case '_buffer_title_changed': + case '_buffer_localvar_added': { const object = data.objects[0] as WeechatObject<WeechatBuffer[]>; const buffer = object.content[0]; buffer.id = buffer.pointers[0]; return { - type: "BUFFER_LOCALVAR_UPDATE", + type: 'BUFFER_LOCALVAR_UPDATE', payload: buffer, bufferId: buffer.id }; } - case "hotlist": { + case 'hotlist': { const object = data.objects[0] as WeechatObject<WeechatHotlist[]>; return (dispatch, getState) => { const state: StoreState = getState(); dispatch({ - type: "FETCH_HOTLISTS", + type: 'FETCH_HOTLISTS', payload: reduceToObjectByKey( object.content, - hotlist => hotlist.buffer, - h => { - const [unknown, message, privmsg, highlight] = h.count; + (hotlist) => hotlist.buffer, + (h) => { + const [, message, privmsg, highlight] = h.count; const sum = message + privmsg + highlight; return { ...h, message, privmsg, highlight, sum }; } @@ -145,48 +144,48 @@ export const transformToReduxAction = (data: WeechatResponse<any>) => { }); }; } - case "nicklist": { + case 'nicklist': { const object = data.objects[0] as WeechatObject<WeechatNicklist[]>; const nicklistDiffs = object.content; - const nicks = nicklistDiffs.filter(diff => diff.group === 0); + const nicks = nicklistDiffs.filter((diff) => diff.group === 0); return { - type: "FETCH_NICKLIST", + type: 'FETCH_NICKLIST', bufferId: object.content[0].pointers[0], payload: nicks }; } - case "buffers": { + case 'buffers': { const object = data.objects[0] as WeechatObject<WeechatBuffer[]>; return { - type: "FETCH_BUFFERS", + type: 'FETCH_BUFFERS', payload: reduceToObjectByKey( object.content, - buffer => buffer.pointers[0], - buf => ({ ...buf, id: buf.pointers[0] }) + (buffer) => buffer.pointers[0], + (buf) => ({ ...buf, id: buf.pointers[0] }) ) }; } - case "version": { + case 'version': { const infolist = data.objects[0] as WeechatObject<WeechatInfoList>; return { - type: "FETCH_VERSION", + type: 'FETCH_VERSION', payload: infolist.content.value }; } - case "lines": { + case 'lines': { const object = data.objects[0] as WeechatObject<WeechatLine[]>; return { - type: "FETCH_LINES", + type: 'FETCH_LINES', bufferId: object.content[0].buffer, payload: object.content }; } default: - console.log("unhandled event!", data.id, data); + console.log('unhandled event!', data.id, data); return undefined; } }; diff --git a/src/lib/weechat/connection.ts b/src/lib/weechat/connection.ts @@ -1,5 +1,5 @@ -import { WeeChatProtocol } from "./parser"; -import { transformToReduxAction } from "./action_transformer"; +import { WeeChatProtocol } from './parser'; +import { transformToReduxAction } from './action_transformer'; const protocol = new WeeChatProtocol(); @@ -10,8 +10,8 @@ export default class WeechatConnection { ssl: boolean; compressed: boolean; websocket: WebSocket; - onSuccess: (conn: WeechatConnection) => any; - onError: (reconnect: boolean) => any; + onSuccess: (conn: WeechatConnection) => void; + onError: (reconnect: boolean) => void; connected: boolean; reconnect: boolean; @@ -23,11 +23,11 @@ export default class WeechatConnection { connect( host: string, - password: string = "", + password = '', ssl: boolean, - onSuccess: (conn: WeechatConnection) => any, - onError: (reconnect: boolean) => any - ) { + onSuccess: (conn: WeechatConnection) => void, + onError: (reconnect: boolean) => void + ): void { this.hostname = host; this.password = password; this.ssl = ssl; @@ -37,40 +37,40 @@ export default class WeechatConnection { this.openSocket(); } - openSocket() { + openSocket(): void { this.websocket = new WebSocket( - `${this.ssl ? "wss" : "ws"}://${this.hostname}/weechat` + `${this.ssl ? 'wss' : 'ws'}://${this.hostname}/weechat` ); this.websocket.onopen = () => this.onopen(); - this.websocket.onmessage = event => this.onmessage(event); - this.websocket.onerror = event => this.handleError(event); + this.websocket.onmessage = (event) => this.onmessage(event); + this.websocket.onerror = (event) => this.handleError(event); this.websocket.onclose = () => this.close(); } - onopen() { + onopen(): void { this.send( `init password=${this.password},compression=${ - this.compressed ? "zlib" : "off" + this.compressed ? 'zlib' : 'off' }\n` ); - this.send("(version) info version"); + this.send('(version) info version'); this.connected = true; this.onSuccess(this); } - handleError(event) { + handleError(event: Event): void { console.log(event); this.reconnect = this.connected; this.onError(this.reconnect); } - close() { + close(): void { this.connected = false; - this.send("quit"); + this.send('quit'); this.websocket.close(); this.dispatch({ - type: "DISCONNECT" + type: 'DISCONNECT' }); if (this.reconnect) { @@ -79,10 +79,10 @@ export default class WeechatConnection { } } - onmessage(event) { + onmessage(event: WebSocketMessageEvent): void { const parsed = protocol.parse(event.data) as WeechatResponse<any>; - console.log("Parsed data:", parsed); + console.log('Parsed data:', parsed); try { const action = transformToReduxAction(parsed); if (action) { @@ -93,8 +93,8 @@ export default class WeechatConnection { } } - send(data) { - console.log("Sending data:", data); - this.websocket.send(data + "\n"); + send(data: string): void { + console.log('Sending data:', data); + this.websocket.send(data + '\n'); } } diff --git a/src/lib/weechat/types.ts b/src/lib/weechat/types.d.ts diff --git a/src/usecase/Root.tsx b/src/usecase/Root.tsx @@ -1,57 +1,56 @@ -import * as React from "react"; -import { StatusBar } from "react-native"; -import { Provider } from "react-redux"; -import { PersistGate } from "redux-persist/integration/react"; +import * as React from 'react'; +import { StatusBar } from 'react-native'; +import { Provider } from 'react-redux'; +import { PersistGate } from 'redux-persist/integration/react'; -import WeechatConnection from "../lib/weechat/connection"; -import { store, persistor } from "../store"; +import WeechatConnection from '../lib/weechat/connection'; +import { store, persistor } from '../store'; -import App from "./App"; -import ConnectionGate from "./ConnectionGate"; -import { getPushNotificationStatusAsync } from "../lib/helpers/push-notifications" +import App from './App'; +import ConnectionGate from './ConnectionGate'; +import { getPushNotificationStatusAsync } from '../lib/helpers/push-notifications'; interface State { connecting: boolean; } -export default class WeechatNative extends React.Component<{}, State> { +export default class WeechatNative extends React.Component<null, State> { state: State = { connecting: false }; connection: WeechatConnection; - constructor(props) { + constructor(props: null) { super(props); this.connection = new WeechatConnection(store.dispatch); } - setNotificationToken = async () => { - let token = await getPushNotificationStatusAsync(); - if (token) - this.sendMessageToBuffer("core.weechat", "/weechatrn " + token); - } + setNotificationToken = async (): Promise<void> => { + const token = await getPushNotificationStatusAsync(); + if (token) this.sendMessageToBuffer('core.weechat', '/weechatrn ' + token); + }; - onConnectionSuccess = connection => { + onConnectionSuccess = (connection: WeechatConnection): void => { this.setState({ connecting: false }); - connection.send("(hotlist) hdata hotlist:gui_hotlist(*)"); + connection.send('(hotlist) hdata hotlist:gui_hotlist(*)'); connection.send( - "(buffers) hdata buffer:gui_buffers(*) local_variables,notify,number,full_name,short_name,title,hidden,type" + '(buffers) hdata buffer:gui_buffers(*) local_variables,notify,number,full_name,short_name,title,hidden,type' ); // connection.send("(nicklist) nicklist"); - connection.send("sync"); + connection.send('sync'); this.setNotificationToken(); }; - onConnectionError = reconnect => { + onConnectionError = (reconnect: boolean): void => { this.setState({ connecting: reconnect }); }; - disconnect = () => { + disconnect = (): void => { this.connection.close(); }; - onConnect = (hostname: string, password: string, ssl: boolean) => { + onConnect = (hostname: string, password: string, ssl: boolean): void => { this.setState({ connecting: true }); this.connection.connect( hostname, @@ -62,7 +61,7 @@ export default class WeechatNative extends React.Component<{}, State> { ); }; - fetchBufferInfo = (bufferId: string, numLines: number = 50) => { + fetchBufferInfo = (bufferId: string, numLines = 50): void => { if (this.connection) { this.connection.send( `(lines) hdata buffer:0x${bufferId}/own_lines/last_line(-${numLines})/data` @@ -70,18 +69,21 @@ export default class WeechatNative extends React.Component<{}, State> { this.connection.send(`(nicklist) nicklist 0x${bufferId}`); } }; - sendMessageToBuffer = (fullBufferName: string, message: string) => { + + sendMessageToBuffer = (fullBufferName: string, message: string): void => { this.connection && this.connection.send(`(input) input ${fullBufferName} ${message}`); }; - clearHotlistForBuffer = (fullBufferName: string) => { - this.sendMessageToBuffer(fullBufferName, "/buffer set hotlist -1"); + + clearHotlistForBuffer = (fullBufferName: string): void => { + this.sendMessageToBuffer(fullBufferName, '/buffer set hotlist -1'); this.sendMessageToBuffer( fullBufferName, - "/input set_unread_current_buffer" + '/input set_unread_current_buffer' ); }; - render() { + + render(): JSX.Element { const { connecting } = this.state; return ( diff --git a/src/usecase/buffers/ui/Buffer.tsx b/src/usecase/buffers/ui/Buffer.tsx @@ -1,22 +1,17 @@ -import * as React from "react"; -import { - StyleSheet, - FlatList, - ListRenderItem -} from "react-native"; -import * as _ from "lodash"; +import * as React from 'react'; +import { FlatList, ListRenderItem } from 'react-native'; +import * as _ from 'lodash'; -import BufferLine from "./BufferLine"; +import BufferLine from './BufferLine'; interface Props { lines: WeechatLine[]; - onLongPress: () => any; + onLongPress: () => void; parseArgs: any; bufferId: string; } -const keyExtractor = (line: WeechatLine, index: number) => - _.last(line.pointers); +const keyExtractor = (line: WeechatLine) => _.last(line.pointers); export default class Buffer extends React.PureComponent<Props> { renderBuffer: ListRenderItem<WeechatLine> = ({ item }) => { @@ -26,11 +21,12 @@ export default class Buffer extends React.PureComponent<Props> { <BufferLine line={item} onLongPress={onLongPress} parseArgs={parseArgs} /> ); }; - render() { - const { lines, onLongPress, parseArgs } = this.props; + + render(): JSX.Element { + const { lines } = this.props; return ( <FlatList - data={lines.filter(line => line.displayed !== 0)} + data={lines.filter((line) => line.displayed !== 0)} inverted keyboardDismissMode="interactive" keyExtractor={keyExtractor} @@ -39,23 +35,3 @@ export default class Buffer extends React.PureComponent<Props> { ); } } - -const styles = StyleSheet.create({ - topbar: { - height: 20, - backgroundColor: "#001" - }, - bottomBox: { - height: 40, - paddingHorizontal: 10, - justifyContent: "center", - backgroundColor: "#aaa" - }, - inputBox: { - height: 25, - paddingHorizontal: 5, - justifyContent: "center", - borderColor: "gray", - backgroundColor: "#fff" - } -}); diff --git a/src/usecase/buffers/ui/BufferContainer.tsx b/src/usecase/buffers/ui/BufferContainer.tsx @@ -1,27 +1,25 @@ -import * as React from "react"; +import * as React from 'react'; import { StyleSheet, Linking, ActionSheetIOS, KeyboardAvoidingView, - TextInput, Image, View, Text, TouchableOpacity, LayoutAnimation -} from "react-native"; +} from 'react-native'; -import { connect } from "react-redux"; -import * as _ from "lodash"; -import ParsedText from "react-native-parsed-text"; +import { connect } from 'react-redux'; +import ParsedText from 'react-native-parsed-text'; -import Buffer from "./Buffer"; -import { getParseArgs } from "../../../lib/helpers/parse-text-args"; -import { formatUrl } from "../../../lib/helpers/url-formatter"; -import { renderWeechatFormat } from "../../../lib/weechat/color-formatter"; -import { StoreState } from "../../../store"; -import UndoTextInput from "./UndoTextInput"; +import Buffer from './Buffer'; +import { getParseArgs } from '../../../lib/helpers/parse-text-args'; +import { formatUrl } from '../../../lib/helpers/url-formatter'; +import { renderWeechatFormat } from '../../../lib/weechat/color-formatter'; +import { StoreState } from '../../../store'; +import UndoTextInput from './UndoTextInput'; interface Props { buffer: WeechatBuffer | null; @@ -35,13 +33,13 @@ interface Props { interface State { showTabButton: boolean; textValue: string; - selection: {start: number, end: number}; + selection: { start: number; end: number }; } class BufferContainer extends React.Component<Props, State> { state = { showTabButton: false, - textValue: "", + textValue: '', selection: { start: 0, end: 0 @@ -87,7 +85,7 @@ class BufferContainer extends React.Component<Props, State> { handleOnPress(type, text) { console.log(type, text); - if (type === "channel") { + if (type === 'channel') { // this.props.dispatch(changeCurrentBuffer(text)); } else { Linking.openURL(formatUrl(type, text)); @@ -96,15 +94,15 @@ class BufferContainer extends React.Component<Props, State> { handleChangeText = (textValue: string) => { this.tabCompleteInProgress = false; - this.setState({textValue}); + this.setState({ textValue }); }; handleSubmit = () => { const { textValue } = this.state; - textValue.split("\n").forEach((line) => { + textValue.split('\n').forEach((line) => { this.props.sendMessage(line); }); - this.handleChangeText(""); + this.handleChangeText(''); }; tabCompleteNick = () => { @@ -114,16 +112,16 @@ class BufferContainer extends React.Component<Props, State> { if (!this.tabCompleteInProgress) { this.tabCompleteWordEnd = selection.start; - this.tabCompleteWordStart = textValue.lastIndexOf(' ', - this.tabCompleteWordEnd - 1) + 1; + this.tabCompleteWordStart = + textValue.lastIndexOf(' ', this.tabCompleteWordEnd - 1) + 1; - if (this.tabCompleteWordStart == this.tabCompleteWordEnd) - return; + if (this.tabCompleteWordStart == this.tabCompleteWordEnd) return; - const prefix = textValue.substring(this.tabCompleteWordStart, - this.tabCompleteWordEnd).toLowerCase(); + const prefix = textValue + .substring(this.tabCompleteWordStart, this.tabCompleteWordEnd) + .toLowerCase(); - this.tabCompleteMatches = nicklist.filter(nick => + this.tabCompleteMatches = nicklist.filter((nick) => nick.name.toLowerCase().startsWith(prefix) ); if (this.tabCompleteMatches.length == 0) { @@ -132,32 +130,36 @@ class BufferContainer extends React.Component<Props, State> { this.tabCompleteIndex = 0; } else { - this.tabCompleteIndex = (this.tabCompleteIndex + 1) % - this.tabCompleteMatches.length; + this.tabCompleteIndex = + (this.tabCompleteIndex + 1) % this.tabCompleteMatches.length; } let nick = this.tabCompleteMatches[this.tabCompleteIndex].name; if (this.tabCompleteWordStart == 0) { - nick += ": "; + nick += ': '; } this.setState({ - textValue: textValue.substring(0, this.tabCompleteWordStart) + - nick + textValue.substring(this.tabCompleteWordEnd) + textValue: + textValue.substring(0, this.tabCompleteWordStart) + + nick + + textValue.substring(this.tabCompleteWordEnd) }); this.tabCompleteWordEnd = this.tabCompleteWordStart + nick.length; this.tabCompleteInProgress = true; }; handleSelectionChange = ({ nativeEvent: { selection } }) => { - this.setState({ selection }) - } + this.setState({ selection }); + }; - onLongPress = () => {}; + onLongPress = () => { + // not implemented + }; render() { const { bufferId, buffer, showTopic, lines } = this.props; - const { textValue, showTabButton, selection } = this.state; + const { textValue, showTabButton } = this.state; if (!bufferId) { return <View style={styles.container} />; @@ -195,10 +197,10 @@ class BufferContainer extends React.Component<Props, State> { /> {showTabButton && ( <TouchableOpacity - style={{ alignItems: "center", width: 40 }} + style={{ alignItems: 'center', width: 40 }} onPress={this.tabCompleteNick} > - <Image source={require("../../icons/long-arrow-right.png")} /> + <Image source={require('../../icons/long-arrow-right.png')} /> </TouchableOpacity> )} </View> @@ -216,17 +218,17 @@ const styles = StyleSheet.create({ topbar: { height: 20, paddingHorizontal: 5, - backgroundColor: "#001" + backgroundColor: '#001' }, link: { - textDecorationLine: "underline" + textDecorationLine: 'underline' }, text: { - color: "#eee" + color: '#eee' }, container: { flex: 1, - backgroundColor: "#222" + backgroundColor: '#222' }, main: { paddingVertical: 20 @@ -234,17 +236,17 @@ const styles = StyleSheet.create({ bottomBox: { paddingHorizontal: 10, paddingVertical: 7.5, - flexDirection: "row", - alignItems: "center", - justifyContent: "space-between", - backgroundColor: "#333" + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + backgroundColor: '#333' }, inputBox: { maxHeight: 60.5, padding: 5, - justifyContent: "center", - borderColor: "gray", - backgroundColor: "#fff", + justifyContent: 'center', + borderColor: 'gray', + backgroundColor: '#fff', flex: 1 } }); diff --git a/src/usecase/buffers/ui/BufferLine.tsx b/src/usecase/buffers/ui/BufferLine.tsx @@ -1,15 +1,15 @@ -import * as React from "react"; +import * as React from 'react'; -import Default from "./themes/Default"; +import Default from './themes/Default'; interface Props { line: WeechatLine; - onLongPress: (any) => any; + onLongPress: (line: WeechatLine) => void; parseArgs: any; } export default class BufferLine extends React.PureComponent<Props> { - render() { + render(): JSX.Element { const { line, onLongPress, parseArgs } = this.props; return ( diff --git a/src/usecase/buffers/ui/BufferList.tsx b/src/usecase/buffers/ui/BufferList.tsx @@ -1,20 +1,15 @@ -import * as React from "react"; -import { connect } from "react-redux"; -import { - StyleSheet, - FlatList, - View, - ListRenderItem -} from "react-native"; -import BufferListItem from "./BufferListItem"; -import { StoreState } from "../../../store"; -import { getHotlistForBufferId } from "../../../store/selectors"; +import * as React from 'react'; +import { connect } from 'react-redux'; +import { StyleSheet, FlatList, View, ListRenderItem } from 'react-native'; +import BufferListItem from './BufferListItem'; +import { StoreState } from '../../../store'; +import { getHotlistForBufferId } from '../../../store/selectors'; import { HotListState } from '../../../store/hotlists'; interface Props { buffers: WeechatBuffer[]; currentBufferId: string | null; - onSelectBuffer: (b: WeechatBuffer) => any; + onSelectBuffer: (b: WeechatBuffer) => void; hotlists: HotListState; filterBuffers: boolean; } @@ -39,13 +34,15 @@ class BufferList extends React.Component<Props> { const { filterBuffers, hotlists } = this.props; if (filterBuffers) { - return buffer.local_variables.type != "server" && - buffer.local_variables.type != null || - hotlists[buffer.id] && hotlists[buffer.id].sum != 0; + return ( + (buffer.local_variables.type != 'server' && + buffer.local_variables.type != null) || + (hotlists[buffer.id] && hotlists[buffer.id].sum != 0) + ); } else { return true; } - } + }; render() { const { buffers } = this.props; @@ -72,7 +69,7 @@ export default connect((state: StoreState) => ({ const styles = StyleSheet.create({ container: { flex: 1, - backgroundColor: "#121212" + backgroundColor: '#121212' }, topbar: { height: 30 diff --git a/src/usecase/buffers/ui/BufferListItem.tsx b/src/usecase/buffers/ui/BufferListItem.tsx @@ -1,48 +1,49 @@ -import * as React from "react"; +import * as React from 'react'; import { StyleSheet, Text, + TextStyle, TouchableHighlight, View -} from "react-native"; +} from 'react-native'; interface Props { buffer: WeechatBuffer; hotlist: Hotlist; currentBufferId: string; - onSelectBuffer: (b: WeechatBuffer) => any; + onSelectBuffer: (b: WeechatBuffer) => void; } export default class BufferListItem extends React.Component<Props> { - getBufferViewStyleFromProps = () => { - const { currentBufferId, buffer, hotlist} = this.props; + getBufferViewStyleFromProps = (): TextStyle => { + const { currentBufferId, buffer, hotlist } = this.props; if (currentBufferId === buffer.id) { - return { backgroundColor: "#f2777a" }; + return { backgroundColor: '#f2777a' }; } else if (hotlist.highlight > 0) { - return { backgroundColor: "#ffcf7f" }; + return { backgroundColor: '#ffcf7f' }; } else if (hotlist.sum > 0) { - return { backgroundColor: "#3b4252" }; + return { backgroundColor: '#3b4252' }; } else { return null; } }; - getBufferTextStyleFromProps = () => { - const { currentBufferId, buffer, hotlist} = this.props; + getBufferTextStyleFromProps = (): TextStyle => { + const { currentBufferId, buffer, hotlist } = this.props; if (currentBufferId === buffer.id) { - return { color: "#fff" }; + return { color: '#fff' }; } else if (hotlist.highlight > 0) { - return { color: "#000" }; + return { color: '#000' }; } else if (hotlist.sum > 0) { - return { color: "#ebcb8b" }; + return { color: '#ebcb8b' }; } else { return null; } }; - render() { + render(): JSX.Element { const { buffer, hotlist, onSelectBuffer } = this.props; return ( @@ -70,23 +71,23 @@ export default class BufferListItem extends React.Component<Props> { </TouchableHighlight> ); } -}; +} const styles = StyleSheet.create({ listItem: { flex: 1, height: 40, paddingHorizontal: 20, - justifyContent: "center" + justifyContent: 'center' }, listItemText: { - color: "#eee", - fontFamily: "Thonburi", - fontWeight: "bold", + color: '#eee', + fontFamily: 'Thonburi', + fontWeight: 'bold', fontSize: 15 }, row: { - flexDirection: "row" + flexDirection: 'row' }, bufferName: { flex: 1 diff --git a/src/usecase/buffers/ui/themes/Default.tsx b/src/usecase/buffers/ui/themes/Default.tsx @@ -1,25 +1,18 @@ -import * as React from "react"; -import { - StyleSheet, - Text, - TouchableHighlight, - View, -} from "react-native"; +import * as React from 'react'; +import { StyleSheet, Text, TouchableHighlight, View } from 'react-native'; -import ParsedText from "react-native-parsed-text"; -import { - renderWeechatFormat, -} from "../../../../lib/weechat/color-formatter"; -import { formatDate } from "../../../../lib/helpers/date-formatter"; +import ParsedText from 'react-native-parsed-text'; +import { renderWeechatFormat } from '../../../../lib/weechat/color-formatter'; +import { formatDate } from '../../../../lib/helpers/date-formatter'; interface Props { line: WeechatLine; - onLongPress: (any) => any; + onLongPress: (WeechatLine) => void; parseArgs: any; } export default class BufferLine extends React.Component<Props> { - render() { + render(): JSX.Element { const { line, onLongPress, parseArgs } = this.props; return ( <TouchableHighlight onLongPress={() => onLongPress(line)}> @@ -30,22 +23,20 @@ export default class BufferLine extends React.Component<Props> { {renderWeechatFormat(line.prefix).map((props, index) => { const { style, ...rest } = props; return ( - <Text {...rest} key={index} - style={ line.highlight ? styles.highlight : style } + <Text + {...rest} + key={index} + style={line.highlight ? styles.highlight : style} /> - ) + ); })} </Text> </View> - <Text - style={[styles.text, styles.meta]} - > + <Text style={[styles.text, styles.meta]}> {formatDate(line.date)} </Text> </View> - <View - style={[styles.messageContainer]} - > + <View style={[styles.messageContainer]}> <Text style={styles.text}> {renderWeechatFormat(line.message).map((props, index) => ( <ParsedText {...props} key={index} parse={parseArgs} /> @@ -60,13 +51,13 @@ export default class BufferLine extends React.Component<Props> { const styles = StyleSheet.create({ container: { - backgroundColor: "#2e3440", + backgroundColor: '#2e3440', paddingTop: 4, paddingBottom: 8, paddingHorizontal: 7 }, metaContainer: { - flexDirection: "row", + flexDirection: 'row', paddingBottom: 2 }, userContainer: { @@ -77,15 +68,15 @@ const styles = StyleSheet.create({ paddingHorizontal: 5 }, text: { - fontFamily: "Menlo", - color: "#eee", + fontFamily: 'Menlo', + color: '#eee', fontSize: 12 }, meta: { fontSize: 10 }, highlight: { - backgroundColor: "magenta", - color: "yellow" + backgroundColor: 'magenta', + color: 'yellow' } }); diff --git a/src/usecase/login/LoginForm.tsx b/src/usecase/login/LoginForm.tsx @@ -1,4 +1,4 @@ -import * as React from "react"; +import * as React from 'react'; import { View, SafeAreaView, @@ -9,9 +9,9 @@ import { Switch, StatusBar, TouchableOpacity -} from "react-native"; -import { connect } from "react-redux"; -import { StoreState } from "../../store"; +} from 'react-native'; +import { connect } from 'react-redux'; +import { StoreState } from '../../store'; interface Props { onConnect: (hostname: string, password: string, ssl: boolean) => void; @@ -39,7 +39,7 @@ class LoginForm extends React.Component<Props, State> { onPress = () => { this.props.dispatch({ - type: "SET_CONNECTION_INFO", + type: 'SET_CONNECTION_INFO', hostname: this.state.hostname, password: this.state.password, ssl: this.state.ssl, @@ -66,7 +66,7 @@ class LoginForm extends React.Component<Props, State> { }; render() { - const { children, connecting } = this.props; + const { connecting } = this.props; const { hostname, password, ssl, filterBuffers } = this.state; return ( @@ -95,7 +95,7 @@ class LoginForm extends React.Component<Props, State> { value={password} /> <View - style={{ flexDirection: "row", justifyContent: "space-between" }} + style={{ flexDirection: 'row', justifyContent: 'space-between' }} > <Text style={styles.text}>SSL</Text> <Switch @@ -105,7 +105,7 @@ class LoginForm extends React.Component<Props, State> { /> </View> <View - style={{ flexDirection: "row", justifyContent: "space-between" }} + style={{ flexDirection: 'row', justifyContent: 'space-between' }} > <Text style={styles.text}>Hide server buffers</Text> <Switch @@ -142,18 +142,18 @@ export default connect((state: StoreState) => ({ const styles = StyleSheet.create({ container: { - backgroundColor: "#f8f8f8", + backgroundColor: '#f8f8f8', flex: 1, padding: 20 }, header: { - textAlign: "center", - color: "#4157af", + textAlign: 'center', + color: '#4157af', fontSize: 20 }, text: { padding: 10, - color: "#4157af", + color: '#4157af', fontSize: 18 }, input: { @@ -161,26 +161,26 @@ const styles = StyleSheet.create({ padding: 10, borderBottomWidth: 2, fontSize: 18, - borderColor: "#4157af", - color: "#4157af" + borderColor: '#4157af', + color: '#4157af' }, centeredButton: { - flexDirection: "row", - justifyContent: "center" + flexDirection: 'row', + justifyContent: 'center' }, button: { borderWidth: 2, - borderColor: "#4157af", + borderColor: '#4157af', width: 200, - backgroundColor: "#f8f8f8", + backgroundColor: '#f8f8f8', paddingHorizontal: 20, paddingVertical: 10, borderRadius: 20 }, buttonText: { - textAlign: "center", - color: "#4157af", - fontWeight: "400", + textAlign: 'center', + color: '#4157af', + fontWeight: '400', fontSize: 18 } }); diff --git a/yarn.lock b/yarn.lock @@ -1121,6 +1121,22 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@eslint/eslintrc@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" + integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@expo/babel-preset-cli@0.2.17": version "0.2.17" resolved "https://registry.yarnpkg.com/@expo/babel-preset-cli/-/babel-preset-cli-0.2.17.tgz#308ce8a8519e10e3756eb7b5d550bcda99b24159" @@ -1966,6 +1982,27 @@ "@babel/runtime" "^7.7.2" core-js "^3.4.1" +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + "@react-native-community/cli-debugger-ui@^4.9.0": version "4.9.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.9.0.tgz#4177764ba69243c97aa26829d59d9501acb2bd71" @@ -2206,6 +2243,11 @@ jest-diff "^25.2.1" pretty-format "^25.2.1" +"@types/json-schema@^7.0.3": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + "@types/lodash@^4.14.106": version "4.14.149" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" @@ -2278,6 +2320,76 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.2.0.tgz#a3d5c11b377b7e18f3cd9c4e87d465fe9432669b" + integrity sha512-zBNRkzvLSwo6y5TG0DVcmshZIYBHKtmzD4N+LYnfTFpzc4bc79o8jNRSb728WV7A4Cegbs+MV5IRAj8BKBgOVQ== + dependencies: + "@typescript-eslint/experimental-utils" "4.2.0" + "@typescript-eslint/scope-manager" "4.2.0" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.2.0.tgz#3d0b5cd4aa61f5eb7aa1e873dea0db1410b062d2" + integrity sha512-5BBj6BjgHEndBaQQpUVzRIPERz03LBc0MCQkHwUaH044FJFL08SwWv/sQftk7gf0ShZ2xZysz0LTwCwNt4Xu3w== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.2.0" + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/typescript-estree" "4.2.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.2.0.tgz#1879ef400abd73d972e20f14c3522e5b343d1d1b" + integrity sha512-54jJ6MwkOtowpE48C0QJF9iTz2/NZxfKVJzv1ha5imigzHbNSLN9yvbxFFH1KdlRPQrlR8qxqyOvLHHxd397VA== + dependencies: + "@typescript-eslint/scope-manager" "4.2.0" + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/typescript-estree" "4.2.0" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.2.0.tgz#d10e6854a65e175b22a28265d372a97c8cce4bfc" + integrity sha512-Tb402cxxObSxWIVT+PnBp5ruT2V/36yj6gG4C9AjkgRlZpxrLAzWDk3neen6ToMBGeGdxtnfFLoJRUecGz9mYQ== + dependencies: + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/visitor-keys" "4.2.0" + +"@typescript-eslint/types@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.2.0.tgz#6f6b094329e72040f173123832397c7c0b910fc8" + integrity sha512-xkv5nIsxfI/Di9eVwN+G9reWl7Me9R5jpzmZUch58uQ7g0/hHVuGUbbn4NcxcM5y/R4wuJIIEPKPDb5l4Fdmwg== + +"@typescript-eslint/typescript-estree@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.2.0.tgz#9d746240991c305bf225ad5e96cbf57e7fea0551" + integrity sha512-iWDLCB7z4MGkLipduF6EOotdHNtgxuNKnYD54nMS/oitFnsk4S3S/TE/UYXQTra550lHtlv9eGmp+dvN9pUDtA== + dependencies: + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/visitor-keys" "4.2.0" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.2.0.tgz#ae13838e3a260b63ae51021ecaf1d0cdea8dbba5" + integrity sha512-WIf4BNOlFOH2W+YqGWa6YKLcK/EB3gEj2apCrqLw6mme1RzBy0jtJ9ewJgnrZDB640zfnv8L+/gwGH5sYp/rGw== + dependencies: + "@typescript-eslint/types" "4.2.0" + eslint-visitor-keys "^2.0.0" + "@unimodules/core@~5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@unimodules/core/-/core-5.5.0.tgz#580aaa4887641c1af85e0ab9f8987a5d4424595c" @@ -2326,6 +2438,11 @@ acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-jsx@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" @@ -2341,6 +2458,21 @@ acorn@^7.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" + integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== + +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: + version "6.12.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" + integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^6.5.5: version "6.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" @@ -2363,6 +2495,11 @@ ansi-colors@^1.0.1: dependencies: ansi-wrap "^0.1.0" +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-cyan@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" @@ -2531,6 +2668,11 @@ array-slice@^0.2.3: resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -3321,6 +3463,15 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" @@ -3386,6 +3537,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" +debug@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -3423,7 +3581,7 @@ deep-equal@^2.0.3: which-collection "^1.0.1" which-typed-array "^1.1.2" -deep-is@~0.1.3: +deep-is@^0.1.3, 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= @@ -3504,6 +3662,20 @@ diff-sequences@^25.2.6: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +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: + esutils "^2.0.2" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -3563,6 +3735,13 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + envinfo@^7.7.2: version "7.7.3" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc" @@ -3679,16 +3858,126 @@ escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" +eslint-config-prettier@^6.12.0: + version "6.12.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz#9eb2bccff727db1c52104f0b49e87ea46605a0d2" + integrity sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw== + dependencies: + get-stdin "^6.0.0" + +eslint-plugin-prettier@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" + integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@^5.0.0, eslint-scope@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@^7.9.0: + version "7.9.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337" + integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.1.3" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.0" + eslint-utils "^2.1.0" + eslint-visitor-keys "^1.3.0" + espree "^7.3.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" + 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.19" + 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.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" + integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -estraverse@^4.2.0: +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: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -4010,16 +4299,40 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.1.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.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== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, 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= +fastq@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + dependencies: + reusify "^1.0.4" + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -4089,6 +4402,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +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: + flat-cache "^2.0.1" + file-type@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" @@ -4168,6 +4488,20 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +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: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +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== + fontfaceobserver@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fontfaceobserver/-/fontfaceobserver-2.1.0.tgz#e2705d293e2c585a6531c2a722905657317a2991" @@ -4270,6 +4604,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +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= + gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" @@ -4280,6 +4619,11 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -4311,6 +4655,13 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-parent@^5.0.0, glob-parent@^5.1.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 "^4.0.1" + glob@7.1.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -4336,6 +4687,25 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" @@ -4490,6 +4860,16 @@ ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +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@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + image-size@^0.6.0: version "0.6.3" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" @@ -4508,6 +4888,14 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" +import-fresh@^3.0.0, import-fresh@^3.2.1: + 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: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" @@ -4686,6 +5074,11 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -4706,6 +5099,13 @@ is-generator-fn@^2.0.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.1: + version "4.0.1" + 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-map@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" @@ -5840,6 +6240,11 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" @@ -5962,6 +6367,14 @@ levenary@^1.1.1: dependencies: leven "^3.1.0" +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: + prelude-ls "^1.2.1" + type-check "~0.4.0" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -6133,6 +6546,11 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + metro-babel-register@0.58.0: version "0.58.0" resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.58.0.tgz#5c44786d49a044048df56cf476a2263491d4f53a" @@ -6580,7 +6998,7 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.1.1: +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== @@ -6855,6 +7273,18 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +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" + options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" @@ -6942,6 +7372,13 @@ pako@^1.0.5: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +parent-module@^1.0.0: + version "1.0.1" + 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" + parse-bmfont-ascii@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" @@ -7045,6 +7482,11 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -7055,7 +7497,7 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -picomatch@^2.0.4, picomatch@^2.0.5: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -7145,15 +7587,27 @@ pouchdb-collections@^1.0.1: resolved "https://registry.yarnpkg.com/pouchdb-collections/-/pouchdb-collections-1.0.1.tgz#fe63a17da977611abef7cb8026cb1a9553fd8359" integrity sha1-/mOhfal3YRq+98uAJssalVP9g1k= +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== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prettier@^1.11.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" + integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== pretty-format@^23.6.0: version "23.6.0" @@ -7208,6 +7662,11 @@ process@~0.5.1: resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= +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== + promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -7496,6 +7955,11 @@ regexp.prototype.flags@^1.3.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + regexpu-core@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" @@ -7609,6 +8073,11 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +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== + resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -7651,6 +8120,18 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +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" + rimraf@^2.5.4: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -7682,6 +8163,11 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" @@ -7794,7 +8280,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^7.1.3: +semver@^7.1.3, 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== @@ -7946,7 +8432,7 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.0.0: +slice-ansi@^2.0.0, 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== @@ -8233,6 +8719,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-json-comments@^3.1.0, 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== + sudo-prompt@^9.0.0: version "9.1.1" resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.1.1.tgz#73853d729770392caec029e2470db9c221754db0" @@ -8282,6 +8773,16 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +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: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -8321,6 +8822,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +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= + throat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -8459,11 +8965,23 @@ ts-jest@^25.3.1: semver "6.x" yargs-parser "18.x" +tslib@^1.8.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + tslib@^1.9.0: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +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" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -8476,6 +8994,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +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: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -8725,6 +9250,11 @@ uuid@^7.0.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== +v8-compile-cache@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + v8-to-istanbul@^4.0.1: version "4.1.3" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz#22fe35709a64955f49a08a7c7c959f6520ad6f20" @@ -8883,7 +9413,7 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: +word-wrap@^1.2.3, 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== @@ -8944,6 +9474,13 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +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: + mkdirp "^0.5.1" + ws@^1.1.0, ws@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51"