From c6d6f8ce309de2c89bec4fdceb4db4a2cc8f843d Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 Apr 2020 20:15:14 -0700 Subject: [PATCH] Switch from TSLint to ESLint (#64) - https://github.com/palantir/tslint-react/issues/210 - https://medium.com/@cosmvs/painless-migration-from-tslint-to-eslint-for-react-with-typescript-4befb4918ba8 * Switch to YAML file for ESLint * Update test snaps * Fix 'yarn start' trying to use TSlint --- .eslintrc.yml | 240 ++++++++ .github/workflows/react-ci-yarn.yml | 6 +- .vscode/settings.json | 47 +- package.json | 9 +- razzle.config.js | 15 +- src/__tests__/TestUtils.ts | 7 +- src/__tests__/employer-records.test.ts | 6 +- src/api/controllers/EmployersController.ts | 3 +- src/api/middleware/LocalizationMiddleware.ts | 3 +- src/api/storage/EmployerRecordLoader.ts | 10 +- src/api/storage/LocaleLoader.ts | 8 +- src/common/DesignHelpers.tsx | 7 + src/common/EmployeeNumber.ts | 32 +- src/common/EmployerLocation.ts | 16 +- src/common/LocalizedStrings.ts | 8 +- src/server.tsx | 38 +- src/web/App.tsx | 6 +- src/web/state/AppState.ts | 4 +- src/web/state/ducks/employers/actions.ts | 24 +- src/web/state/ducks/employers/api.ts | 13 +- src/web/state/ducks/employers/reducers.ts | 4 +- src/web/state/ducks/employers/types.ts | 3 +- src/web/state/ducks/environment/reducers.ts | 4 +- src/web/state/ducks/localization/actions.ts | 14 +- src/web/state/ducks/localization/reducers.ts | 4 +- src/web/views/About/About.tsx | 14 +- .../About/__snapshots__/About.test.tsx.snap | 4 + .../EmployerActionLinks.tsx | 12 +- .../EmployerActionLinks.test.tsx.snap | 1 + .../EmployerCitation/EmployerCitation.tsx | 15 +- .../views/EmployerDetail/EmployerDetail.tsx | 2 +- .../EmployerDetail.test.tsx.snap | 1 + .../EmployerDetailsHeader.tsx | 9 +- .../EmployerListDetails.test.tsx | 5 +- .../EmployerListDetails.tsx | 5 +- .../EmployerListSearch/EmployerListSearch.tsx | 5 +- .../EmployerListSearchFilter.ts | 20 +- src/web/views/HeaderFooter/HeaderMenu.tsx | 14 +- .../__snapshots__/HeaderMenu.test.tsx.snap | 1 + tslint.json | 106 ---- yarn.lock | 580 +++++++++++++++++- 41 files changed, 1019 insertions(+), 306 deletions(-) create mode 100644 .eslintrc.yml create mode 100644 src/common/DesignHelpers.tsx delete mode 100644 tslint.json diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 00000000..f1f7d79d --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,240 @@ +--- +extends: +- plugin:react/recommended +env: + browser: true + es6: true + node: true +parser: "@typescript-eslint/parser" +parserOptions: + project: tsconfig.json + sourceType: module +plugins: +- "@typescript-eslint" +- "@typescript-eslint/eslint-plugin-tslint" +- import +- prefer-arrow +- react +settings: + react: + version: detect +rules: + "@typescript-eslint/adjacent-overload-signatures": error + "@typescript-eslint/array-type": error + "@typescript-eslint/ban-types": error + "@typescript-eslint/class-name-casing": error + "@typescript-eslint/consistent-type-assertions": error + "@typescript-eslint/consistent-type-definitions": error + "@typescript-eslint/explicit-member-accessibility": + - error + - accessibility: explicit + "@typescript-eslint/indent": + - error + - tab + - CallExpression: + arguments: first + FunctionDeclaration: + parameters: first + FunctionExpression: + parameters: first + SwitchCase: 1 + "@typescript-eslint/interface-name-prefix": error + "@typescript-eslint/member-delimiter-style": + - error + - multiline: + delimiter: semi + requireLast: true + singleline: + delimiter: semi + requireLast: false + "@typescript-eslint/member-ordering": error + "@typescript-eslint/naming-convention": + - error + - selector: default + format: + - strictCamelCase + - selector: variable + format: + - strictCamelCase + - StrictPascalCase + - selector: class + format: + - StrictPascalCase + - selector: enum + format: + - StrictPascalCase + - selector: interface + format: + - StrictPascalCase + - selector: typeAlias + format: + - StrictPascalCase + - selector: typeParameter + format: + - PascalCase + - selector: property + modifiers: + - static + - readonly + format: + - UPPER_CASE + "@typescript-eslint/no-empty-function": error + "@typescript-eslint/no-empty-interface": error + "@typescript-eslint/no-explicit-any": 'off' + "@typescript-eslint/no-misused-new": error + "@typescript-eslint/no-namespace": error + "@typescript-eslint/no-parameter-properties": 'off' + "@typescript-eslint/no-this-alias": error + "@typescript-eslint/no-use-before-define": 'off' + "@typescript-eslint/no-var-requires": error + "@typescript-eslint/prefer-for-of": error + "@typescript-eslint/prefer-function-type": error + "@typescript-eslint/prefer-namespace-keyword": error + "@typescript-eslint/quotes": + - error + - double + "@typescript-eslint/semi": + - error + - always + "@typescript-eslint/triple-slash-reference": error + "@typescript-eslint/tslint/config": + - error + - rules: + import-spacing: true + jsdoc-format: true + no-reference-import: true + object-literal-sort-keys: true + one-line: + - true + - check-catch + - check-else + - check-open-brace + - check-whitespace + prefer-conditional-expression: true + typedef: + - true + - arrow-call-signature + - call-signature + - member-variable-declaration + - parameter + - property-declaration + - variable-declaration + - variable-declaration-ignore-function + whitespace: + - true + - check-branch + - check-decl + - check-module + - check-operator + - check-separator + - check-type + - check-typecast + "@typescript-eslint/type-annotation-spacing": error + "@typescript-eslint/unified-signatures": error + arrow-body-style: error + arrow-parens: + - error + - as-needed + camelcase: error + comma-dangle: + - error + - arrays: always-multiline + objects: always-multiline + imports: always-multiline + exports: always-multiline + functions: always-multiline + complexity: 'off' + constructor-super: error + curly: error + default-case: error + dot-notation: error + eol-last: 'off' + eqeqeq: + - error + - smart + guard-for-in: error + id-blacklist: + - error + - any + - Undefined + - undefined + id-match: error + import/no-extraneous-dependencies: error + import/no-internal-modules: 'off' + import/order: error + max-classes-per-file: + - error + - 1 + max-len: + - error + - code: 120 + ignorePattern: '[`"''];?$' + ignoreStrings: true + new-parens: error + no-bitwise: error + no-caller: error + no-cond-assign: error + no-console: 'off' + no-debugger: error + no-duplicate-case: error + no-duplicate-imports: error + no-empty: error + no-eval: error + no-extra-bind: error + no-fallthrough: error + no-invalid-this: 'off' + no-multiple-empty-lines: error + no-new-func: error + no-new-wrappers: error + no-redeclare: error + no-return-await: error + no-sequences: error + no-shadow: + - error + - builtinGlobals: true + hoist: all + no-sparse-arrays: error + no-template-curly-in-string: error + no-throw-literal: error + no-trailing-spaces: error + no-undef-init: error + no-underscore-dangle: + - error + - allow: + - __PRELOADED_STATE__ + - __REDUX_DEVTOOLS_EXTENSION_COMPOSE__ + no-unsafe-finally: error + no-unused-expressions: error + no-unused-labels: error + no-var: error + object-shorthand: error + one-var: + - error + - never + prefer-arrow/prefer-arrow-functions: error + prefer-const: error + prefer-object-spread: error + quote-props: + - error + - consistent-as-needed + radix: error + react/jsx-boolean-value: + - error + - always + react/jsx-curly-spacing: error + react/jsx-equals-spacing: error + react/jsx-key: error + react/jsx-no-bind: 'off' + react/no-string-refs: error + react/no-unescaped-entities: 'off' + space-before-function-paren: + - error + - anonymous: never + asyncArrow: always + named: never + space-in-parens: + - error + - never + spaced-comment: error + use-isnan: error + valid-typeof: 'off' diff --git a/.github/workflows/react-ci-yarn.yml b/.github/workflows/react-ci-yarn.yml index cb467c24..ebc93723 100644 --- a/.github/workflows/react-ci-yarn.yml +++ b/.github/workflows/react-ci-yarn.yml @@ -20,7 +20,11 @@ jobs: node-version: ${{ matrix.node-version }} - name: Install packages run: yarn install + - name: Run linting + run: | + yarn lint:ts + echo "Lint process exited with status code $?." - name: Run unit tests run: | yarn test:ci - echo "Process exited with status code $?." + echo "Test process exited with status code $?." diff --git a/.vscode/settings.json b/.vscode/settings.json index fbc5f109..206b154e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,23 +1,26 @@ { - "[json]": { - "editor.insertSpaces": true, - "editor.tabSize": 2 - }, - "[yml]": { - "editor.insertSpaces": true, - "editor.tabSize": 2 - }, - "editor.insertSpaces": false, - "editor.detectIndentation": false, - "files.exclude": { - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/CVS": true, - "**/.DS_Store": true, - "**/__snapshots__/**": true, - "build/**": true, - "coverage/**": true, - "node_modules/**": true - } -} \ No newline at end of file + "[json]": { + "editor.insertSpaces": true, + "editor.tabSize": 2 + }, + "[yml]": { + "editor.insertSpaces": true, + "editor.tabSize": 2 + }, + "editor.detectIndentation": false, + "editor.insertSpaces": false, + "eslint.nodePath": "./node_modules", + "eslint.options": { "configFile": "./.eslintrc.yml" }, + "eslint.packageManager": "yarn", + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/__snapshots__/**": true, + "build/**": true, + "coverage/**": true, + "node_modules/**": true + } +} diff --git a/package.json b/package.json index 4d5c10b9..46c30b8a 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "build": "razzle build", "debug": "razzle start --inspect --inspect-port=9230", + "lint:ts": "eslint --ext=jsx,ts,tsx src", "postinstall": "npm rebuild node-sass", "start": "razzle start", "start:prod": "node build/server.js", @@ -47,7 +48,14 @@ "@types/serialize-javascript": "^1.5.0", "@types/webpack-env": "^1.13.6", "@types/yaml": "^1.2.0", + "@typescript-eslint/eslint-plugin": "^2.27.0", + "@typescript-eslint/eslint-plugin-tslint": "^2.27.0", + "@typescript-eslint/parser": "^2.27.0", "cross-env": "^7.0.2", + "eslint": "^6.8.0", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-prefer-arrow": "^1.1.7", + "eslint-plugin-react": "^7.19.0", "jest": "^25.2.3", "razzle": "^3.0.0", "razzle-plugin-scss": "^3.0.0", @@ -55,7 +63,6 @@ "react-test-renderer": "^16.13.1", "ts-jest": "^25.0.0", "tslint": "^5.19.0", - "tslint-react": "^4.0.0", "typescript": "^3.2.2" }, "jest": { diff --git a/razzle.config.js b/razzle.config.js index 9b8d8cc1..c85996ee 100644 --- a/razzle.config.js +++ b/razzle.config.js @@ -1,5 +1,16 @@ -'use strict'; +"use strict"; module.exports = { - plugins: ['scss', 'typescript'], + plugins: [ + "scss", + { + name: "typescript", + options: { + useEslint: true, + forkTsChecker: { + tslint: false, + }, + }, + }, + ], }; diff --git a/src/__tests__/TestUtils.ts b/src/__tests__/TestUtils.ts index d3432a92..525ee28a 100644 --- a/src/__tests__/TestUtils.ts +++ b/src/__tests__/TestUtils.ts @@ -1,9 +1,9 @@ type ComponentGenerator = (props: {}) => string; -export const mockComponent = (componentName: string): ComponentGenerator => { - return (props: {}): string => { +export const mockComponent = (componentName: string): ComponentGenerator => + (props: {}): string => { const openingTag: string = `[component: ${componentName}`; - const closingTag: string = `/]`; + const closingTag: string = "/]"; const propKeys: string[] = Object.keys(props); @@ -27,4 +27,3 @@ export const mockComponent = (componentName: string): ComponentGenerator => { return `${openingTag} ${propsList.join(" ")} ${closingTag}`; }; -}; diff --git a/src/__tests__/employer-records.test.ts b/src/__tests__/employer-records.test.ts index 3f0e5418..381e129a 100644 --- a/src/__tests__/employer-records.test.ts +++ b/src/__tests__/employer-records.test.ts @@ -6,9 +6,7 @@ import { EmployerRecord } from "../common/EmployerRecord"; const directory: string = "./public"; const subDirectory: string = "employers"; -const dateToNumber = (date: string | Date | null): number => { - return new Date(date || "").getTime(); -}; +const dateToNumber = (date: string | Date | null): number => new Date(date || "").getTime(); const recordIds: string[] = fs.readdirSync(`${directory}/${subDirectory}`) @@ -24,7 +22,7 @@ describe("employer records", () => { }); test.each( - recordIds.map((recordId: string) => [ recordId ]) + recordIds.map((recordId: string) => [ recordId ]), )("can load and parse %p (%#)", async (recordId: string) => { const record: EmployerRecord = await loader.loadAsync(recordId); diff --git a/src/api/controllers/EmployersController.ts b/src/api/controllers/EmployersController.ts index 15ffc7c0..ac80300e 100644 --- a/src/api/controllers/EmployersController.ts +++ b/src/api/controllers/EmployersController.ts @@ -9,8 +9,7 @@ import { RoutedControllerBase } from "./RoutedControllerBase"; class EmployersController extends RoutedControllerBase { public static readonly SUBPATH: string = "employers"; - private readonly recordLoader: EmployerRecordLoader = - new EmployerRecordLoader(process.env.RAZZLE_PUBLIC_DIR || "/", "employers"); + private readonly recordLoader: EmployerRecordLoader = new EmployerRecordLoader(process.env.RAZZLE_PUBLIC_DIR || "/", "employers"); private employers: EmployerRecord[] = []; diff --git a/src/api/middleware/LocalizationMiddleware.ts b/src/api/middleware/LocalizationMiddleware.ts index 7d5419fb..4931597c 100644 --- a/src/api/middleware/LocalizationMiddleware.ts +++ b/src/api/middleware/LocalizationMiddleware.ts @@ -32,7 +32,8 @@ export class LocalizationMiddleware { } const request: HttpRequest = req as HttpRequest; - const isValidLanguage = (code: string): boolean => this.supportedLanguages.indexOf(code && code.toLowerCase()) >= 0; + const isValidLanguage = (code: string): boolean => + this.supportedLanguages.indexOf(code && code.toLowerCase()) >= 0; let userLanguage: string = this.defaultLanguage; diff --git a/src/api/storage/EmployerRecordLoader.ts b/src/api/storage/EmployerRecordLoader.ts index 2dfa1d89..17c6f042 100644 --- a/src/api/storage/EmployerRecordLoader.ts +++ b/src/api/storage/EmployerRecordLoader.ts @@ -13,7 +13,7 @@ const readdirAsync = util.promisify(fs.readdir); const readFileAsync = util.promisify(fs.readFile); export class EmployerRecordLoader extends DataFileLoader { - private static readonly employerFileNameRegex: RegExp = /^(.*)\.yml$/; + private static readonly EMPLOYER_FILE_REGEX: RegExp = /^(.*)\.yml$/; public async getAllIdsAsync(): Promise { if (!fs.existsSync(this.directoryPath)) { @@ -25,14 +25,14 @@ export class EmployerRecordLoader extends DataFileLoader { return ( fileNames .map((fileName: string): string => { - const regexResult: RegExpExecArray | null = EmployerRecordLoader.employerFileNameRegex.exec(fileName); + const regexResult: RegExpExecArray | null = + EmployerRecordLoader.EMPLOYER_FILE_REGEX.exec(fileName); + const recordId: string | null = regexResult && regexResult[1].toString(); return recordId || ""; }) - .filter((recordId: string): boolean => { - return recordId.length > 0 && recordId !== "sample"; - }) + .filter((recordId: string): boolean => recordId.length > 0 && recordId !== "sample") ); } diff --git a/src/api/storage/LocaleLoader.ts b/src/api/storage/LocaleLoader.ts index fe76fd40..eb31cd08 100644 --- a/src/api/storage/LocaleLoader.ts +++ b/src/api/storage/LocaleLoader.ts @@ -13,7 +13,7 @@ const readdirAsync = util.promisify(fs.readdir); const readFileAsync = util.promisify(fs.readFile); export class LocaleLoader extends DataFileLoader { - private static readonly localeFileNameRegex: RegExp = /^(.*)\.json$/; + private static readonly LOCALE_FILE_REGEX: RegExp = /^(.*)\.json$/; public async getAllIdsAsync(): Promise { if (!fs.existsSync(this.directoryPath)) { @@ -25,14 +25,12 @@ export class LocaleLoader extends DataFileLoader { return ( fileNames .map((fileName: string): string => { - const regexResult: RegExpExecArray | null = LocaleLoader.localeFileNameRegex.exec(fileName); + const regexResult: RegExpExecArray | null = LocaleLoader.LOCALE_FILE_REGEX.exec(fileName); const id: string | null = regexResult && regexResult[1].toString(); return id || ""; }) - .filter((id: string): boolean => { - return id.length > 0; - }) + .filter((id: string): boolean => id.length > 0) ); } diff --git a/src/common/DesignHelpers.tsx b/src/common/DesignHelpers.tsx new file mode 100644 index 00000000..46ae4f08 --- /dev/null +++ b/src/common/DesignHelpers.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +export class DesignHelpers { + public static materialIcon(iconName?: string): JSX.Element { + return {iconName}; + } +} diff --git a/src/common/EmployeeNumber.ts b/src/common/EmployeeNumber.ts index 6016d4d1..f5815993 100644 --- a/src/common/EmployeeNumber.ts +++ b/src/common/EmployeeNumber.ts @@ -11,6 +11,22 @@ export class EmployeeNumber { this.magnitude = EmployeeNumber.getEmployeeMagnitude(value); } + private static getEmployeeMagnitude(value: number): EmployeeMagnitude { + if (value >= 1000000000) { + return 9; + } + + if (value >= 1000000) { + return 6; + } + + if (value >= 1000 && value % 1000 === 0) { + return 3; + } + + return null; + } + public getAdjustedValue(): number { return this.magnitude ? Math.round(this.exactValue / Math.pow(10, this.magnitude - 1)) / 10 @@ -41,20 +57,4 @@ export class EmployeeNumber { return `${value} ${label}`; } - - private static getEmployeeMagnitude(value: number): EmployeeMagnitude { - if (value >= 1000000000) { - return 9; - } - - if (value >= 1000000) { - return 6; - } - - if (value >= 1000 && value % 1000 === 0) { - return 3; - } - - return null; - } } \ No newline at end of file diff --git a/src/common/EmployerLocation.ts b/src/common/EmployerLocation.ts index 497a3a42..7565bc3b 100644 --- a/src/common/EmployerLocation.ts +++ b/src/common/EmployerLocation.ts @@ -10,22 +10,24 @@ export class EmployerLocation { public wiki?: string; public static toString( - location: EmployerLocation, + employerLocation: EmployerLocation, countryCodeMap?: { [key: string]: string }, useShortText: boolean = false): string { const country: string = - (countryCodeMap && location.country in countryCodeMap) ? countryCodeMap[location.country] : location.country; + (countryCodeMap && employerLocation.country in countryCodeMap) + ? countryCodeMap[employerLocation.country] + : employerLocation.country; if (useShortText) { - return `${location.city}, ${country}`; + return `${employerLocation.city}, ${country}`; } const locationAsString: string = - location.state - ? `${location.city}, ${location.state}, ${country}` - : `${location.city}, ${country}`; + employerLocation.state + ? `${employerLocation.city}, ${employerLocation.state}, ${country}` + : `${employerLocation.city}, ${country}`; - return location.international ? `${locationAsString} (Multinational)` : locationAsString; + return employerLocation.international ? `${locationAsString} (Multinational)` : locationAsString; } } \ No newline at end of file diff --git a/src/common/LocalizedStrings.ts b/src/common/LocalizedStrings.ts index 061205a7..01dc12ea 100644 --- a/src/common/LocalizedStrings.ts +++ b/src/common/LocalizedStrings.ts @@ -1,9 +1,7 @@ -// tslint:disable-next-line:interface-over-type-literal // An interface cannot work here. -export type LocalizedStrings = { [key: string]: LocalizedStringValue }; +export interface LocalizedStrings { [key: string]: LocalizedStringValue } -export const format = (translation: string, args: { [key: string]: any }): string => { - return translation.replace(/\{([^\}]+)\}/g, (value: string, argName: string) => args[argName] || argName); -}; +export const format = (translation: string, args: { [key: string]: any }): string => + translation.replace(/\{([^\}]+)\}/g, (value: string, argName: string) => args[argName] || argName); // Would prefer to use 'string | { [key: string]: LocalizedStringValue }' here. // However, then TypeScript complains if you do 'strings.foo.bar', saying that 'bar' does not exist on type 'string'. diff --git a/src/server.tsx b/src/server.tsx index c613cae3..dcb01c37 100644 --- a/src/server.tsx +++ b/src/server.tsx @@ -25,7 +25,7 @@ import configureStore from "./web/state/configureStore"; import { getIsProd } from "./web/state/ducks/environment/selectors"; import { getLocalizedStringsSuccess } from "./web/state/ducks/localization/actions"; -export const DEFAULT_LANGUAGE: string = "en-us"; +export const defaultLanguage: string = "en-us"; let assets: any; @@ -39,7 +39,7 @@ const localeLoader: LocaleLoader = new LocaleLoader(process.env.RAZZLE_PUBLIC_DIR || "", "strings"); const localizationMiddleware: LocalizationMiddleware = - new LocalizationMiddleware(DEFAULT_LANGUAGE, localeLoader); + new LocalizationMiddleware(defaultLanguage, localeLoader); const server: express.Application = express() .disable("x-powered-by") @@ -53,7 +53,7 @@ const server: express.Application = express() const localeCode: string = request.languageCode.toLowerCase(); - const defaultLocaleData: LocalizedStrings = await localeLoader.loadAsync(DEFAULT_LANGUAGE); + const defaultLocaleData: LocalizedStrings = await localeLoader.loadAsync(defaultLanguage); const currentLocaleData: LocalizedStrings = await localeLoader.loadAsync(localeCode); const localeData: LocalizedStrings = deepmerge(defaultLocaleData, currentLocaleData); @@ -87,6 +87,22 @@ const server: express.Application = express() const appState: AppState = store.getState(); + const stylesheetTag: string = + assets.client.css + ? `` + : ""; + + const scriptTag: string = + getIsProd(appState) + ? `` + : ``; + + const metaDescription: string = + "A collaborative, open-source project designed to track the responses of employers to the coronavirus (COVID-19) pandemic of 2019-2020."; + + const googleFontsUrl: string = + "https://fonts.googleapis.com/css2?family=Material+Icons&family=Merriweather:wght@300&family=Baloo+Chettan+2:wght@400;500&display=swap"; + res.send( ` @@ -99,28 +115,20 @@ const server: express.Application = express() - + ${alternateLocaleMetaTags.join("")} - ${ - assets.client.css - ? `` - : "" - } - + ${stylesheetTag} +
${markup}
- ${ - getIsProd(appState) - ? `` - : `` - } + ${scriptTag} `, ); diff --git a/src/web/App.tsx b/src/web/App.tsx index 520d63ad..cb685935 100644 --- a/src/web/App.tsx +++ b/src/web/App.tsx @@ -8,7 +8,7 @@ import Home from "./views/Home/Home"; import "./App.scss"; -export default (): JSX.Element => ( +const App: React.FC = (): React.ReactElement => ( <> @@ -17,4 +17,6 @@ export default (): JSX.Element => ( -); \ No newline at end of file +); + +export default App; \ No newline at end of file diff --git a/src/web/state/AppState.ts b/src/web/state/AppState.ts index da676df6..8feddfcb 100644 --- a/src/web/state/AppState.ts +++ b/src/web/state/AppState.ts @@ -1,7 +1,7 @@ -import { EmployersState } from "./EmployersState"; - import { LocalizedStrings } from "../../common/LocalizedStrings"; +import { EmployersState } from "./EmployersState"; + export interface AppState { employers: EmployersState; diff --git a/src/web/state/ducks/employers/actions.ts b/src/web/state/ducks/employers/actions.ts index ce432cdf..47c5ac32 100644 --- a/src/web/state/ducks/employers/actions.ts +++ b/src/web/state/ducks/employers/actions.ts @@ -1,20 +1,16 @@ +import { EmployerRecord } from "../../../../common/EmployerRecord"; + import { getEmployersApi, GetEmployersApiResponse } from "./api"; import { GetAllErrorType, GetAllType, GetEmployersActionTypes } from "./types"; -import { EmployerRecord } from "../../../../common/EmployerRecord"; - -export const getEmployersError = (): GetEmployersActionTypes => { - return { - type: GetAllErrorType, - }; -}; +export const getEmployersError = (): GetEmployersActionTypes => ({ + type: GetAllErrorType, +}); -export const getEmployersSuccess = (payload: EmployerRecord[]): GetEmployersActionTypes => { - return { - payload, - type: GetAllType, - }; -}; +export const getEmployersSuccess = (payload: EmployerRecord[]): GetEmployersActionTypes => ({ + payload, + type: GetAllType, +}); export const getEmployers = (dispatch: React.Dispatch): Promise => ( getEmployersApi().then((result: GetEmployersApiResponse) => { @@ -24,4 +20,4 @@ export const getEmployers = (dispatch: React.Dispatch): dispatch(getEmployersError()); } }) -); \ No newline at end of file +); diff --git a/src/web/state/ducks/employers/api.ts b/src/web/state/ducks/employers/api.ts index 2b5692de..b42ba4be 100644 --- a/src/web/state/ducks/employers/api.ts +++ b/src/web/state/ducks/employers/api.ts @@ -5,16 +5,13 @@ export class GetEmployersApiResponse { public response: Response; - constructor(employers: EmployerRecord[], response: Response) { + public constructor(employers: EmployerRecord[], response: Response) { this.employers = employers; this.response = response; } } -export const getEmployersApi = (): Promise => { - return ( - fetch("/api/employers", { method: "GET" }) - .then((response: Response) => Promise.all([ response, response.json() ])) - .then((value: [ Response, EmployerRecord[] ]) => new GetEmployersApiResponse(value[1], value[0])) - ); -}; \ No newline at end of file +export const getEmployersApi = (): Promise => + fetch("/api/employers", { method: "GET" }) + .then((response: Response) => Promise.all([ response, response.json() ])) + .then((value: [ Response, EmployerRecord[] ]) => new GetEmployersApiResponse(value[1], value[0])); \ No newline at end of file diff --git a/src/web/state/ducks/employers/reducers.ts b/src/web/state/ducks/employers/reducers.ts index affde36b..5b7fd045 100644 --- a/src/web/state/ducks/employers/reducers.ts +++ b/src/web/state/ducks/employers/reducers.ts @@ -1,7 +1,7 @@ -import { GetAllType } from "./types"; - import { EmployersState } from "../../EmployersState"; +import { GetAllType } from "./types"; + export const getEmployers = (state: EmployersState | null = null, action: any): EmployersState | null => { switch (action.type) { case GetAllType: diff --git a/src/web/state/ducks/employers/types.ts b/src/web/state/ducks/employers/types.ts index 36f23781..04f29d5d 100644 --- a/src/web/state/ducks/employers/types.ts +++ b/src/web/state/ducks/employers/types.ts @@ -9,7 +9,6 @@ interface GetEmployersAction extends Action { payload: EmployerRecord[]; } -interface GetEmployersErrorAction extends Action { -} +type GetEmployersErrorAction = Action; export type GetEmployersActionTypes = GetEmployersAction | GetEmployersErrorAction; diff --git a/src/web/state/ducks/environment/reducers.ts b/src/web/state/ducks/environment/reducers.ts index d2c9968e..6a41d497 100644 --- a/src/web/state/ducks/environment/reducers.ts +++ b/src/web/state/ducks/environment/reducers.ts @@ -1,5 +1,3 @@ import { Development } from "../../../../common/constants/EnvironmentConstants"; -export const getEnvironment = (): string => { - return process.env.NODE_ENV || Development; -}; +export const getEnvironment = (): string => process.env.NODE_ENV || Development; diff --git a/src/web/state/ducks/localization/actions.ts b/src/web/state/ducks/localization/actions.ts index d01233fa..b19dcb2e 100644 --- a/src/web/state/ducks/localization/actions.ts +++ b/src/web/state/ducks/localization/actions.ts @@ -1,10 +1,8 @@ -import { GetAllType, GetStringsActionTypes } from "./types"; - import { LocalizedStrings } from "../../../../common/LocalizedStrings"; -export const getLocalizedStringsSuccess = (payload: LocalizedStrings): GetStringsActionTypes => { - return { - payload, - type: GetAllType, - }; -}; \ No newline at end of file +import { GetAllType, GetStringsActionTypes } from "./types"; + +export const getLocalizedStringsSuccess = (payload: LocalizedStrings): GetStringsActionTypes => ({ + payload, + type: GetAllType, +}); \ No newline at end of file diff --git a/src/web/state/ducks/localization/reducers.ts b/src/web/state/ducks/localization/reducers.ts index 6d0c4daa..d44ed3b5 100644 --- a/src/web/state/ducks/localization/reducers.ts +++ b/src/web/state/ducks/localization/reducers.ts @@ -1,7 +1,7 @@ -import { GetAllType } from "./types"; - import { LocalizedStrings } from "../../../../common/LocalizedStrings"; +import { GetAllType } from "./types"; + export const getLocalizedStrings = (state: LocalizedStrings = {}, action: LocalizedStrings): LocalizedStrings => { switch (action.type) { case GetAllType: diff --git a/src/web/views/About/About.tsx b/src/web/views/About/About.tsx index 5bb3cc93..33e57c93 100644 --- a/src/web/views/About/About.tsx +++ b/src/web/views/About/About.tsx @@ -1,3 +1,6 @@ +/* eslint-disable max-len */ +/* The max-len detection in ESLint is not as good as TSLint so it doesn't work well with this file. */ + import React from "react"; import { Helmet } from "react-helmet"; import { useSelector } from "react-redux"; @@ -16,6 +19,9 @@ const About: React.FC = (): React.ReactElement => { const coronavirusWikipediaUrl: string = "https://en.wikipedia.org/wiki/Coronavirus_disease_2019"; const coronavirusPandemicWikipediaUrl: string = "https://en.wikipedia.org/wiki/2019%E2%80%9320_coronavirus_pandemic"; + const makeExternalLink = (url: string, text: string): JSX.Element => + {text}; + return (
@@ -25,18 +31,18 @@ const About: React.FC = (): React.ReactElement => {

What is {strings.appTitleShort}?

{strings.appTitleShort} ({strings.appTitle}) is a collaborative, open-source project designed to - track the responses of employers to the coronavirus -  (COVID-19) pandemic of 2019–2020. It is + track the responses of employers to the {makeExternalLink(coronavirusWikipediaUrl, "coronavirus")} +  (COVID-19) {makeExternalLink(coronavirusPandemicWikipediaUrl, `pandemic of 2019${String.fromCharCode(8211)}2020`)}. It is built using information sourced from a number of places and categorizes it based on how reliable the original information source is considered to be. For more information, please visit  - the project's page on GitHub. + {makeExternalLink(ProjectUrl, "the project's page on GitHub")}.

Can I help?

Yes! {strings.appTitleShort} is open-source and open-data and we'd love to have your help! You can help by submitting new employer claims and changes, or by submitting code changes to the site through  - GitHub. + {makeExternalLink(ProjectUrl, "GitHub")}.

What are employer claims and reports?

diff --git a/src/web/views/About/__snapshots__/About.test.tsx.snap b/src/web/views/About/__snapshots__/About.test.tsx.snap index 805594db..b0d04a3c 100644 --- a/src/web/views/About/__snapshots__/About.test.tsx.snap +++ b/src/web/views/About/__snapshots__/About.test.tsx.snap @@ -20,6 +20,7 @@ exports[` renders without exploding 1`] = ` ) is a collaborative, open-source project designed to track the responses of employers to the coronavirus @@ -27,6 +28,7 @@ exports[` renders without exploding 1`] = `  (COVID-19) pandemic of 2019–2020 @@ -34,6 +36,7 @@ exports[` renders without exploding 1`] = ` . It is built using information sourced from a number of places and categorizes it based on how reliable the original information source is considered to be. For more information, please visit  the project's page on GitHub @@ -50,6 +53,7 @@ exports[` renders without exploding 1`] = ` is open-source and open-data and we'd love to have your help! You can help by submitting new employer claims and changes, or by submitting code changes to the site through  GitHub diff --git a/src/web/views/EmployerActionLinks/EmployerActionLinks.tsx b/src/web/views/EmployerActionLinks/EmployerActionLinks.tsx index 76d2652e..a319d6bd 100644 --- a/src/web/views/EmployerActionLinks/EmployerActionLinks.tsx +++ b/src/web/views/EmployerActionLinks/EmployerActionLinks.tsx @@ -3,6 +3,7 @@ import { useSelector } from "react-redux"; import { RouteProps } from "react-router-dom"; import { ProjectUrl } from "../../../common/constants/UrlConstants"; +import { DesignHelpers } from "../../../common/DesignHelpers"; import { EmployerRecord } from "../../../common/EmployerRecord"; import { LocalizedStrings } from "../../../common/LocalizedStrings"; import { WikipediaHelpers } from "../../../common/WikipediaHelpers"; @@ -22,10 +23,11 @@ const getEmployerEditComponent = (employer: EmployerRecord, strings: LocalizedSt - {materialIcon("edit")} + {DesignHelpers.materialIcon("edit")} ); }; @@ -39,10 +41,11 @@ const getEmployerWebsiteComponent = (employer: EmployerRecord, strings: Localize - {materialIcon("home")} + {DesignHelpers.materialIcon("home")} ); }; @@ -58,16 +61,15 @@ const getEmployerWikipediaComponent = (employer: EmployerRecord, strings: Locali - {materialIcon("language")} + {DesignHelpers.materialIcon("language")} ); }; -const materialIcon = (name: string): JSX.Element => {name}; - const EmployerActionLinks: React.FC = (props: Props): React.ReactElement => { const strings: LocalizedStrings = useSelector(getStrings); const { employer } = props; diff --git a/src/web/views/EmployerActionLinks/__snapshots__/EmployerActionLinks.test.tsx.snap b/src/web/views/EmployerActionLinks/__snapshots__/EmployerActionLinks.test.tsx.snap index a76e0103..c7b6e59a 100644 --- a/src/web/views/EmployerActionLinks/__snapshots__/EmployerActionLinks.test.tsx.snap +++ b/src/web/views/EmployerActionLinks/__snapshots__/EmployerActionLinks.test.tsx.snap @@ -4,6 +4,7 @@ exports[` renders without exploding 1`] = ` diff --git a/src/web/views/EmployerCitation/EmployerCitation.tsx b/src/web/views/EmployerCitation/EmployerCitation.tsx index 8b00625a..95b45fbf 100644 --- a/src/web/views/EmployerCitation/EmployerCitation.tsx +++ b/src/web/views/EmployerCitation/EmployerCitation.tsx @@ -6,6 +6,9 @@ import { CitationSource } from "../../../common/CitationSource"; import "./EmployerCitation.scss"; +type IndicatorIconType = "add_circle" | "add_circle_outline" | "error_outline" | "remove_circle_outline" | "remove_circle"; +type Neutrality = "Neutral" | "Positive" | "Negative"; + interface Props extends RouteProps { citation: Citation; @@ -25,17 +28,11 @@ const EmployerCitation: React.FC = (props: Props): React.ReactElement => title = `${title} (${date.toLocaleDateString()} ${date.toLocaleTimeString()})`; } - return [{i + citationSourceBase}]; + return [{i + citationSourceBase}]; }; - let indicatorClass: "Neutral" | "Positive" | "Negative" = "Neutral"; - let indicatorIcon: - "add_circle" - | "add_circle_outline" - | "error_outline" - | "remove_circle_outline" - | "remove_circle" - = "error_outline"; + let indicatorClass: Neutrality = "Neutral"; + let indicatorIcon: IndicatorIconType = "error_outline"; if (citation.positivity > 0) { indicatorClass = "Positive"; diff --git a/src/web/views/EmployerDetail/EmployerDetail.tsx b/src/web/views/EmployerDetail/EmployerDetail.tsx index 8bd6da96..c6c0689d 100644 --- a/src/web/views/EmployerDetail/EmployerDetail.tsx +++ b/src/web/views/EmployerDetail/EmployerDetail.tsx @@ -24,7 +24,7 @@ const EmployerDetail: React.FC = (props: Props): React.ReactElement => { if (link) { return ( - + {iconElement} {text} diff --git a/src/web/views/EmployerDetail/__snapshots__/EmployerDetail.test.tsx.snap b/src/web/views/EmployerDetail/__snapshots__/EmployerDetail.test.tsx.snap index 3fcf6d66..29a7f366 100644 --- a/src/web/views/EmployerDetail/__snapshots__/EmployerDetail.test.tsx.snap +++ b/src/web/views/EmployerDetail/__snapshots__/EmployerDetail.test.tsx.snap @@ -4,6 +4,7 @@ exports[` renders without exploding 1`] = ` - {materialIcon("alternate_email")} + {DesignHelpers.materialIcon("alternate_email")} {text} ); @@ -73,7 +74,7 @@ const getEmployeeCountComponent = return ( - {materialIcon("people")} + {DesignHelpers.materialIcon("people")} {employeeCountString} ); @@ -101,6 +102,7 @@ const getLocationWikipediaComponent = @@ -122,6 +124,7 @@ const getTickerComponent = @@ -130,8 +133,6 @@ const getTickerComponent = ); }; -const materialIcon = (name: string): JSX.Element => {name}; - const EmployerDetailsHeader: React.FC = (props: Props): React.ReactElement => { const strings: LocalizedStrings = useSelector(getStrings); const { employer, onClickEmployerName, useShortText } = props; diff --git a/src/web/views/EmployerListDetails/EmployerListDetails.test.tsx b/src/web/views/EmployerListDetails/EmployerListDetails.test.tsx index c6d0e78b..dac16909 100644 --- a/src/web/views/EmployerListDetails/EmployerListDetails.test.tsx +++ b/src/web/views/EmployerListDetails/EmployerListDetails.test.tsx @@ -32,7 +32,10 @@ describe("", () => { renderer.create( - { /* Do nothing. */ }} /> + { /* Do nothing. */ }} + /> , ).toJSON(); diff --git a/src/web/views/EmployerListDetails/EmployerListDetails.tsx b/src/web/views/EmployerListDetails/EmployerListDetails.tsx index c62f0481..d6b1ebbb 100644 --- a/src/web/views/EmployerListDetails/EmployerListDetails.tsx +++ b/src/web/views/EmployerListDetails/EmployerListDetails.tsx @@ -2,6 +2,7 @@ import React from "react"; import { useSelector } from "react-redux"; import { RouteProps } from "react-router-dom"; +import { DesignHelpers } from "../../../common/DesignHelpers"; import { EmployerRating } from "../../../common/EmployerRating"; import { EmployerRecord } from "../../../common/EmployerRecord"; import { LocalizedStrings } from "../../../common/LocalizedStrings"; @@ -19,8 +20,6 @@ interface Props extends RouteProps { onClick: () => void; } -const materialIcon = (name: string): JSX.Element => {name}; - const EmployerListDetails: React.FC = (props: Props): React.ReactElement => { const strings: LocalizedStrings = useSelector(getStrings); const { employer, onClick } = props; @@ -38,7 +37,7 @@ const EmployerListDetails: React.FC = (props: Props): React.ReactElement {strings.readMore} - {materialIcon("fullscreen")} + {DesignHelpers.materialIcon("fullscreen")} diff --git a/src/web/views/EmployerListSearch/EmployerListSearch.tsx b/src/web/views/EmployerListSearch/EmployerListSearch.tsx index a27c57e5..b5eaee15 100644 --- a/src/web/views/EmployerListSearch/EmployerListSearch.tsx +++ b/src/web/views/EmployerListSearch/EmployerListSearch.tsx @@ -43,12 +43,15 @@ const EmployerListSearch: React.FC = (props: Props): React.ReactElement = ) : null; + const onInput = + (e: React.FormEvent): void => updateSearchFilters({ text: e.currentTarget.value }); + return (
search ): void => updateSearchFilters({ text: e.currentTarget.value })} + onInput={onInput} placeholder={strings.search} type="search" /> diff --git a/src/web/views/EmployerListSearch/EmployerListSearchFilter.ts b/src/web/views/EmployerListSearch/EmployerListSearchFilter.ts index 4a55a96d..e3d55698 100644 --- a/src/web/views/EmployerListSearch/EmployerListSearchFilter.ts +++ b/src/web/views/EmployerListSearch/EmployerListSearchFilter.ts @@ -1,9 +1,9 @@ import { EmployerRecord } from "../../../common/EmployerRecord"; export class EmployerListSearchFilter { - public static readonly smallBoundary: number = 1000; + public static readonly SMALL_BOUNDARY: number = 1000; - public static readonly largeBoundary: number = 100000; + public static readonly LARGE_BOUNDARY: number = 100000; public international: boolean = true; @@ -38,16 +38,16 @@ export class EmployerListSearchFilter { v >= lower && v <= upper; const getNumberIsMatch = (v: number): boolean => { - if (!f.small && v <= this.smallBoundary) { + if (!f.small && v <= this.SMALL_BOUNDARY) { return false; } - if (!f.large && v >= this.largeBoundary) { + if (!f.large && v >= this.LARGE_BOUNDARY) { return false; } if (!f.medium - && getNumberIsBetween(v, this.smallBoundary, this.largeBoundary)) { + && getNumberIsBetween(v, this.SMALL_BOUNDARY, this.LARGE_BOUNDARY)) { return false; } @@ -69,13 +69,13 @@ export class EmployerListSearchFilter { return getNumberIsMatch(lowerBound); } - const rangeIncludesSmall: boolean = lowerBound < this.smallBoundary; + const rangeIncludesSmall: boolean = lowerBound < this.SMALL_BOUNDARY; const rangeIncludesMedium: boolean = - getNumberIsBetween(lowerBound, this.smallBoundary, this.largeBoundary) - || getNumberIsBetween(upperBound, this.smallBoundary, this.largeBoundary); + getNumberIsBetween(lowerBound, this.SMALL_BOUNDARY, this.LARGE_BOUNDARY) + || getNumberIsBetween(upperBound, this.SMALL_BOUNDARY, this.LARGE_BOUNDARY); - const rangeIncludesLarge: boolean = upperBound > this.largeBoundary; + const rangeIncludesLarge: boolean = upperBound > this.LARGE_BOUNDARY; return (f.small && rangeIncludesSmall) || (f.medium && rangeIncludesMedium) @@ -87,7 +87,7 @@ export class EmployerListSearchFilter { return true; } - const fieldsToSearch: Array = [ + const fieldsToSearch: (string | undefined)[] = [ e.name.toLowerCase(), e.location?.city.toLowerCase(), e.shortName?.toLowerCase(), diff --git a/src/web/views/HeaderFooter/HeaderMenu.tsx b/src/web/views/HeaderFooter/HeaderMenu.tsx index 418cd023..81a7cd99 100644 --- a/src/web/views/HeaderFooter/HeaderMenu.tsx +++ b/src/web/views/HeaderFooter/HeaderMenu.tsx @@ -38,7 +38,13 @@ const HeaderMenu: React.FC = (): React.ReactElement => { {strings.about} - + {strings.submit} @@ -48,7 +54,11 @@ const HeaderMenu: React.FC = (): React.ReactElement => { isTest ? null : ( - + {navLinks} ); diff --git a/src/web/views/HeaderFooter/__snapshots__/HeaderMenu.test.tsx.snap b/src/web/views/HeaderFooter/__snapshots__/HeaderMenu.test.tsx.snap index 6133315b..4ec8ebf2 100644 --- a/src/web/views/HeaderFooter/__snapshots__/HeaderMenu.test.tsx.snap +++ b/src/web/views/HeaderFooter/__snapshots__/HeaderMenu.test.tsx.snap @@ -63,6 +63,7 @@ exports[` renders without exploding 1`] = ` className="HeaderMenu__Link" href="https://github.com/ekumlin/covid-employer-response/issues/new/choose" onClick={[Function]} + rel="noopener noreferrer" target="_blank" />
diff --git a/tslint.json b/tslint.json deleted file mode 100644 index c984a033..00000000 --- a/tslint.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "extends": ["tslint:latest", "tslint-react"], - "rules": { - "align": [true, "parameters", "arguments", "statements"], - "ban": false, - "class-name": true, - "comment-format": [true, "check-space"], - "curly": true, - "eofline": false, - "forin": true, - "indent": [true, "tabs"], - "interface-name": [true, "never-prefix"], - "jsdoc-format": true, - "jsx-no-lambda": false, - "jsx-no-multiline-js": true, - "jsx-wrap-multiline": false, - "label-position": true, - "max-line-length": [true, 120], - "member-ordering": [ - true, - { - "order": [ - "public-static-field", - "public-instance-field", - "private-static-field", - "private-instance-field", - "public-constructor", - "private-constructor", - "public-instance-method", - "protected-instance-method", - "private-instance-method" - ] - } - ], - "no-any": false, - "no-arg": true, - "no-bitwise": true, - "no-consecutive-blank-lines": true, - "no-console": false, - "no-construct": true, - "no-debugger": true, - "no-duplicate-variable": true, - "no-empty": true, - "no-eval": true, - "no-implicit-dependencies": [ - true, - [ "react-test-renderer" ] - ], - "no-shadowed-variable": true, - "no-string-literal": true, - "no-submodule-imports": false, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unused-expression": true, - "one-line": [ - true, - "check-catch", - "check-else", - "check-open-brace", - "check-whitespace" - ], - "quotemark": [true, "double"], - "radix": true, - "semicolon": [true, "always"], - "switch-default": true, - "trailing-comma": true, - "triple-equals": [true, "allow-null-check"], - "typedef": [ - true, - "arrow-call-signature", - "call-signature", - "member-variable-declaration", - "parameter", - "property-declaration", - "variable-declaration", - "variable-declaration-ignore-function" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "variable-name": [ - true, - "ban-keywords", - "check-format", - "allow-leading-underscore", - "allow-pascal-case" - ], - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-module", - "check-operator", - "check-separator", - "check-type", - "check-typecast" - ] - } -} diff --git a/yarn.lock b/yarn.lock index bb91503d..6aca61e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -824,6 +824,14 @@ "@babel/plugin-transform-react-jsx-self" "^7.9.0" "@babel/plugin-transform-react-jsx-source" "^7.9.0" +"@babel/runtime-corejs3@^7.8.3": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz#26fe4aa77e9f1ecef9b776559bbb8e84d34284b7" + integrity sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.1.2", "@babel/runtime@^7.1.5", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" @@ -1209,6 +1217,11 @@ dependencies: "@types/node" "*" +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -1281,6 +1294,11 @@ jest-diff "^25.1.0" pretty-format "^25.1.0" +"@types/json-schema@^7.0.3": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" + integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== + "@types/mime@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" @@ -1436,6 +1454,57 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin-tslint@^2.27.0": + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.27.0.tgz#ae8c051d8c807375388ab1b1a276d8acdd24942a" + integrity sha512-CokhcCffPm3wsQN/Q+xxIzmf0+1+y2YmV/6jKuoOjvExTJVn/kVHE5CHYmJoDWEXJNBgA0+bCOSVHIEn3nfhPw== + dependencies: + "@typescript-eslint/experimental-utils" "2.27.0" + lodash "^4.17.15" + +"@typescript-eslint/eslint-plugin@^2.27.0": + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.27.0.tgz#e479cdc4c9cf46f96b4c287755733311b0d0ba4b" + integrity sha512-/my+vVHRN7zYgcp0n4z5A6HAK7bvKGBiswaM5zIlOQczsxj/aiD7RcgD+dvVFuwFaGh5+kM7XA6Q6PN0bvb1tw== + dependencies: + "@typescript-eslint/experimental-utils" "2.27.0" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.27.0": + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz#801a952c10b58e486c9a0b36cf21e2aab1e9e01a" + integrity sha512-vOsYzjwJlY6E0NJRXPTeCGqjv5OHgRU1kzxHKWJVPjDYGbPgLudBXjIlc+OD1hDBZ4l1DLbOc5VjofKahsu9Jw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.27.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^2.27.0": + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.27.0.tgz#d91664335b2c46584294e42eb4ff35838c427287" + integrity sha512-HFUXZY+EdwrJXZo31DW4IS1ujQW3krzlRjBrFRrJcMDh0zCu107/nRfhk/uBasO8m0NVDbBF5WZKcIUMRO7vPg== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.27.0" + "@typescript-eslint/typescript-estree" "2.27.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.27.0": + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.27.0.tgz#a288e54605412da8b81f1660b56c8b2e42966ce8" + integrity sha512-t2miCCJIb/FU8yArjAvxllxbTiyNqaXJag7UOpB5DVoM3+xnjeOngtqlJkLRnMtzaRcJhe3CIR9RmL40omubhg== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^6.3.0" + tsutils "^3.17.1" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -1622,6 +1691,11 @@ acorn-globals@^4.1.0, acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" @@ -1637,7 +1711,7 @@ acorn@^6.0.1, acorn@^6.2.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.0: +acorn@^7.1.0, acorn@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== @@ -1675,7 +1749,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: version "6.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== @@ -1847,6 +1921,15 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-includes@^3.0.3, array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" @@ -1879,6 +1962,14 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -2767,7 +2858,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2860,6 +2951,13 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -3055,6 +3153,11 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -3114,6 +3217,11 @@ core-js-compat@^3.6.2: browserslist "^4.8.3" semver "7.0.0" +core-js-pure@^3.0.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a" + integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw== + core-js@^2.4.0, core-js@^2.5.0: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" @@ -3183,7 +3291,7 @@ cross-env@^7.0.2: dependencies: cross-spawn "^7.0.1" -cross-spawn@6.0.5, cross-spawn@^6.0.0: +cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -3497,7 +3605,7 @@ debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -3702,6 +3810,28 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +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-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -3858,7 +3988,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: version "1.17.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== @@ -3922,6 +4052,63 @@ escodegen@~1.2.0: optionalDependencies: source-map "~0.1.30" +eslint-import-resolver-node@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" + integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.4.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-import@^2.20.2: + version "2.20.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" + integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.1" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.12.0" + +eslint-plugin-prefer-arrow@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.1.7.tgz#4534dd8d2e519cd579a951f95802137365d524a2" + integrity sha512-epsA4g804mRovlOHSbeO1xxW7REGeUjULRME9MJTJDOVscNIA01AkR66TP4cmHDfD+w72EQ9cPhf37MbZiFI2w== + +eslint-plugin-react@^7.19.0: + version "7.19.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666" + integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ== + dependencies: + array-includes "^3.1.1" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.2.3" + object.entries "^1.1.1" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.15.1" + semver "^6.3.0" + string.prototype.matchall "^4.0.2" + xregexp "^4.3.0" + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -3930,6 +4117,85 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" + integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.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" @@ -3940,6 +4206,13 @@ esprima@~1.0.4: resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" integrity sha1-n1V+CPw7TSbs6d00+Pv0drYlha0= +esquery@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" + integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== + dependencies: + estraverse "^5.0.0" + esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" @@ -3952,6 +4225,11 @@ estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" + integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== + estraverse@~1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" @@ -4174,7 +4452,7 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.0: +external-editor@^3.0.0, external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== @@ -4286,6 +4564,13 @@ figures@^3.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-loader@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" @@ -4387,7 +4672,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.1.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -4402,6 +4687,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== + flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" @@ -4539,6 +4838,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= + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -4629,12 +4933,19 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -4671,6 +4982,13 @@ 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" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -5056,6 +5374,11 @@ ignore@^3.3.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== +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== + immer@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/immer/-/immer-1.7.2.tgz#a51e9723c50b27e132f6566facbec1c85fc69547" @@ -5076,7 +5399,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.1.0: +import-fresh@^3.0.0, import-fresh@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== @@ -5189,6 +5512,25 @@ inquirer@6.2.0: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -5197,6 +5539,15 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -5433,7 +5784,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +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== @@ -5537,6 +5888,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + is-svg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -6514,6 +6870,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-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -6565,6 +6926,14 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jsx-ast-utils@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" + integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== + dependencies: + array-includes "^3.0.3" + object.assign "^4.1.0" + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -6648,7 +7017,7 @@ levenary@^1.1.1: dependencies: leven "^3.1.0" -levn@~0.3.0: +levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -6672,6 +7041,16 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -7255,6 +7634,11 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + nan@^2.12.1, nan@^2.13.2: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" @@ -7566,6 +7950,26 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.entries@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" + integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.fromentries@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + object.getownpropertydescriptors@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" @@ -7589,7 +7993,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0: +object.values@^1.1.0, object.values@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== @@ -7667,7 +8071,7 @@ optimize-css-assets-webpack-plugin@^5.0.1: cssnano "^4.1.10" last-call-webpack-plugin "^3.0.0" -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -7973,6 +8377,13 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -8797,6 +9208,11 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= +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-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -9221,6 +9637,14 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -9230,6 +9654,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -9351,7 +9784,7 @@ regex-parser@^2.2.9: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== -regexp.prototype.flags@^1.2.0: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== @@ -9359,6 +9792,16 @@ regexp.prototype.flags@^1.2.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + regexpu-core@^4.6.0, regexpu-core@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" @@ -9534,7 +9977,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: +resolve@1.x, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== @@ -9549,6 +9992,14 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -9589,6 +10040,13 @@ rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: dependencies: glob "^7.1.3" +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@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -9614,7 +10072,7 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0: +run-async@^2.2.0, run-async@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== @@ -9635,6 +10093,13 @@ rxjs@^6.1.0: dependencies: tslib "^1.9.0" +rxjs@^6.5.3: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -9776,7 +10241,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -9927,6 +10392,14 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -9959,6 +10432,15 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -10325,6 +10807,18 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + string.prototype.trimleft@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" @@ -10390,7 +10884,7 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-bom@3.0.0: +strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= @@ -10424,6 +10918,11 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" +strip-json-comments@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== + style-loader@^0.23.0: version "0.23.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" @@ -10511,6 +11010,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" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -10769,13 +11278,6 @@ tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== -tslint-react@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/tslint-react/-/tslint-react-4.2.0.tgz#41b16e0438365f8d3ed4120501f02cabff9fd1e4" - integrity sha512-lO22+FKr9ZZGueGiuALzvZE/8ANoDoCHGCknX1Ge3ALrfcLQHQ1VGdyb1scZXQFdEQEfwBTIU40r5BUlJpn0JA== - dependencies: - tsutils "^3.9.1" - tslint@^5.19.0: version "5.20.1" resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" @@ -10802,7 +11304,7 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" -tsutils@^3.9.1: +tsutils@^3.17.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== @@ -10843,6 +11345,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -11042,6 +11549,11 @@ uuid@^3.0.1, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + 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" @@ -11403,6 +11915,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@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" @@ -11432,6 +11951,13 @@ xmlchars@^2.1.1: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xregexp@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" + integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== + dependencies: + "@babel/runtime-corejs3" "^7.8.3" + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"