Fix most lint warnings

Summary:
I noticed that after the typescript upgrade, I got several weird positives from ESLint (like unused parameters in a type definition, which are obviously always unused, e.g. `type onClick = (e: Event) => void`). After some investigation, it turned out these warnings are generated by eslint, but that those rules should be performaned by typescript/eslint instead. For future reference to which rules this applies:

https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/README.md#extension-rules

Updated the config, and while at it, fixed all warnings in our codebase, except for `react-hooks/exhaustive-deps` warnings, since those require semantic changes.

This reduces the amount of eslint warnings from 86 to 39.

Reviewed By: passy

Differential Revision: D23905630

fbshipit-source-id: 0557708fd9ec6b17840a3c191e7d3baf225bdf23
This commit is contained in:
Michel Weststrate
2020-09-28 01:40:50 -07:00
committed by Facebook GitHub Bot
parent aaabe1cc82
commit ecf4cff7cf
26 changed files with 166 additions and 87 deletions

View File

@@ -87,9 +87,16 @@ module.exports = {
files: ['*.tsx', '*.ts'], files: ['*.tsx', '*.ts'],
parser: '@typescript-eslint/parser', parser: '@typescript-eslint/parser',
rules: { rules: {
'no-undef': 0, // taken care of by TypeScript already
'import/no-unresolved': 0, // taken care of by TypeScript already
'prettier/prettier': [2, {...prettierConfig, parser: 'typescript'}], 'prettier/prettier': [2, {...prettierConfig, parser: 'typescript'}],
// following rules are disabled because TS already handles it
'no-undef': 0,
'import/no-unresolved': 0,
// following rules are disabled because they don't handle TS correctly,
// while their @typescript-eslint counterpart does
// for reference: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/README.md#extension-rules
'no-unused-vars': 0,
'no-redeclare': 0,
'@typescript-eslint/no-redeclare': 1,
'@typescript-eslint/no-unused-vars': [ '@typescript-eslint/no-unused-vars': [
1, 1,
{ {

View File

@@ -63,7 +63,7 @@ import {useLocalStorage} from '../../utils/useLocalStorage';
import {PluginDefinition, ClientPluginMap, DevicePluginMap} from '../../plugin'; import {PluginDefinition, ClientPluginMap, DevicePluginMap} from '../../plugin';
type FlipperPlugins = PluginDefinition[]; type FlipperPlugins = PluginDefinition[];
type PluginsByCategory = [string, FlipperPlugins][]; type PluginsByCategoryType = [string, FlipperPlugins][];
type SectionLevel = 1 | 2 | 3; type SectionLevel = 1 | 2 | 3;
@@ -398,10 +398,12 @@ function isStaticViewActive(
return current && selected && current === selected; return current && selected && current === selected;
} }
function groupPluginsByCategory(plugins: FlipperPlugins): PluginsByCategory { function groupPluginsByCategory(
plugins: FlipperPlugins,
): PluginsByCategoryType {
const sortedPlugins = plugins.slice().sort(sortPluginsByName); const sortedPlugins = plugins.slice().sort(sortPluginsByName);
const byCategory: {[cat: string]: FlipperPlugins} = {}; const byCategory: {[cat: string]: FlipperPlugins} = {};
const res: PluginsByCategory = []; const res: PluginsByCategoryType = [];
sortedPlugins.forEach((plugin) => { sortedPlugins.forEach((plugin) => {
const category = plugin.category || ''; const category = plugin.category || '';
(byCategory[category] || (byCategory[category] = [])).push(plugin); (byCategory[category] || (byCategory[category] = [])).push(plugin);
@@ -477,7 +479,7 @@ const PluginList = memo(function PluginList({
selectedApp?: null | string; selectedApp?: null | string;
}) { }) {
// client is a mutable structure, so we need the event emitter to detect the addition of plugins.... // client is a mutable structure, so we need the event emitter to detect the addition of plugins....
const [_, setPluginsChanged] = useState(0); const [, setPluginsChanged] = useState(0);
useEffect(() => { useEffect(() => {
const listener = () => setPluginsChanged((v) => v + 1); const listener = () => setPluginsChanged((v) => v + 1);
client.on('plugins-change', listener); client.on('plugins-change', listener);
@@ -493,7 +495,7 @@ const PluginList = memo(function PluginList({
plugin, plugin,
}); });
}, },
[client], [client, starPlugin],
); );
const allPlugins = Array.from(clientPlugins.values()).filter( const allPlugins = Array.from(clientPlugins.values()).filter(

View File

@@ -227,7 +227,7 @@ class StripLogPrefix extends Transform {
_transform( _transform(
data: any, data: any,
encoding: string, _encoding: string,
callback: (err?: Error, data?: any) => void, callback: (err?: Error, data?: any) => void,
) { ) {
if (this.passedPrefix) { if (this.passedPrefix) {

View File

@@ -17,10 +17,6 @@ import {
TestUtils, TestUtils,
} from 'flipper-plugin'; } from 'flipper-plugin';
interface PersistedState {
count: 1;
}
const pluginDetails = TestUtils.createMockPluginDetails(); const pluginDetails = TestUtils.createMockPluginDetails();
let initialized = false; let initialized = false;

View File

@@ -18,10 +18,6 @@ import {
TestUtils, TestUtils,
} from 'flipper-plugin'; } from 'flipper-plugin';
interface PersistedState {
count: 1;
}
const pluginDetails = TestUtils.createMockPluginDetails(); const pluginDetails = TestUtils.createMockPluginDetails();
let initialized = false; let initialized = false;

View File

@@ -358,7 +358,7 @@ class Server extends EventEmitter {
}; };
_untrustedRequestHandler = ( _untrustedRequestHandler = (
socket: ReactiveSocket<string, any>, _socket: ReactiveSocket<string, any>,
payload: Payload<string, any>, payload: Payload<string, any>,
): Partial<Responder<string, any>> => { ): Partial<Responder<string, any>> => {
if (!payload.data) { if (!payload.data) {

View File

@@ -35,7 +35,7 @@ function createHighlightManager(initialText: string = ''): HighlightManager {
let currentFilter = initialText; let currentFilter = initialText;
const Highlight: React.FC<{text: string}> = memo(({text}) => { const Highlight: React.FC<{text: string}> = memo(({text}) => {
const [_update, setUpdate] = useState(0); const [, setUpdate] = useState(0);
const elem = useRef<HTMLSpanElement | null>(null); const elem = useRef<HTMLSpanElement | null>(null);
useEffect(() => { useEffect(() => {
function onChange(prevHighlight: string, newHighlight: string) { function onChange(prevHighlight: string, newHighlight: string) {

View File

@@ -120,21 +120,12 @@ const TooltipTail = styled.div<{
})); }));
TooltipTail.displayName = 'TooltipProvider:TooltipTail'; TooltipTail.displayName = 'TooltipProvider:TooltipTail';
type TooltipProps = {
children: React.ReactNode;
};
type TooltipObject = { type TooltipObject = {
rect: ClientRect; rect: ClientRect;
title: React.ReactNode; title: React.ReactNode;
options: TooltipOptions; options: TooltipOptions;
}; };
type TooltipState = {
tooltip: TooltipObject | null | undefined;
timeoutID: ReturnType<typeof setTimeout> | null | undefined;
};
interface TooltipManager { interface TooltipManager {
open( open(
container: HTMLDivElement, container: HTMLDivElement,

View File

@@ -539,8 +539,6 @@ function parseColor(
return {a, b, g, r}; return {a, b, g, r};
} }
const pencilStyle = {cursor: 'pointer', marginLeft: 8};
type Picker = { type Picker = {
values: Set<string>; values: Set<string>;
selected: string; selected: string;

View File

@@ -314,14 +314,6 @@ function isComponentExpanded(data: any, diffType: string, diffValue: any) {
return false; return false;
} }
type DataInspectorState = {
shouldExpand: boolean;
isExpanded: boolean;
isExpandable: boolean;
res: any;
resDiff: any;
};
const recursiveMarker = <RecursiveBaseWrapper>Recursive</RecursiveBaseWrapper>; const recursiveMarker = <RecursiveBaseWrapper>Recursive</RecursiveBaseWrapper>;
/** /**

View File

@@ -8,13 +8,7 @@
*/ */
import * as React from 'react'; import * as React from 'react';
import { import {render, fireEvent, waitFor, act} from '@testing-library/react';
render,
fireEvent,
waitFor,
act,
waitForElement,
} from '@testing-library/react';
import ManagedDataInspector from '../ManagedDataInspector'; import ManagedDataInspector from '../ManagedDataInspector';
import {sleep} from '../../../../utils'; import {sleep} from '../../../../utils';

View File

@@ -94,10 +94,6 @@ type ProcessNotificationStatesOptions = {
statusUpdate?: (msg: string) => void; statusUpdate?: (msg: string) => void;
}; };
type SerializePluginStatesOptions = {
pluginStates: PluginStatesState;
};
type PluginsToProcess = { type PluginsToProcess = {
pluginKey: string; pluginKey: string;
pluginId: string; pluginId: string;

View File

@@ -15,7 +15,6 @@ import {killOrphanedInstrumentsProcesses} from './processCleanup';
import {reportPlatformFailures} from './metrics'; import {reportPlatformFailures} from './metrics';
import {promises, constants} from 'fs'; import {promises, constants} from 'fs';
import memoize from 'lodash.memoize'; import memoize from 'lodash.memoize';
import GK from '../fb-stubs/GK';
import {notNull} from './typeUtils'; import {notNull} from './typeUtils';
// Use debug to get helpful logs when idb fails // Use debug to get helpful logs when idb fails

View File

@@ -27,7 +27,7 @@ export function deserialize(str: string): any {
} }
function processArray( function processArray(
element: any, _element: any,
array: Array<any>, array: Array<any>,
stack: Array<any>, stack: Array<any>,
dict: Map<any, any>, dict: Map<any, any>,
@@ -50,7 +50,7 @@ function processArray(
} }
function processKeyValuePair( function processKeyValuePair(
element: any, _element: any,
key: any, key: any,
value: any, value: any,
stack: Array<any>, stack: Array<any>,

View File

@@ -112,7 +112,7 @@ export function maybeSnapLeft(
} }
export function maybeSnapTop( export function maybeSnapTop(
props: Rect, _props: Rect,
windows: Array<Rect>, windows: Array<Rect>,
top: number, top: number,
): number { ): number {

View File

@@ -188,9 +188,9 @@ export function startPlugin<Module extends FlipperPluginModule<any>>(
pluginInstance.disconnect(); pluginInstance.disconnect();
}, },
call( call(
api: string, _api: string,
method: string, method: string,
fromPlugin: boolean, _fromPlugin: boolean,
params?: Object, params?: Object,
): Promise<Object> { ): Promise<Object> {
return sendStub(method, params); return sendStub(method, params);

View File

@@ -172,7 +172,7 @@
"detect-port": "^1.1.1", "detect-port": "^1.1.1",
"electron": "10.1.1", "electron": "10.1.1",
"electron-builder": "^22.8.0", "electron-builder": "^22.8.0",
"eslint": "^7.4.0", "eslint": "^7.9.0",
"eslint-config-fbjs": "^3.1.1", "eslint-config-fbjs": "^3.1.1",
"eslint-config-prettier": "^6.10.1", "eslint-config-prettier": "^6.10.1",
"eslint-import-resolver-typescript": "^2.3.0", "eslint-import-resolver-typescript": "^2.3.0",
@@ -184,7 +184,7 @@
"eslint-plugin-jsx-a11y": "^6.3.1", "eslint-plugin-jsx-a11y": "^6.3.1",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^3.1.2", "eslint-plugin-prettier": "^3.1.2",
"eslint-plugin-react": "^7.20.0", "eslint-plugin-react": "^7.21.1",
"eslint-plugin-react-hooks": "^4.0.4", "eslint-plugin-react-hooks": "^4.0.4",
"expand-tilde": "^2.0.2", "expand-tilde": "^2.0.2",
"express": "^4.15.2", "express": "^4.15.2",

View File

@@ -387,7 +387,7 @@ function addFileWatcherForiOSCrashLogs(
// Directory doesn't exist // Directory doesn't exist
return; return;
} }
fs.watch(dir, (eventType, filename) => { fs.watch(dir, (_eventType, filename) => {
// We just parse the crash logs with extension `.crash` // We just parse the crash logs with extension `.crash`
const checkFileExtension = /.crash$/.exec(filename); const checkFileExtension = /.crash$/.exec(filename);
if (!filename || !checkFileExtension) { if (!filename || !checkFileExtension) {
@@ -643,7 +643,7 @@ export default class CrashReporterPlugin extends FlipperDevicePlugin<
const referenceDate = new Date(); const referenceDate = new Date();
(function ( (function (
store: Store, store: Store,
date: Date, _date: Date,
setPersistedState: ( setPersistedState: (
pluginKey: string, pluginKey: string,
newPluginState: Maybe<PersistedState>, newPluginState: Maybe<PersistedState>,

View File

@@ -20,7 +20,6 @@ import {
FlexColumn, FlexColumn,
LoadingIndicator, LoadingIndicator,
styled, styled,
Select,
ToggleButton, ToggleButton,
Text, Text,
} from 'flipper'; } from 'flipper';
@@ -96,13 +95,6 @@ type ImagesCacheOverviewState = {
size: number; size: number;
}; };
const _StyledSelect = styled(Select)({
marginLeft: 6,
marginRight: 6,
height: '100%',
maxWidth: 164,
});
export default class ImagesCacheOverview extends PureComponent< export default class ImagesCacheOverview extends PureComponent<
ImagesCacheOverviewProps, ImagesCacheOverviewProps,
ImagesCacheOverviewState ImagesCacheOverviewState

View File

@@ -79,12 +79,6 @@ const debugLog = (...args: any[]) => {
} }
}; };
type ImagesMetaData = {
levels: ImagesListResponse;
events: Array<ImageEventWithId>;
imageDataList: Array<ImageData>;
};
export default class FlipperImagesPlugin extends FlipperPlugin< export default class FlipperImagesPlugin extends FlipperPlugin<
PluginState, PluginState,
BaseAction, BaseAction,

View File

@@ -43,7 +43,5 @@ declare module 'firefox-client/lib/client-methods' {
} }
declare module 'firefox-client/lib/extend' { declare module 'firefox-client/lib/extend' {
import FirefoxClient from 'firefox-client';
export default function extend(prototype: any, o: any): any; export default function extend(prototype: any, o: any): any;
} }

View File

@@ -553,7 +553,7 @@ class JSONTextFormatter {
); );
}; };
formatResponse = (request: Request, response: Response) => { formatResponse = (_request: Request, response: Response) => {
return this.format( return this.format(
decodeBody(response), decodeBody(response),
getHeaderValue(response.headers, 'content-type'), getHeaderValue(response.headers, 'content-type'),
@@ -589,7 +589,7 @@ class XMLTextFormatter {
); );
}; };
formatResponse = (request: Request, response: Response) => { formatResponse = (_request: Request, response: Response) => {
return this.format( return this.format(
decodeBody(response), decodeBody(response),
getHeaderValue(response.headers, 'content-type'), getHeaderValue(response.headers, 'content-type'),
@@ -611,7 +611,7 @@ class JSONFormatter {
); );
}; };
formatResponse = (request: Request, response: Response) => { formatResponse = (_request: Request, response: Response) => {
return this.format( return this.format(
decodeBody(response), decodeBody(response),
getHeaderValue(response.headers, 'content-type'), getHeaderValue(response.headers, 'content-type'),
@@ -715,7 +715,7 @@ class GraphQLFormatter {
} }
}; };
formatResponse = (request: Request, response: Response) => { formatResponse = (_request: Request, response: Response) => {
return this.format( return this.format(
decodeBody(response), decodeBody(response),
getHeaderValue(response.headers, 'content-type'), getHeaderValue(response.headers, 'content-type'),

View File

@@ -85,7 +85,7 @@ const GrabMetroDevice = connect<
}: GrabMetroDeviceStoreProps & GrabMetroDeviceOwnProps) { }: GrabMetroDeviceStoreProps & GrabMetroDeviceOwnProps) {
useEffect(() => { useEffect(() => {
onHasDevice(metroDevice); onHasDevice(metroDevice);
}, [metroDevice]); }, [metroDevice, onHasDevice]);
return null; return null;
}); });

View File

@@ -142,7 +142,7 @@ function startAssetServer(
): Promise<{app: Express; server: http.Server}> { ): Promise<{app: Express; server: http.Server}> {
const app = express(); const app = express();
app.use((req, res, next) => { app.use((req, _res, next) => {
if (knownErrors[req.url] != null) { if (knownErrors[req.url] != null) {
delete knownErrors[req.url]; delete knownErrors[req.url];
outputScreen(); outputScreen();
@@ -150,14 +150,14 @@ function startAssetServer(
next(); next();
}); });
app.use((req, res, next) => { app.use((_req, res, next) => {
res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate'); res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
res.header('Expires', '-1'); res.header('Expires', '-1');
res.header('Pragma', 'no-cache'); res.header('Pragma', 'no-cache');
next(); next();
}); });
app.post('/_restartElectron', (req, res) => { app.post('/_restartElectron', (_req, res) => {
if (shutdownElectron) { if (shutdownElectron) {
shutdownElectron(); shutdownElectron();
} }
@@ -165,8 +165,8 @@ function startAssetServer(
res.end(); res.end();
}); });
app.get('/', (req, res) => { app.get('/', (_req, res) => {
fs.readFile(path.join(staticDir, 'index.dev.html'), (err, content) => { fs.readFile(path.join(staticDir, 'index.dev.html'), (_err, content) => {
res.end(content); res.end(content);
}); });
}); });

View File

@@ -12,7 +12,6 @@ import {ResizeObserver} from './ResizeObserver.d';
import {Store} from '../app/src/reducers'; import {Store} from '../app/src/reducers';
export {}; export {};
type RequestIdleHandle = number;
declare global { declare global {
interface StoreEnhancerStateSanitizer { interface StoreEnhancerStateSanitizer {

View File

@@ -1345,6 +1345,22 @@
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
"@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"
"@iarna/toml@^2.2.5": "@iarna/toml@^2.2.5":
version "2.2.5" version "2.2.5"
resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c"
@@ -2717,7 +2733,7 @@ acorn-walk@^7.1.1:
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e"
integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==
acorn@7.1.1, acorn@^6.0.1, acorn@^7.1.0, acorn@^7.1.1, acorn@^7.2.0: acorn@7.1.1, acorn@^6.0.1, acorn@^7.1.0, acorn@^7.1.1, acorn@^7.2.0, acorn@^7.4.0:
version "7.1.1" version "7.1.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
@@ -2785,6 +2801,16 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.2, ajv@^6.5.5:
json-schema-traverse "^0.4.1" json-schema-traverse "^0.4.1"
uri-js "^4.2.2" uri-js "^4.2.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"
algoliasearch@^4.4.0: algoliasearch@^4.4.0:
version "4.4.0" version "4.4.0"
resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.4.0.tgz#25c356d8bdcf7e3f941633f61e1ac111ddcba404" resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.4.0.tgz#25c356d8bdcf7e3f941633f61e1ac111ddcba404"
@@ -3114,6 +3140,15 @@ array.prototype.flat@^1.2.3:
define-properties "^1.1.3" define-properties "^1.1.3"
es-abstract "^1.17.0-next.1" es-abstract "^1.17.0-next.1"
array.prototype.flatmap@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443"
integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==
dependencies:
define-properties "^1.1.3"
es-abstract "^1.17.0-next.1"
function-bind "^1.1.1"
arraybuffer.slice@~0.0.7: arraybuffer.slice@~0.0.7:
version "0.0.7" version "0.0.7"
resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
@@ -5419,6 +5454,23 @@ eslint-plugin-react@^7.20.0:
string.prototype.matchall "^4.0.2" string.prototype.matchall "^4.0.2"
xregexp "^4.3.0" xregexp "^4.3.0"
eslint-plugin-react@^7.21.1:
version "7.21.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.1.tgz#3d9fe506eab78756f67c671bb2a9aa9c20990a39"
integrity sha512-TGtWzWrFjZtrD1giMz0O6a9ul++YR9vZSzIL/a7qlb5I/ra/O5RkMGMJK+KKYnJrzz884kyAkEyWiU4Hg2HTrg==
dependencies:
array-includes "^3.1.1"
array.prototype.flatmap "^1.2.3"
doctrine "^2.1.0"
has "^1.0.3"
jsx-ast-utils "^2.4.1"
object.entries "^1.1.2"
object.fromentries "^2.0.2"
object.values "^1.1.1"
prop-types "^15.7.2"
resolve "^1.17.0"
string.prototype.matchall "^4.0.2"
eslint-rule-composer@^0.3.0: eslint-rule-composer@^0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
@@ -5439,6 +5491,13 @@ eslint-utils@^2.0.0:
dependencies: dependencies:
eslint-visitor-keys "^1.1.0" eslint-visitor-keys "^1.1.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.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.2.0, eslint-visitor-keys@^1.3.0: eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.2.0, eslint-visitor-keys@^1.3.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
@@ -5491,6 +5550,49 @@ eslint@^7.4.0:
text-table "^0.2.0" text-table "^0.2.0"
v8-compile-cache "^2.0.3" v8-compile-cache "^2.0.3"
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.1.0: espree@^7.1.0:
version "7.1.0" version "7.1.0"
resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c"
@@ -5500,6 +5602,15 @@ espree@^7.1.0:
acorn-jsx "^5.2.0" acorn-jsx "^5.2.0"
eslint-visitor-keys "^1.2.0" eslint-visitor-keys "^1.2.0"
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, esprima@~4.0.0: esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
@@ -6685,7 +6796,7 @@ import-fresh@^2.0.0:
caller-path "^2.0.0" caller-path "^2.0.0"
resolve-from "^3.0.0" resolve-from "^3.0.0"
import-fresh@^3.0.0, import-fresh@^3.1.0: import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1:
version "3.2.1" version "3.2.1"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
@@ -9378,6 +9489,15 @@ object.entries@^1.1.1:
function-bind "^1.1.1" function-bind "^1.1.1"
has "^1.0.3" has "^1.0.3"
object.entries@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add"
integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==
dependencies:
define-properties "^1.1.3"
es-abstract "^1.17.5"
has "^1.0.3"
object.fromentries@^2.0.2: object.fromentries@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9"
@@ -12048,6 +12168,11 @@ strip-json-comments@^3.1.0:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
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==
strip-json-comments@~2.0.1: strip-json-comments@~2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"